diff --git a/Resources/GM/Rubinstein.xgm b/Resources/GM/Rubinstein.xgm new file mode 100644 index 00000000..45aee301 --- /dev/null +++ b/Resources/GM/Rubinstein.xgm @@ -0,0 +1,671 @@ +FNxgCKph@vxEU\UOUkcFOtkUdkdOdmd=Oul;Lru:=qaIQgq=uwu?=q`=uluO=u=L=n^@?o_?FaYGW`oW^p^C^o^NV_V=GxoGVofFNf_Ve_feVf_Ve_feVf_|Liege|Tartakower, Savielly|1930|A00k|1/2-1/2|B +HPm]?Hn^EU^U=Uxg<`wn;Lld>XOecumWNrtc[og[\t\N\xo\Um]BRofCJf_JS_XST]mRZXQT[QH[cp`UN`YPYg_LT_WNWHG>NmoW`opT\p`Y`GN`haY\dkdhpYQZbQIbjIA2px2NGjr2VNrRNFRUG?UM?GMEA;cld\xK;KDKG?EM?GMDG?DT?GT\G?\T?GTUG?UM?GMEG?EM?GMUG?UT?GT\G?\T?GTUG?UM?GMEG?EMOH|Marienbad|Reti, Richard|1925|A00v|1/2-1/2|B +GWm]@OxgCKnf@wn@Art;LvxLFjb[dmdFPk[O^dkPaga=ang?OphOP]U:>gpaFu]DT[TKT]eNU\UCJelJwpwEMlZ>;krIYZuPQqa^OweHPugAHf^W^e^QA^lA?g_;>_XFGh`>VrVMV`YOYXVH@VNY_NG?Gtu_ixpi_pw@?UMGElZE=ME?FuvFMv>MDogBJ>^_U^NUKZlJRlPKEaY=AwnE?N^DMg_?N_WN]nf]WPWAYW`YAfeMLe\|RUS-ch03|Yurevich, Vladimir|1903|A03|0-1|B +@OxgFNl\CKph@vxDTtm;Emd=DulNVwu:=n^UNgmE;m\;L\fFXuvXfvf=Ejb?=rtBRpwL]d]E]ldDMdvN@wvO>mwGW^W?WwhWGgm>Dm^EOngDNktO^h^=FgYHPY`C^`NFNv^NWun:?tQ?;QmIYmv;>ogPXqiYavmGHrv>?^`@I`^WEvsBRjbI@nu?:ul@IsvEWlkIAvnHCbZ:?mtCHnvAIkn?G^`HPtmI@`^@IvwPHmvWEvoI@xyG_oxHGwvEWnu_^v^@HxqHOunGFyxFIxoIF^`FIn^W^`^OWphahohMFhpFOqhIA|Dresden|Tartakower, Savielly|1926|A05|1/2-1/2|B +@Om]CKt_@xgEMwn;Evx?>ldFV_q=FjZBJm\O^wvIQulGWru@AgmFXnw^mumW_]V_fvfMUVNU\mECND<:qh>vxqX=lW=eWG|POL Ch|Tartakower, Savielly|1927|A06|0-1|B +DTnfHPm]?H]UEMl\FVf^GW^WFk[CK[TET^TKTg_P^rwV_ZRFERSE=SL:MQ=ph|Karlsbad|Fahrni, Hans|1911|A13d|0-1|B +DTn^@O^VOUsdUDxg;Lw\CKvxHPwv?HjZ>@meDNdUEMVM=MgmN]m^M=ld]Wp`WM^M=MtX@meDNdUEMVM=Mrs@sdL]SwEMqiCKme@SLCLm]T]g]Udkd=Utf@wuCKm]=Dn^vrPXxpAHZR_DRKDKrjlIjk>FpgHOkqKDqQOHQyI@yrDKg^@NUNFN^WNO|Berlin|Johner, Paul F.|1924|A28|1-0|W +DTn^;Lxg@OsdEU^UOUw\UdkdHPm]?Hvx>@tbT]d]=Rbk<`rs:=qi`gugH]k]=]\cRWgf?=o_]^foL]su]nxy=uwun_uw_Yp`WowoY_yqPXog^nqxCSjZS[l\FVxwnk\TV^gfkswo_eohsc|Hannover|Mieses, Jacques|1926|A28|1-0|W +DTn^;Lxg@OsdHPph?HwpEU^UOUvx>@wvFNd^CKmeugOW_DEDxyL=go=NagN]g]T]dUDGU_PXpCGC_pCUv>?>rwIPjZ>VyxULkcVTpvBRvgHOldLEd]TdgVOV]VEeoKPYKoY`VNdloWeWqi`iwWlnWOQYOWi`WRnNRSNfxqfnqxnfxqfnqxYahaXaSTnfc[fc[Sc[ZRaiRJ[s|St Petersburg prel|Tarrasch, Siegbert|1914|A29|1/2-1/2|W +@OxgDTl\HPkc?HtkCKph@vxO^]fETrs^OwuIQqi@Ixq:;dU?>g]=<]SBJSdKS\SJSUOHOc[CpqpOdkd@vxDTl\EMm]T]g]Cpxp=Esd;L]LELpxLCue?=ru=Eum:=wuIYn^FNqiHQmnQHegOIiaIOdSO>kH@HjZ>DnmDSZSCDgdGOm]HGdmGHo_DTxpHGuwOWwuW^]^TW^]WTmdTDdgDTgdTDc[=@sdCS\jfXH?d^IQXa@HVNGW^TCUjU=U]L;KTEKCaFUutu?FLF<=nVHIE?|Karlsbad|Menchik, Vera|1929|A31|0-1|B +DTl\@OxgEU\UOUm]T]g]FV]g;Ln^U[u=>=sbGOw\LR\ngv?FveRLe[L[kcCSmf>GumA=m=<=xwHPwvOWogW^g^N@t\ZS[SCKSUbj\D?;UEBRg_KSEF;=ogjkFG|San Remo|Nimzowitsch, Aron|1930|A32|0-1|B +EUxgDTnf@Ol\HP\UOUsd?HwS@uc?=tfUdkdLRc[CKrvFNd\RL[sL]f]H]vuNVgVENVgN\ut\ZtD]Owv=MDtZbqi:=tDbZscZcjc|Berlin Tageblatt|Marshall, Frank|1928|A32|1/2-1/2|W +EUxgDTnf;LwS@ut:@]UCSuc@sd=K]LELvx?=ul@jZ:fKDEwu=LqiH?xq?Hl[<:[U>]aE=nF>FaF=Rvf:;FOR=fF=?\TCSTM;KFG|Moscow|Zubarev, Nikolay|1925|A34|0-1|B +DTl\;LxgHPsd?Hnf@Om]T]g]>@wnEU]LCLuZtdW_dc>;nJNTJCTZ[?@?c[LT[cT\c[BR[ZEZCUZuwu_fU\;kuvV^g^kl\clkc\Hdvtd]xwkowv]ktskdvuomutfn|Bad Pistyan|Breyer, Gyula|1912|A36d|1-0|W +DTnfHPl\?Hsd;Lxg@Om]T]g]>@wnFNvxEU\UL]f]OUngUdkd=Duc:;tfCKrt@h`WEvxCS\SJSnhS[dnrtLBn_FNumBOtDO^p^?GkcMU^p@jb[Ug]T\cgFN]S@sm?=vxO>mc>MueMWegCK\TKTcTEUgU=UTcL]k]W]n]H]c]U]wvFNvfBRph:=xp]uru=upg@?fbuUgf?FbcPXcCFOCBX`fnIYnfUWfnOPnwYaB:ahqhWV:BGOB:PW:NO>?OX?@XY@;Y`;S|Gothenburg|Nimzowitsch, Aron|1920|A40e|1-0|W +DTnfEUwS@gVEDue:@f]T]wv;LtXIQXFLFunFLga@IpLCLagLTgVo_PXxqX_h_?@vxHV|Bad Kissingen|Mieses, Jacques|1928|A43s|1-0|W +EUxg@Ol\U]me;Lt_OEnfFV_h?FjbBRf]V]wn>@qaETsm?>vw?gpX`rw`h|Triberg|Spielmann, Rudolf|1921|A43s|1-0|W +EUxg@Ol\U]me;Ln^]ftfFVwn<`sm?Fvx>@mc=Ee]V]c]L]u]E]g]`n]n?>qiFTfT>nT]:=wuBJxwnl]d=>rtltutO^tv>Nvu@?dv?>uUHPvRCKRvGOUe^Mkc>Ev[EL[mJRp`OWogN>ef>fmfMCwnC=`WPWno=NohLMhaMVftV]aY]eYQeltfW_folkiakjQIjcIPRZPOZb|Berlin2|Tarrasch, Siegbert|1918|A43s|1-0|W +EUl\U]meDTphFVwp?MxgGWvx@Onf>@f]V]sm;LwvulCKv>?>rvIQv>E>lt@Iga>EtvBRjbRZvuLVunKSo_VPaPIPmtS\e\ELwmLpxpDCngCFkcZcmcFNcmO^gnPOh`^m`XOFnNFNXQHQtmNEphMFhgF=gnELqiLKneKJmv=Dvm|Ostende-B|Tartakower, Savielly|1907|A43s|1/2-1/2|W +@OphFVwpEUl\U]meDTsm;Lxg?Fvx>@jbBRrsIQgvFbMFMsbvuO^tlNHsd^dldHWum>AdtWawhaPf^U^h^MNmfPF^XNWtTWPXNPON_FWf^A>TVYaV>WM^eM>_UOX|Rogaska Slatina|Przepiorka, Dawid|1929|A46j|1-0|W +EUxg@Onf;El\FNkc?Msd>@tkBJulDTwnCKvxmuO`dsU]f^GWsmFDphW_c[`q|Rogaska Slatina|Saemisch, Friedrich|1929|A46j|1-0|W +EUxg@Onf;El\FNsdBJ\UNUm]?Mwe>@vx?>wvIQqiDLjZO^e^U^gmEOm\M[tmJRo_^gugVW<@IrskjstO^wgVX@tkCKwn@d]=Fwt:=]KUgngMqxq=mqxIYKJO`g`Y`JSFOSwmkjZ?=ZR=mRJmoJBopwpkpxpOgpxghxwhg|Berlin Tageblatt|Capablanca, Jose|1928|A46k|1/2-1/2|W +EUxg@OnfFNl\CKsd@weBJvx?>]TKTeWE?dZ=FulU]ZTCgpg]fofOUk]Uf]fFfxy>VT^Mbtvf_Wi:>vuVYlpYQuU_aUX?PiW>=WPQPXPIPpna_|Karlsbad|Capablanca, Jose|1929|A46k|1/2-1/2|W +EUxg@OnfFNwn?MmeCKvx@sm=FwvNVnw:=unO>f^U]phDTwpHPm\MDjZ>Hkt=>tQGW^WPWQXFGXmC^n^GoxyEO^pO`vw@smDTul:tQ>HltGOga?Gn`<>uwE?QHGHtQ?N`NFNhnHGphM?QmOWogIQrv@In_V_^WPWvN>Nm_?M_mW_h`NfwoC@ul=FwnDLm]CSvxS[dZ`X;SZd[dkdScdOBZOHNVo?>E?GENGONEOGENGONEOGEN|Karlsbad|Saemisch, Friedrich|1929|A46k|1/2-1/2|W +EUnfFNxg@Ol\CK\UNUkc@sm?>wvE?e]BJgV:@m]CKwetlEOgVO^e^U^V\CUumKS\V>Nwt:>kdQXd[MV]VDL[dIYmvXWd]NPxq>NvRWXtyYaqxahohPQyQNQVNXhNGUGR=@IlnLT]dS[=F[d|Stockholm/Gothenburg m|Bogoljubow, Efim|1920|A46l|1-0|W +EUxg@OnfHPl\?Hsd>@m]CKwntf>MvtVktTksnwscSe?:Tt:btsHkfTbRTMFMe\k]xy|Teplitz-Schoenau|Saemisch, Friedrich|1922|A46o|1/2-1/2|W +EUxg@Onf@]g?>e]E`qi`YgVYnlnO^n`>Nog^O`W=Krv:>p`HPWeKDxpOEVEDEf^M_kdEFvnU^g^N^n^F^e^>^wu^npgnfg_fd]ULUuUdiUEiqjbqjbZCK_VjnVOnNOX@HX_Nvc[vsE]BJ_Vsr[SJSZSrs]UIY`YPYVMHPMLGWLKW_U=YaKTstT[_g=?ai?giqgiqy2iytySKPO[TOFKCys|Stockholm|Bogoljubow, Efim|1919|A46p|1-0|W +EUxg@Onf@vx?>wuBJmvFMgmV_VQfVMahqhfhophfxyftpxtQ|Stockholm/Gothenburg m|Bogoljubow, Efim|1920|A46p|1-0|W +EUxg@Onf@vxFOun=>_MOFMhGW^WNWhV>Gwv?>nlK\vnE?sv?Pph:=qaIYltPV]V=exp>=gXGPXiP`t_|St Petersburg prel|Nimzowitsch, Aron|1914|A46q|1/2-1/2|W +EUxg@Onf<`l\`gugFNsdDLwn?Mm];Evx=Ff^U^d^O^g^>@weCKvx@phDLwpBJvxNVme?>gmU]d^M?o_O`utGW^XV_h_IQXgLTc[>n[T`fwonoxoETpwTNmcCKc]f`onN]k]]V>Ywp`qryCgnoq`ohYPhg:=V]?T]TPL|San Remo|Grau, Roberto G.|1930|A47|1-0|W +EUxg@OnfFNkc;Etk?Ml\>@wnNV\UOUsdUdmd=FulGWgmDLf^ETngW_m\MDkb@wnDLvx?>m]NV]VEV\UOUsm<`gVMVkV`nun>VmgVFwu=Mnk:>rtGWphMQg]QX|Berlin|Gruenfeld, Ernst|1926|A47|1/2-1/2|W +EUxg@Okc;EtkFNnf?Ml\>@\UNUwn?>vxE?meIQsmNwmQYldiWxp=>mwDEomNFtvWipoEWmeWXwmiWewYah`WEqiXQg_HX_WQ?weFHew?MwpHFoxCKpqM[deE@sdCK\UNUwnrtBJm]:@phHXmp@P_XPXtl<@loEOslO`onXHlu`QkbQG[vGXxyIYbtNQc[Xgucg]vd]npnAIdHQHcULUnmYatuHQmUahUEIPuU@?ECQAC;?;UMPIMDAHD;hpyxpw2xwHk;DIPDMPXMhXOhM|Budapest|Kmoch, Hans|1926.07.03|A47|1/2-1/2|W +EUxg@Okc;EtkFNnf?Ml\>@sdBJwnCKvxmeE?ul?PwuDTe]:<]TKT\UNUumU]tu=FdZM;ZKCgKnmnLgnpIYkOHOjZPV[SJSZSgfxyC^lZfnuxV`qi^pxpnw|Liege|Przepiorka, Dawid|1930|A47|1-0|W +EUxg@OkcFNtk?Ml\;Enf>@wnCK\UOUsdUdkd@l\BJsdDLm]O^d^U^gmGW\TMDphEOm\OUjbqaJRbZ=Fvt>Gts?;kbF>srGYutYnln;=aYUObk=EtxEUyaIQkd>GxyO`yw`OaiOIiyIXwsG?njXgc[R[s[:Bjc?:ys@IskNV]VgV\VDVdVUVklBR[\VUrk:@me;EsmNVf^DLwn=FvxMDgv?=^UOUphE?vp?NwvGOnwF?m\CS\fDRldRdkdUdutS[flBRpfNTtm@gVEVkV=Fn^WIun:=xyT[ru=EVk[mkOFO^VOFnmU]mRCKRmFTo_KSpgEDwxTdmd]dxvLTg^?=^I@IypDLpgLJjZSZur=]vsJKcZKsrs][s[T[gfBRe]QYqiI@h`Y`i`HX_WNW|London|Euwe, Max|1922|A48a|1-0|W +DTxgEUkcU]tkHPn^?HwS;EvxFVsbBJSeCSld@Fd]T]blETgv@kbTNphGWun=EvpNXqaW^g^XGbFEFjZGMw?H?ZSJSr:C:lbS[b\:L\MFMe\@HngL>pv?FveIYxwFOwv|DSB-24.Kongress|Gruenfeld, Ernst|1925|A50l|1/2-1/2|W +DTxgEUkc;Ltk=DnfFVwS?Ml\U]f]V]c[CKvx@Fme>@[TKTsmGWwvFPkbLVgVPVmc@tmGOrvWPnoP^v^NVjb:>mfUfof?GwvF?fmGEmd>;dmE]moDEkc;=qiEGxyGNogHP|Berlin|Schlechter, Carl|1918|A52k|1/2-1/2|W +EUxgDTn^U^gX@kc\cgcEL^d?=rs=EqiIQvnFXogX_xoQYph_;iaLDg_;BopDL|POL Ch|Daniuszewski, Dawid|1927|A52l|1-0|W +EUxgDTn^U^gX@vxEKCgO`qi`VgoBJSZKZdZIQX^T\p`WEe]V`i`EZtfZL^d=Eo_PX_WH]f]E]xqFNWO]`OQ`p|Bad Kissingen|Tartakower, Savielly|1928|A52l|1-0|W +EUldDTxg;LmeFVsmGWuZV^gV=De]?MVLCLnf@OwnT]d]>@mw:;ZlW_tm?GqiFxpBJwyGOZRKS\m:@vx=Dul:=^UNUwvOWru=Ejb?=mwUNwfBRbZW_f\NWnwFOgmWeweEem^eu^OHOvuLVu=D=kc=U\R_gR\V\c\UXphXPluP^ZRQYqi@HutHPtuPHut^\tf\nftT\h`Y`i`nNtfN`xw`pwvpxvmxXmvXfofHPvoPWogWV|Berlin2|Schlechter, Carl|1918|A53|1-0|W +EUxg@OmeHPsm?HphDTn^;LwpFVvxIQ^UOUm^CKtm>@jbdeme^e>O|Liege|Nimzowitsch, Aron|1930|A54|1/2-1/2|W +EUxg@OmeDTsm;LldHPn^?Hwn>@vxFVulCKwugqQYqgGOgaNGkt:;o_V_m_LVag>MtlI@swJ:gVOV_XFNws:JbZMCckCRnuRLlnL[XmH?hwG>sr@HucNFwq;:m[T[kjHIqw?Qnv>EjoENrjIHjkHAcuQ?ogFXghXQwq?Fhg:@qwJ:vhQHhvNEkj@?g?:?wmENvhYahvHOmgO_vm_mjm|Karlsbad|Chajes, Oscar|1923|A55e|1/2-1/2|W +DTn^@OmeEUsmFVxg;LwnHPvx?Hld>@ulIQwv@wv=DnwCKldaWU^e^O^v^F?smDEQ?>?WQ@HQ`GWghW`^VEmVF?GhVH@w\CU\UmUF>G?>?@?VA?GAIGOogUEIQEmg_;LQaOHa`mfxyLF`a=mrvFWvfWa|San Sebastian|Nimzowitsch, Aron|1912|A55i|1-0|W +EUxgDTl\U]me;LphHPwp?HvxFVsmGWgv@Fo_V_h_>@vg=MgXIQXijb@Ak[F@[SL=xy:;wsFMxgV_skG>rsDCSKBKkKCKsK;KRKMKg]Kspw_f|Hastings 2223|Blake, Joseph Henry|1922|A56j|1-0|W +EUxg@Ol\U]k[DTtkBR[T;LnfFVgVLVf]VL]U?TULTovo=K\TO^oxKksd^duv@weCLvf:yvNWfhLTowWehe>Ne]Td]da`>n[s|Vienna|Spielmann, Rudolf|1922|A57e|1-0|W +EUo_FNnfGWkc@Oxg?Ml\>@sdDTwn;LtkBJutCKvxyxIPtm?AwsCUswhqxyq_mv_hvtW_yxAagUMUwgaigfiy|Rogaska Slatina|Flohr, Salo|1929|A80a|1-0|W +EUo_HPnf?Hxg@Om]>@smDTld=DgV;LwnCKp`LV]VO^m^U^`X@sm=MgVDTld;Lwe@xy:=sdV^gnHXdSKTS]N@SLCLvxBRsdOEmeEKdnRZl\GWgV=DulKEVEf^Zcjc:rkrNV^UV_nxLU\UDCldESxg>fwuM?dRSeR=enUMnuMEugyxfvxovnowCS|Teplitz-Schoenau|Maroczy, Geza|1922|A84|1-0|W +EUo_DTxgFNme;Ln^U^e^=uvu@Osd@uvBJvaCSp`T\enMTxyE|Gothenburg|Tarrasch, Siegbert|1920|A84|1-0|W +EUnfDTo_HPl\@O\UOUxg?Hsd>@w\FNvx;LjbBJulCS\n@vx:>ugCSsdO^ru^dkdS[dk>`hoghqxXPX>vGFvyFfgoX`yqfhow_gl\hpqpipwo`ie]T]\TiqTLpx2ogxp|Berlin Tageblatt|Tartakower, Savielly|1928|A84|1-0|W +DTo_EUxg;LnfFNkc?MtkGOwS@Fvx>@sdwg>PxyNVndZJ_WPXaiIYiYXY`YS[b[T[duEWuoJjtsWNyx?@wpU]f]T]vx@vxkH>HutW@vxU]f]T]gvFPphNV_WPFneHPh`PW`W@Ae^@SLCLun=Kl\OEsdU]du]fufEOrs@vxCKtm;Lun@xg=FwnO^ZuS]GOVg>GumDLldA>gaNW]NF_XOXwOvtTKqi<;mcLFwnDTumBRcrEWneWNlZ==rlFWyuNEZbELbc;BlbWMd\RZclU\b\M\m=<=u=\fofO=gVLSV\=akcK=ln=OseZcjcahe^SJ^gCSnmS\mEBKEL|San Sebastian|Bernstein, Ossip|1911|B01k|1/2-1/2|W +FVm]V]u];L]ZEUxg@weLFsmGWvx^mgmFP_h@AruTKd\U\m\=OjZENk[N\e\BR[SW_f_P_uE:>qi>VxqVXl^XW^C_YEuKohoWowoOoCDY_\UIYDV?OU^O?uE|Ostende-B|Van Vliet, Louis|1907|B01p|0-1|B +FVm]V]xgEUg]DT]c;Ln^U^u=L=sdGWog^gwS>GpgdSOUfoBJl\JS\UNEg_FMoh<:ts>vuvG?cm:Zmg=GgVE>qaZ]wpMV_V]`ho`poT?@VNGQstQ`UM`OT]@?]T?@|Maehrisch Ostrau|Walter, Max|1923|B01y|1/2-1/2|W +FVxg;Lm]V^gmGWnf@Ol\?[jb[mtm>@sdEMph=>ulL=vtDLwnG]ULUdSGEmdBJdOJS\U?OUN=Nlc@AcSEFuU:?S[N=yu=L[m?=qaFDmdD;US;DuUDEdc=;SKEDbZO?USL=c\DE\U=Ln\ED\cDEaYIQUNEDcU?@vxumE@qaIQxnGW^UFUmw;LtmmdUdkdNUpU=UyxUgtm>Nwh:>mvL[vwgfwp[elefeutHdxudktkNKkte\tm\[meKMel[ZlkMKktZ\tm\[me[kpUKNU]NM]MDMrskjsCIQusjNCDNUn]>^sCU]el]o|DSB-18.Kongress|Barasz, Zsigmond|1912|B07d|1-0|W +EUmeFVsmGWn^@O^W@tXIQXaRZcmV^e^U^nS=@tk:=gm?>mcNipyV^smEWmwLVc]WYypBJulDT[TMTruipxpT]d]Vge^gvuvO^og^Mn^=^|Triberg|Selezniev, Alexey|1921|B08e|1-0|W +FVldEUm]V]d]DLsd@tb:bwt?:xwEKnuO^gaWId^I^ulHPl^U^og^gagbjrj:jf^jktdGW]UW^ULCLdLKULP@Igakswo^f|The Hague|Davidson, Jacques|1921|B13j|1-0|W +FVl\EU\U@OxgV^g]OUsd?TuZDL]cTKZ^@wnUdkdNU^W?>og;Em]BRd\RZcTKRvoUNTN>NywRdrsd]wu:RW`]TsCTMtbRXCE|DSB-18.Kongress|Spielmann, Rudolf|1912|B21n|0-1|B +FVl\DLm]V]u]EU\ULUsd@OtX?Fnf;L]m@xg=Evx:=wuIQXaN`aOFOen`NdSNWrtW^g]=@Ig^hfxqf_qy_w|Vienna|Perlis, Julius|1908|B22h|1/2-1/2|B +FVl\;LnfHPm]V]f]EU\U=Uxg<`wn>?EN?:IQxpOd:BDTBCdRCG\ZGIQYIHNOHDZ[gXOVDE[kXgVNEHNOHET\ED\dDLOWL\WN\LNUgvkSLPSkh`knveU\pg\ePMe\gndlML|The Hague|Mieses, Jacques|1921|B23j|0-1|B +FVl\@OxgV^g]DT]lEU\U=UsdUVm]^eue;Ln^=utEDkc=nwDEphVOf_ONutUL_MNUbdPXw\UWh`WP\ePNeWNnohLgtlnulmuxhgxwghwxhgxwmowyopIYdmYago>NWNGNof|Gothenburg|Spielmann, Rudolf|1920|B29g|0-1|B +FVl\@OxgV^g]EU\U=UnfDTsdU=]nG^XGFlPLUtkAQPeDLf^U@_WT\eiF>^VQYi`LQXN@NWN?TxyE?`g|The Hague|Euwe, Max|1921|B29h|0-1|B +FVl\@OxgV^g];LnfHPsd?H]LCLme^ewe>@vxEMenruNWneWeleENkcOEdnETelN^l^T^mR>Fn]H]f]:>wvGWog^Oxo@GvF>FuvFvovO>vnGNnfPXfeIQphNERm>OenENqaOIneNF]ULU\UFEaXQXmdEFd]BJc[I?jZ?EZREV]VMV[SFESJE@vxEUen=Mtm:;dZO^mvHVqi?=ul@o_V_h_?>n^UGmd:=wgT\ghFTxyTohiOWuno]^V]dkd\eieEFehFTvl=ErxHPlvL=nY=NYWTopiEuW^N_hg_ixwowgwGU|London|Marotti, Davide|1922|B38e|1-0|W +DTl\@Osd;LxgEU\UOUphFVwp@tk=DrtBRnf?=e]V]f]T]k]UgpgFOgLCLugO]tLDEwtRZcZ:ZgcEBLDB:cG@AtL]ODCZ[CD[sxpskjZ=?GEOVD@qaGOaY=EYQHPgq:=qwL]wfUfof]SulSdmdCSkcT\c\S\e]V]f]EDvoFMpgMhopOWlm=Umf@Grsh_foDFpw?>nf_Xop>=pnUEsSG@wpNGpoFbnlEFf^W^SX^gdkbf|Marienbad|Spielmann, Rudolf|1925|B38f|1-0|W +FVl\@OnfEU\UOUxg;LwS?Mm]V^gm=Xph@SwLRwp?>d\M[ulDT]UXOrsOdld[dpw>=tkdmvmCS\S=UmlWNkdRCwpCMyuUusuMSp^Sblt:;dV;>^L>@Sw?>wpLRulXPd\DT]UCKtk>Fvx:>jZRCmcBRcmMDmsCMsbGOlcIYbSMScS>=wu=MumPGScG>cl>Pxy@IrxW`qi`gh`Yapg^g`XPlmlOWltIPxuF^uxD=krMEtd=XdcEMrHPHxXHOXYOPYA^\A<\tyqtu@vxCS\eGW^WFWulHP]gM_tkWHd\EWwuDGldWeueS\e];Csv?;krLT]^;?^\_M\^IQ^NCEia@IN^HYdlY_vfGWgVMVrVW`V_?_^_Euxq`_ph_MaYuUYPIHlkMOfFHPknOWFBWYnYPYqiYPBJPHo_T\JLURL\Rj\DHPDLPHi`jRLNRSNVScVRHORTcbTSbd|Prague|Von Bardeleben, Curt|1908|B40s|1/2-1/2|B +FVl\@Onf;LjbEU\UOUk[?Mtk>@me@AxgBJsmGWwn=Ful@vx=OSeMVtf?=]LCLulVqxq=Uenwu>^ZBOVqxIQuULUru^ao_Vdfoa`n`W`uv|Vienna|Tartakower, Savielly|1908|B44f|0-1|B +EUnf@Ol\FV\UOUsd;LxgU[wSBJSL[Lm]V]g]L]u]=]f]kcNGtlDLxw=>TeU^ld^edeDMeuMUut>^tlOHoxHAqiA]x]^]i`Y`wnLTnfRZ|DSB-18.Kongress|Von Balla, Zoltan|1912|B45s|1-0|W +FVl\@OsdEU\UOUxg;LmeUdkd<`rsCKuZ`EZl?Mph>@wpGWvxLRtm=Fd\RLmd:>nfV^gvBRsuL[d[R[umKSe^W^\TMVp^EN^L>;l^VdmEFOLU;>vpDLUN>N^lOWlc|Maehrisch Ostrau|Wolf, Heinrich|1923|B56h|1/2-1/2|W +FVl\@OnfEU\UOUxg;Lme?Fjb>@smGWk[FOtkV^kOUO[SLRe^W^g]@AwnngIY`XO@xo@Ff^RjgnFLofjbneJRfmL]e\]gmlga\G>?GNbhlkap_WPW^Wp_N\hXWOXVCG?>GH_UHP>GPQVW|London|Znosko-Borovsky, Eugene A.|1922|B84|1/2-1/2|B +DTnfFVm]T]f]V]xg;Lg]?T]cTKsd@Fw\LV\U>@vxEMtX<`um=EXFEFxy`NrvFaog:=v^aYUCV\mvMU^aYPc]?>vtPOa_OQCLHXL>X_]N=>N_KftvQ_dU_]Uf\fvh@Awv]kqaklaYIQg_>@hglpgpfpv^@`|Vienna|Spielmann, Rudolf|1908|C00e|1-0|W +FVnfEUm]?Ml\DL]VMVxgVOsdU\u=O=w\@Ovx=Df^<`gX>@qi`]N>EN]E>]nGPnhPGVW>LWVGFhWFGVML^W]^eMTGP]SPYSDYa[SeWbZHX_XQXDUahZRhgRJW@smL]f]cZOEmo>vrvEVZl=>xpD=iaIY`XVPk[>vov=>v>G>lP>PpoA@on@GnmPsjb|RUS-ch03|Levitsky, Stepan M.|1903|C01c|1/2-1/2|W +FVnfDTm]V]f]EUxg@Own?Fvx>@]TFTsm;LmcTKtXIQXaHXahO^l\^hqhU\n\=Oul@tXIQXaLFaOHOsm@Aul=Ega?@o_`i_W@`mg:@xyipap`plp@pypFWeWEWwoM_rvCKon_Mn>AIvnBR>=W`po`infiWf>Wl>nlsjbIH=>sWopW`po`iofOWnoGOfmHG>nDTnvT\vnKSnvS[b[R[mn[dkdW_vriNnwNfrBGPBEMbEUfdwpdeUE\dgaPYEUY`ag|Hauptturnier A|Englund, Fritz|1905|C01h|0-1|B +FVnfEUm]V]f]@Owe?MtX@sdDLum?>vx;Enh=KdnLTldN`og`YhYOYXfKDphYOfo>Fwv:>xpT\elE?nxFvrv>vovDFxi?NioIQouFEufHPqaQYmoNHvmENovH>fuNvmv@?vm?FmXFNufOIXQM?Q?I?h`>HphNMlu?EulE?`XHNg_NH_WPWlWBRWjbKZipZkpULDf\k\U\>M\n|Bad Pistyan|Barasz, Zsigmond|1912|C01o|0-1|B +FVnfEUm]V]f]@Owe?MtX>@sd?>xnDLum;EogE?vx?NXaFnx:>vFOFwvFvtv>vovPFxnYOyoHXelENoeOEvm@HmfIQeTET]THOjZFPg_X`n]NEk[PF]cQYleBJcRE@dZCSZTBRldNT]TOEmf=Fn]xwRZv>?>jbLTwnJNnmNOmnONnwNFC;>E;:F^og^\wnIY:J\aqiHPnfa\phEFiaFEfeEFelGOkcZclcPXaXOXJPX`g`\`P`Y`cZFMZSU]d]T]S\MV\eVUbZUTZRTSe]SR]^RS^WSTW`TM`WMFWP|DSB-18.Kongress|Burn, Amos|1912|C01o|0-1|B +FVnfEUm]V]f]?Mwe@OtX>@sdDLxn<`um`YvxYPnh;EhWPWeW=Dph?>xpIQXfE?og>Frv:>du?PldOIuoI?oeD;vnQYg_GOwvPAWiHPpwAGfo;DeTOWipMT]TDEk[Fnvn>nmnEN[SNnwnG=SLCLne@Gd\U\e\GNovNEvd?NdV=CV;BR;BYajZahqhNHpgHYgYPY\]ENBKNO]eONe\NE\dENd]NOKDON]\NEDVENVdNE\]ENdmNO]\ONmvNEvdENdRCR\[NU[RUTRJT[JKLTZRT\RJ\dJBdlB:2lt2:R[cRScjSUjrUVrjVNjrNVrjVUjrUTrkTokcogc[gYtTKCTFCN^>Vde=FefFOfgVW^]WV]=OH=EHQgh_WhoWOEiQPipVXpLXVLpVXpLXmowPHLDOGDhHIhamQa^QP^CIAC@xn?>sm<`vx;Eog`NldDLwo=DmwIQXaOYumE?p`Y_n_M_ah_mhDmXDhXOonNEwf?Pg_>Frv:>xoE<_WP?qaHPog@Hvy?IhMFEM;PXaYCK;hEFyvfw>jZ<:ZRKSsvBJoh:fnfH?MT@Ggm<>fN?FmcE?Nv?EvNFT|Karlsbad|Suechting, Hugo|1911|C01o|1/2-1/2|B +FVnfEUm]V]f]@Oxg?Mwe>@vx<`tX;EsmDLld=DulIQXOEOwv?>eWHPW`O`qi`OleOYv>:>rv>vgvDFxwY_efFXf>@H>EXFEFMFmcCKctFMte_NvlHOwnOFnfPXfgGWlfNHphQYiaW_h_X`ghFNog`ghgMF_WNMghLTeVT]d]FOVgBRjZH>fpOHp_>OgXO^X^U^_YH]kcMVh`]fYhfQhnQmnhm[hw[?`X?FX`F?`X?FX`F?wh?QhnQmnhmvaYvmWOmQhW^fWQfnOGnv2G?2|Karlsbad|Chigorin, Mikhail|1907|C01p|0-1|B +FVnfEUm]V]f]?Mxg@Owe>@vx<`tX;Lld=EsmLFulFPrv:>vfOYwvY_f>?>v>E>eW`WlW>nphnumwugX_P_W@vx<`tX;EsmDLld=Dul?>wvIQXa>vrv:>v>O>ahMhqh>Omw`gpgDRjbE?wfHPg_@H_WPXd\RvxpX`\ULUlnvtf`?EeSQY`VE?VetXnVYae_ahohBJSe?EVFX`_NH@F=@IN?E?=OI@OQ`HQH@Hel?ElcEKpgGOh`HGg_G?`XOX_XK\c\U\]UCSUMJRWO|St Petersburg|Forgacs, Leo|1909|C01p|0-1|B +FVnfEUm]V]f]@Oxg?Mwe>@vx<`tX;EsmDLld=DulIQXa?>rvOYahYhqh`gmgEOgaO`lu`OaWM?ugD=g_OIvf=X_DHPo_XOwv>vw>MwO<=kc;og>=h`LTBRT\RTPJT\Jj\^jrg_rw_X=EXPwo`XowPHwoXPopHOpoOXop^`|Ostend|Oskam, Gerard|1906|C01p|0-1|B +EUnfFVm];LxgV]f]<`wn?Msd@FdS>@SM=MvxFPqi`Wld:>neW^gvGWog^eveW_tmPamvaWvoWfof_funHXiaXag_LFnfFWfiWhwvMQiEQYvV>V]Vhnxqn_e_?_EU@HrvY`vf_ofe`_qi_WiqW_qi_Wiq|DSB-18.Kongress|Cohn, Erich|1912|C01t|1/2-1/2|W +FVnfEUm];LwSV]f]?Mxg@Fvx>@ld<`SeGWsmFPwvP_mw_eueW_qi`YwqBJtmYPewP^xy=OruOWmt:>um>Fvu?>kcHXgvWPog^Wq`IY`oL=ve=GeVMV]VWluvFVvV>Vd\U]m]PNo^GMyqM^g^l^]=@Gtk^pweV^qpX`=EG>E=>G=EG>E=>G=E|Meran|Przepiorka, Dawid|1924|C01v|1/2-1/2|W +FVnfEUm]V^l\DLsd@Ouc?M\ULUtmMFxnCKn_?qaHPrt?HphIQSn=EjZA@vxVgmgO^l\U\ul=Fn\<`gm^mtm:=mdFaphaYwv?>\n`nlnYnvnMVrtDLf^=edV>Vo_VRkcHX^VX_h_@?xoRUnfemfnU]nm]mohmjtujbuEbch`?>EDc[`XIQXQ[_DC_WCBWVqaLTQHVWBDWYHO>=DGT\ONYaNU|San Sebastian|Tarrasch, Siegbert|1911|C10k|1/2-1/2|B +FVnfEUm];L]VLVsm@Oxg?Mwn>@gVMVmgVMvxDLkc=FtkO^u]GOl\ueFDwu:=ph^TemT^m]CS\l^TkbTCbM=M]MCMlTM^Tl^MlTM^Tl^MlT|Karlsbad|Wolf, Heinrich|1907|C10k|1/2-1/2|B +FVnfEUm];L]VLVsm@OxgVgmg?Mkc>@tk=FwnCKvx@ru:=g]WPd\DLwvT[vwU\c\LT]c=eue^mcmPele?=e^|Bad Pistyan|Teichmann, Richard|1912|C10n|0-1|B +FVnfEUm];L]VLVsm@OxgVgmg?Ml\U\w\>@vx<`\n=Ful:=wuDTtm`ErtELmvFDqiO^gm^mvmDFmdFXnwGWuM=MdVMElT?=V]IQo_XhTWE]WN@Af]h_tu=]N@dVMVldVMweDLulnhMhehU^wvGWogELvn=eh_FV_V>Vg^edrvL^m^W^n^V^v^@G^ndexoeMnlMLofGNf^CSjZSZcZLJlTJZ^gZ]p`]Eg_NMT@vxFWhWEogrtLEwG>F^MDMGFEFtLKUxoFELlUOogB:mRO>f^:;]U;Ckc>OlLCBRKBCK]JRLJ|St Petersburg|Helbach, Grigory|1905|C11g|0-1|B +FVnfEUm];Lxg<`]VLVsm?Mwn=FgV`nunMVmgVMl\U\n\M[tm[mgm@OrtDLvx>@wu?=mg=EuEFE\]E]g]:=xw@?wnHPk[=U]c?Ft\IYqiUMcTCKTeMNe_NM_eMNe_NM_eMNjZOEo_FMf^GOnfLTphN>[SBJSJ>:ek:J\dMLdeJ:fg:>k\>NecN>ce>Nh`Y`i`N>eMLDMU>A`XOX_XAig_ia_gaig_ia_gaig`id\MEV`aVga`gV|Karlsbad|Perlis, Julius|1911|C11p|1/2-1/2|B +EUnfFVm];L]VLVsm@Oxg<`wnVgmg?Ml\U\n\>@vx=Ful:=kcO^g]DT]SMV\e^Xo_Vr_XHPSdFXd^XUtkrklk=M^MUMkdCKw_`Nqa?=ewMmdV=UV;@Hf^m]_o]^;B^fwnUmBFf]aYmn|Bad Pistyan|Sterk, Karoly|1912|C11r|1-0|W +FVnfEUm];Lxg<`]VLVsm@OwnVgmg?Mvx>@kcO^tkDLrt=Fl\:=\ULUu]^OwuCK]ZO^uUMqgq`nUV^TVFTZcZ|RUS-ch03|Schiffers, Emanuel|1903|C11r|0-1|B +FVnfEUm];Lxg<`]VLVsm@OwnVgmg?MkcO^tkM[ld[dkd^du]d^]H=OHO^Ort>fg>Fnf;Df^LT^VCSh`DL`XT\aYFHghLTXPIPYPT[c\S\VOH@jb|San Sebastian|Schlechter, Carl|1912|C11r|0-1|B +FVnfEUm];Lxg<`]VLVsm@OwnVgmg?MkcO^tkM[ld=Ou]`gd[gp]OHOyxpiog^MkOA?xXiWruDLf^WN^VMSneIQXY?@vo>EYQBRg_SdumU]_WNUVNGNWNUNQIE?qiA@mcHXc]NESe@P]SESeSX`i`O`SUMqxyqxUY:>g`P`tQ?Fwv|Budapest|Prokes, Ladislav|1926.07.06|C11s|0-1|B +EUnfFVm];Lxg<`wS@F]VBJSnHPtm?Hmd`gngLVvx>@xyGWu]?G]_=Mjb:=wuIQgnPX_[DT[CV`n`W`k[Go[TMTdH@HsdoGd^Tfuv=?CJf_^h_mJnmnvnFPnmP_hw?>bZQYZR>Nph_iypU]RJGBm]BJrJNJwfHOpwOV][JOwnOoneoq[SVNSKNEe^qnKQYaQIELIQLTha`haXhp^gnog^iX|Vienna|Vukovic, Vladimir|1922|C12a|1-0|W +EUnfFVm];Lxg<`wnV^gm`nun=EvxGWl\@Oog^gngHPsd>cTEGk[U\TCNp`NL`WPWtm\dgU=UmvHQwgdlstU]tlQf|Karlsbad|Levenfish, Grigory|1911|C14m|1-0|W +FVn^@FxgGWgVEMV\W^m]MU\fFWl\;L\UL]sd@dUFMeWEWru:=mX=>UfMNkcIQXaW^wvNJog^ea]eP]\J\f\Plv>?>uE>vxovrECrjohBRqaRZcZjZCDlPhiPG\VGNihZRVPNWPF@IaYWehaRZaiZ_ih_GDEeWEDWehoeJofJwphwpg_pifgiwh`wegfesDEsl`XQX_XHPYQlsf]sWEDWN]VN`VM`iFUGDUDiWMFWsDNI@FOslN?ls?PslPF@IFWlcXPIAWMA@QI@AMGcGPGAIG?3IQ?A|Vienna|Alapin, Simon|1908|C20|0-1|B +FVn^EU^UDLunLUnV_M=MxnKRtsMEogECntNWfmR[tcOEyv>=mXWPXF[KdZKJZTETFTCSTdJKvFS[um[ScT=@jZSRdfK=mnP^FG=>f_>=GE|Lodz m|Mieses, Jacques|1905|C21|0-1|B +FVn^EU^U=UsdURxgngLgpgELuvLgvfgLwvCSf>=>v>L>o_>E]THXTFX_FOEWOV_gxoW^cu^UjbDLugUgog|RUS-ch03|Kalinsky, N.|1903|C22|0-1|B +FVn^?TxgEU^U@OgV=UVg<`wn;LsdUYme>nmPNwvLVf_VgpgYi_h`qhqNPv>F|DSB-18.Kongress|Mieses, Jacques|1912|C24|1/2-1/2|B +FVn^;Lxg?TgV=aVea^un^nwnTKe_@Old>@m]?>sbEUqaLFblDLogFP_PIPp`Nvm:d\U\e\@?aYPY`XOU\ULUyYELYA?FAI>@_YHPY_CKmfLCjbCL_eFNeVL>f_@?IyNMk[BRyq>ZqyZSytSZV`ZE`VEZ_hZSg_SZtyMNyvNMvtZStlSZlqMNqnNM_WPWnqZEVEMEqQGOXO?Gh_EN_XKSQAW_A>NM>V|Baden-Baden|Rosselli del Turco, Stefano|1925|C27d|0-1|B +FVn^;Lxg?TgV=aVea^un^nwnTKe_@Old>@m]?>vxEMneLFsbDLtmvwv@?xp:>v>?>\fPFogOUfUFUh`UFm_>E_hCKpoMUhDEDqaDMofGOaYHPYPIPg_MNkcNMjbMDbZDMc[MD`XOWeVKS|Hannover|Saemisch, Friedrich|1926|C27d|1/2-1/2|B +FVn^?Tsd;LxgEMw\@vxGWe]V]f]W^d^FUum:>rvE`^dL[dU[Uv>?>wv>^qi`Nv^N^mv^fvfUfgv@Gxo|Berlin m|Schlechter, Carl|1918|C28g|1/2-1/2|B +FVn^?Tsd;LxgEMw\<`qi`YmeL]p`YPg]T]dn]Knh@FugMU^U=MiaIQaYPIh^I^e^M[gd[dkdKRtmFFumA=ru=mum:;jb;SmuSKumKSmuS;um;CmuCSumSKmu|Moscow|Bogoljubow, Efim|1925|C28h|1/2-1/2|B +FVn^?Txg;LsdEMw\<`qi`YmeL]p`YPg]T]dnIYn]V]ug=EyxY`i`@FtmMU^U>m_EF_hBRjbRZcjGO`XOXg`FE`XPeXTePyu]ele>=hVPGVDEDTD=ldBRyxA?qiLFvtFU\UDLUcRZcl@p`=Etm:;vtT]iaLTaYGOkc]dmdBRjZFLuxL]d]T]gW?GWEGEtmIQo_V_xwEFw_FV_W@GysDTWVMVld]dmd|Lodz mt|Marshall, Frank|1908|C28o|1/2-1/2|W +FVn^;LxgGWm]W^gV@OtXEMV\?Fsd>@wnOUXFLFd^U_\fFWvx=>fW>^Wf_nun^]l\@vx\c>EcjphjcE>cj>Yj\Yu\julj\lu\w|GER m|Mieses, Jacques|1909|C29o|1/2-1/2|B +FVn^GWw\@Ome;Lsd?[tXEMxnIQXO=OvxW_dUOPU[L[og@ld[JucNcjcDLwu?GumJDru:>]VMVntGFc[D:tc:KcR@Gd\FDph_hqhK<\TGNxo>?m=?=u=NF=mFNR\CKofKT[TDCm=CcfmVeSRldRrd]QYe_rw_NwxNH>GHYxu]VFPVWPFWXutMO|Prague|Alapin, Simon|1908|C30l|0-1|B +FVn^GWw\@Ome?Txg;LvxEMsmW_ldBJk[TBjZ=FucO`ZRL=e]DLtbFO]VMVruHXcl`owoX`g]V]mc]eleBoxo`hqh_hoh?[S?@bFO_hi_QihQ_hi_^umIYEC:>FMNXih^`|The Hague|Marco, Georg|1921|C30m|1-0|W +FVn^GWw\@Ome;Lxg?TsdEMtXIQXO=O^WT[gm[dkdEogBJSLELxoA?of?_d\:?qiCKwyLCysP>m^>L^dQYdULU\UX`i`Y`swKSjZCKZSJSl\DLrt`gpgS\e\KTULTLtdLTdlV^lm_gwg^gfo?OmlO_lm_]mj]ejlT]lt]^tleu\Tuyldyqow^_TL_hwvqyvmyALDA<|Meran|Rosselli del Turco, Stefano|1924|C30m|1-0|W +FVn^GWw\@OmeDLsd?[tmEU\c>@xgW^e^[dmdO^dV<`ue`gpg^Tef;Eg_EV_V=RvnRJnvJKvn?WyxKSnvS[ld[^f^T^clWVl^V^vm:>rw^nmt>Nqi@GxhNOogOPh`IY`[CKd\U][ZPpZBGOBDnltulkDLOWut]e|Lodz|Salwe, Georg|1906|C30n|1-0|W +FVn^GWw\@OmeDLsd?[tmEU\cU]ds[M^W@vxCSun=DXOHOm^MF^hWPwv:>rJFTJr>FgaOWaPIPhw?>ng@HvnDErvEUxyV^gi>Ae^W^i`UW`WPWphHOypBRog^fvuA=qaTKh`W_ueLTl\RZ`XOWwmFN\SfmnNWNcZKRkcNUpiT\c\U\emRmaY]eXPmd|Lodz m|Salwe, Georg|1907|C30n|1-0|W +FVn^GWw\@OmeDLsd?[tmEU\cW^e^U]ds[Mun;JxgJTgXTcjcIQXg>@vx<`ne=>gv`NogLTl\BJsbOYen:Yqi?@wqHhrwYXq`QYnuY`i`IHyx@AwvXa|Karlsbad|Salwe, Georg|1911|C30n|1-0|W +FVn^GWw\@OmeDLsd?[jb[Rk[RD\cEMxgBRtmR[b[:rur;J^WJ[d^[Ul\UF\TMU^hFWvxWhqhO`ga>@og`OwvOYxoV^g_Y_m_D_h_=aox^evw?_w_a_r:_`xo@Gof`^fm^[mf[TfgT?gf?>f]em:;>^]T^f|Ostende-B|Schories, G.|1907|C30n|1-0|W +FVn^GWw\@OmeDLo_W^e^EU^U?TUM<`xgV^qi`Yp`^g`YO^ug=avw^hwphyg^>=^FaFMF=Fpy;EsdEOYQHQ_WA=tQToQX=]\eoadn]eXOFOle:=|Triberg|Spielmann, Rudolf|1921|C30r|1/2-1/2|B +FVn^GWm]V]^W=Oxg?[tm;LwS@Fvx[msm>@mcFWumCKruu]`pypg]og>nwoCgpxnvowvNM]NPxogpof?w]EIQc]@IEBwvfmv^BE^Vl\p^md^sEiPxd[xui`uwjZV^`Ew_]N^\[S\[SJ[ZJC_`qis^CK`PEZ^WiaPNKDN^ZRIPaYPXk[HPYPXPRT^`TFW^[S^pSK`\DM\]MT]UT\UXKCX`\epCFC`_C;_G;AGIA>IGe^PH^VG?>F?GFNG?N`HIVN?@`WIAWOAING@XONX@NWIAWOAION|Stockholm|Reti, Richard|1919|C31|0-1|B +FVn^GW^W@Om]V]xg;Lg]L]u]EUwn?Mp`=Ft_M_]_HX_fFfofIY`YX`vxAYne@vxO^lcDLd\U\n\@Aog^MwvM\c\@wnDLxg?>vx;E^UOUm\BRwvGOe]V]g]EV]cTB\VOVd\=avwUOtfBfof<`uvavrv`nvnO^cm^TmcT^jZ>=phHPxpIYqa@HwvCK\TKTvt=Ut\^M\TUTcTHGnlMWpgGFlmWMf^:?gn?;kc;@mu@;nf;=TeMGutFMekMDk\=:tu:;\RGMut;[tLDELT[^fg^vR\V^govuonu]\M]MZRMeRJecTRc;JB|Ostende-B|Billecard, Moritz|1907|C41g|0-1|B +FVn^@OsdEU^UDLm]V]u]LUxg?FwS;LgV@tX=K]KBKruF[XOHOVe[dkd:je[jb[ULUuUbdUSdLws?=ph=Mld@H|Gothenburg|Marco, Georg|1920|C44u|1/2-1/2|B +FVn^@OsdEU^UOUw\@wv=MjZ?>tbMUusN_btCKsSBJSU_UtmGOvnJRxw@Gph>Frv:>gaHPapFNpfUfofV^e]LFd\NL\TKTvsT]f]LlmRlnwn>:RD:ZnfFUf^UDsCZ\^e\temtL]ULTUMTUmfUMCDG@h`M=qa=?f_?GDTGBTS@GSTIQaYPY`Y|Karlsbad|Kostic, Boris|1911|C45u|1/2-1/2|B +FVn^@OsdEU^UOUw\FX^P^g^LR`XQXtXGOXmRclcBJruFNmtTKc[DLtmNGus=:ZRKBmfBfnfGNe]HPp`OW`WPW]VNV^WVWf]A=]\=EywWPskPIkqI@qpEHpH@HwuHOuE:BE=OF=AFMA@LT@P|RUS Ch|Levenfish, Grigory|1912|C45u|0-1|B +FVn^@OsdEU^UOUw\@vx;LldTMnh?>o_LFugFWhWOWgCWlCLlcrB:;_W>nB:nlWOlj:;c;OHjnd\;=LgMqxq=agia]i<@Hw_]V<`HA`hGO_`VY`aYGtfG?f]DThDnF]T|Baden-Baden|Mieses, Jacques|1925|C45u|0-1|B +FVn^@OsdEU^UOUw\@e]TMyvFOu`:>tXOP`WPYXmYaWXaXmXIQXmLFo_GWpgFPv>?>rv>vmvP_iW|GER m|Mieses, Jacques|1909|C45u|1/2-1/2|B +FVn^@Osd;LwSEMxg?Fme>@vxqiIQumF?gqHXiaOIaXQXdn>NnhNPog?HldLFSE=Eq`MUmn:>d\U]fmDTrvI?mtBJnlENkc?EtbJRvsCKbtH?ln>:jZEOtm?Hxo@?wyF@yi?>hW>E`O@Op`:@syEDohOEnqE?hpDEmvHOvhELiY|San Sebastian|Nimzowitsch, Aron|1911|C46g|1/2-1/2|B +FVn^@Osd;LwS?TxgL]SZ>@vxEMqiIQmeOIg]V]dnGWZc@An_?O_YO?Y_?O_YW^YOIOe^O^ug^Ot_MUwvDL_V@\TMFt_FTrvN`_D`]e]T]DM:@vxrsCKt_=Esv>vwvOFe^:=qiFM_MDMgXHP^U@HXGEGUL=?xyGovFHQLMowyq?oMhoGhfQHfVHQFGwG]UJRUMGEV]|Berlin|Mieses, Jacques|1924|C47t|0-1|B +FVn^@OsdEU^UOUxg;LwSUdkd?Mm]V]un=Fg]FnvnBJSZEjZLTneELs;A;e\GWphHPyv;>\eT\e\>^\e^Zf]LUv>DT]OT\emZr>=UL=@vx<`SLCLue=OtXOWeW`WldGOXfBRjZHXgm@Gwt?>d\M[mc:;]UW^c]LU\U^UtD>FDtFE]LULtL;=xwEUwnIYqiUep`YaLJecrt=MJM[MtLM_f_X_L\_gnmcb\_GP_WbZWgZjmvRZvwjkwpkcg_Zb_ZcdZRdcpqcgqp|Karlsbad|Maroczy, Geza|1929|C47u|1/2-1/2|B +FVn^@OsdEU^UOUxg;LwSUdkd?Mvx>@m]V]d]<`ldLFwvFUue`YgVDLS\GOeiOViYV]d]M_ph_trt?GvVHPYn=Eo_:=VN@HnVH@\cGWVn@HNVU_VFHAnf|RUS Ch|Nimzowitsch, Aron|1912|C47v|0-1|B +FVn^@Osd;LxgEU^UOUwSUdkd?Mm]V]d]>@vx<`ld=Oqi`gugOgpgLFrsFPSZ:;wvP_t_M_vFHXsS@HSW;=iaIQZc_MFG?GWGHPaYPYGO=AxpYaONQYN^M_cNA?]UX`g`Y`d\CKNE?GE>G?>E?GE>G?>E?G|Berlin|Spielmann, Rudolf|1926|C47x|1/2-1/2|B +FVn^@Osd;Lxg?[w\>@vx[dmdEMtXIQXa<`qi`gugHXah@Hru=@vxO^wv^OdUV^UOHOld^gd[EU\wgpwp@Ame?@xy<`og`WjbLVe]VPkc=EvxPat_WipiEiun@xrxigngagxwg]_D]NDhAHhaNXaoXNwu:=oB=:Bx:buUbrURrsqaN_yqscxT_eTFe[RW[LFOHPWoIQOkLFoOPYktFPOWYatQCSWGPVG_V`qpchpwhewn|San Sebastian|Teichmann, Richard|1912|C48f|1/2-1/2|B +FVn^@Osd;Lxg?[dUO^unGWU[L[me^OnV>GgXG@vuIQXgEUqaO`Vv[Lt_@IgXQXaXIPyA=Aog`WEWvoA?wn?[p`WEoaPGXPGN`XLVaiNMif[krtDTldU]d]T]fmkmum>jbNWngCKgpWP_h|Meran|Opocensky, Karel|1924|C48h|1/2-1/2|B +FVn^@Osd;Lxg?[dUO^unGWU[L[me^OnV>GgXGPVh=FvuA>tm[UXNPGNDUDhDCSjZ^aXMPXPHPwePIrBI@BE^akcg^e\@?tk^Pm[?>EF>=FH@e^]TVeTLog?>umBRmoCKwuVUVdVuUVdUSZbSYdrqiHPYUbjxqDLUe|Hamburg ol|Apsenieks, Fricis|1930|C48j|0-1|B +FVn^@Osd;Lxg?[dU[Tw\O^un^Om]T]tXEMld]Kgm<`neL;eh`NXOHOhH>EUOE@vxEUTMDMVLCLtXMU\e=MrvIQXaBRahMTnFTFvFDL>nwsRZxwnmh_me_f:;LlebsrbfofO`wn;>ngGWld`qgnq`nm>^rwU]f]^]de][md[Sw_STdm`VedTRdbHX_ZRUmlVLbe|San Sebastian|Spielmann, Rudolf|1912|C48j|0-1|B +FVn^@Osd;Lxg?[dUOU^UV^UL^gugELwn>@vx_MEMwv>FghMhqh:>nwNWvF>Fog@?xoIQh`WPk[?>ruGOum>EjZBJZREMw\F>muPlutlPtuPlutlPty>FyrPlrjlPjmF>\j>FjcPGd\MEmeGPedPGclE=l^=\TGjfvjN`XOXvfX`^PN\em>fmf\UphUNf_;Fld[Mm]A>weFOtf^tu:>phIYd\Ya\TM?eb>:unahqh?Fng^NyuF=bZOFuyGOZbFGf_OWyAN>A>G>_V>Gg_HPh`W`_`GNbfNUVHCKf>KT]T:;o_UTHO|POL Ch|Makarczyk, Kazimierz|1927|C48m|0-1|B +FVn^@Osd;Lxg?[dUOU^UV^UL^gugELg^=F^F[Fm]LTtfFOvtT]f]O]u]=ZRA>o_=D^g;d\CKRK;KmdJRkcK;]u;>c[>fd]fgpgR[\TWiuyipyapg]\DE\[EN[\NW\]GO]fgUaAUpA=py=Myp|DSB-24.Kongress|Nimzowitsch, Aron|1925|C48m|1/2-1/2|B +FVn^@Osd;Lxg?[dU[Rw\EMvxLFm]FU^UV^gvRvwv>@tXIQXO=Ov^um>fofW^\cOXl\GWrw?OcuOPugXFmoPOqiO?kc?>gY>?oh?OiaHPYg@Hh_^gwgQYxqOGqhF>hoGF_hF^g_HGjZ^FhgGHon>EnoE>ph>EgnE>ne>GedF>ZRHQdeGEonQHnmEFenFEmeEGngG?gp?GpgG?gn?Gf^W^n^GE^gEi_GH@GO@HOGH@ed>fgf@Gf_GH\TiyTMyvdevueduvdevue\un\TnlT[DM_flDf>HI[ZIH>SBJS>HIZ[IH>nDE[dHOnNENUNONd\NE\UEFU^FN]UNG^gGHg^HG^_GOh`Y`_`OG`_GO_`OG`gGOg_OG_XGHX_HO_`OG|St Petersburg prel|Bernstein, Ossip|1914|C48q|1/2-1/2|B +FVn^@Osd;Lxg?[w\O^dU[RvxEMm]<`ld=EwvGWk[RKqi`YgVYuVE>EvuLFUFEFuvF?tkDLog^XiaXG\NK=aYHPjZ=O[S?HSLCLkbLTruT]d]A=vnGXYPIPNU:@vx[dmdO^wv^MSLELgV=OVeuYOWYaNUogGOahWPkcPh_hUGeTMSTCSdhDGPDR>vrvdjvr:;CMj[R[;[rBIQBj[]M\PG\f]mxw@IjBGNBDmMwnIPg_OWl\|Vienna|Koenig, Imre|1922|C49d|0-1|B +FVn^@Osd;Lxg?[wS>@vx[dmdO^wv^MSLELgVv>=>t_CKug>^g^W^rv^ele:>v>M>e]@?xw?FwnFEne>Mp`GOqaMCd\LT]UCMkcBJogEF_mJRmdFGjZHPefGFf_MGaYGMYPIP_f|Vienna|Maroczy, Geza|1922|C49d|1/2-1/2|B +FVn^@Osd;Lxg?[wS>@vx[dmdEMtXIQXa=FgmL=wv=NogN_Sw@vx[dmdO^wv^MSLELgV=OVetfOPf]P`g`W`jZBJog`WxoGOkc>vrv:>vu@Gp`WP]fIYqiY`i`JRd\G?f_>F_mCK\TMCmfPeueKTl\?>fm>GmdG?em?GmuG?uy?@yYFEonEFnmFEmlEFYqFfqofNdm@GoqG@luN>qn>nun@GnfHPmdGFfoFNg_NFdmFNohNFhaFNmvNG_WPW`WGHaYHIvmIHmdHG|Hastings Six-Masters|Tarrasch, Siegbert|1922|C49d|1/2-1/2|B +FVn^@Osd;Lxg?[wS>@vx[dmdO^wv^MSZGOgaLFo_MGZcEU_VOVd\DL\ULUtf=MummRU]cN>NRBG=v^=LBC?;CJMUrv;kJ<@GgXGOXIOPI?PG?NUN@IvN|Hannover|Von Gottschall, Hermann|1926|C49d|0-1|B +FVn^@Osd;Lxg?[wS>@vxEMmeLFdnFPld[RnhDLSZMUZlRDqiIQtfng@?d^f]um]kh`Y`i`O^l^kdmedr`X>FeM?>MurduyFE\Td]yt>=t\]x\tx]g`]ftdf]d\]f`gfx|Karlsbad|Maroczy, Geza|1923|C49h|1/2-1/2|B +FVn^@Osd;Lxg?[wS>@vxEMmeLFtXDLS\FPgaP_\cxpTd]edlpileiqenqhnfhqf^PQ?FWOFGQY^PYuPXuEGOE=OW=EW_E>Xhqy_fjZfo|Warsaw m|Marshall, Frank|1908|C49h|1-0|W +FVn^@Osd;Lxg?[wS>@vxEMmeLFtXe]GOXfHXagFP]UNESn>HrsCKd\P_f_X_sc?Gum=FwsOW^WEW\TKTc;:;s;G?;CV^gvWPmR_gnwFXph^fCDH>DBfoxo>OvgO`op?gpgXWgnWonu`f|Lodz mt|Marshall, Frank|1908|C49h|1-0|W +FVn^@Osd;Lxg?[wS>@vxEMmeLFdnDLSZFPnhMUldU^e^=uwu[TqiIQZcwn@?gm>MjZBJmc?FleP?d\M<\TKDtbFObkOFe\?NiaQYnfHPrwCSZSJS\eF>wrEcR=;JBF;DohD;h`;DQm@H>ED;YQHPE>PI`Y;DmvF@>PIAva|Lodz mt|Salwe, Georg|1908|C49h|0-1|B +FVn^@Osd;Lxg?[wS>@vxEMmeLFdnDLSZFPld[RnhMUwvRDqiIQtfwm>Mc[P?le?NmcHPrwEDcTGOp`NT[TMGe\G=iaDEaYPX|Lodz mt|Salwe, Georg|1908|C49h|1/2-1/2|B +FVn^@Osd;Lxg?[wS>@vxEMmeLFdnDLSZFPld[RnhMUwvU^e^=uvuRKtf@vxEMmeLFdnDLSZFPld[RnhMUwvRDqiIQtfrv>VvVUNh`GOVvCKk[:>moNUv>E>jZ>NoWNW`WU^p`QYxoY`i`HPof^lZRKR[RBJ]OPW`WlWf]IPOaPG]TGNTLWe|Lodz mt|Salwe, Georg|1908|C49h|1/2-1/2|B +FVn^@Osd;Lxg?[wS>@vxEMme<`dnLFnhFPqi`Nld[Re]DLSeRDwv?>tfMU]VDV^UNUgVPVewCSkcBJulOEo_VPd\=Olo>fofUNhYOafg:@vxEMSLCLme<`un=Edu[TtfTKfKBKuf`Yqi?>jbYPgaMUfWPWaWHPWhEMnfOEo_U]fmV_w_EVrw>Nhn:=xyLTnxGOxg=?gVMVmuVXus@Hsj?>j\XV\S>F_gVMyxMLbZLSZSDLSLNLwrHQkcQXr:FCxqKSqhCKg_LD:AOW^WPWiaXPA@PG@XKOXWOW_WGNh_NMWOMUOKDG_hGHhiS[KOUVOgHBp`BjgWVMWoT\e\]eomjlmeMVeUV_aYltUW_^\TtyipytphtxhaIQTLxyahyxhixyipytWOtdOQdcQO|Karlsbad|Janowski, Dawid Markelowicz|1907|C49n|0-1|B +FVn^@Osd;Lxg?[wS>@vxEMme<`SLCLun?>duMUtXIQXaHXah[Muf`NxwBRavRZc[M[rsLTwnNKva;?WYHPYW?;sk;AahKMksA=swMKWOKOwOPOhaOPa=[dnfd]fnDL=a]daod[ofPYnuYPulPOlkONklNOfmOPmdPOqi`ipiONiaNOaYOXdVXYVMYXe]XOMT[T]TOVleV_jb_VefVNf_NO^VON_^NF^WFGVNGFWVF=V]=>]d>Fd[FN[ZNEZREDRJ|Hastings Six-Masters|Bogoljubow, Efim|1922|C49o|0-1|B +FVn^@Osd;Lxg?[wS>@vxEMme<`SLCLun?>duMUtXIQXaHXahU]ld[Trt]dkdTMuf`|Maehrisch Ostrau|Tarrasch, Siegbert|1923|C49o|0-1|B +FVn^@Osd;Lxg?[wS>@vxEMme<`SLCLun?>duMUtXIQXaHXahOYqiYhoh[Txq`Yh`YPuo=OrvONkcT[vuBRoyRZyhGOhW[?qyPW`WNGp`U]ia?HypGFwy@Gur>;gmF[aXQXm\;AyYAY`YHQcZ[Znu:;rs;SjbGFscZ:phFEh`S;us;AbZQHZR:>sy>\R|Teplitz-Schoenau|Wolf, Heinrich|1922|C49o|0-1|B +FVn^@Osd;Lxg?[wS>@vxEMSLCLme<`un?>duMUuf`NkcHOtk:>\TMFkVFHe]E?l\]dmd=]dmL[jk?Hwu@=pfHPmtiNbl[ltl=EurEMlsMLkjQYfl]djkL@tXL]g]T]vxIQXaHXah@Hun=FxyBRduRZcNGNld]KufDLf\KDe]V]d]OI^VMU\MDKruFEo_LT_WT]WOHAnYKTYQTMVM?GhV:=>OGnVG>2AH>E|Lodz m|Salwe, Georg|1907|C50t|0-1|B +FVn^@Osd?Tw\;LxgEMme@p`@Ald=LahBRtsRZjbLRmlESleSeueDLUjKDgm:>iaG=og=NyuCSjN>N]UN>ULRLaYA@mw@GwfLFhvDKflKTvm>@tXL]g]T]umDLdn]krskbnhMUo_bF_WNwx:;hwOEn`GOwhF[vn=FhYHPWPIPYh>GhWPW`a|Lodz|Salwe, Georg|1906|C50t|1/2-1/2|B +FVn^@Osd?Tw\EMxg;Lme@tXL]g]T]um]dkdIQXaDLmf@Irs=Do_V_f_O@ah:=vxDl^>Fh_G>sr>Ep`=>og@?vf?@qa@G^lFf_f>Af_A>_h>FrvFvhvG?vh?FhqFGq_GF`XQXaXFGghE>h`GF`a@nh?>rZ:=unL]g]V]ng>NtmDLgU=UwvNvmvOExwETZrGWhnTNvm@Gc[BJn_N_m_K=wnHX_mUVnwIQld]dkdVNo_NMwnMNnwNMwnMNnw|Semmering|Treybal, Karel|1926|C50t|1/2-1/2|B +FVn^@Osd?Tw\DLunEU\c>@meCSxgBRjbRZcjS[b[T[vxZb^ULUnV;LVh@_W[brbNW^WT\brZbkb\dmtMbtb:bi_brwrF[_P[krRksxpsKRrKCpi?:rvOIh`IXih:jqaXG`XCkWOHOn`klvwEKXOGXaX|NED m1|Van den Bosch, Johannes|1930|C53|0-1|B +FVn^@Osd?Tw\DLxgEU^ULU\S@vx?>ldBRn_T]u]K]d]EKog:NhW@?scO>xo>DcbKSbBNOp`OKoh\LmnKJBCJKCKLKnlKCqaXahaCBaX?>XQ>EQIBbloDNI@beg_E>WM>FMWFOWQN_o_OX_WXQ@G|Bad Pistyan|Leonhardt, Paul S.|1912|C54m|0-1|B +FVn^@Osd?Tw\DLxgEU^ULU\S@tXVLXOL]O=?>vm:=rv>No_@?jbBJme]LvNGNyv?Fk[CSdn=?ldFMbZNVphHXZSJS_XV^el?olcMVn_oqXPIP_PVWP_U]d]L]cdWV_PVUP_|Meran|Miliani, Luigi|1924|C54m|1/2-1/2|B +FVn^@Osd?Tw\DLxgEU^ULU\S@vx?>ldEV]cT?n_:=tfKJcTJLTeV\f]>^kc\bog^>rtbSumS]d]LKeT=<_e?Mwv>vmv<>vmM;tvKMph|Berlin2|Tarrasch, Siegbert|1918|C54m|1/2-1/2|B +FVn^@Osd?Tw\DLxgEU^ULU\S;LgV>@SLU]Lg?>dn>Vvx]eletf]kfBVRBfRjrjkjgCO`ug|Vienna|Salwe, Georg|1908|C54o|0-1|B +FVn^@Osd?TxgO`m]V]dU]eueTovnoKUKBKqi`O^VO@no;Led=Fw\F[VN@ONE?tX[dkdLR\eENg]N\vVDT]WRLXOHOVv\eleLVvsVeone_ng_Ud\U[jb[lrjl]W]T]sK?HKCA>CE>fgofe\TedE]dTbZTRofOWfeHOedRVjmV^dcIY][OXmo:B[S^_oj_wZRX_ST_hTdhaRJW_jZGWc\_g\SahdgwgpgW_SKBJZJhgKT|Stockholm|Bogoljubow, Efim|1919|C57i|0-1|B +FVn^@Osd?[jb[dmdEU^U=UuUOUwe@k[TeleGW^Wwv>NvN?>N>G>xo>PUmA@\TMTmUPGUTGcTdcdkdLFd]BJof@Gf^HPp`GNg_IYqiY`i`CKbZKSZRDL]oFU_WPW`WNEoTUO^_EDT]OU_XDM]TMVT?Uf?HVUH?UV?HVUH?|Semmering|Tartakower, Savielly|1926|C68h|1/2-1/2|B +FVn^@Osd?[jb[dmd;LogEU^U=UuUOUwe@tm:=d\UFnhL]vt]clc=em[euyuFL[?@?tl?FldL;c[;Eh^E?^TN@xn;Lk[RKdZEMqiLFZKBKnhFPwn@xnEUk[RKdUOU^UDLUL=anh;LwnGWngvtLTl\T[\U[bkbaZbk>FoT|Rogaska Slatina|Brinckmann, Alfred|1929|C73|0-1|B +FVn^@Osd?[jb[RmeDLxnEUtmRKqiNE=EuE@[dENIH@HdHNUvmU\mf\UHOCKO]LT]dU\dv\UvmBJbZKSZRS[f_U]mf]UfmU]mf]UftU]tk]UktU]tf|San Remo|Ahues, Carl Oscar|1930|C75|1/2-1/2|B +FVn^@Osd?[jb[Rme>@tmDLxnEUnh;Ewn?>vxE?mXRdkd?NXf=RumU^h^O^e^>=mvN_d\_nvn@tmDLxnEUqi;Ep`U^e^?>nhE?`XOEk[RKw\K]ug?NiaEK\cN_ru]dmd=DaY=a_V_hWKEvwGOXOEOYQDEQHENg_NcWQ|Scarborough|Sergeant, Edward G.|1930|C75|0-1|B +FVn^@Osd?[jb[RxgEMme;Ltm>@wnRKdZMU^U=UZKBKvx<`wv:=md?>qi`YumL]d]V]p`YPgaUMngDLm[M[b[KSxw@?rB=;`XO@v>?>g^P^e^GOXO@OogHPwnOYapYHp_PX_eHNeTN_no>GohGOTE|Hauptturnier A|Duras, Oldrich|1905|C77d|0-1|B +FVn^@Osd?[jb[RxgEMmeIQk[RKdZ;LwnmwQYwfX`ldGPnePXfWEV]VOVvfYatv<;xyX@vt@AyxAOxy>@k[RKdZ@wp;LvxGOgm@vx?>k[RDe]V]u]<`t_=FruLT]mT[b[O^d^F^wv;L[SLV_VMVgX^WogIQXGWGg`:=m[=uvuDKxyGP[\@AuwV^\U^fwW>=U^=mW?AI^\PMne|Baden-Baden|Colle, Edgar|1925|C77f|0-1|B +FVn^@Osd;Lxg?[jb[RwnEMmeL]k[RKdZ]nun<`qi`gngOEvx=axqIYZKBKgnaFo_V_t_E?ng?P_hPVgnFNwoYah_VPe]GOnSNESU>ueDLUW_WeW>EW`E`i`@vxLFtfDLe]FP]VMVu=K=fT?>n\=DgmP_sr<|St Petersburg|Burn, Amos|1909|C77h|1/2-1/2|B +FVn^@Osd?[jb[Rxg=Fk[RKw\EMmeDLun@gmHPfKBKo_V_w_FHmcOY_?:?e]Y_nmPXrw?Gph_ixpGwpwHGwpX`mnIYbZE?ct?PteiXduGOldNV]VMVuoPFqiXioi`ipiOXnj@HjNFPNWXW^WV^eo^fWPfoipHPpoKSZSLSofPX|San Sebastian|Perlis, Julius|1912|C77s|1/2-1/2|B +FVn^@Osd?[jb[Rxg=Fk[RKw\BRrsR[b[;Lvx>@[SL]meIQg]K]dn]TnhEMugOIhWFOp`yvV^gn:Je^U^mdT]vu]Od[?@px=;[TJLTf@?uEOFxr;=E=F=r:?FcZLOfT>MT[QYl\Ya\TOQTMFO:=ai=?|Karlsbad|Thomas, George Alan|1923|C77s|0-1|B +FVn^@Osd?[jb[Rxg=Fk[RKw\DLvx>@meEMdn<`nhOYhY`Yqi@Ap`YPxp;EunKDtm?>rvBRwyR[b[E?iaGOaYPG\GFG`XOXgXGOYQHPn`?NvrNXmXOGr:>:yr:;[SDKogLTg_A@_V;?VNGopyo]ld]drtdVNF?>e]T]t<|Hastings Six-Masters|Thomas, George Alan|1922|C77t|0-1|B +FVn^@Osd?[jb[Rxg>@meEUk[RKdUOU^UGWl\V^\T^gug=OrsKT[TOdtmdTwn;Em[Tlvx?>svEVghW_h_VP_]>n[dPVvnlnwvne]VePVDXO]fh`Y`g`f_`X_`XP|Triberg|Bogoljubow, Efim|1921|C79|0-1|B +FVn^@Osd?[jb[Rxg>@meEUk[U^e^=uduRKgm;Lwe@me?>k[RKdZEUZKBKtk<`qi`gug;LldU]d\=MguL[b[M[um:rkr[smus[um[smus[um[smus[|Maehrisch Ostrau|Lasker, Emanuel|1923|C79|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@meEMk[RKdZ;Ewn?>vxE?qi?PwvDLZK=Kl\MUulIQnwU]\TK=xqOIphIXwpXgpgGW^WFmt=>vnBJwvWNqxOGn^NW^nWNiaNUp^P?o_?E^UGUn^EO^VFVvV>V_VUVloO`t_VNo]Nvxpvnpxnl]=AI=]|Budapest|Monticelli, Mario|1926.06.27|C79|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@me?>k[RKdUDLUKBKtkEMl\;EphE?qi=mwENunQYiaUdELCK>GKsGFdUFEUKEFKUFMswAHw?M?\j?:ZRLSUK:CjUSLUVHIKU|Liege|Pleci, Isaias|1930|C79|0-1|B +FVn^@Osd?[jb[Rxg>@meEUk[U^e^=uduRKgmTNMNyt>=l\NMscZkckMe\SebSLGO[SBJm[bZ[TJSTKDKfUK]LD|Warszawa|Przepiorka, Dawid|1919|C79|0-1|B +FVn^@Osd?[jb[Rxg>@meDLk[RDwnEUvxBRtXU]dZ;El\]dZd=FucIQXm?=wtR[b[:rtrE?du?NufN_nwOI[SLScSI?ph_iwi@meDTgVEUtm=Fo_RdkdU^wn;LVLCLvxT\e^O^mv?=utFTxyvaHXaX^owoToXaoTahUg_MTMhMgU|Meran|Spielmann, Rudolf|1924|C79|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@meEUk[RKdUOU^UK]g]V]wn=Uvx;LngUMwvBJphh`YGohLF`XOXhXFP_h>vrv:>v^>^g^IQXWE=piP?WV?PVD=XiWXtxoP?W`QY`nHXD@me?>k[RKdZEUunDLZKBKtk;EphKSwp=DgmEKvxKZktU^m^O^e^=ogEDfoZKg_GO_WNGh`K\`XDKXOKoxoHOpw@?we?Fvx|Hamburg ol (Men)|Van den Bosch, Johannes|1930.07.19|C79|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@meEUk[U^e^=uduRKgmBRrsR[b[;Lld@meRdkdEUgV=Fo_U^e]?=d\DTld;LVLCLwnT]d]LT]UO`n`Fapha`u`<`tf`@meEUk[RKdUOU^UDLtkLUkV?>wn<`Vh`gpg=Ovx;Lg_L]n`OLrtLd_WGOh_:Fwxdbld_f]WfKBKtD>;UCA@yp@?pg;>g_>VCJIYJ\HX_gWaghVWqiWghqgoqxokDG?>GOk[\U[sxoskohknU^nfhqX`i`Y`qx`hxwKSOKhp|London|Yates, Frederic D.|1922|C79|1/2-1/2|B +FVn^@Osd?[jb[Rme>@xgEUk[RKdUOU^UDLUL;Lwn=OtkOPvxnwKf_gW_l\f]k]L]go]Wvg>frv?>onPYyxHXnfWfwo>N\TNQqiX`gq`hoj@?qwQOwf_fjnYWvwWVwOVOnwOowofoxw?F[SFNbZNUe]BRwnUN|Karlsbad|Yates, Frederic D.|1923|C79|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@gVEUk[RKm]BRdUOU^U;LVLCLl\R[wnLU\TKRvxnJ[vrZWvwvRveI@ICsI@sv=>vm>^og^sxosPqaPY_hYWmf@IfFWNF=N>=DEWh_>ED;EF_XGOXfWeaYeW;MF>YQWNQHIHf_NW_hWEha>NMDN>p`HPDM>NM?Eg_PN|DSB-18.Kongress|Teichmann, Richard|1912|C80k|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@gVEUk[RKm]U^tf;LVLCLdn|Stockholm|Spielmann, Rudolf|1919|C80n|0-1|B +FVn^@Osd?[jb[Rxg>@gVEUk[RKm]U^tf=FwnDLvxBRrsR[b[;J[SLSsSKBn\JDSsOEVEFEd^CS\c@AuYGW^XHPYQEHQHAHf_BKwv?>_VHQXGQYVD>vsvKDcU:bUgbgpgD_]UYavFS[xpPXGV|RUS-ch03|Izbinsky, Stefan|1903|C81|0-1|B +FVn^@Osd?[jb[Rxg>@gVEUk[RKm]U^tfDLwn;EV\KDfXIQXa=>\fOIahDhohEKh`EwOHOd^EFrwKE^h?>neOWfWF?WQ@A`X?Fm_|RUS Ch|Alekhine, Alexander|1912|C82e|0-1|B +FVn^@Osd?[jb[Rxg>@gVEUk[RKm]U^tfDLwn;EvxKDo_EKumOUdULUbZGOZROVRKDK_VNG>?GNc[U\n\K]\N]fNEDE[\EF?;FN;CHXCH`hH@NG@=GN=>NG>AGNA@|Stockholm/Gothenburg m|Bogoljubow, Efim|1920|C83|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@gVEUk[RKm]U^tfDLwnrv>nvnEWphWeleOLqaLUn^BR|Berlin|Schlechter, Carl|1918|C83|1/2-1/2|B +FVn^@Osd?[jb[Rxg;Lwn>@k[RKmeEMdZIQvx<`tkOEqi`YZKBKe]?>]VMVgmYnunE?m\?PphKS\fL]n`=X`XQXog]NwuGOuePFruFAopHPktA@k[RKmeBR[SL]gVEUtk?>VgU^e^O^d^>^g]K]vxDBHPxp>@vxK][S]dmdLFgVO^u]EUd\FW]e?>o_=Ftf^MfoU\eUNb[WMwuMSl\SM\TM^uE^oxoKT[TNLrvLTvFHXFH@AHIA@ogX_EH@?HG?@IH@AHIA@GH@?HE?@IH@AHIA@EH@?HE?@EH@?qaBRHE?@g`RZEH@?aY:RHE?@IH@AHIA@IH@AHIA@EH@?HE?@EH@?HG?@IH@AHIA@GH@?HE?@IH@AHIA@IFTX|Gothenburg|Moller, Jorgen|1920|C84c|1/2-1/2|B +FVn^@Osd?[jb[Rxg;Lwn>@k[RKvxBR[SL]gVEU^U]ndn=Um]USl\S>tkDLnh=ruKDclRZhW:JWf=Fwv?@wnEMmeDLvx;Egv?>phE?ng?vn:=nqOVfWVOip@AgiA@e]MU`XQX_XOFiY|St Petersburg|Izbinsky, Stefan|1905|C84e|0-1|B +FVn^@Osd?[jb[RxgEU^U>@wnV^gV?>V\RdmdOUvx;Lwv=[RFLrskbsCbMvoLFqa=:RJIQaY@IJBNGfUFU\UGUCSDLSTMFo]:Bl\BZ]fUGTWZbWGFGfb|Stockholm/Gothenburg m|Bogoljubow, Efim|1920|C84h|0-1|B +FVn^@Osd?[jb[Rxg>@wnEU^UV^gVOUV\U_vx=XphRdmd_nunXPwvGWt_PGru;L\fu]GFg^W^nfIQd\CKk[VM]mDT[TKTmoMKo_KMvwBJxpFVwsVFbZMDsuDKZRKRUMRZuUFCUTCk_okofo^fon>NT<@GngNOgUGPMEZlpifn<>OWE=2WU=UluU^|St Petersburg|Romanovsky, Alexander A.|1905|C84i|0-1|B +FVn^@Osd?[jb[Rxg>@wn=Fk[RKmeDLvxEUtXU]dZKDld]dZdBR[S;EulDMbZETSLCLduTNXOFOlLN_Ll@wn?>meEUk[U^d^O^e^=unuRKtk;LunL]g]V]vx>^ng^_wv@?ruDLbZBJZRKBkb@wn?>k[RKmeBR[SDLrsEUtXK]umIQXa<`SLCLvxHXg]V]aX]dm_QX_X@?XQ?@QX@?XQ?@|Prague|Prokes, Ladislav|1908|C88c|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeBRtmDLvxEUmXU]dZKDl\;EgvE?ph@nwHItn@PxyQYnxipwpIHxn=FulDMrtLT[SMD|Prague|Teichmann, Richard|1908|C88c|1/2-1/2|W +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeBRrsR[b[DLtXEU^ULUvx;LqiIQXaU]d^HX^O=OahOHgmGWngNhaRLm\EIphMFaFIFog`gngFHxpW_\m:?swNPm^LF|Prague|Treybal, Frantisek|1908|C88c|1-0|W +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeBRtXDL[SEMSLCLvxIQXa<`qi`gngK]aO=Ouv;Ers]TdZTbvdbTg`>=sCT]dLETZT]TLU=>`E>;EZ|Vienna|Schlechter, Carl|1908|C88c|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLtXIQXaEMvx;Ee]V]g]E?ngHXahX`gnO^d^>^]cMUcm^>n`<`u`=X`u?PmgXOum@IbZBJrs>^wv:@[S^ZSLOLgVPVvVZ]mn]\VFLPnePele\lFC@TS>FSZ:J_WJBWYFMYQMUQYUMYRBFRWMNZcFDckD@wn?>k[RKmeDLdZKDl\EUul;EZdU]duBRrsLT[SE?ph?Ngx>?ogO>uoGW^W?Wqa>MbZW?xiCKo^M^g^DMnu:BlpBGsk|Hamburg ol|Ahues, Carl Oscar|1930|C88e|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLvxEMdZKDl\;EZd=FwvE?e]BRrsR[b[?PnwDKqiV]g]FVtfV_VEuxqO^d]u]k]^mSLCLpLm\|Moscow|Ilyin Zhenevsky, Alexander|1925|C90j|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLvxEMdZKDl\;EZdE?e]V]u]=FtkDK]m<`rvFEqi`YgaYPne?NxqIQaPGPo_:=esN?vuEFmeKDeg@IqyFGsjGFuvFEdu>FuoE>js?Evn>Gse=?phIAypOIo`EO^VO@wvQYVMY`g`FnvnDMeP@OPGO`GP`O\TM;nF?=PI=mpwmkIPkmFCm=bZOUP^A@[SUD^L@?_W|Marienbad|Michell, Reginald|1925|C90j|0-1|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLdZKDl\EMZd;EvxE?e]=F]UIQwvHXul?PduBRrsR[b[DKULCLgmP_nwAeuONutNFvu:bxnA:n]V]f]K]u]FV]uIOwpbrksO^tfGWp^W^yp:bfKrsKDH@uMVMDMbrMP@?PW?>W^>?^`sxpi|Moscow|Romanovsky, Peter A.|1925|C90j|0-1|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLtXEUvxBRwvK]umU^g]V]d^O^e^=KneR[b[:rvr;JrZLT[TJTZ]TemeKseusu]uGOXf@Gu]CSqiHPfm`WBjohjnM[nfhp\epofi]M>GMNe\NFG@[TidT]de]OIY^V\UFEU^VN^WEH|Karlsbad|Johner, Paul F.|1907|C91b|0-1|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLvxEUtXFg]EVXOHO]NGNl\FE\TKDucDMcN@ATMEMNc=Knw:=v^Mm^_VPcd=]_OK=OGPVGC=Odf]=rvmUCB=@f^VgxygX^fUWogXgpgWgwe|Marienbad|Yates, Frederic D.|1925|C91c|0-1|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLvxEUtXU]dZKDldIQXO=Od]V]ZT;ErtE?ph?PgvP_n`OX`<:=TC=;CT:b\];=]^DKe]KT[Tbe_WFEVNEFWOHO`a|Hastings Six-Masters|Yates, Frederic D.|1922|C91h|0-1|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLvxEUtXU]dZKDldIQXO=Od]V]ul;E[SE?SLCLrt=wt=MJZ@wn?>k[RKmeDLvxIQdZKDl\EMZd;EulE?e]BR]VMVtf?Nru=F\TR[b[O`qi`fofCKTKDKgVKfxyN]u]f]VLFEdU]BnSEMLB@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdU]duE?gvBRrsR[b[HXph?Pvp@Aog>@uo@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdU]duE?gvBRrsR[b[HXph?Pvp@Aog>@uo=?tm@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdU]duBRrsLT[S@IgvHXph>@ogE?uo?NxyCKwxipFg_V_h_N_m_M_nY:Ao`Q`w_AYi`YqyqOVbZH@vgV_qpC<`<@|DSB-24.Kongress|Bogoljubow, Efim|1925|C98i|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdU]duBRrsLT[SCKgvHXph@Avp>@qaE?aXQXog?NuoOYoyGW^WN_p_X_h`iX=ObZ>FmvOXaiH@vo|Baden-Baden|Bogoljubow, Efim|1925|C98i|1/2-1/2|B +FVn^@Osd?[jb[Rxg>@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdU]duBRrsR[b[LT[SE?gvHXphAyA=Acb:@pxAInw@AlpdvbjPFjnv[WFOFnjFMpqIHqoHIoqI@qo@IoqIHqoMDonDKnoGOonHPnoNHon[djlHYnoPIwpYHh`HNljIqxwN?j:?P:AqAwxA:ol:rxoKRpwrZlZRZwnPFnuZ[onF@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdE?\ULUdUOU^U<`tf:@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdE?\ULU^U<`qi`Ywv:^v^@?pfOJfWJb^\brxprvWQ?HQWHOWfvs\LOHLT;_fWHI[SskWFIHTWGOiaHGFLkjaX_XpgBJSKjkKC|San Sebastian|Leonhardt, Paul S.|1911|C99j|0-1|B +EUm]@mgVDuc?>ruW`wv`gng:=u]IQvu=Eph>=gpEMclOIk[I?qa?PlmPVf^V\mnDFnw\kuvU^v^FOwnM]d]kZ^>=>n>@I]UZdULCLpLHPjZIHxpOMZRM[>VH@RJ[\LgdSgU\@vxLTdS:<]UM;wuBJSdKMphCS\wEKjZS[ZRKEdZT\w\MDkcDRln;VrjO^\J<:JSETn\TcSLctut:;\cIYog^OZTR=xp=Ft\VMTZ?=jnMV\lYaZTahqhOYg_Vdc\YOf^O^T^W^n^FO\c@Hln=M^F;AL>A?FCO]nF]mpgmegpem|Stockholm/Gothenburg m|Bogoljubow, Efim|1920|D00c|1/2-1/2|W +EUm]@vxDLl\O^gV?>e^W^sm^WVE=EwvWPjbGOc[U\m\MDrt:=u`Pevue\t\NV`E=EutBJ]VDVkV>VxwVU\TUmTl@GwvmeldGNtlOWvnedldEUd\JRogRZf^W^g^UM\TCKTdNVnfMQqiQPfgV]dfPOgnHPphONngLT[TKTfvNOg`T\^VIY`XOWXPWVvr\dh`Y`i`dlPOV>|Karlsbad|Cohn, Erich|1907|D00c|1-0|W +EUm]@wvO^e^U^gmEOmw=Dtm:=\TMFuZNVdnOUrt=:whWP]VDVn_GWZcPGcC:;CL;k_UGUmdULdVkjtrjrvr?=V]HPqi=UrRUERJLSJrBJhwEDrt@GwmGNmsNUsdULdjJRjdDCtrF=dZSZrZCsxqs[ZjRZqhPXogIYg^W^ho=FjlZbp`Y`i`[ZljFT]OTMOXMVXFVkonZBF?LS`XS\?bkbjrBHrxbkx`HF|Vienna|Cohn, Erich|1908|D00c|1-0|W +EUm]@clNVlcFOdn?=rtV]f]O]n]ETcfTevwetmtLT]SDLSdLJkc=efv:=jZedvd=uwnuydVIQtkGOVTyqphPYnmJLk]LT]TCKT]YGmdG\d\qYc[@G[SGNZRKR]BNEBTRZT?YW|Karlsbad|Dus Chotimirsky, Fedor|1907|D00c|1-0|W +EUm]@tbMbsbDLvx\V>Fwv:>VEFEgmEFjbNPc[BJxwUOmgF^bZW_gVPWru>=Vg_fvfWUuv=>f^O^gm^memU\wx>vmv@?vm\cphcZ]ULUmUZLU=L>=D>vxpv^og^UD@f^NV]ULU\U:DV>EC;E>;D>F|Karlsbad|Schlechter, Carl|1911|D00c|1/2-1/2|W +EUm]FNxg;Et_@Onf?Fsm>@weCKgVp`:BgiE?_hO^o_GOVgOWgVHPm^U^umCUmpFOhvBHsl?EVE=EvaOaiaE=av=Rjb>;qaR=xy;CwxULlu@AvhL>hi=OunO?yq?OihO?qi>Lhv?OvrO?ph?OipO=xyL>po=OyqO?ry?O`XO=aYPYhi=RovA@nY>YiYRZYQCFQOFGONZcXPHPNPIPqA@HyQHOA>|DSB-18.Kongress|Carls, Carl Johan Margot|1912|D00d|0-1|B +EUm]FNxg;Et_@Onf?FweDTld=KulFMsmM_f_KDphT]g]>@vxETwvBJvnmgHPgVDKxpEZls:;jJO>JKGOKC|Vienna|Swiderski, Rudolf|1908|D00d|0-1|B +EUm]FNxg?MsdGWdS@OSMDMnf@vxO^gm;Log^Ol\:<\UNUms=FsdLRwvBJtmR\nwCSkc\brtS[dsm[ELcZ:Z[MZbMb@GqiIYiaGNoh>Dh_LSelSwp`Y`g`W`lPNOPYDN_hNHY`HWhow\aY\eb[e^`nOX[?^lnglc?[c\[mXOmt\jopWa|Prague|Marshall, Frank|1908|D00e|1/2-1/2|B +EUm]FNxg?MtX@Fnf;EX_M_f_DTldT]g]=KulETwn@mcEZlmT^mfZcjcFLwuBR]L@vxno_fvfXPf>agogP>gn>PdU@AUF|Budapest|Prokes, Ladislav|1929|D00e|0-1|B +EUm]@OtXFNnfDTsd;LwS=Kxn@^VO`w_GWtm:>rwLTnST]SE]dmdPY_`W`w?>?VNYPNF?>phPLELCLd[@G|Karlsbad|Johner, Paul F.|1911|D02h|1-0|W +EUm]@OnfFNsmCKxg@ld;Eo_O^wgGOVE=Egi:@o_^gvgLTneIece?=md;De^EO^eOE]UNU\U=>gaEVdV>VaWDEwg:>|Vienna|Saemisch, Friedrich|1922|D02h|1/2-1/2|B +EUm]@Ol\FNsd?MtXMFnf>@xg;EulCK\UNUweg]=K^`F?ut<\aYHPYPIP`gKTt\T\gL\eLle^l^>^yt^VtLVXLJXxslxpJO?HOgpXk[XUg_GW_aPXayW_yx@G]gGOf^UExXEDXTDT[TH?TLON^V?TleToe^oKgXNF^_F=_^=<^UK=XGS[G=|Lodz|Dus Chotimirsky, Fedor|1907|D02j|0-1|B +EUm]@Ol\U\nfFVw\V]f]?[sd>@xn;EvxEK\c<`og`WtX[FnhWPg_IQ_WPIXfOUfoDLug=Ed^UO^TFT]TKUru?>o]EFwo:=onFDnmDFqi@?jbO^mn^Xg`UOnFO`F>|Karlsbad|Jaffe, Charles|1911|D02j|0-1|B +EUm]@Ol\DT\UT]uZ=EZE@wuENkcFOtkOk\kLVb\VGjZ@k[BJwnNVZRD;vwO^mvFOqiV]f]?>duE?uf;_RbWEtu>Fue:>ph_DwpHPnuOHgxGWog^Og_?NxgOYpqN_ec@Ivo_NfpYOgmO^m^W^bkFGof>?p_N_f_G_h_D_ch^fulH]lPIAkn]Vyx_onofoxw?g|Hauptturnier A|Loewy, Leopold Jr|1905|D02j|1-0|W +EUm]@Ol\DT\UT]uZ=EZ];L]ZOUxgFNph?Twp>@vxEFsm@wp?=ZlEDxg<`rt:@xg[dkdEDfKBKSkD_we?=ruNVkK<`KC`gpg_gywLFCD=euegeogefvuHPwvfeut:j|GER m|Mieses, Jacques|1909|D02j|1-0|W +EUm]@Ol\FNsdBJo_U\nfCSxg@ZS[dkdJStb?>gVC^ngEKg^O^uYHPYQ=Op`OHQaGW`WNWb[KUVL^dLFUFr:>:[FdUFXIQXQHFQXFfxy:jav\dXajnvhfh|Karlsbad|Olland, Adolf George|1907|D02j|1-0|W +EUm]@Ol\DT\UT]u];L]ZOUjbHPn^UKZS?HxgBJSc@vx=Emf?=^VK\e\c\f_GOVN]NXNENtf\wswNc_^FVo_OW^sV^|Dresden|Von Holzhausen, Walther|1926|D02j|1-0|W +EUm]@Oxg;Et_FNnf?Fl\OY_hYhqhDTsdT]g]U\w\ETulIQru=Kvx>@um^TFTl^=M]g:=mM=MuMTMg]MT]cT?\eHP^]K]c]?Hxw@?wnNV]l>Lf^|Ostende-B|Leonhardt, Paul S.|1907|D02k|1/2-1/2|W +EUxg@Om]@qiEK\c?>tm=FrvO^d^W^gqIYo_KUvnGWxyYawx@Gqw>Amv:@wmPXm\M;_XGPxwAIno@?jbFXv[?Oo_U_f_;_w_X_\VPH[F_hFOHOc[hH[MOXp`HOM;W`i`ai;@IH@\Oo\t^ftxoxyxX_|London|Tartakower, Savielly|1922|D02n|1-0|W +EUm]@Oxg@tm?>ru>FgaHPph@HmtIYog:>apFNwvEFxoBJvnM;uv;BowFEf^UdkdW^g^N^t_EWn^>^v^W^emO`pv^ywnyqneqmemHOvgOWd\GOmdPX_DWN\TNEDM`fgmfWm^WMTMYa|DSB-18.Kongress|Treybal, Karel|1912|D02n|1-0|W +EUm]@Oxg@vxIQrt:ucE?wvO^tuWIne?EclGWgV>?o_EOmg=>vnIPkrPYuw>FnvY>rk@Ikb?@vsOEscHXVE>EgVDV_V<;e^W^[S@?w?F?SLCLc;?;lk;kbk|RUS-ch03|Salwe, Georg|1903|D02n|1/2-1/2|B +EUm]@SLCL\ePFd^O^e^:gLFLlL<;RdVdZ\@I\dEULDUjnwjJwxJPDB>Fogg_O@o`@F`VDV]VFWfo>AvuEFqaFEenGOVOHOneWFuvOWvnF@ov@OvdA?dO?OnVN]aYIYyYPYpoJR[R]ceWE=Wlc]luYak[ahohOPVX]WhoPOu`WFogFP`WPag`aWXWONWVNPVXPNX@=E@HE>_WN^`X^[WO|Ostende-B|Lee, Francis Joseph|1907|D02p|0-1|B +EUm]@rt;Ewn:;vx<=wuO^d^U^gv=ao_?>m[MDcb;:[MD=bcEKjZ=OMV>FvlFEZRK@uc=KwtO^mv?>gmEOm^O^og^dcdKDg_DF\TMDdcHXphX_f_FOvoOPof:;cZGOZu>FumQYngYaxoahqhNVtyFHrxW^gYPWyaCKTKDKk[BRxtV]f]K]m];[]T[kYn^eaA@AT?AItyIP?>HG>@|Ostend|Znosko-Borovsky, Eugene A.|1906|D02p|1/2-1/2|W +EUm]@Onf@ph@Agm^mumEOmu?>jb;Fvo:>umHXcuWPnwGOwnFIk[BJmkQYnePeueOWdtYaha>@pyW_txEif_M_oh_hxhiakpa_h`_Mem@>`XM?moIip`?QoxigXPQIPHIQ`PQHPHgwxwAHwW>Fqa|Dresden|Saemisch, Friedrich|1926|D02p|0-1|B +EUm]@OxgFNt_DTnf=KsdT\rs?[wnO^vx[dkd^dsKduKsudsv;LgmCSngBRf^L]_V]gpgdjldGOvrOVrjU]wu>@|St Petersburg|Blumenfeld, Benjamin M.|1905|D04c|1-0|W +EUm]FNxg@Ot_?MnfM_f_=Mut>@ldDT]TMTwe;LvxBRsblfOMnm>=f\MN\fNMf\ML\fLM|Gothenburg|Breyer, Gyula|1920|D04d|1/2-1/2|B +@OxgEUm]FNl\?Fsd>@tX;EnfDTweBJ\UT]g]OUXFUFvxFPrtEO]gCSd^Eog:@g]S[dnO^og^Mjb[brbNVk[TE]WMWlWEKu=?=bcCUcsUjsk=uxoj\tmHPW^\SmvK\ksus^s\k|Vienna|Suechting, Hugo|1908|D04g|1/2-1/2|W +EUm]@Ol\FNxg?Msd>@tXDLnf;Ewe=Rvx?>ulU\e\NVXOEO]VMVgVRVdn<`nh:=qi`N\N>NwuNMhWMuru=uluIQ|San Sebastian|Vidmar, Milan Sr|1911|D04g|1/2-1/2|B +EUm]@OxgFNl\DLnf;Esm?Mul>@wn?>vxNV]VEVkc<`tkU\m\Vgpg`i\M=MwuOUxyMPlPIPu]UDruDN]M:=M=|Scarborough|Colle, Edgar|1930|D04h|1/2-1/2|B +EUxg@OnfFNm]CKsm@weU\m\M[vnO^ulGWrtEOjb[F\VFMVL=>gV>YogYXtxOUlt^OqaXQphQYc[BJtl:@ul?>tmDLvt=FgaEKogLTuvFDp`HP]TMTdu@|Rogaska Slatina|Gruenfeld, Ernst|1929|D05b|1/2-1/2|W +EUxg@OnfFNm];El\BJsmU\w\CS\n@rt=Ful:@]TO^wu=DnlETgm^oeI@AcTGWxoFTl\AI\aI@mg?OkcW_tkOQa`_fovCgpgT?|NED m1|Van den Bosch, Johannes|1930|D05b|1-0|W +EUm]@OnfFNxg;El\?Fsd>@ucDLwnFMvx=FtmO^ruGWgv?Oo_OQvgEOgV:;mvg^W^V`QP`VPQutF?tlQOvaMV]VOGp`HP\ULUaOGE_W?GcbBJbRIQRKNW`WPXK]|Ostende-B|Shoosmith, Hector W.|1907|D05b|0-1|B +EUm]@OnfFNxg?Mwe>@sm;EvxNV]VEVgVMVmgVMkc<`tk=Fen:=wvDTgm`nuYaogWNunNNvn=>l\U]nl]fonaiphXWldDV|Hastings 2223|Conde, Adrian Garcia|1922|D05d|1-0|W +EUm]@Ol\FNnf?Mxg>@weCKvxwvU\c\M;esT]u]CgpgEVxp=]f]V\kr;_tu_mvnmdrd\bdrbsusOUph<\sc>@sdCKwetkNV]VEV\UOUdUVeneCUwuUgpg=XxyMqg_Xayp>NeWNPpwPxwnxpuwqxWV:=|Gothenburg|Kostic, Boris|1920|D05e|1-0|W +EUm]@Ol\FNnfCKxg?Msm>@wewtCUtu\ZbkZjkOHOrtUNWN>Nu=@H=ENnqanpxypqyxjpxwpm|Karlsbad|Berger, Johann Nepomuk|1907|D05f|1-0|W +EUnf@OxgFNm]?Ml\CKwe>@vx@vx?>wvO^e^U^gm=aqiDT]UEOvu>Vo_^gmgahdnhPlPIPgVMVndVdkdCUbZ:>rs>NtbJRskNfkKfdbkdcKcUcu=@I=:cZ:RZcRTOETRcNk]E;RT;ETSN\SREOxo\NofIQfePX]fOUiaUfaXQIefHPRJNcJKcjf]IHphH?]V?HK[jNh`NjV]jN]TNj[^jcTM|Karlsbad|Mieses, Jacques|1907|D05f|1/2-1/2|W +EUm]@Ol\FNnfCKxg?Mkc@vx=FgV?=sm:vmCLmvHPvdFTc[TFh`W`n`Y`xoLZltPX_XFX\TKT[T>Ed[ELtsGWstW_f_X_tvegop^fqaZlaYl^|Vienna|Von Bardeleben, Curt|1908|D05f|1-0|W +EUm]@OxgFNnf?Ml\CK\UNUsd@vx?>dnDTnh:jb>PenP^og^snoHXmtsPtkMEktPstkOWg_VOkdX`]SJSdOU]f]ENOXNUofs^XO^pfepwedwnOa|St Petersburg|Znosko-Borovsky, Eugene A.|1905|D05f|1/2-1/2|W +EUm]@Ol\FNnfCKxg?Msd@vxBJkcO^tk;EjbDT\UNU]TETc[Teue^dkd:@jbtmO^rtBJdnEOnhHPmvO`enIYhyJRqi`QgmQWnSDLSe=DphDEh`WQm^U^enY`i`EFyhFXxp:=k[R[b[LT[TKTvdC@\UNUwntmDT]TETcl:=phFELdEunvumdrKSxp=TU>FBRjbIQqaQYpqHIqpIHpqU\qpHIFBRZBF\jFTjkT?kc?Fc\pq\UqpIHpqUWqpWgpxgOF[OVxpH@pqVUqpUc[^ck^>@Hf^S[^V[bVNkCpqGN>ZCkZBHOBTNVTMOWMeV^eUkVUGVOGUOVUG|Lodz|Flamberg, Alexander D.|1906|D05g|1/2-1/2|W +EUm]@OnfFNxg?Ml\CKsd@wnDTvx:@vx?>kcBJtk;EdnO^nhHPe^U^gmKSjZS[m\CUhnEO\MDMn_=Rrt>@we@\UNUgaHPphO^tmGWapBJo_=FmvEOrt@AqiFNen?@h`PX`WNWn`O`i`WP_WPQd^QqxoU^wxJRkcCJt\qhowhgug^gvdJ\c\gp|Lodz-m|Salwe, Georg|1903|D05g|1-0|W +@Om]EUnfFNxg?Ml\CKsd@mc=D]TETcTFTduNVxy:=tmV_f_=emd?=uoTono^fonD\ruC^jbKSuv=MyxMPph^Uwged|Baden-Baden|Treybal, Karel|1925|D05g|1-0|W +EUm]@OnfFNl\CKxg?Msd>@we^lIQtm=OwvE?v>:>rv>vmv?Nl^JRphO=xpMFvdFOgVOV^VDLo_=UVULUjZGWpg@GgfN=k[R[d[=L[dGNfgNEqiHPgfEDfeDCelCJlkL=dv=LvdLRdRJRkcKSZSRSh`W`i`SLcdLMdmMFmnFOngON|Ostend|Von Balla, Zoltan|1906|D05g|1/2-1/2|W +EUm]@OxgFNnf?Ml\DLsm;Eul>@wn?>vxNV]VEVgVMVmgVDkc<`tk=MphO^rtU\wuMQuw\dkd^dldQYxp`ipxiwxw:=wpDKc[YWjZBJqaIQdc>Nt\WUcl=>\_U=aYNO_a=Ef^K=ay=DyaONn\NF\jDVayEMlcMOyu@AjsHXgqONcgFEsjNFuvF[vn[Fq`VHgWED^VFEWgLT`OEZgWHOWOA@OP@?PQ?@QX@?VNT\XQ?@n^GWQPDHPW>?WUZSj\SU\UHFh`CSo_JR_W@HphRZ^[FB[SZbUjHOhaBZSK?@vxU\e\NV]VEVgVMVu=?=oguwgf|Berlin|Colle, Edgar|1926|D05n|0-1|B +EUm]@OnfFNl\DLsd?Mxg;Ewn>@vxU\n\NVf^V]u]=DwvMT]mO`vwEVgVDVm_V]\cTM^VMV_]V]qi`Owu]dkdf]>FueFEcNGNef@GrvEFjZCKd\:=]d|Budapest|Colle, Edgar|1926.06.29|D05n|1/2-1/2|B +EUm]@Ol\DT\UT]xgOUg]FV]g;Lsm@wnFOgXYPneOXfi?>|RUS Ch|Levitsky, Stepan M.|1912|D06d|1-0|W +EUm]@Ol\DTxgT]\UOUg]FV]g;Ln^?[tmU_sd_ewe=eunendnFrtA=m\N\t\:=sbGOw\LRvxR\b\kcN\c\:FsuAyAT?gm>G|Budapest|Reti, Richard|1926.06.28|D06d|1/2-1/2|W +@Om]EUl\DTxgT]\U=Uu];L]UOUjbHPn^UDtm?Hmd>@dH@Hsm?=rtDNw\N_ph_e\e=evne=nf<`tT=ETU:=UE=EytHOgvFVog`NveL]tTCKTdPXg_X_h_V_e_]SdLS]Ld|Stockholm|Spielmann, Rudolf|1919|D06d|1/2-1/2|W +@OxgEUm]DTt_T]g]HP]S;Jsd?H_V>@nfJ[S]VH>HngFNu]HW]_Waru=FumNV_hU]f]LgpgV]dUF=m]aWhVGOVN@H]^?>U_=DN\D\^\:<\<>@tX=DVEDEru?@wn=DvxNVsm<`m^O^l^`g^gGWgU@AruV^UE;@uYNV_VHPYXLVXVGW]N@wv?=nwE>unNVvuM;]VLVg]O^dsVL]gGWgaHPsmLVog^Og_V`mg;_xy_ftfKfnf`futO^g]@GagGOyxPXweX`gvOV]lflel>SphU]leSeveVOxpCKpw^Te_]etdemruT^d<=<_e<=e_OVwn=<_eV]uw<>w_mu2nu]e|Ostende-B|Duras, Oldrich|1907|D10v|1-0|W +EUm]@OldDT]TFNk[BRtkCKTKR[nf=Kwe;ExnEVvxVeue@lZO^vt<\Zu?@I>Go`xy]V|Karlsbad|Tartakower, Savielly|1907|D11f|1-0|W +EUm]DTldT]d];Lsd@Oxg@dSM;wtO^mvW`cu^MSM;Mgm`nun?@SL?El[EMuvNGvn@>rv>nvnQY[lYa|Moscow|Gothilf, Solomon Borisovich|1925|D15b|1-0|W +EUldDTm]@Oxg;Lt_=KkcT]g]FV]LV_L]?Mph>@wp<`vx:sm_hqhMbrs`YpiYPiWPW]WO^m^U^eEbTnf<=EZ>VWaTfapfTc[T?wu=@VLCLXOHO]TMTmcDKruTFweWPePIPvxOWd\FOumBRc]?no>:me:vu>?jmeduv?Wmnd[nl|Karlsbad|Alekhine, Alexander|1911|D15c|1-0|W +EUm]@OxgDTld;Luc=DtXT\clO^sm^XgXFNn^?FXg@vx:;wv\cjcL[lkU^m^[Uc[UK^TKZrZFTZbTKgV?kjDMVe>LgLMLeT<=bJ=Uvf;=jnNVfVUV]VLnmHPm]T]d]>:rRBJxw@?wn?F]UFEneEDedDKRrJRruKTUMS[dkTLkcLEcZ:Bo_BCZR[cusckRZPXZbX_skCB|Karlsbad|Dus Chotimirsky, Fedor|1911|D15c|1/2-1/2|W +EUm]@OxgDTld;L]TFNk[BRg]R[]LCLd[O^tk:;u]GOo_=DnfDCweC[][;[kb^Tel[\lcTcjc\lvxLTwoloxo>EsdELdZT\c\U\b?A?rs@smIQXO=Own?=vxNVwvf^XPuvLVgn>=vw=exyPXwuefnSX`S>@Iuwfn|Berlin m|Schlechter, Carl|1918|D15q|1-0|W +EUm]@OxgDTld;L]TFNt_?Tnf=F_X>@wn?=vxIQXaHXahO^k[^hqhTKsmNVul<`[SLRf^`Y^U=UrvYPm^UEh`:=lZGOvu@HuE=EwvEDgqFNqwR\wh\MvuM^h^DEngPGuENE|San Sebastian|Schlechter, Carl|1911|D15q|1/2-1/2|W +EUm]DTnf;L]TFVl\@O\U=UuUOUjbBRtm?TsdUdmd>@rtTMwSLFxgGOgmqa>N`XNMutDEXOHOtxENxHMEHENEneLFo_V_f_OWaYFUdVU[e][l]\ELVdlf\]fUdmLMYQUD]\MLmtDNtfN?f]?P]fPFf]FP]fPF\]FUftLMkcMN]\NM\SMDtkDCkVUfVdfUdmUDS\CL\]LMmtDN]\MLtfN?fm?NmtNTtbTNbtNTtfTN\eN?e]|Baden-Baden|Gruenfeld, Ernst|1925|D20j|1/2-1/2|B +EUm]DTnf;L]TFVl\U]f]V]we?TjbBRxn@Fvx>@nhGWo_CKsmtmHPuZC@sdGwnEKvxKZwt:@wnBRmcT^gmPXm^Xa^mRZc]FV]SGWvxV^ul@bZ?GsSGEmvPFvROWR=W^=F^gF[<=qiNUpgUgSVIYia==sdFNtX?TnfBJw\CS\eXOHOVeTFut>EeTFTtT:@sdUdmd@smNVmcTFtm@\UNUwntlBRog^O[RLT]VFVkVT\lkOEV]ETphLmdNMd[CRh`W`g`LCswRL[d:>wO>NO?L]d]MF?ANKAIFOqaCL`XONIHL>lP>ZPGNWGUW`XPZcf^\d]dcU^U`ad]aX]VKsHGXPGo|Lodz m|Salwe, Georg|1907|D26s|0-1|B +EUm]@OxgDT]TFNnf?Tl\>@sd=F\U?=jbNUwn;LvxU]f]L]g]T]ul<`n`O`t_FO_hIYd^OPrv=>ls>Nk[:>^MNvsPGPM>v>qi`QwtQWxqYa|San Sebastian|Duras, Oldrich|1912|D26t|1-0|W +EUm]DTnf;L]TFNxg?Tl\@Ojb>@k[TFtkU\w\=uvuBJsmCS\e@k[TFtkU\w\=uvuBJunCS\e@k[TMtk=Fsm?=ucBR[SRZclL;wn;EvxETwuEG>@PO@AGHA=OP=XPGXF|Semmering|Michel, Walter|1926|D27c|0-1|B +EUm]DTnf;L]TFNxg?Tjb@Ol\>@sdU\w\=uvuBJunCS\eS[dZTBtmJRytOGRUVU?G;cGOc[>P[_PWUMOPMVWs_OPHOKsPV_HQKMQH_XP>M=>G=EH@XOGcEH@AHXc@XY@IYXIsX`AI`HIQh`slH@QI@=ls`XsP=EI@OP@?PO?>Eu|St Petersburg|Vidmar, Milan Sr|1909|D27c|0-1|B +EUm]DTnf;L]TFNxg?TjbBRl\@Osd>@\UNUwnuZO^wu^dkd=Erj:=jmW^tkIQd\L]ZE]nxw=EwnEMgvMP\U^pvpPpUM>=MEGOmUpXo_XUuUCKk]T]U]@G]MGFMK=EKSEBbZHXngFGg`BFSRFfRBG>_WfnqinoZR>=RJo_`Y_WBGWRJB=@ulCKwn@\UOUdUNUwnU]f]L]g]T]vx=One?>uYIQYS>=rsCKtf]fofOFe\Ffxy@ul=Fwnvd>NM=N>=mGWxo@GdV>Fp`FEV]GPofEF]VFEmpW`p`PW`XWNXYEGV]LUYVNM]dCSd[ML_WU\f_LEqaEL[FGHWOHpF[pPVTLE_V\cTSPQSCELOGQNVWNfW_|St Petersburg|Speijer, Abraham|1909|D27q|0-1|B +EUm]DT]T@Oxg;LjbBRl\FNnf?Tsd>@wnU\u=?=n\OEvxEVgVLV\n@wnU\u=?=n\OEvnEVgVLV\Sln=ObZ>EqiELo_LUp`IQ`XQX_XOFnVUMVSMLe^DESVFMVSE=dvHPSc=EcdLCdgMDvmCLkcD;ia;DmvLCvmCL|Scarborough|Thomas, George Alan|1930|D27r|1/2-1/2|B +@OxgEUm]DT]T;LjbBRl\FNnf?Tsd>@wn=Ful?=vxCK\UNUdZ]MOIqaBfef>fM=f>=>:>bZ>:urI?ZR:Jwn?NneGOe\@Gk]JL\UL<]fGFRJNDU^FNp`HXaY<>f]DSJBNM^eS]e]>:]^MNrJNG^W|Hamburg ol (Men)|Baratz, Abraham|1930.07.16|D27s|0-1|B +EUm]@OxgDT]TFNnf?Tl\>@jb=Fsd?=ul;Lk[TKtkU]f]K]wnNVruV^g]L]lt<`dU=Uk]`nvnUWqiOY]fFOyvOap`WV`YBR[SVS\SaYnmYUmdUjd]HXt\jb]^|NED m2|Landau, Salo|1930|D28c|0-1|B +EUm]DTnf@O]TFNxg?Tl\>@jb=Fsd;LwnU\n\BJ\eCSvxrvFXes;BxyUpnpXpyp=mpymks^BovuHPuU@Hwt>FtlksypoB^gsxpiB;lnIYgpHQnfxrpgrjgp;VUVFVfVjbiaGO|Semmering|Gruenfeld, Ernst|1926|D28c|1-0|W +EUm]DT]T@Ol\;LxgFNnf?Tjb>@k[TKtk=Fsm?=ulO^ru^mumU\m=L=w\@gV`Wmg:sb\brb<;]fMVn]V_f_D_ZRO^RJCKlZ_MZE=Eue>@wn=w\CS\eou>DtfCLnmFNudNMelDNls|Vienna|Berger, Johann Nepomuk|1908|D30h|1/2-1/2|B +EUm]@Ol\DTnfFNxg?Msd>@]TMTjb;Lk[TM\UNUdSM;S]=FtkO^uc<`we?>ruFEenBJvxEMph;BwvMQga`nvnB]k]QYogL]u]^OxpYVpo:@whK\mt=Ukc\MuvOYh^M^e^U^n^C^v^YO^nOUtfFbgV@gVLV_V@xg=FgVFVd\@tkCKsb@tkFTru=FxiCKioNVph@xnNVvxIQXiFD^fuxUSc[jJxvJKDKSKix>^xg^_vf_[svW_fF[syxsvgv@HxoHOFBKkoxGUBJOWJRW^RZ^fZ_PX_?X`?>U^>FQYF>Ya>Faipi`iFBksBZfnZjnvjrvnrs^sxyngyxs^xw|St Petersburg|Omeliansky, Vasily|1905|D30k|1/2-1/2|W +DTldEUm]FNxg@Onf;EphCKuZ?Fwp>@vx=Dsm@wpNV]VEVgVMVvx@rsTFtm?=ngeT^TFTmvUege=evoTowoHPolCKqx@yv:@m\OUfn:@jbYgpgCKTK=KSn;LsmFOuc?>vx:;rsLFg_FWxpKL[SLCpqETclCDwxRZd\U]m^T^l^>=stDT^gHPf^WF^VOHne=?g`;=iaGOVO?Otv=?ktHQv^@AqyTDtkO_k]QH]HAH`N_^N^?_SKDM^f_aypa`pwFWfg`_gnM]eW_WxyWVng]\wpVXpiXWgCWGCp\NiqNKywG_phK]og]fqpIYwsYasCHQCFfFh_FX_XQXpiXYg_PX_XYXipX`pq`g|San Sebastian|Duras, Oldrich|1911|D30w|1-0|W +EUm]@OnfDTxg<`qi`Y]TFNk[BRld?FwS;Lsm>@SLCLtk=;jbFTutTMvx?v^og^npwnq>VXOVRqiwpiaRJOWJRWO|Warsaw m|Marshall, Frank|1908|D30w|1/2-1/2|W +EUm]DTldFNxg;LnfGWwS@OgV@vx:=ruO^mt?OphEGxpOQwyMDln=>gxHXog^OnlGNf^W^tX^gxgNipxDKg]QPXOPOlpK]d]iNpmNnqaOw|San Remo|Romi, Massimiliano|1930|D31o|1-0|W +EUm]DTnf;Lld@OsmFV]VLVxg?Md\U\m\V\w\>@vxCKkc@lmd^m]GOyx?=]\=urugu\w:=qaugw\guxquMo_^m\nNV_VOVkdV^qymgn\MUpH@?\[=MHEUudvuv[vMEv[EFaY?GypFV[CVFCLFNLENFEWGHYQH@WOFGO=G?=U?GU^gX^U@AUV|Bad Kissingen|Marshall, Frank|1928|D31q|0-1|B +EUm]DTnf;Ll\T]f]@Oxg<`wnU\tfFVvx?M]VMVgV=unuLVf]`u]Vu`sb`Nwt:@SBHQ>D|Lodz mt|Marshall, Frank|1908|D32m|1/2-1/2|B +EUm]DTnf;Ll\T]f]@Osd@SLCLdU[mum=UvxW^md?=wu:;kc^gdg;[gU=Urt[]u]U]xw]Mt\@?\ZMEZJEDwv?F|Ostend|Bernstein, Ossip|1906|D32o|1-0|W +EUm]@Ol\DTnfT]f];Lsd@un^Uga?>ogIQwoWIphNVyv>F]VMTopHXruUNk[TKnkXauMaipyNWMOWektFNt_ed_`IPvuNOVO:=|Ostende-B|Cohn, Wilhelm|1907|D32o|1-0|W +EUm]DTnf;Ll\T]f]@Osd@vxO^tfFOruIQgmCKd^U^TKBKut@n]LRcS=UkcIQSUKUfmRL]LCLut:@t_:cS>^dfO]f^U^n]E]SCLlk[ljqiIY[S@HxyjkCLYaL>kn>F]OFB^fSKOoBrHIwxnkrvo_vR_OxvfnyqOwRdksvswsKCsCdVCJVFJ\ph\NFaIHa]NO]xOd|Lodz m|Salwe, Georg|1907|D32q|1-0|W +EUm]@Ol\DTnfT]f];LsdHPtf?Hwn>@rtU\n\O`xg`fofHQun<`vx`gngL]gi@Htu=v>:>ec>^cC^]UdXfxw]_wvfovmoTjb_omeopk[TxbZpqZRIY[Sqie\ia\cx]SKBKRJ]dCKd]JBai|San Sebastian|Capablanca, Jose|1911|D33a|1-0|W +EUm]DTnf;Ll\T]f]@OsdHP\UOUwS?Hxg>@SLCLvx<`wv:;dULUvf=KfFHOFf`gugO]fcKNtQ;cjc]kru?>phU]Qm>;c[NLmQLNumkdmnN\g^\N^gN\g^\N^gNMQ_MOg^;=^>=>n>@H_VOV>Vd[VU[dxwBRwnRZUEZbEBdkneHOogONe\IY\eYaBRaie^GW^eNOenONneNMe\MLRJLCJZCKZ:KL:JLE\eEFenFGneGHJ:HQ:J|Prague|Kvicala, Jan|1908|D33b|1/2-1/2|W +EUm]@Ol\DTnfT]f];LsdHP\T?Hwn>@xgO^vx<`tfGWd^U^]U^gpg`iULCLuc@Awu=Df]FV]dDFg_:=uvFadVHV_VW_cg?WxyWXvxiNxXNUXpUgngaFrvFTVN=>pxAHvnHOxv>FkcIYqiTdypOXiaXW|St Petersburg|Perlis, Julius|1909|D33e|1/2-1/2|W +EUm]@Ol\DTnfT]f];LsdHPxg?HgV>@wnU\VLCLn\O>tf>MuZ=K\cMWvt?=yvFNd^@SLCLvx<`tfK\un\fofLT]THdkd=Unu`gwgUTu]:@wnLRc[@tf<`qi`gugL]f]=]vx:;ru]Og^FNjZ?=u=O=ZRKEwu=F^fCKd^ETRKBKclT^l^HkfcFOuEkVph@HiaIYxpV]^g;@tfLRcZ@wnU\n\BJvxCS\nOUjZS[d^Ufof=U^oHQue?=rt@wnU\n\BJvxCS\n@wnU\n\BJvxCS\e<`enOUrtUfofHQue`WemFV]UV^g]L]m]QH]m=KnuHQwv:=mo?>uc=MduWEoh@HvwGOxy>VhvS[woVWoWEWqiQXc\IYjb[bkbYa\jWEvdEStsKBd[BFstME[dFVdVOVyqEGUMGwtDHQj@X=DIQXudSL@ULUdU=RIFRvp`ahqpwopxomFVXQMEmuxwvdwpumpxmuxpum|Karlsbad|Vidmar, Milan Sr|1911|D34b|1/2-1/2|W +EUm]DTnf;Ll\T]f]@OsdHPxg?Hwn>@vxBJtfU\n\CS\nuvGOW]lk]LkSL]SRvn>G]cRZnlGPcmZbgpPWmcIYloW`qi`WpwJRolRZcT_glmbdTZdtwoW^ZkV_|Teplitz-Schoenau|Tarrasch, Siegbert|1922|D34c|1-0|W +EUm]@Ol\DTnfT]f];LsdHPxg?Htf>@wnU\n\<`vx:<\cCKwvFNdSOUqi`gugBJSdL]f]H]dUNUvn=XcU]kruu]>SGOS>PXaXOXnjYaha]ajnHO>Ea]ESTMpw][n>MVSE[swpV]>NOGNns[|Berlin2|Lasker, Emanuel|1918|D34k|1/2-1/2|W +EUm]DTnf;Ll\T]f]@OsdHPxg?Hwn>@vx<`tfU\n\O>]U`gugLVgnV\n\>M\cMWcCWfof:;CB;kBb=KdukmrtKCf^?:bgFNUNGNudCEdsmjtuEFqiHVumjrmu:?ge?wuw@HeSFMxyrjSCHQCcjrwuMTsmTdurdrmsr]clV_sd]TleToeuoh|Karlsbad|Tarrasch, Siegbert|1923|D34k|1-0|W +EUm]DTnf;Ll\T]f]@OtfHPsd?Hxg>@wn<`vx:<\UOUdU=UuZCSZJUMJS`gngL]f]H]ru?=umFVwuV^qiMOSC]omo^gu=<=Cg|Lodz mt|Marshall, Frank|1908|D34o|1/2-1/2|B +EUm]DTnf;Ll\T]f]@OsdHPxg?Htf>@wn<`vx:<\UOUdU=UumFV]VUmfmLVmdVgpg`iwtHdtdrvBJxy|Budapest|Vajda, Arpad|1929|D36p|1/2-1/2|B +DTxg@OnfEUm];Ljb<`wnFNsm:<]T?Tk[TMl\BR\TM;g]`nvnR[]LCLb[=EtkNVqi>@ulO>mgGOyu>DgmENlcOWmgDSr:IQnw@IkrNFckV^g]S]f]W_kl_g:bIApg^gue<>eg?gbgFvwpvrlP>@PLr]LN][NU@UL>VGWVFLUAIW?;VUeHPeUQY?GFGUGIQG?QX?=XQ=?VH?F[mphmXFXQXo_XWTLHQ|Marienbad|Thomas, George Alan|1925|D37a|1-0|W +EUm]@OxgDTnf;LsmFNwn?Mvx>@]TMTl\=FmcTK\UNUtm?>mdO^d]L]c]<`rt`gng^owoFfgUK]UG@Auw>?tD:;BmvM]>FTMvfM_f_]_FHIYHG_Wp`Y`i`WRGORXqhCShaX@`XS[XPJRaY[cYQckOwRZQI@PIPZbwsBKPWKTW^T\|Karlsbad|Chajes, Oscar|1911|D37c|1-0|W +EUnfDTxg;Lm]@OwnFNvxBJjbCSkc@smOUmcLRcR=RueUfofFOgm:@l\O^rt:=phGW\UNUgVDRm^W^VE=EkdR=n`EFdmIQmf?Oum=>mn@InkFGjbBRtr>?`nHPnSQYSn?@l\S\c\O^\UNUgV@]TMTk[TBd\U\m\ES\kSekeNVf^DFtkOErtGOgqFNq`P_e_V_ngEV`VOVg`N`i`B]k]V]vu@]WNWc]HP]LDLue:@d\L[\U[lUMF=tmS[ws=Knu?@tkBJrtTBulWNgX=Fne<=XNGNdnNVnhO`eWFaWN@AN`a`ln`nhnU]f]V]nh?>wuA@xw=Eum>Ntu@GhWN^og^VWhVRkdRUhnE=dk=EphURkdRUwpBK|DSB-18.Kongress|Schlechter, Carl|1912|D37m|1/2-1/2|B +EUm]DTnf;Lxg@Own?SnIYsm:?SnIYsdMDucO`qi=McbMbkb`OngDRtk?F]U:@tkOErtFOkOHOgaWPaPIPm^LV\nOW^MEKtu=Eo_V`n`W`M^EuvuKUyv?Fsm:@qi:@smH?]LF=>OEML=|Prague|Vidmar, Milan Sr|1908|D40d|0-1|B +EUm]DTnf;Lxg@Ol\FNsdU\w\BJvxCS\n@rtD;tlLVgVMVphIYbZYao_ahqhVdkd;Bd]=]f]B]xqOUZSUfSJfwnwCUcd]uqxuYlkYP[S?=deGWkm=KC;eftrfT@IkK|Hauptturnier A|Moewig, Alfred|1905|D40f|0-1|B +EUm]DTnf;Ll\FNxg@Osd?M]TMTjb>@\UNUwnnwBJbZEV[SVeweGPe^U^SJCJd\PG\J;V]VOVJ\G\t\@G\^>:^V:Zp`GOVWONxpZjiaHPWSjBphNOh_BjSKOGKCG@og|Ostende-B|Cohn, Erich|1907|D40g|0-1|B +EUm]@OxgDTnfFNl\;Lsd?Mjb>@]TMTk[TM\UNUdSMFS]O^tk<`wn:qi`gngL]k]nogGFxwCKSUnN[SF[woNFoh[vtvFvh`vF`YFnp`nqUEHOEMOHMPHGPQqiYXigQIGNIBgcXQcS`XSUXPU]PHNOQI]aI@ONBCa[@?|London|Morrison, John Stuart|1922|D40g|0-1|B +EUm]@Ol\FNsdDTnf;LxgBJgV=DVLCLwn?M]TMTvx>@ulTMqiNVtm:;jbU]f]V]duLTneIQwvv>;>[SDNkeNQe_ahoh<=go=XmeJSZSXVegQOonVMgpENnjN@vx@tk=Frt?=unL;t<=<^s;EwuE?gVGOVgCUf^UcuvNVgaHPn`FNaW@AWfN`f`AHog?EvnHG|Prague|Dus Chotimirsky, Fedor|1908|D40q|1/2-1/2|B +EUm]@OnfFNl\DTsd;LxgU\w\BJjbCS\e@d^O^e^GW^lNVrtV^lc@AgXMVnYHPtLPYuEFEkVEHLQ|Lodz1|Rotlewi, Georg A.|1907|D40q|0-1|B +EUm]DTnf;Ll\FNxg@OsdBJjbU\w\CS\n@vxLVgVMVrt:@tk=Frt?=unL;^s;Et<=@]gU\u=?=n\<`\nOUtmUdmdHdkd:EkcAEvx?[jb[MwuA@kc?=tkEFunTbkbFbo_V_w_:WH@H_OVfxy>N[`HA`aN^aY^VY`V^`Y^VYuA@Og|Berlin|Teichmann, Richard|1924|D41o|1/2-1/2|B +EUm]DTnf;Lxg<`sm@OwnFNld?M]TMTk[TMjb>@tk=Fd\:=\TM;rtO^[SLRm^U^g]`nunGWnlNV]cRclc@Avx=ec\;DkdFG\G?Gd[GEt\A@phEUxpecwtBRSJCJTLJR[T@GtlGNT?HXh`W`\^IY?TUuog`gpguwgpcs^\wxpoX`f^svlmvwonxpnwpmTomj\dNMoxYaxo`hqhaih`jroviqdiMLiqrb`XbgqogowoLEogRZvdENgnZbXPDMneNOe\OP\cPOdvOXvhXOhqM[qhONhq|Hauptturnier A|Cohn, Erich|1905|D43j|1/2-1/2|W +EUm]@OxgDTnf;LldFNjbO^smGW]T?Tk[TKul=OtkOQm^W^g]L]d]@vx:o_^gngOg|Budapest|Vajda, Arpad|1926.07.05|D45e|1-0|W +EUm]DTnf;LldFNxg@OjbT]f]?Mwe=Dsm>@vxBJwvCSmw@SLCL]TFTwu=Dc\TFkc:=mwEd\=]d@Iph_gjZNdmOVmXDFXYIHkVFVYV>VueV^e=@we=DvxNV]VLVgVMVqi?>mgV_g]Fes:>sjF^tuDKum>VguVYo_KM]nMKn]KMmoYaum^>meO^og^TeuT^uvMQgfa_w_Q_jU^Of>E>UC_;vFIQ]W;_Wf>Ek[_hxwESd\S\f\h_wx_\FT\T[T@?xo?FofO>CU>DU\GOf^FE^WEFiaD>aY>DW^FE^]EFphFEbZEF\wFEwiEFiWF=|Semmering|Gilg, Karl|1926|D46a|1/2-1/2|B +EUm]DTld;LxgFNnf@Osm?M]TMTk[TFjbBR[SL;d\>@tk;EwnETvxO^\UNUbZ<`g]`nun=EmcTc]cF[rt:@d\BR[SLVtkVEwn=Fvx?=bZETul\UNUut>EgV=>VeF?eTKT]aO^m^>^aYGWngHPg^U^YnENnmMFmRPXSK@GkVNUtuGNVD<:RS|Meran|Gruenfeld, Ernst|1924|D48c|0-1|B +EUm]@OxgDTnf;Lsm<`ldFNuZ=KgV`YwS:Fc]O^Sn<:]SM;kcAFk[RLVLCLSL:<[SF=f^U^m\OU\fUOf`O`tX=Dvt?MXFA=uM=MFMDMyuMTuE`VEBVLSLGWBHNU>=U\=<\cd\phfnW_<>cd>Vd]VYhpnw_gYW]fWRplRbf_aYltwo^f|Berlin Tageblatt|Reti, Richard|1928|D52d|1-0|W +EUm]DTnf;Lxg@Osm<`ldFNuZT]d]?MgV=KV`O`qi`Owe>@vx:@vx:@f^BJSLDLZlT\wv:=^U=Ul^YP^g?=mwLKxyFTwfTfgfUuqiKLfnPY|Lodz m|Mieses, Jacques|1905|D52j|1-0|W +EUm]@OxgDTnf<`wn;L]TFNjb?Tk[TMtkBR[S`gpgLFsm=Dl\MVulVklk>@rt?@d\TLtkCSrt?@vxLV_VO>f^DE^UNUmg:OXOHOqiEMw_NvxoMNW`@G`YGH_`HA`hBJbZCSZRS[d[vshfskfn\dovksvoskov|St Petersburg|Bernstein, Ossip|1909|D53s|1/2-1/2|W +EUm]DTnf;Lxg<`wnFNsm@OkcT]g]`n]n?Mtk:@nhLVrt=FbZ@f_LT]TFT_VOEVk:;gY;cmcTbk]NVYWJNWNGN]BU]wv?:B]V]c]b[vN:jph[d]SjlN>@GSMGP>@jbBRkc=Ftk?=ul`WneWPePIPf^U]^VOIl^PXwvI?^`GOqaXaVOFOm^OFruCK^XNVga=>ue?NX^N_egFNaWHP^hNOkt]etkON`aPWg_TFaiemvuL]k]V]hWFXihNPxw>VW]:>]gVvgvmv2uv>vwvPsvnslnglug^ul^Ulm_]|Berlin|Johner, Paul F.|1926|D60|0-1|B +EUm]@OxgDTnf;Lwn<`smFNvx?M]TMTl\>@jbU\m\CS\V=unuLVgV`uwu?=tm=Umd:@k[TMtk=Fl\:=\UNUmcLVgV`nunMVwu=MkVFVrt?=c]ME]gVNnkIQqiEFk]CK]e=@jbBRkc=Ftk?=ulTMne:[JTLstLMtsMLJ[LM[eKEno>AopAEedtiqtlqyltyqtlqyloyxoneU\mUem\eU\mUem\eUnmUm\mTem\ev>Fxp\MpiMGi`G=veFMev=NvpMF|St Petersburg|Salwe, Georg|1905|D60|1/2-1/2|W +EUm]DTnf;Lxg@Own<`smFNvx?M]TMTjb>@k[TMtkBR[SLFl\FPucO^wv:<\UNUru`Nmw=Fwh?=g]^hqhPV]NGNkVMV|Ostend|Teichmann, Richard|1906|D60|1/2-1/2|B +EUm]DTnf;Lxg<`smFNwn@Ovx?M]TMTl\>@jbU\m\=uwuCS\mS[m\?=tm[bkbO^qi`YutTFmv:;xwFOrjYPbZIQZR=@kc?=tkU\ulTMm\`gpgMqxp=UvyUXpwXPg_q_f_D_lm_m\m:=ruOUm\CS\fUfof=unuPXyYXYuYS[bZGOwnNVneHPYgLBgCIYf^Yaen@HktOWtfBSZSW_fxRZcZ[cCUckUj|Ostend|Marshall, Frank|1906|D61|0-1|B +EUm]DTnf;Lxg<`wnFNvx@Osm=Dqi`Yl\:=uZOE\UNUf^U^m^EKZSYgngT]^T?TSTDFgLCLTL=Etm>@wvF=m[?>v>=>rv>=[RIQRKBKvu]eLdemxw=XdfXSfnSLnfL\fn\lkc@IjbHPc[KSogQYwoYaowIHnVHIVnI@n>@H>VHIVnEUwoUEowIHnVHIVnEewoldn^IHoneMnoMEonEMnoH@^>@H>^MEonEMnoH@^>@H>^H@^>@H>^MEonGW^fd\noW_fVHGV^\^g^GOonOVumEmnmV^mnPXno^WogX`i`WXgoX`bZSZ[SZbSKbjKCjr2C;2rjow`h|Prague|Leonhardt, Paul S.|1908|D61|1-0|W +EUm]DTnf;Lxg<`wnFNsm@Ovx=Dld:=uZ?Mqi`Y]TMTk[TM[SDRnuRZuZLVgVMVSK>FKB=:tbVMbMFMZS:BjZA@gVEMVgMEgVEM|San Sebastian|Teichmann, Richard|1912|D61|1/2-1/2|W +EUm]DTnf;Lxg<`wnFNsm@Ovx=DkcT]f]?Mtk>EtmAYrt=@jbCS\VLVgV`nun=UVe?=eT@ga`nvnLRagRcrsO^gmctstM_ts_mwm^mum<\nf?aYGOX_NV]VOV_?@?hXDFXW?@o_V_vF>FWUHPYPIPxo@HU]PX]MHGMKFEbZG>ZR>=ogEegnefno=DKPfhPOheOWemogX`g_mpWTDMk[px_XxpX_px_XxpX_|Karlsbad|Marshall, Frank|1929|D63|1/2-1/2|B +EUm]DTnf;Lxg<`smFNwn@Ovx:@jbU\m\=uvuOUtm?=rtTFxw`W\RLRmRCKRvWlumlZt\<\n\UOm=F=g]O^]SZS\S=OSL^Tk[TevmOkLSeVbZ@?wn?Fo_VEnekOf^HPmfE;^VOHZRBJSZKSfTFEZu;LugGOVOHOg^O=p`=aemaOmlL=`XOHqa=LaYPY^IYaI^ED^pL]T]H]|Ramsgate schev|Michell, Reginald|1929|D63|1/2-1/2|B +EUm]DTnf;Lxg<`wn@OsmFNvx:@\TM;jb?Oc[OQmw`gng;qwq=aulaqxwNV]VLVg^W^ld<>d]qywnyYnmYGmlQOvnVL]fOWru>?umGPfcLFcdWolconmnFWdVPhVhWhnm?=[S^fmefnkdh^|Lodz|Flamberg, Alexander D.|1906|D63|1-0|W +EUm]@OxgDTnf;Lwn<`smFNvx:@o^W^g^U^kd@\UOUjb?=uZ`Ym^TF^hYPf^UKZlD;lsFOsjKZnSZTtmL]g]O]mf;Vf]=]rt<=SwCKk[Tewe]etlIYogV]xyYahwaiwh]fvwempiPY|Gothenburg|Maroczy, Geza|1920|D63|1-0|W +EUm]@OxgDTnf;Lsm<`wnFNvx:@LC<;rw=Rn\?>wu;C\LRSLMSnkbnjMLC;bMjcuwcSLl;@jbU\m\=uvuBRtmCKxw?=mv@?u=<=rt=gV`nwnOUDB[LVLKLf^U_ng_evmLEm[;CfeM<[d|Ramsgate schev|Thomas, George Alan|1929|D63|1/2-1/2|B +EUm]DTnf;Lxg<`smFNwn@Ovx:@aPIPrvLRo_R\n\D\wg?>ia\DgiD=vVGOVn=Mih@GmeOWnV>AhiMF|Vienna|Gruenfeld, Ernst|1922|D64|1/2-1/2|B +EUxgDTm];Lnf<`smFNwn@Ovx:@tkCSjZ<;ZS;SwtOEd\U\t\?;rBLUBrEVkVUVrtHPneT?qiIQf^VM\]MbtDbrxqSCDC;C]=rVehVhqh@HhgNVgn?T=UT]phHOo_ONmg]kUeV_h_C[gmktef[]fe][ef[]fe][ef|Karlsbad|Becker, Albert|1929|D64|1/2-1/2|W +EUm]@OxgDTnf;Lsm<`wnFNvx:@mnVO^\DFgL@mcTBtkNVd\B;gmYnvn?=rtV^mwLVkVDVZR=eR[;M\TM?wmVU[\<=\UOUtl=:ctGWmseuxq:@ld=DmwO^gX`nun^OtfLFruD\ueFPphCSftBRwf\Lf`MFqaO`n`L\efS[b[R[`YFXYX[dkd\ctmclfn?>aYPF|Karlsbad|Euwe, Max|1929|D65|1/2-1/2|B +EUm]DTnf;Lxg<`smFNwn@Ovx:@mwO^gX`nvn^XtXLRueHPegIQXaR\p`?>rvCS`XQXaXMFX_FM_tDFwhFaxy\KgpKEhW|Budapest|Havasi, Kornel|1929|D65|0-1|B +DTxgEUnf;Lm]<`smFNwn@Ovx:@mw?>tXOEgm`Wn`IQXaWIahMhqhDKucLRcKEKwfKZrj@?`uCSo_RCxoCMh`;mt?FvnFOnVHXph;@uoQY`YX_h_@poupx_WxyWNGNtmCHVvyYvnYymlHxnmZKbZK@jbOEd\U\m\`gngL[\MFMuM[LwuEOMh=DkODhqhHOuECKgL@^VOEmcTKtX=DrvD\ct\nvnIQXfKfnfBJtePFg]FL]L@vx:teUFvd=]d]OUf^FLnoL]o]UKkc<=]d>LdLCLeVLTxo=uonurjZGOVLT\c\K\LBrjnv@GBSjZvoGNqaNVSdZbdnHXaXOXohbjho\kohkendjldUe_U_X_hiVOwqOX^VlnVNnNipNn|St Petersburg|Schlechter, Carl|1909|D67|1-0|W +EUxgDTphHPwp?Hm]T]g]FV]SBJSdU]dU@FtX;Ln^>@ugGOXmpw^fof^jbIYwe^>eS>@sdFV]cU]d^O^p^BRnfGW^pRZcTV^un]eleCKe^KTwu=R^WFTW`uMJnrw`gpgVgxpgvwv?o|Budapest|Van den Bosch, Johannes|1929|D74|1-0|W +EUxg@OphDTwp;LvxHPm]T]g]?Hl\>@\UOU]LCLn^U[uZ=KtfLTsdOG>VGP]fC;EN;SPOhgNESKENKJOVJRVORZNUgfUNZ]N@vx=K]TKTuc;LtfTMsbFVruIQbSMFcbFbSb@sd@smT]g]L]d]=Kmg@ul=FsmNVmcTKtX@tkT]f]O^m^U^gVLV]V?=unDVd\VRp^CS^eS\e\FbkbRbwuELu=<=\N=>NG@Gn\>NrvbMogMU\ULUvNGNxoNMofMTg_BR_WT[f]Ucjc[ch`RZ`XZbWOHOXObj]Ujr2UNrvNGvVqac\aY\UYQUMG@V>|Baden-Baden|Torre Repetto, Carlos|1925|D94|1-0|W +EUxg@OphDTwp;Lm]FNvx=Kld?M]TMTsm>@mcTFtfKDfTNVTFDFn^U^gm?=uvqaZcjcCcsc;ch`W_fpcsxq^fog>GM]st]_fn_^G\qhLThotwoh\e|Meran|Steiner, Endre|1924|D95c|1-0|W +EUxgDTld;Lm]FNph@Owp=Kvx@mcTFtfKDfTFTcT?=ulLRTE=Ewu:@gm`WjbM;ulU]duFMph]fm^W^e^Mmufmlfl=mnuO^ktmetf;VrtVkts^dskduksudsvL]f]T]og?=wo@?xp?Fl[ef[lfvlvNVveFMh`GOomHPe[BR[eOW`WPWg_V^eVMNc[R[b[=@pw@=|San Sebastian|Janowski, Dawid Markelowicz|1911|E00d|1-0|W +EUxgDTnf;LkcFVtk?MwS=DmeDRsdU]SLCLum]dkdRDf^@FmXFPqaGOXh>@aYP_vmBRrxRZhaZcjc:jph_NgvN]mu@wuNVgVLVnV<=VU?GphW_t_M_UEGEuE=Eh_EmrsCSxp@GpgIYgfmlsulkuEGOEBklBbHPbcONqaNMcSldf]dbSKMFKPbi]ViajZayZRyrRJYaPQF?_WaiQirJiIJLIELJEMJBVOBGOXGHMPHBPO?@OQBCo_CBQL@GLQG@WOBrXPrxPWxrQP@?PHrtHEtrEDrjOGjRW`RS_WS[`X[KDEKJECJLX_LJ_XJL|Semmering|Vidmar, Milan Sr|1926|E11z|1/2-1/2|W +EUxg@OnfFNl\DTkc?Mtk>@wnCKmeruNVf^U]mwHPkt>HwhGOtQ?GltE?gm?NQHNHngIYtlHNurGIxyNXguYahwaiphOWmgW^e^XNgm@sm;L]k@sm?>]g;LwS=Kl\BJSLCLvxJRrtRZk]KCcZCJmsJZ\UZuwuLUsd<`]OFOdU:jqi`gpgOWtDjrurHrD<>@smEDwvFVf^:=^UOUm\?>jZGWutIQgm@ImsU_ph_ixpiXqaXNsmN]k]T]aYPXh`V^`W^fm^D_of]ftf_WrtW`fh`YvfYPld>?tw?wpwLFfgFWh`Wagh=?wnPG`iGUnmCSZSUSml?;\maPiyP_e];>m\I@hf_Ufv>?^MSLy^?ovnon^nU_nFLUFBX`BTUgTWgn\m_pWU@AU:AI:^n^M^QYc[IP[SHQSKYam\pf\fQflef_en`hngPWd\hp^MWNgpNMpi|Stockholm/Gothenburg m|Bogoljubow, Efim|1920|E16r|1/2-1/2|W +DTnfEUxg@OkcHPtk?Hwn;LgVLVkV>@vxVH>Ho_EDp`WEvaGOngE>rv>GaoBJopCSZSJSvrU]pn]fnfHNguS[m^N]qi<:r:=:`XOW^h:jwoGUxqjromUCiaDLfo]NowN_e]T]w_rumnuvnmFV_ovyhyLyqhW_h`C<|Marienbad|Saemisch, Friedrich|1925|E18s|1-0|W +EUxgDTnf;LwS@OvxHPl\?HSLCLuZ@sdU]duOYgm]fofEWuoYOf^WNqi=MmcOEZb?=tfMhfTHVwuEOcmNioi=ebZhqxwehioqpwnOYuyY_nu:=ZR=Eul_nrwV]T]n]lsIYRV]NmcYaV;E=;BaiBFhgFBLTcTgowxNTsromBTpy|Stockholm/Gothenburg m|Bogoljubow, Efim|1920|E20|1-0|W +EUxg@OnfDTwS;Ll\HPgV@\UOUsd?tk@HswGOph>=krIYrk=ogEZuwZEqi>FxqE]|London|Maroczy, Geza|1922|E20|1-0|W +EUxgDTnf;LwS=Kl\U\S\@OvxFNm]T]f]?F\c>@tf?=unKRsdCKwu@ulOEf^JRwvGW^UNUmwW_lnFOnN@ANL:;t_;k_DTD>PaYPsDTNMTXslopMNXTluTWucpocUW?NF?WbRohFNhaRbahbBW?B:?W:BW?BG?>NO>fGCf>Cc>?OF?WULWVFOVWOHW_ce_WLUWXHOXWOFW_eb_WFNW?b:?W:;W_;c_WULW?cb?WbdW?dc?WcCWTLUTNM|Teplitz-Schoenau|Gruenfeld, Ernst|1922|E28|1/2-1/2|W +EUxgDTnf;LwS=DSLDLgVLDm]FNl\U\sd@OvxGrBSeBCGP_mdUqaA>p`IQNM<=ML>nmR=:aYPXLTe^|Bad Kissingen|Nimzowitsch, Aron|1928|E32a|1-0|W +EUxgDTnf;LwS=DmeFNl\?Msd@Ff^U]SLDLdnLDvx>@nhFPwvGOtmv>?>hwCgugPVgiW_jJ>;JbHXogIPmt;>tkGFwmVebeFvmw>nphvoxynveuogyxgfxp_g|Berlin Tageblatt|Nimzowitsch, Aron|1928|E32c|1-0|W +EUxgDTnf;LwS=Dm]FNvxBJSLDLkc@O]T?TtbTbsbLTutCStk@l\U\c\S[bl:;k]?<]T@un?=wuM;c[CFjbOEmc;BesL:t<=@rt?@smCS_VMFghJRjZ?cTFT]TLTV]TLo_HP_WNWZSLShVGOVN@?]OSLOF?HNVHGru>OFOLOVUGHUCH@uE<>vF>FC:@HEFOF:RFfxwW_d\ftRvt\wx\TvoTtxqPXo]HP]MPYMFtlFGYQGOQYOGYQGNQHNVHPVMPHMb_g|Budapest|Canal, Esteban|1929|E35|1/2-1/2|W +EUxgDTnf;LwS=Dm]T]f]FNvx?Mkc@Fl\U\c\>@\TM_sbFWwv?=v^_trtL]g]NVblFxo@ZcT]f]EKtfKUrtD;d^U_f_;_cC_^ne^UCLYgpgUXxyXayp=Uuya]tdFTywUXpy]aeI@Ig_XU|Berlin|Ahues, Carl Oscar|1926|E38e|1-0|W +DTxgEUnf;LwS=Dl\U\S\@Osd<`\nFNm]T]dSDKg]`nunL]S]?[vw>@phNV]l:@me=Evx?=rt`WgvD;dZCKc[LVkV;V[TKTulV;ts;DZkNVngWNk\OUgnUKvgGOwtHXqi@HgmKUsc=AtsIYlkX`i`Y`m^A>^dUdkd>Af^D=ph=>c;>Y;AHAs;AHdcHP;CN\e\ECcCPGCUG?U:?G:BYXBEXtxptbn`b:`YG?og:=EN?HNGHAGN=?pi?HNWF?YPHQi`AHPYHAg_V_h_QHYPHF`gA@WU@HUYH@PWFGYiGFWN@Hi`HQ`aQHahHQhqQHqxHQxyQHypHQpiQHi`HQ`aQHNUF>a`>P`NHQN@me:@kcCKunOUgVU_nuE]VL]Em[_etle[uENEL[FNwuE>uMJR[LKSjZ>LMLSZcZ?;p`;[L<:EvmA=mlELyxM?xu=uluKSZSLSulJRcmRZqi?MlkMDmsDMsmHXklIYmwM?wm?QmwYaogQ?wm?TmwTKwqS\qwKBwm\SmwZblcbjcjS\jk\ekcenwqBfclfTq`ngleghen|Karlsbad|Johner, Paul F.|1929|E38j|1-0|W +EUxgDTnf;LwSFNSLCLme?MvxNVf^@FwvGOkc>@sd@l\@ugOWdZVkZkNVYQHPkeV^gh^ehV?GV>G?>F?GF>|Hamburg ol|Kashdan, Isaac|1930|E44|1/2-1/2|W +EUxgDTnf;LwSFNkc@FtkBJSnU]meHPvx?Hsm>@m^CKf]GW^mT]wvKSnwFUphIQwp@IjZ:;vnUdkd]dmw=Mwf?GuvL]g]H]ZSJSfuGDxyPXvwpg`gJLPGLEG?vx_fx@?@E>@H>FHQ|NED m2|Landau, Salo|1930|E44|1-0|W +EUxgDTnf;LwSFNvx@Fm]=KSnHPld?HsmT]f]>@wv@l\U\c\T]f]CSunS\n\L[m^=U\U[U^T@Gwt?=gvU_xwJRogNVphFTh_T]tDGPk]V]venm>frxPWeTfnmunjTJjrDtrtut:JxHW_HIRZtkZbkjJM|Semmering|Rosselli del Turco, Stefano|1926|E46|1-0|W +EUxgDTnf;LwSFNvx@Fm]BJSnFWldT]f]?Mwv>@neGOulIQsmCSmwHXeWNWjZS[wfLFd\U\f\FU\fUFtmW_fU?GUFMFl\JRvn@smGOmwHXneCKulIQtmWHwf@gvIQo_GWsmV_h_=DmgUG>GYG?H_U;?GDVDUDKLDU[ewrLPrw?>mg>ngaeo|Baden-Baden|Carls, Carl Johan Margot|1925|E60e|1-0|W +EUxg@OmeDTph;LwpHPvx?HgmFVqi@wv?>xq@Imw=Etm:=dnU^e^N\kc\Jl\CSulS\c\L]n]T]\TH?m[ESlcIHjZSCcbOEvt>Nwm=@f^UDsdIQtfL]um@Iqi@sm;LldIQwvBRjZFVulwmNGe^U^nfL[lt[etlT\kc\cmcevuv=cmX_qw_gpyG\|Ramsgate schev|Tylor, Theodore|1929|E67c|1-0|W +EUxg@OmeDTsm;Ln^HPph?Hwp>@vxFVkcIQtkU]gaO>uvHOagMm\OHgaHOagCS\M=MgxT\o_\dkt@IvnOH_WNEngL[tbBRwoRZrwZcb[M[jc:JWPGPg?H?o?ENpiPXiNJNh`[bxnNFnhbk?oFBypBjoG|London|Reti, Richard|1922|E68a|1/2-1/2|W +EUxgDTme;LsmFVn^@FphHPwp?H^UFUvx>@m\IQwvGOtmv^U^g^Hdug>^e^dVsuENuU:>gu_gugVH|Berlin m|Schlechter, Carl|1918|E68g|1/2-1/2|W +DTxgEUph;LwpFVvxHPme?Hn^@Fsd>@^UL[wvGOtf=RgmFWmcWfofRDjb[JdSDKl\[TJTe]V]f]T^meCKwm^memMbsr>nmnH]xw]rUMrO|DSB-24.Kongress|Bluemich, Max|1925|E72|1-0|W +EUxgDTph;LwpHPme?HvxFVn^@Fsd>@wvU]dsGOsmhg>HghHYhgN@o_V_h_NU^UL[m\ME\VE=l\]dkd[UucUfpC:;wgT\cSfWVL=ESW;CWECELVECV\?Ewt:BtlA:ctCKkcBRrsGWskLTph:xoRBmnHXwpQYnv>ApgYagpBHvyHIyxIHxyA@pgHIgp@AyxIDlmDIxvahqhIBvyAypyX_h_BIypNGmuONpgMFuxIqohqlxyFOgnldhodlohldhoNMngdlohMFyvldhpFMphO]f]GYtndghaY`nhg_c\S\vs_]s[]mjZmjaXMT|Rotterdam|Landau, Salo|1931|B05b|1-0|W +EUm]@tkO^gV=DVEDEjbEDmgDFc[:=ucW`clGWphU\ga`nlnFGogGYapCSp_M_f_^MnNYGwv?>NGMGxo@?h`>vrvHPoh=>v>?>`WPWhaG=aY>GYQ=NqaN_QX_nXW\dkdndWVGFaYdUYQUO|Prague ol (Men)|Stahlberg, Gideon|1931|D00c|1/2-1/2|W +EUxg@Onf;Em]FNl\BJsdU\w\CS\nFleA@sd;LwnU\n\=uvuNVgX@wn=FulU]f]L]g]T]vxdeEene>Vk[V^f]GNe\^n\SNESKE<[Sn^]H^ZphZ^H?IYqa^f?M|Prague ol (Men)|Vidmar, Milan Sr|1931|D27s|1/2-1/2|B +EUm]DTld;LxgFNnfGWd\@Osd?Fwn>@vxO^]T^dkdU\n\FTu=?=g]@GjZGOtk@unGWph:;vx@Akcru>FnfE>o_^gfgLTwv>LgoT]k]W_]B?Oh`NVBKD;uM;MKTMDTFDFo]V^\ULU]U^fU:O?:gFbqabkvnHPxpkdpiAH`X?Gip|Rotterdam|Tartakower, Savielly|1931|D37b|1-0|W +EUm]@OxgDTldFNnf;LsmO^m^U^gmT]m^GW^h]du=L=kdFrsCKwvFOelA=lcE@uc=DjbBRwn?OphOQrtckVE]HFbkb@HbF>Gmc:>Fb>vx>Eo_HOwuQPtlOFlmP@xoIQqi@HuxH@h`D@lc:;rt_MjbOYgVY_ng?=tTMOTtOXxwFOph_NgUN]UG@?c[OF[dHPGjXWwp;@tfOUdUNUnd[dkd|Hastings Six-Masters|Alekhine, Alexander|1922|D32|1/2-1/2|B +EUm]DTnf;LldFNxg@Osm?MweNV]VLVgVMVvx>@d\VDkc=Mph@wn?>k[RKmeDLvxIQdZKDl\EUul;EZdU]duBRrsLT[S@IgvHXph>@ogE?uo?NxyCKwxipFg_V_h_N_m_M_nY:Ao`Q`w_AYi`YqyqOVbZH@vgV_qpC<`<@@k[O^tk=F|London|Capablanca, Jose Raul|1922|D02|1/2-1/2|W +FVnfEUm]V]f]?Mwe@Oxn>@vx;LldLFt__e>vrv:>|San Sebastian|Maroczy, Geza|1911|C01|1/2-1/2|B +EUxg@Om]DTnf;LsmFNwn=Dvx@k[U\n\?=tkBJwvE>ucCS\eDKm^O^e^FOru|Scarborough|Maroczy, Geza|1930|D37|1/2-1/2|W +EUm]@Oxg@jb[UdURUmUFUvmCKw\@vxe^W^gm>Yut=X|Vienna|Reti, Richard|1908|D00|1-0|W +EUo_DTxgFNnf?Mkc@Ftk>@wn;Lvx=DsdBJgaGWngHX_XMqxyqhaW?Wf^D_g`_wuwWwrwhV|RUS-ch03|Benko, PP.|1903|A84|1-0|W +EUm]@Ol\FNnfDTxg;LsdBJ\UNUwnT]f]?Mvx>@tXMFucO^XFLFne@whWPvxO^gmGWm^W^kt=atfLFumIQnuFWun:SJT[vn[Tuc@AJB^fogU]c\>LyhYa|RUS-ch03|Nikolaev, B.|1903|D37|1-0|W +EUm]DTnf;Ll\T]f]@Osd@k[N`tk`gpgEi|RUS-ch03|Kulomzin, Viacheslav Nikolaev|1903|D32|1-0|W +EUm]@OnfDTl\FNxg;LsdBJkcT]f]?[ueNVtmV^en>@gxL]nu=Rrt<`xnU\c\:=jbRbdUOU\U=U|Hauptturnier A|Heilmann, E.|1905|D40|1-0|W +FVnfEUm];Lxg<`]VLVwn`gpg@Og_VLsm?Fl\U]f^]engL]vx=E^V]gugE`gh`hqhO`m^>wuWfofGWmeEeueW^f^>=eU=?h`BRbZFT_WDLUe?=e=<=WOHOVO=>g_QY`XYa^gaigh>GhiGNi`T?kcLT`hNWha?MaYM?Ya|Hauptturnier A|Middleton, E E.|1905|C11|1/2-1/2|B +EUm]DTnf;Lxg<`smFNwn@Ovx=Dkc>@vx:<\nOUdU=UtfFOuZ<=wuW^rtOFZSUSnSFOSL^LgVLUogOFxoGOVe=e[U\of>Eg_CK[eBRetELtn\UphLSmdS\fmRZntF=tjIYj[=D[lHPlvU^mfOWfmKSvl^lmlDKqaKBlmB]d]\]ml]^|Hauptturnier A|Gajdos, Johannes|1905|D32|1-0|W +EUm]@OxgDTnf;Lwn@mw=FwhWIneO^e^U^g]LVtmVemvNV]n@AntGWcSW_te^ehwFX|Hauptturnier A|Sartori, Arthur|1905|D37|1-0|W +EUm]DTnf;Lxg<`smFNld@OuZ`gpgT]d]?Mwn=Dg_>@vx@AmgO^neGWjb?OgVOQog^Ok[LV_VMV]VDVrj:g_IQXT>=NF|Hauptturnier A|Kieseritzki, R.|1905|D52|0-1|B +EUm]@OxgDTnf;LsmFNld?Mwe>@f^T]d]U^m^MF^d=Kvx?=dZKRtfCKjb@piEK`N?Gf^=?_WPXWOFOdO<>tD>NiN?>NG>GDG@GO]KVNGF]V|Hauptturnier A|Kunze, Wilhelm|1905|C11|0-1|B +FVnfEUm];Lxg<`]VLVwnVgng`gugDLsm@Ovx?Ml\=D\ULUph>@mcMVwuDlc]V]u]O^kcldrsdlsrldrs|St Petersburg|Rosenkrantz, Karl Wilhelm|1905|C11|1/2-1/2|B +EUm]DTnf;L]TFNxg?Tl\@Osd>@jb=F\U?=wnNUvx@wn=FvxU\uZNVZ\<`k[TMgmV^sdFVph`No_^gmgN\|Lodz|Przepiorka, Dawid|1907|D37|1-0|W +FVn^GW^W?Txg;LwS@Ome>@vxL]ld]SucEUcSTMwvDLSc@U^EU^_?>tf<`og=FvmVP_]`WrvCKweWeleFEd\:=fo>NvNGN\UESoh=U]dNVyvIYqaBRv^UT^\T\d\S\e\RZ\T@GTKDKmdGNd[NU[ZU\kc\ThoTLphPFZ[FW[\KS\eLUbZWMZRV^g^M^RJ^oenULnoLKogKJg_JK_X|Lodz|Kuczynski, Robert|1907|C48|0-1|B +EUm]@OxgFNnf?Ml\CKsd@vx?>tmBJrt;EgvO^o_=Fe^U^p`DTvl:=dnEOnhC<`XOUuYGWtvFGYiHPjbJRwoT]l]U_f_MThnT]n]=]md]evf@tfU\n\<`sd`gugL]gC]lru=@vx:@vx<`tX;EsmDLld=Dul?>wvIQXOEOqi`gmg>vrv:>v>O>|St Petersburg|Teichmann, Richard|1909|C01|1/2-1/2|B +EUm]@OxgDT]TFNnf?Tjb>@l\BRkc=Ftk;Lsd?=ulU]f]T]wnNVvxV^gvFVdZ]k|St Petersburg|Von Freyman, Sergey|1909|D27|1-0|W +EUm]@Ol\DTnfT]f];LsdHP\UOUucUdkd?Hxg>@tb=RbTCKT[RWwn@vxFPSM=Mqi`WtfL=l\U\n\=NwvN_gV_UugWNVPIP\U|Bad Pistyan|Schlechter, Carl|1912|C01|1/2-1/2|B +FVnfEUm]V]f]?Mwe@Oxg>@vx<`tX;EsmDLld=Dul?>wvIQXa>vrv:>v>O>ahMhqh>Omw`gpgD=wfHP|Bad Pistyan|Balla, Zoltan|1912|C01|1/2-1/2|B +EUm]@OnfDTldFNxg?Mwe;EsmNV]VEVgVMVf^>@^U=UugldO^m^>^ueDLtmGW|San Sebastian|Forgacs, Leo|1912|C11|1/2-1/2|B +EUm]<`ld;Lt_=EsmGOxgFV]VEWuZ>@`nLFneFPmgOEel?>ueGWtmEKgX=OeiIQXN>NvNONlWNLW@ulU]f]L]g]=]we@meEUk[U^e^=uduRKgmBRrsR[b[;Lld@qaGOaY=EYQHPgq:=qwL]wfUfof]SulSdmdCSkcT\c\S\e]V]f]EDvoFMpgMhopOWlm=Umf@Grsh_foDFpw?>nf_Xop>=pnUEsSG@wpNGpoFbnlEFf^W^SX^g|Marienbad|Spielmann, Rudolf|1925|B38|1-0|W +EUnfDTo_FNxgGWgV@OwS;Evx?MSE@tk:>ugNVsdO^me^dkdU]_VMVf]V]d]T]rvHPxo|Budapest|Tartakower, Saviely|1926.06.26|A84|1/2-1/2|W +EUxg@OmeDTtX;LsmHPXOFOphOWwp?Hld>@mcCKe]T\cmgv=Mnf>Fvl|Budapest|Steiner, Endre|1926.07.01|A53|1-0|W +EUm]DTnf;Lxg<`wnFNvx@Oqi`YkcT]f]?Mtf>@gqYPneO^qg:@weEUld;EvxO^gVGOVE=Eog^mumFM_MEMjZ:>k[T\elOWZRKSwvMhmohPoaBJa_PY_VYQvnQaxq?OrxOQlWaYWlYaf^>?VhaY^UCUnVYGxvGOl^U^v^QPhv@Gg_?=p`=U`X|POL-ch|Kremer, L.|1927|A06|0-1|B +EUm]DTnf@O]TFVl\U]f]V]xg?Twe;Lvx>@jbBRtX<`smLVe^=KXOKOuc`gmgVg^g:;ceCKrs?=k[T?phHPxpR[b[=Ewu;=umEBgU?H[SOMsv@?mnHOn^Mb^]be]eOFegFTvN=Eqa?HNLEMh`MLSLH?UG?FGUFMgOMVONV]N^]d`Xd[o_TMpg[TU@TLg`LT_WBbWPIPaYbh`aheYQeuQIuya`M?^VT]VN|POL-ch|Friedmann, Henryk|1927|D24|0-1|B +EUxgDTnf;LwS=DkcFVSLCLmeGWtkV^gV@Oo_^gVgO`un?Msm>@vt?>f^M_ts:>leJesrD_|POL-ch|Chwojnik, M.|1927|E32|1-0|W +EUxgDTnf;Lm]<`wnFNvx@Osm:@cm?=enO^m^U^gXB;phLVX^DL^m=m|POL-ch|Hirschbein|1927|D64|1-0|W +FVn^@Osd?Tw\EMxg;Lme<`qi`gugL]guDLdnMUn]T]^UOUvx=M\ULUld]KuZMEZE>EtfU]d]K]|Budapest|Tartakower, Saviely|1929|C50|1/2-1/2|B +EUxgDTnf;Lm]<`wnFNsm@Ovx:@xyLFrtGOV\?=wuDL\M=MmvT\p`OWnpFUvmLEuxMJtr@]TMTk[TMtk=Fl\?=ucO^qi^mgm`nvnMVrtFOmgVkckOknkU\t\LF\<=@wnU\c\CKvxphNVgaDLaWM?woKSrwS[_V[dVOdkOH?Flk:;krLPruEVuZQYm]V`onFX]TXfWf>fnp;sZlfv|Rogaska Slatina|Geiger, H.|1929|A47|1-0|W +EUm]DTnf;Lxg<`smFNwn@OvxBJwv?Mjb:@k[TFucCS\m=Ktk?=rtO>m^YP^TFOvuOkck>Og]IQ]L=utu@tkCKsdBJ\UNUvxDTm]ru:=UTDT[Tjl\JGWqalTxq=mJC@GqhmlwsltCUGFsCTDCKtxUpDEKSFNSREMRSNOSRQYRjHPjkOHkCHQCkxukjumjmMmpLmMLSMKSZ|Rogaska Slatina|Konig, I.|1929|A47|1/2-1/2|W +EUxgDTnf;Lm]@OsmFNwn=Dvx@qiIQ]TMTf^DKunU^gqLVk[TFm^V\ne?=^OFOq`OFehQY`Q@?QG?Gh_G@w\=?\NEN_fKftfFOf]@sm=Fl\CKrtxo>@k[Te\TMDucetwt=OcdNVmcHXjZX`gv:;rsW_cm_fdfU]fn\n" "Language-Team: LANGUAGE \n" @@ -19,7 +19,7 @@ msgstr "" msgid "About" msgstr "" -#: .\About\About.py:26 .\Procesador.py:1227 .\Update.py:132 +#: .\About\About.py:26 .\Procesador.py:1229 .\Update.py:132 msgid "version %1" msgstr "" @@ -28,12 +28,12 @@ msgstr "" #: .\CompetitionWithTutor\WCompetitionWithTutor.py:181 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:199 #: .\Engines\WConfEngines.py:257 .\Kibitzers\WindowKibitzers.py:424 -#: .\Procesador.py:1231 .\Tournaments\WTournament.py:518 +#: .\Procesador.py:1233 .\Tournaments\WTournament.py:518 msgid "Author" msgstr "" #: .\About\About.py:35 .\About\AboutBase.py:349 .\About\AboutBase.py:377 -#: .\About\AboutBase.py:504 .\Procesador.py:1234 +#: .\About\AboutBase.py:504 .\Procesador.py:1236 msgid "License" msgstr "" @@ -77,14 +77,14 @@ msgstr "" msgid "Training" msgstr "" -#: .\About\AboutBase.py:23 .\Databases\WDB_Games.py:252 +#: .\About\AboutBase.py:23 .\Databases\WDB_Games.py:254 #: .\Databases\WDB_Players.py:118 .\Databases\WDB_Players.py:119 #: .\Databases\WDB_Players.py:134 .\Databases\WDB_Summary.py:61 #: .\Databases\WDB_Summary.py:62 .\Databases\WDB_Summary.py:432 #: .\Databases\WDB_Summary.py:433 .\Databases\WDB_Utils.py:411 #: .\Databases\WindowDatabase.py:47 .\Expeditions\WindowEverest.py:230 #: .\Expeditions\WindowEverest.py:339 .\GM\WindowGM.py:616 -#: .\Kibitzers\WKibDatabases.py:192 .\Leagues\WLeague.py:209 +#: .\Kibitzers\WKibDatabases.py:186 .\Leagues\WLeague.py:209 #: .\Menus\MenuTrainings.py:203 .\QT\WindowArbolBook.py:146 #: .\Routes\WindowRoutes.py:133 .\Routes\WindowRoutes.py:167 #: .\Swiss\WSwiss.py:169 .\Themes\WDB_Theme_Analysis.py:34 @@ -166,8 +166,8 @@ msgstr "" msgid "Tactics by UNED chess school" msgstr "" -#: .\About\AboutBase.py:537 .\Analysis\WindowAnalysisParam.py:176 -#: .\Analysis\WindowAnalysisParam.py:370 .\BestMoveTraining\WindowBMT.py:421 +#: .\About\AboutBase.py:537 .\Analysis\WindowAnalysisParam.py:205 +#: .\Analysis\WindowAnalysisParam.py:399 .\BestMoveTraining\WindowBMT.py:421 #: .\BestMoveTraining\WindowBMT.py:1015 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:178 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:196 @@ -215,10 +215,10 @@ msgstr "" msgid "Do you want to exit Lucas Chess?" msgstr "" -#: .\Analysis\Analysis.py:47 .\Analysis\AnalysisGame.py:255 +#: .\Analysis\Analysis.py:48 .\Analysis\AnalysisGame.py:255 #: .\Analysis\RunAnalysis.py:464 .\Analysis\WindowAnalysisVariations.py:44 #: .\Base\Move.py:538 .\BestMoveTraining\BMT.py:64 -#: .\BestMoveTraining\WindowBMTtrain.py:689 .\Endings\ManagerMate.py:323 +#: .\BestMoveTraining\WindowBMTtrain.py:688 .\Endings\ManagerMate.py:323 #: .\Endings\ManagerMate.py:480 .\MainWindow\WBase.py:232 #: .\QT\WindowDailyTest.py:42 .\QT\WindowHorses.py:127 #: .\QT\WindowHorses.py:303 .\QT\WindowPotencia.py:401 @@ -226,10 +226,11 @@ msgstr "" msgid "Second(s)" msgstr "" -#: .\Analysis\Analysis.py:49 .\Analysis\Analysis.py:127 -#: .\Analysis\WindowAnalysis.py:482 .\Analysis\WindowAnalysisParam.py:155 -#: .\Analysis\WindowAnalysisParam.py:188 .\Analysis\WindowAnalysisParam.py:382 -#: .\Base\Move.py:540 .\Books\WBooksTrainOL.py:392 .\Books\WPolyglot.py:49 +#: .\Analysis\Analysis.py:50 .\Analysis\Analysis.py:128 +#: .\Analysis\WindowAnalysis.py:482 .\Analysis\WindowAnalysisParam.py:157 +#: .\Analysis\WindowAnalysisParam.py:184 .\Analysis\WindowAnalysisParam.py:217 +#: .\Analysis\WindowAnalysisParam.py:411 .\Base\Move.py:540 +#: .\Books\WBooksTrainOL.py:392 .\Books\WPolyglot.py:49 #: .\CountsCaptures\WRunCaptures.py:129 .\CountsCaptures\WRunCounts.py:109 #: .\Databases\WDB_Summary.py:288 .\Engines\STS.py:477 #: .\Engines\WConfEngines.py:260 .\Engines\WConfEngines.py:573 @@ -238,26 +239,21 @@ msgstr "" #: .\Kibitzers\WKibEngine.py:113 .\MainWindow\WAnalysisBar.py:140 #: .\MainWindow\WInformation.py:150 .\Manager.py:1019 #: .\Openings\WindowOpeningLine.py:210 .\Openings\WindowOpeningLine.py:683 -#: .\Openings\WindowOpeningLine.py:755 .\Openings\WindowOpeningLine.py:1550 +#: .\Openings\WindowOpeningLine.py:755 .\Openings\WindowOpeningLine.py:1567 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:1197 .\QT\WindowArbol.py:867 #: .\Routes\ManagerRoutes.py:52 msgid "Depth" msgstr "" -#: .\Analysis\Analysis.py:222 .\Analysis\Analysis.py:260 +#: .\Analysis\Analysis.py:223 .\Analysis\Analysis.py:261 #: .\Analysis\Analysis.py:356 .\Analysis\AnalysisGame.py:570 #: .\Analysis\AnalysisGame.py:579 .\Analysis\WindowAnalysis.py:466 #: .\BestMoveTraining\WindowBMT.py:451 .\BestMoveTraining\WindowBMT.py:1055 -#: .\Manager.py:1004 .\Openings\WindowOpeningLine.py:962 .\QT\QTUtil2.py:296 +#: .\Manager.py:1004 .\Openings\WindowOpeningLine.py:962 .\QT\QTUtil2.py:300 #: .\Tutor\Tutor.py:37 msgid "Analyzing the move...." msgstr "" -#: .\Analysis\Analysis.py:411 .\Analysis\WindowAnalysis.py:178 -#: .\Board\Board.py:158 .\Manager.py:1845 .\Voyager\Voyager.py:445 -msgid "FEN is in clipboard" -msgstr "" - #: .\Analysis\AnalysisGame.py:166 .\Analysis\AnalysisGame.py:186 #: .\Analysis\RunAnalysis.py:369 .\Analysis\RunAnalysis.py:392 msgid "Avoid the blunder" @@ -270,30 +266,30 @@ msgstr "" #: .\Analysis\AnalysisGame.py:573 .\Analysis\RunAnalysisControl.py:249 #: .\Board\WBoardColors.py:485 .\Board\WBoardColors.py:1296 -#: .\Books\PolyglotImportExports.py:338 .\Books\WBooksTrain.py:35 +#: .\Books\PolyglotImportExports.py:340 .\Books\WBooksTrain.py:35 #: .\Books\WBooksTrainOL.py:262 .\Config\WindowUsuarios.py:33 -#: .\Databases\WDB_Games.py:82 .\Databases\WDB_Games.py:1366 -#: .\Databases\WDB_Games.py:1576 .\Databases\WDB_Games.py:1761 +#: .\Databases\WDB_Games.py:84 .\Databases\WDB_Games.py:1503 +#: .\Databases\WDB_Games.py:1713 .\Databases\WDB_Games.py:1898 #: .\Databases\WDB_Utils.py:93 .\Databases\WDB_Utils.py:305 #: .\Director\WindowTabVCircles.py:32 .\Director\WindowTabVFlechas.py:38 #: .\Director\WindowTabVMarcos.py:31 .\Director\WindowTabVMarkers.py:42 #: .\Director\WindowTabVSVGs.py:78 .\Engines\SelectEngines.py:473 #: .\Engines\WEngines.py:72 .\Expeditions\WindowEverest.py:70 -#: .\GM\WindowGM.py:44 .\GM\WindowGM.py:605 .\GM\WindowGM.py:774 +#: .\GM\WindowGM.py:44 .\GM\WindowGM.py:605 .\GM\WindowGM.py:775 #: .\Kibitzers\WindowKibitzers.py:460 .\Leagues\WLeagueConfig.py:44 #: .\Leagues\WLeagueWorker.py:92 .\LearnGame\WindowLearnGame.py:448 #: .\LearnGame\WindowLearnGame.py:471 .\LearnGame\WindowLearnGame.py:484 -#: .\MainWindow\LucasChessGui.py:150 .\MainWindow\WBase.py:191 +#: .\MainWindow\LucasChessGui.py:149 .\MainWindow\WBase.py:191 #: .\MainWindow\WBase.py:770 .\MainWindow\WBase.py:792 #: .\Maps\WindowWorkMap.py:269 .\Nags\WNags.py:32 .\Odt\WOdt.py:46 #: .\Openings\ManagerOPLEngines.py:344 .\Openings\ManagerOPLEngines.py:500 -#: .\Openings\ManagerOPLEngines.py:503 .\Openings\WindowOpeningLine.py:1411 +#: .\Openings\ManagerOPLEngines.py:503 .\Openings\WindowOpeningLine.py:1428 #: .\Openings\WindowOpenings.py:59 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:70 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:1175 .\PlayHuman\WPlayHuman.py:27 -#: .\QT\GridEditCols.py:29 .\QT\Piezas.py:274 .\QT\QTUtil2.py:75 -#: .\QT\QTUtil2.py:368 .\QT\QTUtil2.py:433 .\QT\QTUtil2.py:494 -#: .\QT\QTUtil2.py:557 .\QT\QTUtil2.py:688 .\QT\QTUtil2.py:790 +#: .\QT\GridEditCols.py:30 .\QT\Piezas.py:274 .\QT\QTUtil2.py:78 +#: .\QT\QTUtil2.py:372 .\QT\QTUtil2.py:445 .\QT\QTUtil2.py:552 +#: .\QT\QTUtil2.py:615 .\QT\QTUtil2.py:750 .\QT\QTUtil2.py:856 #: .\QT\QTVarios.py:674 .\QT\QTVarios.py:1126 .\QT\WColors.py:115 #: .\QT\WGif.py:28 .\QT\WindowArbol.py:723 .\QT\WindowArbolBook.py:252 #: .\QT\WindowDailyTest.py:257 .\QT\WindowHorses.py:221 @@ -374,9 +370,9 @@ msgid "Material asymmetry" msgstr "" #: .\Analysis\AnalysisIndexes.py:231 .\Analysis\AnalysisIndexes.py:397 -#: .\Databases\WDB_Games.py:588 .\Databases\WDB_Players.py:117 .\GM\GM.py:165 +#: .\Databases\WDB_Games.py:605 .\Databases\WDB_Players.py:117 .\GM\GM.py:165 #: .\GM\WindowGM.py:144 .\ManagerSolo.py:467 -#: .\Openings\WindowOpeningLine.py:607 .\Openings\WindowOpeningLine.py:1043 +#: .\Openings\WindowOpeningLine.py:607 .\Openings\WindowOpeningLine.py:1062 #: .\PlayAgainstEngine\Personalities.py:155 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:357 .\QT\WindowPgnTags.py:190 #: .\Tutor\WindowTutor.py:83 @@ -406,18 +402,18 @@ msgid "Game stage" msgstr "" #: .\Analysis\AnalysisIndexes.py:349 .\Analysis\WindowAnalysisGraph.py:103 -#: .\Analysis\WindowAnalysisParam.py:206 .\Analysis\WindowAnalysisParam.py:397 -#: .\BestMoveTraining\WindowBMTtrain.py:99 -#: .\BestMoveTraining\WindowBMTtrain.py:697 -#: .\BestMoveTraining\WindowBMTtrain.py:837 -#: .\Books\PolyglotImportExports.py:508 .\Books\WBooks.py:24 +#: .\Analysis\WindowAnalysisParam.py:235 .\Analysis\WindowAnalysisParam.py:426 +#: .\BestMoveTraining\WindowBMTtrain.py:98 +#: .\BestMoveTraining\WindowBMTtrain.py:696 +#: .\BestMoveTraining\WindowBMTtrain.py:836 +#: .\Books\PolyglotImportExports.py:510 .\Books\WBooks.py:24 #: .\Books\WBooksTrain.py:39 .\Books\WBooksTrainOL.py:151 #: .\Books\WBooksTrainOL.py:267 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:62 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:168 #: .\Competitions\ManagerMicElo.py:253 .\Competitions\ManagerWicker.py:250 #: .\Coordinates\CoordinatesBasic.py:47 .\Coordinates\WCoordinatesBlocks.py:82 -#: .\Coordinates\WRunCoordinatesBlocks.py:126 .\Databases\WDB_Games.py:975 +#: .\Coordinates\WRunCoordinatesBlocks.py:126 .\Databases\WDB_Games.py:1058 #: .\Databases\WDB_Utils.py:351 .\Expeditions\WindowEverest.py:63 #: .\GM\WindowGM.py:76 .\Kibitzers\WKibCommon.py:183 #: .\Kibitzers\WKibCommon.py:185 .\Kibitzers\WKibIndex.py:128 @@ -432,8 +428,8 @@ msgstr "" #: .\Maps\WindowWorkMap.py:307 .\Openings\POLAnalisis.py:672 #: .\Openings\WindowOpeningLine.py:223 .\Openings\WindowOpeningLine.py:356 #: .\Openings\WindowOpeningLine.py:415 .\Openings\WindowOpeningLine.py:758 -#: .\Openings\WindowOpeningLine.py:1047 .\Openings\WindowOpeningLine.py:1113 -#: .\Openings\WindowOpeningLine.py:1123 +#: .\Openings\WindowOpeningLine.py:1066 .\Openings\WindowOpeningLine.py:1130 +#: .\Openings\WindowOpeningLine.py:1140 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:920 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:1181 .\PlayHuman\WPlayHuman.py:31 #: .\QT\Piezas.py:243 .\QT\WindowDailyTest.py:325 .\QT\WindowPotencia.py:813 @@ -451,18 +447,18 @@ msgid "White" msgstr "" #: .\Analysis\AnalysisIndexes.py:350 .\Analysis\WindowAnalysisGraph.py:104 -#: .\Analysis\WindowAnalysisParam.py:206 .\Analysis\WindowAnalysisParam.py:397 -#: .\BestMoveTraining\WindowBMTtrain.py:100 -#: .\BestMoveTraining\WindowBMTtrain.py:697 -#: .\BestMoveTraining\WindowBMTtrain.py:839 -#: .\Books\PolyglotImportExports.py:508 .\Books\WBooks.py:24 +#: .\Analysis\WindowAnalysisParam.py:235 .\Analysis\WindowAnalysisParam.py:426 +#: .\BestMoveTraining\WindowBMTtrain.py:99 +#: .\BestMoveTraining\WindowBMTtrain.py:696 +#: .\BestMoveTraining\WindowBMTtrain.py:838 +#: .\Books\PolyglotImportExports.py:510 .\Books\WBooks.py:24 #: .\Books\WBooksTrain.py:41 .\Books\WBooksTrainOL.py:151 #: .\Books\WBooksTrainOL.py:269 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:64 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:170 #: .\Competitions\ManagerMicElo.py:253 .\Competitions\ManagerWicker.py:250 #: .\Coordinates\CoordinatesBasic.py:47 .\Coordinates\WCoordinatesBlocks.py:82 -#: .\Coordinates\WRunCoordinatesBlocks.py:126 .\Databases\WDB_Games.py:975 +#: .\Coordinates\WRunCoordinatesBlocks.py:126 .\Databases\WDB_Games.py:1058 #: .\Databases\WDB_Utils.py:351 .\Expeditions\WindowEverest.py:63 #: .\GM\WindowGM.py:79 .\Kibitzers\WKibCommon.py:184 #: .\Kibitzers\WKibCommon.py:185 .\Kibitzers\WKibIndex.py:128 @@ -477,8 +473,8 @@ msgstr "" #: .\Maps\WindowWorkMap.py:307 .\Openings\POLAnalisis.py:674 #: .\Openings\WindowOpeningLine.py:223 .\Openings\WindowOpeningLine.py:356 #: .\Openings\WindowOpeningLine.py:415 .\Openings\WindowOpeningLine.py:758 -#: .\Openings\WindowOpeningLine.py:1049 .\Openings\WindowOpeningLine.py:1113 -#: .\Openings\WindowOpeningLine.py:1123 +#: .\Openings\WindowOpeningLine.py:1068 .\Openings\WindowOpeningLine.py:1130 +#: .\Openings\WindowOpeningLine.py:1140 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:920 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:1182 .\PlayHuman\WPlayHuman.py:34 #: .\QT\Piezas.py:244 .\QT\WindowDailyTest.py:325 .\QT\WindowPotencia.py:813 @@ -530,7 +526,7 @@ msgid "Best moves" msgstr "" #: .\Analysis\AnalysisIndexes.py:422 .\Kibitzers\Kibitzers.py:182 -#: .\Openings\WindowOpeningLine.py:481 .\Openings\WindowOpeningLine.py:1138 +#: .\Openings\WindowOpeningLine.py:481 .\Openings\WindowOpeningLine.py:1155 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:386 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:388 msgid "Book" @@ -561,20 +557,20 @@ msgid "Blunders" msgstr "" #: .\Analysis\Histogram.py:429 .\Analysis\WindowAnalysis.py:304 -#: .\Analysis\WindowAnalysisVariations.py:41 .\Manager.py:1483 +#: .\Analysis\WindowAnalysisVariations.py:41 .\Manager.py:1482 msgid "Copy to clipboard" msgstr "" #: .\Analysis\Histogram.py:431 .\Board\WBoardColors.py:487 #: .\Board\WBoardColors.py:833 .\Board\WBoardColors.py:1294 -#: .\Databases\WDB_Games.py:1574 .\Databases\WDB_Games.py:1759 +#: .\Databases\WDB_Games.py:1711 .\Databases\WDB_Games.py:1896 #: .\Director\WindowDirector.py:55 .\Director\WindowTabVCircles.py:32 #: .\Director\WindowTabVFlechas.py:38 .\Director\WindowTabVMarcos.py:31 #: .\Director\WindowTabVMarkers.py:40 .\Director\WindowTabVSVGs.py:77 #: .\Engines\SelectEngines.py:471 .\Kibitzers\WindowKibitzers.py:458 -#: .\Leagues\WLeagueConfig.py:42 .\MainWindow\WBase.py:159 .\Manager.py:1485 +#: .\Leagues\WLeagueConfig.py:42 .\MainWindow\WBase.py:159 .\Manager.py:1484 #: .\ManagerSolo.py:352 .\ManagerSolo.py:358 .\ManagerSolo.py:362 -#: .\Nags\WNags.py:30 .\QT\GridEditCols.py:27 .\QT\GridEditCols.py:82 +#: .\Nags\WNags.py:30 .\QT\GridEditCols.py:28 .\QT\GridEditCols.py:83 #: .\QT\Piezas.py:272 .\QT\QTVarios.py:334 .\QT\QTVarios.py:338 #: .\QT\WColors.py:113 .\QT\WGif.py:28 .\QT\WindowArbol.py:722 #: .\QT\WindowSavePGN.py:191 .\QT\WindowSavePGN.py:629 @@ -585,17 +581,17 @@ msgid "Save" msgstr "" #: .\Analysis\Histogram.py:439 .\Board\Board.py:184 -#: .\Director\WindowDirector.py:634 .\Manager.py:1640 .\Manager.py:1769 -#: .\Manager.py:1810 .\ManagerSolo.py:302 .\Odt\WOdt.py:20 -#: .\QT\FormLayout.py:259 .\QT\WindowManualSave.py:107 +#: .\Director\WindowDirector.py:634 .\Manager.py:1637 .\Manager.py:1766 +#: .\Manager.py:1807 .\ManagerSolo.py:302 .\Odt\WOdt.py:20 +#: .\QT\FormLayout.py:274 .\QT\WindowManualSave.py:107 #: .\QT\WindowManualSave.py:292 .\QT\WindowManualSave.py:308 #: .\QT\WindowSavePGN.py:32 .\QT\WindowSavePGN.py:205 #: .\QT\WindowSavePGN.py:391 msgid "File to save" msgstr "" -#: .\Analysis\RunAnalysis.py:178 .\Analysis\WindowAnalysisParam.py:461 -#: .\Databases\WDB_Games.py:929 .\Databases\WDB_Games.py:1093 +#: .\Analysis\RunAnalysis.py:178 .\Analysis\WindowAnalysisParam.py:490 +#: .\Databases\WDB_Games.py:1010 .\Databases\WDB_Games.py:1176 #: .\Openings\WindowOpeningLine.py:149 .\Openings\WindowOpeningLine.py:192 #: .\Openings\WindowOpeningLine.py:281 msgid "Mass analysis" @@ -611,13 +607,13 @@ msgstr "" #: .\Databases\WDB_Summary.py:431 .\Kibitzers\WKibBooks.py:22 #: .\Kibitzers\WKibGaviota.py:21 .\ManagerFindAllMoves.py:304 #: .\Maps\WindowWorkMap.py:372 .\Openings\WindowOpeningLine.py:280 -#: .\Openings\WindowOpeningLine.py:1162 +#: .\Openings\WindowOpeningLine.py:1179 msgid "Move" msgstr "" #: .\Analysis\RunAnalysis.py:202 .\Analysis\RunAnalysisControl.py:246 -#: .\CountsCaptures\WCountsCaptures.py:35 .\Databases\WDB_Games.py:1010 -#: .\Databases\WDB_Games.py:1095 .\MainWindow\WInformation.py:239 +#: .\CountsCaptures\WCountsCaptures.py:35 .\Databases\WDB_Games.py:1093 +#: .\Databases\WDB_Games.py:1178 .\MainWindow\WInformation.py:239 #: .\WritingDown\WritingDown.py:29 msgid "Game" msgstr "" @@ -653,15 +649,15 @@ msgid "Subanalysis" msgstr "" #: .\Analysis\WindowAnalysis.py:237 .\Databases\WDB_Summary.py:60 -#: .\Manager.py:1058 .\Manager.py:1545 .\Maps\WindowWorkMap.py:270 -#: .\Openings\WindowOpeningLine.py:1254 .\QT\WindowDailyTest.py:256 +#: .\Manager.py:1058 .\Manager.py:1542 .\Maps\WindowWorkMap.py:270 +#: .\Openings\WindowOpeningLine.py:1271 .\QT\WindowDailyTest.py:256 #: .\QT\WindowJuicio.py:33 .\QT\WindowManualSave.py:154 msgid "Analysis" msgstr "" #: .\Analysis\WindowAnalysis.py:272 .\Analysis\WindowAnalysisVariations.py:39 #: .\BestMoveTraining\WindowBMT.py:47 .\BestMoveTraining\WindowBMT.py:121 -#: .\BestMoveTraining\WindowBMTtrain.py:178 .\Books\WBooks.py:65 +#: .\BestMoveTraining\WindowBMTtrain.py:177 .\Books\WBooks.py:65 #: .\Books\WBooksTrainOL.py:121 .\Books\WBooksTrainOL.py:517 #: .\Books\WFactory.py:40 .\Books\WPolyglot.py:55 #: .\Coordinates\WCoordinatesBasic.py:30 @@ -669,7 +665,7 @@ msgstr "" #: .\Coordinates\WRunCoordinatesBasic.py:46 #: .\Coordinates\WRunCoordinatesBlocks.py:60 #: .\CountsCaptures\WCountsCaptures.py:41 .\CountsCaptures\WRunCaptures.py:69 -#: .\CountsCaptures\WRunCounts.py:51 .\Databases\WDB_Games.py:93 +#: .\CountsCaptures\WRunCounts.py:51 .\Databases\WDB_Games.py:95 #: .\Databases\WDB_Players.py:184 .\Databases\WDB_Summary.py:78 #: .\Director\WindowDirector.py:54 .\Director\WindowTabVCircles.py:154 #: .\Director\WindowTabVFlechas.py:224 .\Director\WindowTabVMarcos.py:159 @@ -696,7 +692,7 @@ msgstr "" #: .\QT\WindowVisualiza.py:369 .\Resistance\WindowResistance.py:32 #: .\Routes\WindowRoutes.py:122 .\Routes\WindowRoutes.py:164 #: .\SingularMoves\WindowSingularM.py:22 .\Sound\WindowSonido.py:397 -#: .\Swiss\WSwiss.py:316 .\Swiss\WSwisses.py:34 .\Tactics\WindowTactics.py:47 +#: .\Swiss\WSwiss.py:316 .\Swiss\WSwisses.py:32 .\Tactics\WindowTactics.py:47 #: .\Tournaments\WTournament.py:55 .\Tournaments\WTournamentRun.py:171 #: .\Tournaments\WTournaments.py:38 .\TurnOnLights\WindowTurnOnLights.py:48 #: .\Washing\WindowWashing.py:45 .\WritingDown\WritingDown.py:38 @@ -707,8 +703,8 @@ msgstr "" #: .\Analysis\WindowAnalysis.py:273 .\BestMoveTraining\WindowBMT.py:125 #: .\Books\WBooks.py:66 .\Books\WBooksTrainOL.py:123 .\Books\WFactory.py:44 #: .\Config\WindowUsuarios.py:35 .\Config\WindowUsuarios.py:164 -#: .\CountsCaptures\WCountsCaptures.py:45 .\Databases\WDB_Games.py:97 -#: .\Databases\WDB_Games.py:1763 .\Databases\WDB_Utils.py:131 +#: .\CountsCaptures\WCountsCaptures.py:45 .\Databases\WDB_Games.py:99 +#: .\Databases\WDB_Games.py:1900 .\Databases\WDB_Utils.py:131 #: .\Director\WindowDirector.py:56 .\Director\WindowTabVCircles.py:156 #: .\Director\WindowTabVFlechas.py:226 .\Director\WindowTabVMarcos.py:161 #: .\Director\WindowTabVMarkers.py:156 .\Director\WindowTabVSVGs.py:178 @@ -731,9 +727,9 @@ msgid "Stop thinking" msgstr "" #: .\Analysis\WindowAnalysis.py:482 .\Analysis\WindowAnalysisGraph.py:65 -#: .\Analysis\WindowAnalysisParam.py:155 .\BestMoveTraining\WindowBMT.py:53 -#: .\BestMoveTraining\WindowBMT.py:145 .\BestMoveTraining\WindowBMT.py:163 -#: .\BestMoveTraining\WindowBMTtrain.py:84 +#: .\Analysis\WindowAnalysisParam.py:157 .\Analysis\WindowAnalysisParam.py:184 +#: .\BestMoveTraining\WindowBMT.py:53 .\BestMoveTraining\WindowBMT.py:145 +#: .\BestMoveTraining\WindowBMT.py:163 .\BestMoveTraining\WindowBMTtrain.py:83 #: .\CountsCaptures\WCountsCaptures.py:33 .\Endings\EndingsGTB.py:111 #: .\Endings\WEndingsGTB.py:100 .\Engines\STS.py:477 #: .\Engines\WConfEngines.py:261 .\Engines\WindowSTS.py:608 @@ -761,7 +757,7 @@ msgstr "" #: .\BestMoveTraining\WindowBMT.py:676 .\BestMoveTraining\WindowBMT.py:819 #: .\BestMoveTraining\WindowBMT.py:1010 .\Board\WBoardColors.py:1278 #: .\Books\WBooks.py:58 .\Books\WFactory.py:34 .\Books\WFactory.py:82 -#: .\Databases\WDB_Games.py:1480 .\Databases\WDB_Players.py:371 +#: .\Databases\WDB_Games.py:1617 .\Databases\WDB_Players.py:371 #: .\Databases\WDB_Utils.py:153 .\Databases\WDB_Utils.py:348 #: .\Director\WindowDirector.py:77 .\Director\WindowDirector.py:280 #: .\Director\WindowDirector.py:284 .\Director\WindowTabVCircles.py:46 @@ -779,10 +775,10 @@ msgstr "" #: .\Openings\WindowOpenings.py:311 .\Openings\WindowOpenings.py:390 #: .\PlayAgainstEngine\Personalities.py:71 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:603 -#: .\PlayAgainstEngine\WPlayAgainstEngine.py:605 .\QT\GridEditCols.py:99 -#: .\QT\GridEditCols.py:102 .\QT\Piezas.py:352 .\QT\WColors.py:99 +#: .\PlayAgainstEngine\WPlayAgainstEngine.py:605 .\QT\GridEditCols.py:100 +#: .\QT\GridEditCols.py:103 .\QT\Piezas.py:352 .\QT\WColors.py:99 #: .\Sound\WindowSonido.py:175 .\Swiss\WSwissConfig.py:54 -#: .\Swiss\WSwissConfig.py:229 .\Swiss\WSwisses.py:53 .\Swiss\WSwisses.py:129 +#: .\Swiss\WSwissConfig.py:229 .\Swiss\WSwisses.py:51 .\Swiss\WSwisses.py:127 #: .\Themes\WThemes.py:129 .\Tournaments\WTournaments.py:55 #: .\Tournaments\WTournaments.py:115 .\Voyager\Voyager.py:648 #: .\Washing\WindowWashing.py:209 .\Washing\WindowWashing.py:212 @@ -799,15 +795,15 @@ msgid "Value" msgstr "" #: .\Analysis\WindowAnalysisConfig.py:30 .\Analysis\WindowAnalysisConfig.py:39 -#: .\Analysis\WindowAnalysisParam.py:192 .\Analysis\WindowAnalysisParam.py:390 +#: .\Analysis\WindowAnalysisParam.py:221 .\Analysis\WindowAnalysisParam.py:419 #: .\Board\Board.py:818 .\Board\Board.py:2499 .\Board\WBoardColors.py:304 -#: .\Board\WBoardColors.py:371 .\Config\WindowConfig.py:80 -#: .\Config\WindowConfig.py:152 .\Config\WindowConfig.py:178 -#: .\Databases\WDB_Utils.py:351 .\Engines\WConfEngines.py:66 -#: .\Engines\WEngines.py:361 .\Engines\WEngines.py:415 -#: .\Expeditions\WindowEverest.py:63 .\GM\WindowGM.py:105 -#: .\Menus\MenuTrainings.py:150 .\QT\IconosBase.py:21 .\QT\QTUtil2.py:561 -#: .\QT\QTVarios.py:1133 .\QT\WindowDailyTest.py:108 +#: .\Board\WBoardColors.py:371 .\Config\WindowConfig.py:81 +#: .\Config\WindowConfig.py:100 .\Config\WindowConfig.py:154 +#: .\Config\WindowConfig.py:180 .\Databases\WDB_Utils.py:351 +#: .\Engines\WConfEngines.py:66 .\Engines\WEngines.py:361 +#: .\Engines\WEngines.py:415 .\Expeditions\WindowEverest.py:63 +#: .\GM\WindowGM.py:105 .\Menus\MenuTrainings.py:150 .\QT\IconosBase.py:21 +#: .\QT\QTUtil2.py:619 .\QT\QTVarios.py:1133 .\QT\WindowDailyTest.py:108 #: .\QT\WindowManualSave.py:99 .\QT\WindowSavePGN.py:45 #: .\QT\WindowSavePGN.py:218 .\Resistance\WindowResistance.py:110 #: .\Resistance\WindowResistance.py:115 .\Resistance\WindowResistance.py:122 @@ -820,8 +816,8 @@ msgstr "" msgid "Minimum" msgstr "" -#: .\Analysis\WindowAnalysisConfig.py:32 .\Analysis\WindowAnalysisParam.py:192 -#: .\Analysis\WindowAnalysisParam.py:390 .\GM\WindowGM.py:105 +#: .\Analysis\WindowAnalysisConfig.py:32 .\Analysis\WindowAnalysisParam.py:221 +#: .\Analysis\WindowAnalysisParam.py:419 .\GM\WindowGM.py:105 #: .\Openings\WindowOpeningLine.py:213 msgid "Maximum" msgstr "" @@ -829,13 +825,13 @@ msgstr "" #: .\Analysis\WindowAnalysisConfig.py:33 .\Director\WindowDirector.py:76 #: .\Engines\SelectEngines.py:492 .\Kibitzers\WindowKibitzers.py:287 #: .\Kibitzers\WindowKibitzers.py:414 .\Maps\WindowWorkMap.py:67 -#: .\Maps\WindowWorkMap.py:205 .\Menus\MenuTrainings.py:755 +#: .\Maps\WindowWorkMap.py:205 .\Menus\MenuTrainings.py:759 #: .\QT\WindowVisualiza.py:174 msgid "Type" msgstr "" #: .\Analysis\WindowAnalysisConfig.py:38 .\Kibitzers\WKibBooks.py:30 -#: .\Kibitzers\WKibDatabases.py:51 .\Kibitzers\WKibEngine.py:50 +#: .\Kibitzers\WKibDatabases.py:74 .\Kibitzers\WKibEngine.py:50 #: .\Kibitzers\WKibGaviota.py:28 .\Kibitzers\WKibLinea.py:68 #: .\Kibitzers\WKibStEval.py:22 .\MainWindow\MainWindow.py:123 #: .\MainWindow\WBase.py:171 @@ -850,13 +846,13 @@ msgstr "" msgid "Help" msgstr "" -#: .\Analysis\WindowAnalysisConfig.py:60 .\QT\FormLayout.py:853 +#: .\Analysis\WindowAnalysisConfig.py:60 .\QT\FormLayout.py:917 msgid "Are you sure you want to set the default configuration?" msgstr "" #: .\Analysis\WindowAnalysisGraph.py:48 -#: .\BestMoveTraining\WindowBMTtrain.py:97 .\Config\WindowUsuarios.py:44 -#: .\Databases\WDB_Games.py:184 .\Databases\WDB_Summary.py:57 +#: .\BestMoveTraining\WindowBMTtrain.py:96 .\Config\WindowUsuarios.py:44 +#: .\Databases\WDB_Games.py:186 .\Databases\WDB_Summary.py:57 #: .\Databases\WDB_Summary.py:429 .\Director\WindowDirector.py:74 #: .\Director\WindowTabVCircles.py:148 .\Director\WindowTabVFlechas.py:218 #: .\Director\WindowTabVMarcos.py:153 .\Director\WindowTabVMarkers.py:148 @@ -874,7 +870,7 @@ msgid "N." msgstr "" #: .\Analysis\WindowAnalysisGraph.py:58 .\BestMoveTraining\WindowBMT.py:684 -#: .\BestMoveTraining\WindowBMTtrain.py:356 .\Kibitzers\Kibitzers.py:35 +#: .\BestMoveTraining\WindowBMTtrain.py:355 .\Kibitzers\Kibitzers.py:35 #: .\Kibitzers\WKibEngine.py:29 .\Openings\WindowOpeningLine.py:694 #: .\PlayAgainstEngine\Personalities.py:30 #: .\PlayAgainstEngine\Personalities.py:54 @@ -906,14 +902,15 @@ msgstr "" msgid "Indexes" msgstr "" -#: .\Analysis\WindowAnalysisGraph.py:107 .\Analysis\WindowAnalysisParam.py:219 -#: .\Analysis\WindowAnalysisParam.py:419 -#: .\BestMoveTraining\WindowBMTtrain.py:174 .\Books\WBooks.py:60 +#: .\Analysis\WindowAnalysisGraph.py:107 .\Analysis\WindowAnalysisParam.py:248 +#: .\Analysis\WindowAnalysisParam.py:448 +#: .\BestMoveTraining\WindowBMTtrain.py:173 .\Books\WBooks.py:60 #: .\Books\WFactory.py:36 .\CountsCaptures\WCountsCaptures.py:31 -#: .\Databases\WDB_Games.py:1096 .\Endings\WEndingsGTB.py:99 -#: .\Openings\POLAnalisis.py:583 .\Openings\WindowOpeningLine.py:690 -#: .\QT\WindowArbol.py:298 .\QT\WindowArbolBook.py:146 -#: .\QT\WindowHorses.py:126 .\QT\WindowHorses.py:299 .\QT\WindowJuicio.py:55 +#: .\Databases\WDB_Games.py:1179 .\Endings\WEndingsGTB.py:99 +#: .\GM\WindowGM.py:764 .\Openings\POLAnalisis.py:583 +#: .\Openings\WindowOpeningLine.py:690 .\QT\WindowArbol.py:298 +#: .\QT\WindowArbolBook.py:146 .\QT\WindowHorses.py:126 +#: .\QT\WindowHorses.py:299 .\QT\WindowJuicio.py:55 #: .\Resistance\ManagerResistance.py:105 .\Resistance\Resistance.py:79 #: .\WritingDown\WritingDown.py:30 msgid "Moves" @@ -932,112 +929,113 @@ msgid "Show pawns lost" msgstr "" #: .\Analysis\WindowAnalysisGraph.py:211 .\Board\WBoardColors.py:672 -#: .\Books\PolyglotImportExports.py:91 .\Books\PolyglotImportExports.py:496 +#: .\Books\PolyglotImportExports.py:91 .\Books\PolyglotImportExports.py:498 #: .\Director\WindowDirector.py:156 .\Leagues\WLeague.py:1026 -#: .\Manager.py:1757 .\QT\WindowManualSave.py:343 .\QT\WindowSavePGN.py:528 +#: .\Manager.py:1754 .\QT\WindowManualSave.py:343 .\QT\WindowSavePGN.py:528 #: .\Swiss\WSwiss.py:956 .\Tournaments\WTournament.py:863 msgid "Saved" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:73 .\Analysis\WindowAnalysisParam.py:74 -#: .\Analysis\WindowAnalysisParam.py:75 .\Analysis\WindowAnalysisParam.py:77 +#: .\Analysis\WindowAnalysisParam.py:75 .\Analysis\WindowAnalysisParam.py:76 +#: .\Analysis\WindowAnalysisParam.py:77 .\Analysis\WindowAnalysisParam.py:79 #: .\Engines\WConfEngines.py:602 .\Nags\Nags.py:29 .\QT\WColors.py:64 msgid "Mistake" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:73 .\Analysis\WindowAnalysisParam.py:74 -#: .\Analysis\WindowAnalysisParam.py:76 .\Engines\WConfEngines.py:601 +#: .\Analysis\WindowAnalysisParam.py:75 .\Analysis\WindowAnalysisParam.py:76 +#: .\Analysis\WindowAnalysisParam.py:78 .\Engines\WConfEngines.py:601 #: .\Nags\Nags.py:33 .\QT\WColors.py:63 msgid "Dubious move" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:73 .\Analysis\WindowAnalysisParam.py:75 -#: .\Analysis\WindowAnalysisParam.py:78 .\Engines\WConfEngines.py:603 +#: .\Analysis\WindowAnalysisParam.py:75 .\Analysis\WindowAnalysisParam.py:77 +#: .\Analysis\WindowAnalysisParam.py:80 .\Engines\WConfEngines.py:603 #: .\Nags\Nags.py:31 .\QT\WColors.py:65 msgid "Blunder" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:80 .\Databases\WDB_Utils.py:55 +#: .\Analysis\WindowAnalysisParam.py:82 .\Databases\WDB_Utils.py:55 msgid "Condition" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:90 .\Analysis\WindowAnalysisParam.py:112 +#: .\Analysis\WindowAnalysisParam.py:92 .\Analysis\WindowAnalysisParam.py:114 msgid "Generate a training file with these moves" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:92 +#: .\Analysis\WindowAnalysisParam.py:94 msgid "Tactics name" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:96 .\Analysis\WindowAnalysisParam.py:120 -#: .\Manager.py:1488 .\Openings\WindowOpeningLine.py:131 +#: .\Analysis\WindowAnalysisParam.py:98 .\Analysis\WindowAnalysisParam.py:122 +#: .\Manager.py:1487 .\Openings\WindowOpeningLine.py:131 msgid "PGN Format" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:100 .\Analysis\WindowAnalysisParam.py:124 +#: .\Analysis\WindowAnalysisParam.py:102 .\Analysis\WindowAnalysisParam.py:126 msgid "Also add complete game to PGN" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:104 .\Analysis\WindowAnalysisParam.py:128 +#: .\Analysis\WindowAnalysisParam.py:106 .\Analysis\WindowAnalysisParam.py:130 #: .\BestMoveTraining\WindowBMT.py:188 .\BestMoveTraining\WindowBMT.py:288 #: .\Menus\MenuTrainings.py:283 msgid "Find best move" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:105 .\Analysis\WindowAnalysisParam.py:129 +#: .\Analysis\WindowAnalysisParam.py:107 .\Analysis\WindowAnalysisParam.py:131 msgid "Add to the training %1 with the name" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:115 .\QT\WindowDailyTest.py:147 +#: .\Analysis\WindowAnalysisParam.py:117 .\QT\WindowDailyTest.py:147 msgid "List of FENs" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:136 +#: .\Analysis\WindowAnalysisParam.py:138 .\Analysis\WindowAnalysisParam.py:165 msgid "Also analyze variations" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:139 +#: .\Analysis\WindowAnalysisParam.py:141 .\Analysis\WindowAnalysisParam.py:168 msgid "Convert analyses into variations" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:141 +#: .\Analysis\WindowAnalysisParam.py:143 .\Analysis\WindowAnalysisParam.py:170 msgid "All variations" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:142 +#: .\Analysis\WindowAnalysisParam.py:144 .\Analysis\WindowAnalysisParam.py:171 msgid "The one(s) with the highest score" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:143 +#: .\Analysis\WindowAnalysisParam.py:145 .\Analysis\WindowAnalysisParam.py:172 msgid "All the ones with better score than the one played" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:144 +#: .\Analysis\WindowAnalysisParam.py:146 .\Analysis\WindowAnalysisParam.py:173 msgid "What variations?" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:146 +#: .\Analysis\WindowAnalysisParam.py:148 .\Analysis\WindowAnalysisParam.py:175 msgid "Include move played" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:149 +#: .\Analysis\WindowAnalysisParam.py:151 .\Analysis\WindowAnalysisParam.py:178 msgid "Maximum centipawns lost" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:152 +#: .\Analysis\WindowAnalysisParam.py:154 .\Analysis\WindowAnalysisParam.py:181 msgid "Include info about engine" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:155 +#: .\Analysis\WindowAnalysisParam.py:157 .\Analysis\WindowAnalysisParam.py:184 msgid "Format" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:155 .\BestMoveTraining\WindowBMT.py:52 -#: .\BestMoveTraining\WindowBMT.py:144 .\BestMoveTraining\WindowBMT.py:161 -#: .\BestMoveTraining\WindowBMTtrain.py:83 .\Books\ManagerTrainBooks.py:374 -#: .\Books\PolyglotImportExports.py:532 .\Books\PolyglotImportExports.py:533 -#: .\Books\WPolyglot.py:48 .\Competitions\ManagerFideFics.py:165 -#: .\Competitions\ManagerFideFics.py:373 .\Coordinates\WCoordinatesBasic.py:24 +#: .\Analysis\WindowAnalysisParam.py:157 .\Analysis\WindowAnalysisParam.py:184 +#: .\BestMoveTraining\WindowBMT.py:52 .\BestMoveTraining\WindowBMT.py:144 +#: .\BestMoveTraining\WindowBMT.py:161 .\BestMoveTraining\WindowBMTtrain.py:82 +#: .\Books\ManagerTrainBooks.py:374 .\Books\PolyglotImportExports.py:534 +#: .\Books\PolyglotImportExports.py:535 .\Books\WPolyglot.py:48 +#: .\Competitions\ManagerFideFics.py:165 .\Competitions\ManagerFideFics.py:373 +#: .\Coordinates\WCoordinatesBasic.py:24 #: .\Coordinates\WCoordinatesBlocks.py:27 #: .\Coordinates\WRunCoordinatesBasic.py:42 .\Expeditions\ManagerEverest.py:73 #: .\Expeditions\ManagerEverest.py:323 .\LearnGame\ManagerPlayGame.py:340 @@ -1050,88 +1048,88 @@ msgstr "" msgid "Score" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:158 +#: .\Analysis\WindowAnalysisParam.py:160 .\Analysis\WindowAnalysisParam.py:187 msgid "Only one move of each variation" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:180 .\Analysis\WindowAnalysisParam.py:375 +#: .\Analysis\WindowAnalysisParam.py:209 .\Analysis\WindowAnalysisParam.py:404 #: .\BestMoveTraining\WindowBMT.py:424 .\BestMoveTraining\WindowBMT.py:1018 -#: .\Openings\WindowOpeningLine.py:203 .\Openings\WindowOpeningLine.py:1143 +#: .\Openings\WindowOpeningLine.py:203 .\Openings\WindowOpeningLine.py:1160 #: .\QT\WindowDailyTest.py:138 .\QT\WindowPotencia.py:514 msgid "Duration of engine analysis (secs)" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:187 +#: .\Analysis\WindowAnalysisParam.py:216 msgid "If time and depth are given, the depth is attempted and the time becomes a maximum." msgstr "" -#: .\Analysis\WindowAnalysisParam.py:195 .\Analysis\WindowAnalysisParam.py:393 +#: .\Analysis\WindowAnalysisParam.py:224 .\Analysis\WindowAnalysisParam.py:422 #: .\Engines\WConfEngines.py:576 .\Engines\WConfEngines.py:703 #: .\GM\WindowGM.py:104 .\Openings\WindowOpeningLine.py:217 msgid "Number of variations evaluated by the engine (MultiPV)" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:199 .\Engines\WConfEngines.py:587 +#: .\Analysis\WindowAnalysisParam.py:228 .\Engines\WConfEngines.py:587 #: .\Engines\WConfEngines.py:708 .\Kibitzers\WindowKibitzers.py:290 #: .\Openings\WindowOpeningLine.py:228 msgid "Process priority" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:206 .\Analysis\WindowAnalysisParam.py:397 -#: .\Databases\WDB_Games.py:975 .\LearnGame\WindowPlayGame.py:302 +#: .\Analysis\WindowAnalysisParam.py:235 .\Analysis\WindowAnalysisParam.py:426 +#: .\Databases\WDB_Games.py:1058 .\LearnGame\WindowPlayGame.py:302 #: .\Openings\WindowOpeningLine.py:223 msgid "White & Black" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:207 .\Analysis\WindowAnalysisParam.py:398 +#: .\Analysis\WindowAnalysisParam.py:236 .\Analysis\WindowAnalysisParam.py:427 #: .\Kibitzers\WKibEngine.py:59 .\Kibitzers\WKibIndex.py:70 #: .\Kibitzers\WKibLinea.py:71 .\Openings\WindowOpeningLine.py:224 msgid "Analyze color" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:219 .\Analysis\WindowAnalysisParam.py:419 +#: .\Analysis\WindowAnalysisParam.py:248 .\Analysis\WindowAnalysisParam.py:448 #: .\BestMoveTraining\WindowBMT.py:626 .\Expeditions\WindowEverest.py:131 -#: .\Openings\WindowOpeningLine.py:1064 +#: .\Openings\WindowOpeningLine.py:1081 msgid "By example:" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:230 .\Analysis\WindowAnalysisParam.py:433 +#: .\Analysis\WindowAnalysisParam.py:259 .\Analysis\WindowAnalysisParam.py:462 msgid "Do not scan the opening moves based on book" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:233 .\Analysis\WindowAnalysisParam.py:439 +#: .\Analysis\WindowAnalysisParam.py:262 .\Analysis\WindowAnalysisParam.py:468 #: .\Openings\WindowOpeningLine.py:232 msgid "Redo any existing prior analysis (if they exist)" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:235 .\Analysis\WindowAnalysisParam.py:437 +#: .\Analysis\WindowAnalysisParam.py:264 .\Analysis\WindowAnalysisParam.py:466 msgid "Start from the end of the game" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:237 .\Config\WindowConfig.py:143 -#: .\Manager.py:1551 +#: .\Analysis\WindowAnalysisParam.py:266 .\Config\WindowConfig.py:145 +#: .\Manager.py:1548 msgid "Show graphics" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:244 .\Analysis\WindowAnalysisParam.py:452 +#: .\Analysis\WindowAnalysisParam.py:273 .\Analysis\WindowAnalysisParam.py:481 msgid "General options" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:245 .\Analysis\WindowAnalysisParam.py:453 +#: .\Analysis\WindowAnalysisParam.py:274 .\Analysis\WindowAnalysisParam.py:482 #: .\Analysis\WindowAnalysisVariations.py:19 .\MainWindow\WBase.py:194 #: .\MainWindow\WInformation.py:319 .\Manager.py:1052 msgid "Variations" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:246 .\Analysis\WindowAnalysisParam.py:454 +#: .\Analysis\WindowAnalysisParam.py:275 .\Analysis\WindowAnalysisParam.py:483 msgid "Wrong moves" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:247 .\Analysis\WindowAnalysisParam.py:455 +#: .\Analysis\WindowAnalysisParam.py:276 .\Analysis\WindowAnalysisParam.py:484 msgid "Brilliancies" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:284 .\Director\TabVisual.py:416 +#: .\Analysis\WindowAnalysisParam.py:313 .\Director\TabVisual.py:416 #: .\Endings\WEndingsGTB.py:257 .\Expeditions\WindowEverest.py:355 #: .\Expeditions\WindowEverest.py:451 .\LearnGame\WindowPlayGame.py:122 #: .\LearnGame\WindowPlayGame.py:211 .\Manager.py:1299 .\Manager.py:1442 @@ -1142,31 +1140,31 @@ msgstr "" msgid "Configuration" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:287 +#: .\Analysis\WindowAnalysisParam.py:316 msgid "Analysis Configuration" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:412 .\Books\PolyglotImportExports.py:525 -#: .\Databases\WDB_Games.py:965 +#: .\Analysis\WindowAnalysisParam.py:441 .\Books\PolyglotImportExports.py:527 +#: .\Databases\WDB_Games.py:1048 msgid "Only the following players" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:413 .\Books\PolyglotImportExports.py:526 -#: .\Databases\WDB_Games.py:966 +#: .\Analysis\WindowAnalysisParam.py:442 .\Books\PolyglotImportExports.py:528 +#: .\Databases\WDB_Games.py:1049 msgid "(You can add multiple aliases separated by ; and wildcards with *)" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:441 .\Databases\WDB_Games.py:639 -#: .\Databases\WDB_Games.py:648 .\Databases\WDB_Games.py:972 -#: .\Databases\WDB_Utils.py:359 +#: .\Analysis\WindowAnalysisParam.py:470 .\Databases\WDB_Games.py:706 +#: .\Databases\WDB_Games.py:714 .\Databases\WDB_Games.py:723 +#: .\Databases\WDB_Games.py:1055 .\Databases\WDB_Utils.py:359 msgid "Only selected games" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:444 +#: .\Analysis\WindowAnalysisParam.py:473 msgid "Number of parallel processes" msgstr "" -#: .\Analysis\WindowAnalysisParam.py:532 +#: .\Analysis\WindowAnalysisParam.py:561 msgid "No file was specified where to save results" msgstr "" @@ -1182,27 +1180,27 @@ msgstr "" msgid "Analyzer's prediction" msgstr "" -#: .\Base\Game.py:915 .\Competitions\ManagerFideFics.py:434 +#: .\Base\Game.py:909 .\Competitions\ManagerFideFics.py:434 msgid "Congratulations you have won against %1." msgstr "" -#: .\Base\Game.py:917 .\LearnGame\ManagerPlayGame.py:393 +#: .\Base\Game.py:911 .\LearnGame\ManagerPlayGame.py:393 msgid "Congratulations you have won." msgstr "" -#: .\Base\Game.py:928 .\Competitions\ManagerFideFics.py:430 +#: .\Base\Game.py:922 .\Competitions\ManagerFideFics.py:430 msgid "Unfortunately you have lost against %1." msgstr "" -#: .\Base\Game.py:930 .\LearnGame\ManagerPlayGame.py:390 +#: .\Base\Game.py:924 .\LearnGame\ManagerPlayGame.py:390 msgid "Unfortunately you have lost." msgstr "" -#: .\Base\Game.py:938 .\Competitions\ManagerFideFics.py:438 +#: .\Base\Game.py:932 .\Competitions\ManagerFideFics.py:438 msgid "Draw against %1." msgstr "" -#: .\Base\Game.py:940 .\Competitions\ManagerElo.py:335 +#: .\Base\Game.py:934 .\Competitions\ManagerElo.py:335 #: .\Competitions\ManagerMicElo.py:210 .\Competitions\ManagerWicker.py:207 #: .\Databases\WDB_Players.py:121 .\Databases\WDB_Players.py:124 #: .\Databases\WDB_Players.py:136 .\Databases\WDB_Players.py:139 @@ -1216,18 +1214,18 @@ msgstr "" msgid "Draw" msgstr "" -#: .\Base\Game.py:951 +#: .\Base\Game.py:945 msgid "Lost on time" msgstr "" -#: .\Base\Game.py:955 .\Coordinates\WRunCoordinatesBasic.py:83 -#: .\Coordinates\WRunCoordinatesBlocks.py:126 .\Databases\WDB_Games.py:986 +#: .\Base\Game.py:949 .\Coordinates\WRunCoordinatesBasic.py:83 +#: .\Coordinates\WRunCoordinatesBlocks.py:126 .\Databases\WDB_Games.py:1069 #: .\Engines\STS.py:477 .\Engines\WindowSTS.py:611 .\Engines\WindowSTS.py:644 #: .\GM\GM.py:166 .\GM\WindowGM.py:763 .\Leagues\WLeague.py:162 #: .\Leagues\WLeague.py:222 .\Leagues\WLeague.py:238 .\ManagerGame.py:108 #: .\ManagerSolo.py:115 .\Maps\WindowWorkMap.py:71 .\Maps\WindowWorkMap.py:207 #: .\Openings\WindowOpeningLine.py:132 .\Openings\WindowOpeningLine.py:982 -#: .\QT\QTUtil2.py:659 .\QT\WindowDailyTest.py:397 .\QT\WindowPotencia.py:787 +#: .\QT\QTUtil2.py:721 .\QT\WindowDailyTest.py:397 .\QT\WindowPotencia.py:787 #: .\Swiss\WSwiss.py:122 .\Swiss\WSwiss.py:180 .\Swiss\WSwiss.py:194 #: .\Tournaments\WTournament.py:244 .\Translations\TrListas.py:26 #: .\TurnOnLights\ManagerTurnOnLights.py:265 @@ -1235,7 +1233,7 @@ msgstr "" msgid "Result" msgstr "" -#: .\Base\Game.py:961 .\Endings\WEndingsGTB.py:96 +#: .\Base\Game.py:955 .\Endings\WEndingsGTB.py:96 #: .\Engines\EngineResponse.py:734 .\Engines\EngineResponse.py:813 #: .\Engines\EngineResponse.py:924 .\Maps\WorkMap.py:381 #: .\Openings\ManagerOPLEngines.py:448 @@ -1243,48 +1241,48 @@ msgstr "" msgid "Mate" msgstr "" -#: .\Base\Game.py:962 .\Sound\Sound.py:145 +#: .\Base\Game.py:956 .\Sound\Sound.py:145 msgid "Stalemate" msgstr "" -#: .\Base\Game.py:963 .\Sound\Sound.py:146 +#: .\Base\Game.py:957 .\Sound\Sound.py:146 msgid "Draw by threefold repetition" msgstr "" -#: .\Base\Game.py:964 .\Sound\Sound.py:148 +#: .\Base\Game.py:958 .\Sound\Sound.py:148 msgid "Draw by insufficient material" msgstr "" -#: .\Base\Game.py:965 .\Sound\Sound.py:147 +#: .\Base\Game.py:959 .\Sound\Sound.py:147 msgid "Draw by fifty-move rule" msgstr "" -#: .\Base\Game.py:966 +#: .\Base\Game.py:960 msgid "Draw by agreement" msgstr "" -#: .\Base\Game.py:967 +#: .\Base\Game.py:961 msgid "Resignation" msgstr "" -#: .\Base\Game.py:968 .\Leagues\WLeagueWorker.py:98 +#: .\Base\Game.py:962 .\Leagues\WLeagueWorker.py:98 #: .\Leagues\WLeagueWorker.py:107 .\Swiss\WSwissWorker.py:98 #: .\Swiss\WSwissWorker.py:107 .\Tournaments\WTournamentRun.py:177 #: .\Tournaments\WTournamentRun.py:186 msgid "Adjudication" msgstr "" -#: .\Base\Game.py:969 +#: .\Base\Game.py:963 msgid "Won on time" msgstr "" -#: .\Base\Game.py:970 .\Openings\WindowOpenings.py:263 +#: .\Base\Game.py:964 .\Openings\WindowOpenings.py:263 #: .\Openings\WindowOpenings.py:279 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:901 msgid "Unknown" msgstr "" -#: .\Base\Game.py:971 +#: .\Base\Game.py:965 msgid "Engine malfunction" msgstr "" @@ -1319,12 +1317,12 @@ msgid "Modify" msgstr "" #: .\BestMoveTraining\WindowBMT.py:129 -#: .\BestMoveTraining\WindowBMTtrain.py:181 .\Board\WBoardColors.py:684 +#: .\BestMoveTraining\WindowBMTtrain.py:180 .\Board\WBoardColors.py:684 #: .\Books\WBooksTrainOL.py:125 .\Books\WBooksTrainOL.py:518 #: .\Books\WFactory.py:50 .\Config\WindowUsuarios.py:37 #: .\Coordinates\WCoordinatesBasic.py:34 #: .\Coordinates\WCoordinatesBlocks.py:37 -#: .\CountsCaptures\WCountsCaptures.py:49 .\Databases\WDB_Games.py:109 +#: .\CountsCaptures\WCountsCaptures.py:49 .\Databases\WDB_Games.py:111 #: .\Databases\WDB_Utils.py:135 .\Director\WindowDirector.py:58 #: .\Director\WindowDirector.py:1008 .\Director\WindowTab.py:181 #: .\Director\WindowTab.py:383 .\Director\WindowTabVCircles.py:158 @@ -1333,14 +1331,14 @@ msgstr "" #: .\Endings\WEndingsGTB.py:87 .\Endings\WEndingsGTB.py:623 #: .\Engines\WConfEngines.py:238 .\Engines\WindowSTS.py:592 #: .\Engines\WindowSTS.py:819 .\Expeditions\WindowEverest.py:353 -#: .\GM\WindowGM.py:778 .\Kibitzers\WindowKibitzers.py:46 +#: .\GM\WindowGM.py:779 .\Kibitzers\WindowKibitzers.py:46 #: .\Leagues\WLeagues.py:45 .\LearnGame\WindowLearnGame.py:83 #: .\LearnGame\WindowLearnGame.py:240 .\LearnGame\WindowPlayGame.py:120 #: .\LearnGame\WindowPlayGame.py:268 .\MainWindow\WInformation.py:308 -#: .\Manager.py:1061 .\Manager.py:1554 .\Maps\WindowWorkMap.py:83 +#: .\Manager.py:1061 .\Manager.py:1551 .\Maps\WindowWorkMap.py:83 #: .\Mate15\WMate15.py:41 .\Menus\BasicMenus.py:248 #: .\Menus\MenuTrainings.py:277 .\Openings\WindowOpeningLine.py:55 -#: .\Openings\WindowOpeningLine.py:1246 .\Openings\WindowOpeningLines.py:57 +#: .\Openings\WindowOpeningLine.py:1263 .\Openings\WindowOpeningLines.py:57 #: .\Openings\WindowOpenings.py:62 .\Openings\WindowOpenings.py:304 #: .\PlayAgainstEngine\Personalities.py:226 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:586 .\Procesador.py:584 @@ -1348,7 +1346,7 @@ msgstr "" #: .\QT\WindowPotencia.py:301 .\QT\WindowPotencia.py:412 #: .\QT\WindowPuente.py:257 .\QT\WindowPuente.py:301 #: .\QT\WindowVisualiza.py:62 .\SingularMoves\WindowSingularM.py:28 -#: .\Sound\WindowSonido.py:232 .\Swiss\WSwisses.py:46 +#: .\Sound\WindowSonido.py:232 .\Swiss\WSwisses.py:44 #: .\Tactics\WindowTactics.py:50 .\Tactics\WindowTactics.py:250 #: .\Tournaments\WTournament.py:155 .\Tournaments\WTournament.py:202 #: .\Tournaments\WTournament.py:228 .\Tournaments\WTournaments.py:48 @@ -1356,7 +1354,7 @@ msgstr "" msgid "Remove" msgstr "" -#: .\BestMoveTraining\WindowBMT.py:133 .\Databases\WDB_Games.py:113 +#: .\BestMoveTraining\WindowBMT.py:133 .\Databases\WDB_Games.py:115 #: .\Endings\WEndingsGTB.py:50 .\MainWindow\WBase.py:193 #: .\Openings\WindowOpeningLine.py:61 msgid "Utilities" @@ -1390,7 +1388,7 @@ msgid "Pending" msgstr "" #: .\BestMoveTraining\WindowBMT.py:160 -#: .\BestMoveTraining\WindowBMTtrain.py:142 .\Endings\WEndingsGTB.py:624 +#: .\BestMoveTraining\WindowBMTtrain.py:141 .\Endings\WEndingsGTB.py:624 #: .\Openings\WindowOpeningLine.py:307 .\Openings\WindowOpeningLine.py:318 #: .\Openings\WindowOpeningLines.py:73 .\Tactics\WindowTactics.py:304 msgid "Positions" @@ -1409,20 +1407,20 @@ msgstr "" #: .\BestMoveTraining\WindowBMT.py:222 .\Board\WBoardColors.py:489 #: .\Books\PolyglotImportExports.py:151 .\Books\PolyglotImportExports.py:177 #: .\Books\PolyglotImportExports.py:209 .\Books\WPolyglot.py:61 -#: .\Databases\WDB_Games.py:115 .\Endings\WEndingsGTB.py:612 +#: .\Databases\WDB_Games.py:117 .\Endings\WEndingsGTB.py:612 #: .\Engines\WindowSTS.py:586 .\GM\WindowGM.py:48 .\GM\WindowGM.py:594 -#: .\GM\WindowGM.py:603 .\Openings\OpeningLines.py:930 -#: .\Openings\OpeningLines.py:934 .\Openings\OpeningLines.py:999 -#: .\Openings\OpeningLines.py:1002 .\Openings\OpeningLines.py:1067 -#: .\Openings\OpeningLines.py:1113 .\Openings\OpeningLines.py:1138 -#: .\Openings\OpeningLines.py:1159 .\Openings\WindowOpeningLine.py:57 +#: .\GM\WindowGM.py:603 .\Openings\OpeningLines.py:932 +#: .\Openings\OpeningLines.py:936 .\Openings\OpeningLines.py:1001 +#: .\Openings\OpeningLines.py:1004 .\Openings\OpeningLines.py:1069 +#: .\Openings\OpeningLines.py:1115 .\Openings\OpeningLines.py:1140 +#: .\Openings\OpeningLines.py:1161 .\Openings\WindowOpeningLine.py:57 #: .\Tournaments\WTournament.py:159 msgid "Import" msgstr "" #: .\BestMoveTraining\WindowBMT.py:222 .\Board\WBoardColors.py:491 -#: .\Databases\WDB_Games.py:117 .\Engines\WindowSTS.py:597 -#: .\Leagues\WLeague.py:378 .\Odt\WOdt.py:46 +#: .\Databases\WDB_Games.py:119 .\Databases\WDB_Games.py:1372 +#: .\Engines\WindowSTS.py:597 .\Leagues\WLeague.py:378 .\Odt\WOdt.py:46 #: .\Openings\WindowOpeningLine.py:59 .\Swiss\WSwiss.py:320 msgid "Export" msgstr "" @@ -1463,13 +1461,13 @@ msgstr "" msgid "Open Document Format" msgstr "" -#: .\BestMoveTraining\WindowBMT.py:240 .\Books\PolyglotImportExports.py:594 +#: .\BestMoveTraining\WindowBMT.py:240 .\Books\PolyglotImportExports.py:596 #: .\Odt\WOdt.py:29 .\Washing\WindowWashing.py:197 msgid "Export to" msgstr "" #: .\BestMoveTraining\WindowBMT.py:288 .\setup_linux.py:25 .\setup_linux.py:46 -#: .\setup_linux.py:361 +#: .\setup_linux.py:356 msgid "Lucas Chess" msgstr "" @@ -1481,13 +1479,13 @@ msgid "Position" msgstr "" #: .\BestMoveTraining\WindowBMT.py:337 -#: .\BestMoveTraining\WindowBMTtrain.py:661 +#: .\BestMoveTraining\WindowBMTtrain.py:660 msgid "pws lost" msgstr "" #: .\BestMoveTraining\WindowBMT.py:359 -#: .\BestMoveTraining\WindowBMTtrain.py:184 -#: .\BestMoveTraining\WindowBMTtrain.py:818 +#: .\BestMoveTraining\WindowBMTtrain.py:183 +#: .\BestMoveTraining\WindowBMTtrain.py:817 msgid "Actual game" msgstr "" @@ -1500,22 +1498,22 @@ msgid "List of positions" msgstr "" #: .\BestMoveTraining\WindowBMT.py:685 -#: .\BestMoveTraining\WindowBMTtrain.py:357 +#: .\BestMoveTraining\WindowBMTtrain.py:356 msgid "Excellent" msgstr "" #: .\BestMoveTraining\WindowBMT.py:686 -#: .\BestMoveTraining\WindowBMTtrain.py:358 +#: .\BestMoveTraining\WindowBMTtrain.py:357 msgid "Very good" msgstr "" #: .\BestMoveTraining\WindowBMT.py:687 -#: .\BestMoveTraining\WindowBMTtrain.py:359 +#: .\BestMoveTraining\WindowBMTtrain.py:358 msgid "Good" msgstr "" #: .\BestMoveTraining\WindowBMT.py:688 -#: .\BestMoveTraining\WindowBMTtrain.py:360 +#: .\BestMoveTraining\WindowBMTtrain.py:359 msgid "Acceptable" msgstr "" @@ -1539,9 +1537,9 @@ msgstr "" #: .\Director\WindowTabVMarkers.py:268 .\Director\WindowTabVSVGs.py:307 #: .\Engines\WConfEngines.py:426 .\Engines\WindowSTS.py:942 #: .\GM\WindowGM.py:325 .\Leagues\WLeagues.py:167 .\Maps\WindowWorkMap.py:194 -#: .\Menus\MenuTrainings.py:579 .\PlayAgainstEngine\Personalities.py:244 -#: .\PlayAgainstEngine\WPlayAgainstEngine.py:598 .\QT\GridEditCols.py:126 -#: .\Swiss\WSwisses.py:170 .\Tournaments\WTournaments.py:151 +#: .\Menus\MenuTrainings.py:583 .\PlayAgainstEngine\Personalities.py:244 +#: .\PlayAgainstEngine\WPlayAgainstEngine.py:598 .\QT\GridEditCols.py:127 +#: .\Swiss\WSwisses.py:168 .\Tournaments\WTournaments.py:151 msgid "Delete %1?" msgstr "" @@ -1557,11 +1555,11 @@ msgstr "" msgid "To number" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:87 +#: .\BestMoveTraining\WindowBMTtrain.py:86 msgid "* indicates actual move played in game" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:179 .\Config\WindowUsuarios.py:167 +#: .\BestMoveTraining\WindowBMTtrain.py:178 .\Config\WindowUsuarios.py:167 #: .\CountsCaptures\WCountsCaptures.py:47 .\MainWindow\WBase.py:185 #: .\MainWindow\WBase.py:186 .\Mate15\WMate15.py:39 .\QT\WindowMemoria.py:137 #: .\QT\WindowPotencia.py:416 .\SingularMoves\WindowSingularM.py:26 @@ -1569,13 +1567,13 @@ msgstr "" msgid "Repeat" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:180 .\MainWindow\WBase.py:162 +#: .\BestMoveTraining\WindowBMTtrain.py:179 .\MainWindow\WBase.py:162 #: .\QT\WindowDailyTest.py:259 .\QT\WindowMemoria.py:138 #: .\Resistance\ManagerResistance.py:271 msgid "Resign" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:182 +#: .\BestMoveTraining\WindowBMTtrain.py:181 #: .\CountsCaptures\WCountsCaptures.py:51 .\Kibitzers\WKibEngine.py:64 #: .\Kibitzers\WKibLinea.py:73 .\Leagues\WLeagueConfig.py:171 #: .\MainWindow\WBase.py:156 .\MainWindow\WBase.py:201 @@ -1584,59 +1582,59 @@ msgstr "" msgid "Options" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:183 .\Expeditions\WindowEverest.py:349 +#: .\BestMoveTraining\WindowBMTtrain.py:182 .\Expeditions\WindowEverest.py:349 #: .\QT\WindowDailyTest.py:52 .\QT\WindowHorses.py:136 #: .\QT\WindowMemoria.py:132 .\QT\WindowPotencia.py:411 #: .\QT\WindowPuente.py:300 msgid "Start" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:185 .\Databases\WDB_Summary.py:83 +#: .\BestMoveTraining\WindowBMTtrain.py:184 .\Databases\WDB_Summary.py:83 #: .\MainWindow\WBase.py:170 .\Tactics\Tactics.py:726 .\Tactics\Tactics.py:729 #: .\Tactics\Tactics.py:734 .\TurnOnLights\WindowTurnOnLights.py:53 msgid "Next" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:239 +#: .\BestMoveTraining\WindowBMTtrain.py:238 msgid "Tolerance: How many centipawns below the best move are accepted" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:260 .\Endings\WEndingsGTB.py:249 +#: .\BestMoveTraining\WindowBMTtrain.py:259 .\Endings\WEndingsGTB.py:249 msgid "Do you want to delete this position?" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:262 +#: .\BestMoveTraining\WindowBMTtrain.py:261 msgid "This position will be deleted on exit." msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:355 +#: .\BestMoveTraining\WindowBMTtrain.py:354 msgid "Repeat all" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:371 +#: .\BestMoveTraining\WindowBMTtrain.py:370 msgid "Repeat only below score" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:374 +#: .\BestMoveTraining\WindowBMTtrain.py:373 msgid "Do you want to repeat this training?" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:691 .\Engines\SelectEngines.py:152 +#: .\BestMoveTraining\WindowBMTtrain.py:690 .\Engines\SelectEngines.py:152 msgid "depth" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:717 .\ManagerFindAllMoves.py:280 +#: .\BestMoveTraining\WindowBMTtrain.py:716 .\ManagerFindAllMoves.py:280 #: .\Maps\WindowWorkMap.py:332 .\QT\WindowDailyTest.py:352 #: .\QT\WindowPotencia.py:837 .\QT\WindowPuente.py:653 #: .\QT\WindowVisualiza.py:438 .\Voyager\Voyager.py:106 msgid "En passant" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:801 +#: .\BestMoveTraining\WindowBMTtrain.py:800 msgid "Black to play" msgstr "" -#: .\BestMoveTraining\WindowBMTtrain.py:801 +#: .\BestMoveTraining\WindowBMTtrain.py:800 msgid "White to play" msgstr "" @@ -1645,14 +1643,14 @@ msgid "Board image is in clipboard" msgstr "" #: .\Board\Board.py:738 .\Board\Board.py:744 .\Board\Board.py:788 -#: .\Board\Board.py:829 .\Board\Board.py:832 .\Config\WindowConfig.py:94 -#: .\Manager.py:1487 .\Menus\BasicMenus.py:296 .\Menus\BasicMenus.py:379 +#: .\Board\Board.py:829 .\Board\Board.py:832 .\Config\WindowConfig.py:95 +#: .\Manager.py:1486 .\Menus\BasicMenus.py:296 .\Menus\BasicMenus.py:379 msgid "ALT" msgstr "" #: .\Board\Board.py:741 .\Board\Board.py:744 .\Board\Board.py:788 -#: .\Config\WindowConfig.py:94 .\Director\WindowTab.py:108 .\Manager.py:1487 -#: .\Manager.py:1565 .\Manager.py:1569 .\ManagerEntPos.py:308 +#: .\Config\WindowConfig.py:95 .\Director\WindowTab.py:108 .\Manager.py:1486 +#: .\Manager.py:1562 .\Manager.py:1566 .\ManagerEntPos.py:332 #: .\ManagerSolo.py:459 .\ManagerSolo.py:593 msgid "CTRL" msgstr "" @@ -1705,7 +1703,7 @@ msgstr "" msgid "Open position in ChessTempo" msgstr "" -#: .\Board\Board.py:778 .\Manager.py:1533 .\Manager.py:2017 +#: .\Board\Board.py:778 .\Manager.py:1532 .\Manager.py:2014 msgid "Play current position" msgstr "" @@ -1717,7 +1715,7 @@ msgstr "" msgid "Minimize to the tray icon" msgstr "" -#: .\Board\Board.py:788 .\Manager.py:1492 +#: .\Board\Board.py:788 .\Manager.py:1491 msgid "SHIFT || From keyboard" msgstr "" @@ -1742,13 +1740,13 @@ msgstr "" msgid "Director" msgstr "" -#: .\Board\Board.py:840 .\Books\WFactory.py:42 .\Databases\WDB_Games.py:95 -#: .\Director\WindowTab.py:176 .\Director\WindowTab.py:179 -#: .\Director\WindowTab.py:378 .\Director\WindowTab.py:381 -#: .\Engines\WindowSTS.py:588 .\Leagues\WLeagues.py:39 -#: .\Openings\WindowOpeningLines.py:46 +#: .\Board\Board.py:840 .\Books\WFactory.py:42 .\Databases\WDB_Games.py:97 +#: .\Databases\WDB_Games.py:295 .\Director\WindowTab.py:176 +#: .\Director\WindowTab.py:179 .\Director\WindowTab.py:378 +#: .\Director\WindowTab.py:381 .\Engines\WindowSTS.py:588 +#: .\Leagues\WLeagues.py:39 .\Openings\WindowOpeningLines.py:46 #: .\PlayAgainstEngine\Personalities.py:222 .\QT\WindowManualSave.py:76 -#: .\Swiss\WSwisses.py:40 +#: .\Swiss\WSwisses.py:38 msgid "Edit" msgstr "" @@ -1846,14 +1844,14 @@ msgstr "" #: .\Board\BoardTypes.py:440 .\Coordinates\WRunCoordinatesBasic.py:49 #: .\Coordinates\WRunCoordinatesBlocks.py:63 #: .\CountsCaptures\WRunCaptures.py:73 .\CountsCaptures\WRunCounts.py:55 -#: .\Databases\WDB_Games.py:1366 .\ForcingMoves\WForcingMoves.py:83 -#: .\Kibitzers\WKibBooks.py:31 .\Kibitzers\WKibDatabases.py:52 +#: .\Databases\WDB_Games.py:1503 .\ForcingMoves\WForcingMoves.py:83 +#: .\Kibitzers\WKibBooks.py:31 .\Kibitzers\WKibDatabases.py:75 #: .\Kibitzers\WKibEngine.py:51 .\Kibitzers\WKibGaviota.py:29 #: .\Kibitzers\WKibIndex.py:67 .\Kibitzers\WKibLinea.py:69 #: .\Kibitzers\WKibStEval.py:23 .\Leagues\WLeagueWorker.py:105 #: .\LearnGame\WindowLearnGame.py:486 .\MainWindow\Presentacion.py:152 #: .\MainWindow\WBase.py:182 .\MainWindow\WBase.py:183 -#: .\Mate15\WRunMate15.py:67 .\QT\QTUtil2.py:313 .\QT\QTUtil2.py:629 +#: .\Mate15\WRunMate15.py:67 .\QT\QTUtil2.py:317 .\QT\QTUtil2.py:687 #: .\QT\QTVarios.py:717 .\QT\QTVarios.py:795 .\QT\QTVarios.py:849 #: .\QT\QTVarios.py:1159 .\QT\WindowDailyTest.py:258 .\QT\WindowMemoria.py:133 #: .\QT\WindowPuente.py:463 .\Resistance\ManagerResistance.py:272 @@ -1861,8 +1859,8 @@ msgstr "" msgid "Continue" msgstr "" -#: .\Board\WBoardColors.py:71 .\QT\GridEditCols.py:197 -#: .\QT\GridEditCols.py:205 .\QT\QTVarios.py:27 .\QT\QTVarios.py:102 +#: .\Board\WBoardColors.py:71 .\QT\GridEditCols.py:198 +#: .\QT\GridEditCols.py:206 .\QT\QTVarios.py:27 .\QT\QTVarios.py:102 #: .\QT\WColors.py:146 .\QT\WColors.py:157 msgid "Choose a color" msgstr "" @@ -1893,7 +1891,7 @@ msgstr "" msgid "Black squares" msgstr "" -#: .\Board\WBoardColors.py:296 .\QT\GridEditCols.py:49 .\QT\WColors.py:44 +#: .\Board\WBoardColors.py:296 .\QT\GridEditCols.py:50 .\QT\WColors.py:44 #: .\QT\WColors.py:45 .\QT\WColors.py:46 msgid "Background" msgstr "" @@ -1941,12 +1939,12 @@ msgstr "" msgid "Number" msgstr "" -#: .\Board\WBoardColors.py:395 .\Config\WindowConfig.py:155 +#: .\Board\WBoardColors.py:395 .\Config\WindowConfig.py:157 msgid "Font" msgstr "" -#: .\Board\WBoardColors.py:405 .\Config\WindowConfig.py:161 -#: .\Config\WindowConfig.py:166 +#: .\Board\WBoardColors.py:405 .\Config\WindowConfig.py:163 +#: .\Config\WindowConfig.py:168 msgid "Bold" msgstr "" @@ -1973,13 +1971,13 @@ msgstr "" #: .\Board\WBoardColors.py:483 .\Books\WBooksTrain.py:34 #: .\Books\WBooksTrainOL.py:261 .\Config\WindowUsuarios.py:31 -#: .\Databases\WDB_Games.py:80 .\Databases\WDB_Utils.py:91 +#: .\Databases\WDB_Games.py:82 .\Databases\WDB_Utils.py:91 #: .\Databases\WDB_Utils.py:303 .\Expeditions\WindowEverest.py:69 -#: .\GM\WindowGM.py:42 .\GM\WindowGM.py:772 .\MainWindow\LucasChessGui.py:149 -#: .\MainWindow\WBase.py:190 .\Openings\WindowOpeningLine.py:1410 +#: .\GM\WindowGM.py:42 .\GM\WindowGM.py:773 .\MainWindow\LucasChessGui.py:148 +#: .\MainWindow\WBase.py:190 .\Openings\WindowOpeningLine.py:1427 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:68 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:1173 .\PlayHuman\WPlayHuman.py:25 -#: .\QT\QTUtil2.py:555 .\QT\QTUtil2.py:788 .\QT\QTVarios.py:1123 +#: .\QT\QTUtil2.py:613 .\QT\QTUtil2.py:854 .\QT\QTVarios.py:1123 #: .\QT\WindowArbolBook.py:251 .\QT\WindowPgnTags.py:31 #: .\Sound\WindowSonido.py:223 .\Tactics\WindowTactics.py:616 #: .\TurnOnLights\WindowTurnOnLights.py:321 .\Voyager\Voyager.py:484 @@ -1995,12 +1993,12 @@ msgstr "" msgid "Other options" msgstr "" -#: .\Board\WBoardColors.py:570 .\Config\WindowConfig.py:34 +#: .\Board\WBoardColors.py:570 .\Config\WindowConfig.py:35 #: .\Databases\WDB_Players.py:31 .\Director\WindowDirector.py:303 #: .\Engines\WindowSTS.py:503 .\GM\WindowGM.py:641 .\Leagues\WLeague.py:301 #: .\Manager.py:1049 .\Openings\POLAnalisis.py:229 #: .\Openings\POLAnalisis.py:661 .\Openings\POLAnalisis.py:666 -#: .\Openings\WindowOpeningLine.py:758 .\Openings\WindowOpeningLine.py:1249 +#: .\Openings\WindowOpeningLine.py:758 .\Openings\WindowOpeningLine.py:1266 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:231 .\Swiss\WSwiss.py:249 msgid "All" msgstr "" @@ -2026,8 +2024,8 @@ msgstr "" msgid "Change piece set" msgstr "" -#: .\Books\ManagerTrainBooks.py:53 .\Config\Configuration.py:355 -#: .\Config\WindowConfig.py:345 .\Config\WindowConfig.py:349 +#: .\Books\ManagerTrainBooks.py:53 .\Config\Configuration.py:357 +#: .\Config\WindowConfig.py:348 .\Config\WindowConfig.py:352 #: .\Databases\WDB_Players.py:250 .\Databases\WDB_Players.py:379 #: .\Leagues\WLeague.py:101 .\Leagues\WLeague.py:216 #: .\Menus\MenuTrainings.py:145 @@ -2042,7 +2040,7 @@ msgstr "" #: .\CompetitionWithTutor\WCompetitionWithTutor.py:191 #: .\Competitions\ManagerElo.py:326 .\Engines\EngineManager.py:62 #: .\GM\GM.py:50 .\GM\GM.py:56 .\GM\GM.py:160 .\GM\WindowGM.py:759 -#: .\ManagerGame.py:416 .\ManagerSolo.py:683 .\ManagerVariations.py:261 +#: .\ManagerGame.py:416 .\ManagerSolo.py:684 .\ManagerVariations.py:261 #: .\Menus\MenuTrainings.py:146 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:386 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:163 @@ -2055,14 +2053,14 @@ msgid "Opponent" msgstr "" #: .\Books\ManagerTrainBooks.py:389 .\Books\ManagerTrainBooksOL.py:116 -#: .\ManagerEntPos.py:461 .\Openings\ManagerOPLSequential.py:132 +#: .\ManagerEntPos.py:485 .\Openings\ManagerOPLSequential.py:132 #: .\Openings\ManagerOPLStatic.py:131 .\Tactics\ManagerTactics.py:263 #: .\TurnOnLights\ManagerTurnOnLights.py:272 msgid "Line completed" msgstr "" #: .\Books\ManagerTrainBooksOL.py:100 .\Openings\ManagerOPLSequential.py:108 -#: .\Openings\ManagerOPLStatic.py:61 .\Openings\OpeningLines.py:1271 +#: .\Openings\ManagerOPLStatic.py:61 .\Openings\OpeningLines.py:1273 #: .\Openings\WindowOpeningLine.py:71 msgid "Line" msgstr "" @@ -2112,7 +2110,7 @@ msgstr "" msgid "Next time you will start from the first position" msgstr "" -#: .\Books\ManagerTrainBooksOL.py:235 .\ManagerEntPos.py:499 +#: .\Books\ManagerTrainBooksOL.py:235 .\ManagerEntPos.py:523 #: .\Openings\ManagerOPLSequential.py:282 .\Openings\ManagerOPLStatic.py:287 msgid "You have selected a correct move, but this line uses another one." msgstr "" @@ -2122,7 +2120,7 @@ msgstr "" #: .\Coordinates\WRunCoordinatesBlocks.py:171 #: .\Openings\ManagerOPLPositions.py:238 #: .\Openings\ManagerOPLSequential.py:288 .\Openings\ManagerOPLStatic.py:293 -#: .\QT\QTUtil2.py:645 .\QT\QTUtil2.py:651 .\Sound\Sound.py:140 +#: .\QT\QTUtil2.py:703 .\QT\QTUtil2.py:709 .\Sound\Sound.py:140 msgid "Error" msgstr "" @@ -2153,7 +2151,7 @@ msgstr "" msgid "PGN" msgstr "" -#: .\Books\PolyglotImportExports.py:104 .\Databases\WDB_Games.py:1470 +#: .\Books\PolyglotImportExports.py:104 .\Databases\WDB_Games.py:1607 #: .\Databases\WindowDatabase.py:16 .\Endings\WEndingsGTB.py:617 #: .\Kibitzers\Kibitzers.py:223 .\Kibitzers\WindowKibitzers.py:246 #: .\Openings\POLAnalisis.py:865 .\Openings\WindowOpeningLine.py:599 @@ -2161,31 +2159,31 @@ msgstr "" msgid "Database" msgstr "" -#: .\Books\PolyglotImportExports.py:106 .\Books\PolyglotImportExports.py:599 +#: .\Books\PolyglotImportExports.py:106 .\Books\PolyglotImportExports.py:601 #: .\Books\WBooks.py:120 .\Engines\WEngines.py:407 .\Kibitzers\Kibitzers.py:40 -#: .\Kibitzers\WindowKibitzers.py:223 .\Openings\OpeningLines.py:1159 +#: .\Kibitzers\WindowKibitzers.py:223 .\Openings\OpeningLines.py:1161 #: .\Openings\POLAnalisis.py:863 .\Openings\WindowOpeningLine.py:597 -#: .\Openings\WindowOpeningLine.py:618 .\Openings\WindowOpeningLine.py:1398 +#: .\Openings\WindowOpeningLine.py:618 .\Openings\WindowOpeningLine.py:1415 #: .\PlayAgainstEngine\Personalities.py:105 .\Tournaments\WTournament.py:394 msgid "Polyglot book" msgstr "" -#: .\Books\PolyglotImportExports.py:119 .\Books\PolyglotImportExports.py:543 +#: .\Books\PolyglotImportExports.py:119 .\Books\PolyglotImportExports.py:545 msgid "What to do in case of collisions" msgstr "" -#: .\Books\PolyglotImportExports.py:122 .\Books\PolyglotImportExports.py:542 +#: .\Books\PolyglotImportExports.py:122 .\Books\PolyglotImportExports.py:544 msgid "Replace" msgstr "" -#: .\Books\PolyglotImportExports.py:124 .\Books\PolyglotImportExports.py:542 +#: .\Books\PolyglotImportExports.py:124 .\Books\PolyglotImportExports.py:544 #: .\MainWindow\WInformation.py:302 .\MainWindow\WInformation.py:304 #: .\Tactics\WindowTactics.py:249 msgid "Add" msgstr "" -#: .\Books\PolyglotImportExports.py:126 .\Books\PolyglotImportExports.py:517 -#: .\Books\PolyglotImportExports.py:542 +#: .\Books\PolyglotImportExports.py:126 .\Books\PolyglotImportExports.py:519 +#: .\Books\PolyglotImportExports.py:544 msgid "Discard" msgstr "" @@ -2198,90 +2196,95 @@ msgstr "" msgid "Imported" msgstr "" -#: .\Books\PolyglotImportExports.py:302 .\Books\PolyglotImportExports.py:466 -#: .\Databases\WDB_Games.py:1260 .\QT\QTVarios.py:711 +#: .\Books\PolyglotImportExports.py:304 .\Books\PolyglotImportExports.py:468 +#: .\Databases\DBgamesMov.py:58 .\Databases\WDB_Games.py:1342 +#: .\Databases\WDB_Games.py:1378 .\QT\QTVarios.py:711 #: .\QT\WindowSavePGN.py:695 .\Tournaments\WTournament.py:855 #: .\Washing\WindowWashing.py:300 msgid "Saving..." msgstr "" -#: .\Books\PolyglotImportExports.py:379 .\QT\QTVarios.py:648 +#: .\Books\PolyglotImportExports.py:381 .\QT\QTVarios.py:648 msgid "Games read" msgstr "" -#: .\Books\PolyglotImportExports.py:390 -msgid "minute" -msgstr "" - -#: .\Books\PolyglotImportExports.py:390 +#: .\Books\PolyglotImportExports.py:392 .\QT\QTUtil2.py:516 +#: .\QT\QTUtil2.py:520 msgid "minutes" msgstr "" -#: .\Books\PolyglotImportExports.py:393 .\Books\PolyglotImportExports.py:396 -msgid "Pending time" +#: .\Books\PolyglotImportExports.py:392 .\QT\QTUtil2.py:516 +#: .\QT\QTUtil2.py:524 +msgid "minute" msgstr "" -#: .\Books\PolyglotImportExports.py:393 .\Books\PolyglotImportExports.py:396 +#: .\Books\PolyglotImportExports.py:395 .\Books\PolyglotImportExports.py:398 +#: .\QT\QTUtil2.py:525 .\QT\QTUtil2.py:529 msgid "seconds" msgstr "" -#: .\Books\PolyglotImportExports.py:505 .\Expeditions\WindowEverest.py:140 +#: .\Books\PolyglotImportExports.py:395 .\Books\PolyglotImportExports.py:398 +#: .\QT\QTUtil2.py:532 +msgid "Pending time" +msgstr "" + +#: .\Books\PolyglotImportExports.py:507 .\Expeditions\WindowEverest.py:140 msgid "Maximum movements" msgstr "" -#: .\Books\PolyglotImportExports.py:509 +#: .\Books\PolyglotImportExports.py:511 msgid "Side to include" msgstr "" -#: .\Books\PolyglotImportExports.py:512 +#: .\Books\PolyglotImportExports.py:514 msgid "Include games when result is" msgstr "" -#: .\Books\PolyglotImportExports.py:518 +#: .\Books\PolyglotImportExports.py:520 msgid "Unknown result" msgstr "" -#: .\Books\PolyglotImportExports.py:518 +#: .\Books\PolyglotImportExports.py:520 msgid "convert to" msgstr "" -#: .\Books\PolyglotImportExports.py:521 +#: .\Books\PolyglotImportExports.py:523 msgid "Minimum number of games" msgstr "" -#: .\Books\PolyglotImportExports.py:522 +#: .\Books\PolyglotImportExports.py:524 #: .\Coordinates\WRunCoordinatesBlocks.py:48 msgid "Minimum score" msgstr "" -#: .\Books\PolyglotImportExports.py:531 .\Books\PolyglotImportExports.py:532 +#: .\Books\PolyglotImportExports.py:533 .\Books\PolyglotImportExports.py:534 msgid "Number of games" msgstr "" -#: .\Books\PolyglotImportExports.py:535 +#: .\Books\PolyglotImportExports.py:537 msgid "Calculation of the weight" msgstr "" -#: .\Books\PolyglotImportExports.py:537 +#: .\Books\PolyglotImportExports.py:539 msgid "Save score" msgstr "" -#: .\Books\PolyglotImportExports.py:601 +#: .\Books\PolyglotImportExports.py:603 msgid "Uniform distribution" msgstr "" -#: .\Books\PolyglotImportExports.py:621 .\Manager.py:1775 .\Manager.py:1820 +#: .\Books\PolyglotImportExports.py:623 .\Manager.py:1772 .\Manager.py:1817 #: .\ManagerSolo.py:311 .\QT\WGif.py:91 .\Washing\WindowWashing.py:223 msgid "The file %1 already exists, what do you want to do?" msgstr "" -#: .\Books\PolyglotImportExports.py:622 .\Manager.py:1776 .\Manager.py:1822 +#: .\Books\PolyglotImportExports.py:624 .\Manager.py:1773 .\Manager.py:1819 #: .\ManagerSolo.py:312 .\QT\WGif.py:92 .\QT\WindowSavePGN.py:49 #: .\QT\WindowSavePGN.py:222 .\Washing\WindowWashing.py:224 msgid "Overwrite" msgstr "" -#: .\Books\PolyglotImportExports.py:623 .\Manager.py:1777 .\ManagerSolo.py:313 +#: .\Books\PolyglotImportExports.py:625 .\Manager.py:1774 .\ManagerSolo.py:313 #: .\QT\WGif.py:93 msgid "Choose another" msgstr "" @@ -2309,26 +2312,26 @@ msgid "Unregister" msgstr "" #: .\Books\WBooks.py:69 .\Books\WBooksTrainOL.py:126 -#: .\Databases\WDB_Games.py:105 .\Director\WindowDirector.py:61 +#: .\Databases\WDB_Games.py:107 .\Director\WindowDirector.py:61 #: .\Director\WindowTabVCircles.py:164 .\Director\WindowTabVFlechas.py:234 #: .\Director\WindowTabVMarcos.py:169 .\Director\WindowTabVMarkers.py:164 #: .\Director\WindowTabVSVGs.py:182 .\Engines\WConfEngines.py:244 #: .\Engines\WindowSTS.py:594 .\Kibitzers\WindowKibitzers.py:50 #: .\LearnGame\WindowLearnGame.py:85 .\Menus\BasicMenus.py:250 #: .\Openings\WindowOpeningLines.py:54 .\Openings\WindowOpenings.py:306 -#: .\QT\GridEditCols.py:31 .\QT\ShowPGN.py:116 .\QT\WindowPgnTags.py:35 +#: .\QT\GridEditCols.py:32 .\QT\ShowPGN.py:116 .\QT\WindowPgnTags.py:35 msgid "Up" msgstr "" #: .\Books\WBooks.py:70 .\Books\WBooksTrainOL.py:127 -#: .\Databases\WDB_Games.py:107 .\Director\WindowDirector.py:62 +#: .\Databases\WDB_Games.py:109 .\Director\WindowDirector.py:62 #: .\Director\WindowTabVCircles.py:166 .\Director\WindowTabVFlechas.py:236 #: .\Director\WindowTabVMarcos.py:171 .\Director\WindowTabVMarkers.py:166 #: .\Director\WindowTabVSVGs.py:183 .\Engines\WConfEngines.py:246 #: .\Engines\WindowSTS.py:595 .\Kibitzers\WindowKibitzers.py:52 #: .\LearnGame\WindowLearnGame.py:87 .\Menus\BasicMenus.py:251 #: .\Openings\WindowOpeningLines.py:55 .\Openings\WindowOpenings.py:307 -#: .\QT\GridEditCols.py:32 .\QT\ShowPGN.py:120 .\QT\WindowPgnTags.py:37 +#: .\QT\GridEditCols.py:33 .\QT\ShowPGN.py:120 .\QT\WindowPgnTags.py:37 msgid "Down" msgstr "" @@ -2341,7 +2344,7 @@ msgid "Training with a book" msgstr "" #: .\Books\WBooksTrain.py:36 .\Books\WBooksTrainOL.py:263 -#: .\Openings\WindowOpeningLine.py:1412 .\QT\WindowArbolBook.py:256 +#: .\Openings\WindowOpeningLine.py:1429 .\QT\WindowArbolBook.py:256 msgid "Books" msgstr "" @@ -2398,28 +2401,28 @@ msgid "Train the opening lines of a book" msgstr "" #: .\Books\WBooksTrainOL.py:107 .\Coordinates\WCoordinatesBasic.py:23 -#: .\Databases\WDB_Games.py:976 .\Openings\WindowOpeningLine.py:1124 +#: .\Databases\WDB_Games.py:1059 .\Openings\WindowOpeningLine.py:1141 msgid "Side" msgstr "" #: .\Books\WBooksTrainOL.py:108 .\Books\WBooksTrainOL.py:308 -#: .\Openings\WindowOpeningLine.py:1442 +#: .\Openings\WindowOpeningLine.py:1459 msgid "White book" msgstr "" #: .\Books\WBooksTrainOL.py:109 .\Books\WBooksTrainOL.py:111 -#: .\Config\WindowConfig.py:26 .\TurnOnLights\WindowTurnOnLights.py:309 +#: .\Config\WindowConfig.py:27 .\TurnOnLights\WindowTurnOnLights.py:309 msgid "Mode" msgstr "" #: .\Books\WBooksTrainOL.py:110 .\Books\WBooksTrainOL.py:316 -#: .\Openings\WindowOpeningLine.py:1460 +#: .\Openings\WindowOpeningLine.py:1477 msgid "Black book" msgstr "" #: .\Books\WBooksTrainOL.py:112 .\Books\WBooksTrainOL.py:321 #: .\Engines\WConfEngines.py:504 .\Engines\WEngines.py:351 -#: .\Engines\WindowSTS.py:470 .\Openings\WindowOpeningLine.py:1465 +#: .\Engines\WindowSTS.py:470 .\Openings\WindowOpeningLine.py:1482 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:384 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:402 #: .\Tournaments\WTournament.py:522 @@ -2431,8 +2434,8 @@ msgid "Max lines" msgstr "" #: .\Books\WBooksTrainOL.py:114 .\Books\WBooksTrainOL.py:393 -#: .\Openings\ManagerOPLStatic.py:61 .\Openings\WindowOpeningLine.py:1064 -#: .\Openings\WindowOpeningLine.py:1551 .\Openings\WindowOpeningLines.py:37 +#: .\Openings\ManagerOPLStatic.py:61 .\Openings\WindowOpeningLine.py:1081 +#: .\Openings\WindowOpeningLine.py:1568 .\Openings\WindowOpeningLines.py:37 msgid "Lines" msgstr "" @@ -2446,7 +2449,7 @@ msgstr "" msgid "Start position" msgstr "" -#: .\Books\WBooksTrainOL.py:122 .\Databases\WDB_Games.py:119 +#: .\Books\WBooksTrainOL.py:122 .\Databases\WDB_Games.py:121 #: .\Databases\WDB_Utils.py:520 .\LearnGame\WindowLearnGame.py:238 #: .\LearnGame\WindowPlayGame.py:266 .\MainWindow\WBase.py:155 #: .\Menus\BasicMenus.py:244 .\Openings\WindowOpeningLine.py:63 @@ -2462,7 +2465,7 @@ msgstr "" #: .\Engines\WindowSTS.py:818 .\Kibitzers\WindowKibitzers.py:48 #: .\Leagues\WLeagues.py:43 .\Openings\POLBoard.py:35 #: .\Openings\WindowOpeningLines.py:50 .\Openings\WindowOpenings.py:305 -#: .\Swiss\WSwisses.py:44 .\Tournaments\WTournament.py:157 +#: .\Swiss\WSwisses.py:42 .\Tournaments\WTournament.py:157 #: .\Tournaments\WTournaments.py:46 msgid "Copy" msgstr "" @@ -2470,9 +2473,9 @@ msgstr "" #: .\Books\WBooksTrainOL.py:201 .\Books\WBooksTrainOL.py:565 #: .\Books\WFactory.py:129 .\Coordinates\WCoordinatesBasic.py:59 #: .\Coordinates\WCoordinatesBlocks.py:59 -#: .\CountsCaptures\WCountsCaptures.py:106 .\Databases\WDB_Games.py:600 +#: .\CountsCaptures\WCountsCaptures.py:106 .\Databases\WDB_Games.py:667 #: .\Engines\WindowSTS.py:753 .\Expeditions\WindowEverest.py:414 -#: .\GM\WindowGM.py:826 .\LearnGame\WindowLearnGame.py:152 +#: .\GM\WindowGM.py:827 .\LearnGame\WindowLearnGame.py:152 #: .\LearnGame\WindowLearnGame.py:308 .\LearnGame\WindowPlayGame.py:190 #: .\LearnGame\WindowPlayGame.py:328 .\Mate15\WMate15.py:76 #: .\Openings\WindowOpeningLines.py:276 .\QT\WindowDailyTest.py:170 @@ -2490,27 +2493,27 @@ msgstr "" msgid "Paste FEN position" msgstr "" -#: .\Books\WBooksTrainOL.py:323 .\Openings\WindowOpeningLine.py:1467 +#: .\Books\WBooksTrainOL.py:323 .\Openings\WindowOpeningLine.py:1484 msgid "Max lines to parse" msgstr "" -#: .\Books\WBooksTrainOL.py:331 .\Openings\WindowOpeningLine.py:1475 +#: .\Books\WBooksTrainOL.py:331 .\Openings\WindowOpeningLine.py:1492 msgid "0=no limit" msgstr "" -#: .\Books\WBooksTrainOL.py:338 .\Openings\WindowOpeningLine.py:1482 +#: .\Books\WBooksTrainOL.py:338 .\Openings\WindowOpeningLine.py:1499 msgid "Limits" msgstr "" #: .\Books\WBooksTrainOL.py:391 .\Databases\WDB_Players.py:429 -#: .\Databases\WDB_Players.py:499 .\Manager.py:1331 .\ManagerEntPos.py:593 -#: .\Openings\OpeningLines.py:934 .\Openings\OpeningLines.py:999 -#: .\Openings\OpeningLines.py:1067 .\Openings\WindowOpeningLine.py:1549 -#: .\Procesador.py:655 .\QT\QTUtil2.py:265 +#: .\Databases\WDB_Players.py:499 .\Manager.py:1331 .\ManagerEntPos.py:617 +#: .\Openings\OpeningLines.py:936 .\Openings\OpeningLines.py:1001 +#: .\Openings\OpeningLines.py:1069 .\Openings\WindowOpeningLine.py:1566 +#: .\Procesador.py:655 .\QT\QTUtil2.py:268 msgid "Working..." msgstr "" -#: .\Books\WBooksTrainOL.py:423 .\Openings\WindowOpeningLine.py:1573 +#: .\Books\WBooksTrainOL.py:423 .\Openings\WindowOpeningLine.py:1590 msgid "There is no lines" msgstr "" @@ -2546,7 +2549,7 @@ msgid "Polyglot book factory" msgstr "" #: .\Books\WFactory.py:48 .\Engines\WindowSTS.py:817 .\Leagues\WLeagues.py:41 -#: .\Openings\WindowOpeningLines.py:52 .\Swiss\WSwisses.py:42 +#: .\Openings\WindowOpeningLines.py:52 .\Swiss\WSwisses.py:40 #: .\Tournaments\WTournaments.py:44 msgid "Rename" msgstr "" @@ -2571,16 +2574,16 @@ msgstr "" msgid "Weight" msgstr "" -#: .\Books\WPolyglot.py:50 .\LearnGame\WindowLearnGame.py:79 .\Manager.py:1583 +#: .\Books\WPolyglot.py:50 .\LearnGame\WindowLearnGame.py:79 .\Manager.py:1580 #: .\Voyager\Voyager.py:119 .\Voyager\Voyager.py:715 msgid "Learn" msgstr "" #: .\Books\WPolyglot.py:57 .\Endings\WEndingsGTB.py:66 -#: .\Kibitzers\WKibBooks.py:33 .\Kibitzers\WKibEngine.py:53 -#: .\Kibitzers\WKibGaviota.py:31 .\Kibitzers\WKibIndex.py:69 -#: .\MainWindow\WBase.py:164 .\Openings\WindowOpenings.py:61 -#: .\Voyager\Voyager.py:765 +#: .\Kibitzers\WKibBooks.py:33 .\Kibitzers\WKibDatabases.py:79 +#: .\Kibitzers\WKibEngine.py:53 .\Kibitzers\WKibGaviota.py:31 +#: .\Kibitzers\WKibIndex.py:69 .\MainWindow\WBase.py:164 +#: .\Openings\WindowOpenings.py:61 .\Voyager\Voyager.py:765 msgid "Takeback" msgstr "" @@ -2615,13 +2618,13 @@ msgid "Competition with tutor" msgstr "" #: .\CompetitionWithTutor\ManagerCompeticion.py:101 -#: .\CompetitionWithTutor\ManagerCompeticion.py:299 +#: .\CompetitionWithTutor\ManagerCompeticion.py:301 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:39 msgid "Total score" msgstr "" #: .\CompetitionWithTutor\ManagerCompeticion.py:101 -#: .\CompetitionWithTutor\ManagerCompeticion.py:303 +#: .\CompetitionWithTutor\ManagerCompeticion.py:305 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:39 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:43 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:92 @@ -2632,9 +2635,10 @@ msgstr "" #: .\CompetitionWithTutor\ManagerCompeticion.py:101 #: .\CompetitionWithTutor\WCompetitionWithTutor.py:213 -#: .\Engines\WConfEngines.py:58 .\Manager.py:947 -#: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:1488 .\Procesador.py:282 -#: .\Tutor\WindowTutor.py:22 .\Washing\ManagerWashing.py:501 +#: .\Engines\WConfEngines.py:58 .\Kibitzers\WKibDatabases.py:34 +#: .\Manager.py:947 .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:1488 +#: .\Procesador.py:282 .\Tutor\WindowTutor.py:22 +#: .\Washing\ManagerWashing.py:501 msgid "Tutor" msgstr "" @@ -2656,13 +2660,13 @@ msgstr "" msgid "Do you want to adjourn the game?" msgstr "" -#: .\CompetitionWithTutor\ManagerCompeticion.py:183 +#: .\CompetitionWithTutor\ManagerCompeticion.py:184 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:675 #: .\PlayHuman\ManagerPlayHuman.py:317 msgid "End game?" msgstr "" -#: .\CompetitionWithTutor\ManagerCompeticion.py:197 +#: .\CompetitionWithTutor\ManagerCompeticion.py:199 #: .\Competitions\ManagerElo.py:440 .\Competitions\ManagerFideFics.py:226 #: .\Competitions\ManagerMicElo.py:361 .\Competitions\ManagerWicker.py:360 #: .\Leagues\ManagerLeague.py:347 .\PlayAgainstEngine\ManagerAlbum.py:146 @@ -2672,11 +2676,11 @@ msgstr "" msgid "Do you want to resign?" msgstr "" -#: .\CompetitionWithTutor\ManagerCompeticion.py:210 +#: .\CompetitionWithTutor\ManagerCompeticion.py:212 msgid "Do you want to go back in the last movement?" msgstr "" -#: .\CompetitionWithTutor\ManagerCompeticion.py:291 +#: .\CompetitionWithTutor\ManagerCompeticion.py:293 msgid "Move to the next level" msgstr "" @@ -2707,7 +2711,7 @@ msgid "Training unit" msgstr "" #: .\Competitions\ManagerElo.py:332 .\Competitions\ManagerMicElo.py:207 -#: .\Competitions\ManagerWicker.py:204 .\Databases\WDB_Games.py:981 +#: .\Competitions\ManagerWicker.py:204 .\Databases\WDB_Games.py:1064 #: .\Databases\WDB_Players.py:120 .\Databases\WDB_Players.py:123 #: .\Databases\WDB_Players.py:135 .\Databases\WDB_Players.py:138 #: .\Databases\WDB_Summary.py:63 .\Databases\WDB_Summary.py:66 @@ -2719,7 +2723,7 @@ msgid "Win" msgstr "" #: .\Competitions\ManagerElo.py:338 .\Competitions\ManagerMicElo.py:213 -#: .\Competitions\ManagerWicker.py:210 .\Databases\WDB_Games.py:983 +#: .\Competitions\ManagerWicker.py:210 .\Databases\WDB_Games.py:1066 #: .\Databases\WDB_Players.py:122 .\Databases\WDB_Players.py:125 #: .\Databases\WDB_Players.py:137 .\Databases\WDB_Players.py:140 #: .\Databases\WDB_Summary.py:65 .\Databases\WDB_Summary.py:68 @@ -2731,7 +2735,7 @@ msgid "Loss" msgstr "" #: .\Competitions\ManagerElo.py:348 .\Competitions\ManagerElo.py:373 -#: .\Config\WindowConfig.py:202 .\Engines\SelectEngines.py:44 +#: .\Config\WindowConfig.py:204 .\Engines\SelectEngines.py:44 #: .\Engines\SelectEngines.py:289 .\Engines\WEngines.py:283 #: .\Menus\BasicMenus.py:183 msgid "Lucas-Elo" @@ -2745,7 +2749,7 @@ msgstr "" msgid "Fics-player" msgstr "" -#: .\Competitions\ManagerFideFics.py:45 .\Config\WindowConfig.py:208 +#: .\Competitions\ManagerFideFics.py:45 .\Config\WindowConfig.py:210 #: .\Menus\BasicMenus.py:191 .\QT\QTVarios.py:772 msgid "Fics-Elo" msgstr "" @@ -2758,7 +2762,7 @@ msgstr "" msgid "Fide-player" msgstr "" -#: .\Competitions\ManagerFideFics.py:55 .\Config\WindowConfig.py:210 +#: .\Competitions\ManagerFideFics.py:55 .\Config\WindowConfig.py:212 #: .\Menus\BasicMenus.py:198 .\QT\QTVarios.py:826 msgid "Fide-Elo" msgstr "" @@ -2771,7 +2775,7 @@ msgstr "" msgid "Lichess-player" msgstr "" -#: .\Competitions\ManagerFideFics.py:65 .\Config\WindowConfig.py:212 +#: .\Competitions\ManagerFideFics.py:65 .\Config\WindowConfig.py:214 #: .\Menus\BasicMenus.py:204 msgid "Lichess-Elo" msgstr "" @@ -2791,7 +2795,7 @@ msgid "book move" msgstr "" #: .\Competitions\ManagerMicElo.py:229 .\Competitions\ManagerMicElo.py:338 -#: .\Competitions\ManagerWicker.py:226 .\Config\WindowConfig.py:204 +#: .\Competitions\ManagerWicker.py:226 .\Config\WindowConfig.py:206 #: .\Menus\BasicMenus.py:185 msgid "Tourney-Elo" msgstr "" @@ -2800,143 +2804,143 @@ msgstr "" msgid "New Tourney-Elo" msgstr "" -#: .\Competitions\ManagerWicker.py:336 .\Config\WindowConfig.py:206 +#: .\Competitions\ManagerWicker.py:336 .\Config\WindowConfig.py:208 #: .\Engines\SelectEngines.py:41 .\Engines\WEngines.py:303 #: .\Menus\BasicMenus.py:187 msgid "The Wicker Park Tourney" msgstr "" -#: .\Config\Configuration.py:638 +#: .\Config\Configuration.py:640 msgid "Default analyzer" msgstr "" -#: .\Config\WindowConfig.py:12 .\Procesador.py:641 +#: .\Config\WindowConfig.py:13 .\Procesador.py:641 msgid "General configuration" msgstr "" -#: .\Config\WindowConfig.py:17 .\Config\WindowConfig.py:345 +#: .\Config\WindowConfig.py:18 .\Config\WindowConfig.py:348 msgid "Player's name" msgstr "" -#: .\Config\WindowConfig.py:19 +#: .\Config\WindowConfig.py:20 msgid "Window style" msgstr "" -#: .\Config\WindowConfig.py:28 +#: .\Config\WindowConfig.py:29 msgid "Type of icons" msgstr "" -#: .\Config\WindowConfig.py:32 .\Menus\BasicMenus.py:150 +#: .\Config\WindowConfig.py:33 .\Menus\BasicMenus.py:150 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:260 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:610 .\Procesador.py:944 msgid "Play against an engine" msgstr "" -#: .\Config\WindowConfig.py:33 .\Engines\SelectEngines.py:43 +#: .\Config\WindowConfig.py:34 .\Engines\SelectEngines.py:43 #: .\Menus\BasicMenus.py:153 .\PlayAgainstEngine\ManagerPerson.py:145 msgid "Opponents for young players" msgstr "" -#: .\Config\WindowConfig.py:36 +#: .\Config\WindowConfig.py:37 msgid "Menu Play" msgstr "" -#: .\Config\WindowConfig.py:39 +#: .\Config\WindowConfig.py:40 msgid "Use native dialog to select files" msgstr "" -#: .\Config\WindowConfig.py:42 +#: .\Config\WindowConfig.py:43 msgid "Activate translator help mode" msgstr "" -#: .\Config\WindowConfig.py:47 +#: .\Config\WindowConfig.py:48 msgid "Check for updates at startup" msgstr "" -#: .\Config\WindowConfig.py:49 .\Config\WindowConfig.py:154 +#: .\Config\WindowConfig.py:50 .\Config\WindowConfig.py:156 #: .\Procesador.py:666 msgid "General" msgstr "" -#: .\Config\WindowConfig.py:53 .\Manager.py:1444 +#: .\Config\WindowConfig.py:54 .\Manager.py:1444 msgid "After each opponent move" msgstr "" -#: .\Config\WindowConfig.py:54 .\Manager.py:1445 +#: .\Config\WindowConfig.py:55 .\Manager.py:1445 msgid "Sound a beep" msgstr "" -#: .\Config\WindowConfig.py:55 .\Manager.py:1446 +#: .\Config\WindowConfig.py:56 .\Manager.py:1446 msgid "Play customised sounds" msgstr "" -#: .\Config\WindowConfig.py:57 .\Manager.py:1448 +#: .\Config\WindowConfig.py:58 .\Manager.py:1448 msgid "The same for player moves" msgstr "" -#: .\Config\WindowConfig.py:59 .\Menus\BasicMenus.py:98 +#: .\Config\WindowConfig.py:60 .\Menus\BasicMenus.py:98 #: .\Tournaments\WTournaments.py:23 .\Tournaments\WTournaments.py:116 msgid "Tournaments between engines" msgstr "" -#: .\Config\WindowConfig.py:62 .\Manager.py:1451 +#: .\Config\WindowConfig.py:63 .\Manager.py:1451 msgid "When finishing the game" msgstr "" -#: .\Config\WindowConfig.py:63 .\Manager.py:1452 +#: .\Config\WindowConfig.py:64 .\Manager.py:1452 msgid "Play customised sounds for the result" msgstr "" -#: .\Config\WindowConfig.py:66 .\Databases\WDB_Players.py:36 +#: .\Config\WindowConfig.py:67 .\Databases\WDB_Players.py:36 #: .\Engines\WConfEngines.py:60 .\Manager.py:1455 msgid "Others" msgstr "" -#: .\Config\WindowConfig.py:67 .\Manager.py:1456 +#: .\Config\WindowConfig.py:68 .\Manager.py:1456 msgid "Play a beep when there is an error in tactic trainings" msgstr "" -#: .\Config\WindowConfig.py:69 .\Manager.py:1306 .\Manager.py:1458 +#: .\Config\WindowConfig.py:70 .\Manager.py:1306 .\Manager.py:1458 msgid "Sounds" msgstr "" -#: .\Config\WindowConfig.py:73 +#: .\Config\WindowConfig.py:74 msgid "Visual effects" msgstr "" -#: .\Config\WindowConfig.py:80 +#: .\Config\WindowConfig.py:81 msgid "Speed" msgstr "" -#: .\Config\WindowConfig.py:89 +#: .\Config\WindowConfig.py:90 msgid "Fixed type: you must always indicate origin and destination" msgstr "" -#: .\Config\WindowConfig.py:90 +#: .\Config\WindowConfig.py:91 msgid "Predictive type: program tries to guess your intention" msgstr "" -#: .\Config\WindowConfig.py:92 +#: .\Config\WindowConfig.py:93 msgid "Mouse shortcuts" msgstr "" -#: .\Config\WindowConfig.py:93 +#: .\Config\WindowConfig.py:94 msgid "Show candidates" msgstr "" -#: .\Config\WindowConfig.py:95 +#: .\Config\WindowConfig.py:96 msgid "Key for copying the FEN to clipboard" msgstr "" -#: .\Config\WindowConfig.py:96 +#: .\Config\WindowConfig.py:97 msgid "Backward" msgstr "" -#: .\Config\WindowConfig.py:96 +#: .\Config\WindowConfig.py:97 msgid "Forward" msgstr "" -#: .\Config\WindowConfig.py:97 .\Config\WindowConfig.py:186 +#: .\Config\WindowConfig.py:98 .\Config\WindowConfig.py:188 msgid "Scroll direction with the mouse wheel" msgstr "" @@ -2946,15 +2950,19 @@ msgid "" "ALT key allows to change" msgstr "" -#: .\Config\WindowConfig.py:102 +#: .\Config\WindowConfig.py:100 +msgid "Margin of pieces in square" +msgstr "" + +#: .\Config\WindowConfig.py:104 msgid "Show cursor when engine is thinking" msgstr "" -#: .\Config\WindowConfig.py:105 +#: .\Config\WindowConfig.py:107 msgid "developed by" msgstr "" -#: .\Config\WindowConfig.py:108 .\Config\WindowConfig.py:123 +#: .\Config\WindowConfig.py:110 .\Config\WindowConfig.py:125 #: .\Director\WindowDirector.py:304 .\Engines\WEngines.py:360 #: .\Engines\WindowSTS.py:504 .\GM\WindowGM.py:642 #: .\Openings\WindowOpeningLine.py:758 .\Openings\WindowOpenings.py:153 @@ -2962,191 +2970,191 @@ msgstr "" msgid "None" msgstr "" -#: .\Config\WindowConfig.py:109 .\Config\WindowConfig.py:124 +#: .\Config\WindowConfig.py:111 .\Config\WindowConfig.py:126 msgid "Certabo" msgstr "" -#: .\Config\WindowConfig.py:110 .\Config\WindowConfig.py:125 +#: .\Config\WindowConfig.py:112 .\Config\WindowConfig.py:127 msgid "Chessnut" msgstr "" -#: .\Config\WindowConfig.py:111 .\Config\WindowConfig.py:126 +#: .\Config\WindowConfig.py:113 .\Config\WindowConfig.py:128 msgid "DGT" msgstr "" -#: .\Config\WindowConfig.py:112 +#: .\Config\WindowConfig.py:114 msgid "DGT (Alternative)" msgstr "" -#: .\Config\WindowConfig.py:113 .\Config\WindowConfig.py:127 +#: .\Config\WindowConfig.py:115 .\Config\WindowConfig.py:129 msgid "DGT Pegasus" msgstr "" -#: .\Config\WindowConfig.py:114 .\Config\WindowConfig.py:128 +#: .\Config\WindowConfig.py:116 .\Config\WindowConfig.py:130 msgid "Millennium" msgstr "" -#: .\Config\WindowConfig.py:115 .\Config\WindowConfig.py:129 +#: .\Config\WindowConfig.py:117 .\Config\WindowConfig.py:131 msgid "Novag Citrine" msgstr "" -#: .\Config\WindowConfig.py:116 .\Config\WindowConfig.py:130 +#: .\Config\WindowConfig.py:118 .\Config\WindowConfig.py:132 msgid "Novag UCB" msgstr "" -#: .\Config\WindowConfig.py:117 .\Config\WindowConfig.py:131 +#: .\Config\WindowConfig.py:119 .\Config\WindowConfig.py:133 msgid "Saitek" msgstr "" -#: .\Config\WindowConfig.py:118 .\Config\WindowConfig.py:132 +#: .\Config\WindowConfig.py:120 .\Config\WindowConfig.py:134 msgid "Square Off Pro" msgstr "" -#: .\Config\WindowConfig.py:119 .\Config\WindowConfig.py:133 +#: .\Config\WindowConfig.py:121 .\Config\WindowConfig.py:135 msgid "Tabutronic" msgstr "" -#: .\Config\WindowConfig.py:135 +#: .\Config\WindowConfig.py:137 msgid "Digital board" msgstr "" -#: .\Config\WindowConfig.py:138 +#: .\Config\WindowConfig.py:140 msgid "Show configuration icon" msgstr "" -#: .\Config\WindowConfig.py:139 .\Director\WindowTabVMarkers.py:70 +#: .\Config\WindowConfig.py:141 .\Director\WindowTabVMarkers.py:70 #: .\Director\WindowTabVMarkers.py:71 msgid "Top" msgstr "" -#: .\Config\WindowConfig.py:139 .\Director\WindowTabVMarkers.py:72 +#: .\Config\WindowConfig.py:141 .\Director\WindowTabVMarkers.py:72 #: .\Director\WindowTabVMarkers.py:73 msgid "Bottom" msgstr "" -#: .\Config\WindowConfig.py:140 +#: .\Config\WindowConfig.py:142 msgid "Configuration icon position" msgstr "" -#: .\Config\WindowConfig.py:143 +#: .\Config\WindowConfig.py:145 msgid "Show icon" msgstr "" -#: .\Config\WindowConfig.py:143 +#: .\Config\WindowConfig.py:145 msgid "Show nothing" msgstr "" -#: .\Config\WindowConfig.py:144 +#: .\Config\WindowConfig.py:146 msgid "When position has graphic information" msgstr "" -#: .\Config\WindowConfig.py:146 .\Manager.py:1322 +#: .\Config\WindowConfig.py:148 .\Manager.py:1322 msgid "Live graphics with the right mouse button" msgstr "" -#: .\Config\WindowConfig.py:148 +#: .\Config\WindowConfig.py:150 msgid "Boards" msgstr "" -#: .\Config\WindowConfig.py:156 .\Config\WindowConfig.py:160 -#: .\Config\WindowConfig.py:165 .\Config\WindowConfig.py:183 +#: .\Config\WindowConfig.py:158 .\Config\WindowConfig.py:162 +#: .\Config\WindowConfig.py:167 .\Config\WindowConfig.py:185 msgid "Font size" msgstr "" -#: .\Config\WindowConfig.py:159 +#: .\Config\WindowConfig.py:161 msgid "Menus" msgstr "" -#: .\Config\WindowConfig.py:164 +#: .\Config\WindowConfig.py:166 msgid "Toolbars" msgstr "" -#: .\Config\WindowConfig.py:168 +#: .\Config\WindowConfig.py:170 msgid "Only display the icon" msgstr "" -#: .\Config\WindowConfig.py:169 +#: .\Config\WindowConfig.py:171 msgid "Only display the text" msgstr "" -#: .\Config\WindowConfig.py:170 +#: .\Config\WindowConfig.py:172 msgid "The text appears beside the icon" msgstr "" -#: .\Config\WindowConfig.py:171 +#: .\Config\WindowConfig.py:173 msgid "The text appears under the icon" msgstr "" -#: .\Config\WindowConfig.py:173 +#: .\Config\WindowConfig.py:175 msgid "Icons" msgstr "" -#: .\Config\WindowConfig.py:175 .\Config\WindowConfig.py:198 -#: .\Databases\WDB_Games.py:735 +#: .\Config\WindowConfig.py:177 .\Config\WindowConfig.py:200 +#: .\Databases\WDB_Games.py:810 msgid "Appearance" msgstr "" -#: .\Config\WindowConfig.py:180 +#: .\Config\WindowConfig.py:182 msgid "PGN table" msgstr "" -#: .\Config\WindowConfig.py:181 .\QT\GridEditCols.py:44 +#: .\Config\WindowConfig.py:183 .\QT\GridEditCols.py:45 msgid "Width" msgstr "" -#: .\Config\WindowConfig.py:182 +#: .\Config\WindowConfig.py:184 msgid "Height of each row" msgstr "" -#: .\Config\WindowConfig.py:184 +#: .\Config\WindowConfig.py:186 msgid "PGN always in English" msgstr "" -#: .\Config\WindowConfig.py:185 +#: .\Config\WindowConfig.py:187 msgid "PGN with figurines" msgstr "" -#: .\Config\WindowConfig.py:189 +#: .\Config\WindowConfig.py:191 msgid "Enable captured material window by default" msgstr "" -#: .\Config\WindowConfig.py:190 +#: .\Config\WindowConfig.py:192 msgid "Enable information panel by default" msgstr "" -#: .\Config\WindowConfig.py:191 +#: .\Config\WindowConfig.py:193 msgid "Enable analysis bar by default" msgstr "" -#: .\Config\WindowConfig.py:192 .\Manager.py:1281 +#: .\Config\WindowConfig.py:194 .\Manager.py:1281 msgid "Arrow with the best move when there is an analysis" msgstr "" -#: .\Config\WindowConfig.py:194 +#: .\Config\WindowConfig.py:196 msgid "Font size of information labels" msgstr "" -#: .\Config\WindowConfig.py:196 +#: .\Config\WindowConfig.py:198 msgid "Enable high dpi scaling" msgstr "" -#: .\Config\WindowConfig.py:214 +#: .\Config\WindowConfig.py:216 msgid "Change elos" msgstr "" -#: .\Config\WindowConfig.py:309 .\Config\WindowConfig.py:320 +#: .\Config\WindowConfig.py:312 .\Config\WindowConfig.py:323 msgid "Are you sure %s is the correct driver ?" msgstr "" -#: .\Config\WindowConfig.py:310 .\Config\WindowConfig.py:321 +#: .\Config\WindowConfig.py:313 .\Config\WindowConfig.py:324 msgid "WARNING: selecting the wrong driver might cause damage to your board." msgstr "" -#: .\Config\WindowConfig.py:311 .\Config\WindowConfig.py:322 +#: .\Config\WindowConfig.py:314 .\Config\WindowConfig.py:325 msgid "Proceed at your own risk." msgstr "" -#: .\Config\WindowConfig.py:323 +#: .\Config\WindowConfig.py:326 msgid "Please read the driver's user manual at:" msgstr "" @@ -3154,7 +3162,7 @@ msgstr "" msgid "Users" msgstr "" -#: .\Config\WindowUsuarios.py:45 .\MainWindow\LucasChessGui.py:143 +#: .\Config\WindowUsuarios.py:45 .\MainWindow\LucasChessGui.py:142 msgid "User" msgstr "" @@ -3194,14 +3202,14 @@ msgstr "" #: .\QT\WindowDailyTest.py:38 .\QT\WindowHorses.py:125 #: .\QT\WindowPotencia.py:398 .\QT\WindowPuente.py:291 #: .\QT\WindowVisualiza.py:42 .\SingularMoves\WindowSingularM.py:35 -#: .\Swiss\WSwisses.py:54 .\Tournaments\WTournaments.py:56 +#: .\Swiss\WSwisses.py:52 .\Tournaments\WTournaments.py:56 #: .\Translations\TrListas.py:22 .\Washing\WindowWashing.py:159 #: .\WritingDown\WritingDown.py:27 msgid "Date" msgstr "" #: .\Coordinates\WCoordinatesBasic.py:36 -#: .\Coordinates\WCoordinatesBlocks.py:39 .\Databases\WDB_Games.py:111 +#: .\Coordinates\WCoordinatesBlocks.py:39 .\Databases\WDB_Games.py:113 #: .\Databases\WDB_Summary.py:89 .\Director\WindowDirector.py:66 #: .\Endings\WEndingsGTB.py:48 .\Engines\WindowSTS.py:599 #: .\Leagues\WLeague.py:383 .\MainWindow\WBase.py:192 .\Mate15\WMate15.py:43 @@ -3220,7 +3228,7 @@ msgstr "" #: .\Endings\WEndingsGTB.py:460 .\Engines\WindowSTS.py:53 #: .\Engines\WindowSTS.py:271 .\Expeditions\WindowEverest.py:231 #: .\Maps\WindowWorkMap.py:69 .\Maps\WindowWorkMap.py:206 -#: .\Openings\ManagerOPLEngines.py:537 .\Openings\WindowOpeningLine.py:1221 +#: .\Openings\ManagerOPLEngines.py:537 .\Openings\WindowOpeningLine.py:1238 #: .\Routes\ManagerRoutes.py:557 .\Routes\ManagerRoutes.py:733 msgid "Done" msgstr "" @@ -3296,7 +3304,7 @@ msgid "Average" msgstr "" #: .\CountsCaptures\WCountsCaptures.py:76 .\Endings\WEndingsGTB.py:260 -#: .\Menus\MenuTrainings.py:754 .\PlayAgainstEngine\WPlayAgainstEngine.py:173 +#: .\Menus\MenuTrainings.py:758 .\PlayAgainstEngine\WPlayAgainstEngine.py:173 #: .\Tactics\WindowTactics.py:287 msgid "Random" msgstr "" @@ -3362,19 +3370,19 @@ msgstr "" msgid "Number of moves" msgstr "" -#: .\Databases\DBgames.py:919 +#: .\Databases\DBgames.py:949 msgid "This database does not allow games that are not complete." msgstr "" -#: .\Databases\DBgames.py:923 +#: .\Databases\DBgames.py:953 msgid "This database only allows positions." msgstr "" -#: .\Databases\DBgames.py:927 +#: .\Databases\DBgames.py:957 msgid "This database does not allows games without moves." msgstr "" -#: .\Databases\DBgames.py:1035 +#: .\Databases\DBgames.py:1065 msgid "This game is duplicated" msgstr "" @@ -3395,203 +3403,228 @@ msgstr "" msgid "Delete analysis of %1?" msgstr "" -#: .\Databases\WDB_Games.py:70 +#: .\Databases\WDB_Games.py:72 msgid "For a numerical sort, press Ctrl (Alt or Shift) while double-clicking on the header." msgstr "" -#: .\Databases\WDB_Games.py:84 .\Databases\WDB_Games.py:101 +#: .\Databases\WDB_Games.py:86 .\Databases\WDB_Games.py:103 msgid "First" msgstr "" -#: .\Databases\WDB_Games.py:86 .\Databases\WDB_Games.py:103 +#: .\Databases\WDB_Games.py:88 .\Databases\WDB_Games.py:105 msgid "Last" msgstr "" -#: .\Databases\WDB_Games.py:88 .\Databases\WDB_Games.py:99 -#: .\Databases\WDB_Games.py:265 .\Databases\WDB_Utils.py:26 +#: .\Databases\WDB_Games.py:90 .\Databases\WDB_Games.py:101 +#: .\Databases\WDB_Games.py:267 .\Databases\WDB_Utils.py:26 #: .\Databases\WDB_Utils.py:155 .\Databases\WDB_Utils.py:287 msgid "Filter" msgstr "" -#: .\Databases\WDB_Games.py:97 +#: .\Databases\WDB_Games.py:99 msgid "Add a new game" msgstr "" -#: .\Databases\WDB_Games.py:133 .\LearnGame\WindowLearnGame.py:206 +#: .\Databases\WDB_Games.py:135 .\LearnGame\WindowLearnGame.py:206 #: .\Menus\MenuTrainings.py:225 msgid "Learn a game" msgstr "" -#: .\Databases\WDB_Games.py:134 .\Manager.py:1583 .\Menus\MenuTrainings.py:226 +#: .\Databases\WDB_Games.py:136 .\Manager.py:1580 .\Menus\MenuTrainings.py:226 msgid "Memorizing their moves" msgstr "" -#: .\Databases\WDB_Games.py:136 .\Menus\MenuTrainings.py:228 +#: .\Databases\WDB_Games.py:138 .\Menus\MenuTrainings.py:228 msgid "Playing against" msgstr "" -#: .\Databases\WDB_Games.py:138 .\Databases\WDB_Utils.py:345 -#: .\ManagerEntPos.py:223 +#: .\Databases\WDB_Games.py:140 .\Databases\WDB_Utils.py:345 +#: .\ManagerEntPos.py:244 msgid "Create tactics training" msgstr "" -#: .\Databases\WDB_Games.py:140 .\Databases\WDB_Games.py:953 +#: .\Databases\WDB_Games.py:142 .\Databases\WDB_Games.py:1036 #: .\GM\ManagerGM.py:515 .\GM\WindowGM.py:32 .\Menus\MenuTrainings.py:206 msgid "Play like a Grandmaster" msgstr "" -#: .\Databases\WDB_Games.py:141 .\Databases\WDB_Games.py:954 +#: .\Databases\WDB_Games.py:143 .\Databases\WDB_Games.py:1037 msgid "Create training to %1" msgstr "" -#: .\Databases\WDB_Games.py:194 +#: .\Databases\WDB_Games.py:196 msgid "Row ID" msgstr "" -#: .\Databases\WDB_Games.py:350 .\Databases\WDB_Games.py:927 +#: .\Databases\WDB_Games.py:367 .\Databases\WDB_Games.py:1008 msgid "Go to the record" msgstr "" -#: .\Databases\WDB_Games.py:360 +#: .\Databases\WDB_Games.py:377 msgid "Changes have been made, do you want to export them to a PGN file?" msgstr "" -#: .\Databases\WDB_Games.py:515 .\Tournaments\WTournament.py:820 +#: .\Databases\WDB_Games.py:532 .\Tournaments\WTournament.py:820 msgid "Reading the game" msgstr "" -#: .\Databases\WDB_Games.py:521 +#: .\Databases\WDB_Games.py:538 msgid "This game is wrong and can not be edited" msgstr "" -#: .\Databases\WDB_Games.py:584 +#: .\Databases\WDB_Games.py:601 msgid "Standard" msgstr "" -#: .\Databases\WDB_Games.py:586 .\GM\WindowGM.py:206 +#: .\Databases\WDB_Games.py:603 .\GM\WindowGM.py:206 #: .\PlayAgainstEngine\WPlayAgainstEngine.py:465 msgid "Advanced" msgstr "" -#: .\Databases\WDB_Games.py:591 +#: .\Databases\WDB_Games.py:607 +msgid "By position" +msgstr "" + +#: .\Databases\WDB_Games.py:610 msgid "Remove filter" msgstr "" -#: .\Databases\WDB_Games.py:616 +#: .\Databases\WDB_Games.py:617 .\Databases\WDB_Games.py:628 +msgid "Indexing..." +msgstr "" + +#: .\Databases\WDB_Games.py:639 +msgid "A position index file needs to be created, which can be a lengthy process, shall we continue?" +msgstr "" + +#: .\Databases\WDB_Games.py:658 +msgid "No game has been found with this position" +msgstr "" + +#: .\Databases\WDB_Games.py:683 msgid "From a PGN file" msgstr "" -#: .\Databases\WDB_Games.py:618 +#: .\Databases\WDB_Games.py:685 msgid "From other database" msgstr "" -#: .\Databases\WDB_Games.py:621 .\Databases\WDB_Games.py:1370 +#: .\Databases\WDB_Games.py:688 .\Databases\WDB_Games.py:1507 msgid "From the Lichess Puzzle Database" msgstr "" -#: .\Databases\WDB_Games.py:634 +#: .\Databases\WDB_Games.py:701 msgid "To a PGN file" msgstr "" -#: .\Databases\WDB_Games.py:635 .\Databases\WDB_Games.py:644 +#: .\Databases\WDB_Games.py:702 .\Databases\WDB_Games.py:710 +#: .\Databases\WDB_Games.py:719 msgid "All registers" msgstr "" -#: .\Databases\WDB_Games.py:643 +#: .\Databases\WDB_Games.py:709 .\Databases\WDB_Games.py:1372 +msgid "To a CSV file" +msgstr "" + +#: .\Databases\WDB_Games.py:718 msgid "To other database" msgstr "" -#: .\Databases\WDB_Games.py:653 +#: .\Databases\WDB_Games.py:728 msgid "To a position sheet in ODF format" msgstr "" -#: .\Databases\WDB_Games.py:729 +#: .\Databases\WDB_Games.py:804 msgid "Database options" msgstr "" -#: .\Databases\WDB_Games.py:732 .\Databases\WDB_Games.py:1722 +#: .\Databases\WDB_Games.py:807 .\Databases\WDB_Games.py:1859 msgid "Tags" msgstr "" -#: .\Databases\WDB_Games.py:738 +#: .\Databases\WDB_Games.py:813 msgid "Resize all columns to contents" msgstr "" -#: .\Databases\WDB_Games.py:740 +#: .\Databases\WDB_Games.py:815 msgid "Configure the columns" msgstr "" -#: .\Databases\WDB_Games.py:745 +#: .\Databases\WDB_Games.py:820 msgid "Graphic elements (Director)" msgstr "" -#: .\Databases\WDB_Games.py:746 +#: .\Databases\WDB_Games.py:821 msgid "Show always" msgstr "" -#: .\Databases\WDB_Games.py:747 .\Databases\WDB_Games.py:752 -#: .\ManagerGame.py:75 .\ManagerSolo.py:174 .\QT\QTUtil2.py:665 +#: .\Databases\WDB_Games.py:822 .\Databases\WDB_Games.py:827 +#: .\ManagerGame.py:75 .\ManagerSolo.py:174 .\QT\QTUtil2.py:727 #: .\QT\WindowVisualiza.py:102 .\Tactics\WindowTactics.py:320 #: .\setup_linux.py:193 msgid "Yes" msgstr "" -#: .\Databases\WDB_Games.py:749 .\Databases\WDB_Games.py:754 -#: .\ManagerGame.py:75 .\ManagerSolo.py:174 .\QT\QTUtil2.py:667 +#: .\Databases\WDB_Games.py:824 .\Databases\WDB_Games.py:829 +#: .\ManagerGame.py:75 .\ManagerSolo.py:174 .\QT\QTUtil2.py:729 #: .\QT\WindowVisualiza.py:102 .\Tactics\WindowTactics.py:320 #: .\setup_linux.py:193 msgid "No" msgstr "" -#: .\Databases\WDB_Games.py:751 +#: .\Databases\WDB_Games.py:826 msgid "Specific to this database" msgstr "" -#: .\Databases\WDB_Games.py:918 +#: .\Databases\WDB_Games.py:999 msgid "Resizing" msgstr "" -#: .\Databases\WDB_Games.py:931 +#: .\Databases\WDB_Games.py:1012 msgid "Create a polyglot book" msgstr "" -#: .\Databases\WDB_Games.py:933 .\Themes\WDB_Theme_Analysis.py:122 +#: .\Databases\WDB_Games.py:1014 .\Themes\WDB_Theme_Analysis.py:122 msgid "Statistics on tactical themes" msgstr "" -#: .\Databases\WDB_Games.py:935 .\Databases\WDB_Games.py:1194 -#: .\Databases\WDB_Games.py:1197 +#: .\Databases\WDB_Games.py:1016 .\Databases\WDB_Games.py:1276 +#: .\Databases\WDB_Games.py:1279 msgid "Remove duplicates" msgstr "" -#: .\Databases\WDB_Games.py:938 +#: .\Databases\WDB_Games.py:1018 +msgid "Regenerate index positions file" +msgstr "" + +#: .\Databases\WDB_Games.py:1021 msgid "Pack database" msgstr "" -#: .\Databases\WDB_Games.py:959 +#: .\Databases\WDB_Games.py:1042 msgid "Training name" msgstr "" -#: .\Databases\WDB_Games.py:980 +#: .\Databases\WDB_Games.py:1063 msgid "Any" msgstr "" -#: .\Databases\WDB_Games.py:998 .\Director\WindowTabVCircles.py:115 +#: .\Databases\WDB_Games.py:1081 .\Director\WindowTabVCircles.py:115 #: .\Director\WindowTabVFlechas.py:180 .\Director\WindowTabVMarcos.py:120 #: .\Director\WindowTabVMarkers.py:118 .\Director\WindowTabVSVGs.py:140 #: .\PlayAgainstEngine\Personalities.py:168 msgid "Name missing" msgstr "" -#: .\Databases\WDB_Games.py:1183 +#: .\Databases\WDB_Games.py:1265 msgid "Analyzing tactical themes" msgstr "" -#: .\Databases\WDB_Games.py:1188 +#: .\Databases\WDB_Games.py:1270 msgid "No themes were found in selected games!" msgstr "" -#: .\Databases\WDB_Games.py:1194 .\Endings\ManagerMate.py:441 +#: .\Databases\WDB_Games.py:1276 .\Endings\ManagerMate.py:441 #: .\Openings\WindowOpeningLine.py:179 .\QT\ShowPGN.py:146 #: .\Routes\WindowRoutes.py:218 .\Routes\WindowRoutes.py:228 #: .\SingularMoves\WindowSingularM.py:69 .\Washing\WindowWashing.py:243 @@ -3599,135 +3632,135 @@ msgstr "" msgid "Are you sure?" msgstr "" -#: .\Databases\WDB_Games.py:1325 +#: .\Databases\WDB_Games.py:1462 msgid "You must follow the next steps" msgstr "" -#: .\Databases\WDB_Games.py:1326 +#: .\Databases\WDB_Games.py:1463 msgid "Download the puzzles in csv format from LiChess website" msgstr "" -#: .\Databases\WDB_Games.py:1329 +#: .\Databases\WDB_Games.py:1466 msgid "Uncompress this file with a tool like PeaZip" msgstr "" -#: .\Databases\WDB_Games.py:1331 +#: .\Databases\WDB_Games.py:1468 msgid "Uncompress this file" msgstr "" -#: .\Databases\WDB_Games.py:1333 +#: .\Databases\WDB_Games.py:1470 msgid "If you want to include a field with the opening, you have to download and unzip in the same folder as the puzzle file, the file indicated below" msgstr "" -#: .\Databases\WDB_Games.py:1339 +#: .\Databases\WDB_Games.py:1476 msgid "Original idea and more information" msgstr "" -#: .\Databases\WDB_Games.py:1364 +#: .\Databases\WDB_Games.py:1501 msgid "The import takes a long time." msgstr "" -#: .\Databases\WDB_Games.py:1403 +#: .\Databases\WDB_Games.py:1540 msgid "Importing" msgstr "" -#: .\Databases\WDB_Games.py:1470 +#: .\Databases\WDB_Games.py:1607 msgid "New database" msgstr "" -#: .\Databases\WDB_Games.py:1500 .\Databases\WDB_Games.py:1542 +#: .\Databases\WDB_Games.py:1637 .\Databases\WDB_Games.py:1679 #: .\Engines\WindowSTS.py:52 .\Engines\WindowSTS.py:270 #: .\Openings\WindowOpeningLine.py:433 msgid "Group" msgstr "" -#: .\Databases\WDB_Games.py:1503 .\Databases\WDB_Games.py:1512 -#: .\Databases\WDB_Games.py:1527 +#: .\Databases\WDB_Games.py:1640 .\Databases\WDB_Games.py:1649 +#: .\Databases\WDB_Games.py:1664 msgid "Group lists" msgstr "" -#: .\Databases\WDB_Games.py:1509 .\Databases\WDB_Games.py:1524 +#: .\Databases\WDB_Games.py:1646 .\Databases\WDB_Games.py:1661 msgid "Subgroup" msgstr "" -#: .\Databases\WDB_Games.py:1542 +#: .\Databases\WDB_Games.py:1679 msgid "optional" msgstr "" -#: .\Databases\WDB_Games.py:1544 +#: .\Databases\WDB_Games.py:1681 msgid "Opening explorer depth (0=disable)" msgstr "" -#: .\Databases\WDB_Games.py:1549 +#: .\Databases\WDB_Games.py:1686 msgid "Store in an external folder" msgstr "" -#: .\Databases\WDB_Games.py:1559 +#: .\Databases\WDB_Games.py:1696 msgid "Allow complete games" msgstr "" -#: .\Databases\WDB_Games.py:1560 +#: .\Databases\WDB_Games.py:1697 msgid "Allow positions" msgstr "" -#: .\Databases\WDB_Games.py:1561 +#: .\Databases\WDB_Games.py:1698 msgid "Allow duplicates" msgstr "" -#: .\Databases\WDB_Games.py:1562 +#: .\Databases\WDB_Games.py:1699 msgid "Allow without moves" msgstr "" -#: .\Databases\WDB_Games.py:1571 +#: .\Databases\WDB_Games.py:1708 msgid "Import restrictions" msgstr "" -#: .\Databases\WDB_Games.py:1595 +#: .\Databases\WDB_Games.py:1732 msgid "Use an external folder" msgstr "" -#: .\Databases\WDB_Games.py:1601 +#: .\Databases\WDB_Games.py:1738 msgid "The folder must be outside the default folder" msgstr "" -#: .\Databases\WDB_Games.py:1649 +#: .\Databases\WDB_Games.py:1786 msgid "You must indicate a name" msgstr "" -#: .\Databases\WDB_Games.py:1666 .\Openings\WindowOpeningLines.py:176 +#: .\Databases\WDB_Games.py:1803 .\Openings\WindowOpeningLines.py:176 msgid "Unable to create the folder" msgstr "" -#: .\Databases\WDB_Games.py:1681 +#: .\Databases\WDB_Games.py:1818 msgid "This database already exists." msgstr "" -#: .\Databases\WDB_Games.py:1744 .\Menus\BasicMenus.py:258 -#: .\QT\GridEditCols.py:42 +#: .\Databases\WDB_Games.py:1881 .\Menus\BasicMenus.py:258 +#: .\QT\GridEditCols.py:43 msgid "Key" msgstr "" -#: .\Databases\WDB_Games.py:1746 +#: .\Databases\WDB_Games.py:1883 msgid "PGN Label" msgstr "" -#: .\Databases\WDB_Games.py:1749 +#: .\Databases\WDB_Games.py:1886 msgid "Fill column with value" msgstr "" -#: .\Databases\WDB_Games.py:1750 +#: .\Databases\WDB_Games.py:1887 msgid "Fill column with PGN" msgstr "" -#: .\Databases\WDB_Games.py:1751 +#: .\Databases\WDB_Games.py:1888 msgid "Remove column" msgstr "" -#: .\Databases\WDB_Games.py:1754 .\Director\TabVisual.py:375 +#: .\Databases\WDB_Games.py:1891 .\Director\TabVisual.py:375 msgid "Action" msgstr "" -#: .\Databases\WDB_Games.py:1798 +#: .\Databases\WDB_Games.py:1935 msgid "This tag is repeated" msgstr "" @@ -3793,7 +3826,7 @@ msgstr "" msgid "Basic position" msgstr "" -#: .\Databases\WDB_Summary.py:85 .\Manager.py:1548 .\QT\WindowArbol.py:596 +#: .\Databases\WDB_Summary.py:85 .\Manager.py:1545 .\QT\WindowArbol.py:596 msgid "Analyze" msgstr "" @@ -3857,7 +3890,7 @@ msgstr "" #: .\Databases\WDB_Utils.py:95 .\LearnGame\WindowLearnGame.py:450 #: .\LearnGame\WindowLearnGame.py:464 .\LearnGame\WindowLearnGame.py:473 #: .\MainWindow\WBase.py:163 .\Openings\WindowOpenings.py:60 -#: .\QT\GridEditCols.py:87 .\QT\WindowHorses.py:223 .\QT\WindowSavePGN.py:197 +#: .\QT\GridEditCols.py:88 .\QT\WindowHorses.py:223 .\QT\WindowSavePGN.py:197 msgid "Reinit" msgstr "" @@ -3898,7 +3931,7 @@ msgstr "" msgid "Skip the first move" msgstr "" -#: .\Databases\WDB_Utils.py:518 .\ManagerEntPos.py:648 +#: .\Databases\WDB_Utils.py:518 .\ManagerEntPos.py:672 msgid "Tactic training %s created." msgstr "" @@ -4019,7 +4052,7 @@ msgstr "" #: .\Engines\WConfEngines.py:498 .\Engines\WEngines.py:144 #: .\Engines\WEngines.py:342 .\Engines\WindowSTS.py:467 #: .\Kibitzers\WindowKibitzers.py:430 .\MainWindow\WBase.py:157 -#: .\Mate15\WMate15.py:25 .\Tournaments\WTournament.py:520 +#: .\Mate15\WMate15.py:25 .\QT\QTUtil2.py:717 .\Tournaments\WTournament.py:520 #: .\TurnOnLights\WindowTurnOnLights.py:55 msgid "Information" msgstr "" @@ -4061,7 +4094,7 @@ msgid "Clipboard" msgstr "" #: .\Director\WindowDirector.py:630 .\Director\WindowDirector.py:638 -#: .\Manager.py:1790 .\Manager.py:1831 .\ManagerSolo.py:287 +#: .\Manager.py:1787 .\Manager.py:1828 .\ManagerSolo.py:287 #: .\QT\WindowSavePGN.py:701 .\Washing\WindowWashing.py:310 msgid "Saved to %1" msgstr "" @@ -4102,7 +4135,7 @@ msgstr "" #: .\Director\WindowTabVCircles.py:54 .\Director\WindowTabVFlechas.py:76 #: .\Director\WindowTabVMarcos.py:53 .\Expeditions\WindowEverest.py:66 -#: .\QT\FormLayout.py:390 .\QT\WColors.py:42 .\Washing\WindowWashing.py:129 +#: .\QT\FormLayout.py:405 .\QT\WColors.py:42 .\Washing\WindowWashing.py:129 #: .\Washing\WindowWashing.py:154 .\WritingDown\WritingDown.py:28 msgid "Color" msgstr "" @@ -4196,12 +4229,12 @@ msgid "Delete box %1?" msgstr "" #: .\Director\WindowTabVMarkers.py:70 .\Director\WindowTabVMarkers.py:72 -#: .\QT\GridEditCols.py:46 +#: .\QT\GridEditCols.py:47 msgid "Left" msgstr "" #: .\Director\WindowTabVMarkers.py:71 .\Director\WindowTabVMarkers.py:73 -#: .\QT\GridEditCols.py:46 +#: .\QT\GridEditCols.py:47 msgid "Right" msgstr "" @@ -4253,13 +4286,13 @@ msgid "Endings with Gaviota Tablebases" msgstr "" #: .\Endings\WEndingsGTB.py:54 .\Endings\WEndingsGTB.py:161 -#: .\Kibitzers\WKibBooks.py:36 .\Kibitzers\WKibDatabases.py:54 +#: .\Kibitzers\WKibBooks.py:36 .\Kibitzers\WKibDatabases.py:77 #: .\Kibitzers\WKibEngine.py:62 .\Kibitzers\WKibGaviota.py:34 #: .\Kibitzers\WKibIndex.py:73 .\Kibitzers\WKibStEval.py:26 #: .\LearnGame\WindowLearnGame.py:456 .\MainWindow\WBase.py:127 #: .\MainWindow\WBase.py:378 .\MainWindow\WBase.py:413 .\Manager.py:1296 #: .\Manager.py:1313 .\Manager.py:1320 .\Manager.py:1344 -#: .\ManagerEntPos.py:207 .\Openings\ManagerOPL.py:22 +#: .\ManagerEntPos.py:228 .\Openings\ManagerOPL.py:22 #: .\Openings\ManagerOPL.py:29 .\Openings\ManagerOPLEngines.py:500 #: .\Openings\ManagerOPLEngines.py:503 .\Tactics\ManagerTactics.py:154 #: .\Voyager\Voyager.py:90 @@ -4275,14 +4308,14 @@ msgid "Restart" msgstr "" #: .\Endings\WEndingsGTB.py:165 .\Kibitzers\WKibBooks.py:37 -#: .\Kibitzers\WKibDatabases.py:55 .\Kibitzers\WKibEngine.py:63 +#: .\Kibitzers\WKibDatabases.py:78 .\Kibitzers\WKibEngine.py:63 #: .\Kibitzers\WKibGaviota.py:35 .\Kibitzers\WKibIndex.py:74 #: .\Kibitzers\WKibStEval.py:27 .\Leagues\WLeagueConfig.py:88 #: .\Leagues\WLeagueConfig.py:93 .\LearnGame\WindowLearnGame.py:456 #: .\MainWindow\WBase.py:127 .\MainWindow\WBase.py:199 #: .\MainWindow\WBase.py:378 .\MainWindow\WBase.py:413 .\Manager.py:1293 #: .\Manager.py:1313 .\Manager.py:1320 .\Manager.py:1344 -#: .\ManagerEntPos.py:204 .\Openings\ManagerOPL.py:22 +#: .\ManagerEntPos.py:225 .\Openings\ManagerOPL.py:22 #: .\Openings\ManagerOPL.py:29 .\Swiss\WSwissConfig.py:80 #: .\Swiss\WSwissConfig.py:86 .\Tactics\ManagerTactics.py:151 #: .\Tactics\WindowTactics.py:341 .\Tournaments\WTournament.py:65 @@ -4304,8 +4337,8 @@ msgstr "" #: .\Endings\WEndingsGTB.py:260 .\Menus\MenuTrainings.py:296 #: .\Menus\MenuTrainings.py:300 .\Menus\MenuTrainings.py:305 -#: .\Menus\MenuTrainings.py:309 .\Menus\MenuTrainings.py:662 -#: .\Menus\MenuTrainings.py:672 +#: .\Menus\MenuTrainings.py:309 .\Menus\MenuTrainings.py:666 +#: .\Menus\MenuTrainings.py:676 msgid "Initial" msgstr "" @@ -4671,12 +4704,12 @@ msgid "Engine book" msgstr "" #: .\Engines\WindowSTS.py:44 .\Engines\WindowSTS.py:257 -#: .\Engines\WindowSTS.py:580 .\Leagues\WLeagues.py:35 .\Swiss\WSwisses.py:36 +#: .\Engines\WindowSTS.py:580 .\Leagues\WLeagues.py:35 .\Swiss\WSwisses.py:34 msgid "Run" msgstr "" #: .\Engines\WindowSTS.py:45 .\Engines\WindowSTS.py:258 -#: .\Kibitzers\WKibBooks.py:32 .\Kibitzers\WKibDatabases.py:53 +#: .\Kibitzers\WKibBooks.py:32 .\Kibitzers\WKibDatabases.py:76 #: .\Kibitzers\WKibEngine.py:52 .\Kibitzers\WKibGaviota.py:30 #: .\Kibitzers\WKibIndex.py:68 .\Kibitzers\WKibLinea.py:70 #: .\Kibitzers\WKibStEval.py:24 .\Leagues\WLeagueWorker.py:96 @@ -4743,7 +4776,7 @@ msgid "More info" msgstr "" #: .\Engines\WindowSTS.py:926 .\Leagues\WLeagues.py:130 -#: .\Swiss\WSwisses.py:133 .\Tournaments\WTournaments.py:124 +#: .\Swiss\WSwisses.py:131 .\Tournaments\WTournaments.py:124 msgid "The file %s already exist" msgstr "" @@ -4998,7 +5031,7 @@ msgstr "" msgid "Finished PV level %s!" msgstr "" -#: .\ForcingMoves\WForcingMoves.py:195 .\Manager.py:1578 +#: .\ForcingMoves\WForcingMoves.py:195 .\Manager.py:1575 msgid "Find forcing moves" msgstr "" @@ -5182,7 +5215,7 @@ msgid "There are no games to play with this color" msgstr "" #: .\GM\WindowGM.py:516 .\PlayAgainstEngine\WPlayAgainstEngine.py:830 -#: .\QT\FormLayout.py:313 .\QT\GridEditCols.py:90 .\QT\WindowSavePGN.py:106 +#: .\QT\FormLayout.py:328 .\QT\GridEditCols.py:91 .\QT\WindowSavePGN.py:106 #: .\QT\WindowSavePGN.py:121 .\QT\WindowSavePGN.py:424 #: .\QT\WindowSavePGN.py:438 msgid "To choose: left button
To erase: right button" @@ -5241,7 +5274,7 @@ msgid "Stockfish evaluation" msgstr "" #: .\Kibitzers\Kibitzers.py:42 .\Menus\BasicMenus.py:58 -#: .\Openings\OpeningLines.py:930 +#: .\Openings\OpeningLines.py:932 msgid "Databases" msgstr "" @@ -5250,14 +5283,14 @@ msgstr "" msgid "Manual position" msgstr "" -#: .\Kibitzers\WKibBooks.py:35 .\Kibitzers\WKibEngine.py:60 -#: .\Kibitzers\WKibGaviota.py:33 .\Kibitzers\WKibIndex.py:71 -#: .\Kibitzers\WKibStEval.py:25 +#: .\Kibitzers\WKibBooks.py:35 .\Kibitzers\WKibDatabases.py:80 +#: .\Kibitzers\WKibEngine.py:60 .\Kibitzers\WKibGaviota.py:33 +#: .\Kibitzers\WKibIndex.py:71 .\Kibitzers\WKibStEval.py:25 msgid "Show/hide board" msgstr "" #: .\Kibitzers\WKibBooks.py:36 .\Kibitzers\WKibBooks.py:37 -#: .\Kibitzers\WKibDatabases.py:54 .\Kibitzers\WKibDatabases.py:55 +#: .\Kibitzers\WKibDatabases.py:77 .\Kibitzers\WKibDatabases.py:78 #: .\Kibitzers\WKibEngine.py:62 .\Kibitzers\WKibEngine.py:63 #: .\Kibitzers\WKibGaviota.py:34 .\Kibitzers\WKibGaviota.py:35 #: .\Kibitzers\WKibIndex.py:73 .\Kibitzers\WKibIndex.py:74 @@ -5285,7 +5318,7 @@ msgstr "" msgid "Change window position" msgstr "" -#: .\Kibitzers\WindowKibitzers.py:25 .\Manager.py:1524 +#: .\Kibitzers\WindowKibitzers.py:25 .\Manager.py:1523 #: .\Menus\BasicMenus.py:96 msgid "Kibitzers" msgstr "" @@ -5324,12 +5357,12 @@ msgstr "" msgid "Chess leagues" msgstr "" -#: .\Leagues\ManagerLeague.py:568 .\Manager.py:1939 +#: .\Leagues\ManagerLeague.py:568 .\Manager.py:1936 #: .\Swiss\ManagerSwiss.py:564 msgid "%1 wants to resign, do you accept it?" msgstr "" -#: .\Leagues\ManagerLeague.py:587 .\Manager.py:1955 +#: .\Leagues\ManagerLeague.py:587 .\Manager.py:1952 #: .\Swiss\ManagerSwiss.py:583 msgid "%1 proposes draw, do you accept it?" msgstr "" @@ -5428,13 +5461,12 @@ msgstr "" msgid "Crosstabs" msgstr "" -#: .\Leagues\WLeague.py:178 .\Swiss\WSwiss.py:138 -#: .\Translations\TrListas.py:23 +#: .\Leagues\WLeague.py:178 .\Swiss\WSwiss.py:138 .\Swiss\WSwiss.py:172 +#: .\Swiss\WSwiss.py:191 .\Translations\TrListas.py:23 msgid "Round" msgstr "" -#: .\Leagues\WLeague.py:214 .\Leagues\WLeague.py:235 .\Swiss\WSwiss.py:172 -#: .\Swiss\WSwiss.py:191 +#: .\Leagues\WLeague.py:214 .\Leagues\WLeague.py:235 msgid "Journey" msgstr "" @@ -5566,11 +5598,11 @@ msgstr "" msgid "Do you want to remove?" msgstr "" -#: .\Leagues\WLeagues.py:37 .\Swiss\WSwisses.py:38 +#: .\Leagues\WLeagues.py:37 .\Swiss\WSwisses.py:36 msgid "Create" msgstr "" -#: .\Leagues\WLeagues.py:74 .\Swiss\WSwisses.py:75 +#: .\Leagues\WLeagues.py:74 .\Swiss\WSwisses.py:73 msgid "The opponents need to be configured correctly." msgstr "" @@ -5598,7 +5630,7 @@ msgstr "" msgid "Show clock" msgstr "" -#: .\LearnGame\WindowLearnGame.py:466 .\Manager.py:1559 .\QT\QTVarios.py:1101 +#: .\LearnGame\WindowLearnGame.py:466 .\Manager.py:1556 .\QT\QTVarios.py:1101 #: .\QT\WReplay.py:32 msgid "Replay game" msgstr "" @@ -5617,11 +5649,11 @@ msgstr "" msgid "Play against a game" msgstr "" -#: .\MainWindow\LucasChessGui.py:146 +#: .\MainWindow\LucasChessGui.py:145 msgid "Password" msgstr "" -#: .\MainWindow\LucasChessGui.py:195 +#: .\MainWindow\LucasChessGui.py:194 msgid "Select your user" msgstr "" @@ -5742,7 +5774,7 @@ msgstr "" #: .\MainWindow\WInformation.py:90 .\MainWindow\WInformation.py:223 #: .\MainWindow\WInformation.py:239 .\MainWindow\WInformation.py:441 #: .\Manager.py:1056 .\Openings\WindowOpeningLine.py:624 -#: .\Openings\WindowOpeningLine.py:1252 .\QT\WindowArbol.py:298 +#: .\Openings\WindowOpeningLine.py:1269 .\QT\WindowArbol.py:298 #: .\QT\WindowArbol.py:393 .\QT\WindowArbol.py:597 msgid "Comments" msgstr "" @@ -5759,8 +5791,8 @@ msgstr "" msgid "Comment" msgstr "" -#: .\MainWindow\WindowSolve.py:35 .\ManagerEntPos.py:210 -#: .\Menus\MenuTrainings.py:764 .\Tactics\ManagerTactics.py:156 +#: .\MainWindow\WindowSolve.py:35 .\ManagerEntPos.py:231 +#: .\Menus\MenuTrainings.py:771 .\Tactics\ManagerTactics.py:156 #: .\Tactics\WindowTactics.py:355 msgid "Advanced mode" msgstr "" @@ -5787,7 +5819,7 @@ msgstr "" msgid "You have not found the solution" msgstr "" -#: .\Manager.py:1054 .\Nags\WNags.py:14 .\Openings\WindowOpeningLine.py:1253 +#: .\Manager.py:1054 .\Nags\WNags.py:14 .\Openings\WindowOpeningLine.py:1270 msgid "Ratings" msgstr "" @@ -5825,81 +5857,81 @@ msgstr "" msgid "Auto-rotate board" msgstr "" -#: .\Manager.py:1482 +#: .\Manager.py:1481 msgid "Save to a file" msgstr "" -#: .\Manager.py:1496 +#: .\Manager.py:1495 msgid "FEN Format" msgstr "" -#: .\Manager.py:1503 +#: .\Manager.py:1502 msgid "lcsb Format" msgstr "" -#: .\Manager.py:1503 .\ManagerSolo.py:55 .\Menus\BasicMenus.py:55 +#: .\Manager.py:1502 .\ManagerSolo.py:55 .\Menus\BasicMenus.py:55 msgid "Create your own game" msgstr "" -#: .\Manager.py:1507 +#: .\Manager.py:1506 msgid "To a database" msgstr "" -#: .\Manager.py:1511 +#: .\Manager.py:1510 msgid "Board -> Image" msgstr "" -#: .\Manager.py:1517 +#: .\Manager.py:1516 msgid "As GIF file" msgstr "" -#: .\Manager.py:1530 .\Menus\BasicMenus.py:61 +#: .\Manager.py:1529 .\Menus\BasicMenus.py:61 #: .\Openings\WindowOpeningLines.py:142 msgid "Maintenance" msgstr "" -#: .\Manager.py:1565 .\ManagerSolo.py:599 +#: .\Manager.py:1562 .\ManagerSolo.py:599 msgid "Play instead of me" msgstr "" -#: .\Manager.py:1569 +#: .\Manager.py:1566 .\ManagerSolo.py:600 msgid "Help to move" msgstr "" -#: .\Manager.py:1574 .\QT\WindowArbol.py:707 +#: .\Manager.py:1571 .\QT\WindowArbol.py:707 msgid "Moves tree" msgstr "" -#: .\Manager.py:1730 +#: .\Manager.py:1727 msgid "There are no analyzed moves." msgstr "" -#: .\Manager.py:1759 +#: .\Manager.py:1756 msgid "This game already exists." msgstr "" -#: .\Manager.py:1793 .\Manager.py:1840 .\ManagerSolo.py:291 +#: .\Manager.py:1790 .\Manager.py:1837 .\ManagerSolo.py:291 #: .\QT\WindowSavePGN.py:531 msgid "Unable to save" msgstr "" -#: .\Manager.py:1803 +#: .\Manager.py:1800 msgid "PGN is in clipboard" msgstr "" -#: .\Manager.py:1821 +#: .\Manager.py:1818 msgid "Append" msgstr "" -#: .\Manager.py:1840 .\Manager.py:1887 .\QT\WindowSavePGN.py:549 +#: .\Manager.py:1837 .\Manager.py:1884 .\QT\WindowSavePGN.py:549 msgid "It is saved in the clipboard to paste it wherever you want." msgstr "" -#: .\Manager.py:1920 +#: .\Manager.py:1917 msgid "Sorry, but the engine doesn't accept a draw right now." msgstr "" -#: .\Manager.py:1970 .\ManagerGame.py:273 .\ManagerSolo.py:478 +#: .\Manager.py:1967 .\ManagerGame.py:273 .\ManagerSolo.py:478 #: .\ManagerVariations.py:103 .\Openings\ManagerOPLEngines.py:497 #: .\PlayAgainstEngine\ManagerPlayAgainstEngine.py:500 #: .\PlayHuman\ManagerPlayHuman.py:205 .\QT\WindowArbolBook.py:355 @@ -5907,39 +5939,39 @@ msgstr "" msgid "Consult a book" msgstr "" -#: .\Manager.py:2000 +#: .\Manager.py:1997 msgid "Position saved in \"%s\" file." msgstr "" -#: .\Manager.py:2029 +#: .\Manager.py:2026 msgid "Press the continue button to start." msgstr "" -#: .\ManagerEntPos.py:136 +#: .\ManagerEntPos.py:157 msgid "Original position" msgstr "" -#: .\ManagerEntPos.py:306 .\Tactics\ManagerTactics.py:203 +#: .\ManagerEntPos.py:330 .\Tactics\ManagerTactics.py:203 msgid "Next position" msgstr "" -#: .\ManagerEntPos.py:306 .\Tactics\ManagerTactics.py:203 +#: .\ManagerEntPos.py:330 .\Tactics\ManagerTactics.py:203 msgid "Page Down" msgstr "" -#: .\ManagerEntPos.py:307 +#: .\ManagerEntPos.py:331 msgid "Page Up" msgstr "" -#: .\ManagerEntPos.py:307 +#: .\ManagerEntPos.py:331 msgid "Previous position" msgstr "" -#: .\ManagerEntPos.py:308 .\ManagerSolo.py:596 .\Tactics\ManagerTactics.py:203 +#: .\ManagerEntPos.py:332 .\ManagerSolo.py:596 .\Tactics\ManagerTactics.py:203 msgid "Save position in 'Selected positions' file" msgstr "" -#: .\ManagerEntPos.py:649 +#: .\ManagerEntPos.py:673 msgid "You can access this training from menu Train - Learn tactics by repetition - %1" msgstr "" @@ -6915,7 +6947,7 @@ msgstr "" msgid "Calculate your strength" msgstr "" -#: .\Menus\BasicMenus.py:219 .\Swiss\WSwisses.py:23 .\Swiss\WSwisses.py:129 +#: .\Menus\BasicMenus.py:219 .\Swiss\WSwisses.py:21 .\Swiss\WSwisses.py:127 msgid "Swiss Tournaments" msgstr "" @@ -7028,7 +7060,7 @@ msgstr "" #: .\Menus\MenuTrainings.py:296 .\Menus\MenuTrainings.py:298 #: .\Menus\MenuTrainings.py:305 .\Menus\MenuTrainings.py:307 -#: .\Menus\MenuTrainings.py:662 .\Menus\MenuTrainings.py:667 +#: .\Menus\MenuTrainings.py:666 .\Menus\MenuTrainings.py:671 #: .\Washing\WindowWashing.py:191 msgid "UNED chess school" msgstr "" @@ -7041,7 +7073,7 @@ msgstr "" #: .\Menus\MenuTrainings.py:300 .\Menus\MenuTrainings.py:302 #: .\Menus\MenuTrainings.py:309 .\Menus\MenuTrainings.py:311 -#: .\Menus\MenuTrainings.py:672 .\Menus\MenuTrainings.py:678 +#: .\Menus\MenuTrainings.py:676 .\Menus\MenuTrainings.py:682 #: .\Washing\WindowWashing.py:193 msgid "Uwe Auerswald" msgstr "" @@ -7093,34 +7125,38 @@ msgstr "" msgid "The Washing Machine" msgstr "" -#: .\Menus\MenuTrainings.py:683 .\TurnOnLights\TurnOnLights.py:322 +#: .\Menus\MenuTrainings.py:687 .\TurnOnLights\TurnOnLights.py:322 #: .\TurnOnLights\WindowTurnOnLights.py:296 msgid "In one line" msgstr "" -#: .\Menus\MenuTrainings.py:750 +#: .\Menus\MenuTrainings.py:754 msgid "Select position" msgstr "" -#: .\Menus\MenuTrainings.py:754 +#: .\Menus\MenuTrainings.py:758 msgid "Random with same sequence based on position" msgstr "" -#: .\Menus\MenuTrainings.py:754 .\Openings\WindowOpeningLine.py:303 +#: .\Menus\MenuTrainings.py:758 .\Openings\WindowOpeningLine.py:303 #: .\Openings\WindowOpeningLine.py:318 .\Openings\WindowOpeningLines.py:69 msgid "Sequential" msgstr "" -#: .\Menus\MenuTrainings.py:758 +#: .\Menus\MenuTrainings.py:762 msgid "Tutor initially active" msgstr "" -#: .\Menus\MenuTrainings.py:761 .\Routes\WindowRoutes.py:201 +#: .\Menus\MenuTrainings.py:765 .\Routes\WindowRoutes.py:201 #: .\Tactics\ManagerTactics.py:160 msgid "Jump to the next after solving" msgstr "" -#: .\Menus\MenuTrainings.py:766 +#: .\Menus\MenuTrainings.py:768 +msgid "Remove pre-defined solutions" +msgstr "" + +#: .\Menus\MenuTrainings.py:773 msgid "This advanced mode applies only to positions
with a solution included in the file" msgstr "" @@ -7763,42 +7799,42 @@ msgstr "" msgid "Working time" msgstr "" -#: .\Openings\OpeningLines.py:809 .\Openings\OpeningLines.py:828 +#: .\Openings\OpeningLines.py:811 .\Openings\OpeningLines.py:830 msgid "Removing" msgstr "" -#: .\Openings\OpeningLines.py:857 +#: .\Openings\OpeningLines.py:859 msgid "Recovering" msgstr "" -#: .\Openings\OpeningLines.py:1002 .\Openings\WindowOpeningLine.py:595 +#: .\Openings\OpeningLines.py:1004 .\Openings\WindowOpeningLine.py:595 #: .\Openings\WindowOpeningLine.py:625 msgid "PGN with variations" msgstr "" -#: .\Openings\OpeningLines.py:1166 +#: .\Openings\OpeningLines.py:1168 msgid "Importing the opening explorer of a database" msgstr "" -#: .\Openings\OpeningLines.py:1169 +#: .\Openings\OpeningLines.py:1171 msgid "Reading %1" msgstr "" -#: .\Openings\OpeningLines.py:1219 +#: .\Openings\OpeningLines.py:1221 msgid "Writing..." msgstr "" -#: .\Openings\OpeningLines.py:1220 .\Openings\POLAnalisis.py:867 +#: .\Openings\OpeningLines.py:1222 .\Openings\POLAnalisis.py:867 #: .\Openings\WindowOpeningLine.py:601 .\Openings\WindowOpeningLine.py:724 msgid "Database opening explorer" msgstr "" -#: .\Openings\OpeningLines.py:1235 .\Openings\WindowOpeningLine.py:591 +#: .\Openings\OpeningLines.py:1237 .\Openings\WindowOpeningLine.py:591 #: .\Openings\WindowOpeningLine.py:627 msgid "Other opening lines" msgstr "" -#: .\Openings\OpeningLines.py:1402 .\Openings\WindowOpeningLine.py:151 +#: .\Openings\OpeningLines.py:1420 .\Openings\WindowOpeningLine.py:151 msgid "Complete with transpositions" msgstr "" @@ -8024,52 +8060,53 @@ msgstr "" msgid "Export in pgn format as mainline" msgstr "" -#: .\Openings\WindowOpeningLine.py:1022 +#: .\Openings\WindowOpeningLine.py:989 .\Openings\WindowOpeningLine.py:1055 +#: .\QT\ShowPGN.py:105 +msgid "Remove line" +msgstr "" + +#: .\Openings\WindowOpeningLine.py:1028 msgid "Do you want to eliminate this move?" msgstr "" -#: .\Openings\WindowOpeningLine.py:1036 .\QT\ShowPGN.py:105 -msgid "Remove line" +#: .\Openings\WindowOpeningLine.py:1037 +msgid "Remove line %d" msgstr "" -#: .\Openings\WindowOpeningLine.py:1039 .\Openings\WindowOpeningLine.py:1068 +#: .\Openings\WindowOpeningLine.py:1058 .\Openings\WindowOpeningLine.py:1085 msgid "Remove a list of lines" msgstr "" -#: .\Openings\WindowOpeningLine.py:1041 .\Openings\WindowOpeningLine.py:1121 -#: .\Openings\WindowOpeningLine.py:1172 .\Openings\WindowOpeningLine.py:1217 +#: .\Openings\WindowOpeningLine.py:1060 .\Openings\WindowOpeningLine.py:1138 +#: .\Openings\WindowOpeningLine.py:1189 .\Openings\WindowOpeningLine.py:1234 msgid "Remove worst lines" msgstr "" -#: .\Openings\WindowOpeningLine.py:1046 .\Openings\WindowOpeningLine.py:1113 +#: .\Openings\WindowOpeningLine.py:1065 .\Openings\WindowOpeningLine.py:1130 msgid "Remove last move if the line ends with" msgstr "" -#: .\Openings\WindowOpeningLine.py:1052 +#: .\Openings\WindowOpeningLine.py:1071 msgid "Remove comments/ratings/analysis" msgstr "" -#: .\Openings\WindowOpeningLine.py:1057 -msgid "Remove line %d" -msgstr "" - -#: .\Openings\WindowOpeningLine.py:1092 +#: .\Openings\WindowOpeningLine.py:1109 msgid "Do you want to remove the next lines?" msgstr "" -#: .\Openings\WindowOpeningLine.py:1219 +#: .\Openings\WindowOpeningLine.py:1236 msgid "Removed %d lines" msgstr "" -#: .\Openings\WindowOpeningLine.py:1236 +#: .\Openings\WindowOpeningLine.py:1253 msgid "Do you want to remove all lines beginning with %s?" msgstr "" -#: .\Openings\WindowOpeningLine.py:1429 .\Openings\WindowOpeningLine.py:1447 +#: .\Openings\WindowOpeningLine.py:1446 .\Openings\WindowOpeningLine.py:1464 msgid "Minimum percentage" msgstr "" -#: .\Openings\WindowOpeningLine.py:1432 .\Openings\WindowOpeningLine.py:1450 +#: .\Openings\WindowOpeningLine.py:1449 .\Openings\WindowOpeningLine.py:1467 msgid "Minimum weight" msgstr "" @@ -8579,7 +8616,7 @@ msgstr "" msgid "New personality" msgstr "" -#: .\PlayAgainstEngine\WPlayAgainstEngine.py:74 .\QT\GridEditCols.py:34 +#: .\PlayAgainstEngine\WPlayAgainstEngine.py:74 .\QT\GridEditCols.py:35 #: .\QT\Piezas.py:276 msgid "Configurations" msgstr "" @@ -8796,48 +8833,48 @@ msgstr "" msgid "Play a position" msgstr "" -#: .\Procesador.py:1251 .\QT\QTUtil2.py:260 .\QT\QTUtil2.py:271 +#: .\Procesador.py:1253 .\QT\QTUtil2.py:263 .\QT\QTUtil2.py:274 #: .\QT\QTVarios.py:783 .\QT\QTVarios.py:837 .\setup_linux.py:308 msgid "One moment please..." msgstr "" -#: .\QT\FormLayout.py:259 +#: .\QT\FormLayout.py:274 msgid "File to read" msgstr "" -#: .\QT\FormLayout.py:322 +#: .\QT\FormLayout.py:337 msgid "Do you want to remove file %s from the list?" msgstr "" -#: .\QT\GridEditCols.py:16 +#: .\QT\GridEditCols.py:17 msgid "Edit columns" msgstr "" -#: .\QT\GridEditCols.py:43 +#: .\QT\GridEditCols.py:44 msgid "Title" msgstr "" -#: .\QT\GridEditCols.py:46 +#: .\QT\GridEditCols.py:47 msgid "Center" msgstr "" -#: .\QT\GridEditCols.py:47 +#: .\QT\GridEditCols.py:48 msgid "Alignment" msgstr "" -#: .\QT\GridEditCols.py:48 .\QT\WColors.py:47 .\QT\WColors.py:48 +#: .\QT\GridEditCols.py:49 .\QT\WColors.py:47 .\QT\WColors.py:48 msgid "Foreground" msgstr "" -#: .\QT\GridEditCols.py:83 +#: .\QT\GridEditCols.py:84 msgid "Save with name" msgstr "" -#: .\QT\GridEditCols.py:85 +#: .\QT\GridEditCols.py:86 msgid "Save as default" msgstr "" -#: .\QT\GridEditCols.py:157 +#: .\QT\GridEditCols.py:158 msgid "Test" msgstr "" @@ -8873,43 +8910,51 @@ msgstr "" msgid "Swap" msgstr "" -#: .\QT\QTUtil2.py:569 +#: .\QT\QTUtil2.py:510 .\QT\QTUtil2.py:515 +msgid "hours" +msgstr "" + +#: .\QT\QTUtil2.py:515 +msgid "hour" +msgstr "" + +#: .\QT\QTUtil2.py:627 msgid "No pen" msgstr "" -#: .\QT\QTUtil2.py:570 +#: .\QT\QTUtil2.py:628 msgid "Solid line" msgstr "" -#: .\QT\QTUtil2.py:571 +#: .\QT\QTUtil2.py:629 msgid "Dash line" msgstr "" -#: .\QT\QTUtil2.py:572 +#: .\QT\QTUtil2.py:630 msgid "Dot line" msgstr "" -#: .\QT\QTUtil2.py:573 +#: .\QT\QTUtil2.py:631 msgid "Dash dot line" msgstr "" -#: .\QT\QTUtil2.py:574 +#: .\QT\QTUtil2.py:632 msgid "Dash dot dot line" msgstr "" -#: .\QT\QTUtil2.py:584 .\QT\WindowVisualiza.py:292 +#: .\QT\QTUtil2.py:642 .\QT\WindowVisualiza.py:292 msgid "Piece" msgstr "" -#: .\QT\QTUtil2.py:586 +#: .\QT\QTUtil2.py:644 msgid "Moving piece" msgstr "" -#: .\QT\QTUtil2.py:626 +#: .\QT\QTUtil2.py:684 msgid "Message" msgstr "" -#: .\QT\QTUtil2.py:663 .\QT\QTUtil2.py:685 +#: .\QT\QTUtil2.py:725 .\QT\QTUtil2.py:747 msgid "Question" msgstr "" @@ -8993,6 +9038,10 @@ msgstr "" msgid "Beep after each move" msgstr "" +#: .\QT\QTVarios.py:1236 +msgid "FEN is in clipboard" +msgstr "" + #: .\QT\SelectFiles.py:29 msgid "Open Directory" msgstr "" @@ -11906,81 +11955,84 @@ msgid "The shortcut to the program has been created" msgstr "" -msgid "Younger children will be able to begin their apprenticeship with special engines that know little more than moving the pieces, and this will enable them to win against the engines from the very beginning." +msgid "Updated translations" msgstr "" -msgid "Changed" +msgid "Version portable" msgstr "" -msgid "You can also choose the opening, or start in a certain position, or that the engine uses a book of openings or more or less aid." +msgid "An easy way to play and train chess on your PC" msgstr "" -msgid "The game can be set, limiting the depth of analysis of the motor or the time used to think, or by modifying the way in which it decides." +msgid "Home" msgstr "" -msgid "This list of engines is not closed and you can add other ones with the only limitation that they use the UCI protocol." +msgid "From version %s or later" msgstr "" -msgid "Thanks to" +msgid "Updated" msgstr "" -msgid "From version %s or later" +msgid "Fixed" msgstr "" -msgid "Version portable" +msgid "Spanish" msgstr "" -msgid "English" +msgid "Thanks to" msgstr "" -msgid "The program has 36 engines prepared to play from the start, and with very different levels, from 1300 to 3000 elo." +msgid "Changed" msgstr "" msgid "You have an extensive list of trainings with which to try to improve your chess" msgstr "" -msgid "Shortcut" +msgid "Younger children will be able to begin their apprenticeship with special engines that know little more than moving the pieces, and this will enable them to win against the engines from the very beginning." msgstr "" -msgid "Spanish" +msgid "Videos" msgstr "" -msgid "Version installable" +msgid "The program has 36 engines prepared to play from the start, and with very different levels, from 1300 to 3000 elo." msgstr "" -msgid "Source" +msgid "Polish" msgstr "" -msgid "Videos" +msgid "The game can be set, limiting the depth of analysis of the motor or the time used to think, or by modifying the way in which it decides." msgstr "" -msgid "An easy way to play and train chess on your PC" +msgid "Downloads" msgstr "" -msgid "Fixed" +msgid "French" msgstr "" msgid "Previous releases" msgstr "" -msgid "Added" +msgid "English" msgstr "" -msgid "Home" +msgid "German" msgstr "" -msgid "Updated" +msgid "Added" msgstr "" -msgid "French" +msgid "Version installable" msgstr "" -msgid "Downloads" +msgid "You can also choose the opening, or start in a certain position, or that the engine uses a book of openings or more or less aid." msgstr "" -msgid "German" +msgid "This list of engines is not closed and you can add other ones with the only limitation that they use the UCI protocol." msgstr "" -msgid "Polish" +msgid "Source" +msgstr "" + +msgid "Shortcut" msgstr "" diff --git a/Resources/Locale/nl/LC_MESSAGES/lucaschess.mo b/Resources/Locale/nl/LC_MESSAGES/lucaschess.mo index 910219be..4eb90301 100644 Binary files a/Resources/Locale/nl/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/nl/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/pl/LC_MESSAGES/lucaschess.mo b/Resources/Locale/pl/LC_MESSAGES/lucaschess.mo index f74c3cfa..0958b514 100644 Binary files a/Resources/Locale/pl/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/pl/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/po/LC_MESSAGES/lucaschess.mo b/Resources/Locale/po/LC_MESSAGES/lucaschess.mo index 0f781779..1a72df69 100644 Binary files a/Resources/Locale/po/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/po/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/ro/LC_MESSAGES/lucaschess.mo b/Resources/Locale/ro/LC_MESSAGES/lucaschess.mo index 95c6b228..34130b6f 100644 Binary files a/Resources/Locale/ro/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/ro/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/ru/LC_MESSAGES/lucaschess.mo b/Resources/Locale/ru/LC_MESSAGES/lucaschess.mo index 6e6ff849..2529926e 100644 Binary files a/Resources/Locale/ru/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/ru/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/ru/lang.ini b/Resources/Locale/ru/lang.ini index d091a84e..01043a90 100644 --- a/Resources/Locale/ru/lang.ini +++ b/Resources/Locale/ru/lang.ini @@ -1,4 +1,4 @@ NAME=Pусский AUTHOR=Reinhard,Johannes Bolzano,Vladimir PREVIOUS=Nils Andersson,Reinhard,Slavik Pavlov -%=97 +%=96 diff --git a/Resources/Locale/si/LC_MESSAGES/lucaschess.mo b/Resources/Locale/si/LC_MESSAGES/lucaschess.mo index 83fe29a8..cc3fbb92 100644 Binary files a/Resources/Locale/si/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/si/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/sv/LC_MESSAGES/lucaschess.mo b/Resources/Locale/sv/LC_MESSAGES/lucaschess.mo index 45103534..1902061b 100644 Binary files a/Resources/Locale/sv/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/sv/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/tr/LC_MESSAGES/lucaschess.mo b/Resources/Locale/tr/LC_MESSAGES/lucaschess.mo index 65bb842a..3e3511ea 100644 Binary files a/Resources/Locale/tr/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/tr/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/uk/LC_MESSAGES/lucaschess.mo b/Resources/Locale/uk/LC_MESSAGES/lucaschess.mo index f47d6368..80f01c5b 100644 Binary files a/Resources/Locale/uk/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/uk/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/vi/LC_MESSAGES/lucaschess.mo b/Resources/Locale/vi/LC_MESSAGES/lucaschess.mo index f2ba6e02..de671c2b 100644 Binary files a/Resources/Locale/vi/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/vi/LC_MESSAGES/lucaschess.mo differ diff --git a/Resources/Locale/zh/LC_MESSAGES/lucaschess.mo b/Resources/Locale/zh/LC_MESSAGES/lucaschess.mo index f6a29f5d..15f8e0e8 100644 Binary files a/Resources/Locale/zh/LC_MESSAGES/lucaschess.mo and b/Resources/Locale/zh/LC_MESSAGES/lucaschess.mo differ diff --git a/bin/Code/Analysis/Analysis.py b/bin/Code/Analysis/Analysis.py index 26968029..97bfb3f0 100644 --- a/bin/Code/Analysis/Analysis.py +++ b/bin/Code/Analysis/Analysis.py @@ -7,6 +7,7 @@ from Code.Engines import EngineResponse from Code.QT import QTUtil from Code.QT import QTUtil2 +from Code.QT import QTVarios class ControlAnalysis: @@ -278,7 +279,6 @@ def show_analysis(procesador, xtutor, move, is_white, pos_move, main_window=None if not tab_analysis0: return wa = WindowAnalysis.WAnalisis(ma, main_window, is_white, must_save, tab_analysis0, subanalysis=subanalysis) - # wa.show() if subanalysis: wa.show() else: @@ -408,7 +408,7 @@ def process_toolbar(self, accion): elif accion == "MoverFEN": move = self.game_analyzer.move(self.pos_analyzer) QTUtil.ponPortapapeles(move.position.fen()) - QTUtil2.message_bold(self.w, _("FEN is in clipboard")) + QTVarios.fen_is_in_clipboard(self.w) def moving_analyzer(self, si_inicio=False, n_saltar=0, si_final=False, is_base=False): if n_saltar: diff --git a/bin/Code/Analysis/AnalysisEval.py b/bin/Code/Analysis/AnalysisEval.py index 6cf57649..b2cb3ade 100644 --- a/bin/Code/Analysis/AnalysisEval.py +++ b/bin/Code/Analysis/AnalysisEval.py @@ -25,29 +25,18 @@ def base(xcp): def lv(self, cp: int) -> float: return self._lv(cp, self.conf.x_eval_curve_degree) - def lv_dif(self, cp, cp_best): - return self.lv(cp_best) - self.lv(cp) + def lv_dif(self, cp_best, cp_other): + return self.lv(cp_best) - self.lv(cp_other) - def evaluate(self, rm_j, rm_c): - dif = self.evaluate_dif(rm_j, rm_c) + def evaluate_dif(self, rm_best, rm_player): + if rm_best.mate == 0 and rm_player.mate == 0: + return self.lv_dif(rm_best.puntos, rm_player.puntos) - if dif >= self.conf.x_eval_blunder: - return BLUNDER - if dif >= self.conf.x_eval_mistake: - return MISTAKE - if dif >= self.conf.x_eval_inaccuracy: - return INACCURACY - return NO_RATING - - def evaluate_dif(self, rm_j, rm_c): - if rm_j.mate == 0 and rm_c.mate == 0: - return self.lv_dif(rm_c.puntos, rm_j.puntos) - - elif rm_c.mate == 0: - if rm_j.mate > self.conf.x_eval_mate_human: + elif rm_player.mate == 0: + if rm_best.mate > self.conf.x_eval_mate_human: xadd = self.conf.x_eval_inaccuracy else: - dif_mate = self.conf.x_eval_mate_human - rm_j.mate + dif_mate = self.conf.x_eval_mate_human - rm_best.mate if dif_mate >= self.conf.x_eval_difmate_blunder: xadd = self.conf.x_eval_blunder elif dif_mate >= self.conf.x_eval_difmate_mistake: @@ -57,13 +46,13 @@ def evaluate_dif(self, rm_j, rm_c): else: xadd = 0 - return self.lv_dif(rm_c.puntos, self.conf.x_eval_limit_score) + xadd + return self.lv_dif(self.conf.x_eval_limit_score, rm_player.puntos) + xadd - elif rm_j.mate == 0 and rm_c.mate < 0: - return max(self.lv_dif(rm_c.centipawns_abs(), rm_j.centipawns_abs()), self.conf.x_eval_mistake) + elif rm_best.mate == 0 and rm_player.mate < 0: + return max(self.lv_dif(rm_best.centipawns_abs(), rm_player.centipawns_abs()), self.conf.x_eval_mistake) else: - dif_mate = rm_j.mate - rm_c.mate + dif_mate = rm_best.mate - rm_player.mate if dif_mate >= self.conf.x_eval_difmate_blunder: return self.conf.x_eval_blunder if dif_mate >= self.conf.x_eval_difmate_mistake: @@ -72,8 +61,19 @@ def evaluate_dif(self, rm_j, rm_c): return self.conf.x_eval_mistake return 0 - def elo(self, rm_j, rm_c): - dif = self.evaluate_dif(rm_j, rm_c) + def evaluate(self, rm_best, rm_player): + dif = self.evaluate_dif(rm_best, rm_player) + + if dif >= self.conf.x_eval_blunder: + return BLUNDER + if dif >= self.conf.x_eval_mistake: + return MISTAKE + if dif >= self.conf.x_eval_inaccuracy: + return INACCURACY + return NO_RATING + + def elo(self, rm_best, rm_player): + dif = self.evaluate_dif(rm_best, rm_player) mx = self.conf.x_eval_max_elo mn = self.conf.x_eval_min_elo bl2 = self.conf.x_eval_blunder * 1.5 @@ -90,10 +90,70 @@ def elo(self, rm_j, rm_c): rg = max(mx - mn, 0) return int((bl2 - dif / 10) * rg / bl2 + mn) - def elo_bad_vbad(self, rm_j, rm_c): - elo = self.elo(rm_j, rm_c) - ev = self.evaluate(rm_j, rm_c) + def elo_bad_vbad(self, rm_best, rm_player): + elo = self.elo(rm_best, rm_player) + ev = self.evaluate(rm_best, rm_player) bad = ev == MISTAKE vbad = ev == BLUNDER quest = ev == INACCURACY return elo, quest, bad, vbad + + # def calc_accuracy_game(self, game, factor=14): + # n_jg = n_jg_w = n_jg_b = 0 + # porc_t = porc_w = porc_b = 0 + # + # for num, move in enumerate(game.li_moves): + # if move.analysis: + # mrm, pos = move.analysis + # rm_best = mrm.li_rm[0] + # rm_player = mrm.li_rm[pos] + # porc_win = 100.0 - min(self.evaluate_dif(rm_best, rm_player)*factor, 100.0) + # is_white = move.is_white() + # + # porc_t += porc_win + # n_jg += 1 + # + # if is_white: + # n_jg_w += 1 + # porc_w += porc_win + # + # else: + # n_jg_b += 1 + # porc_b += porc_win + # + # porc_t = porc_t * 1.0 / n_jg if n_jg else None + # porc_w = porc_w * 1.0 / n_jg_w if n_jg_w else None + # porc_b = porc_b * 1.0 / n_jg_b if n_jg_b else None + # + # return porc_w, porc_b, porc_t + + @staticmethod + def calc_accuracy_game(game): + n_jg = n_jg_w = n_jg_b = 0 + porc_t = porc_w = porc_b = 0 + + for num, move in enumerate(game.li_moves): + if move.analysis: + mrm, pos = move.analysis + is_white = move.is_white() + pts = mrm.li_rm[pos].centipawns_abs() + pts0 = mrm.li_rm[0].centipawns_abs() + lostp_abs = pts0 - pts + + porc = 100 - lostp_abs if lostp_abs < 100 else 0 + porc_t += porc + + n_jg += 1 + if is_white: + n_jg_w += 1 + porc_w += porc + else: + n_jg_b += 1 + porc_b += porc + + porc_t = porc_t * 1.0 / n_jg if n_jg else None + porc_w = porc_w * 1.0 / n_jg_w if n_jg_w else None + porc_b = porc_b * 1.0 / n_jg_b if n_jg_b else None + + return porc_w, porc_b, porc_t + diff --git a/bin/Code/Analysis/AnalysisGame.py b/bin/Code/Analysis/AnalysisGame.py index 5b63c531..ded2fc02 100644 --- a/bin/Code/Analysis/AnalysisGame.py +++ b/bin/Code/Analysis/AnalysisGame.py @@ -147,15 +147,25 @@ def dispatch_bp(self, rut_dispatch_bp): """ self.rut_dispatch_bp = rut_dispatch_bp - def save_fns(self, file, fen): + def save_brilliancies_fns(self, file, fen, mrm, game: Game.Game, njg): """ Graba cada fen encontrado en el file "file" """ if not file: return + cab = "" + for k, v in game.dicTags().items(): + ku = k.upper() + if not (ku in ("RESULT", "FEN")): + cab += '[%s "%s"]' % (k, v) + + game_raw = Game.game_raw(game) + p = Game.Game(fen=fen) + rm = mrm.li_rm[0] + p.read_pv(rm.pv) with open(file, "at", encoding="utf-8", errors="ignore") as f: - f.write("%s\n" % fen) + f.write(f"{fen}||{p.pgnBaseRAW()}|{cab} {game_raw.pgnBaseRAWcopy(None, njg - 1)}") self.procesador.entrenamientos.menu = None def graba_tactic(self, game, njg, mrm, pos_act): @@ -197,8 +207,9 @@ def graba_tactic(self, game, njg, mrm, pos_act): p = Game.Game(fen=fen) rm = mrm.li_rm[0] p.read_pv(rm.pv) + game_raw = Game.game_raw(game) with open(Util.opj(self.tacticblunders, before), "at", encoding="utf-8", errors="ignore") as f: - f.write("%s||%s|%s%s\n" % (fen, p.pgnBaseRAW(), cab, game.pgnBaseRAWcopy(None, njg - 1))) + f.write("%s||%s|%s%s\n" % (fen, p.pgnBaseRAW(), cab, game_raw.pgnBaseRAWcopy(None, njg - 1))) fen = move.position.fen() p = Game.Game(fen=fen) @@ -206,7 +217,7 @@ def graba_tactic(self, game, njg, mrm, pos_act): li = rm.pv.split(" ") p.read_pv(" ".join(li[1:])) with open(Util.opj(self.tacticblunders, after), "at", encoding="utf-8", errors="ignore") as f: - f.write("%s||%s|%s%s\n" % (fen, p.pgnBaseRAW(), cab, game.pgnBaseRAWcopy(None, njg))) + f.write("%s||%s|%s%s\n" % (fen, p.pgnBaseRAW(), cab, game_raw.pgnBaseRAWcopy(None, njg))) self.siTacticBlunders = True @@ -377,7 +388,6 @@ def gui_dispatch(xrm): return cl_game = Util.huella() - txt_game = game.save() si_poner_pgn_original_blunders = False si_poner_pgn_original_brilliancies = False @@ -506,17 +516,19 @@ def gui_dispatch(xrm): si_poner_pgn_original_blunders = True if self.bmtblunders: + txt_game = Game.game_raw(game).save() self.save_bmt(True, fen, mrm, pos_act, cl_game, txt_game) self.si_bmt_blunders = True if move.is_brilliant(): move.add_nag(NAG_3) - self.save_fns(self.fnsbrilliancies, fen) + self.save_brilliancies_fns(self.fnsbrilliancies, fen, mrm, game, pos_current_move) if self.save_pgn(self.pgnbrilliancies, mrm.name, game.dicTags(), fen, move, rm, None): si_poner_pgn_original_brilliancies = True if self.bmtbrilliancies: + txt_game = Game.game_raw(game).save() self.save_bmt(False, fen, mrm, pos_act, cl_game, txt_game) self.si_bmt_brilliancies = True diff --git a/bin/Code/Analysis/Histogram.py b/bin/Code/Analysis/Histogram.py index fa57be1b..24bb1aa7 100644 --- a/bin/Code/Analysis/Histogram.py +++ b/bin/Code/Analysis/Histogram.py @@ -1,5 +1,5 @@ -import os import math +import os from PySide2 import QtCore, QtGui, QtWidgets diff --git a/bin/Code/Analysis/RunAnalysisControl.py b/bin/Code/Analysis/RunAnalysisControl.py index fa6553e3..1d06d07d 100644 --- a/bin/Code/Analysis/RunAnalysisControl.py +++ b/bin/Code/Analysis/RunAnalysisControl.py @@ -91,7 +91,7 @@ def close(self): class AnalysisMassiveWithWorkers: def __init__(self, wowner, alm, nregs, li_seleccionadas): - self.dbGames = wowner.dbGames + self.db_games = wowner.db_games self.grid = wowner.grid self.wowner = wowner self.li_seleccionadas = li_seleccionadas @@ -132,7 +132,7 @@ def send_game_worker(self, num_worker): else: recno = self.pos_reg - game = self.dbGames.read_game_recno(recno) + game = self.db_games.read_game_recno(recno) self.li_workers[num_worker].send_game(game, recno) return True @@ -170,7 +170,7 @@ def processing(self): game = order.get("GAME") recno = order.get("RECNO") - self.dbGames.save_game_recno(recno, game) + self.db_games.save_game_recno(recno, game) self.num_games_analyzed += 1 self.window.set_pos(self.num_games_analyzed) diff --git a/bin/Code/Analysis/WindowAnalysis.py b/bin/Code/Analysis/WindowAnalysis.py index 6ec40649..18563c04 100644 --- a/bin/Code/Analysis/WindowAnalysis.py +++ b/bin/Code/Analysis/WindowAnalysis.py @@ -175,7 +175,7 @@ def process_toolbar(self, accion): self.jugarPosicion() elif accion == "FEN": QTUtil.ponPortapapeles(self.tab_analysis.fen_active()) - QTUtil2.message_bold(self, _("FEN is in clipboard")) + QTVarios.fen_is_in_clipboard(self) def jugarPosicion(self): position, from_sq, to_sq = self.tab_analysis.active_position() diff --git a/bin/Code/Analysis/WindowAnalysisGraph.py b/bin/Code/Analysis/WindowAnalysisGraph.py index d0b99012..34a6382a 100644 --- a/bin/Code/Analysis/WindowAnalysisGraph.py +++ b/bin/Code/Analysis/WindowAnalysisGraph.py @@ -68,25 +68,25 @@ def xcol(): return o_columns self.dicLiJG = {"A": self.alm.lijg, "W": self.alm.lijgW, "B": self.alm.lijgB} - gridAll = Grid.Grid(self, xcol(), siSelecFilas=True, xid="A", siCabeceraMovible=False) - anchoGrid = gridAll.fixMinWidth() - self.register_grid(gridAll) - gridW = Grid.Grid(self, xcol(), siSelecFilas=True, xid="W", siCabeceraMovible=False) - anchoGrid = max(gridW.fixMinWidth(), anchoGrid) - self.register_grid(gridW) + grid_all = Grid.Grid(self, xcol(), siSelecFilas=True, xid="A", siCabeceraMovible=False) + ancho_grid = grid_all.fixMinWidth() + self.register_grid(grid_all) + grid_w = Grid.Grid(self, xcol(), siSelecFilas=True, xid="W", siCabeceraMovible=False) + ancho_grid = max(grid_w.fixMinWidth(), ancho_grid) + self.register_grid(grid_w) gridB = Grid.Grid(self, xcol(), siSelecFilas=True, xid="B", siCabeceraMovible=False) - anchoGrid = max(gridB.fixMinWidth(), anchoGrid) + ancho_grid = max(gridB.fixMinWidth(), ancho_grid) self.register_grid(gridB) font = Controles.FontType(puntos=Code.configuration.x_sizefont_infolabels) self.emIndexes = Controles.EM(self, alm.indexesHTML).read_only().set_font(font) - pbSave = Controles.PB(self, _("Save to game comments"), self.saveIndexes, plano=False) - pbSave.ponIcono(Iconos.Grabar()) - ly0 = Colocacion.H().control(pbSave).relleno() - ly = Colocacion.V().control(self.emIndexes).otro(ly0).relleno() - wIdx = QtWidgets.QWidget() - wIdx.setLayout(ly) + pb_save = Controles.PB(self, _("Save to game comments"), self.saveIndexes, plano=False) + pb_save.ponIcono(Iconos.Grabar()) + ly0 = Colocacion.H().control(pb_save).relleno() + ly = Colocacion.V().control(self.emIndexes).otro(ly0) + w_idx = QtWidgets.QWidget() + w_idx.setLayout(ly) self.em_elo = Controles.EM(self, alm.indexesHTMLelo).read_only().set_font(font) ly = Colocacion.V().control(self.em_elo) @@ -99,10 +99,10 @@ def xcol(): w_moves.setLayout(ly) self.tabGrid = tabGrid = Controles.Tab() - tabGrid.new_tab(gridAll, _("All moves")) - tabGrid.new_tab(gridW, _("White")) + tabGrid.new_tab(grid_all, _("All moves")) + tabGrid.new_tab(grid_w, _("White")) tabGrid.new_tab(gridB, _("Black")) - tabGrid.new_tab(wIdx, _("Indexes")) + tabGrid.new_tab(w_idx, _("Indexes")) tabGrid.new_tab(w_elo, _("Elo")) tabGrid.new_tab(w_moves, _("Moves")) tabGrid.dispatchChange(self.tabChanged) @@ -140,13 +140,13 @@ def xcol(): layout.otroc(ly_tc, 0, 1, numFilas=2) Controles.Tab().set_position("W") - ancho = self.board.width() + anchoGrid + ancho = self.board.width() + ancho_grid self.htotal = [ - Histogram.Histogram(self, alm.hgame, gridAll, ancho, True), - Histogram.Histogram(self, alm.hwhite, gridW, ancho, True), + Histogram.Histogram(self, alm.hgame, grid_all, ancho, True), + Histogram.Histogram(self, alm.hwhite, grid_w, ancho, True), Histogram.Histogram(self, alm.hblack, gridB, ancho, True), - Histogram.Histogram(self, alm.hgame, gridAll, ancho, False, alm.eloT), - Histogram.Histogram(self, alm.hwhite, gridW, ancho, False, alm.eloW), + Histogram.Histogram(self, alm.hgame, grid_all, ancho, False, alm.eloT), + Histogram.Histogram(self, alm.hwhite, grid_w, ancho, False, alm.eloW), Histogram.Histogram(self, alm.hblack, gridB, ancho, False, alm.eloB), ] lh = Colocacion.V() @@ -160,10 +160,10 @@ def xcol(): self.restore_video() - gridAll.gotop() + grid_all.gotop() gridB.gotop() - gridW.gotop() - self.grid_left_button(gridAll, 0, None) + grid_w.gotop() + self.grid_left_button(grid_all, 0, None) th = self.board.height() self.tabGrid.setFixedHeight(th) self.adjustSize() diff --git a/bin/Code/Analysis/WindowAnalysisParam.py b/bin/Code/Analysis/WindowAnalysisParam.py index 574e89fa..a46372f1 100644 --- a/bin/Code/Analysis/WindowAnalysisParam.py +++ b/bin/Code/Analysis/WindowAnalysisParam.py @@ -2,6 +2,7 @@ import Code from Code import Util +from Code.Analysis import WindowAnalysisConfig from Code.Base.Constantes import ALL_VARIATIONS, HIGHEST_VARIATIONS, BETTER_VARIATIONS, INACCURACY, MISTAKE, BLUNDER, \ INACCURACY_MISTAKE_BLUNDER, INACCURACY_MISTAKE, MISTAKE_BLUNDER from Code.Books import Books @@ -10,8 +11,6 @@ from Code.QT import Iconos from Code.QT import QTUtil from Code.QT import QTUtil2 -from Code.Analysis import WindowAnalysisConfig - SEPARADOR = FormLayout.separador @@ -55,6 +54,8 @@ def read_dic_params(): alm.workers = dic.get("workers", 1) + alm.tags_accuracy = dic.get("tags_accuracy", False) + return alm @@ -281,7 +282,7 @@ def analysis_config(): w = WindowAnalysisConfig.WConfAnalysis(last_active_window, None) w.show() - li_extra_options = ((_("Configuration"), Iconos.ConfAnalysis(), analysis_config), ) + li_extra_options = ((_("Configuration"), Iconos.ConfAnalysis(), analysis_config),) resultado = FormLayout.fedit( lista, title=_("Analysis Configuration"), diff --git a/bin/Code/Base/Game.py b/bin/Code/Base/Game.py index a7b3571a..5a24d893 100644 --- a/bin/Code/Base/Game.py +++ b/bin/Code/Base/Game.py @@ -390,16 +390,16 @@ def assign_other_game(self, otra): self.restore(txt) def si3repetidas(self): - nJug = len(self.li_moves) - if nJug > 5: - fenBase = self.li_moves[nJug - 1].fenBase() - liRep = [nJug - 1] - for n in range(nJug - 1): - if self.li_moves[n].fenBase() == fenBase: - liRep.append(n) - if len(liRep) == 3: + n_jug = len(self.li_moves) + if n_jug > 5: + fen_base = self.li_moves[n_jug - 1].fenBase() + li_rep = [n_jug - 1] + for n in range(n_jug - 1): + if self.li_moves[n].fenBase() == fen_base: + li_rep.append(n) + if len(li_rep) == 3: label = "" - for j in liRep: + for j in li_rep: label += "%d," % (j / 2 + 1,) label = label.strip(",") self.rotuloTablasRepeticion = label @@ -427,14 +427,14 @@ def read_lipv(self, lipv): else: break - siB = self.is_white + is_white = self.is_white for mov in pv: from_sq = mov[:2] to_sq = mov[2:4] if len(mov) == 5: promotion = mov[4] - if siB: + if is_white: promotion = promotion.upper() else: promotion = "" @@ -442,7 +442,7 @@ def read_lipv(self, lipv): if ok: self.li_moves.append(move) position = move.position - siB = not siB + is_white = not is_white return self def damePosicion(self, pos): @@ -528,7 +528,7 @@ def pgn_base(self, movenum=None, translated=False): def set_first_comment(self, txt, siReplace=False): if siReplace or not self.first_comment: self.first_comment = txt - else: + elif txt not in self.first_comment: self.first_comment = "%s\n%s" % (self.first_comment.strip(), txt) def pgn_jg(self, move): @@ -776,19 +776,13 @@ def calc_elo_color(self, is_white): if material < 15: std = ENDGAME else: - pzW, pzB = move.position_before.numPiezasWB() - if pzW < 3 and pzB < 3: + pz_w, pz_b = move.position_before.numPiezasWB() + if pz_w < 3 and pz_b < 3: std = ENDGAME move.stateOME = std last = std move.calc_elo() elo_factor = move.factor_elo() - # if move.bad_move: - # elo_factor = Code.configuration.eval_mistake_factor - # elif move.verybad_move: - # elo_factor = Code.configuration.eval_blunder_factor - # elif move.questionable_move: - # elo_factor = Code.configuration.eval_inaccuracy_factor nummoves[std] += 1 sumelos[std] += move.elo * elo_factor factormoves[std] += elo_factor @@ -1032,7 +1026,13 @@ def remove_info_moves(self, variations=True, ratings=True, comments=True, analys if themes: move.del_themes() - + def has_analisis(self): + num = 0 + for move in self.li_moves: + if move.analysis: + num += 1 + return num > 3 + def pv_san(fen, pv): p = Game(fen=fen) @@ -1183,15 +1183,15 @@ def fen_game(fen, variation): def read_games(pgnfile): with Util.OpenCodec(pgnfile) as f: - siBCab = True + si_b_cab = True lineas = [] nbytes = 0 last_line = "" for linea in f: nbytes += len(linea) - if siBCab: + if si_b_cab: if linea and linea[0] != "[": - siBCab = False + si_b_cab = False else: if last_line == "" and linea.startswith("["): ln = linea.strip() @@ -1201,7 +1201,7 @@ def read_games(pgnfile): ok, p = pgn_game("".join(lineas)) yield nbytes, p lineas = [] - siBCab = True + si_b_cab = True lineas.append(linea) last_line = linea.strip() if lineas: @@ -1308,3 +1308,9 @@ def calc_formula_elo(move): # , limit=200.0): return min(3500, x if x > 0 else 0) except: return 0.0 + + +def game_raw(game: Game): + graw = Game(first_position=game.first_position) + graw.read_pv(game.pv()) + return graw \ No newline at end of file diff --git a/bin/Code/Base/Move.py b/bin/Code/Base/Move.py index 1b221ddb..550e88ea 100644 --- a/bin/Code/Base/Move.py +++ b/bin/Code/Base/Move.py @@ -314,10 +314,10 @@ def borraCV(self): def calc_elo(self): if self.analysis: mrm, pos = self.analysis - rm_j = mrm.li_rm[0] - rm_c = mrm.li_rm[pos] + rm_best = mrm.li_rm[0] + rm_player = mrm.li_rm[pos] self.elo, self.questionable_move, self.bad_move, self.verybad_move = Code.analysis_eval.elo_bad_vbad( - rm_j, rm_c + rm_best, rm_player ) else: diff --git a/bin/Code/BestMoveTraining/BMT.py b/bin/Code/BestMoveTraining/BMT.py index 47b799ee..c302b69c 100644 --- a/bin/Code/BestMoveTraining/BMT.py +++ b/bin/Code/BestMoveTraining/BMT.py @@ -4,8 +4,8 @@ class BMT(SQLBase.DBBase): - def __init__(self, nom_fichero): - SQLBase.DBBase.__init__(self, nom_fichero) + def __init__(self, path_file): + SQLBase.DBBase.__init__(self, path_file) self.tabla = "DATOS" diff --git a/bin/Code/BestMoveTraining/WindowBMTtrain.py b/bin/Code/BestMoveTraining/WindowBMTtrain.py index f643bd2e..51dc46b0 100644 --- a/bin/Code/BestMoveTraining/WindowBMTtrain.py +++ b/bin/Code/BestMoveTraining/WindowBMTtrain.py @@ -50,8 +50,12 @@ def __init__(self, owner, dbf): # Datos ---------------------------------------------------------------- self.dbf = dbf self.recnoActual = self.dbf.recno + li_replace = ( + (b"Code.BMT", b"Code.BestMoveTraining.BMT"), + (b"Code.TrainBMT.BMT", b"Code.BestMoveTraining.BMT"), + ) self.bmt_lista = Util.zip2var_change_import( - dbf.leeOtroCampo(self.recnoActual, "BMT_LISTA"), b"Code.BMT", b"Code.BestMoveTraining.BMT" + dbf.leeOtroCampo(self.recnoActual, "BMT_LISTA"), li_replace ) self.bmt_lista.patch() self.bmt_lista.check_color() @@ -737,11 +741,11 @@ def menr(ck, cq): rm = mrm.li_rm[x] w.setVisible(True) w.bt.ponPlano(not rm.siElegida) - base_txt = str(rm.nivelBMT + 1) + base_txt = "" # str(rm.nivelBMT + 1) if rm.siElegida: game.set_position(self.position) game.read_pv(rm.pv) - base_txt += " - " + game.move(0).pgn_translated() + base_txt = game.move(0).pgn_translated() w.bt.set_text(base_txt) else: w.setVisible(False) diff --git a/bin/Code/Board/Board.py b/bin/Code/Board/Board.py index 85c5152a..316a12e7 100644 --- a/bin/Code/Board/Board.py +++ b/bin/Code/Board/Board.py @@ -155,7 +155,7 @@ def exec_kb_buffer(self, key, flags): self.main_window.manager.save_pgn_clipboard() else: QTUtil.ponPortapapeles(self.last_position.fen()) - QTUtil2.message_bold(self, _("FEN is in clipboard")) + QTVarios.fen_is_in_clipboard(self) # ALT-B : Menu visual elif is_alt and key == Qt.Key_B: @@ -344,7 +344,7 @@ def crea(self): else: self.piezas = Code.all_pieces.selecciona(nom_pieces_ori) self.anchoPieza = self.config_board.width_piece() - self.margenPieza = 0 + self.margin_pieces = Code.configuration.x_margin_pieces - 10 # -10 a +10 como valor real, de 0 a 20 en configuración parámetros self.colorBlancas = self.config_board.colorBlancas() self.colorNegras = self.config_board.colorNegras() @@ -388,9 +388,8 @@ def calculaAnchoMXpieza(self): if self.siF11: at += 50 + 64 tr = 1.0 * self.config_board.tamRecuadro() / 100.0 - mp = self.margenPieza - ap = int((1.0 * at - 16.0 * mp) / (8.0 + tr * 92.0 / 80)) + ap = int((1.0 * at - 16.0 * self.margin_pieces) / (8.0 + tr * 92.0 / 80)) return ap def set_width(self): @@ -415,7 +414,7 @@ def set_width(self): self.anchoPieza = ap - self.width_square = ap + self.margenPieza * 2 + self.width_square = ap + self.margin_pieces * 2 self.tamFrontera = self.margenCentro * 3.0 // 46.0 self.margenCentro = self.margenCentro * self.config_board.tamRecuadro() // 100 @@ -768,9 +767,9 @@ def ctrl_alt(key): li_keys.append((None, None)) li_keys.append((alt("N"), _("Activate/Deactivate non distract mode"))) - if hasattr(self.main_window.manager, "listHelpTeclado"): + if hasattr(self.main_window.manager, "list_help_keyboard"): li_keys.append((None, None)) - li_keys.extend(self.main_window.manager.listHelpTeclado()) + li_keys.extend(self.main_window.manager.list_help_keyboard()) li_keys.append((None, None)) li_keys.append((alt("L"), _("Open position in LiChess"))) @@ -1471,16 +1470,16 @@ def set_base_position(self, position, variation_history=None): def fila2punto(self, row): factor = (8 - row) if self.is_white_bottom else (row - 1) - # return factor * (self.anchoPieza + self.margenPieza * 2) + self.margenCentro + self.tamFrontera - return factor * self.width_square + self.margenCentro + self.tamFrontera / 2 + self.margenPieza + # return factor * (self.anchoPieza + self.margin_pieces * 2) + self.margenCentro + self.tamFrontera + return factor * self.width_square + self.margenCentro + self.tamFrontera / 2 + self.margin_pieces def columna2punto(self, column): factor = (column - 1) if self.is_white_bottom else (8 - column) - # return factor * (self.anchoPieza + self.margenPieza * 2) + self.margenCentro + self.tamFrontera - return factor * self.width_square + self.margenCentro + self.tamFrontera / 2 + self.margenPieza + # return factor * (self.anchoPieza + self.margin_pieces * 2) + self.margenCentro + self.tamFrontera + return factor * self.width_square + self.margenCentro + self.tamFrontera / 2 + self.margin_pieces def punto2fila(self, pos): - pos -= self.margenCentro + self.tamFrontera / 2 + self.margenPieza + pos -= self.margenCentro + self.tamFrontera / 2 + self.margin_pieces pos //= self.width_square if self.is_white_bottom: return int(8 - pos) @@ -1488,7 +1487,7 @@ def punto2fila(self, pos): return int(pos + 1) def punto2columna(self, pos): - pos -= self.margenCentro + self.tamFrontera / 2 + self.margenPieza + pos -= self.margenCentro + self.tamFrontera / 2 + self.margin_pieces pos //= self.width_square if self.is_white_bottom: return int(pos + 1) @@ -2462,12 +2461,15 @@ def enable_eboard_here(self): Code.eboard.set_position(self.last_position) def play_current_position(self): - gm = Game.Game(first_position=self.last_position) - dic = {"GAME": gm.save(), "ISWHITE": gm.last_position.is_white} - fich = Util.relative_path(self.configuration.ficheroTemporal("pkd")) - Util.save_pickle(fich, dic) + if hasattr(self.main_window, "manager") and hasattr(self.main_window.manager, "play_current_position"): + self.main_window.manager.play_current_position() + else: + gm = Game.Game(first_position=self.last_position) + dic = {"GAME": gm.save(), "ISWHITE": gm.last_position.is_white} + fich = Util.relative_path(self.configuration.ficheroTemporal("pkd")) + Util.save_pickle(fich, dic) - XRun.run_lucas("-play", fich) + XRun.run_lucas("-play", fich) class WTamBoard(QtWidgets.QDialog): diff --git a/bin/Code/Board/WBoardColors.py b/bin/Code/Board/WBoardColors.py index 51ed2316..d98137d5 100644 --- a/bin/Code/Board/WBoardColors.py +++ b/bin/Code/Board/WBoardColors.py @@ -191,7 +191,7 @@ def cambiar(self): self.cambiaFlecha(w.regFlecha) -class DialNum(Colocacion.H): +class Slider(Colocacion.H): def __init__(self, parent, rut_actual, rut_actualiza): Colocacion.H.__init__(self) @@ -284,13 +284,13 @@ def crea_lb(txt): lbBlancas = crea_lb(_("White squares")) self.btBlancas = BotonColor(self, self.config_board.colorBlancas, self.actualizaBoard) self.btBlancasPNG = BotonImagen(self, self.config_board.png64Blancas, self.actualizaBoard, self.btBlancas) - self.dialBlancasTrans = DialNum(self, self.config_board.transBlancas, self.actualizaBoard) + self.dialBlancasTrans = Slider(self, self.config_board.transBlancas, self.actualizaBoard) # # Negras lbNegras = crea_lb(_("Black squares")) self.btNegras = BotonColor(self, self.config_board.colorNegras, self.actualizaBoard) self.btNegrasPNG = BotonImagen(self, self.config_board.png64Negras, self.actualizaBoard, self.btNegras) - self.dialNegrasTrans = DialNum(self, self.config_board.transNegras, self.actualizaBoard) + self.dialNegrasTrans = Slider(self, self.config_board.transNegras, self.actualizaBoard) # Background lbFondo = crea_lb(_("Background")) @@ -462,7 +462,7 @@ def l2mas1(lyG, row, a, b, c): # _opacitySideIndicator lbSideIndicator = crea_lb(_("Playing side indicator transparency")) - self.dialSideIndicatorTrans = DialNum(self, self.config_board.transSideIndicator, self.actualizaBoard) + self.dialSideIndicatorTrans = Slider(self, self.config_board.transSideIndicator, self.actualizaBoard) ly_h = Colocacion.H().control(lbSideIndicator).otro(self.dialSideIndicatorTrans) ly_otros.otro(ly_h, 3, 0) diff --git a/bin/Code/Books/PolyglotImportExports.py b/bin/Code/Books/PolyglotImportExports.py index 86c83897..fde6c1e6 100644 --- a/bin/Code/Books/PolyglotImportExports.py +++ b/bin/Code/Books/PolyglotImportExports.py @@ -223,7 +223,8 @@ def fsum(keymove, pt): dltmp = ImportarPGNDB(self.wpolyglot, os.path.basename(path_pgn)) dltmp.show() - ok = self.add_pgn(path_pgn, plies, st_results, st_side, li_players, ru.encode(), time.time, 1.2, dltmp.dispatch, fsum) + ok = self.add_pgn(path_pgn, plies, st_results, st_side, li_players, ru.encode(), time.time, 1.2, + dltmp.dispatch, fsum) dltmp.close() if not ok: db.close() @@ -231,7 +232,9 @@ def fsum(keymove, pt): self.merge(db, min_games, min_score, calc_weight, save_score, collisions) - def add_pgn(self, path_pgn, plies, st_results, st_side, li_players, bunknown_convert, ftime, time_dispatch, dispatch, fsum): + @staticmethod + def add_pgn(path_pgn, plies, st_results, st_side, li_players, bunknown_convert, ftime, + time_dispatch, dispatch, fsum): time_prev = ftime() cancelled = False bfen_inicial = FEN_INITIAL.encode() @@ -274,7 +277,6 @@ def add_pgn(self, path_pgn, plies, st_results, st_side, li_players, bunknown_con else: ok_black = ok_white = True - if b"FEN" in bdCab: bfen0 = bdCab[b"FEN"] else: @@ -337,14 +339,14 @@ def __init__(self, parent, titulo): self.bt_cancelar = Controles.PB(self, _("Cancel"), self.cancelar, plano=False).ponIcono(Iconos.Delete()) - lyBT = Colocacion.H().relleno().control(self.bt_cancelar) + ly_bt = Colocacion.H().relleno().control(self.bt_cancelar) layout = Colocacion.V() layout.control(self.lbgames_readed) layout.control(self.bp) layout.control(self.lb_previsto) layout.espacio(20) - layout.otro(lyBT) + layout.otro(ly_bt) self.setLayout(layout) @@ -423,17 +425,17 @@ def pasa_filtro(dic_act): dic_act[imove] = (num // factor, suma // factor) return True - def dic_entry(key, dic_act): + def dic_entry(xkey, dic_act): d = {} - for imove, (num, sum) in dic_act.items(): + for imove, (num, xsum) in dic_act.items(): e = FasterCode.Entry() - e.key = key + e.key = xkey e.move = imove - score = (sum / num) / 2.0 if num > 0.0 else 0.0 + score = (xsum / num) / 2.0 if num > 0.0 else 0.0 if calc_weight == CALCWEIGHT_NUMGAMES: e.weight = num elif calc_weight == CALCWEIGHT_NUMGAMES_SCORE: - e.weight = int(sum * score) + e.weight = int(xsum * score) else: e.weight = int(score * 10_000) if save_score: diff --git a/bin/Code/Competitions/ManagerFideFics.py b/bin/Code/Competitions/ManagerFideFics.py index d10f5352..2d818d8e 100644 --- a/bin/Code/Competitions/ManagerFideFics.py +++ b/bin/Code/Competitions/ManagerFideFics.py @@ -293,8 +293,8 @@ def play_next_move(self): self.thinking(False) def player_has_moved(self, from_sq, to_sq, promotion=""): - jgUsu = self.check_human_move(from_sq, to_sq, promotion) - if not jgUsu: + jg_usu = self.check_human_move(from_sq, to_sq, promotion) + if not jg_usu: return False jgObj = self.game_obj.move(self.posJugadaObj) @@ -302,20 +302,20 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): analysis = None comment = None - comentarioUsu = "" - comentarioObj = "" + comentario_usu = "" + comentario_obj = "" - siAnalizaJuez = jgUsu.movimiento() != jgObj.movimiento() + si_analiza_juez = jg_usu.movimiento() != jgObj.movimiento() if self.book: fen = self.last_fen() siBookUsu = self.book.check_human(fen, from_sq, to_sq) siBookObj = self.book.check_human(fen, jgObj.from_sq, jgObj.to_sq) if siBookUsu: - comentarioUsu = _("book move") + comentario_usu = _("book move") if siBookObj: - comentarioObj = _("book move") + comentario_obj = _("book move") if siBookUsu and siBookObj: - if jgObj.movimiento() != jgUsu.movimiento(): + if jgObj.movimiento() != jg_usu.movimiento(): # comment = "%s: %s" % (_("Same book move"), jgObj.pgn_translated()) # else: bmove = _("book move") @@ -324,26 +324,26 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): jgObj.pgn_translated(), bmove, self.configuration.x_player, - jgUsu.pgn_translated(), + jg_usu.pgn_translated(), bmove, ) - QTUtil2.message_result(self.main_window, comment) - siAnalizaJuez = False + QTUtil2.message_information(self.main_window, comment) + si_analiza_juez = False else: if not siBookObj: self.book = None - if siAnalizaJuez: + if si_analiza_juez: um = QTUtil2.analizando(self.main_window) if not self.continueTt: self.analyze_begin() mrm = self.analyze_minimum(5000) position = self.game.last_position - rmUsu, nada = mrm.buscaRM(jgUsu.movimiento()) + rmUsu, nada = mrm.buscaRM(jg_usu.movimiento()) if rmUsu is None: self.analyze_end() - rmUsu = self.xtutor.valora(position, jgUsu.from_sq, jgUsu.to_sq, jgUsu.promotion) + rmUsu = self.xtutor.valora(position, jg_usu.from_sq, jg_usu.to_sq, jg_usu.promotion) mrm.add_rm(rmUsu) self.analyze_begin() @@ -366,8 +366,8 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): self.puntos += dpts self.ponPuntos() - comentarioUsu += " %s" % (w.rmUsu.abrTexto()) - comentarioObj += " %s" % (w.rmObj.abrTexto()) + comentario_usu += " %s" % (w.rmUsu.abrTexto()) + comentario_obj += " %s" % (w.rmObj.abrTexto()) comentarioPuntos = "%s = %d %+d %+d = %d" % ( _("Score"), @@ -380,10 +380,10 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): comment = "%s: %s %s\n%s: %s %s\n%s" % ( self.name_obj, jgObj.pgn_translated(), - comentarioObj, + comentario_obj, self.configuration.x_player, - jgUsu.pgn_translated(), - comentarioUsu, + jg_usu.pgn_translated(), + comentario_usu, comentarioPuntos, ) diff --git a/bin/Code/Config/Configuration.py b/bin/Code/Config/Configuration.py index 418f63ca..409018a0 100644 --- a/bin/Code/Config/Configuration.py +++ b/bin/Code/Config/Configuration.py @@ -241,6 +241,8 @@ def __init__(self, user): self.x_interval_replay = 1400 self.x_beep_replay = False + self.x_margin_pieces = 7 + self.x_engine_notbackground = False self.x_check_for_update = False diff --git a/bin/Code/Config/WindowConfig.py b/bin/Code/Config/WindowConfig.py index 07c656f5..295f6a43 100644 --- a/bin/Code/Config/WindowConfig.py +++ b/bin/Code/Config/WindowConfig.py @@ -1,4 +1,5 @@ import os + from PySide2 import QtCore import Code @@ -76,7 +77,7 @@ def options(parent, configuration): drap_v = {} for x in drap: drap_v[drap[x]] = x - form.dial( + form.slider( "%s (%s=1)" % (_("Speed"), _("By default")), 1, len(drap), @@ -95,8 +96,9 @@ def options(parent, configuration): form.combobox(_("Key for copying the FEN to clipboard"), li_copy, configuration.x_copy_ctrl) li_wheel = [(_("Forward"), GO_FORWARD), (_("Backward"), GO_BACK)] form.combobox(_("Scroll direction with the mouse wheel"), li_wheel, configuration.x_wheel_board) - form.checkbox(_("Always promote to queen\nALT key allows to change"), configuration.x_autopromotion_q) + form.slider(_("Margin of pieces in square") + ':
%s 10' % _("By default"), 0, 20, + Code.configuration.x_margin_pieces, siporc=False) form.separador() form.checkbox(_("Show cursor when engine is thinking"), configuration.x_cursor_thinking) @@ -290,6 +292,7 @@ def options(parent, configuration): configuration.x_copy_ctrl, configuration.x_wheel_board, configuration.x_autopromotion_q, + configuration.x_margin_pieces, configuration.x_cursor_thinking, dboard, toolIcon, @@ -303,26 +306,26 @@ def options(parent, configuration): if dboard: if dboard == "DGT": if not QTUtil2.pregunta( - parent, - "%s

%s %s" - % ( - _("Are you sure %s is the correct driver ?") % dboard, - _("WARNING: selecting the wrong driver might cause damage to your board."), - _("Proceed at your own risk."), - ), + parent, + "%s

%s %s" + % ( + _("Are you sure %s is the correct driver ?") % dboard, + _("WARNING: selecting the wrong driver might cause damage to your board."), + _("Proceed at your own risk."), + ), ): dboard = "" else: if not QTUtil2.pregunta( - parent, - "%s

%s %s

%s
%s" - % ( - _("Are you sure %s is the correct driver ?") % dboard, - _("WARNING: selecting the wrong driver might cause damage to your board."), - _("Proceed at your own risk."), - _("Please read the driver's user manual at:"), - "\u00A0\u00A0\u00A0\u00A0\u00A0 https://goneill.co.nz/chess#eboard", - ), + parent, + "%s

%s %s

%s
%s" + % ( + _("Are you sure %s is the correct driver ?") % dboard, + _("WARNING: selecting the wrong driver might cause damage to your board."), + _("Proceed at your own risk."), + _("Please read the driver's user manual at:"), + "\u00A0\u00A0\u00A0\u00A0\u00A0 https://goneill.co.nz/chess#eboard", + ), ): dboard = "" configuration.x_digital_board = dboard diff --git a/bin/Code/Databases/DBgames.py b/bin/Code/Databases/DBgames.py index b54c8d6e..3b777e27 100644 --- a/bin/Code/Databases/DBgames.py +++ b/bin/Code/Databases/DBgames.py @@ -43,9 +43,9 @@ def __init__(self, path_db): self.external_folder = os.path.dirname(path_db) else: self.external_folder = "" - self.nom_fichero = os.path.abspath(path_db) + self.path_file = os.path.abspath(path_db) - self.conexion = sqlite3.connect(self.nom_fichero) + self.conexion = sqlite3.connect(self.path_file) self.conexion.row_factory = sqlite3.Row self.order = None self.filter = None @@ -64,13 +64,13 @@ def __init__(self, path_db): summary_depth = self.read_config("SUMMARY_DEPTH", 0) self.with_db_stat = summary_depth > 0 if self.with_db_stat: - self.db_stat = DBgamesST.TreeSTAT(self.nom_fichero + ".st1", summary_depth) + self.db_stat = DBgamesST.TreeSTAT(self.path_file + ".st1", summary_depth) else: self.db_stat = None self.li_row_ids = [] - self.rowidReader = UtilSQL.RowidReader(self.nom_fichero, "Games") + self.rowidReader = UtilSQL.RowidReader(self.path_file, "Games") self.with_plycount = "PLYCOUNT" in self.read_config("dcabs", {}) @@ -114,7 +114,7 @@ def remove_columns(self, lista): self.conexion.execute("VACUUM") def get_name(self): - basename = os.path.basename(self.nom_fichero) + basename = os.path.basename(self.path_file) p = basename.rindex(".") return basename[:p] @@ -142,13 +142,13 @@ def reset_cache(self): self.cache = {} def save_config(self, key, valor): - with UtilSQL.DictRawSQL(self.nom_fichero, "Config") as dbconf: + with UtilSQL.DictRawSQL(self.path_file, "Config") as dbconf: dbconf[key] = valor if key == "dcabs": self.with_plycount = "PLYCOUNT" in self.read_config("dcabs", {}) def read_config(self, key, default=None): - with UtilSQL.DictRawSQL(self.nom_fichero, "Config") as dbconf: + with UtilSQL.DictRawSQL(self.path_file, "Config") as dbconf: return dbconf.get(key, default) def addcache(self, rowid, reg): @@ -297,10 +297,10 @@ def close(self): self.rowidReader = None def label(self): - if Util.same_path(self.nom_fichero, self.link_file): - return Code.relative_root(self.nom_fichero) + if Util.same_path(self.path_file, self.link_file): + return Code.relative_root(self.path_file) else: - return "%s (%s)" % (Code.relative_root(self.nom_fichero), Code.relative_root(self.link_file)) + return "%s (%s)" % (Code.relative_root(self.path_file), Code.relative_root(self.link_file)) def depth_stat(self): return self.db_stat.depth if self.with_db_stat else 0 @@ -380,7 +380,7 @@ def rebuild_stat(self, dispatch, depth): if not self.with_db_stat: self.with_db_stat = True - self.db_stat = DBgamesST.TreeSTAT(self.nom_fichero + ".st1", depth) + self.db_stat = DBgamesST.TreeSTAT(self.path_file + ".st1", depth) self.save_config("SUMMARY_DEPTH", depth) self.db_stat.depth = depth @@ -446,8 +446,30 @@ def yield_fens(self): pgn = Game.pv_pgn_raw(fen, pv) if pv else "" yield fen, pgn - def yield_data(self, liFields, filtro): - select = ",".join(liFields) + def yield_allfens(self, after_rowid=0): + sql = "SELECT ROWID, XPV FROM Games" + if after_rowid: + sql += f" WHERE ROWID > {after_rowid}" + cursor = self.conexion.execute(sql) + while True: + row = cursor.fetchone() + if not row: + break + rowid, xpv = row + if xpv.count("|") == 2: + nada, fen, xpv = row[0].split("|") + yield rowid, fen, -1 + else: + fen = FEN_INITIAL + set_fen(fen) + li_pv = FasterCode.xpv_pv(xpv).split(" ") + for pos, pv in enumerate(li_pv): + make_move(pv) + fen = get_fen() + yield rowid, fen, pos, " ".join(li_pv[:pos+1]) + + def yield_data(self, li_fields, filtro): + select = ",".join(li_fields) sql = "SELECT %s FROM Games" % (select,) if self.filter: sql += " WHERE %s" % self.filter @@ -462,7 +484,7 @@ def yield_data(self, liFields, filtro): raw = cursor.fetchone() if raw: alm = Util.Record() - for campo in liFields: + for campo in li_fields: setattr(alm, campo, raw[campo]) yield alm else: @@ -1087,6 +1109,33 @@ def has_positions(self): def has_field(self, field): return field.upper() in self.st_fields + def lastrowid(self): + cursor = self.conexion.execute("SELECT MAX(ROWID) FROM GAMES;") + row = cursor.fetchone() + return row[0] if row else 0 + + def count_greater_rowid(self, rowid): + cursor = self.conexion.execute("SELECT count(ROWID) FROM GAMES WHERE ROWID > ?;", (rowid,)) + row = cursor.fetchone() + return row[0] if row else 0 + + def filter_positions(self, li_seq, li_rowids): + li = [] + if li_seq: + for pv in li_seq: + xpv = pv_xpv(pv) + li.append('XPV LIKE "%s%%"' % xpv) + + if li_rowids: + for rowid in li_rowids: + li.append(f'ROWID = {rowid}') + + condicion = "(%s)" % (" OR ".join(li),) + self.filter = condicion + + self.li_row_ids = [] + self.rowidReader.run(self.li_row_ids, condicion, self.order) + def get_random_game(): db = DBgames(Code.path_resource("IntFiles", "last_games.lcdb")) diff --git a/bin/Code/Databases/DBgamesST.py b/bin/Code/Databases/DBgamesST.py index 46fdeb13..b4b3d3be 100644 --- a/bin/Code/Databases/DBgamesST.py +++ b/bin/Code/Databases/DBgamesST.py @@ -32,12 +32,12 @@ def total(self): class TreeSTAT: - def __init__(self, nom_fichero, depth=None): - self.nom_fichero = nom_fichero + def __init__(self, path_file, depth=None): + self.path_file = path_file self.defaultDepth = 30 self.hinikey = Util.md5_lc("") - self._conexion = sqlite3.connect(self.nom_fichero) + self._conexion = sqlite3.connect(self.path_file) self.depth = self.defaultDepth if depth is None else depth self._check_table() @@ -75,8 +75,8 @@ def close(self): def reset(self): self.close() - Util.remove_file(self.nom_fichero) - self._conexion = sqlite3.connect(self.nom_fichero) + Util.remove_file(self.path_file) + self._conexion = sqlite3.connect(self.path_file) self._check_table() def read_rec(self, hkey): diff --git a/bin/Code/Databases/WDB_Games.py b/bin/Code/Databases/WDB_Games.py index 386a9b50..fad60c59 100644 --- a/bin/Code/Databases/WDB_Games.py +++ b/bin/Code/Databases/WDB_Games.py @@ -6,7 +6,6 @@ from PySide2 import QtWidgets, QtCore import Code -import Code.Openings.WindowOpenings as WindowOpenings from Code import Util, XRun from Code.Analysis import AnalysisGame, WindowAnalysisParam, RunAnalysisControl from Code.Base import Game, Position @@ -17,6 +16,7 @@ from Code.LearnGame import WindowPlayGame, WindowLearnGame from Code.Odt import WOdt from Code.Openings import OpeningsStd +from Code.Openings import WindowOpenings from Code.QT import Colocacion from Code.QT import Columnas from Code.QT import Controles @@ -41,7 +41,7 @@ def __init__(self, wb_database, db_games, wsummary, si_select): QtWidgets.QWidget.__init__(self) self.wb_database = wb_database - self.dbGames = db_games # <--setdbGames + self.db_games = db_games # <--setdbGames self.procesador = Code.procesador self.configuration = Code.configuration @@ -151,7 +151,7 @@ def tw_play_against(self): if li: db_play = WindowPlayGame.DBPlayGame(self.configuration.file_play_game()) recno = li[0] - game = self.dbGames.read_game_recno(recno) + game = self.db_games.read_game_recno(recno) game.remove_info_moves() h = hash(game.xpv()) recplay = db_play.recnoHash(h) @@ -166,10 +166,10 @@ def tw_play_against(self): def tw_memorize(self): li = self.grid.recnosSeleccionados() if li: - um = QTUtil2.one_moment_please(self) + um = QTUtil2.one_moment_please(self.wb_database) db = WindowLearnGame.DBLearnGame(self.configuration.file_learn_game()) recno = li[0] - game = self.dbGames.read_game_recno(recno) + game = self.db_games.read_game_recno(recno) reg = {"GAME": game.save()} db.append(reg) um.final() @@ -180,10 +180,10 @@ def tw_memorize(self): db_learn.close() def lista_columnas(self): - dcabs = self.dbGames.read_config("dcabs", DBgames.drots.copy()) + dcabs = self.db_games.read_config("dcabs", DBgames.drots.copy()) o_columns = Columnas.ListaColumnas() o_columns.nueva("__num__", _("N."), 60, align_center=True) - li_tags = self.dbGames.li_tags() + li_tags = self.db_games.li_tags() st100 = {"Event", "Site", "White", "Black"} for tag in li_tags: label = TrListas.pgn_label(tag) @@ -196,7 +196,7 @@ def lista_columnas(self): return o_columns def rehaz_columnas(self): - li_tags = self.dbGames.li_tags() + li_tags = self.db_games.li_tags() o_columns = self.grid.o_columns si_cambios = False @@ -211,7 +211,7 @@ def rehaz_columnas(self): for n in li_remove: del o_columns.li_columns[n] - dcabs = self.dbGames.read_config("dcabs", DBgames.drots.copy()) + dcabs = self.db_games.read_config("dcabs", DBgames.drots.copy()) st100 = {"Event", "Site", "White", "Black"} st_actual = {col.key for col in self.grid.o_columns.li_columns} for tag in li_tags: @@ -223,11 +223,11 @@ def rehaz_columnas(self): si_cambios = True if si_cambios: - self.dbGames.reset_cache() + self.db_games.reset_cache() self.grid.releerColumnas() - def setdbGames(self, dbGames): - self.dbGames = dbGames + def setdbGames(self, db_games): + self.db_games = db_games def setInfoMove(self, infoMove): self.infoMove = infoMove @@ -246,9 +246,9 @@ def updateStatus(self): txt = "%s | " % p.pgnBaseRAW() else: txt = "" - siPte = self.dbGames.if_there_are_records_to_read() - if not siPte: - recs = self.dbGames.reccount() + si_pte = self.db_games.if_there_are_records_to_read() + if not si_pte: + recs = self.db_games.reccount() if recs: txt += "%s: %d" % (_("Games"), recs) if self.where: @@ -264,39 +264,39 @@ def updateStatus(self): pgn = g.pgnBaseRAW(translated=True) where = where[:pos] + pgn + where[pos + len(wxpv) + pos_apos + 1:] txt += " | %s: %s" % (_("Filter"), where) - if siPte: + if si_pte: QtCore.QTimer.singleShot(1000, self.updateStatus) self.status.showMessage(txt, 0) def grid_num_datos(self, grid): - return self.dbGames.reccount() + return self.db_games.reccount() def grid_dato(self, grid, nfila, ocol): key = ocol.key if key == "__num__": return str(nfila + 1) elif key == "rowid": - return str(self.dbGames.get_rowid(nfila)) + return str(self.db_games.get_rowid(nfila)) elif key == "__opening__": - xpv = self.dbGames.field(nfila, "XPV") + xpv = self.db_games.field(nfila, "XPV") if xpv[0] != "|": return self.ap.xpv(xpv) return "" - return self.dbGames.field(nfila, key) + return self.db_games.field(nfila, key) def grid_right_button(self, grid, row, col, modif): key = col.key if key.upper() in ("ROWID", "PLYCOUNT") or key.startswith("__"): return - value = self.dbGames.field(row, key) + value = self.db_games.field(row, key) new_value = QTUtil2.read_simple(self, _("Edit"), col.head, value, width=300, in_cursor=True) if new_value is None: return new_value = new_value.strip() - self.dbGames.set_field(row, key, new_value) + self.db_games.set_field(row, key, new_value) self.grid.refresh() @@ -312,7 +312,7 @@ def grid_doubleclick_header(self, grid, col): return is_shift, is_control, is_alt = QTUtil.keyboard_modifiers() is_numeric = is_shift or is_control or is_alt - li_order = self.dbGames.get_order() + li_order = self.db_games.get_order() if key == "opening": key = "XPV" is_already = False @@ -334,7 +334,7 @@ def grid_doubleclick_header(self, grid, col): li_order.insert(0, (key, "ASC", is_numeric)) col.antigua = col.head col.head = col.antigua + "+" - self.dbGames.put_order(li_order) + self.db_games.put_order(li_order) self.grid.refresh() self.updateStatus() @@ -361,9 +361,9 @@ def grid_tecla_control(self, grid, k, is_shift, is_control, is_alt): return True # que siga con el resto de teclas def goto_registro(self): - total = self.dbGames.reccount() + total = self.db_games.reccount() if total: - registro = QTUtil2.read_simple(self, self.dbGames.get_name(), _("Go to the record"), "") + registro = QTUtil2.read_simple(self, self.db_games.get_name(), _("Go to the record"), "") if registro and registro.isdigit(): num_registro = min(max(int(registro) - 1, 0), total - 1) self.grid.goto(num_registro, 0) @@ -376,7 +376,7 @@ def tw_terminar(self): if QTUtil2.pregunta(self, _("Changes have been made, do you want to export them to a PGN file?")): self.tw_exportar_pgn(False) self.terminado = True - self.dbGames.close() + self.db_games.close() def actualiza(self, siObligatorio=False): def pvSummary(summary): @@ -398,7 +398,7 @@ def pvSummary(summary): pv = " ".join(lipv[:-1]) else: pv = "" - self.dbGames.filter_pv(pv) + self.db_games.filter_pv(pv) self.updateStatus() self.movenum = pv.count(" ") self.grid.refresh() @@ -406,7 +406,7 @@ def pvSummary(summary): else: if siObligatorio or self.li_filter: self.where = None - self.dbGames.filter_pv("") + self.db_games.filter_pv("") self.updateStatus() self.grid.refresh() self.grid.gotop() @@ -419,7 +419,7 @@ def grid_cambiado_registro(self, grid, row, oCol): if self.grid_num_datos(grid) > row >= 0: self.setFocus() self.grid.setFocus() - fen, pv = self.dbGames.get_pv(row) + fen, pv = self.db_games.get_pv(row) if fen: p = Game.Game(fen=fen) p.read_pv(pv) @@ -441,7 +441,7 @@ def tw_gotop(self): def tw_up(self): row = self.grid.recno() if row >= 0: - fila_nueva = self.dbGames.interchange(row, True) + fila_nueva = self.db_games.interchange(row, True) self.changes = True if fila_nueva is not None: self.grid.goto(fila_nueva, 0) @@ -450,7 +450,7 @@ def tw_up(self): def tw_down(self): row = self.grid.recno() if row >= 0: - fila_nueva = self.dbGames.interchange(row, False) + fila_nueva = self.db_games.interchange(row, False) self.changes = True if fila_nueva is not None: self.grid.goto(fila_nueva, 0) @@ -458,7 +458,7 @@ def tw_down(self): def edit_save(self, recno, game): if game is not None: - resp = self.dbGames.save_game_recno(recno, game) + resp = self.db_games.save_game_recno(recno, game) if resp.ok: if not resp.changed: return @@ -495,7 +495,7 @@ def edit_previous_next(self, order, game): return game elif order == "next": recno = game.recno + 1 - if recno < len(self.dbGames): + if recno < len(self.db_games): self.grid.goto(recno, 0) game, recno = self.current_game() if game: @@ -511,7 +511,7 @@ def edit(self, recno, game): game = self.procesador.manager_game( self, game, - not self.dbGames.allows_positions, + not self.db_games.allows_positions, False, self.infoMove.board, with_previous_next=with_previous_next, @@ -523,12 +523,12 @@ def edit(self, recno, game): def tw_nuevo(self): recno = None - pc = self.dbGames.blank_game() + pc = self.db_games.blank_game() self.edit(recno, pc) def tw_edit(self): if self.grid.recno() >= 0: - um = QTUtil2.one_moment_please(self, _("Reading the game")) + um = QTUtil2.one_moment_please(self.wb_database, _("Reading the game")) game, recno = self.current_game() um.final() if game is not None: @@ -540,7 +540,7 @@ def current_game(self): li = self.grid.recnosSeleccionados() if li: recno = li[0] - game = self.dbGames.read_game_recno(recno) + game = self.db_games.read_game_recno(recno) else: recno = None game = None @@ -560,36 +560,36 @@ def refresh(): self.grid_cambiado_registro(None, 0, 0) def standard(): - w = WDB_Utils.WFiltrar(self, self.grid.o_columns, self.li_filter, self.dbGames.nom_fichero) + w = WDB_Utils.WFiltrar(self, self.grid.o_columns, self.li_filter, self.db_games.path_file) if w.exec_(): self.li_filter = w.li_filter self.where = w.where() - self.dbGames.filter_pv(xpv, self.where) + self.db_games.filter_pv(xpv, self.where) refresh() def raw_sql(): w = WDB_Utils.WFiltrarRaw(self, self.grid.o_columns, self.where) if w.exec_(): self.where = w.where - self.dbGames.filter_pv(xpv, self.where) + self.db_games.filter_pv(xpv, self.where) refresh() def opening(): - me = QTUtil2.one_moment_please(self) + me = QTUtil2.one_moment_please(self.wb_database) - w = WindowOpenings.WOpenings(self, self.configuration, self.last_opening) + w = WindowOpenings.WOpenings(self.wb_database, self.configuration, self.last_opening) me.final() if w.exec_(): self.last_opening = ap = w.resultado() pv = getattr(ap, "a1h8", "") - self.dbGames.filter_pv(pv) - self.where = self.dbGames.filter + self.db_games.filter_pv(pv) + self.where = self.db_games.filter self.movenum = pv.count(" ") refresh() def remove_filter(): - self.dbGames.filter_pv("") + self.db_games.filter_pv("") self.where = None if self.summaryActivo: self.summaryActivo["game"] = Game.Game() @@ -602,7 +602,7 @@ def remove_filter(): menu.opcion(raw_sql, _("Advanced"), Iconos.SQL_RAW()) menu.separador() menu.opcion(opening, _("Opening"), Iconos.Opening()) - if self.dbGames.filter is not None and self.dbGames.filter: + if self.db_games.filter is not None and self.db_games.filter: menu.separador() menu.opcion(remove_filter, _("Remove filter"), Iconos.Cancelar()) @@ -618,7 +618,7 @@ def tw_borrar(self): um = QTUtil2.working(self) self.changes = True - self.dbGames.remove_list_recnos(li) + self.db_games.remove_list_recnos(li) if self.summaryActivo: self.summaryActivo["games"] -= len(li) self.wsummary.reset() @@ -633,14 +633,14 @@ def tw_import(self): menu.separador() menu.opcion(self.tw_importar_DB, _("From other database"), Iconos.Database()) menu.separador() - if self.dbGames.allows_positions and (self.dbGames.reccount() == 0 or not self.dbGames.allows_duplicates): + if self.db_games.allows_positions and (self.db_games.reccount() == 0 or not self.db_games.allows_duplicates): menu.opcion(self.tw_importar_lichess, _("From the Lichess Puzzle Database"), Iconos.Lichess()) resp = menu.lanza() if resp: resp() def tw_export(self): - li_all = range(self.dbGames.reccount()) + li_all = range(self.db_games.reccount()) if not li_all: return None li_sel = self.grid.recnosSeleccionados() @@ -672,7 +672,7 @@ def tw_export(self): (self.tw_exportar_db, li_sel), "%s [%d]" % (_("Only selected games"), len(li_sel)), Iconos.PuntoAzul() ) - if self.dbGames.has_positions(): + if self.db_games.has_positions(): menu.separador() menu.opcion((self.tw_odt, None), _("To a position sheet in ODF format"), Iconos.ODT()) @@ -683,7 +683,7 @@ def tw_export(self): def tw_odt(self, li_sel): um = QTUtil2.working(self) - li_fens = [(fen, pgn) for fen, pgn in self.dbGames.yield_fens()] + li_fens = [(fen, pgn) for fen, pgn in self.db_games.yield_fens()] total = len(li_fens) um.final() if total == 0: @@ -691,7 +691,7 @@ def tw_odt(self, li_sel): dic = {"POS": 0, "TOTAL": total} - path_odt = WOdt.path_saveas_odt(self, self.dbGames.get_name()) + path_odt = WOdt.path_saveas_odt(self, self.db_games.get_name()) if not path_odt: return wodt = WOdt.WOdt(self, path_odt) @@ -764,8 +764,8 @@ def tw_configure(self): submenu.opcion(self.tw_edit_columns, _("Configure the columns"), Iconos.EditColumns()) submenu.separador() - si_show = self.dbGames.read_config("GRAPHICS_SHOW_ALLWAYS", False) - si_graphics_specific = self.dbGames.read_config("GRAPHICS_SPECIFIC", False) + si_show = self.db_games.read_config("GRAPHICS_SHOW_ALLWAYS", False) + si_graphics_specific = self.db_games.read_config("GRAPHICS_SPECIFIC", False) menu1 = submenu.submenu(_("Graphic elements (Director)"), Iconos.Script()) menu2 = menu1.submenu(_("Show always"), Iconos.PuntoAzul()) menu2.opcion(self.tw_dir_show_yes, _("Yes"), dico[si_show]) @@ -783,11 +783,11 @@ def tw_configure(self): resp() def tw_options(self): - db = self.dbGames + db = self.db_games dic_data = { "NAME": db.get_name(), "LINK_FILE": db.link_file, - "FILEPATH": db.nom_fichero, + "FILEPATH": db.path_file, "EXTERNAL_FOLDER": db.external_folder, "SUMMARY_DEPTH": db.depth_stat(), "ALLOWS_DUPLICATES": db.read_config("ALLOWS_DUPLICATES", True), @@ -809,18 +809,18 @@ def tw_options(self): # Comprobamos depth new_depth = dic_data["SUMMARY_DEPTH"] - if new_depth != self.dbGames.depth_stat(): + if new_depth != self.db_games.depth_stat(): self.wsummary.reindexar_question(new_depth, False) db.save_config("SUMMARY_DEPTH", new_depth) # Si ha cambiado la localización, se cierra, se mueve y se reabre en la nueva # Internal -> Internal - old_is_internal = Util.same_path(self.dbGames.nom_fichero, self.dbGames.link_file) + old_is_internal = Util.same_path(self.db_games.path_file, self.db_games.link_file) old_is_external = not old_is_internal new_is_internal = len(dic_data["EXTERNAL_FOLDER"]) == 0 new_is_external = not new_is_internal - path_old_data = self.dbGames.nom_fichero + path_old_data = self.db_games.path_file path_new_data = dic_data["FILEPATH_WITH_DATA"] reinit = False @@ -828,7 +828,7 @@ def tw_options(self): if new_is_external and old_is_external: new_link = dic_data["FILEPATH"] - old_link = self.dbGames.link_file + old_link = self.db_games.link_file if not Util.same_path(new_link, old_link): self.configuration.set_last_database(new_link) Util.remove_file(old_link) @@ -836,10 +836,10 @@ def tw_options(self): must_close = True if new_is_internal and old_is_external: - os.remove(self.dbGames.link_file) + os.remove(self.db_games.link_file) if not Util.same_path(path_old_data, path_new_data): - self.dbGames.close() + self.db_games.close() shutil.move(path_old_data, path_new_data) shutil.move(path_old_data + ".st1", path_new_data + ".st1") self.configuration.set_last_database(dic_data["FILEPATH"]) @@ -850,18 +850,18 @@ def tw_options(self): self.wb_database.reinit_sinsalvar(must_close) # para que no cree de nuevo al salvar configuración def tw_tags(self): - w = WTags(self, self.dbGames) + w = WTags(self, self.db_games) if w.exec_(): dic_cambios = w.dic_cambios um = QTUtil2.working(self) - dcabs = self.dbGames.read_config("dcabs", {}) + dcabs = self.db_games.read_config("dcabs", {}) reinit = False # Primero CREATE for dic in dic_cambios["CREATE"]: - self.dbGames.add_column(dic["KEY"]) + self.db_games.add_column(dic["KEY"]) dcabs[dic["KEY"]] = dic["LABEL"] reinit = True @@ -870,7 +870,7 @@ def tw_tags(self): for dic in dic_cambios["FILL"]: li_field_value.append((dic["KEY"], dic["VALUE"])) if li_field_value: - self.dbGames.fill(li_field_value) + self.db_games.fill(li_field_value) # Segundo FILL_PGN li_fill_pgn = [] @@ -879,21 +879,21 @@ def tw_tags(self): if li_fill_pgn: for key in li_fill_pgn: um.label("%s: %s" % (key, w.fill_pgn)) - self.dbGames.fill_pgn(key) + self.db_games.fill_pgn(key) # Tercero RENAME_LBL for dic in dic_cambios["RENAME"]: dcabs[dic["KEY"]] = dic["LABEL"] reinit = True - self.dbGames.save_config("dcabs", dcabs) + self.db_games.save_config("dcabs", dcabs) # Cuarto REMOVE lir = dic_cambios["REMOVE"] if len(lir) > 0: um = QTUtil2.working(self) lista = [x["KEY"] for x in lir] - self.dbGames.remove_columns(lista) + self.db_games.remove_columns(lista) self.changes = True reinit = True um.final() @@ -902,7 +902,7 @@ def tw_tags(self): self.wb_database.reinit_sinsalvar() # para que no cree de nuevo al salvar configuración else: - self.dbGames.reset_cache() + self.db_games.reset_cache() self.grid.refresh() um.final() @@ -911,46 +911,46 @@ def tw_edit_columns(self): w = GridEditCols.EditCols(self.grid, "columns_database") if w.exec_(): o_columns = self.grid.o_columns - dcabs = self.dbGames.read_config("dcabs", {}) + dcabs = self.db_games.read_config("dcabs", {}) for col in o_columns.li_columns: dcabs[col.key] = col.head - self.dbGames.save_config("dcabs", dcabs) + self.db_games.save_config("dcabs", dcabs) self.grid.releerColumnas() def readVarsConfig(self): - show_always = self.dbGames.read_config("GRAPHICS_SHOW_ALLWAYS") - specific = self.dbGames.read_config("GRAPHICS_SPECIFIC") + show_always = self.db_games.read_config("GRAPHICS_SHOW_ALLWAYS") + specific = self.db_games.read_config("GRAPHICS_SPECIFIC") return show_always, specific def graphicBoardReset(self): show_always, specific = self.readVarsConfig() - fich_graphic = self.dbGames.nom_fichero if specific else None + fich_graphic = self.db_games.path_file if specific else None self.infoMove.board.dbvisual_set_file(fich_graphic) self.infoMove.board.dbvisual_set_show_always(show_always) def tw_dir_show_yes(self): - self.dbGames.save_config("GRAPHICS_SHOW_ALLWAYS", True) + self.db_games.save_config("GRAPHICS_SHOW_ALLWAYS", True) self.graphicBoardReset() def tw_dir_show_no(self): - self.dbGames.save_config("GRAPHICS_SHOW_ALLWAYS", False) + self.db_games.save_config("GRAPHICS_SHOW_ALLWAYS", False) self.graphicBoardReset() def tw_locale_yes(self): - self.dbGames.save_config("GRAPHICS_SPECIFIC", True) + self.db_games.save_config("GRAPHICS_SPECIFIC", True) self.graphicBoardReset() def tw_locale_no(self): - self.dbGames.save_config("GRAPHICS_SPECIFIC", False) + self.db_games.save_config("GRAPHICS_SPECIFIC", False) self.graphicBoardReset() def tw_resize_columns(self): - um = QTUtil2.one_moment_please(self, _("Resizing")) + um = QTUtil2.one_moment_please(self.wb_database, _("Resizing")) self.grid.resizeColumnsToContents() um.final() def tw_utilities(self): - is_empty = self.dbGames.is_empty() + is_empty = self.db_games.is_empty() menu = QTVarios.LCMenu(self) if not is_empty: @@ -1035,7 +1035,7 @@ def tw_gm(self): fgm = GM.FabGM(name, li_players, side, result) if not selected: - li_selected = range(self.dbGames.reccount()) + li_selected = range(self.db_games.reccount()) nregs = len(li_selected) mensaje = _("Game") + " %d/" + str(nregs) tmp_bp = QTUtil2.BarraProgreso(self, title, "", nregs).mostrar() @@ -1044,7 +1044,7 @@ def tw_gm(self): if tmp_bp.is_canceled(): break - game = self.dbGames.read_game_recno(recno) + game = self.db_games.read_game_recno(recno) if n: tmp_bp.pon(n) tmp_bp.mensaje(mensaje % (n + 1,)) @@ -1070,9 +1070,9 @@ def tw_gm(self): def tw_uti_tactic(self): def rutinaDatos(recno, skip_first): dic = {} - for key in self.dbGames.li_fields: - dic[key] = self.dbGames.field(recno, key) - p = self.dbGames.read_game_recno(recno) + for key in self.db_games.li_fields: + dic[key] = self.db_games.field(recno, key) + p = self.db_games.read_game_recno(recno) if skip_first: dic["PGN_REAL"] = p.pgn() p.skip_first() @@ -1082,15 +1082,15 @@ def rutinaDatos(recno, skip_first): return dic li_registros_selected = self.grid.recnosSeleccionados() - li_registros_total = range(self.dbGames.reccount()) + li_registros_total = range(self.db_games.reccount()) WDB_Utils.create_tactics( - self.procesador, self, li_registros_selected, li_registros_total, rutinaDatos, self.dbGames.get_name() + self.procesador, self, li_registros_selected, li_registros_total, rutinaDatos, self.db_games.get_name() ) def tw_pack(self): - um = QTUtil2.one_moment_please(self) - self.dbGames.pack() + um = QTUtil2.one_moment_please(self.wb_database) + self.db_games.pack() um.final() def tw_massive_analysis(self): @@ -1106,7 +1106,7 @@ def tw_massive_analysis(self): if alm.multiple_selected: nregs = n_seleccionadas else: - nregs = self.dbGames.reccount() + nregs = self.db_games.reccount() if alm.workers == 1: self.tw_massive_analysis_1_worker(alm, nregs, li_seleccionadas) @@ -1147,7 +1147,7 @@ def tw_massive_analysis_1_worker(self, alm, nregs, li_seleccionadas): else: recno = n - game = self.dbGames.read_game_recno(recno) + game = self.db_games.read_game_recno(recno) self.grid.goto(recno, 0) # if lni: @@ -1165,7 +1165,7 @@ def tw_massive_analysis_1_worker(self, alm, nregs, li_seleccionadas): ap.li_selected = None ap.xprocesa(game, tmp_bp) - self.dbGames.save_game_recno(recno, game) + self.db_games.save_game_recno(recno, game) self.changes = True ap.cached_end() @@ -1209,8 +1209,7 @@ def tw_massive_analysis_1_worker(self, alm, nregs, li_seleccionadas): tmp_bp.cerrar() def tw_themes(self): - - um = QTUtil2.one_moment_please(self, _("Analyzing tactical themes")) + um = QTUtil2.one_moment_please(self.wb_database, _("Analyzing tactical themes")) a = WDB_Theme_Analysis.SelectedGameThemeAnalyzer(self) um.final() @@ -1224,15 +1223,15 @@ def tw_remove_duplicates(self): if not QTUtil2.pregunta(self, "%s\n%s" % (_("Remove duplicates"), _("Are you sure?"))): return - um = QTUtil2.one_moment_please(self, _("Remove duplicates")) - self.dbGames.remove_duplicates() + um = QTUtil2.one_moment_please(self.wb_database, _("Remove duplicates")) + self.db_games.remove_duplicates() um.final() self.grid.refresh() self.updateStatus() def tw_polyglot(self): - titulo = self.dbGames.get_name() + ".bin" + titulo = self.db_games.get_name() + ".bin" resp = PolyglotImportExports.export_polyglot_config(self, self.configuration, titulo) if resp is None: return @@ -1253,7 +1252,7 @@ def fsum(keymove, pt): dltmp.show() ok = PolyglotImportExports.add_db( - self.dbGames, plies, st_results, st_side, li_players, ru, time.time, 1.2, dltmp.dispatch, fsum + self.db_games, plies, st_results, st_side, li_players, ru, time.time, 1.2, dltmp.dispatch, fsum ) dltmp.close() @@ -1278,7 +1277,7 @@ def tw_exportar_db(self, lista): dbn = DBgames.DBgames(dbpath) if dbn.allows_duplicates: dl_tmp.hide_duplicates() - dbn.append_db(self.dbGames, lista, dl_tmp) + dbn.append_db(self.db_games, lista, dl_tmp) dbn.close() self.changes = False @@ -1292,11 +1291,11 @@ def tw_exportar_pgn(self, only_selected): if only_selected: li_sel = self.grid.recnosSeleccionados() else: - li_sel = list(range(self.dbGames.reccount())) + li_sel = list(range(self.db_games.reccount())) pb.set_total(len(li_sel)) for n, recno in enumerate(li_sel): pb.pon(n) - game = self.dbGames.read_game_recno(recno) + game = self.db_games.read_game_recno(recno) if pb.is_canceled(): break if game is None: @@ -1329,7 +1328,7 @@ def tw_exportar_csv(self, only_selected): if only_selected: li_sel = self.grid.recnosSeleccionados() else: - li_sel = list(range(self.dbGames.reccount())) + li_sel = list(range(self.db_games.reccount())) pb.set_total(len(li_sel)) li_fields = [] for col in self.grid.oColumnasR.li_columns: @@ -1353,9 +1352,9 @@ def tw_exportar_csv(self, only_selected): break li_data = [] for key, head in li_fields: - li_data.append(self.dbGames.field(recno, key)) - xpv = self.dbGames.field(recno, "XPV") - fen, pv = self.dbGames.read_xpv(xpv) + li_data.append(self.db_games.field(recno, key)) + xpv = self.db_games.field(recno, "XPV") + fen, pv = self.db_games.read_xpv(xpv) game.reset() if fen: game.set_fen(fen) @@ -1376,10 +1375,10 @@ def tw_importar_PGN(self): return None dl_tmp = QTVarios.ImportarFicheroPGN(self) - if self.dbGames.allows_duplicates: + if self.db_games.allows_duplicates: dl_tmp.hide_duplicates() dl_tmp.show() - self.dbGames.import_pgns(files, dl_tmp) + self.db_games.import_pgns(files, dl_tmp) self.changes = True self.rehaz_columnas() @@ -1393,12 +1392,12 @@ def tw_importar_DB(self): return None dl_tmp = QTVarios.ImportarFicheroDB(self) - if self.dbGames.allows_duplicates: + if self.db_games.allows_duplicates: dl_tmp.hide_duplicates() dl_tmp.show() dbn = DBgames.DBgames(path) - self.dbGames.append_db(dbn, range(dbn.all_reccount()), dl_tmp) + self.db_games.append_db(dbn, range(dbn.all_reccount()), dl_tmp) self.changes = True self.rehaz_columnas() @@ -1519,7 +1518,7 @@ def url_id(url): g.set_tag("Popularity", popularity) g.set_tag("NBPlays", nbplays) g.set_tag("GameURL", gameurl) - self.dbGames.insert(g, with_commit=(n % 1000) == 0) + self.db_games.insert(g, with_commit=(n % 1000) == 0) if n % 10 == 0: pb.pon(f.tell()) if pb.is_canceled(): @@ -1527,7 +1526,7 @@ def url_id(url): line = f.readline() n += 1 pb.cerrar() - self.dbGames.commit() + self.db_games.commit() self.changes = True self.rehaz_columnas() diff --git a/bin/Code/Databases/WDB_Players.py b/bin/Code/Databases/WDB_Players.py index e4a423ef..197c78a4 100644 --- a/bin/Code/Databases/WDB_Players.py +++ b/bin/Code/Databases/WDB_Players.py @@ -91,7 +91,7 @@ def run_p(self): class WPlayer(QtWidgets.QWidget): - def __init__(self, procesador, wb_database, dbGames): + def __init__(self, procesador, wb_database, db_games): QtWidgets.QWidget.__init__(self) self.wb_database = wb_database @@ -197,7 +197,7 @@ def __init__(self, procesador, wb_database, dbGames): self.setLayout(layout) - self.setdbGames(dbGames) + self.setdbGames(db_games) self.setPlayer(self.leeVariable("PLAYER", "")) def dispatchMoves(self, side, opcion): @@ -239,8 +239,8 @@ def dispatchMoves(self, side, opcion): self.lastFilterMoves[side] = opcion - def setdbGames(self, dbGames): - self.dbGames = dbGames + def setdbGames(self, db_games): + self.db_games = db_games self.setPlayer(self.leeVariable("PLAYER", "")) def setPlayer(self, player): @@ -350,17 +350,17 @@ def grid_tecla_control(self, grid, k, is_shift, is_control, is_alt): return True # que siga con el resto de teclas def leeVariable(self, var, default=None): - return self.dbGames.read_config(var, default) + return self.db_games.read_config(var, default) def escVariable(self, var, valor): - self.dbGames.save_config(var, valor) + self.db_games.save_config(var, valor) def listaPlayers(self): return self.leeVariable("LISTA_PLAYERS", []) def rereadPlayers(self): um = QTUtil2.one_moment_please(self) - lista = self.dbGames.players() + lista = self.db_games.players() self.escVariable("LISTA_PLAYERS", lista) um.final() @@ -391,7 +391,7 @@ def change_player(self, lp): self.tw_rebuild() def test_players_in_db(self): - if self.dbGames.has_field("WHITE") and self.dbGames.has_field("BLACK"): + if self.db_games.has_field("WHITE") and self.db_games.has_field("BLACK"): return True QTUtil2.message(self, _("This database has no players")) return False @@ -421,7 +421,7 @@ def tw_changeplayer(self): def tw_rebuild(self): if not self.test_players_in_db(): return - if not self.dbGames.has_field("RESULT"): + if not self.db_games.has_field("RESULT"): QTUtil2.message(self, _("This database does not have a RESULT field")) return @@ -443,9 +443,9 @@ def tw_rebuild(self): for alias in (alias1, alias2, alias3): if alias: filtro += "or WHITE = '%s' or BLACK = '%s'" % (alias, alias) - pb.set_total(self.dbGames.count_data(filtro)) + pb.set_total(self.db_games.count_data(filtro)) - for n, alm in enumerate(self.dbGames.yield_data(liFields, filtro)): + for n, alm in enumerate(self.db_games.yield_data(liFields, filtro)): pb.pon(n) if pb.is_canceled(): self.rebuilding = False diff --git a/bin/Code/Databases/WDB_Summary.py b/bin/Code/Databases/WDB_Summary.py index 9669cfe2..b8b713d4 100644 --- a/bin/Code/Databases/WDB_Summary.py +++ b/bin/Code/Databases/WDB_Summary.py @@ -16,12 +16,12 @@ class WSummary(QtWidgets.QWidget): - def __init__(self, procesador, wb_database, dbGames, siMoves=True): + def __init__(self, procesador, wb_database, db_games, siMoves=True): QtWidgets.QWidget.__init__(self) self.wb_database = wb_database - self.dbGames = dbGames # <--setdbGames + self.db_games = db_games # <--setdbGames self.infoMove = None # <-- setInfoMove self.wmoves = None # <-- setwmoves self.liMoves = [] @@ -143,8 +143,8 @@ def func(dic): self.liMoves = li self.grid.refresh() - def setdbGames(self, dbGames): - self.dbGames = dbGames + def setdbGames(self, db_games): + self.db_games = db_games def focusInEvent(self, event): self.wb_database.ultFocus = self @@ -274,7 +274,7 @@ def siguiente(self): self.cambiaInfoMove() def reindexar(self): - return self.reindexar_question(self.dbGames.depth_stat(), True) + return self.reindexar_question(self.db_games.depth_stat(), True) def reindexar_question(self, depth, question): if question or self.wb_database.is_temporary: @@ -286,7 +286,7 @@ def reindexar_question(self, depth, question): li_gen.append((None, None)) config = FormLayout.Spinbox(_("Depth"), 0, 999, 50) - li_gen.append((config, self.dbGames.depth_stat())) + li_gen.append((config, self.db_games.depth_stat())) resultado = FormLayout.fedit(li_gen, title=_("Rebuild"), parent=self, icon=Iconos.Reindexar()) if resultado is None: @@ -308,7 +308,7 @@ def dispatch(recno, reccount): bpTmp.pon(recno) return not bpTmp.is_canceled() - self.dbGames.rebuild_stat(dispatch, depth) + self.db_games.rebuild_stat(dispatch, depth) bpTmp.cerrar() self.start() @@ -357,7 +357,7 @@ def actualizaPV(self, pvBase): if analisisMRM: for rm in analisisMRM.li_rm: dic_analisis[rm.movimiento()] = rm - self.liMoves = self.dbGames.get_summary(pvMirar, dic_analisis, self.with_figurines, self.allmoves) + self.liMoves = self.db_games.get_summary(pvMirar, dic_analisis, self.with_figurines, self.allmoves) self.grid.refresh() self.grid.gotop() diff --git a/bin/Code/Databases/WindowDatabase.py b/bin/Code/Databases/WindowDatabase.py index 06a4055e..3bd3b882 100644 --- a/bin/Code/Databases/WindowDatabase.py +++ b/bin/Code/Databases/WindowDatabase.py @@ -22,24 +22,24 @@ def __init__(self, w_parent, procesador, file_database, is_temporary, si_select) self.reiniciar = False # lo usamos para cambiar de database - self.dbGames = DBgames.DBgames(file_database) + self.db_games = DBgames.DBgames(file_database) self.dicvideo = self.restore_dicvideo() dicVideo = self.dicvideo siSummary = not si_select - self.wplayer = WDB_Players.WPlayer(procesador, self, self.dbGames) + self.wplayer = WDB_Players.WPlayer(procesador, self, self.db_games) self.wplayer_active = False if siSummary: - self.wsummary = WDB_Summary.WSummary(procesador, self, self.dbGames, siMoves=False) + self.wsummary = WDB_Summary.WSummary(procesador, self, self.db_games, siMoves=False) self.register_grid(self.wsummary.grid) else: self.wsummary = None - self.wgames = WDB_Games.WGames(self, self.dbGames, self.wsummary, si_select) + self.wgames = WDB_Games.WGames(self, self.db_games, self.wsummary, si_select) self.ultFocus = None @@ -83,7 +83,7 @@ def __init__(self, w_parent, procesador, file_database, is_temporary, si_select) sz = dicVideo["SPLITTER"] self.splitter.setSizes(sz) - dic_grid = self.dbGames.read_config("dic_grid") + dic_grid = self.db_games.read_config("dic_grid") if not dic_grid: key = "databases_columns_default" dic_grid = self.configuration.read_variables(key) @@ -106,14 +106,14 @@ def tw_terminar(self): def tw_aceptar(self): self.game, recno = self.wgames.current_game() - self.dbGames.close() + self.db_games.close() if self.game is not None: self.accept() else: self.reject() def tw_cancelar(self): - self.dbGames.close() + self.db_games.close() self.game = None self.reject() @@ -143,14 +143,14 @@ def tabChanged(self, ntab): self.wsummary.gridActualiza() def inicializa(self): - self.setWindowTitle(self.dbGames.label()) - self.wgames.setdbGames(self.dbGames) + self.setWindowTitle(self.db_games.label()) + self.wgames.setdbGames(self.db_games) self.wgames.setInfoMove(self.infoMove) self.wplayer.setInfoMove(self.infoMove) - self.wplayer.setdbGames(self.dbGames) + self.wplayer.setdbGames(self.db_games) if self.wsummary: self.wsummary.setInfoMove(self.infoMove) - self.wsummary.setdbGames(self.dbGames) + self.wsummary.setdbGames(self.db_games) self.wsummary.actualizaPV("") self.wgames.actualiza(True) if self.is_temporary: @@ -163,16 +163,16 @@ def salvar(self): dic = {} self.wgames.grid.save_video(dic) - self.dbGames.save_config("dic_grid", dic) + self.db_games.save_config("dic_grid", dic) def reinit(self): self.salvar() - self.dbGames.close() + self.db_games.close() self.reiniciar = True self.accept() def reinit_sinsalvar(self, must_close=True): if must_close: - self.dbGames.close() + self.db_games.close() self.reiniciar = True self.accept() diff --git a/bin/Code/Expeditions/Everest.py b/bin/Code/Expeditions/Everest.py index 299aa1f0..8a070fb4 100644 --- a/bin/Code/Expeditions/Everest.py +++ b/bin/Code/Expeditions/Everest.py @@ -200,9 +200,9 @@ class Expeditions: def __init__(self, configuration): self.configuration = configuration - nom_fichero = configuration.ficheroExpeditions + path_file = configuration.ficheroExpeditions - self.db = Base.DBBase(nom_fichero) + self.db = Base.DBBase(path_file) self.tabla = "Expeditions" if not self.db.existeTabla(self.tabla): self.creaTabla() diff --git a/bin/Code/Expeditions/ManagerEverest.py b/bin/Code/Expeditions/ManagerEverest.py index d3761ced..cb087c21 100644 --- a/bin/Code/Expeditions/ManagerEverest.py +++ b/bin/Code/Expeditions/ManagerEverest.py @@ -139,7 +139,7 @@ def restart(self, lost_points): licoment.append(_("You must repeat the game")) if licoment: comment = "\n".join(licoment) - QTUtil2.message_result(self.main_window, comment) + QTUtil2.message_information(self.main_window, comment) return change_game def analyze_begin(self): @@ -252,7 +252,7 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): jg_usu.pgn_translated(), bmove, ) - QTUtil2.message_result(self.main_window, comment) + QTUtil2.message_information(self.main_window, comment) si_analiza_juez = False else: si_analiza_juez = True diff --git a/bin/Code/GM/GM.py b/bin/Code/GM/GM.py index fac5de81..ba98086c 100644 --- a/bin/Code/GM/GM.py +++ b/bin/Code/GM/GM.py @@ -188,7 +188,8 @@ def gen_toselect(self): li_regs = [] for num, part in enumerate(self.li_gm_games): dic = dict( - NOMBRE=part.oponent, FECHA=part.date, ECO=part.opening, RESULT=part.result, NUMBER=num, EVENT=part.event + NOMBRE=part.oponent, FECHA=part.date, ECO=part.opening, RESULT=part.result, NUMBER=num, + EVENT=part.event, NUMMOVES=f"{len(part.li_pv):3d}" ) li_regs.append(dic) return li_regs diff --git a/bin/Code/GM/WindowGM.py b/bin/Code/GM/WindowGM.py index 22c4d5d0..dc56e878 100644 --- a/bin/Code/GM/WindowGM.py +++ b/bin/Code/GM/WindowGM.py @@ -752,7 +752,7 @@ def __init__(self, wgm, ogm): name = dgm.get(ogm.gm, ogm.gm) titulo = "%s - %s" % (_("One game"), name) icono = Iconos.Uno() - extparam = "gm1g" + extparam = "gm1g_1" LCDialog.LCDialog.__init__(self, wgm, titulo, icono, extparam) o_columns = Columnas.ListaColumnas() @@ -761,6 +761,7 @@ def __init__(self, wgm, ogm): o_columns.nueva("EVENT", _("Event"), 140, align_center=True) o_columns.nueva("ECO", _("ECO"), 40, align_center=True) o_columns.nueva("RESULT", _("Result"), 64, align_center=True) + o_columns.nueva("NUMMOVES", _("Moves"), 64, align_center=True) self.grid = Grid.Grid(self, o_columns, siSelecFilas=True, siSeleccionMultiple=True) nAnchoPgn = self.grid.anchoColumnas() + 20 self.grid.setMinimumWidth(nAnchoPgn) diff --git a/bin/Code/Kibitzers/WKibCommon.py b/bin/Code/Kibitzers/WKibCommon.py index a3f2c29e..0726b5a8 100644 --- a/bin/Code/Kibitzers/WKibCommon.py +++ b/bin/Code/Kibitzers/WKibCommon.py @@ -81,11 +81,11 @@ def save_video(self, dic_extended=None): self.cpu.save_video(dic) - def restore_video(self, dicVideo): - if dicVideo: + def restore_video(self, dic_video): + if dic_video: w_e, h_e = QTUtil.desktop_size() - if "_POSICION_" in dicVideo: - x, y = dicVideo["_POSICION_"].split(",") + if "_POSICION_" in dic_video: + x, y = dic_video["_POSICION_"].split(",") x = int(x) y = int(y) if not (0 <= x <= (w_e - 50)): @@ -93,13 +93,13 @@ def restore_video(self, dicVideo): if not (0 <= y <= (h_e - 50)): y = 0 self.move(x, y) - if not ("_SIZE_" in dicVideo): + if not ("_SIZE_" in dic_video): w, h = self.width(), self.height() - for k in dicVideo: + for k in dic_video: if k.startswith("_TAMA"): - w, h = dicVideo[k].split(",") + w, h = dic_video[k].split(",") else: - w, h = dicVideo["_SIZE_"].split(",") + w, h = dic_video["_SIZE_"].split(",") w = int(w) h = int(h) if w > w_e: @@ -112,6 +112,11 @@ def restore_video(self, dicVideo): h = 20 self.resize(w, h) + if hasattr(self, "grid"): + self.grid.restore_video(dic_video) + self.grid.releerColumnas() + + def config_board(self): self.show_board = not self.show_board self.board.setVisible(self.show_board) diff --git a/bin/Code/Kibitzers/WKibDatabases.py b/bin/Code/Kibitzers/WKibDatabases.py index c86bf0c8..06a3d07a 100644 --- a/bin/Code/Kibitzers/WKibDatabases.py +++ b/bin/Code/Kibitzers/WKibDatabases.py @@ -57,6 +57,8 @@ def __init__(self, cpu): self.wgames.tbWork.hide() self.wgames.status.hide() + self.grid = self.wgames.grid + self.status = QtWidgets.QStatusBar(self) self.status.setFixedHeight(22) @@ -78,6 +80,7 @@ def __init__(self, cpu): ("%s: %s" % (_("Disable"), _("window on top")), Iconos.Kibitzer_Down(), self.windowBottom), (_("Takeback"), Iconos.Kibitzer_Back(), self.takeback), (_("Show/hide board"), Iconos.Kibitzer_Board(), self.config_board), + (_("Configure the columns"), Iconos.EditColumns(), self.edit_columns), ) self.tb = Controles.TBrutina(self, li_acciones, with_text=False, icon_size=24) self.tb.set_action_visible(self.play, False) @@ -109,6 +112,9 @@ def __init__(self, cpu): if not self.show_board: self.board.hide() + def edit_columns(self): + self.wgames.tw_edit_columns() + def check_input(self): self.show_num_games() self.cpu.check_input() @@ -236,7 +242,7 @@ def edit_game(self, recno, game): game = self.manager_game( self, game, - not self.wgames.dbGames.allows_positions, + not self.wgames.db_games.allows_positions, False, self.wgames.infoMove.board, with_previous_next=with_previous_next, diff --git a/bin/Code/LearnGame/ManagerPlayGame.py b/bin/Code/LearnGame/ManagerPlayGame.py index 659bdca2..f88687a0 100644 --- a/bin/Code/LearnGame/ManagerPlayGame.py +++ b/bin/Code/LearnGame/ManagerPlayGame.py @@ -287,7 +287,7 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): bmove, ) if self.show_rating in (self.show_rating_always, self.show_rating_different): - QTUtil2.message_result(self.main_window, comment) + QTUtil2.message_information(self.main_window, comment) si_analiza_juez = False else: si_analiza_juez = True diff --git a/bin/Code/MainWindow/LucasChessGui.py b/bin/Code/MainWindow/LucasChessGui.py index d5a5e50a..31642d47 100644 --- a/bin/Code/MainWindow/LucasChessGui.py +++ b/bin/Code/MainWindow/LucasChessGui.py @@ -68,6 +68,7 @@ def select_language(owner, init): def run_gui(procesador): + app = QtWidgets.QApplication([]) main_config = Configuration.Configuration("") first_run = main_config.first_run main_config.lee() @@ -76,8 +77,6 @@ def run_gui(procesador): QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps) QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseStyleSheetPropagationInWidgetStyles, True) - app = QtWidgets.QApplication([]) - # Usuarios list_users = Usuarios.Usuarios().list_users if len(list_users) > 1: diff --git a/bin/Code/Manager.py b/bin/Code/Manager.py index 5607fe56..524bc728 100644 --- a/bin/Code/Manager.py +++ b/bin/Code/Manager.py @@ -1468,7 +1468,6 @@ def config_sonido(self): self.configuration.graba() def utilities(self, li_extra_options=None, with_tree=True): - menu = QTVarios.LCMenu(self.main_window) si_jugadas = len(self.game) > 0 @@ -1537,16 +1536,14 @@ def utilities(self, li_extra_options=None, with_tree=True): if not (self.game_type in ( GT_ELO, GT_MICELO, GT_WICKER) and self.is_competitive and self.state == ST_PLAYING): menu.separador() - n_analisis = 0 - for move in self.game.li_moves: - if move.analysis: - n_analisis += 1 - if n_analisis > 4: + + has_analysis = self.game.has_analisis() + if has_analysis: submenu = menu.submenu(_("Analysis"), Iconos.Analizar()) else: submenu = menu submenu.opcion("analizar", _("Analyze"), Iconos.Analizar()) - if n_analisis > 4: + if has_analysis: submenu.separador() submenu.opcion("analizar_grafico", _("Show graphics"), Iconos.Estadisticas()) menu.separador() @@ -1754,7 +1751,7 @@ def save_db(self, database): resp = db.insert(pc) db.close() if resp: - QTUtil2.message_bold(self.main_window, _("Saved") + ": " + db.nom_fichero) + QTUtil2.message_bold(self.main_window, _("Saved") + ": " + db.path_file) else: QTUtil2.message_error(self.main_window, _("This game already exists.")) @@ -1842,7 +1839,7 @@ def save_fen(self, siFichero): else: QTUtil.ponPortapapeles(dato) - QTUtil2.message(self.main_window, _("FEN is in clipboard")) + QTVarios.fen_is_in_clipboard(self.main_window) def arbol(self): row, column = self.main_window.pgnPosActual() diff --git a/bin/Code/ManagerEntPos.py b/bin/Code/ManagerEntPos.py index 5a336c0e..2cb94db9 100644 --- a/bin/Code/ManagerEntPos.py +++ b/bin/Code/ManagerEntPos.py @@ -36,6 +36,24 @@ class ManagerEntPos(Manager.Manager): line_fns: FNSLine.FNSLine pos_obj: int game_obj: [Game.Game, None] + pos_training: int + num_trainings: int + title_training: str + li_trainings: list + is_automatic_jump: bool + remove_solutions: bool + advanced: bool + entreno: str + li_histo: list + pos_training_origin: int + is_human_side_white: bool + is_engine_side_white: bool + is_tutor_enabled: bool + reiniciando: bool + is_rival_thinking: bool + is_analyzing: bool + current_helps: int + li_options_toolbar: list def set_training(self, entreno): # Guarda el ultimo entrenamiento en el db de entrenos @@ -52,7 +70,7 @@ def save_pos(self, pos_training): def start( self, pos_training, num_trainings, title_training, li_trainings, is_tutor_enabled, is_automatic_jump, - advanced + remove_solutions, advanced ): if hasattr(self, "reiniciando"): if self.reiniciando: @@ -68,6 +86,7 @@ def start( self.title_training = title_training self.li_trainings = li_trainings self.is_automatic_jump = is_automatic_jump + self.remove_solutions = remove_solutions self.advanced = advanced self.li_histo = [self.pos_training] @@ -77,6 +96,8 @@ def start( linea, self.pos_training_origin = self.li_trainings[self.pos_training - 1] self.line_fns = FNSLine.FNSLine(linea) + if self.remove_solutions: + self.line_fns.game_obj = None self.game_obj = self.line_fns.game_obj self.pos_obj = 0 @@ -183,7 +204,7 @@ def advanced_return(self, solved): for move in self.game_obj.li_moves: self.game.add_move(move) self.goto_end() - self.lineaTerminadaOpciones() + self.linea_terminada_opciones() else: self.advanced = False @@ -268,6 +289,7 @@ def reiniciar(self): self.li_trainings, self.is_tutor_enabled, self.is_automatic_jump, + self.remove_solutions, self.advanced, ) @@ -288,6 +310,7 @@ def ent_siguiente(self, tipo): self.li_trainings, self.is_tutor_enabled, self.is_automatic_jump, + self.remove_solutions, self.advanced, ) @@ -301,7 +324,8 @@ def control_teclado(self, nkey, modifiers): li[2] = self.game.pgnBaseRAW() self.saveSelectedPosition("|".join(li)) - def listHelpTeclado(self): + @staticmethod + def list_help_keyboard(): return [ ("+/%s" % _("Page Down"), _("Next position")), ("-/%s" % _("Page Up"), _("Previous position")), @@ -350,9 +374,9 @@ def play_next_move(self): self.set_side_indicator(is_white) self.refresh() - siRival = is_white == self.is_engine_side_white + si_rival = is_white == self.is_engine_side_white - if siRival: + if si_rival: self.pon_help(False) self.piensa_rival() @@ -363,7 +387,7 @@ def play_next_move(self): def piensa_humano(self, is_white): if self.game_obj and self.pos_obj == len(self.game_obj): - self.lineaTerminadaOpciones() + self.linea_terminada_opciones() return self.human_is_playing = True @@ -379,7 +403,7 @@ def piensa_rival(self): if is_obj: if self.game_obj and self.pos_obj == len(self.game_obj): self.is_rival_thinking = False - self.lineaTerminadaOpciones() + self.linea_terminada_opciones() return move = self.game_obj.move(self.pos_obj) self.pos_obj += 1 @@ -399,7 +423,7 @@ def piensa_rival(self): self.add_move(move, False) if is_obj and len(self.game_obj) == self.pos_obj: - self.lineaTerminadaOpciones() + self.linea_terminada_opciones() self.play_next_move() @@ -451,7 +475,7 @@ def sigue(self): self.game_obj = None self.play_next_move() - def lineaTerminadaOpciones(self): + def linea_terminada_opciones(self): self.pon_help(False) self.state = ST_ENDGAME if self.is_automatic_jump: @@ -534,17 +558,17 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): self.add_move(move, True) if self.game_obj and self.pos_obj >= len(self.game_obj): - self.lineaTerminadaOpciones() + self.linea_terminada_opciones() self.play_next_move() return True - def add_move(self, move, siNuestra): + def add_move(self, move, si_nuestra): self.game.add_move(move) self.check_boards_setposition() self.put_arrow_sc(move.from_sq, move.to_sq) - self.beepExtendido(siNuestra) + self.beepExtendido(si_nuestra) self.pgnRefresh(self.game.last_position.is_white) self.refresh() @@ -586,21 +610,21 @@ def create_tactics(self): # Se leen todos los fens with open(self.entreno, "rt", errors="ignore") as f: - liBase = [linea.strip() for linea in f if linea.strip()] + li_base = [linea.strip() for linea in f if linea.strip()] # Se crea el file con los puzzles - nregs = len(liBase) - tmpBP = QTUtil2.BarraProgreso(self.main_window, name_tactic, _("Working..."), nregs) - tmpBP.mostrar() + nregs = len(li_base) + tmp_bp = QTUtil2.BarraProgreso(self.main_window, name_tactic, _("Working..."), nregs) + tmp_bp.mostrar() with open(nom_fns, "wt", encoding="utf-8", errors="ignore") as q: for n in range(nregs): - if tmpBP.is_canceled(): + if tmp_bp.is_canceled(): break - tmpBP.pon(n + 1) + tmp_bp.pon(n + 1) - linea = liBase[n] + linea = li_base[n] li = linea.split("|") fen = li[0] if len(li) < 3 or not li[2]: @@ -629,17 +653,17 @@ def create_tactics(self): q.write(txt + "\n") - tmpBP.cerrar() + tmp_bp.cerrar() # Se crea el file de control - dicIni = {} - dicIni[nom_tactic] = d = {} + dic_ini = {} + dic_ini[nom_tactic] = d = {} d["MENU"] = name_tactic d["FILESW"] = "%s:100" % os.path.basename(nom_fns) nom_dir = Util.relative_path(os.path.realpath(nom_dir)) - Util.dic2ini(nom_ini, dicIni) + Util.dic2ini(nom_ini, dic_ini) name = os.path.basename(nom_dir) diff --git a/bin/Code/ManagerSolo.py b/bin/Code/ManagerSolo.py index 2d2e8c2d..6384bffc 100644 --- a/bin/Code/ManagerSolo.py +++ b/bin/Code/ManagerSolo.py @@ -460,7 +460,7 @@ def utilities_gs(self): li_extra_options = ( (None, _("Change the starting position"), Iconos.PGN()), sep, - ("position", _("Board editor") + " [%sS]" % ctrl, Iconos.Datos()), + ("position", _("Board editor") + " [%sE]" % ctrl, Iconos.Datos()), sep, ("initial", _("Basic position") + " [%sB]" % ctrl, Iconos.Board()), sep, @@ -589,12 +589,12 @@ def control_teclado(self, nkey, modifiers): if is_control: self.basic_initial_position() - def listHelpTeclado(self): + def list_help_keyboard(self): ctrl = _("CTRL") + " " return [ (ctrl + "V", _("Paste position")), (ctrl + "T", _("Save position in 'Selected positions' file")), - (ctrl + "S", _("Board editor")), + (ctrl + "E", _("Board editor")), (ctrl + "B", _("Basic position")), (ctrl + "1", _("Play instead of me")), (ctrl + "2", _("Help to move")), diff --git a/bin/Code/Maps/WorkMap.py b/bin/Code/Maps/WorkMap.py index 1bc60798..50872b56 100644 --- a/bin/Code/Maps/WorkMap.py +++ b/bin/Code/Maps/WorkMap.py @@ -678,7 +678,7 @@ def win_aim(self, window, pv): self.db.saveWork(self) if si_end: mensaje = _("Congratulations, goal achieved") + "

" + _("Finished") + ": " + self.name_map() - QTUtil2.message_result(window, mensaje) + QTUtil2.message_result_win(window, mensaje) return si_end def calcINFO(self): diff --git a/bin/Code/Menus/MenuTrainings.py b/bin/Code/Menus/MenuTrainings.py index 509ce2e5..fb9d474d 100644 --- a/bin/Code/Menus/MenuTrainings.py +++ b/bin/Code/Menus/MenuTrainings.py @@ -458,6 +458,7 @@ def menu_run(self, resp): tipo = data.get("TYPE", "s") advanced = data.get("ADVANCED", False) tutor_active = data.get("TUTOR_ACTIVE", True) + remove_solutions = data.get("REMOVE_SOLUTIONS", False) resp = params_training_position( self.procesador.main_window, titentreno, @@ -466,17 +467,19 @@ def menu_run(self, resp): jump, tutor_active, tipo, + remove_solutions, advanced, ) if resp is None: db.close() return - pos, tipo, tutor_active, jump, advanced = resp + pos, tipo, tutor_active, jump, remove_solutions, advanced = resp db[entreno] = { "POSULTIMO": pos, "SALTA": jump, "TYPE": tipo, "ADVANCED": advanced, + "REMOVE_SOLUTIONS": remove_solutions, "TUTOR_ACTIVE": tutor_active, } db.close() @@ -485,8 +488,9 @@ def menu_run(self, resp): random.seed(pos) random.shuffle(li_entrenamientos) pos = 1 - self.procesador.entrenaPos( - pos, n_posiciones, titentreno, li_entrenamientos, entreno, tutor_active, jump, advanced + self.procesador.train_position( + pos, n_posiciones, titentreno, li_entrenamientos, entreno, tutor_active, jump, + remove_solutions, advanced ) elif resp == "learnGame": @@ -743,12 +747,12 @@ def xopcion(menu, key, texto, icono, is_disabled=False): return resp if resp is None else Util.relative_path(resp[3:]) -def params_training_position(w_parent, titulo, nFEN, pos, salta, tutor_active, tipo, advanced): +def params_training_position(w_parent, titulo, n_fen, pos, salta, tutor_active, tipo, remove_solutions, advanced): form = FormLayout.FormLayout(w_parent, titulo, Iconos.Entrenamiento(), anchoMinimo=200) form.separador() - label = "%s (1..%d)" % (_("Select position"), nFEN) - form.spinbox(label, 1, nFEN, 50, pos) + label = "%s (1..%d)" % (_("Select position"), n_fen) + form.spinbox(label, 1, n_fen, 50, pos) form.separador() li = [(_("Sequential"), "s"), (_("Random"), "r"), (_("Random with same sequence based on position"), "rk")] @@ -760,6 +764,9 @@ def params_training_position(w_parent, titulo, nFEN, pos, salta, tutor_active, t form.separador() form.checkbox(_("Jump to the next after solving"), salta) + form.separador() + form.checkbox(_("Remove pre-defined solutions"), remove_solutions) + form.separador() form.checkbox(_("Advanced mode"), advanced) @@ -767,7 +774,9 @@ def params_training_position(w_parent, titulo, nFEN, pos, salta, tutor_active, t resultado = form.run() if resultado: - position, tipo, tutor_active, jump, advanced = resultado[1] - return position, tipo, tutor_active, jump, advanced + position, tipo, tutor_active, jump, remove_solutions, advanced = resultado[1] + if remove_solutions: + advanced = False + return position, tipo, tutor_active, jump, remove_solutions, advanced else: return None diff --git a/bin/Code/Openings/ManagerOPLEngines.py b/bin/Code/Openings/ManagerOPLEngines.py index dbab6679..995654a4 100644 --- a/bin/Code/Openings/ManagerOPLEngines.py +++ b/bin/Code/Openings/ManagerOPLEngines.py @@ -31,7 +31,7 @@ def start(self, pathFichero): self.board.saveVisual() self.pathFichero = pathFichero dbop = OpeningLines.Opening(pathFichero) - self.board.dbvisual_set_file(dbop.nom_fichero) + self.board.dbvisual_set_file(dbop.path_file) self.reinicio(dbop) def reinicio(self, dbop): diff --git a/bin/Code/Openings/ManagerOPLSequential.py b/bin/Code/Openings/ManagerOPLSequential.py index 5bbe7211..45f89bc5 100644 --- a/bin/Code/Openings/ManagerOPLSequential.py +++ b/bin/Code/Openings/ManagerOPLSequential.py @@ -32,7 +32,7 @@ def start(self, pathFichero): self.pathFichero = pathFichero dbop = OpeningLines.Opening(pathFichero) - self.board.dbvisual_set_file(dbop.nom_fichero) + self.board.dbvisual_set_file(dbop.path_file) self.reinicio(dbop) def reinicio(self, dbop): diff --git a/bin/Code/Openings/ManagerOPLStatic.py b/bin/Code/Openings/ManagerOPLStatic.py index 1004a871..e49e08fe 100644 --- a/bin/Code/Openings/ManagerOPLStatic.py +++ b/bin/Code/Openings/ManagerOPLStatic.py @@ -29,7 +29,7 @@ def start(self, pathFichero, modo, num_linea): self.pathFichero = pathFichero dbop = OpeningLines.Opening(pathFichero) - self.board.dbvisual_set_file(dbop.nom_fichero) + self.board.dbvisual_set_file(dbop.path_file) self.reinicio(dbop, modo, num_linea) def reinicio(self, dbop, modo, num_linea): diff --git a/bin/Code/Openings/OpeningLines.py b/bin/Code/Openings/OpeningLines.py index bb94dc59..46bcd975 100644 --- a/bin/Code/Openings/OpeningLines.py +++ b/bin/Code/Openings/OpeningLines.py @@ -237,10 +237,10 @@ def add_training_engines_file(self, file): class Opening: - def __init__(self, nom_fichero): - self.nom_fichero = nom_fichero + def __init__(self, path_file): + self.path_file = path_file - self._conexion = sqlite3.connect(nom_fichero) + self._conexion = sqlite3.connect(path_file) self.cache = {} self.max_cache = 1000 @@ -257,13 +257,13 @@ def __init__(self, nom_fichero): self.db_history_base = None self.db_cache_engines = None self.basePV = self.getconfig("BASEPV", "") - self.title = self.getconfig("TITLE", os.path.basename(nom_fichero)[:-4]) + self.title = self.getconfig("TITLE", os.path.basename(path_file)[:-4]) # Check visual - if not UtilSQL.check_table_in_db(nom_fichero, "Flechas"): + if not UtilSQL.check_table_in_db(path_file, "Flechas"): file_resources = Code.configuration.ficheroRecursos for tabla in ("Config", "Flechas", "Marcos", "SVGs", "Markers"): - dbr = UtilSQL.DictSQL(nom_fichero, tabla=tabla) + dbr = UtilSQL.DictSQL(path_file, tabla=tabla) dbv = UtilSQL.DictSQL(file_resources, tabla=tabla) dbr.copy_from(dbv) dbr.close() @@ -274,24 +274,24 @@ def __init__(self, nom_fichero): @property def db_config(self): if self.db_config_base is None: - self.db_config_base = UtilSQL.DictSQL(self.nom_fichero, tabla="CONFIG") + self.db_config_base = UtilSQL.DictSQL(self.path_file, tabla="CONFIG") return self.db_config_base @property def db_fenvalues(self): if self.db_fenvalues_base is None: - self.db_fenvalues_base = UtilSQL.DictSQL(self.nom_fichero, tabla="FENVALUES") + self.db_fenvalues_base = UtilSQL.DictSQL(self.path_file, tabla="FENVALUES") return self.db_fenvalues_base @property def db_history(self): if self.db_history_base is None: - self.db_history_base = UtilSQL.DictSQL(self.nom_fichero, tabla="HISTORY") + self.db_history_base = UtilSQL.DictSQL(self.path_file, tabla="HISTORY") return self.db_history_base def open_cache_engines(self): if self.db_cache_engines is None: - self.db_cache_engines = UtilSQL.DictSQL(self.nom_fichero, tabla="CACHE_ENGINES") + self.db_cache_engines = UtilSQL.DictSQL(self.path_file, tabla="CACHE_ENGINES") def get_cache_engines(self, engine, ms, fenm2, depth=None): if depth: @@ -352,7 +352,7 @@ def setdbvisual_board(self, board): def get_others(self, configuration, game): liOp = ListaOpenings(configuration) - fich = os.path.basename(self.nom_fichero) + fich = os.path.basename(self.path_file) pvbase = game.pv() liOp = [ (dic["file"], dic["title"]) @@ -563,7 +563,7 @@ def createTrainingSSP(self, reg, procesador): self.setconfig("ULT_PACK", 100) # Se le obliga al VACUUM lo = ListaOpenings(procesador.configuration) - lo.add_training_file(os.path.basename(self.nom_fichero)) + lo.add_training_file(os.path.basename(self.path_file)) def createTrainingEngines(self, reg, procesador): self.preparaTrainingEngines(procesador.configuration, reg) @@ -574,7 +574,7 @@ def createTrainingEngines(self, reg, procesador): self.setconfig("ENG_ENGINE", 0) lo = ListaOpenings(procesador.configuration) - lo.add_training_engines_file(os.path.basename(self.nom_fichero)) + lo.add_training_engines_file(os.path.basename(self.path_file)) self.reinit_cache_engines() def withTrainings(self): @@ -1237,8 +1237,8 @@ def import_other(self, path_fichero, game): self.guardaLiXPV("%s,%s" % (_("Other opening lines"), otra.title), lista) self.db_fenvalues.copy_from(otra.db_fenvalues) for tabla in ("FEN", "Flechas", "Marcos", "SVGs", "Markers"): - dbr = UtilSQL.DictSQL(self.nom_fichero, tabla=tabla) - dbv = UtilSQL.DictSQL(otra.nom_fichero, tabla=tabla) + dbr = UtilSQL.DictSQL(self.path_file, tabla=tabla) + dbv = UtilSQL.DictSQL(otra.path_file, tabla=tabla) dbr.copy_from(dbv) dbr.close() dbv.close() @@ -1301,10 +1301,26 @@ def export_to_pgn(self, ws, result): ws.pb_close() def exportar_pgn_one(self, ws, nline, pos_move, result): - total = len(self) - ws.pb(total) + # Removing the lines with not begining lilipv = [FasterCode.xpv_pv(xpv).split(" ") for xpv in self.li_xpv] + base_lipv = lilipv[nline] + new_lilipv = [] + for pos_line, lipv in enumerate(lilipv): + if pos_line == nline: + continue + if len(lipv) < pos_move + 1: + continue + ok = True + for pos in range(pos_move): + if lipv[pos] != base_lipv[pos]: + ok = False + break + if ok: + new_lilipv.append(lipv) + lilipv = new_lilipv + total = len(lilipv) + ws.pb(total) def game_add_lipv(xgame: Game.Game, xli_pv): xmove: Move.Move @@ -1342,31 +1358,30 @@ def add_coments(xgame): for variation in xmove.variations.li_variations: add_coments(variation) - game_main = self[nline] - if game_main: - for recno in range(total): - if recno == nline: - continue - ws.pb_pos(recno + 1) - if ws.pb_cancel(): - return False + game_main = Game.Game() + game_main.read_pv(" ".join(base_lipv)) - li_pv = lilipv[recno] + for recno in range(total): + ws.pb_pos(recno + 1) + if ws.pb_cancel(): + return False - game_add_lipv(game_main, li_pv) + li_pv = lilipv[recno] - add_coments(game_main) + game_add_lipv(game_main, li_pv) - game_main.set_tag("Site", Code.lucas_chess) - game_main.set_tag("Event", self.title) - if result: - game_main.set_tag("Result", result) + add_coments(game_main) - if not ws.is_new: - ws.write("\n\n") - tags = "".join(['[%s "%s"]\n' % (k, v) for k, v in game_main.li_tags]) - ws.write(tags) - ws.write("\n%s" % game_main.pgn_base()) + game_main.set_tag("Site", Code.lucas_chess) + game_main.set_tag("Event", self.title) + if result: + game_main.set_tag("Result", result) + + if not ws.is_new: + ws.write("\n\n") + tags = "".join(['[%s "%s"]\n' % (k, v) for k, v in game_main.li_tags]) + ws.write(tags) + ws.write("\n%s" % game_main.pgn_base()) ws.pb_close() diff --git a/bin/Code/Openings/OpeningsStd.py b/bin/Code/Openings/OpeningsStd.py index 5f296f3b..427bef7e 100644 --- a/bin/Code/Openings/OpeningsStd.py +++ b/bin/Code/Openings/OpeningsStd.py @@ -59,6 +59,7 @@ def read_fenm2_op(): with open(path, "rt", encoding="utf-8") as q: for linea in q: name, a1h8, pgn, eco, basic, fenm2, hijos, parent, lfenm2 = linea.strip().split("|") + dic_fenm2_op[fenm2] = op = Opening(name) op.a1h8 = a1h8 op.eco = eco @@ -82,6 +83,27 @@ def read_fenm2_op(): return dic_fenm2_op, dic_fenm2_op_move, st_fenm2_test + @staticmethod + def dic_fen64(): + path = Code.path_resource("Openings", "openings.lkop") + dd = collections.defaultdict(list) + with open(path, "rt", encoding="utf-8") as q: + for linea in q: + name, a1h8, pgn, eco, basic, fenm2, hijos, parent, lfenm2 = linea.strip().split("|") + + li_fen = [p for p in lfenm2.split(",")] + li_fen.append(fenm2) + li = a1h8.split(" ") + + for pos in range(len(li)): + pv = " ".join(li[:pos + 1]) + # xpv = FasterCode.pv_xpv(pv) + fen = li_fen[pos] + fen64 = Util.fen_fen64(fen) + if pv not in dd[fen64]: + dd[fen64].append(pv) + return dd + def reset(self): self.dic_fenm2_op, self.dic_fenm2_op_move, self.st_fenm2_test = self.read_fenm2_op() self.read_personal() @@ -172,7 +194,6 @@ def assign_pv(self, pv): last_ap = self.dic_fenm2_op[fenm2] return last_ap - def is_book_fenm2(self, fenm2): return fenm2 in self.st_fenm2_test diff --git a/bin/Code/Openings/POLBoard.py b/bin/Code/Openings/POLBoard.py index 0e9155b0..fb2f0280 100644 --- a/bin/Code/Openings/POLBoard.py +++ b/bin/Code/Openings/POLBoard.py @@ -63,7 +63,7 @@ def __init__(self, panelOpening, configuration): self.board.set_side_bottom(True) self.board.set_dispatcher(self.player_has_moved) self.board.dispatchSize(self.ajustaAncho) - self.board.dbvisual_set_file(self.dbop.nom_fichero) + self.board.dbvisual_set_file(self.dbop.path_file) self.board.dbvisual_set_show_always(True) self.board.dbvisual_set_save_always(True) self.board.set_side_bottom(self.dbop.getconfig("WHITEBOTTOM", True)) @@ -146,7 +146,7 @@ def muestra_pos(txt): self.ponPartida(self.gamebase) def reset_board(self): - self.board.dbvisual_set_file(self.dbop.nom_fichero) + self.board.dbvisual_set_file(self.dbop.path_file) self.board.dbvisual_set_show_always(True) self.board.dbvisual_set_save_always(True) diff --git a/bin/Code/Openings/WindowOpeningLine.py b/bin/Code/Openings/WindowOpeningLine.py index 1b0d69ad..d535b181 100644 --- a/bin/Code/Openings/WindowOpeningLine.py +++ b/bin/Code/Openings/WindowOpeningLine.py @@ -724,7 +724,7 @@ def import_dbopening_explorer(self, game): dic_data = self.import_param_books(_("Database opening explorer"), False) if dic_data: db = DBgames.DBgames(nomfichgames) # por el problema de los externos - fichero_summary = db.db_stat.nom_fichero + fichero_summary = db.db_stat.path_file db.close() depth, si_white, onlyone, min_moves = ( dic_data["DEPTH"], @@ -823,7 +823,7 @@ def ta_import_pgn_comments(self): self.glines.gotop() def ta_import_other_comments(self): - current_path = self.dbop.nom_fichero + current_path = self.dbop.path_file file_opk = SelectFiles.leeFichero(self, os.path.dirname(current_path), "opk", titulo=_("Opening lines")) if not file_opk or Util.same_path(current_path, file_opk): @@ -984,19 +984,25 @@ def grid_right_button(self, grid, row, col, modif): submenu.opcion("0-1", r % "0-1", Iconos.Negras8()) submenu.opcion("1/2-1/2", r % "1/2-1/2", Iconos.Tablas()) submenu.opcion("", _("Without Result"), Iconos.Gris()) + menu.separador() + current = row // 2 + menu.opcion("remove", "%s %d" % (_("Remove line"), current + 1), Iconos.Mover()) resp = menu.lanza() if resp is not None: - w = WindowSavePGN.WSaveVarios(self, self.configuration) - if w.exec_(): - ws = WindowSavePGN.FileSavePGN(self, w.dic_result) - if ws.open(): - nline = 1 + row // 2 - wb = row % 2 - pos = int(col.key) - 1 if col.key.isdigit() else 0 - pos = pos * 2 + wb - self.dbop.exportar_pgn_one(ws, nline, pos, resp) - ws.close() - ws.um_final() + if resp == "remove": + self.remove_current_line() + else: + w = WindowSavePGN.WSaveVarios(self, self.configuration) + if w.exec_(): + ws = WindowSavePGN.FileSavePGN(self, w.dic_result) + if ws.open(): + nline = row // 2 + white_or_black = row % 2 + pos = int(col.key) - 1 if col.key.isdigit() else 0 + pos = pos * 2 + white_or_black + self.dbop.exportar_pgn_one(ws, nline, pos, resp) + ws.close() + ws.um_final() def borrar_move(self): row, col = self.glines.current_position() @@ -1009,14 +1015,14 @@ def borrar_move(self): if linea: game_ant = self.dbop[linea - 1] if game_ant.pv_hasta(njug - 1) == game.pv_hasta(njug - 1): - return self.borrar() + return self.remove_current_line() if linea < len(self.dbop) - 1: game_sig = self.dbop[linea + 1] if game_sig.pv_hasta(njug - 1) == game.pv_hasta(njug - 1): - return self.borrar() + return self.remove_current_line() if njug == self.num_jg_inicial: - return self.borrar() + return self.remove_current_line() si_ultimo = njug == len(game) - 1 # si es el ultimo no se pregunta if si_ultimo or QTUtil2.pregunta(self, _("Do you want to eliminate this move?")): @@ -1026,6 +1032,19 @@ def borrar_move(self): self.goto_end_line() self.show_lines() + def remove_current_line(self): + current = self.glines.recno() // 2 + self.dbop.save_history(_("Remove line %d") % (current + 1,)) + del self.dbop[current] + self.goto_inilinea() + self.show_lines() + self.pboard.reset_board() + if len(self.dbop) == 0: + self.game = self.gamebase + self.pboard.ponPartida(self.game) + self.pboard.MoverFinal() + self.glines.refresh() + def remove(self): tam_dbop = len(self.dbop) if tam_dbop == 0: @@ -1054,9 +1073,7 @@ def remove(self): resp = menu.lanza() if resp == "current": - self.dbop.save_history(_("Remove line %d") % (current + 1,)) - del self.dbop[current] - self.goto_inilinea() + self.remove_current_line() elif resp == "lines": li_gen = [FormLayout.separador] diff --git a/bin/Code/Openings/WindowOpeningLines.py b/bin/Code/Openings/WindowOpeningLines.py index 56f9040e..600b7c82 100644 --- a/bin/Code/Openings/WindowOpeningLines.py +++ b/bin/Code/Openings/WindowOpeningLines.py @@ -348,7 +348,7 @@ def __init__(self, procesador, dbop): titulo = "%s - %s" % (_("Opening lines"), _("Static training")) - extparam = "openlines_static_%s" % dbop.nom_fichero + extparam = "openlines_static_%s" % dbop.path_file LCDialog.LCDialog.__init__(self, procesador.main_window, titulo, Iconos.TrainStatic(), extparam) diff --git a/bin/Code/Procesador.py b/bin/Code/Procesador.py index da957a8e..acfbe33a 100644 --- a/bin/Code/Procesador.py +++ b/bin/Code/Procesador.py @@ -1124,10 +1124,12 @@ def juegaExternoAgainst(self, recplay): db.close() return - def entrenaPos(self, position, nPosiciones, titentreno, liEntrenamientos, entreno, with_tutor, jump, advanced): + def train_position(self, position, n_posiciones, titentreno, li_entrenamientos, entreno, with_tutor, jump, + remove_solutions, advanced): self.manager = ManagerEntPos.ManagerEntPos(self) self.manager.set_training(entreno) - self.manager.start(position, nPosiciones, titentreno, liEntrenamientos, with_tutor, jump, advanced) + self.manager.start(position, n_posiciones, titentreno, li_entrenamientos, with_tutor, jump, + remove_solutions, advanced) def playRoute(self, route): if route.state == Routes.BETWEEN: diff --git a/bin/Code/QT/FormLayout.py b/bin/Code/QT/FormLayout.py index 4304f088..7b332e0b 100644 --- a/bin/Code/QT/FormLayout.py +++ b/bin/Code/QT/FormLayout.py @@ -43,7 +43,7 @@ from Code.QT import SelectFiles separador = (None, None) -SPINBOX, COMBOBOX, COLORBOX, DIAL, EDITBOX, FICHERO, CARPETA, FONTCOMBOBOX, CHSPINBOX = range(9) +SPINBOX, COMBOBOX, COLORBOX, DIAL, SLIDER, EDITBOX, FICHERO, CARPETA, FONTCOMBOBOX, CHSPINBOX = range(10) class FormLayout: @@ -109,6 +109,10 @@ def folder(self, label, init_value, carpetaDefecto): def dial(self, label, minimo, maximo, init_value, siporc=True): self.li_gen.append((Dial(label, minimo, maximo, siporc), init_value)) + def slider(self, label, minimo, maximo, init_value, siporc=True): + sld = XSlider(label, minimo, maximo, siporc) + self.li_gen.append((sld, init_value)) + def apart(self, title): self.li_gen.append((None, title + ":")) @@ -220,6 +224,17 @@ def __init__(self, label, minimo, maximo, siporc=True): self.label = "\n" + label + ":" +class XSlider: + def __init__(self, label, minimo, maximo, siporc): + self.tipo = SLIDER + self.minimo = minimo + self.maximo = maximo + self.siporc = siporc + self.label = label + if ":" not in label: + label += ":" + + class Carpeta: def __init__(self, label, carpetaDefecto): self.tipo = CARPETA @@ -483,9 +498,9 @@ def valor(self): return self.texto() -class DialNum(QtWidgets.QHBoxLayout): +class DialNum(Colocacion.H): def __init__(self, parent, config, dispatch): - QtWidgets.QHBoxLayout.__init__(self) + Colocacion.H.__init__(self) self.dial = QtWidgets.QDial(parent) self.dial.setMinimum(config.minimo) @@ -522,6 +537,49 @@ def value(self): return self.dial.value() +class Slider(Colocacion.H): + def __init__(self, parent, config, dispatch): + Colocacion.H.__init__(self) + + self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal, parent) + self.slider.setFocusPolicy(QtCore.Qt.StrongFocus) + self.slider.setTickPosition(QtWidgets.QSlider.TicksBothSides) + self.slider.setTickInterval(1) + self.slider.setSingleStep(1) + self.slider.setMinimum(config.minimo) + self.slider.setMaximum(config.maximo) + + self.slider.valueChanged.connect(self.movido) + self.lb = QtWidgets.QLabel(parent) + + self.dispatch = dispatch + + self.siporc = config.siporc + + self.control(self.slider) + self.control(self.lb) + + # self.set_value() + + def ponLB(self): + txt = "%d" % self.slider.value() + if self.siporc: + txt += "%" + self.lb.setText(txt) + + def set_value(self, value): + self.slider.setValue(value) + self.ponLB() + + def movido(self, valor): + self.ponLB() + if self.dispatch: + self.dispatch() + + def value(self): + return self.slider.value() + + class FormWidget(QtWidgets.QWidget): def __init__(self, data, comment="", parent=None, dispatch=None): super(FormWidget, self).__init__(parent) @@ -607,6 +665,10 @@ def setup(self, dispatch): field = DialNum(self, config, dispatch) field.set_value(value) + elif tipo == SLIDER: + field = Slider(self, config, dispatch) + field.set_value(value) + elif tipo == EDITBOX: if config.alto == 1: field = Edit(self, config, dispatch) @@ -712,6 +774,8 @@ def get(self): value = field.value() elif tipo == DIAL: value = field.value() + elif tipo == SLIDER: + value = field.value() elif tipo == EDITBOX: value = field.valor() elif tipo == FICHERO: diff --git a/bin/Code/QT/QTUtil2.py b/bin/Code/QT/QTUtil2.py index 52f2111d..4098eac7 100644 --- a/bin/Code/QT/QTUtil2.py +++ b/bin/Code/QT/QTUtil2.py @@ -1,7 +1,10 @@ +import time + from PySide2 import QtCore, QtWidgets, QtGui import Code -from Code.Base.Constantes import (GO_BACK, GO_END, GO_FORWARD, GO_START, GO_BACK2, GO_FORWARD2, ZVALUE_PIECE, ZVALUE_PIECE_MOVING, TOP_RIGHT, +from Code.Base.Constantes import (GO_BACK, GO_END, GO_FORWARD, GO_START, GO_BACK2, GO_FORWARD2, ZVALUE_PIECE, + ZVALUE_PIECE_MOVING, TOP_RIGHT, ON_TOOLBAR) from Code.QT import Colocacion from Code.QT import Controles @@ -139,8 +142,8 @@ def muestra(self): v = self.owner if v: - s = self.size() if self.physical_pos == TOP_RIGHT: + s = self.size() x = v.x() + v.width() - s.width() w_screen = QtWidgets.QDesktopWidget().screenGeometry().width() if x + s.width() > w_screen: @@ -150,10 +153,10 @@ def muestra(self): x = v.x() + 4 y = v.y() + 4 else: + s = self.size() x = v.x() + (v.width() - s.width()) // 2 y = v.y() + (v.height() - s.height()) // 2 - # p = self.owner.mapToGlobal(QtCore.QPoint(x,y)) p = QtCore.QPoint(x, y) self.move(p) QTUtil.refresh_gui() @@ -274,7 +277,8 @@ def __init__(self, owner, the_message=None, physical_pos=None, with_cancel=False self.with_cancel = with_cancel def __enter__(self): - self.um = waiting_message.start(self.owner, self.the_message, physical_pos=self.physical_pos, with_cancel=self.with_cancel) + self.um = waiting_message.start(self.owner, self.the_message, physical_pos=self.physical_pos, + with_cancel=self.with_cancel) return self def __exit__(self, exc_type, exc_val, exc_tb): @@ -415,10 +419,12 @@ def is_canceled(self): class BarraProgreso1(QtWidgets.QDialog): - def __init__(self, owner, titulo, formato1="%v/%m"): + def __init__(self, owner, titulo, formato1="%v/%m", show_time=False): QtWidgets.QDialog.__init__(self, owner) self.owner = owner + self.show_time = show_time + self.total = 0 self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint) self.setWindowTitle(titulo) @@ -426,7 +432,13 @@ def __init__(self, owner, titulo, formato1="%v/%m"): # gb1 + progress self.bp1 = QtWidgets.QProgressBar() self.bp1.setFormat(formato1) - ly = Colocacion.H().control(self.bp1) + ly = Colocacion.V().control(self.bp1) + if show_time: + self.li_times = [] + self.lb_time = Controles.LB(self) + self.time_inicial = None + self.valor_previo = 0 + ly.control(self.lb_time) self.gb1 = Controles.GB(self, "", ly) # cancelar @@ -435,6 +447,8 @@ def __init__(self, owner, titulo, formato1="%v/%m"): layout = Colocacion.V().control(self.gb1).otro(ly_bt) + self.setMinimumWidth(480) + self.setLayout(layout) self._is_canceled = False self._is_closed = False @@ -468,11 +482,55 @@ def put_label(self, texto): self.gb1.set_text(texto) def set_total(self, maximo): + self.total = maximo self.bp1.setRange(0, maximo) + if self.show_time: + self.li_times = [] + self.time_inicial = time.time() + self.valor_previo = 0 def pon(self, valor): self.bp1.setValue(valor) QTUtil.refresh_gui() + if self.show_time: + salto = valor - self.valor_previo + if salto == 0: + return + time_actual = time.time() + tm = (time_actual - self.time_inicial) / salto + self.valor_previo = valor + self.time_inicial = time_actual + self.li_times.append(tm) + tm = sum(self.li_times) / len(self.li_times) + previsto = int(tm * (self.total - valor)) + minutos = previsto // 60 + seconds = previsto % 60 + if minutos > 120: + horas = minutos // 60 + lb_hr = _("hours") + xmessage = f"{horas} {lb_hr}" + elif minutos > 60: + horas = minutos //60 + minutos -= horas*60 + lb_hr = _("hours") if horas > 1 else _("hour") + lb_min = _("minutes") if minutos != 1 else _("minute") + xmessage = f"{horas} {lb_hr} {minutos} {lb_min}" + + elif minutos > 1: + lb_min = _("minutes") + xmessage = f"{minutos} {lb_min}" + + elif minutos == 1: + lb_min = _("minute") + lb_sec = _("seconds") + xmessage = f"{minutos} {lb_min} {seconds} {lb_sec}" + + else: + lb_sec = _("seconds") + xmessage = f"{seconds} {lb_sec}" + + lb_pt = _("Pending time") + self.lb_time.set_text(f"{lb_pt}: {xmessage}") def is_canceled(self): QTUtil.refresh_gui() @@ -655,7 +713,11 @@ def message_bold(owner, mens, titulo=None, delayed=False): message(owner, mens, titulo=titulo, si_bold=True, delayed=delayed) -def message_result(window, txt): +def message_information(window, txt): + message(window, "

%s" % txt, titulo=_("Information"), pixmap=Iconos.pmCheck()) + + +def message_result_win(window, txt): message(window, "

%s" % txt, titulo=_("Result"), pixmap=Iconos.pmTrophy()) @@ -809,9 +871,8 @@ def __init__(self, owner, title, label, valor, mas_info, width, in_cursor): def aceptar(self): txt = self.ed_clave.texto().strip() - if txt: - self.resultado = txt - self.accept() + self.resultado = txt + self.accept() def read_simple(owner, title, label, value, mas_info=None, width=None, in_cursor=False): diff --git a/bin/Code/QT/QTVarios.py b/bin/Code/QT/QTVarios.py index 6b8e9db7..af7593bd 100644 --- a/bin/Code/QT/QTVarios.py +++ b/bin/Code/QT/QTVarios.py @@ -1231,3 +1231,6 @@ def launch_workers(wowner): return resp + +def fen_is_in_clipboard(window): + QTUtil2.temporary_message(window, _("FEN is in clipboard"), 1.2) \ No newline at end of file diff --git a/bin/Code/SQL/Base.py b/bin/Code/SQL/Base.py index d7503096..9c6fb0cd 100644 --- a/bin/Code/SQL/Base.py +++ b/bin/Code/SQL/Base.py @@ -13,10 +13,10 @@ class DBBase: Establece la conexion y permite cerrarla. """ - def __init__(self, nom_fichero): - self.nom_fichero = nom_fichero - existe = Util.exist_file(nom_fichero) - self.conexion = sqlite3.connect(self.nom_fichero) + def __init__(self, path_file): + self.path_file = path_file + existe = Util.exist_file(path_file) + self.conexion = sqlite3.connect(self.path_file) if not existe: cursor = self.conexion.cursor() cursor.execute("PRAGMA page_size = 4096") diff --git a/bin/Code/SQL/UtilSQL.py b/bin/Code/SQL/UtilSQL.py index 00d9e90c..060daa45 100644 --- a/bin/Code/SQL/UtilSQL.py +++ b/bin/Code/SQL/UtilSQL.py @@ -310,9 +310,9 @@ def __init__(self, path_db, tabla="Data"): class ListSQL: - def __init__(self, nom_fichero, tabla="LISTA", max_cache=2048, reverted=False): - self.nom_fichero = nom_fichero - self._conexion = sqlite3.connect(nom_fichero) + def __init__(self, path_file, tabla="LISTA", max_cache=2048, reverted=False): + self.path_file = path_file + self._conexion = sqlite3.connect(path_file) self.tabla = tabla self.max_cache = max_cache self.cache = {} @@ -432,9 +432,9 @@ def pos_rowid(self, rowid): class ListObjSQL(ListSQL): - def __init__(self, nom_fichero, class_storage, tabla="datos", max_cache=2048, reverted=False): + def __init__(self, path_file, class_storage, tabla="datos", max_cache=2048, reverted=False): self.class_storage = class_storage - ListSQL.__init__(self, nom_fichero, tabla, max_cache, reverted) + ListSQL.__init__(self, path_file, tabla, max_cache, reverted) def append(self, obj, with_cache=False): sql = "INSERT INTO %s( DATO ) VALUES( ? )" % self.tabla @@ -477,12 +477,12 @@ def __setitem__(self, pos, obj): class IPC(object): - def __init__(self, nom_fichero, si_crear): + def __init__(self, path_file, si_crear): if si_crear: - Util.remove_file(nom_fichero) + Util.remove_file(path_file) - self._conexion = sqlite3.connect(nom_fichero) - self.nom_fichero = nom_fichero + self._conexion = sqlite3.connect(path_file) + self.path_file = path_file if si_crear: sql = "CREATE TABLE DATOS( DATO BLOB );" @@ -516,8 +516,8 @@ def close(self): class RowidReader: - def __init__(self, nom_fichero, tabla): - self.nom_fichero = nom_fichero + def __init__(self, path_file, tabla): + self.path_file = path_file self.tabla = tabla self.where = None self.order = None @@ -541,7 +541,7 @@ def run(self, li_row_ids, where, order): self.thread.start() def _run_thread(self): - conexion = sqlite3.connect(self.nom_fichero) + conexion = sqlite3.connect(self.path_file) sql = "SELECT ROWID FROM %s" % self.tabla if self.where: sql += " WHERE %s" % self.where diff --git a/bin/Code/Tactics/ManagerTactics.py b/bin/Code/Tactics/ManagerTactics.py index 73de956f..90fe2ac0 100644 --- a/bin/Code/Tactics/ManagerTactics.py +++ b/bin/Code/Tactics/ManagerTactics.py @@ -199,7 +199,7 @@ def control_teclado(self, nkey, modifiers): if self.state == ST_ENDGAME: self.ent_siguiente() - def listHelpTeclado(self): + def list_help_keyboard(self): return [("+/%s" % _("Page Down"), _("Next position")), ("T", _("Save position in 'Selected positions' file"))] def ent_siguiente(self): diff --git a/bin/Code/Themes/WDB_Theme_Analysis.py b/bin/Code/Themes/WDB_Theme_Analysis.py index 20e2215c..2b1c628d 100644 --- a/bin/Code/Themes/WDB_Theme_Analysis.py +++ b/bin/Code/Themes/WDB_Theme_Analysis.py @@ -79,7 +79,7 @@ def __init__(self, w_parent): game_has_themes = False themes_in_game = [] - my_game: Game.Game = w_parent.dbGames.read_game_recno(recno) + my_game: Game.Game = w_parent.db_games.read_game_recno(recno) for move_num, move in enumerate(my_game.li_moves): lostp_abs = move.get_points_lost() if lostp_abs is not None: diff --git a/bin/Code/Util.py b/bin/Code/Util.py index 1da32bad..8cc230cc 100644 --- a/bin/Code/Util.py +++ b/bin/Code/Util.py @@ -252,19 +252,19 @@ def zip2var(blob): return None -def zip2var_change_import(blob, replace_from, replace_to): +def zip2var_change_import(blob, li_replace): if blob is None: return None try: varp = zlib.decompress(blob) except: return None - try: return pickle.loads(varp) except: try: - varp = varp.replace(replace_from, replace_to) + for replace_from, replace_to in li_replace: + varp = varp.replace(replace_from, replace_to) return pickle.loads(varp) except: return None @@ -756,3 +756,17 @@ def cpu_count(): def opj(*elem) -> str: return str(os.path.join(*elem)) + + +def fen_fen64(fen): + fen = fen.split(" ")[0] + li = [] + for line in fen.split("/"): + ln = [] + for c in line: + if c.isdigit(): + ln.append(" " * int(c)) + else: + ln.append(c) + li.append("".join(ln)) + return "".join(li) diff --git a/bin/Code/Voyager/Voyager.py b/bin/Code/Voyager/Voyager.py index 3c03bec3..b8efd499 100644 --- a/bin/Code/Voyager/Voyager.py +++ b/bin/Code/Voyager/Voyager.py @@ -77,7 +77,7 @@ def __init__(self, wparent, is_game, game, is_white_bottom): None, (_("Basic position"), Iconos.Inicio(), self.inicial), None, - (_("Clear board"), Iconos.Borrar(), self.limpiaBoard), + (_("Clear board"), Iconos.Borrar(), self.clear_board), None, (_("Paste FEN position"), Iconos.Pegar(), self.pegar), None, @@ -195,7 +195,7 @@ def __init__(self, wparent, is_game, game, is_white_bottom): self.ultimaPieza = "P" self.piezas = self.board.piezas - self.resetPosicion() + self.reset_position() self.ponCursor() self.lb_scanner.hide() @@ -211,7 +211,7 @@ def eboard_activate(self): def eboard_dispatch(self, quien, fen): self.position.read_fen(fen) self.actPosicion() - self.resetPosicion(False) + self.reset_position(False) if fen.count("K") == 1 and fen.count("k") == 1: self.save() elif fen.count("k") == 1: @@ -225,7 +225,7 @@ def closeEvent(self, event): def change_side(self): self.board.set_side_indicator(self.rbWhite.isChecked()) self.actPosicion() - self.resetPosicion() + self.reset_position() def save(self): self.actPosicion() @@ -403,7 +403,7 @@ def actPosicion(self): def setPosicion(self, position): self.position = position.copia() - self.resetPosicion() + self.reset_position() def pegar(self): tp, data = QTUtil.get_clipboard() @@ -411,13 +411,13 @@ def pegar(self): if tp == "t": try: self.position.read_fen(str(data)) - self.resetPosicion() + self.reset_position() except: pass elif tp == "h": try: self.position.read_fen(QTUtil.get_txt_clipboard()) - self.resetPosicion() + self.reset_position() except: pass elif tp == "p": @@ -442,23 +442,23 @@ def pegar(self): def copiar(self): self.actPosicion() QTUtil.ponPortapapeles(self.position.fen()) - QTUtil2.message_bold(self, _("FEN is in clipboard")) + QTVarios.fen_is_in_clipboard(self) - def limpiaBoard(self): + def clear_board(self): self.position.read_fen("8/8/8/8/8/8/8/8 w - - 0 1") - self.resetPosicion() + self.reset_position() def inicial(self): self.position.set_pos_initial() - self.resetPosicion() + self.reset_position() - def resetPosicion(self, resetAll=True): + def reset_position(self, reset_all=True): self.board.set_position(self.position) self.squares = self.position.squares self.board.squares = self.squares self.board.enable_all() - if resetAll: + if reset_all: if self.position.is_white: self.rbWhite.activa(True) else: @@ -597,7 +597,7 @@ def scanner_deduce(self): fen = fen.replace("w", "b") self.position.read_fen(fen) self.actPosicion() - self.resetPosicion() + self.reset_position() dic = self.scanner_deduce_base(False) for pos, pz in dic.items(): self.ponPieza(pos, pz) diff --git a/bin/Code/Washing/ManagerWashing.py b/bin/Code/Washing/ManagerWashing.py index d0d9b749..635b60c3 100644 --- a/bin/Code/Washing/ManagerWashing.py +++ b/bin/Code/Washing/ManagerWashing.py @@ -209,7 +209,7 @@ def player_has_moved(self, from_sq, to_sq, promotion=""): self.dbwashing.add_hint() comment = "
".join(lic) - QTUtil2.message_result(self.main_window, comment) + QTUtil2.message_information(self.main_window, comment) self.set_position(move.position_before) # Creamos un move sin analysis diff --git a/bin/Code/__init__.py b/bin/Code/__init__.py index ee92705e..4f4ea005 100644 --- a/bin/Code/__init__.py +++ b/bin/Code/__init__.py @@ -97,7 +97,7 @@ def relative_root(path): BASE_VERSION = "B" # Para el control de updates que necesitan reinstalar entero -VERSION = "R 2.12c" +VERSION = "R 2.12d" DEBUG = False DEBUG_ENGINES = False diff --git a/bin/LucasR.py b/bin/LucasR.py index f25078ac..5de96628 100644 --- a/bin/LucasR.py +++ b/bin/LucasR.py @@ -9,7 +9,11 @@ import sys import warnings +import Code +from Code.Translations import Translate + warnings.simplefilter("ignore") +Translate.install("en") n_args = len(sys.argv) if n_args == 1: diff --git a/bin/OS/linux/Engines/ct800/CT800-1.45 b/bin/OS/linux/Engines/ct800/CT800-1.45 index b4e4dc46..51103083 100644 Binary files a/bin/OS/linux/Engines/ct800/CT800-1.45 and b/bin/OS/linux/Engines/ct800/CT800-1.45 differ diff --git a/bin/OS/linux/Engines/ct800/CT800-1.45.uci_options b/bin/OS/linux/Engines/ct800/CT800-1.45.uci_options new file mode 100644 index 00000000..5bf7d1a8 --- /dev/null +++ b/bin/OS/linux/Engines/ct800/CT800-1.45.uci_options @@ -0,0 +1,18 @@ +id name CT800 V1.45 64 bit +id author Rasmus Althoff +option name Hash type spin default 8 min 1 max 1024 +option name Keep Hash Tables type check default true +option name Clear Hash type button +option name Book Moves type button +option name OwnBook type check default true +option name Contempt Value [cps] type spin default 30 min -300 max 300 +option name Contempt End [moves] type spin default 35 min 0 max 400 +option name Eval Noise [%] type spin default 0 min 0 max 100 +option name Move Overhead [ms] type spin default 50 min 0 max 1000 +option name UCI_Elo type spin default 2550 min 1000 max 2550 +option name UCI_LimitStrength type check default false +option name CPU Speed Throttle type check default false +option name CPU Speed [%] type spin default 100 min 1 max 100 +option name CPU Speed [kNPS] type spin default 32000 min 1 max 32000 +option name Show Current Move type combo default Every Second var Every Second var Continuously +option name UCI_EngineAbout type string default The CT800 is free software under GPLv3+. Website: www.ct800.net diff --git a/bin/OS/linux/Engines/fox/Fox.uci_options b/bin/OS/linux/Engines/fox/Fox.uci_options new file mode 100644 index 00000000..38b637eb --- /dev/null +++ b/bin/OS/linux/Engines/fox/Fox.uci_options @@ -0,0 +1,4 @@ +id name Fox 1.1 +id author Lucas Monge (based in MiniRodent by Pawel Koziol) +option name Hash type spin default 16 min 1 max 4096 +option name Clear Hash type button diff --git a/bin/OS/linux/Engines/foxcub/FoxCub.uci_options b/bin/OS/linux/Engines/foxcub/FoxCub.uci_options new file mode 100644 index 00000000..d5cf5086 --- /dev/null +++ b/bin/OS/linux/Engines/foxcub/FoxCub.uci_options @@ -0,0 +1,4 @@ +id name FoxCub 1.1 +id author Lucas Monge (based in MiniRodent by Pawel Koziol) +option name Hash type spin default 16 min 1 max 4096 +option name Clear Hash type button diff --git a/bin/OS/linux/Engines/igel/Igel-3.0.10.uci_options b/bin/OS/linux/Engines/igel/Igel-3.0.10.uci_options new file mode 100644 index 00000000..5971dfa4 --- /dev/null +++ b/bin/OS/linux/Engines/igel/Igel-3.0.10.uci_options @@ -0,0 +1,8 @@ +id name Igel 3.0.10 64 POPCNT +id author V. Medvedev, V. Shcherbyna +option name Hash type spin default 128 min 2 max 1048576 +option name Threads type spin default 1 min 1 max 1024 +option name SyzygyPath type string default +option name SyzygyProbeDepth type spin default 1 min 1 max 128 +option name Ponder type check default false +option name Skill Level type spin default 20 min 0 max 20 diff --git a/bin/bug.log b/bin/bug.log index 00a775be..78ffb23e 100644 --- a/bin/bug.log +++ b/bin/bug.log @@ -1 +1 @@ -Version R 2.12c +Version R 2.12d