From 7144e302f498bdd8dcbb570726fe35da3c3e980f Mon Sep 17 00:00:00 2001 From: "Rodolfo M. Raya" Date: Mon, 3 May 2021 17:11:09 -0300 Subject: [PATCH] Updated for Swordfish 4.4.0 --- README.md | 2 +- css/dark.css | 151 +- css/light.css | 147 +- html/importXliff.html | 6 +- jars/openxliff.jar | Bin 477593 -> 477863 bytes package.json | 6 +- src/com/maxprograms/swordfish/Constants.java | 4 +- .../swordfish/GlossariesHandler.java | 1326 ++++++++--------- .../swordfish/ProjectsHandler.java | 35 +- .../swordfish/am/MatchAssembler.java | 10 +- .../maxprograms/swordfish/models/Memory.java | 5 +- .../maxprograms/swordfish/models/Project.java | 439 +++--- .../swordfish/models/SourceFile.java | 196 ++- src/com/maxprograms/swordfish/tm/Match.java | 5 +- .../swordfish/tm/RemoteDatabase.java | 8 +- .../swordfish/xliff/XliffStore.java | 161 +- .../swordfish/xliff/XliffUtils.java | 827 +++++----- swordfish.pdf | Bin 1636485 -> 1636264 bytes ts/App.ts | 51 +- ts/Main.ts | 13 +- ts/addProject.ts | 7 +- ts/browseDatabases.ts | 19 +- ts/divider.ts | 6 +- ts/glossaries.ts | 12 +- ts/memories.ts | 23 +- ts/mtMatches.ts | 10 +- ts/projects.ts | 53 +- ts/tabs.ts | 6 +- ts/termsPanel.ts | 22 +- ts/tmMatches.ts | 26 +- ts/translation.ts | 37 +- 31 files changed, 1920 insertions(+), 1693 deletions(-) diff --git a/README.md b/README.md index 08aa2e3..ec1e2e5 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Technical Support | Peer support at [Groups.io](https://groups.io/g/maxprogram - JDK 11 or newer is required for compiling and building. Get it from [AdoptOpenJDK](https://adoptopenjdk.net/). - Apache Ant 1.10.7 or newer. Get it from [https://ant.apache.org/](https://ant.apache.org/) -- Node.js 12.16.0 LTS or newer. Get it from [https://nodejs.org/](https://nodejs.org/) +- Node.js 14.16.1 LTS or newer. Get it from [https://nodejs.org/](https://nodejs.org/) ## Building diff --git a/css/dark.css b/css/dark.css index 933aec1..f646c8d 100644 --- a/css/dark.css +++ b/css/dark.css @@ -1,22 +1,23 @@ @import "./theme.css"; @import "./neutrals.css"; :root { - --focus-border: #f57c00; --error-color: #960303; - --even-unit: #b2c8f8; + --even-unit: #1a46a7; --odd-unit: #e20606; + --orange: #ff9800; + --teal: #009688; } body { - background: var(--gray190); - color: var(--white); - fill: var(--white); - stroke: var(--white); + background: var(--gray160); + color: var(--gray10); + fill: var(--gray10); + stroke: var(--gray10); } .hdivider { width: 2px; - background: var(--themePrimary); + background: var(--themeDark); height: 100%; position: relative; cursor: col-resize; @@ -27,7 +28,7 @@ body { .vdivider { width: 100%; height: 2px; - background: var(--themePrimary); + background: var(--themeDark); position: relative; cursor: row-resize; display: block; @@ -80,11 +81,13 @@ table { thead { height: 24px; - background: var(--themeDarker); - color: var(--white); + background: var(--gray150); + color: var(--themeLight); } thead tr { + position: sticky; + z-index: 5; background: inherit !important; color: inherit !important; } @@ -106,7 +109,7 @@ td.list { } td.editing { - background-color: var(--black) !important; + background-color: var(--gray190) !important; outline: none !important; } @@ -122,52 +125,48 @@ td.initial { } td.translated { - border-right: 3px solid #ff9800; + border-right: 3px solid var(--orange); } td.reviewed { - border-right: 3px solid #ff9800; + border-right: 3px solid var(--orange); } td.final { - border-right: 3px solid #009688; + border-right: 3px solid var(--teal); } tr.selected { - border-top: 2px solid var(--focus-border) !important; - border-bottom: 2px solid var(--focus-border) !important; background-color: var(--black) !important; } .discover tr:hover { - background-color: var(--gray190) !important; + background-color: var(--themeDarker) !important; } th { position: sticky; - top: 0; z-index: 5; - font-weight: lighter; - background: var(--themePrimary); - color: var(--white); -} - -.stripes tr:nth-child(odd) { - background-color: var(--gray150); + padding: 8px 4px; + top: 0; + font-weight: 300; + background: var(--gray150); + color: var(--themeLight); + fill: var(--themeLight); } -.stripes tr:nth-child(even) { - background-color: var(--gray160); +.stripes tr { + border-bottom: 2px solid var(--gray150); } .currentRow { - border-top: 2px solid var(--focus-border) !important; - border-bottom: 2px solid var(--focus-border) !important; - background-color: var(--black) !important; + border-top: 3px solid var(--themeTertiary) !important; + border-bottom: 3px solid var(--themeTertiary) !important; + background-color: var(--gray190) !important; } .sourceContainer { - background-color: var(--gray190); + background-color: var(--gray160); padding: 4px; margin: 0; width: 100%; @@ -176,12 +175,12 @@ th { } .targetContainer { - background-color: var(--gray190); + background-color: var(--gray160); padding: 4px; margin: 0; width: 100%; white-space: pre-wrap; - border-bottom: 1px solid var(--gray190); + border-bottom: 1px solid var(--gray160); } .machineContainer { @@ -251,7 +250,7 @@ input { input:focus { outline: none !important; - border: 1px solid var(--focus-border); + border: 1px solid var(--themePrimary); } input:disabled { @@ -277,7 +276,7 @@ select { select:focus { outline: none !important; - border: 1px solid var(--focus-border); + border: 1px solid var(--themePrimary); } option { @@ -297,7 +296,7 @@ textarea { textarea:focus { outline: none !important; - border: 1px solid var(--focus-border); + border: 1px solid var(--themePrimary); } button { @@ -307,9 +306,9 @@ button { border-radius: 2px; font-size: 1em; text-align: center; - margin: 3px; - padding-left: 4px; - padding-right: 4px; + margin: 4px; + padding-left: 8px; + padding-right: 8px; white-space: nowrap; } @@ -385,13 +384,12 @@ label { .toolbar { display: flex; flex-direction: row; - background: var(--gray160); - color: var(--white); + background: var(--gray130); + color: var(--gray10); fill: var(--themePrimary); stroke: var(--themePrimary); padding: 2px 4px; justify-content: flex-start; - border-top: 1px solid var(--gray190); } .toolbar button { @@ -426,18 +424,19 @@ label { .toolbar a svg { padding-top: 4px; - color: var(--white); - fill: var(--white); - stroke: var(--white); + color: var(--gray10); + fill: var(--gray10); + stroke: var(--gray10); } .toolbar a:hover { - background-color: var(--gray190); + background-color: var(--gray160); text-decoration: none !important; transition-property: all; transition-duration: 0.5s; transition-timing-function: cubic-bezier(0.14, 0.71, 0.38, 1); transition-delay: 0s; + border-radius: 2px; } svg { @@ -448,8 +447,8 @@ svg { th svg { margin-top: 4px; - fill: var(--white) !important; - stroke: var(--white) !important; + fill: var(--themeLight) !important; + stroke: var(--themeLight) !important; } /* tabs */ @@ -457,52 +456,56 @@ th svg { .tabHolder { display: flex; flex-flow: row; - color: var(--white); - background: var(--gray110); - padding: 4px 0 0 8px; + color: var(--gray30); + background: var(--gray150); + margin: 0; + padding: 0; } .tab { overflow: hidden; background: var(--gray150); - color: var(--white); - fill: var(--themePrimary); - stroke: var(--themePrimary); - padding-top: 4px; - padding-left: 6px; - padding-right: 6px; + color: var(--gray30); + fill: var(--gray30); + stroke: var(--gray30); + padding: 4px 12px; margin: 0; - margin-right: 1px !important; + vertical-align: middle; box-shadow: none !important; - border-bottom: 3px solid var(--gray150); text-decoration: none !important; } .selectedTab { - border-bottom: 3px solid var(--themePrimary); + background: var(--gray130); + color: var(--gray10); + border-left: 1px solid var(--gray150) !important; + border-right: 1px solid var(--gray150) !important; } .tab:hover { - background: var(--gray190); - border-bottom: 3px solid var(--gray190); - transition-property: all; - transition-duration: 0.5s; - transition-timing-function: cubic-bezier(0.14, 0.71, 0.38, 1); - transition-delay: 0s; + color: var(--gray10); + fill: var(--gray10); + stroke: var(--gray10); } .selectedTab:hover { - border-bottom: 3px solid var(--themePrimary) !important; + color: var(--white); + fill: var(--white); + stroke: var(--white); } .tab a { color: inherit; + fill: inherit; + stroke: inherit; text-decoration: none; cursor: pointer; } .tab a:hover { - background: var(--gray190); + color: inherit; + fill: inherit; + stroke: inherit; } .tabContent { @@ -523,17 +526,13 @@ th svg { margin: 0; padding-top: 0; padding-left: 4px; - background: var(--themePrimary); - color: var(--white); + background: var(--themeDark); + color: var(--gray10); border-bottom: 1px solid var(--gray190); white-space: nowrap; overflow-x: hidden; } -.titlepanel a:hover { - background: var(--themeDarkAlt); -} - .panelcontent { z-index: -20; display: block; @@ -594,8 +593,8 @@ th svg { } .active svg { - stroke: var(--focus-border) !important; - fill: var(--focus-border) !important; + stroke: var(--themePrimary) !important; + fill: var(--themePrimary) !important; } .bordered { diff --git a/css/light.css b/css/light.css index 4a9189b..8df1806 100644 --- a/css/light.css +++ b/css/light.css @@ -1,17 +1,18 @@ @import "./theme.css"; @import "./neutrals.css"; :root { - --focus-border: #f57c00; --error-color: #960303; --even-unit: #02275f; --odd-unit: #e20606; + --orange: #ff9800; + --teal: #009688; } body { background: var(--gray30); - color: var(--black); - fill: var(--black); - stroke: var(--black); + color: var(--gray190); + fill: var(--gray190); + stroke: var(--gray190); } .hdivider { @@ -80,15 +81,21 @@ table { thead { height: 24px; - background: var(--themeDark); - color: var(--white); + background: var(--gray40); + color: var(--themeDark); } thead tr { + position: sticky; + z-index: 5; background: inherit !important; color: inherit !important; } +.stripes tr { + border-bottom: 2px solid var(--gray40); +} + tbody { overflow-y: scroll; overflow-x: scroll; @@ -106,7 +113,7 @@ td.list { } td.editing { - background-color: var(--white) !important; + background-color: var(--gray10) !important; outline: none !important; } @@ -122,52 +129,44 @@ td.initial { } td.translated { - border-right: 3px solid #ff9800; + border-right: 3px solid var(--orange); } td.reviewed { - border-right: 3px solid #ff9800; + border-right: 3px solid var(--orange); } td.final { - border-right: 3px solid #009688; + border-right: 3px solid var(--teal); } tr.selected { - border-top: 2px solid var(--focus-border) !important; - border-bottom: 2px solid var(--focus-border) !important; background-color: var(--white) !important; } .discover tr:hover { - background-color: var(--gray30) !important; + background-color: var(--themeLight) !important; } th { position: sticky; - top: 0; z-index: 5; - font-weight: lighter; - background: var(--themePrimary); - color: var(--white); -} - -.stripes tr:nth-child(odd) { - background-color: var(--gray40); -} - -.stripes tr:nth-child(even) { - background-color: var(--gray50); + padding: 8px 4px; + top: 0; + font-weight: 300; + background: var(--gray40); + color: var(--themeDark); + fill: var(--themeDark); } .currentRow { - border-top: 2px solid var(--focus-border) !important; - border-bottom: 2px solid var(--focus-border) !important; - background-color: var(--white) !important; + border-top: 3px solid var(--themeDark) !important; + border-bottom: 3px solid var(--themeDark) !important; + background-color: var(--gray10) !important; } .sourceContainer { - background-color: var(--gray30); + background-color: var(--gray20); padding: 4px; margin: 0; width: 100%; @@ -176,12 +175,12 @@ th { } .targetContainer { - background-color: var(--gray30); + background-color: var(--gray20); padding: 4px; margin: 0; width: 100%; white-space: pre-wrap; - border-bottom: 1px solid var(--gray30); + border-bottom: 1px solid var(--gray20); } .machineContainer { @@ -251,7 +250,7 @@ input { input:focus { outline: none !important; - border: 1px solid var(--focus-border); + border: 1px solid var(--themePrimary); } input:disabled { @@ -277,7 +276,7 @@ select { select:focus { outline: none !important; - border: 1px solid var(--focus-border); + border: 1px solid var(--themePrimary); } option { @@ -297,7 +296,7 @@ textarea { textarea:focus { outline: none !important; - border: 1px solid var(--focus-border); + border: 1px solid var(--themePrimary); } button { @@ -307,9 +306,9 @@ button { border-radius: 2px; font-size: 1em; text-align: center; - margin: 3px; - padding-left: 4px; - padding-right: 4px; + margin: 4px; + padding-left: 8px; + padding-right: 8px; white-space: nowrap; } @@ -386,12 +385,11 @@ label { display: flex; flex-direction: row; background: var(--gray50); - color: var(--black); + color: var(--gray190); fill: var(--themePrimary); stroke: var(--themePrimary); padding: 2px 4px; justify-content: flex-start; - border-top: 1px solid var(--gray30); } .toolbar button { @@ -426,18 +424,19 @@ label { .toolbar a svg { padding-top: 4px; - color: var(--black); - fill: var(--black); - stroke: var(--black); + color: var(--gray160); + fill: var(--gray160); + stroke: var(--gray160); } .toolbar a:hover { - background-color: var(--gray10); + background-color: var(--gray20); text-decoration: none !important; transition-property: all; transition-duration: 0.5s; transition-timing-function: cubic-bezier(0.14, 0.71, 0.38, 1); transition-delay: 0s; + border-radius: 2px; } svg { @@ -448,8 +447,8 @@ svg { th svg { margin-top: 4px; - fill: var(--white) !important; - stroke: var(--white) !important; + fill: var(--themePrimary) !important; + stroke: var(--themePrimary) !important; } /* tabs */ @@ -458,51 +457,55 @@ th svg { display: flex; flex-flow: row; color: var(--black); - background: var(--gray60); - padding: 4px 0 0 8px; + background: var(--gray30); + margin: 0; + padding: 0; } .tab { overflow: hidden; - background: var(--gray40); - color: var(--black); - fill: var(--themePrimary); - stroke: var(--themePrimary); - padding-top: 4px; - padding-left: 6px; - padding-right: 6px; + background: var(--gray30); + color: var(--gray150); + fill: var(--gray150); + stroke: var(--gray150); + padding: 4px 12px; margin: 0; - margin-right: 1px !important; + vertical-align: middle; box-shadow: none !important; - border-bottom: 3px solid var(--gray40); text-decoration: none !important; } .selectedTab { - border-bottom: 3px solid var(--themePrimary); + background: var(--gray50); + color: var(--black); + border-left: 1px solid var(--gray60) !important; + border-right: 1px solid var(--gray60) !important; } .tab:hover { - background: var(--gray10); - border-bottom: 3px solid var(--gray10); - transition-property: all; - transition-duration: 0.5s; - transition-timing-function: cubic-bezier(0.14, 0.71, 0.38, 1); - transition-delay: 0s; + color: var(--black); + fill: var(--black); + stroke: var(--black); } .selectedTab:hover { - border-bottom: 3px solid var(--themePrimary) !important; + color: var(--black); + fill: var(--black); + stroke: var(--black); } .tab a { color: inherit; + fill: inherit; + stroke: inherit; text-decoration: none; cursor: pointer; } .tab a:hover { - background: var(--gray10); + color: inherit; + fill: inherit; + stroke: inherit; } .tabContent { @@ -523,17 +526,13 @@ th svg { margin: 0; padding-top: 0; padding-left: 4px; - background: var(--themePrimary); - color: var(--white); - border-bottom: 1px solid var(--gray30); + background: var(--themeDarkAlt); + color: var(--gray10); + border-bottom: 1px solid var(--gray110); white-space: nowrap; overflow-x: hidden; } -.titlepanel a:hover { - background: var(--themeDarkAlt); -} - .panelcontent { z-index: -20; display: block; @@ -594,8 +593,8 @@ th svg { } .active svg { - stroke: var(--focus-border) !important; - fill: var(--focus-border) !important; + stroke: var(--themePrimary) !important; + fill: var(--themePrimary) !important; } .bordered { diff --git a/html/importXliff.html b/html/importXliff.html index c5a0563..a0240ac 100644 --- a/html/importXliff.html +++ b/html/importXliff.html @@ -2,7 +2,7 @@ - Import XLIFF File + Import Project File @@ -20,7 +20,7 @@ - + @@ -73,7 +73,7 @@
- +
diff --git a/jars/openxliff.jar b/jars/openxliff.jar index fa97d37b46034927ec0206c9eb047fe52ab52d24..12c070acd377311356418fcf4ff8ed069404c6a6 100644 GIT binary patch delta 119939 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

hzYNiis2wNdKzKVUrC>BOj%ryZvG zZMgEdCe?d<^}Pwg|v7qrFqCED+Yk#1|ux^$3;(i+ElS%7YcA(dFh64c2D+?f)ubkm<$n|tA(na+)*TkZN8Zzn6P~NB z=k0O}w!g?c#J7nB>mkyK(4!i=koaSBJbR;HV@al+_v>bH`$e<)gs;+Ga>iU3r zCuXxUabcks(tN&?<1EQ&8)FK)nXIK&O$t?m9#wC4o+0WmzdRz$CwXxeT6A92K(}lS zPc}KrvpS*6r|891ZaRvZ=WYo4RSWK}$0Q70KyphWEI^TJ1Shh?$tovH8cc&2VyBtq zz|nGRSb{pcrR6~2$JX2iZmYXBuL5uvBgD~tG?}K%(GmIvR=cc;ByVEaenFb=rkcls z$C(QUw0M(}GYKa;bX{B7DxIaw!M!P$S#c$Xc9YwOksRu6xs;P)pJQ#Zb8zgYSlnLjc`0qh z+i>h@yIg+E!sRb?t86L&ZjKWw+`D;VIg5O<+C?B~dr67P*%i7E%BWPhefM=8QRd?q zv+Tb?)2NUhCEPPQjqvtbBLJFk(Rh>qxaU-K$1ql7eO@imQ20R10(r8NEL0}nH;_Q` zEwEuQJTz?IIxh`i*1W^#2VS!IqglfqT*9jlhY>H%ank?5vMY1q{SxE$It|Hs91t-H z&2+aZC>N>W9V*u^z;o}&aM)w;_)_YOYGxRHq)AFr<(rkWHN0CAxIQ6Ikb>tw0J}Zs7`@6_VL|ggIBmAqw53AN>6Y56XgY?c76W%^-v719z`(g*Pjq zl8^lhq;fZ<-WFbhLSSlF+{we7v9JL3vj12Y`8mu0gquO?AGqQ7S1u;|l$?AP$>o6& ziw@2W`@=*T5Xw${OZ|9C)SO9*gyachKW!W|+eplu+)e4invh?d=~4L*<46IJ`Z6xX zd>Z#Wuq$J4`b_4n{!F*Fyiuce*`MkopQ4W158^hXVll{m94Mu}!kAjOw3iEOo>IqQ zU{w!CAt?s`i{IQr)q=5Q0j~*jDcj|5cdV1T35s)K1eVI$4?ar$=+im`Cizu2Gbko% zCVKb*Ne^hAs$`svJ!b-2wge)g8SOaJl0Pj4A{hyl4;~S-uxr2Woidv!iKIkF>Gtjr zD_s0#olo7VMt~V2&o05E(!TyHXccCQvlOi3fJc>9W#Wv6NxM@wk?peJIw6g?rAV1W z376#rB{_>tbAk;S4rZ|paErdgX@f4p1cN6G;L87%rCQ@D#Z%1H9c~oHGpD z+Ug@qG)*JtMgeu0rPLTn8s>%mAcRC=XO|6ITVR5@EU^99vvs+VXLCB{wB8y0vE&D% zAimFD6#d~-lk`Z-a63DzVm~1vCQVc6;+$`zHY1#g`d<3ngg)b;P8Pqz_E9E9DJMm> zsYcjGE4b(7#>($_r!5s*Z+P9~<4+f`I5Tgo3m8L-NLd|k{|GC)M1wf;7gpUiHL=E) z@QZBAOW<w4X+&LQa6RT`+ajQNt;zm zbdFp>yGv^fj%Qj1{fwQ`Xc#{~71xfcE4e-tzX1{|?T_sX&^((ML{^xjs#i2LD1U02 zRq92hXy<0eq!M^Yh79>IR+&gow~!KOWNWusm9{5|ct*>P|9mIU+@Q!2u!z?YZ|J(+ zwx?WEro`Z-b&VFtJnkIJn!uoA^{#9CYWHAEYZ@!+avPmC-JId50DDQ4;nZp#RA5WS z*#$O^>rlYNYLervoXIX2e{VH~7vf;Q89&UW%q>E_-B1zn7ndDHvi6@)aQY3Ktkiy3 z#%21Mz(R+eq($X|d9NIy$nXgboD}1~^o`=u8ur^@%D1_u_k-ENd5->In>1U@4ps?O z6uykbZYl9M9GsQ;XcsgAmkDN@C6m~?KnLEf%pls34mYj^qOzpTATCBUn0P4JVmmWv zeQ2Nbo!x1{TuZ&+vtwE=p`QgsHFN}U@N>ti#~Uv}R1?5gmSuE2(l6%-*HdV*#a8VH z8X4i9D;B-t*HZF_wM-4S96RY_AadXpm>e%c*kQxJ&J>c=LOmD>(HI?A+tKDX1OU&2 zzg%KD66`v<$9u1z^^97ELaOyw(tS7#thkBR>}*zv`QoF6Ig;qtvo(Yf(#ZFUMVI`X zAj%B^ry?kaTPvICgCo>F26(@=#hO~Wid*h}VSRY_;c5%r9okDuP`A8GPI*y9h9mP| zOvlJ}s8$&#nv%>|#2Hpqt9YoGOCZEW`mjR5zIE5=D#jnvt4Gu6ggzmFXNnz64uL%c z1WM@xdSNVl+id(P7CcaVX4VmT*!sQ0hKD!0z6!bxWADJ1g>+;6lnML;n<07nd77@?e&sD?BT>Ez0#Q(0bRz5eneLu8?%Km zn%wFC9-(D}){FF)`&6=Jxgt8^cLJ-s?#DgfJs{-9&9Wp|hx^pL{hi0K2J`ZeBB_YS zjX=$RHwtm_wNh}}9Uu^l<#bGJ87p?j?lV(Z_ZRFnbmnjD8;@93@F$o7KlZVZ{t{|6 zqtQ-5+My2Mdw8jZKalk35ss^h@$2Es*Yj$TZC1aISplF*>lv?}csue@>DVDY@HL^J zbYZ#OFvAravR8`me%hsXa|aB-*Ga$@!H;mGb@UtclO=?321DD(q^;E$#RvJHf?+j$ z#_dbf=jJtewG}HX3*=eEa$vVNr(5sTyeKNu8eL4z|Ir4%*qU9dpHmjN%o@csTBiogH#>ZIwQ< z6Rulk$Vfx+b>HaEsNFte#g6h0=>0_{=yKI#St}Un`A~vDoZefXJ@7k1^k7mR=X~vhwgksm=SqbyW#EX zp_a@oxn|isKi8T;g%^z5N_>Ebxo<_sFk}j|u6X{aelEqV@apc3gB>z%mMZ$PBnKq; zgz0sSr*Y{*IVw+h*c(YS^u#{IJ@#q$7o)1Y&dY9oirZA7{C?z@=h`AH_8l$uMfvj% z(_G*5I~n8+vJ<4(m>GYJZv2R{`)AlX^AGcXO?6cCvuWYD;J$rh#ri*b%A5`gqph?S zAPo1P+_FNTQkMMM2@D_sA@_gB1Ub<|A%So^04P8>Bh|yDV|MAk_Aasu8<6ly2srWV zN?__JqSPXx%GS~Ix2UChNgJFAN5g-@(tb^iq)(o5mQ6=8rN_H>C=|3SMb*6+W%>T9 z@NK{R_tg1s=byje$CCT8-!ExZxx^Zm-)~!YIj%i-pVL@|9|Nnd-<)7Rhhf5Zo56RS zMIf?)X?vZFUa&n>eO0V}hG9@<&%zjXVMOECWH|ox1Gcov-FxJ-S@8dGkOYrs45hAR zsTTWmQQya52%lTP2Yn#BhOmJo1BR^gj^@vF7|8xq1BMgVTnf(u?=>=SJtPA=Ups@W z??v$cii2VS|N2Az(f0l3DL_$Rn*e%>P`pC{k^Y^A{0sW0(U*&L2*h~=@^=jk{JXnm zOzx%{czeHrI^s~kB^`|b?}IHA&4NXAE5D~1qh@Q5>Qf-pn@kT$uGgU;g=!eUCEV=N zk*zGCHO+~6VD*u5R-?$i3Q@==Iq+uWjxvC;l;M``Uqj{OzVYkojr@_V8tVTZ5#y>4 z$iV?QxQW_R#MK+Ao@ilJAX*)Ph$TY2rGH*s>VbsIn4o-4SX?FHemTaZJ;raA+P<ZA%P>>~oYOFInT3Y1OnRYQ{)6E-{NhOC&ECzmK#)Lv`p(AU7nptrPR6vfS zicjV^h@3rh)7jV|oJkMSSi<-#Z)3qJ&mDW{L`r0~E#jsk@%M5inY=aF!kz`(j?AiA zQTEA}CL|NpfIugTnlTriW}xj|AvN)Gt0 zV`8z;*SaB#fyB5jQdjvTQ#>@j>afx>JGcrIDIqhBKLTQpdc{F#9|&$*m@#>UBOf zZ5ael32(eQyfSFDQt0q1k_vSzx!+kw=P%deX^n)Stk4^EcgI-idLcz4u-O5rnWGgo zFQi}yTka~+DL%v(!wWxGsGJV10-g3{Qi(b6qxmwUP^B7?a$i6Izx$N>I35hCU-aJk zG4ov-Z@z#1icJTgxOB&l~n>4Z@wa)lTbre>w^F2aQ(teTF#Z#$a$sZ$b8LmPFXEXg&z@YtWA<(E>68>0Q>j6}t>gw!#)F`_(jbRJK)SU4_s z5q}MN(8*?hdhtt~+!l*g?T-PQ>04lR(PQH#--UK9k^q();>nf7ZZ|LI!H9psal_o{80N2r7Q?Qvb}?Xia{UQEG(uw4kl{@pSdKsET$fhF^VaympiGORhfUoDY=`= z+pP{c5T+cm`9EA}9S@Nj=%=O1iMwL7VS7g%$XfICpT7BaSdeyz->5hdAyRWkykWd^ zcTw*>!1{v;(j1hbdtv4(Uqf~&_hnsM5dNsy1q^?}9|s5kOG-E(9Q%S{@x#bq{V|bL zaK%I_dN3gzhh}J;f@0nAa4;M}H+S!!U?M|cI-jK51-)?iMFjZ_f%x?X;jFMn_MNy zt}<^tS^B*X*dGDkQGb;0iax8u5NTX1`@#2ha^`T(|A<2_r?@5FU%~rNewKy5vh`z1W>6(jIfFtc0mI=`m!egqqjZ?`c6i`~|zz zxqs{-Gak}I%Fz8F^VF|-VCkMYyQmNDHR2;kp#&d(S}>QZOSm;(MUR5gEP%62zdo zVK8hrapTW=QwoqiolauNlD1A70R4+T2?j4=$O`%P)4DsH3+u3!va!-h;l&A< zN)6{$JG6cv&3ktK-Mlk(JS6vm<4tTsGRK@^WaMnjV1HOBIuqZi)~l4x++BB5pqbM^ zz96nS8C`MszAskbB{zs$-Mq1rZOFg0=Hh7KyZs@SUg?|zypsDI>t;!DBTiDi%5TQ1 z1{(fDet!;61Bv;?{Z0KbAJ#NuMTI$_91CY811x+0t?SvpahXceR0twI>< zfO$S%s%wAB1*C9;A zK@1JD)M4GCEov#;b?SMmGm7;fX1rCHH`I_xwy^e%aHhT5`2ba-B6;cm_rxKa#^3mp>Z) zuRnUY)M%&2*l(P?`Q9-R&Oc&Z!8MYin6OG?99+uMVyvy5^$Q$fNuXN(tS~YeT*xLe zkoTk}9WhwIlFSbVfI?7aw;A?&k4=l8O(G z?vb`+2oaZIDaV^8FyAKEF zG2q`VgOXW+gA)8lKVN1JU{S)%lR);2g=;9aLIB!Z_n#96uuL93P8As%uG(1 z=61)(kzSN;7r?*9HPM+iSS_JOGP1H*KiGzNACu!9POjY;A=-rjMZXaTCOgityWSGW zcAZ`^ZM(4)W_@Z}8vu|Np2#q>Yw!2vV;!A8&Y5F}NA_TX{DO&F?j?Nqf~da51OBP^ zG5aMaSgkdDzhEZleSD-TU-bvGyA)pXN5#i*tEs$zu2eDJ#!)-$=eI+uR1b|m*oCjG z-A^JbryYuyY2l>@dJ~ih-|&6~JweMBDVge0RxOS6*$X1JJesQ)<>v-%$XU0VE4K#+QlO?g{{vE z|HVIf&@#@Fo@b~f^!@H(9pd0y7zVs%UXX-}0Jev(K95#AP(aVO!vxgE2^D=6Yy*H@ zL5%&kt!q0WyuiBDT0LD9*S{~yyrD`pO9;87dtSk(6b@!=^===3mJ7trzSr>vxA3wZ zAsz&yr*Y|A(LIm*V|3bR&2GIX9c!sGWUMDdo=A2==D%>!=`xF7`?TEoGiLW@Q4OC2 z^MTV*z}_Yvc(~h-uZOPDCV;sg_EVMvM8=N4bK&)gn4ctB(1`$yEt z1U!vxs^m%74SdsvV{Q}bt3_kFFG>_Szao}!UGnJXsP6q?4MFHAb~Sj1LudG|514l) zqFMojW5ezo%+GM6=(gS`v5r$*YndR`Jsn1|W7r+6V^DEl)E{3JXtt7B&OqkL27E@Kdf>Szn2$AU!N`3uT5 z>X^s_a6H*b9m0;FaMYZtg-cIsxd+V5{E>hYQZ@{0#b zN+0PyQ`CB$B;{8sE$?P+xKoNImAQHM<=rMOYHAKt|D;S=&PvDi$KZqETxVD2g?Jj+ zfmXJ==uJ>~(5+I7NZ~6z5mk=(Mxsu}1BLv4iW9TXwm}t695_Y$0xCrr9^A_4Es0_^ z`JSRmTUC@UvpYRX@|6<)g;g{xG|-$fRB_xYyTmZVxVUKE_JW*=p*3Wrmy73O0#@5b z6eSN+(m3!@Nme@;^k!#ayVS*SFk&1gz|Nmo1cYW<7y(IB69#L>*+!} z(wpHZ9RVrk<+EX8+gYp(@vtnk=BYyapeFLxHSBaddJge=fy9EF9Z2od+jQ+fYdIsz z9|1JSEKe|#VkoZt&y3}MNaXjL^FZ=58n5BTKXP;$<@7$mWXuV{efSqMMEfPI9~r``ITg>Kh?x)Qm8pI38m3OFSK@wYnvjqLs_r4-!WyFH?)h(bB&Z(yE7+WSJ` z(5d^rY0=YMhGK;NBTO>D>ts!4#shA62GOUsK$0#n^#_ZO&*_?|qM!hc59@qA|3xWK zeZb+V-uJcMcewto%ec*R^%Box1}FElXHU63p(95zz7G)ai1IwypX?+H0d$W*c=@%I z;fyN?t{&Y^fs^Zf?4(?!Q|^z|N}_@O$w&!dNPBd2Sxkt9aEXpjKH#55>eA$6i}(W+ zys@s>cM1OX?z~P7Wq6`h?9T$_>BgB8!bB2sX>bPjS1id4Fmol6bZ}K4Tzt#B$aK6* zSVsnB$OH4Ve&U7;bS1^>1}d>2PVFY_=7TfII<=MO*L`D;j7X6#WQ-bfDDNeEfgbig z85l@?2Ob>nk%7E#j-N3<{AH>Qu?{v&-uYNQo3Q_dOEyP0sKi8Jmqp%~ zu+*X+*s#>1m{wu)4Xr*%{%^NtkyVTf|7-ePh0_)>0nkDCFTv?>6_5n}ADHV@%8+pU z1?2)*zJ25VA27GAbPIq81%&r?7&bv+;`*e=VW_Oo*{{*oYC3rjjkaZ6?Wu1)dPjw$ z-qbdnU$zwE;^L~&Hmze})2=eOC2LJfvgs-7?cfm43>u+oeSQgzX7sraOeIddvumP?n!-_8s>U8Bpf0*h>fhQ-zwOX(yXR$wN*Rw760u z%{W#g-B_%|oP0Za?Fs>*VnCP5lvynEV)?DXw1Lw4If+s};g-EZD6?EDS?YD(48b5! zlY@J@VV~$4SD)ZYjXdWGmcu$qtyoHx!y0#^wS#zdqixf|J<29hf_imlCJ>Z+2*3hJ zf?5v&WDvX2U@`rm?L&YrreCRawA3hdvb!vY7zRd$!jXFLmv0DCJObzgr`WA|>e`u3xesgh1gqjN!YOu?fZ$a7;xls)av@MUy2ur6NMQ65a&tqL!tgu<4Qt&-G>xE z7hrdr3*1$Z*BM)^PN7s0NL5~2H!94c#Q#( ztRyC2BDXX1%6CA2R!hZ#=#IZ)#>BGKA(}6{`k|e*S!?}B1&IvZ%Wl)TlT-Cw)^Ei< zo{P#iN|3h5)o3qEnw_sH*Q+0s8eiVMGdxdx`FfYf%=aD=s@;K z#=A!fxnROL?|0l-clVpS(HvYW`8jF~%$U>({eK&&xnPqHVR zt5ScDvg{Nz`Mq&2n-Fn^@QAJUQ<-~v2c5ICsgnP%c2w2GXbKFu;o=h}1N3DINxRam zhl;n|)p-#dAw}=)&~F{#(&=Kr1>zFDAKoYGsK|22LN>&6daf#(tmd#tojr3VZVJlM^6?$ zBLRIfK;eSwaKT{kAw0s?0?9>dWrOEM(VIni_psCT(zxRR7ffjMWRG=9~Ft8IF z_yRzTcwnW#keTsky>D;KG+#kk#xRoPatUc(xqR)*nb=25{ zH!l1!b+-pS!{UPd@*f?Lf;}_`%CWsWY1aghzf+yV*%${J<9@zI5Xx)MwW_V3pw1Gm zaNZZxz&Em46(g*$M)ozZdTbia@`p7$P!@@$vnGoHwN8!spws7)#ng|m#~#7I+gehW zJtP=+giY0#k~tuVhu_Z`Z^*2_CZJ7`6$$*pfKh|laRQ=Y7gC>FKUnC z>qBvpaOstW9ctS#xiCVRjxTNTP0B%3Jx3C3;D^UJ2miN$!ZX#1c5|6?t4(YV)wI)u zWkT5>h?Q+mdK7ys7|scKRTdyL0x(A4*XJHJsLM~Q%^h~_`Ww&BN#Z3iUmAJH&dIc^ zI8F?~!T1QC+D@N!QkTl)m#MTvUd9GD+^c|8r=ypfkQkz>XP8{I0@J#vt$nEx!o#%@ zr#>DtsJ7=a+S(BWcv;xwwynuy#5hSVg`1UOxP z?^aTUb6{pFK>Tpo*=ctp313zWCDGXiiUf765g=vw3jjmU(d${S`$>+zL?UQ45 z%Y|8UPpyNfo2I3tqF*oeysZkb^x({5lbDeT!xg-Kpb$E8VCJ+p;oH(6!$x_5Jp#mn zn~GjQZY_a3>Yjx7Fq4-MP#R~RnYe4Ee3lm-mV-O^R6@MJPVF66ar_yfgcC{KWD7jL4S-; ziL~FVH6GYpn%iDZ3w36L%O`=Q6{N*K?4U-N%f4mxm!(;&Uy+HqnSC$@MeTgSS-+15 zi2jGlS8*nz$KXU|{hXZo7ajHcmNx~jkg!PWQFYr4)SnppO9UfymCs1`&6`Q(hU+~i zQ!gh9cuiY5US_Y^g8@|HyhT=hFN*ttd-=;x6HuAP76VJJUNJ!6)sj9I`%z&wjLE`e zq{XPfjKI~=)Y)x0>Gm)OW_J%Ch@)^$Q`xV~wJt0A!RU|{0<3(-%1yd%{vxDtU}h@0 z1OF{t&f9FH5scres)zXKdOn1;8gV=hvcLb<_D9%%q6esa@16 zR!TPmgH*J1FMz|;rB`XBA;(~QD~iP(MN%952+m9N4J*75&7Fag+-7SPW>LHl+8Bu5 zOd&jJm`uyy`XpDY%*uaU878AoDzR)-S)f9v6TTX3#GfB974bSUIvGT_6~9}Xu9~UF z);slbzW#DA44<^M8t3?jY>Voym@Dg6EZ4Dyse!drlmf&QO<}Sgkn8xqZ!gM3Nu>HL z^sD|QJBE?AgFd$vpZAxDBDoLiz(DIBH)KnBNhs-^fYe}3h}2k|wwtVu=O_m1;R&Km zp6d>ZX`F4s)nUj*eUkKN*WEFuO{cZW+up@{g_3LQAV#Bx?`H8^)Iz?7CpMWxrrpF; z&DNIw7Cewnk!r$pHPe?STSiDC`boz3L0c@F1<`e@JVBCoY-69IYuvU)jrazzovd%N zG8N)LrPC$wt1KoLcExd8a2PJKN$j0PK_zQM?`rz4N>Q=hL6Hpxy-qB%>WSSow)lcC zYMXwDRJr+Zi}-5GuMOdb)qEcU)ivyayG~JtX5hGuBb7UemdeF>rF4 z%kEB`dtmDA`q8S^_Ivj}ZKYa!;6!mxzO@@VauD-+!k9#W-NKp1br6@mk=!8Oe&L|j zJYL$aVbsu;Srjy+AL=mv#Wt+c(Rf)8XkRMl@-Q4RKdLCwi5Q%`k!s3lh(+frJSj}+y2ewi`F4|6LQKZN6*@4Y^hntpr3Og)`$n>P{9R)HNWA&Qgf9{TG>RfWaWLLe znT|@&hsdGD85{cTvN*gTK_q&(fnBO=(Dj>4#WyMZT6Kc{eHeP)2z3;DX#=%g>a<6Q z?`Y8A6J^N!A?A_|U4IK{vPYEZpfT#lUdoh@NjPVF4^85S2T0-a6di~l=1mXXfIgh1AED6yjw9M;ox$liihz~mP9f`GQ z+FM#;T ziTV}fr9pYF+V%T=FnU7t=PeWQ`D@{}Bg#Z@R+@7A;{#Ul6~gXdn${b^fn+DtLq0VN zMLIo;Gl+mA{WzO( z0U;@0!?)sO{|qib;0wjl%pNDq1Vwd1y-SHA4?wU$B+GB6&=2ysV4q%u-(a@ZI;^t% zHhVNu%V~6`mrL}}OGDn8uv$FR?#?)(GV_O8x5*G|N`y`=dAKCyEJtJ&)s0DAdH88v zN#kKc#YHK(T0~D#8F4dQQ{ldrOA(1^Spjo9O{txEO=$R9Cyr zwPwz@pOw5+y{qHyGb%-yORM4kENXnAN3Mwk|Fvz1KJSZXgh$H|*Y%nV$%gl_`v&%J{e6h7v-L?fu z_YE0?D5CU7RWKy-^(kHwl{xwPjzO2<4#Y)Kxrw@e_FsJzxcc7X`Y>z zX&%q}OGSxXr~vclK&;1sEYz;UP*g8fVA%IVW-v$DuTlMW;vON+HbXGua|8U}v1>FO z|4P&qnC(}HU_;jDfWA8Hca&g3i)$+Q&y>DAmS%fMNes z3R1W}!*K-7l!+>KgU}4Fd!-@EwC1T;W9GpE0j$)@eX)!BnRl*>EroHee5{u801G8jHWFyY-ZWoh$GIJ1R+0gY`v;e8x)3JrD*syA#gs- z@Tb#Qh!5~_j+0Kgb^E;yRzr`Ifr8i^hW$P;SY9j<2nKo)1+01@v8k$U};WYvt}hT znkMUmdiC`GN7Y*f#nndJx`9A&r*U_8_u%gC*0{Sj5Znpw?gV#tg1fuByXLUJTj$)` z|5kOa?*6mtU31Ji#xogyXjCx4RmUrtAi0-q_cN%|mj7-gE6cF-QY{63rUosMctkZM z$?8C}XDwNIHx8xFv@l>SafWaFNiMVYrA6MKC*ZHr5f8*t7GI4zhAy8#UP9%M7R8de zN6s6b9Vf^dkU}Y_R!~^34=O^Mt{k5SwY#b)Fg3UHRy`DY$X=~+hWTr-0Go{-Ek(Hp z1qu^POBx9%6i)c@l}OHrfcfG%7&6y&ZhLvzI#TNDlXdo;F1 zbLw=P%h)nng-$DrnhL`8vlRHOPi!t{X&g;xk)|?o2m4o(JcDyMG6R)vL9?$Q$Q06+ zMJ%ONdiJ^f)|CgySx$=)0NkW%v2jI_*dwx2#v)*ee4W$?&*;c9Q*555`1s^@xVD(@ zYyGHiJrhJ;+ovoIM^VRClvZ2kPkDV_0ivVOIS z=_JcdrXu2f0&TC0lDb@)0p{Bvt)TLbfC^a^TvJ+rZ0=7^-!{pJxB!pJ_KYe;-D)Yi};asJrtv3xj?qK*rFd4{O} z{uQ=X;KGUBqdZ$Ix%(8(6+W#4=6W^ zZO^D%H8^7p2c>rK66}c%xZm$M$wtUoGZGt%GEJJy>DPPJ<%l3i*Dn(9tk2sHpQ{HE zz#8seTb*Tnd3kHAyA%YvA?ZK2w6V0ZvRm)UbG9zjxSA8L6&;;D?h2;`z?BS`m7vVf zIX)L6-bemX9AJ7trWbJmg{wwETHJ_zFSE$avXV=`M1GpRv%dgrT0hOMUp+M!KMt&Q zqCV1ceXAaoY#kX}i#EdXVV-1iW#g= z5vgu>9wv*)e9+6$PspTWH0##1TWXE{_LoDCY=YznW_-)C!`Ka( zZ!`e!IKMKk&&a|@uQ-n{Pz1zRv{3dg3lnVl8Va9)cXOsCfz1iZ*DT$a)L^{S!HY9e zWi{YawXX!c9|=^B^!&x~@^vGzeWWaY2^Y`Ff$mJ*>#HD(Hxb$P6K*aQ6vB&@dt#@7 zCjGhNqs)r!<{REZHx-NtBu5p74JGglqHn*&_sj}_ypbu_?XZ4G)hXBVkWYL3s051F z0v$O7$J%pjvfcgSv6J1N2|11bLySk-{pI5IMH|2NQs&r6#DO7HzBcNR3xMY%*@+9> z8kRu!K?f14Ts!&*2VB*^DAc`h(q3aRQjvE4m>PRdj8dRY?d{LR&dGa|R`jC7pI2cK zsOX`^+wW%~h`*ug;{iS9ECv~!eA>+&Tf>n>BcEYjTf?j_&}C(J>D_=|=#2Qg=(2v` zA^wRTAJosjl(a;TWlTIQyimKw+9cY8w)WH=A_S3)-(+}=;>apTAqAC+IxiruVB*z@ z@Ct#w;IYP$GyZ+fk76X2)_2?Os6ssL*Iff z%nOQ4YEqsdi7pFj8emSEUb)@%enxYmB8Qk64BC~~n8y%OZdO<;P}$6b@Dv+ArT;6` z`#MPyTqs%4v(QPSV1tQP+uoH_ydI~of;Fg3d4tSERP@ce%+j=8lqYMojYS9QqeXci z)=8^@H942S&dXPcUpnruZbSa%0NN57zk0RBXQ{%&tX!&kL^Uw8DZ)!X)=y8{<@ds1 zegO2S@<~;qiHNJOgc7;*j6z(=QZ<%gKS?M!7cPRZqtoF0SPL48x zjH+nvr5=`k^uP;cU*#^0-4shNSoGAUaBr9+{ui}Oi3|g&Y01o7fy&ISDW$XoNnS>v z9wk^_{X>iJqHab;gMc~S{JOkvwLC~|HVc2rZl%r=uFrFCqz+r%RA-zO=2+mXovSSI zp(QGdC2fL#Ode}PBp8X*X!$h^9L?F4)N;ASf2U{C$wf;vBkAn0jCY|&Sr|XY@t(*D znh(6x&weAJCvyvXj!Z<<~K&I#uJFVI6%ud@uMHnS!JdI7=0)|rR z_P(*VAHz)EYcFvu6jn~ko_&~`Qo;jH3i3c~FsVWWwnm~CuT2$a&t-h%usNH`Di@96 z!xtTyx^aSjT)je;_t@S1@<*OZ?Kl@k$t+a1e*3+cD_N(J9gmtd5bhA)pM8aL{&s(5 zvq~-?*;iJGv9l{mocm?CY|V2qI$v;Z?jowL(YuGhB_ySiRPxTSJiBdhOEPO<1?@p_ z80ic)taObeMO@5LDicyx`0*bcNSRH<2)3Nn<2ujW1#6XbfbAGtDF_2i58)!oU!`yy zKTWSjIeWz>vexNG?hYqJUhg6z3aoYExE?C&&PiHB668Xul8=a+D7-)7Z3-oX6A>D_ zbiIrUC{4al%)H&uSLykQsJCOMprSkV9D2Qdzhc}3rXR-wPh?S_L17H;G}y6Pg8)s% zh7&!vN4x~yT&7{kXBE2@kbFu)3XaS<`{QwpL;Htbi5Oi!Ug9-oJ`=9@?0npoR%v#> z>Ays0n53+h>~w1tdEKiaCOcAKWZV@WD;zzS$^Z^M!It!(MQ~8JXeuW)Xrr`GP8O;@ z5AN~15WwSwlOWym1@jv-fxq{lM-J=eRTL7}-cNI%X>6ok5o4ca?9fc#*DmzEg30Gp zR)NbX1uhqbKBTW?UV2K;T*D;Sb3eF&c>7dOy(qJ6g(VwF^yM~6PYD=AFAA5mXwV}c zqFt)+@_-}NiX((H@2~PR5LS!Kw%E1Jmjl49i@9`k#d8^;I#w6izl~6Sz@5ljO4AxF z@dsK);OQ*)d7acpR#TZ4v0wE^(qurW5e}o;4>kB=)>1R3U%j&VscLPi#l7x$R&I2B z;Eg+Vdy38d8i#jy0nUA!dk&X~IZx1;m<)o5pZIyCOm9pO^W0yP?JAzwo<4XF-&yEP zq#m6+?0K~7)|kFP6zJ781bAV14CYBz@Mw{TfB zJPsY>-or{|VOk=hPO&mgXgI=ir1Stp3YPGL6_Bz>5NP?)T7~JS_v(cC8Ag!pz(M=i zS#!3B^y7S>SNPDy#k`r}lhJcbr(5R5qkWP65?f(El}1_OQho8*=|LI|XspX+HS1yYW-RFJjEH6w&v>L$@4vtSTIEgO>F)>Ouo6|G%bIosHtEgbZ_|));(1V} zFydrf3;{UXw-R0MatgRz{RWT$}}ys(yZAAkHOu$6!okiV8cJ=%4ESn z*r#{US1#m!v|MOqUa9ogZT(*e9QSBtC8bHPXNI4&AZT(-UOsb_Y;#SX25rjstC$YmbH6Z@BEjIGYn$gX7o%QjIF`B#B8WLx)4u@aK~LCcQN!{-#GR z!xD!Va3=cAyygCeVcxU{-NyHtrfG=DXZs^CPahN>RJD2-Zk7I6$dG!S+GUN{W1 zeyLZE_s56ig)F7h66RQq@#XWxG(3gxylJcW=RE!Gx&;gutHU%|$2& zh^96XOX^dp#ScQ@%rNXE@Ov)Af^WWqW7Xf^KJsz!y}$8}T5RTQn&=cl-XM%niOV5& z@7#*I0(vpIR2mk|i2RT@0Tg~Hd5>{5wM}8sd)S&X7=9-%aJ2uHFw{T6FcxEaqMO8Q z#-qbT3g}6~5q1u5szm=BlW{s(HS!|Fg1l5H4OIG}*ZD5_eOp_2Gys~8ktT!WCWR{R zWvXYemv(qc++%jwSC?J4|Ipq~{{#|IKOZA(4z2tR?O}e6*DHG_Z14>g}QAZuCtY4kdK@e($0j7KM!hqfbHCdJn4}ro=rBrTxP=H1j z-jmL1K?4F~i}tUiJF1k%1*MEbL;*nM-sO&U(%oe!Y~OsV<--FpirkbGH2(>+@!s zwqhn5RthE}dl6~~w785NbvyY(YJeX~hNX@9?y^W1$G3LNhPxi#*qTV5iDGK=^$e5A zuZ6SV-9L?%>S*~Ia`fCV+h3p@ga_@N!XlHsOvD4*scB>twM*$ef0$YzMTz#kJ&%`r zz;}zK$p4CP-`S7?;ly-qs*;FndJ%YwzCZYW4&l>@^m?myU{V73s&<=if&%AgvIkVq zZ?fVgxptY8m5x1MdH5>x0-q|LzX?dvoxediV^>Qfj2QCy4I`9TP(@4$EjEeQ$> zpQ`!bP@YIOyW8DABJc8y=4A1o!L$X`WaF3zhy)w-!_j;ODp>jb6Uu2e-|K06tda-l z8?&x0c`vy>*pZFl2pu5;{3g*BFDJ8Y*{1MGL1U6@i<^Jen#!+v38>E6CClA~f;BW- zb9zi@e4t`L71ylU6L(w|4{;rmsvgP=*If9J>;Sz&{a{$eK6_}Y+}L-k18M+)Ie`Lm zbBQNdQqfTU=m9%~Yvmfx_Qiz}9x-fYLvuUu^z`@w`}mB!tEnnr694k_t3B%@6j!<5Ywx#J+S2 zLfYPY<%1h_Sh?p>)8}Lt`ckxS=UNjgBft-GYP!X_)4fNvKFjE|)2w^sSWLp+-MczZ zGNlqzSGmFVN!~m51P~mY zTO<%~D((QWf1uOG1j3?@d_E$&xUu4fpDFJ=%|0QZxx9xrq^RkEb8x8qqlJc>Ghc2w z1JK(%xSLAk{_;-hmc{tO6k=D#{hY* zX$K@ii2HiC2B*0Z~Ujhq7f``9q z8AbQoqW0cuybt_)f8Ta~PmM6?F z%BcP#f$kVqh9Fjqa*^6LF3u?-AqbarBA=%d=MZR>JbF0`k3o{9bVk81>1v{cv-VQ~ z!zn~K<}434{9Q9m5&t6iXczdkZe>x=94#)|H2Ct54=%>hgKN`5mbhuWol}g@ znjTS^FnZ%B3WJMD!#XC;tyl<86m#0J_~3GqwKCGUtZ_mZVd_AmFDPoFHTQNsXzXQw zbwAR7>|fSJWxOzZ3a$Y-5lZr3KP?!?6E$9WwdPPHv{CI8Sp#s~9}o%090dd^wg%vY z5K}Z>x+!r6;G~rH!r0NmT_GLs0^={D4|T%(r>@Mu5W0OZ>9vFI7uY;tGwY(R$8u6u z4ZsQbE*@~UQb2_f+!HLwtGJs58GTVM-2vH-JAeHk|B=m!cpwRa3FefgxBm5Du+6VW znJ|7iF9ZB%>->(--SzGEnO*HjPXV zaBrCZu5bduhkpF`4RTs<9@4Ldz7xg&7&eF#Y9OFeu9%=uo2kOV=~4f?Su+Ft5cxkZ z7*w^PfC}QbZ)W&k6M&SPFmU1&he~h)kj`Rfa@F2Gs$`;&;ySV^ZyhQn+0Xc_&^@6Z zHzFtD%m#AK*~UMbi|lP0wHwM*^hHRp1@^*lCTEK_wrzmr#L(tGeV4OMy>^ME%T70) zl{f4k9!Kl6BTkj6HNIP2Q(ON$C;x#ykKQNuMh!rFyBc6N1xQfW$X_Xzez5r+5H?`y z#|_GRSRkR=jVC~`cz0OM=jR|cKrnBY()IAAE-(i+7h8~iLPM3WWcTHpe$SNTUHvRN z@F+9z4y-b=iJQ7f z)Q|EA1C<+B{DrTf(4c+AGk)HSp3z50#Fom99AN9W3do?B5TXX~^-rO* z@9}I~$%nB3A4-3Su8LiSKo4|K`Suk0duw2~;&lq_Cyjsi&=dHxz-KWED6(7S<`piJv!T6_UsP$m$xejd^8}LB?o}2%b)GByNb6T zzQsiFdEbPr^WY8)!_3AByV5MM;=X8J&G)SBYe>!P6o@B*kBj_FVq39MwhSN7P}44- zWigsnYoqYj%U|1T&`q}nv@t-3s!JBs=Qb$g2(T8;(j=)@xOD0|iID!u!v)fgOBXc4 zHX?tOXd;>m?z3FL0Tz(DjRA!<0TmY-B<0DzoQV%qZ_eL+7J1G&acv|tAAa@KeW|WE z(#mL$Oi0Rv=m%UhUhRrQU+gub&*DOp!XXdmX|8y7fLDg_8G4&k-b2uksTr9$S1@0W z$9Y{n>L#1@zPK@+ECpws$&U0>Ag*<{8msU=ti#pEI*s^I#N6)!vl}h;RVR z2dJaZ-xK|ROHlVS*I`sUwrI8u*Ws;=;G%sLvsx8hmoN}SvXxcbA)tNXshb9q*yV|X{P`ed&Gp6CN z4@Xn&4KX`WC$yf+uDfBr(KV%czo_Y9xuxV&)7p!B;sEas&!g}RO?ivYU1Z#a@`A+m z(ACOxWII&~^cr-E_*qVjD#*p>DB28!xG z+6eWI2j$7Be^Dg|4hPgwDJ$>UGGe_fb3!PunIEG?$8}sn`{CiSIVg;)@`D~ZZh9Q( zGeNaLKJ*)3oDKOm_BN4p-lCI&&$_)fd2X)sW(smXYc?S$=mw>N_Tx(ygaW630n$RI zl@T8YsB5XH0~)rj(EW+++(r%!CXJg1kCp2?zNQPF5~@9)r2#xv9~v7A^astip9u z_tsxPRHe8j3%d_$&hDL!GnrM2arc&ELSV?$=we+fv{$=PtkdP(HJQ9Mn=C0#G$?|Z z#pM?ErVzbXtMEovTQtIoP2A_9MYO(6R=X(ELqeKqe`D*<4l6k0kbz}Dyy*zqLJ%dE zicg!UlD6SG{f?9vWgiQ%m$u%hQI%dl9ZrD-AD<1t$r7>b3FX&RF)gIXkCSguhS7L5 z7B1401t^}>OyAr6p9LJvH*gT_g?JsdLG>`7?IRU~IWN>)Y$;{jrpieD{J3m=`0zsODr|?}DW& z2iy=e6f{XC7Uz(x8){7IlWFEmxn@I``lDWpXiMXdorOwCEzC?do5|p`9Z*!7n+$)I zVZ&+SfS0TzkJI?i$=J=lHggp^(O<@$zNgzNR|J;f^r}aV?Sf z^r^d*A?hyIG+UldZpuAbLbkNCMAKDVQr`t)%g?5_t`M}}NibRLNv&8!Zu8JJYD&k* zq=C`svOqaf4F)>`DM?kB5)k(iTu8fiasI(qu&C)aEgrsvjl=t5e24ph&m+;9IY)V9 zkk9Q5Pw9+k%UFiUWzTS&9&y0@>Um2zKN+mh_<~*y?_3N>d$8P4rUY{vb?lna;AfuPTD!)2o>Xy2s0q*8RTwK*n~eu&R{~6 z)VL3qYe{17B+dh*po9+}>iVk`Ajt~%6=svY2Ra?rP}^-M^>`yX)ZOdYv5=pa>bYr5 zI~^!cw-$^@mLvqjp!6i;s;jS+{0`Qe^`hvkyk{83c$_$FUC6F9Vg(1N|NWMNdslH` znQ^8ysn@Y$9vu}{4|*Q^ZVO@<4%b?i6Cipua~$Hg&KjOL?bw0UIeQ&fF-u<1yYxmP z;B$yWa4D+i`yt>s2!Phaw%h3zyrqz!gS~h;MW_*fU4cC}tVF#NkYB3&1w@U)Gvn`_ zIj)JPzdn3yMm;cF` zGE)zMy_g%hdBMKzqBauAIJ(@qhc?NU$Iq+*6-4fKgBgXJyW7O2sv)z|tv#Uh>tJe> zSME>^zXFf!7w}+TZlpRMXRF1SY%(b3Y+IOdp)XehAgY~k+n7AX)bVjn+g=~lsQ3^I z&9BZeR_FZc2GTRT2s}>MhtJ@+JyAwCe&f7$pYL3w?GBqqv^8GfpNn}OPaia1t>yR0 z#T9Oe#akm4r0-DpiUh1IO;~az@B*XL$YnhMJp!bIi&^T&zpC1`O(3gGvMZbP!bjd- zJF{})*)LoP4tDjKVwF_2e!Va6#!=zVn3&c}`K==cg9JodPRdP9qUq&B8 zUak+6NKf}ue&~A!nUA$lUgEA!24sKN4Mf@%ksVlbH4yop;NQjkt1ZvD^vZh97js%M zG^K^gelF?OBUesiY_FwS&c0F>XZ2nPxNAT6D=B=o*g7e^oO2LY7hGXrj*L}#BJp3!q5M?O@d{$3m0Jiz6#KZ6ht=4QD^0?tb zTun8@?yI7M2ny#wBX%WrM0S5PBT;2Fe=Np_?Ye5`Dc@o+j&L-lBU%qH@t?2I*3tJE111-g-eMEZ;VBgvQ`7hOI{k)^=`gJ%c1t8We+b)1@qS5@W z9G42jV(^u*8Q*s*Pf_HIBs%4@)AFta#MW=SJ`+C%e!cCG*6-!!MGii@nn+&nKS_Sb zt0-jn33XS5wLkn~k!X=qIF(}|bUB)UPXdu3W)1I@Y2V zLlvxCqZk4lH9NrbWd{QL*f-&*8h7MfguD+L?Yx&_LHlj5-}0%w$d0yYVVNcdAF{{DhndQ6A9n3tuA36S13 zVJz)yDihUF{K9as;P6D+3gzVX;TZbdfONennjGsgd!a&Rzb_-K7RpPPo5t)X0y*~s z0+4xybaMQ2o12peCizl)&TZVdUh~f5Ws3E6I6x+>g8?IX#hPm*qh3+bfEbt%!jM;c z=?cN0FQXZta9t}P;D@>Pn((Yj4VvVi2r zLJ^tj1&ixr-pRjJ4=o|4VT02<(NKaI4jrmc(Chv~WTX`aot6Q=-b zKDvAI7T98_Ittdrt~b!{@iyhr+2_(ub|&|+H*BRXp|rw;d!Y$*E!w_Ak9=N%CF)k4 zJ^0?};(1H+ZAB6CuPvPGDG1!@FXTRWCSsDqYdB5jJqj7v(h1{7lH_;Eh6WKv%2Ji_# znQFUWY`<7qe_Sdee*k^^-`&MhqGX}tuZ020IN!kkuNXyU`2x*Qw1eNm|0i5=|APNU z`%mSfg>|tHf9c|F-2ad>3AvDPDbp-aXen1~;NqaLy)YNBvf8W$S2RlBucD~ogx2*; zV0OrNP|E6IePw0gSJL*|>QzNomNVgz;}riB-{r^ssg4RGcuRP;^7Xguq-z*RH4ly; zy=O@5sfAtY_xzwQTXa zLo6U@YaY1=oA?PA{HFZd7J9!u%(?x@v+c}hOyJhw70mS;%cs!zd!FLSTHtFe#Ip(U zH81L?=ubQlP4at8)Ya%SD>jIsskh*2VHfoM84dk$5jPI8r!S`R_9AUKGA5e{gUJE$s5L!C@&>p=2u6NOWq{1sW_eH3vqtTzQcH zK_%QDLx}7Y%OctIq2F7`PF2XM3;E6Bbk}leRp_i5BZXrw?6ktxz&7!GYnY$Ic&G9x zr5Qwy|Af5e$t?Jvuua72OiV+KeXFu25if}5xz#u2)A{+*I73p)heq35J7ikgB(s~0 zy=SqVb2!IrikU}k>R64Gu5uaPUh$+?#jMP0cr3#v?ifnrxv4AjS>%1` zqC6RHYcLB48J83gZI$TNy0%By%~eJ*iTb3?CUcpN3agG<%XI=vk}*uT{*HVm(k@w| zOLs8$MWJ;e8O>UYJ>b;gkxza%vTtJ6YKGQF57r9HmP>T<$m*QBvgA!g=L8^ybZ$;t zAijF*U*)EBZM+PT0<+|3dW5t~Fy~BfTpFng7pJ`anl!xD3H%AV{63@bJ~~e(eugkI z?cw2MNi)8=3J;`B8BO-~jjSeH*)aYJ4=93tRvMlVX%sJ9qe0=DbJM-F`|Vr@CSK}w zi9rz$Or#BB4fqx5sO2mK9!$pP*Diu~#Pe{wSeFJ`8iAk^m@Rpa z^2s9m=pZfOMa#(j3!8P8%m%b6oPuIB_XNjSp6t5co{n5MTBpw~33i}J_;x!6g2*f` z$NZClMT#+kh(-?1<^jZq$NQW3D4ZFWMaO8HS=0Z4XLgJb&|0=^?xr*vE@wng(62?^ zGL4Fl@mLb~{AG*gEt6~~nG@&0W3Qnk3y~uQu3o@C_3t?JVUIw+Q#}4;j`B1S_MOFv zj>g&JUc;%2R-#O9r~}!c#Yj;u0zIYM&&!7)W39E)YQD{It6N*zu435P+S#_|d0L-E z52xE(brLI+NtdjWyg8XYDk?l>^M7V8Z)UDA5mso@prW-=g=HRs!p&~{T5RFo$dt9FN;sO%SElbl@wJQ3sFX{_Xn40+{+e3buSe+yg`(y;zsciv+qJrW0a6``^?^*I zyhu@B8vNXLO@yYIjlj2D>CjSxqJFmASri_cIsU$_m=Txih}hji*$^zk6zUNm8Ooh5 zTRP@S@b{~u>!^s>okCISB-u>W8!CbX3&kR09Cd0r9W@YN%rLYy=4B))eG{(<#+@2%~!lr*?Eo1ZBh!S$OwHj@Q zIXCcG;f8_uT5gVe_`?w{Byc-Fi-!W1XAqOGnfUt}iBM?gnx@7Y-(t4RDOTXe4gstj zPwy;hPOsca%}Wm4SIb2Xw@e%7bRpI^rtB#hkVVBU^Bu~23e@*hH$U}yjck|4u_m5V zf}5akMhk|*Mpk~!t@SqW@=?Z~%Rx`U>bQAPO;~~=%Sd;OmC`8loPJ1QSMA8}ryBE( z%HyE)I(Y}vxO1}t#>`uuQw$ZhdBfwwy+#q&4s#Xf$CSp<@Qdqmv?4BhUBtrmt@zL{Jh=b zq6X012rKF4#2M2Y=S{H{i<#SB{Kv!RKB{*0vH_?Td|;K*RNAwo#^mVvWZSvLxy)>8 z{7A+Zs-xxxRRc3eOqcMhJ7w29q$e*?6_4Rw*y#K+==L`LcIN|rh?r*`9dGiqtz&y% zXD8{mcr;jLd8`eKFKb2@3eYkuRQ7$*odj{<5AOr3(%WUZGrU8p%w{1|s+6B=^2d&B zNKCloZ`?HQqg$U!VTRdP+K9y;HAS-Nt)=lBc{A8;WA&Cle(OA%E?~BLDl9PsmR~Us z%XTsTkh!@0czbdLw)in?iG|?bRh;UAbBGTaYn<4%1ci}*ckS{7G)Xe%1U?aHxr3C5 zt`7t=Sk4m(k!`ZS#7m4Vqo5XzMB2DAFQu;0vOgn;5CCb%_v%_ zZpcL6mqJ+hsUnfdx&*gWajz{B9GacUkW$HhcU`1R;j~(_bN;XoS*On``1BGmGKGQ? zq0+y4fI8<6()K)e zWRmLkNRTAVWAxP7>DVHP;%!({jJiqAweRT|9L3>izI#i?&~E>3E$$oB&mSJ7zxI7^ zOFfV_AFf21GiTWRO4~{aRKbLAUIDqS$)=W4%?}w4SOGa9&5mK_vL#)TtuD8z!&LIk z;4eM1ocIQ!De)uswPQC`plq_rZn_Pw3_7_`*X3ZSZ<2}wbLrj@9(*1bB7S4`I@P`d z_Ahnkjj`Ug&}zG#lM2UAHx}g0@7dxtH+aV~{u0*^n^U4uRb8lHr9x_^IBFk9iW@4v z7y;t+9$@Th9@xtE1r#Z--nfm5WrXG=MQmJ=tKxF>1%c74b+@_Vpo&NtuWLZ5mjmor zKnq(m;A6&F(-R~8_!O+VTe^LhPuOEe#Ux|)Cti(a%`^jYU#jPlMtzvWt5HMTAp*r`auy4;luF&z*kNS zX~PpN*TxboPHa&R(%0!pRv7nDXqdUPpmEO1_Eb|GZa4(jmfzvAcOdu!X#<>_faT)9 zlhT{9quL%)(afVYua(p2IH7#d?scB~+35z^yoQvWjm=m!)c&Y}R=(kbp!u2Ayz&i{EqMU4-(=A$2U%%M1E?z{vL1lnIS8W@vcQ^ z?w%x8;uz{)#HF^Mf5eX?I*Ao4fNqBxhA@tZ{uzw*y!h1E0_Kct-a8AS=P}y4fwT5q z9p(o6aeGw;GntYH7lMPVc*=Kq0v^wqj6b`?J8Gz zHnOc>*bhv`-dG1ga+_sEc%m}}TBvko7hDL<6)QS(T>Jh9z7xILR zaU@b=@?tc%YQ4DH{ zw|#T8232_?8Y~p0Fk__ze@7ZzX-5j@x;@w>`X7PAgekJ zu!Mg+JLNWw_^b|9r>(Gtv`Z_wqdLQ@o;zzeUmXrBHUxv*zvuDAwiiJ*GJGbPnQBe`!1nu^;}l-@jZc8;3gb?4$y}eYV=5R zn(c`H8Hkkqw5`GS?27a`{p;Uh@4xG95R7ESC)EEIefJ&0tHNJo(NT>5rQ;w{m{_5Z zn!!%NW&gjJQXNfjbnDlBp@6_vC`$!FThhF3bc8pDJ@tSt%K<+SL zyN`Lqj&gjF_XJ>`{(5vrd8^Hb1t3X2=MoaH)BFv6uemYG`#^ySeb=N3N!cw3^pPFE zc7%C)L+Pb7^-&%w`4XW+-@!CJ6#I-oUwL^S@jmkps@+n;VTTSxQZC{>XE45?P$1u~ z1X%2A?RN>F&n6O#0df}OsE6!OimJyAaOPjc^>zhIcH9m7%)hp{_mC+2(dT4X!YpByz4^=uyubzxLY(B!K543-j~+xci}jLh|6lScOHKb|8q2v zLPcqRg7LGZpkL@##r0mS>oZz5ipoDNx(`OwPwCR;sKB(@1nsKs+=nv=cF!y~p-7-7 z(V}@qnl6a9*Zkyz-xB-**(y3Pi*Y#!vdVNQ%y!cB;m;(M_3lzKF zPMdnme$%m%*W?)zY6{oA+0Fn{QfIPcuq`DLnhz?YLyUBq$_~6;y?Z2eSgmgevHz)E z3ucmy=fKnUUFo3fhJFNr4#FSslBU5n8n}Y+cNPzm9V8hiW>Ge4eVtwOJbX(GdM8?f zuT}dTTa>%#@r>cPD@b*joE=5#S=9MT5Kh(Czsc9Z8{=}_JemTWZUH^J{z%(>Q<8|U}Vyy&pxl^w@Y zY?+9E665z$m+_J{Q+Bv)SqYwC@zdG(rthE=L{vfss zr@2UYSnE$+NI%+uHg$2(#wxH79K{D!cfQOtIblgz$v1qY6tzo|NN|(8R=BzL{Z-My zvdIU44u7R!8F*@}KBlV{tJ_R?Og_E>VS;j_{WuNcEv`p=Nqa)3=wJCxRH`zlB0MOx zZ@m+~QN7A@BTy;SR!Wk^ZFML=tfm%gC&sS<4#2R0oNwY*jrMB-)J^bl;CvYSO{ z_BC}$I_Z38K)S@8C;uN<$nZUCW(@kOb6EOZp5V!X;0{mxWgz<~NOffMX5TOLO(?LB-!kfOAWr9)Z8^TR>@2O;48DVajBwRtw z5-w0+3YWtPt0!rVt}PQGdq&nKna3qRI?vD{D>)C!Q>6T(acsPrJ1u^iu87ur*(tA3 z3&l#2$%8@5dPt!CI z;1+Jsk9vNLkQTA1zzHmy{mZ)O9MyaS!}(+44!7bgG1etSesjJR9&h^XRy(2^d2^^@ zP_4A{Rn5?*YQ$bmcr9fVXIFqlM5g2o){_|&Ty&RzsKH=W`N~bhPUp4yCoig^f?IyC zKu>F;Zrytrqv|HAYN&jsx`PK^r%B*=)AhGFsC$yDik>quTQ_Dbw}$3a?A~VD*@nGk zm2V>&xuOT-NRFh3c@)Pd`oxkiGW;vY#eC`)BUug7 z@!}?XeSoANV~+D|uE;1+lsS)zaqukQ3O4pMnR2NR>Z6y8 zq3%U>;|;$Oo2+5tpxjB8VAi(cZY0(-Uv9&4?&3qGIvSi8^R%nHC5dM>NqSv}d3S=u z)OZA&Sl!iKd0FYt7|U?xL3>iNyu0bNy+u&su1&0MgSvaX#x5gdC94@?-*lUjt@VAm zUz>bbx+#eDZH~SrPtpAV#|BATqC1WuU1y!-(|js$y31tN;-$3C`?t`qjL$k*PRP2q z`nvTFV}4pMM)R}L2FnOvT*j<&*+hcZw>UcW0=zluejecuZVmC{z6^?I49fZEG$8CD znmIv5eRz#1JV9(!7IC%rqv~DGbC`evuE5;Yt2zt!1$-C|fTpe$y`ZGbHd9$ebeIZ~ zF7wkjp%KxPqL3lqpGlib|H!7>&>=N72rCoca58FzTohWJy z&CR0oZBD$C!k(OWHEfd?lGCVK`9Io(DS=(Xc@Vy&sW1aYXsM07Ug-6)LTX2N z{kji$6tqaB$cf?(3`8M^Ff2Jz)4YMXyiG!J!GUzBQL89)ZrDex+yTgM-DC_<2T5W< zd#=50Bn(_3KbUo<$L0nXIx8y-D@t}C>yqn4iDK=5#l__!CA^@8h9#8okUwlYVJa%w8f z8GS3kZ-m*0lm(b5ez0GA3sC&5step2lDlk+u4v>p9x`j+h@zeBfH1`nGJ!6uNLYhe z(6U3x$iEF`QbCZvk+Ff_sLTPtpAy;vFjG{*D&rH%!De`docvsWsrF0q;TZHa5eiT| z=#)i;FR1eG7}k5YX^eeY^7Y4aHj_?6`nS>TAtH`35Y&d^t@UkC1&%fsTZi+%TBOym$`+y|}ygG>hRs#6pFz83CgwK%xhlS)%(fPL8E0-6nj zhs_H#*P=k|A(591P8#2Cw~cO$`p6gh1L@6+)z03rHvsayf=c$GBabAswmD1{#j;sA z8fsLeUb+rx2Wz4d@bAJm>`)i4Q0ADWEm5XlC$$>}tRv}Q>u{PE|5ZP9^Jsb)|J63s zZz@lL`~D5_+DQhtE{SKv2;z`hs4BB1hmDhnZRJEeZjh89zp z;J@>NbPnP_hms$%a}276e08cJliais^F4`yO-9HK9Ra|j&-ZPbW?zZGd1^i!9!~q0o(B4~ zKg@Z_Ap{w{qI}bs4Ff}xU|+Y-1(R^)n-1gzZBMbk2gh{J-)QiBwqYyrmG0RWe)z|P zx~$W0AXz=f1r(9I8GXl~0A8aI6S7}Z_{jDTBhU>OUiTa04dmEq}H5A?nU;2W@m zuFWzRZ`kn-nxADAj-QjyZwq7Wai0;ptOKrn@dc-E5(h)~9|%vLYh!XWEfQy@;O}>j z>W&z-uNmHz|5mfTYZnvF+~9uy`Ti%S8?6Y$IQ#-d+}()WBM3Vsc=Bwn^@a&2=OJuH z5&W({+&yyNefIn-w( z-`uSCsxYhmv||VqM3&_0k1QNl*yH&^m6|lR*%f^&v#^or(%_n9=g8oOgu1(aG4JKC zDK_s#zZ>5$+Re}IxCtbCAj1{|Jntu+#x(t_iC9ie-FUX^Ugt_?y~;#gs!41eNHf76 z=?MruKa85q%BP4&-ry1Jq9AZ#rpc~AS^rYGC1zox1A-%-{`$n%Brlb+(vp^z@pVPF zV~b#|t;;NP)Jwp=)?&JOF4V*EuRxqL8wFR_%`AoITLWB$IoOJyyCSHx#5YC&0?wUfuo)G*b6n|9A znRGr~Kv+6ooa1IZmpyopxA6`+ImdT77Br3;2|p7)iahj({qpdz8m4XE&bd6iTZXIa z9eePay*rB8oN~{qdJNrF9k0fHCS6F&OwFbyH-FeEu&fvF=8*Ai z2l zcuRs5*9D?1+S&ND1Pbe=-4DtF_<24M(tQuIW_IDl$T9-YBJ@fl^f1+!?2o)rQL!P<6(@k$a`5) zVCOcDdznZV=l;zmT}GWcT`ss>!I?5SqHeX3A!^MRtxk`Ms&W-rmZb7+*6R=1V0Z z5{b(mMlxPCMW-!%xswOn%mh1xuA+oVTPbPMHtI5IJ6*lNRh~(Knpe(^CS4=fqb0{k z=CXIG8-{nwb$u1?GJi3FyL8$iNOYTYE%k7YDpx!ce~LfTsn?|Ia4!Rsu4F?K@0Ic5 zWL$w8D@qY#+n3KzW|fqq)Ac4-!5d7vkrE3S%`q^*)z739^_w(6ttQ?ho9{H~Cc0Ut zT_z3UKAncd&fSvq%EkyTw@4+;yS~G)?2(J1C*x{psBRfR)qj;+B;Dp@T!o3m!d{d1 z(XA%!r_8@*yqQr>ysPAAP!E}Bz3`RsGcBH^NXhq|^BmvgdQO~R-JY{K)M(bkkZ zJS;gnSnZg7`8?;Nob7oI=Q?Y4-#!i++n0Oa$i5=1tF1+4yXRE7$`oOl=lDH&KkHBI zay&P8Shl&OEq_&;Cg(1zQr&bwoJr`cSMutX+Un`$3B?xf;>`KB2GeB^b~8n462C!RPB|sQH;}(Cu^wW5Y>LC6idL@_ybHA&&e}`w+jb@|@cD zWc`tvYQFBJV5!3Uq6bDzwcX7Zgmtx~bB>*_KCE^o<@$#+{L=9!#@LSWm{jFR*ezs- zvs@n7vVZz%yZmIEbApJZksHqGp?i+!Ssmt|q%+P3U|V9!){%m9P^?m=VM%g(wN!^` zyUesOuH7SiEej536RWMxCxV`xNfQ^&S+AxK=FvuMZ-6&e-yt09fxH^b4eOco5p-Tz zv<2Psle6hREQpmsxuC7D{^Po8ta_WDV-A_k2Y(GD)sgQg$BM6VNMn-t(R($;dU&gc>(rTz?YU?>;{*Bnk=LxxQg%LL7c$-DG5fBG zpMQF{Z<+amt!1t-RXnz1!k4`_4{|QLiJI^ZQK4G@_lAYoo27J&f1>MA9fEp zl_Qkzey^S85S-BHpelLpp(5ATqqPUF2$f&6*Yh!Qj@Me|Jo{CfBPedI!@mFQ6|(XXnEjMBxDl!hevjI_??rIj36ws8TJz%vAfTN_%%@y+J-O z`L+KiJX*#rKmE}ZJpuX*CvrEwdvtYAu>!Y>HZoXP1_o!cyL2St1w;o`SV6)N}&pm49%4 zD7c}73ldsLE8)U~ehSO?#ZF+wafCL60#jHS(x1QBrp2jY*`f@IfqTm%;6%N2?mV(%4j90lyD%bph^o*ro9B`;hEEg(DVW#8unH_(XQdP zXR)fGgU|M!nX|RBAAcl`tvH5$!Jo13=e-W9h#LkTR+-I^FVBj{_Eh5Ls;D(mLUw-S zw9ZD3btmJ^A#;e8Nqpv*OrH74tOrc-z~Zuj>*s*~KF+h{?JiR00ZXk>(UBM8R{V%L zGVjNI6`7UnFp*l!nT-(|E8&$T6y{4bkX7Nm2anRSp!^a49y(fob%+j-Lup3v8@%4d znjdHWZz}pdMSrO1PZj;0qW`Mse=7QnqW`Dp^ZyS}O9KQ7000OG01`WSw+|Tup$ZNX zJ9$#GhZhpq4*&p~A(t@>10k2+BLgW0Fp`b2A*7cMBm*daX$8bR(mk49yV;|Ab-Uf| z9^IpRb zli^$do`>@iyy1sOU{r>$%kT{zep7~TasQ?a-{$_;WcYO%enW=e6= zDe!&x0Wbc4P=?>){-fmuS71K;h$nx*%^xbT2>wWdKUSav z{)C$!^U9xc^Am3VOoE@v@aH`I3k7}#f2lwa{)!p@S|Q1QBf-xVXk>|h3x6lU-z%^R za@_m_H@{%oKT7aV3ao*Dmf&Ax_}2goz%M2EHwpfKU4s9R;6G*fF9lwJ|7M}@aPzJV z7i737!zG@*C&Oh0#t>vg8C?>(W%MwC&g?+1j6NA98D$y$GAc3#WK?A=ld)XJ3TCOK z6R|1)FQdjywS+SQa1d)`oGIfh=9tZmPWQn%+|1=>o`lya5X0*woUcG1U&@CIxLHV3 zyn$$c@FN*-slFaWv<(JvQEPF5^g~7#}cWmwK*0y z5wy0$#(>cfHxki?PAeTtM4J)ROrIGytz^P~<|)r4v+0Q0Mm$*~$_ti}j+)l^f;VGE zTYC_&m88?S-%MC$8ewr;B-!84Zw#i=$!OZ>&omT>4W0QB9axhx(grc4dYx6niX{^y zZ!dzBGA!bvnQrTvwPNvxv>7!A8@AgdlAxH0p6z)?UrQ_zv(_TGYnR=L;MtJuAtl{^ z=`7I}))q-=H&V^Ziso&xj77rAIxQp8N5ox5cifb4qlBC2Vx6&Q!mzSwlC^J=l$NPx zoVv1h%2_40t)=s&v>C~!Gjz@^wNorO*dK4$6gSyQ&C?Q>-6`Q_vdpHzh?!!0W=Jx* zZI?M{Av8`ed0EN0h$P81u|&oevEV9yBFK4xwAr5=FgNrVmT~nB#o9M@L3Ae!FcS@A(EMo zZxtTrbt#jMa4@UzgqT`U%bq^zPzUWqkRo)Acrr?{PzYERj>EGQTtj9?#jSXMJHncl zee3G?8udq3)UP=Zs@=CgbHG_R5V~dG4ficQu6265g%iL3@{>VmC%qcoAMgm@OO|OE$1Swq-4XF>8Ma6V+^w4i%83P!=NBiL}gg+cF~jcL$PQ!Er76S!(4Gf!n7Lh z*xA}SMCmwKM8!rGlWg)7-lJj~NjJ|S5xO#Gpf!}DVPLTS-c)~F5CJx5^xYi8}WKu zEl+RSB&T_-WRj>VclBi8jJQoro4V-5&~8|fUIsmXw{Yr`+P2B(O(=cN5`}?z zPu7T2KGl@kvA4uYh1ZBg*H4LPudkh2RhLcks995j|5{eKkk*tsi`J_$rnM!Cq-ld8RplP-jja_5E9Uq4oc-r z%7~ERX4IB{e2+*D7hxKWwr9KJu?RmydDc0UvCMv+-TuF{Vrl!a>`hLwqIAzImLSlN z^fGi?4IAvfIbW|z&nt)=ch)i~N445gkNV6+rs~?sJS<%;<|^@; zD1xp#XqWXX115jnO8UE_c{*i+SXC-RfApxgpUMa=SNjl} z-YS8-QPU=2{i3TNyc3I8_z-el9wHE@sTEf;-+ChS*{HZtd~Zqp`D(YaSQ=wcC)G20 zbDJgVk5eL>#oLh`=Vb&Cpfeq_myDn0=oHTOXR_THCjw^HwqC&<8T)Hg!eM@zyiE2R z=ZYl;l6`-s!)$wbvk{?O7?SW63ahqcvM)=o0kt)ep!agzAmkv|KT~{DM~3|h+F~Sn z;$~)%y>WWLpRkd0s091I>7Ndchz&+O-bv}*EFrzo7GINY^vyOsA1s7N;86hZgTkM- zG*b9eR`gFe{gX~lPeRet$DruxdsX!GjVbyQqL+Wc#UI#!@I{(cQIFJngJ%I>2M|Y{ zg6D{d$nG1!2ju|x_9(cz&VsuwsCmwV*9C8a?+i#mP0r8SgPMPwq6D?T_)HCIW#hB* zpjMHebp*A_{5b3hYE^}aSNFaJiu(*`!!TR-YSlTIaSRlXSde&Kt2qZV&%i8gw&?W{ z(2jpY^(f5gsviMW_nd{fXJFnaTt|vuANJ|KQJCMw%L{U_Q1^|1l!F_>l1|-?VR;l5 zb?I^r7IU+N7ngEVdlr_3{kord6kQpGV3!tRLR}8(&%*K?H0ZLfoP!mk(AZUX7Mj8V zUGbiSm7}nV4!$X@>Z&IPt94cP>wz5H%*}uMhCwHSJyOGEL@dieSXaNrQbs@#a;8d< zu0cXbYdH_MxM24%%nAEK+Io8y(tSDD;EZ1b8S8K>?u0eCi$37@Q*Y6C#}m{)MQ{ES zum+yPGnj+5PJgS@-{$n|C~Ce$fkBVHF}NRm5lgQf@=&yzxpErC2vUd7iPjR<%|oyObPZPykzH%=NCks zLHTnr6wJZK9Bk4y(_o2+;ip5|`?W1OXbovwDG1NO?PA|vEDFG+tzx<(Ia zmIG5KLmlEK%1!Ta7Sfg9C+7!#PR;$Csp2Y>ivjyG@Dm<6x1od*xAB~WGRjKT&I)I- z(svS0>*|{j%faDr*(mgp!kn`iA4xjR?j`9t7$gAsF=6U4 z*dn$^czd~Ct__XAkvHH2035cg%?`bs?Xts`K-4bJ!86QrA3#CWBO`w>kGVc5WZa*F z4}~lA3foJSdZpu~7>|UPI>J@s$7;GZ=~yiv-{Mx)dbM8V#EGU?UqzR($B(KweEDY- zU)>a691d?mjgZ#O(p256t1Lrh%ru8#71KnxGMOp~k2$LasO}(k9~A(?;SlHDhljyE zeCZpnixeS@grCBki*SG2MTou!0RbT|UxJkq9J~Z82y5PhjS{$MFh<2*72wlha}kRe zyYegcALZaB2omu!EEGW0hnFCQ7eKlI-gltdRecFuv_xV%F2dH!Ft;Fa43dm~S3iPs zn}l70`9d#0pE7w9b1c08vI|a&SB0Bu#9FEk;y19!g;+14(DJ&xLad{s&dhoT5j^bU2abc+b9#8}ZTIQI$z|Yvj~&RzuHfTd zhY{zvSHQzC2@ii1o>3+2&|MO4VJrRI4%{wu#`QMr!omZz+$2zF| zeEb-e=V8mkH{v>DXEf!AbE}{8$hj6_dcmIG)+I7%SmuA{*5R<9#PTD{kqb{z_le#1 zc!0WxRx8wga&&@Y7n!h(wn(KWV>5#s66Of#zZ%Qv|NoZJ|4)_~54yWR8-wK_5q_Y+ zuCErM+GS3LEP|F8Q7*zz^}FDAU7+7P9H~nRjMK0Y41I0Frw#w}(#OIP`_smSFNrT9 z#4qD%d=Yf4qj@>4*VEc^(XRL(P)h>@3IG5I2mlg0dAHg#1Bwa*6FYggXFdb=4iOVO zc~W%=;A&+Q008zY001(RQ3W2Cj7e|daV)%8E;&GPQdyljsIcp}OYHB1-+D5wLd z5TT}qAcAae9g@dnWHJ+HUNE>}Ew#HXYDH+R7MFCft$-btSeLfqzEo}NzSP!TyVzER zB=bAxzBiLem_+P9KR$5xv)psfIp6b!NBZ{O0|3V>WBl+Ce4xUIeo){80e=s`e{=8; z75?di2jO1=J`(V69{xwbf4Toyz$e^)Dqz0~2mDaZ)IEOCp_eCp++_VQ3PDBWUJ>XL z==MW3dIWj}swxVBKHl^DF@TyMj=&P$FIBNjU^xw;S73!eUEl~mc(GDomB5jFW|Y9u z0u6zO2^=HvaDii0JVM}+0>=p)e=l%?z=1UID?y+w1>y5c!D1m3{VcBz8@H~O_0#6kp4;0Ulw?!ieK@=e`a=oYTT&eSN*UR=L)=vwfGu0Ul;fdmiA47-xBz3KKC7- zUoG&v+<#BtCLKJuTBpOL!*v3`FYtPSn+4t=aErjLD*nI^+xZc;;}5yHk)>S3BWgC| z6)fjRe!K~97WiYHY~$t@zS^zi3^PR4ruPNZMFw#D2(!nB2mROPIwY0f3vN~?6_zM+(sp78? z&K^WuM1C=i28$R%ZC}c4?ntH0>758uYZ{xAZFOyt&h}I?nu@fg>pI)wb@St9o0+g? z4c2+mG8OMcSoFE5W)FLq)F#_$^j7uBgheZ?R^9LdirBL0fAdik*J;JV#wL2h0altu z>iFWx=7?o3Os)M)K?j?B(y-?TT%Bd9G(F9Xv>;47q$>>!3$-; zHER$=E`&9Bf0WnNbgG%-RfEUm)QVd6^l>?*7l_1@QG_FkX}DzWig_Kec#D}r7*p&( zy-iN~<4z6l!e48c!Ce~e#ytp!7o#{e+1$amW|F<6z&bOPjwLC!UDKva*RUJ!=DW1T z6J)oeI#P*nGLnv^!!pl=t>&=2X1K-S5+)*qk;Md^f6+k3FcZzm7B&+82JcbvUJdWV z`&sne8vYi4H^i-+hoR)NM&?1$Lf5p`x6@GV3^|4_v!5jtcaouozsCn?*-nx9Wui`| zV$oP45+{-HKD}ovIU-xsm0laCd_|6Brf5543v;)oOk(f0lF2x~7j>Z+Id1h}O`DSm zG9J;Uf9uH8(^e#5kLKknTmo$?&n{?J8jCe=~HIr zd`$Y`GPBuArZn7#4QH$&ixwx8J{B+r{=avX2YWSoy}&uB`-WWnTkr*=}0I0 zdcoEdCg_x#?GZ{?WaKksPo`cIi*}?Ue6E0CjFgZtt-7<$Y*?~BVMRLgyBa=^_md?$ ze+bw#e1SX=Uu1Ln$ViEFoRT1dl1S15$qP$3CAVo$nIvx=J6+n0%9z2IkWBpwzN+DC z_<)A5<6kIR=;@h*XAL_UVY1{JVqwIVU8j6rGHIo0xqYE&wI*BAWnO$k;9oWT8@@@B zBJE`8b^KVa^=4YbxA1KZUW3;)dmsInQbN+DT>?Cio9i6mub`Sz>6rgPp ztGSi4o-aRR_%^9fjJ0kIzMgH z8+E*|A(UJ!5aU$`PTZHT^#L2{ra+rRq!JF_p>l$m(;IHsE z3V^75UOg5 zlp|DaRisU8e!?P0J=07lSVqA-s4LJlQRZ2kOQ zrs2GzfelcS!r5SKW z7hXS)+>*pkFR+k~$s&pi_$K+(UX$S1Gx+;=BrH_*Er>-&`oMW@_{lrY;OYfbVqDyI3#3#zd}50`fkk<(p%kbLg18_N7v z-mgd09Q;8^X?G$@f2W>DeAn8>%v0z!MJ&VSWN2C{L5%!v3AF^Fviz{@&mS+n-rP9V z7)GJY`eZy#7NG=ddv2YiQrI%Z62cG`v6A)};e9x}!kPrARwTv+mKGh5qK`dfcgqv8!==pjIO!)J zpPkpqh-E3WjVj0dQB@g1Rg*G`;;~;!EU_-R)^vo~VX`2?pB3v>#UKkcCX;JB2*b68 zM1l(Jc!W{|e<^-Lp{5QGyM8?_l4yyW>1vyBc(58k$i7|V_}RlFzr&(F5|1yT^f60S z4x?|=L(+}DtA{@afkIW~y3vfH|A0PY?{zQjp+kG2&VFc0b>;`4!e=cw}26guy@F;K}cz1#t)J1N# zFsS?bcl<#;&_C0HdP)DRG^m&5W=-8tPJAoEZo}OT`pVEQ7?FWW!@UF43{-_Zh9?6f z!`^NfwUU1T$6YWwtQsmW3Pb3Iepm*^(BN==tQ>U15i9j0nQB}H#_xg&8JO4&)hqR* zcEQnMf1lygkI`%Rq)(r;12h`#fYN<1lG+Rew?YYR)XE7TnJm>HwuUbQA<1V7^YI%# z!=GEJR zhr?u;S>aN{s~Z`Zthxzh{W7Otj!!6?dEe>Ja{6UXznmiH&j5G@lxN{1@T>5g3eT(H zm4C}s7^OmWuB`^h!tGEt{Gow=p9iQKf7=U{G{OBaAq#a-@ww<_+W@G-;w;6r{yz{C zsiYU5f|7;W|8E5X;4b9BJ1>lMa@&iP+g^f~?bPL}r`;-AUaYSSW?)qY&fcO-2 ztei`;tx9E3KaXeU(`-&q|564bO`$!o8iCW%9-!~{E%+gi2;V6TI2-9EQ>-D1f0o8JRl;kHNDH7t)sWL;+xip;%>K2O+7=e9o zzzFCabXU$$_H8L0*|&vPdF0%-f7B?|*O8u-Bg%+%D-HL;MSMBZdZ(1!$&x8;=5Z@SK@-O*{p*1-)QTP$OI;SuhEm&~orBJ)gPi>p z&JfEvMh@k$9C+;(pa%@x2WhS zq5dk@Y}XvuNjac$2lpvye=^`@945A3c@3{^L}e9^q!l-Cu0f4#C!gz(UT~%3?RqQ4k?oXUkr77$Kryp1179VkeupVX5xKqF zpmO9YTIgrN_}tIpYc>l_|GG`D+4TB19NEVWmhBs}5pgekGcP&=f8QD)TE9|~k~`|( zc19)ocN})dAH*)N$<;%1{O*v-9KKN*UYYL=Nji3;Yk1O44(YX|qRgIaIs5sm{99p) z+EO=k3BXV?x9@W19N21 zj3`1w(cw7%U>$f1h+T#B|bLYGT)kwX<&L!&K&)5g49+Stlql7S!SKa>U9G5N`j z8TgTel$)e;lyYaI+rGgV@UhK&)LWZa+wWKtWCbHR|jQHVcELZLyoqZAo*(2Qw9{1&00-pTkZ6D7YT zWkScR?&Xn#&%S;Lrtc9Of&&~{5`z5%!2$a#=2G6#_!Hz3d*@Of7bs5nPsjQ-x0Q50 zL?4nPe^;{QJ4oYb%_r-{FjA z=)Z7AwS@BaXuSSQXEaLxl`|^Q?{w}obMT$Kd8t?DZ)GEI{#JHkCgOAHEa&8~s$a`L zeMrvN%h49+SA|Wv+gxKfKUjEd5Y1ns3q}^ROkYE7zYENVK%Wy&>;*kgL*dc~>+-c` ze_%g^4#52BJ#aKFOv-}JpJUZS;^tfMw&TR>X~jeRif-6W4z#1Owwy3#=ki(`*6vzf z3_~XrU}$amIC-Ao^Vdw!m3^_c{3N-SflQ$vD}Aiec3Y)mNR4;kT}O>wq=ukA!M@vA zE5)%?DQ?x|obR#*j_1w`-3Oa(2;arNf4UE*x@LN-yllrCx4}fiQ$??|d!|~Y?uI>- zU#rw||4ra=-?7n)UD@ZmvbVVI$SZd|c=AD(h3T^JC`e43$*Po?CT7W2uEMNAmv|4} zw=aPdJ)jb^$Jl1MOE`hql)KF7lLyxydo$3j+yr%U=IUR|z};bwQ+)hJA<~kNf85N# zJ!Iq^F2=i12JYPk$AzkBpOfq`exd@`uGnCx?=Y$LKw8OSyz+YZ@YBin2L4^T@31PTBE2nYZZJ9)QQVFSem z0~0%Ww;*T(j28|QJ9$!e^(IAEGXMYzz5PuMe;ep zW;8~rQgIG{`&1gONMooyR+Yx7>~X4&SEUkqPEaL3Jp(G+L(fu`y+Y5RDos?SGF6&H zt;s6;13jmx(o|KN<^-p70=3Ik=|pOrq_RIz`(!5;Ayt~LN)=8BNHeIYbV@U&QxvI+ z8ndXFtw?iJX|59{O0yJco+6z}y{A#T+6j}TSp@5UbVWMD2`5T5)TkxEb&53K3DarK z0w>HcrhSKsg*3c~#_Fj!Q<2V6rNud{N;+GWmQdGHLUS3-Jx2$SR#G!e#VRTqXni9U z5yE7(Q(7afrDhWq=h0?MRcReHnpLSqm7>H`pL$mg((&NtN(V0O(?OP2>L}hw*fZ4qtW$bUdY*cJ zUQneMsqvBycABV2`xNOnPIz2;nTl5&(r=|#oziR4X^Ql^4yv?LmEKgPw^ZqERr(#F z{d*l8(z~kk2UU8{DgBY!PMY$uYiU+^5{C)ae)rIjdnJdal9tK8+}1zcBo zA+-k~U%6Z1gLB{rAENT1D)%^HIcgLi=471s{{b&j`EZqcsXD^RM{*zH$wxVVc`+ZY zLm{%Bk5&0Nm5(PNC3tpx0u_Fh2MC!`l?Q2?i7GGCVGy58jVV-=sC=r*r>Xn|m6xlW zEC)Y{wjr~@Lpr#51@+CKW~IVsI@vhX1U8PJLPZr7B{W8g&u61l^EuRcipyU~%|mD*k~*-(l2pzDNfTuTc1z z3O`Hbi=Av1KbwjrR4gSjm#O?5l`q#}7+;}7k#q}uAFDI*gHS(P1pj8i!KJzehWNU*$Ke{0Az(g(lrf7t4=Tewz;CX``(Ma3u=5Rb7i8JujoEKgnE^7{dN7s}s+89qnTE-YN zr{kJM^;HY&Pi3HIPD->jMc3eH?(A4Jo(M-1XN8;FBMjuZb#riT&YbyY&Z?QaU}1Ib zTm(^DRexGdy;(UGEApvTwF?+Hnxd`kiFr-UxKfL+i!?_Pv8d6^i^tmA8X`5gTYGp7 zcI3p{8s*y52j)r|~THP#bh zQCG3AB@#^_2V4f2_C!;2Sxr+sfr}lBn$|?aiS{-7i((?Cj`?q)mMyYsxRKI;WHiSRU`|^smPo-lhSd5Wa}IrW1+-`i^msS|+;@v!>{rNF2q1xU?o3Bax8XBJmDl03CU~ z*jb508;zQyu_+Or6^=(x%JOi+nn)ro$x2gn_8bI_C|cV@X2)7gNwilqMVk_p40y?e zvv8Z)u|{0O+uCvSQ6&QeYQoWCn=9zT!Fs}7;oS;<-@{;8$+r@`f$)#PE+^7g9c?l+ z_oR~Jfj!~qE`|3fe6PYESNP8n=G=~kNNb`A?F-67Lvth?ol8Qok-@kuJ7j@}tVg^S zW{OzOhPI|ey0h+Hf1e4mUQ=O(}<*Xlg_*XbrJw zBHR>>8#`u2k~B0*3f$au0ZAUhF|buy!s{YpE1TF=5YyTmZirO1pvG~ukQUbsSh(MM zgkqwB+vgfQN*P##wbtYUlN*_)DrZ%DQ*)z#5KC-1M9W~k1Nk10)Co!VW#`=4wKX&@ z`0hf=S2wLe%bYscW2{Q?8&~Bu#m|VwHbhfv@{Hq4tDY;xs`MPef)o|VI25URG>=FQ z*3uV}TG7xf6jx&(vX2-PrWL2Etu4Hf2-Von*%Npx46s2OdyBn|if`O_8h?U6iMR}Z zJWP!x*`s(|9nDRvS8HrHH59xP$*yRuTQn1E5=Qd__Nd18Q1J>45P!qSmDaUlO^2bV zYPD(AH1-brwZ{IyevM*4mTSc-!*ubDk+{a6l4Om&PlHH2x(!VY8h@Ja)7YPA)!*4? zWYWcntU%$MhJ*>@WOz6rap{nwWG*<1g?R84M8vWV_31Q5n%h z8dna3D`uPL940g1Ta62SEiL@ebHFLw>s7yZJg+HIv11Z`NF$*6)|h{aomQ;2mZXqe#2hYq$2jE#SD{6)zOqQ!(iyK{2Yxv z&h~1ohl>BQk2L-p{<6kj;lD+(fGUk51N#VM=rVO+~4DWRQUTE|A6n;qymEZ73qvxQMM}9xUtfyNqOv$Xw$xx zPEi$tUum6(;C%hsw%7);CmR0~{}2h8gnWv%tr5B(4|kL;syaL4%qG%*$__Co3=VQ( zfq3?lvy25rVykE*QFi9S>O~vT+;(J)7N-%ZZf=gO2{%`@t!bx&O-<6+PuRl>$3yuG z{}}yjgTLk}5Q|CNh(?Wn!avpcU-`30YdfMev9YO5;eXTk-$^VSh%-(zB?c94L^f-O z)XpNKN_SgPwh6Nh$4ldXpYwlc{0sh1yi2nJLX40KLiV(9w6Pht<^SUU*7%qFKWN+2 z_Up88d@Xtt8he#Jqw)XpuNZ*FUPHsf5AcH;Kg4@Aewe?g@guxXlK~}@{hNKM$_zzB zme5>`TSHC@tJGvJ%hYZb?FzJX zy@AFmz8>wc+=w)4vRzg*S;dWI2Wi6-vhx@$Nm+VF$`{k*95i^4Z`w5S^Mp}jAIiC! zoQGO2=c9PD{}3TAO)en4e_PfyxeyEft~^MS-Rv_>9!y7Pfg!tU*v2pAA%x&iP4*D1 zVRYtr3u7#%$wg#;O{H_NHeB`+)DfyYlGN!lRraa!C?s>-=nhRTmSja9t;u8LvBXJa zku;8){CBE6UX@GGk`T2U+7s)-WsQl(vN`p03|S{KCTOx>4k&Ud>aiSD0q< zC8$p;G`U$PbLY+5l$XPFKLVJBhMFa;~B*r!3NUhVpR?ix2J28 zM992BVf}t&2o` z=smBAH2REqba=MaW;F$~j0O#=3%BG+niojji?UZBX| z(d321%thivFub$xzx2BOm-dL}E={f{yK*M^0q(g0-eb zRbEQ)&{{2{E5%0p`X~S`BLomu1^J7%in7+V*qY|sw>{UXIrd+AKMFzV#OcMMipqU| zPtM$T_o$Ky%a&hw@r*#3f8T@q_U^y*&i$AEX#b^meg62RBv0pPl9NP9C5)HTj^}Ff z3bc=sBkl2IIJ)K)rpYViFcqsbX&4>+b9lwb4d{1D`M8+9$evMUq#;5OQPLO+h$hLZ zyoNf~3eg*jsAGvlU`fO{im_teD@t*HrKo9g6M~n|ljo>1o?%}9h!-#IOn03Stfy1L zAOUY#b=(Y}!WMC#bPRJ=sR3+x$GWsLqBgR4-6*OA|Dg`-k5hS3M*W`e6tPuUqx#aWtvype9% z59JH!Rv}f=*qf*`k}egh@`beHMVfpu??V`yHdTyTHhWH0ebq9gGpoliM_i|u@Ml#S z4To*hrsc~kRrykl{hk~^J3$BrkL7L{k(F2$3|4B=VAOMIkmSZ&(F~o_ckX569S)J) zs(iUBU!lpHN%Oqfz^0-xO}-L;SuJ@;u&z?&t5x~C7?-YYZpTf-)gn)$$=6UcMgCJL z-iqNZGO{tUI^5oDM*Mgqu175#N=V6@HkBc9*Q)Y$DE*r@Vf}hlzCn|3BPW=&ITUSkg_9=A@dg$_9J5D5Z*-C=c|D_o{mVvOuJN7xDgV^u<;i zejwVYn>G0da+Mmnq%G2D4AANSP?K*b$3mJ} zT)k72CQZ`?+O}=mwr$(C?Wd=0+qP}nnzrp}bGrM?|9)$ob=JAcsK~6$tc$9MjEdNs zn#FbuzIH;F&AZx963{w5^F{*tNgjnX)TBMmWa2v0-Mp72o){8ZYo&SAili`tmkZ0WT(m2U|s zy}DirTsjVQ6ptIS(?ApA-pDT6DZ;gl4M$TRRISc2_i${*5cxE~LOD4c7dNyUhjbNj zaMzBD`-Jy|FmZr2N3@cn1Vg`ZR6ep5+qrxR%|6C$#?U|JSe?DJXc0_<7}!PnIb3|-}9%*-bu z?#!sVrE=V&-wshaUFoeKNE&h!i7jN{6c$>b9ZBnik<2Q9?|x0Y=|V$ieySBC#jI=~ z)|2bSJu!A@>iOTF44FfY((9f5fZ;TJvUyW`E(1zGQEnQ7uUV<7)eUACL(w3D9FI%u@92Vg^(lj=ak-{F~C=i71 zam{rZC&!egtZPW#o{Mz?ctk~eJu0-?44xZ`G8mM9sA^~bgYlQx>X zA?A!lt8^jO_$4JuMpKXsK`V;~)n)lb4{EoeB{b`2Hpi=W-N=z;iJ8Y%puw3@V59s3 zFKk%Zx9|6Z38LnzO5T+s{GFLrRXC0#N*cJ>>!pfi$6<(G6i}?983E^BQ)?}+%C;@X z^M`d8fcBKFd0lL@(FC*M0%=A(_nwAv$kloIiPL{3hsMoTA+VfOI3T{6kXKOPV6SV& z{_ksmrAjA@ske+_>-da)fp8Vev`G9wbAjDL)o)UEa{Q4YB}9D+OAq17Qdy>H6TM(M zvhkJDWeCu?BummuWu_H~i*`d0XBvF5QXP^6Tw9P>n}^`AM%BI*tz$~$10Uh%AjhJA zYLzaV1v@91z}s7ByA^jYNfDK{6E)3IRet~6kL1K0n*Mcfx`s(LZ>|Z1(A3(~f%>cJ zj+N?CI*~ryonzo5j?3JXYu} zge(tpufl$@lHgK%ZyRa5_H@wdtYy7~LdVCmxcp1EAfIrk%$$hGWKxxGbeoC+z|A^q z2Opgjy!j0L%^RfXLmxoBk;F*BTe~3(3es~cv^BLyPK+jXCX>`*JLiQ-j`u2ON!GrI zrAcf#*?Yj@GjLX}wZAuDL1wS_9-)qhAE3Z3?*H2L!H9}y?RJWB+Dzh1nSZewI^^PR z@Io3rtW_zl$M;_kJ9Wa$#f-R^qnR0po1HRF#fF8=e0K=C&eSGX+dQ&`w$Uc{ z2G&}a3zmFWR6eL})Bx-5urbzm$M>i6ws6Duw=*fd9~~_mQO)y+>?l(MbiGof&u7{8 z?#{auDko4Sai1P%bz0*_Hpj-~8!J<*s*(yEOwV^9pO2EzK=}t*SiJQuIy`@ZsU`j? zD!JdmDl9E$6JIOF%ZQFWp5yEBG_l7;e>b=32ov5=;-uD-XtiofedaO55@h!H55dY7=&a32a++u>b)D^WO{+} zMRTmp)k-%KY$Keu0)UBXYj({(H1^UK=SJV;TeLhjd^HEyQ~JY)xKsK=k>%~2y2ig> z8~ctvIzPUs)6a4`P;I7_u3*BE`5;#fSp>cT%#~H5GXw(|c%f}zTKmT=`K3RiZqTi{< zEYl7C+r_(sbG;U>Rm;;auu>In)_*I_ZbyLY0*Z{g3Jo(JZpbJDzsc`m>eRu^wO#M4 z8XP6*jp4!{B|rjA>iH`^y*j{O&1U_;nGcpBJ~%A8Jy5?4aIjcuTs|&coqKx8+{0H6 zduQpy83S+a;0_zJG=6c^T}YO4H7P$7k`Q)8AU|_AeZuWa+%Qsn6Q*Ly*MUCvCp1#_ zscDCaI;9WhEHT9nmVqsKvl7?-fh920d_8?!z zoQ{!yTY~ijY{66B1SLEFaexYa=rT&6MAWng|D7C;w+FkNzQ68J0d?{x6kBV43qG~m zh=N^4{5i#;;^COmSfg|L#zzkxy+c3GPf-}f!V%O^D8C!>RJwtyAm2tqglAS@w)oFB z>>PO>$hHfonrZzmc=_u9Hjs1$HKQA*%$8A)zIa+= zy4Zaf#B&Z~L6uK-$g|7Xn3L`@?1LdAGlccIxy!gQfCF8&0g1{ji1L`lR;Oa%h@>Xn zTTjtrkh+7cAm6lLJF+}j67x1l-6xpR5|M2xfnp{(IV3`R54!VuUL|t{RJIhgl;Pe_ z&qwD2Ku%{~Txz`(kYOi~o;~k6dj|8^iL&;Uc$ztXa{8$E*g51^Cx-q7_I%F-cN6?M zSl6J4u2CAu`Wzg!0V~=V6i?!Z7p4qHs9~D4NTo@%KXWGPV+_?6KfnzmX9@FpWtspq@Nwy&Rb0OVFW>5Wz}F&ob@?Llm^9#E1wAPopA%w*BuXB`}O(uD3d=-GE41j3B;Wgt{bncwP)!K48k zAfnctfz43_i^*jcPYRtr5ldCuv2fI2C&p=a`AZfU$;NU|0B?zLnQ;$P)2Z=SpLRdX zPKQiC&(2$2fP9y8Z9wiK5ncTrIH%hnymW^%X3j3SzzVb)%@>6+QpFs4LWWXVRhpb zN4o{Y#H+H;oYPJ`xGfo}YnZ86m0t$sb{hsbUapl8xxedxVK@Q-W126HU>zc%(Svu^ z2gBi^qOOT-JNC3-y<+!BIkE6ns8Euf_c&F$BfYG9?ma8>%xos*`5!8gFclvp0Ov5Y zmQXeN4&^D+i<|Xc#Gy-M45N6I$-}7{6_Lxej@{uI*~xff4}KgW=yIU1u@RF2?06o7E8gkGB z=*hr1!sh^tjuH#vhA0N=X^?MX8i9TX8;M^X#A_1S_yFxiaTRu0HS7)u5c3CAceBq7 zGSuvEbPrjAF}GZpt1&oE5ulk7UNDkB1PRTr?b8;d&Us=6dsta04oq)3oYL5`6w~_# z+Nov@JPcOg705@GJ@-z|s6$gq9#cq4qOeD1yEi@|H{tV>NgM(wo_?QQ_!@YO~?ccnznwN}neGG|~2t2V>p!T0FQJiJ6ax zZKhA#M2dHjx41bTQV$&iR|b;q61$^fNbgBvK;64W+!vCeN{(Izc0+4|mre{$(Tk54 zt~utBHb2ZHMC7Oia~TogXPk#y3l?u4!6@v98_vSB2`9p`0Z^G$9@bpo{$f!WB*G#854YjdOo$c)#ZG3<^AM=?44%kZgs6dv4H zDUQry17 zS;F&QXTTLd;4}tk>3#X2@Bk?Z;8B>~?pXdiT+?%N8Uy5`V4wYViL+`gzO=(~1Q*70 z5p}8GE22z>6~AJh6eNQBnxITnoYOO$F=Y+4DjZ%0>8Tw+IxUDUwlI` zU)_WNqEDR*;{L3GF@5c0PHKB-av9;2-vyC=R0aLyryrvqPXkO}^Z+ml9_RS>=RNX+ zSEx~JB;B0ofnDSmjnOzy+lDt#mkz(^j5`C$ne%^!B3p3vLB^3fYtpFFGfHXnb<`pB z5Nzi3WYVA9y*a3I; z3Nq8f4IKUrVtcMHI;gZLOJhI;C4+B;@ApEFs8eW22)D72Wozlg(RkOseA2Vxz1K0&q$lEE^uV$2u(;*DM$gC|6w(=nw;D(R%3y3VMT38Z z`Dl1V&qG8>tHp0y(SO+&I-nAX*s7eP0R`sF{KGmLnq8QET0z-Atk6H3@IMMe>F#Lc z6Jf9MFt3D5yMP~;y9q^z`zi|Qi?Dh)SSEfh(6+WiNaS zNjY|!K?9yw#=pnK_(%d-QE)sRs#14Ei~dx+cUW<2Eu^K+2Vm;n$Iy!@!-ez;9~5`=w39Q&b{ zUxyyZLt}0%mXZ(2cFwQ)N4=6JS5pcr^BgRidAu$6u)pj&nvL#|k8ChGJsIUx_oWzP zRQEXuaqfvBjT2H>M5hx0{?y;-BtLju4{7}g8=;hH!Bzg0n|Pqyp$V{VtZvT)HH*A9 zCo=WU<$xH3eRjRASv=hdYM1mV3&dfpDvgQ{ULQ$(=1n6?ZpjJ8m=S17TfHmw>d$1lZRwh4s9P5<${z7HC6F^3Bmf6nSWgi6*59 zZL*olGML8RskM-ksX~}(*0O-8+%DP;npPHG{MCj)#BMdBYQ7alEz2lY!K4tsGJUk7 zg}*kz#)=nzMbX9n7pg!oNw&MTM)epS!ra{`@tbIW)@PB;1zq zW*PCBge3GSG3_Mud-FVA()$W7mFbjY|bha($CgJRA9a94kl%^6;nS~x|=u_xW z(bz3uJXyP{is~MqHJ^+%)-s99m2~r`{FyvUsbT)BX1Bzr*q6yHQs8lXYXOhlGm`6y z$!CGzVxjKh?M=Wq?|GIy1hb;}vcCOJEz!-FHEy1lF@0EJ>q_8y*6AwNa=e}szYoZN zu_DGDBGKnmfH&U#HE{hEc;XU5q7@)#ms_YW!Hp3iJsYH-{LZBdJ$s%^%1V4 zS4Pd@D)Wn6aSSI}!PzA&B$JABH<+ZbAVvGkV+2j{a2Iz>S(mR$lAyE*-cB&o*q4PN;&yXIW<&I=$wE8{^W^x`t{1h5~bym zxOd|Ao-`A_*gsr#tb;yVQP3^Sr3Pcy^EzOSLF14;-46e-c*Oz0i&MbLuR4;$PIYIR zBR}g|J=u!$2yXb&O4%v3X2zE$QMHJwoJfJ0d}Mwmf@4)`FIW0m;hS~n7m^dZN|pGl z&w#q+_`C~Fjuq-FuCUKN_^RU)%`|Z-$h*&;Pz}2w$M&Zd8HIV)6g50fVn_D(!6DC* z?4qYxFX#5RC`j9FBt*0 zw`r*UU0ejk?!9O8ApytcUEPGBvTE|Q+>b?zVLwVQ*>G+r9zRL32fmNAGzWyJ49BX@ zwG_RcE2&FexxDifMYTH(lvGmUWj1;SX?UI*e6iuGzHx*-9cv` zz7z|fzvGgr)8k0VUa}x>Gv>&xjH4TfxpekYTyGSlRllai4G~txtI@V}ofVn?CV3(9 z#>8BsUw35|PZcp6EG3U46XglDdc$m~l?^92kPxDN&>W2}F_Kn{&qXD&A-_B>-D)dd`wf_gjb;B(HN!UUVULtYO@=7T zBKX`>(J%fcEbD^VfF9z5>F?3Q5?1DKOvp8pIh?#WqWSe#ji&}I_`&Ds7-5JC`Y1F2 zoB1PJ_y~%;oml2t9Yy1l-%RMstb!&=uh4!$^|%Vqg^MR%SIWDeNTR8=!nh9niiSR* z>KTkm=y)5bdw1Wq_%V;r0YhjQnYPjn$`b|SRc&=2?K$B6woax)>U^D31d>mo)3=SU z6dq4p#C}r`BpGEb}u>w7_7DCZ_WSub|;m1&6KPKe1~! zQ#?!){9tgHyU0aYaD-e5s)rg9W_1n|VK?l&IkQETeUfH(hHwDq+=!xL*^(Q>3aLzU zlZZZOtWOr|m0iq=&lRE9Y^2FDzimj-lcM%#wR8RZUn|i5nn)$l+MrFq4Q{d*)$6QK z-DOhmDolD+Km|{m4XSON+g@9?t*BAz)Gmt~7=?F^Ycz%fzoVeaOe6v;)^L-?8VI`C zifvn>NII6=l-L9O{~Vb#ix1=wu>bDjOhJ9(T8=n*YS8%=hdWr-<*SA7PS8oZK749Q zpV21mN@V!fJtvR>GBwcNeLOWsQf{8pVf;WHTZM_C!1yoyJWA?IjUW&N8hq3|GK~!< zG#spylGJ^nN6c@1At}Tv(BL$yGgzeUAKU7NPxEwNa#bpz%m!AqwMorhxk>||_8mT} zZ~|~3ouo0d#As?xx@&m*2tp9pQJ=uTWmz8W3$`1F@(Q`XZA*?LHQn6MPRlc=uO)0~ zX^5u3UK5{AgCauA&JWyA5to$Lw&|f&@r?5 z@9jN{fVVx}`vf=>=CBdnqPU7hgov<3V=J!--}!;RLmJh%Jx%j|?0Lv-u_?cK0gYPZ z8DaL6d0v~)cI}5bv^BvRT$#|q@hrbg#o4C8MwbF)Lm}`^BwCzl5N=+hk)DCGUg9$U zHb)1i%bqo5@OT0c~=C=d7$+cI5#mur#g z^smVz(=82asG9Jwo5wz%Oq~N)e~|!IhF5i#BUdSeoyz@1ekM)Z2E>4GdY&H2*SpAU z=hgw0qnp+foI>rr$CBuk=!L?-G{>IDmrDLEzh9Q=ZnW;}6E{q3Xj&fzLZOU^Z*Q$;D6$Th=1A z=&dLaC?Iy45;={oL^*P98_72yXn49d#s~l&zqBZanhaq(FtY-w>}ROwNVkZE=wBur zbZO3v$z!R{4p6E06GZmWr@*q25t)&~GAm78oif;)Ho|;&vq|=H^0NYS^iMw~$RTXvbJkwffM)iK=m+H_47>8d6+?Mh>4?&9eYr zp!{{^q%-T*LFQA-R7ZWO8DvQBkZ_h`ayMlrMR3Aw*d46<8t{I8A}5yPC?3E_npDp< zFghfY*Qx#Ii6B5PoCLcKECVfUvmJ2qX1*6y153dTqL=A+6Iis$>6xGZNv63i%Sd~ zr$W5X&*<7StQYpIx#kR& zEA5GDP_?U4MwU3dkio<0yuYGOr^HrVV6KS5(`tZwV=QY0 zO2>Hh6NO3Tur8{54r9fXF zB#1VNxI-4w=TV!#r)w(g!1uK&@4!H`9D+bn0P;~hg6iB4nJJ0Ns&kCD7(MRnNya4w zA4%J%Oy#KeN`fwX?B&Z?>t{(t-3)H~LT3Ae#bpe01zj^aUAL!}r5S*A=~#=3Elzb) zS*p1LEo)gSe8>w{FAV|VWS+ngp5zZg1S8=c z7liIR1fP_2hg9hZFDi7lTw150t+50xsj@9-UV3&kP`K6^Y&J4c@3x_he`?+hy!ZJz z=kbHb0*D$WW8m>hY7XG``ua0eFu^Q%c?ALd9SW`~>E7^Z$cuPCm`V&gYv>%DRk0_Q zsS+AW&PM+FQbs<8Bb6W&`9@&K$J{|`TmG#8fn{}1mejzZZv>MifuoO<`i5u!VG>#O z9t5UrvTKBp4@29~$hxO5!x_mXfliU;0*iUMxct)=4mT*#E)ig^-xfq$V5mRQ=jaz( zY#glOO%hB4hp7Q)Dv_!7rIXkvGah-!8pr&E4e7v5*J_S<$#BB$SjJ~b+^wC#45t;) zfU4WBRjXU+p8fmdKw)F5M?25gJR_Hy{wQMu{Kwd9dIqO7p(6Q$ofZhZm^RK&_PIYPMaB zngeY1bb~R@lumwV^v45 zKScIf)@&{DgJ*GI3PrmLaS~XdHANA<-n7ieOu(HN4hArxmE3rGZQ@C`k<05$B}E#_ zg~A3IAO@OJZ0s3k=Oa1Mm%bDF)@V;`&bSqKf8gNJj*Pb(Tt}Pt+4~e4W3$?lFg$@l z_gJB*0%esm>=M5tQHyV(0_<<_g(DLiL;Qy2zUkRas7fUhiA_~pp6S%7SVKr5uuqSH zv0kxFx(ncPd+EJyyb*Ia9ipQ8Rmub$!~~rmUqHbhKaY7}?v>g{k7?F? z`ry0I>@x8yBK4_pTu22Sh#SDWL=zOf=#8>bkp0S_j_y|3>*kGPCw<&{F~|r(zAOnQ zGAHX(v-Y}lbdZ3yh1y>glxmuD@c3bX!gZKqz@oDF3m-Q^z~W+a4SZqpQm{j8Z-jU! zn17hqKKWX}ekV1p+?Jz6llza2z6q3CQ-G$EPNtj6Rh(NQC0UGHKczhCflYZeqRAlT zEXt*nN;9%aIi*^BgJB9*+`Eyg9^=GQ+&h@c5$#02=x-sFBj$;Q@-FdI_xJw~MOdjB z6bAIanjQT%P!n+E|KmsrUo%Ss0|5e>1_c75_y;_Mny$nH36st=1Pa!E-wlcZ0{U-M zJ4_$w8|Z%$_z-9SK*c)i16mq6QLm%t`M|L>}ORTCWje?UjK z#^6fO|E(-+3yui$U$u}~-nv-@G!T#$dir7lICi_IJNN|je?0?zr()*7KtMwv=}rX@ z80po#kjU+B0C2~Dfq;M0o(6)CLj5PzMS`P4{wIwkfD=Lgx2=mza6!cXbhMS=@L>N< z=z}@XQx6FQl#BR(OJSrd3P3`p*YZQ609rL8eOJcNeBQ1CC6UHI?4 z3J#_dIF|In30U>lzqDs9&iv_p^>y6s!S4NApGgbkaX^T2o3wyAWQ@ls$*qu53?QUL z&+0A*@hz0bLPJI*1|B06B_4u%9FKs?HC2?wI*}p`*^!E364jbS#!%7Q>m|8HS{+E- ze;8x~#N3Z}gg`TJO&ac!9n2Ev4C;2w=#p=b8}5#2|KpJS>hTvE2}U7MA=*Dc8uAhw zDn{8Ib^fEF6cmmQ_BZqOe*9CM4}dXr^cEO_DD$QSMK~tO^#YA-Db7b-K)307u4Gvs z5&zJ~&NpKR>@vcZxnpb>(Ej^% z(JwsJ2!zJ84ukM!Rb{+II5_eR%Xz&zyQ@2&=m1JGjEC}&?&LDNz6AH9dVNhb|yGYgvty?2M3~eDCci zEM#pu)ubOqhiIpgEw!=QP)m-_j;nQe!Lo%|8^JjBhSEoOMEh1117$#4j4KINL#H$+ zDL&?{ApRn5n`y7h(eC{VHfe@OF^thPgy3Ix#?*k7r!_*@0m0Oll{U84 z7LFYaU!q#vNdDH^*;;zuY)5v!$|VF0&=)??n_GMxf!T3s-6JJ_(-(Y4NRuo$OUOl3pIX-ZWv|FKJ*-dZS{7sj&=U=zRO& zL{fcz5C?;b>$kTyq<~06{cgtQQ!ndp_F5i$SCtge68#;e@Fj~JR1MP$wW)>PCNw5G zm#ert6b#JYLxAe(s35-)w@geyXF1lT8cV5xwmZI5dY@bI3ixZ8=TR3Ot%cR}blR@&fIPICID6yd0!;c!FZBk$G>Ob@c=ZD_s_f=2! zOAJmMVDx(fe8##ndTqBY^i$N;xl-y}GdDR#_bs-G!+`8z@n|_;mb^B5i!K|417^Bs zo8-XUpD!CPgiSi@Sadu+enW$&*&XjZmrWcy5z0uIsjK3))S@6}>isnG2O5BedWXge zPI<=y5CAO$jk)$QW|ERl)x>_F|7xe&&7OLZbD z-gHNC=(syNhaJbL}7aRRko-cV0I)-Dqsw-Kg`rnB=a*2i>|TA<)%Z zDIi(EK<15o*7m|gtX3)`_?%1)vzI@V=nFKAL=5zkgH6vH=M$Hsg}_=(h6O5Tv??0P zK?INUXi0e;)Gsel+Ryp!ifeDPuYaATSyzs?K z3Y}(^hu&Be5rbFTKQKJ=6<)E`wZiLsDge5(mKVBiMQ7AyHC3B zC#IQrU5p0YM$^>^0@p7-HJibdwDSrY=6rIv-TdInpA~yM2fgAMEMlfCXF<6~03iDp zyGd8%MwG1OojgamO|FAgoXZoC&|P;*fPxL)5KojvqTE!1mr zlBZ|e6%&f8J@=IdCGMnHIXO2aRrUeSL;mQ+68UL|aWKHq9Q4W97vgj34fDak?{cp7 z4fH!o(1c!L@vj66mrw@heryNsA0qodPkDdt^ZtDOf83jYenC1@EBO9@=00vBrac4< z2q+vn{caujKXZ@UuGj`12lk&|u-^rK{y#Tpx(_`6e>(eNa4_)yZpQtB`N6{k0(xcs ze|-hi^oj{^LP{iMXQ5CcV`gYJXb_T7VsA3gijlb~wH1VsMoDg$8vK-1$xNy5tUn!)&irVrLrFirGpy)*5rV;X=f_R}8a%oz|n(zy*uK6en%J#vB4?Y&Og zC{Z*yjE_=H_VUo6XoCGp%y~PaKVzFwzs<-@!hAUh+>>_3>~KiH#xyvq!bsuV9_Gu2 zx8gJroP5U<>C69yu|2+~U3L%<>6q%(JJN3L6%5&S2mL$lv_H4I)BZ&O-ynpj1fGFmS&iNwv&tCQd?TpnKp*L>WJ+LrHj~w?N@C;evSP zxp>z{Xn4VkLB)e|>@&;lHz)y{Ku{#YyCK>)?Oi9a!=vqTG6M7T_9<{JV6b$gY4AKi z0>~(syxfWyb5I`z3bQHg(4g0L3~7hXTCGlNlPD@VU);+}7BiUP)!hEAktr9}h5a>N z6y?nK#_AHvCK{({x3{Xgt!GPrqaYU-QuNDM(AT|$ZK<<-`K5I|hO7ihp%kM?V<>Yb zR4DFN5NONkE!?w2P^8(6SO*cn-I@XLE*67C$BpVjeL%H?4;Ste6sg3vWIUF90H$ws zzu_!y+8fJzv?z77Ip=~12263%gZQbG0 zkj?Rub$K2#C)VJLIay8H!Ea|%q=p(sL1AsuL@~w29GX$`bqW-nH7ev+Uk*BG(46Xo zWELPV+&ITb7I~O~eSN`HFP{at7jtc~l*-lk6j>Z&PyA&T)Rr~)Jyf16LrSMuS{p(! zh1@fuBui!I0S~{BRDvBJQ9sEJo?ulJ#3q}a@lK{sQU^_Vkxw-J_!P~QXk@RADwH7> zh+cdhlA!Hj?9c>f6l9_EGu(2Z!1=sBj^6x(aJNI9|2fYX@)x!aU{q9_&v(^pD_tKZi~M$&T^ZC>(hn~u?#!^32_iU0k>`O77SY^h z!F&{re`-$$fuy^6l+^J7k++%Jy^5HwqkKbp14o(eFhXm;uU?Sg4Cu zSjI0_kPW{TYuJ(m4kL|1b{gGw0&WQ{d(b4Y6NV0B?YI;S{ zvZLl%T4hI3HS7%l-@54$;1HPAVT(2~ zWV&>hi>M-1S)_)3OQJGrnFk9ZFE(33pj%^{`dQJi34ig5*AvB}aFk7)1nRvQ9oK>d z#YYkUy-E6cN|7ukF4#LjIxilj8_IQT0+j}-RwI&_!@dYdr>DMQ;?#c5=gm zs;$+lCR-j5EfHy8Zl+?Fcxb~i`&Q>9n^IaCU2BrZuuIp5tUf9gQa5{s8w`!|`SOpf zT16`_&-xHYA8gbE{~HFdCf3d%*C-lgp#Kz^z~IpY&V>^Z$lw9(^8S$8sKuu7Tb@%k z0i*h`d!`}N$n*mB3k}qoG8~e{T3?LIK&%tnC}#~oqSr$_#9U2-Tnj^iy7)oBD*US~ z3cF?#IrbS66e#WM z9k+(49@f}oq!QZ=E#?APQ~hz~b6rUCSL3ez15 z$p(Iane4^qa*#XlkYtn&_C?%F1x>Y8glb-dSSkc0J!%fG!u~NnJq&toa(exRj)C~( zAzp1oBz%NpBXLtS2w$an#0emGUA99mn_9m|{F>BvS9ew=PL*Z-kQn2t!dbWB5~vid zxT~(JYdpqtTx6;rT}f?uvZ(g6B4MXKx;+YTHF@}|5xz{Uc(63OH3Hw&p}ZZU#GiFF zvpVLMqox+gT2>XEy^-(O2%<>0X+L%pbD^Q%qrWX9o^Bq%oIJC(JquwKnp1_}Xa!L3 zf)k)r&Ydsv8RvE|D2en`kumaI;Yr?^!2qX<#)f&HLa$kBoO;k8Wt3ou9}QAdnREc~ z>K~_q>N77Ny9o8j_GEi^$z%RO{_}hE=Fq>(OYrj%{}2>yo%P$!)Vd`Z@m;r_hNYK# zYH2i=ZobRlhM18{TRB6ezAFUHb6M#`Rlp5V`U7vIC=#@bi%K9Pe4U2CZZ=-| zZ1e1KS>(2OtPGIG!i~S_JslRu-boE$&SsggXlGM>PBzdMxwU~GMfD!%(PotJ=nM1X&4?JQ=~`xJL7ykTuvzaLMX4T`tsb3T_LV?CDrvrT zVp9mpK)SxTkXwolrAtP26qmRCWun|mYetf#ArKmp_co?fgjiT}Izu~G{+bNHh~h-G zORsXQ$1&YYy-?W@;cZ{Y6G3rXBo97#qpG>^gi)p~>L#J14y+&e4ywl=>n$U?&$Q%1 zOZ`a9Gpex^ACu3;?b2zZm&n-UNqePl%;T69g^qhI7O+GC7V)b%ftf2a(j%p_UKPX=8lXKGYk!Hl8R)ZG9GCSXm)FVoQJ z%r8GTo&!yqOZodv(A$hJFkLylzj(39h34C{l*5ns-O-ro~GKzVt+|uo=_wteV=t;_sn)fwd^w7SZs_lAUKPC zhF;(i!m4im-QXT6=dWzho+?@}e?im|w}0do z&-3ff%@-8cdfaPfwvna5SpS(L7NAnChlh@#D5;m2%X8l z=J_mQ-lEaNGg<|-Dk~B4f?@QrgqO{9m)BSX3?|v`ZseolMs#c9bkD>O_TD(YlqDHO$WMfG9 zTKwk1*s}1?qc3$WWcrkB8={^^m8PU#x^4`Bmr744#>fCqvrXqNN&lDGhz{uHo(RBF z*8k=_h-v8IFMJc?;xfb5lo!U%e_zrmdI)*0O%Qai;#1ZgAgafy7NDAQP#2umdbaK8P*80hj!`0UK#D{tx_o-~%pNS<{sw(DbA=W zjF)0jO1v@yz&wk+!}%bJ*$4LJ28djKamE=7x2`!ModS|D6a-<|z?6!VTdMr~58VEB zXenS8K`S*A!tkVugXkuH(Wxbr;Z3~5G)W2b(UrrZ?GMrIlYndGxSpDTLmvyJ zQB9}>;f0uxx5%a}95d-vr7=uv>!caz)TL#)rfHO5Zeq=c*c(fTfz^E$Y}?ZNC3rShMwskP3MYwR+Eo@?wl|M&Fwo&E$GZJ*LbDrFVt zt&&1`!JNc+VYHw)q#FsMsvolVgaVo5#}s%;(4CnHTNK9!7iPXykUawN^V1=GiUKeW z4-1pW^`ihK(B}rAsQVNlX5=XG%nX_`RKHX$8irtm?msP`42$$0QT#2A{r?Q4$R`qI z!p?k&)OETI^rZgSnmpy}H9H@Ud{n^IX|3(0L%m+QR^8Qm4fXNs3sJ8+?Ev#3z(EYVE!O z%92?W5(11d{{Des@-@8zN;)+wsf?5R#u z<3D&1KA5eo2$|Q@m*j#^>X|1yKE4MS;hABjRfp%@z~Vgox{_~c6T5Lzw`UoaGI6qK zSSfSanUNb0E12^eJ;0+9Iqxy8379NciL zB(cR4VW?L&$Qm{@&cAd`$S8vFod8os2;^7@=#e|(erJ7%fZQNN_~G57JB%r2N+ZI9 zz5dR&TdJOCD!u%m_TTv7xIhHT)WPCpgD2G$T1o~AYk66HZKkM`ks8r$IJ+GE&cy(d zedS=8RHc~gB_bTPHq|nxx7cj-nQDksU`hJKF7See6{{PKz`$k49({WKX-|!0nIurl zM6{kGqPI?f<>J|a{_x#xY&dl73)c1vR?qmR58f`U6PyDh2ssN+X3#74pV!W?0|Z(h za?rV9CT{Fb8LN;RwYWF+1gT)?Npv{DZ+*-8!iq<{ES6CznNj$Rk(Qu4A+B zLOFgoV*alOQtOl@M?9Hgz7Z<&d)(+64z|Bt21v7Q{SER1&ktTV(KKiROVa^-H=6mV%qESmzqIH#0rigQGC z#;K{Ox#63C6AQMM3$-ichk@htBxG`^v1tdpkc6C&HsDgAiR6Ao)7${mf(pXINYQBK z@5K_`gTCi76*`S{C_2ihTDmIs468|Gs}pTlRc-=a7$7mr)b$?m?5la9RsZt!#LFfo z@4qMydI5ZU6IFs<7k?e}psN@TWY!5-4|Xip!^oFAd*$^6z7SiXPp!uO(36;}dyOw~KJ`u@GRT?*r( zY2nJ5+{p_+a=ctGk~>wG1om56vL zdV>>8iHB;sRyoG83RsY$>AFKWCrrF#LWP9qs-J}BF=C2S#_a_lt~O0t)vH|O$|B}? z78U+clH0pyrM?8H8+hhM7R1lkswH}zIo4Vmv%9?|-|f)o9n;XVwJ!rHLfPlNd5$8*9H(2F^VFsezev4oKz)AYlB_Tp z*2vxK$WonvuU(ABBh% z2jtJvbbh<80P?lIf58M$?!V6t-whYvkuuZ+wiVKzQNiMx$M?&jAdR%~5dmRnseo^^ zo&@-UzePWxFf}x0T``6a$C^>zbrAvb;2&o;kFkkMBT)ReHBcWp5c9TNhQm66KSHqB zfr6xmt^dk1ZP)^mox`JQc)6Bu?@V-eG^LjM?Td%*JuNHZ$R3NL?^ez4ZX5h>qMZF^ zQ_pPcV(R7VSOW}Gf&_DRe#;1%@N=xQ(F*yW0q=NGg9Grw1pP4_n)~L^j7eJw4$rl{ zAmRoB-e6}zOByW)KOSRt2pd1YJbqwy5df~8_sE=H;!kvsk)Qt$VQ(1~*V42NW5eJC zcXxMpcXxLQ8VCV`4HDcEY;bpX2?Pxg+&u&cA-E?5=Nm}wbKaci$G6vF(YxyE>gww1 znx5&stNSTVElxI|4IL@>fRPtK9bfsTaGjf42QsZgtnxd~7Rh_Ie-H6_+=O0O104U} zjvm?o)KfqGup9sn9|(9VL8HKb`_0`!h5v~9M5`f!rvjip=E-ytVV?B^Kta6%=h4E` zgIOejz!o$L_^{t~!L;zhzkiB;;YXOnN(cpYE(=~Kho=Q6Gs6>sti%x$-_#;V>Qldg z3ZkB*t~A_bf2|;E8+lIa)O<9j>uj=Io~u)#TUn%o0rPcw%wg`RJ>|%=>83p5GUw&7 zuPbe0+R$Ra9pI?_SN6|r-y?zT4?;O?*#f61RtLiO<#@y7F!#13}_9ukGX0gO5731wH*lZ2s?PSO5HBdzHkRP zwQAi(FkhI~{onYf;jxA@b-bW4mf6vBd=U$Oys&PFT1_=TMjwXW`;&$p)#XG|=yPdL zct<56%&cE(dPZrRL5NX@Q?up|T{b^BQN_=q-)-nNc-fr7RzOPYXp3qeU}265ciXuy zTfr>4)LzJ~a@`-e9}v?!)Vl9}_yq>$V4vg$hQRsBcbC}jSwQC$Z&N_$V4N60$0K+r z(UM}l(C^-ai9_ILG!Kl3OYX+yH-$0UKy*;GKPe0>>2M+{4;wR?6;`V?YP(Iy%g~{97@Nb32E7%JmwUd)oD5n0t!#91zUC%*+Gs$@@S)xJ=BGVm#G8 zquERj{O!?^pqD+!aK8{t>Af)wvmJwxd!hlqkW49CSuYWKPHPJOL5*I8I4jGCS;{{J60z0UVN*MyWjo$(=k6q0Tx4MxtI%~` zo1L8QsLyM7?Z0x-wqgg%Wyp$lfHWHlJC*%DPFfiI&;Z3r+KSnM24?DGv3TnmoNl$f zP&%lEr-|>CM>8KEEkTSHd!|`e-G@5F*L?Kd_yBw79Vg?NSqmktmla0yULM?yt~!bD z(~WI5mDT$Ocu<`oSq@f+2p4!-sz{~3EYB{zO|nv}HePG3YbvYKQi)p?cD=d2m|JOS zY<6;Ww0GWHoSa;Qt1Pv-+nZB4BwUla(^mt<6UbeSO_dV3qClQpXnavuhP&iQGy2IR zG%}1KDg&Ac7eM>97zg>7@@$BuN52qq#MBI4{LhcD7!@vR)W!?=@^HNzoV58DZz`qz z*w`PQX(vpR?Qm4R_at(ZB6m?RkOdQ<0KeMm8IfBW`UjCS@F_AZZN*Inlll=#Bb07=l?+ zihQU*!h$Ie=ewo-v9ZLbmt!PBYf4`-ALLt^>m$8GVb4I~F8lGTi7j!mOuc$zvNv>y zb78`qi)V%#7a{dfo_%-{OM6z3H@e17&pkgSwIC*RnQ2QCg^OqSCveJ}7tcomakR%i zzi}tBGKpAsUdH0S!K4sYj`+az4DFRdFM-aL)2Q;S16&l+(Z{L-YOCkO{`N_IzzL8& zOfs}?N)QQ#qZ<}ZvwCg~V?jJ`s7k#MrK4ZY0NdQ9@2RlRZAQU{`fQ`y3+R4(*g^UR zuE-=UU+QgX;b%?ntxn~$^7Sh}tsKs9H9Oc2)M6d*ga{cOPzBK%VWKFt@71Ci23ox4 zgdNzg#T|gH82&}SyB_Yq?L&L`Yy<@)Ef4F*A3am#kf*=O=s|=%wk9`b(@nd@zayyK zqugk!i4;ak7nA?f??a@tnZL>E(Q3QhVKyHV?r~X$knaU??_Rf!91LNX@wVOxQ;^E2 zi=27#uHfQIsH$!Y4e{PlcJ!3%wYmj;iOYDt4Dx=yD)-a|OzX47rMpvme`a$~Xr&Kg zxfpr@5<+* zHiUXJvQ5MUw~EJHY<0P#cC0tQX*$$@HO%wJXPoqvl&J5J%z1|+(kAz&?7ZS~j<8F1 z`*?f7;Z~4j{v3U05;`mO*1pCbw9WD(FfNS61+Itxpw;I5I%&y3!EQJ4$YqY9MQ&{$ z?dOldqDAarg#?vZx&`Jm`#sp>vH7 zICpvM16o;Yqpnj|Rku`v5A+ZC-|u^dpkY(dc+@LSS3ClQx}?HmYZbO{KpT`-^&lG5qvCJpkV8Gf&_aHeVFq=99iwl?|H0QYlFuNSFqBeHZ~wLe(aA3 z^IH`tuXL^@HP#XkjzXo)iqF-~d|&A!>Z4%~CQ{_cS$*7+h}rPf;H{*D+qi5-Q&RY5 zK=9fN@R=)+Avg890`i#lbI@2Qo7-D){F1Hk`a)&0;_+K@S5lvf@w_mp>>NMUvo~KdK4)&@kFZZ} z)^D7T`9X8>KCyE(Pr4@LGs%9uWvIG54;;J`x=4e)EIFrn{PI>L!J+eUb$C=Zv){GO zRPGYs?Ktp~!^511Ejb$Wlg>}c>4ej)7B4;nEqVxTTchD^`qnJB`iy)tgJ*OFvt3VU zfjwyWQ!{*C|9gL3d%0BQUB!jGv@;hO+7vW24v(g>QC1zFydp-1*m^(uX9JSM?!&Ae zwb!+k(*8_SD!Zw)e#zsNEV`5hwm%!MWo9djt&EatnVJ=5HH9 z8Yq37#yT5<4={i^P`-Jk>#>ipCE@O@YIqf{8~93Dhpc?;3q}EnUTJctIQG@@PIBt& ztPkoV?hLE=pSM=(z}RoE0S&u&)Q}&oSyBewK7ViH&uU>zfd6Tb3Kk71lNXKpwVbGe z&2HO;wILsrkN1IUO4_O>OWDeXE0#t@D|+Igr&(XKnV=Al66AMIGlU&B#5he<{y9;0 z4=z(#B1+)0lcsp~g>I2lN|e3tbK2lG)??*2^3VD|Wvgl@7Rw_&DDMDFD1_?+`1(?FqhH;gx->T$4 z#_+byJ>5~8P6xCcQHt}OuRUpfhP_`DIZNci)Xag-evQx z!pFWnF6<_!3i+Q-1s{tfT5*QH@4pk=jmPLQ!@i~I>0-QGpeGiUSHRv+t2r+zExwga zY2m$T!d*oAnJ(lFW?Vhd+ie(q!-jFLBWp#!bS85US^^JpzgM|uG2d?Ib<>n`ux%t5 zc@vJvF%_LB5X2_kN}YW3qAhea&z`)pkC!p7OQoqMEQ&k70m?{(d)c$COu;a&-l-^7 zj9x@BnpVs3<(EuiEbDEV9LHr9p|z^9j5?Ks=<{;nv?V$Qp#ovl?aW@{%r|pgRyzF6 zMA3abR~)ZE2<~nsX=F@-qkYU=BJ;P~_wVRRZf~vbSh+~iekeSAN_>>@@_zK}WphU= z>b?`p6$hcQ*6l*Hat#(I7tw}yfeClh_d&mBI;{6JXvLLL^B=g5`gS@w#a#Nx5-6Ic zKz{OPTimx41{r)c9pf^cqi2G6R~#c$2;2Si@#LTmS~1ltnJ*pssN34F9lmMDw|#Js z@3}Pd*6HjxJ1h4~+uG8(;vkx@nEy6Ne>Huw)-XI$b!N%aVYJn6>)kSa<+Zc2<5hM= z>c95Q*P(7nv*P^t{D$WqHugb%o9$dLFjm!cxN^;{j^HCRhvA8rZq^2laylU41 zG%qLU3c7{HnnI0AU@DV+Gf0{_dkfbQtCr)U!=H?5n=z5>gI2ZJtjKV=__HgEeq&4? zFTRl*yzA`77pX)QPJTPzkqF8J%$3SnKfM}DPTaJ-+4RL_XD0zTYtC4|8!l%)Fed)S zPs0aaTc#s`BkQO-Uf(}sG-_gtZ>E%Kr{#MCy7v5*dKhesk*f*Vz(2Za)9E8`E^N=x z9*kC9aWG8jfFTa5F}tuVWP4rStWeUuTWn96w77EgrEgPGi%ktagl4;!#KR=$IG@0u zV#e{S;tdkYg7!P)I91h!j5_^Z|GG@WL9HE^KXsRK3)u5te zb%7rh`2HAzVq96iOPs>M8fHA^Wy04SQ#MBw``+d0&-2c+SoY$8KG^%LPExBBT&gQc zhv#}6x@aj`=p*InT!h0pvm%`GQywBzKVG5lwNIH7&T6Rye^_G3VLcpD{Ds7TA3ex1 z{xRR=EShXecY4A~@@ACc8buIqdJq&iHY8+8+m~S*&i7uXDC1r1p?w$T(&}Uv6)}<^ zRWhMA9ORo(C3ls%ur(N~Ai;7Ay%8P{pVy);#=4xbjD*!1^;!lz08%DH1%=7cM`A`D zMICZGTfS01v=ra$dfP=5eOTz&C8Q~{B)vEA5_R6pVkW(soeQqh=}neCwk=4!i`?r+ zodGv|?*>{-bZfa8jF1r9>H!R;5UEgfvLu0(6MP23rnxZbPelH&PDpVhS_6r0!W=fn zL7NH;n+p8Z@&sxhProI(3B;8Y#?Y;MI}CdZ$N4jCy77xL*$Ah+-d#YREipqJvcnlo zQWMi2u|u7uyk}mj=>s)5cL;zkUb2q9+}Qrwb@hA`@O<-pdH{K5AbNV>=kv|}=bJRo zH;bNc+Cb~;QGKJ@nr5_7w& z3P>`ayyiZq0SjH78@LRRLH8~H@n8`yaW4&rCwelk6 zRKPDfSfNgn*^CWba_8N|G_n2)Rmj^9LonP%a&UvIN(_$C1xq-il{a&jM?Q}-cC4Ie zyha^pcduPruXptVExM{72%Y8cDHkm7Xo|#sP;uTd%?O(F9TrimW$C_Xu-$V8T)b|s z>YQv1^gEZN2~Cme^U``bh2`W6z2cNK5+pr&hZ!Yzy1o*>+1UYnB{&QdP>76DO9D)# zXs6SE%Tc7$G)3d4oXJ;omUvgbZ=OM?-x6|YSUI@!N)K`*Uk!1-UF@JYM0JP8Zzj#ht)M6DM%lak4c zndT{E`J;VioBCCJ>-%GOkN8s5l`O){NtCCUWz{)Hm9L4 zOnrk80?g8j*g#62Y-*l0@=bc~*TdGo%B_DnY!d1f6-&ek;w>2;Ia~zDHH^$#>hnU*P@@(L`tyOSNbMQ5)p=O4*!lGbzs8Q^mXc?6ArDJbNmYLQJ&# z$aJ0I{Id@X7J8p@7$~m6mxj{)>Wv`$ueOijiS;gd`hIU#zeRPdVZ2T}Ohs20H&e+o z2}_|mu(hKD9WPEW)_03VzCjnH(>N!#&JG4-J8Y5@l-7hfHc7`%=Ah2ERfW^;BG4$>)@qlm=q<9 z>2o&Npinw?bf#Puic(K2jx^EN!(Hnx;euPw=Sd{yna zNZ%dLwDGRn`+1;0PNMVcjh!Oc1IJs_m0&Y3W_^1pVf{3}f=+pxI*lLl*}<-~TGz-7 z?Y~%>vR&Kv4cP5PbVBCOvnawh8FA#g_7if7h-*M&VR;7{_sduZzN%F(-;^DiYN)JY z9o)oVycf9+B5tEF`yO$ZN`+9)9$?QU8N}9tqyBb)^E;0DFN=UumOi9oIbxB0YTXND zq!A?a+TLKP1@HCsl^T??r4g;DbBuc!#x~^AQPpB)39PcVc%-!q;9`8yRzNl#7sj&U<~}m?t7qYYK{EB zUWoyX=$bhpC?r|10-x(#rTIHcah^c#88%ZUhflpRlTf5BYad>(^Eh&zr$Fbky%?M< zkUG(7dc9je&qRYHdT}WchIr`w$llM8FH$EF<-gwMSCrDNNvY1`5&W7$yeo?NCc`t} z5Bb*X2tbxjqhE09x_{ZGOH15U&Bn@>u-(w1FRG2u+om`7xxztJaHr-V(_T2&9KEnR z;IKQOz`RQ#=x#npq|_X}xI19G8;xRbYX~efR1(`0Ptl6T*x7|%dRu9 zaFD7lTN%Zko~ZkZZ@#z)R7g8KEg`hzLuSGU7*2I?qGR=iD%m5-$9PWD;@kmrkK7 z%Q@gbRrdpsJ8Zt3SuRxf+n6p?)5Mu5S&tJtEhG?ovJ6@L_0MJ@!5BhxUPxf}{Fz`9 z8)VI_pRuF{+D6?kp*fyZQ$SSXm7_7Y;8mkB*WlHo$^8x$&$NE3o%?C4qQA{=PAIb` zh1&n;Rfy|>(meKoTk{S#(;%}~Sn^Pe!mC~a-HL1Rp8z3&$a|rF+7CTQYnGcc-y1?0 z85wImx{ZCpR6><=TXub$vdZVo7)XU;P`~Qt-Ag4bfD9-Gt^J^l?Lp@*wt&mB4}1*c3h+l{nHD_k(E%zrva&^(hoP_=eO5eTeoz#+qWf^#GQdB zHlxU9(xzq!hcD~>GYkV#oS1BcjGDKHJoB9JhMMmmp#Iv`()7^RWacD=g3<(w$id5i zph*#HjWID(ppg0l5!{R41j506E6o_AGH6(eZ6`u8T$x_ht#EdBtb*%!)(?xW-8)zA zJU3tA;OgvXRMGTnYbsdcevR+=!%~Zd#C_`Mt?l>r?-{P+;EOhNbg^;#n^ZM83npWV zbw%hLlwd?Xz!LjqQlJ|0B}#G&j^$MYDD*_2)v$XzI+wIFw+9bkjP=HGLrFpxWdX4@ z`;1NN3MZYdN9CoB)isUck11L`Et zP%SU%qaqY0wC36nWE7Six+nLL%n5{*z()lFh$%1nV7_Z!MFhG!o@9|5i60=ZyD7S0 zp1grqgExTH;Z?VR)d|oGIR+SD>F{dUVCe*yg_HzWrZHxeZH{SQH3r(j-3DIYNhxN} ztqY)LFRX`>D+l56Txz^EvGn>@1fslv7uJSj>tlimU|y$#31D2eg9%_=|FdZX>2`9U z8S-Up-~!-QxBD3G*0h@l=AL|A1=wr-br2{RxnqO#0yqXtJ;gMb!f=0(gGY_ zFdh;qc8B~6lM~AxAfhRyciFm4Fi|iVSycZ7sV5vkRQtptI3pMxuR{~ETO@}ds(GRj z91cgua*5wFi1f7EltXg~*HZz=q4$nmZ-Q((2{T_>_w2*vP+n^Hlpy}zYBD(?2nH#i zqy^_Nd4oQzH^AkvT)qyTz_|76*+vpoJ3)raVY`GOe%`5mB7@KF$AOcAEfK}1e&!a- zhFZU{K~C#Ofd=b3d&xkm(5tfo-Y(Zq|VUfxS@Ddy7MhCF|TdsbK}FPH{p z>mA8irk{^$)Wo98NK#ge;NELQk1JBzfdJY(7AypL( z%A`a~D}hItnE}XFk>1P}3V@L5p(E{C2ahmpCeC--8OcMs*!`Gex<(Duu<&>V^p$Q= zJ^GfUo@_V@xy&Ft>aaSlLZ7>#>{M?IQ1gUZGo_l_OIplBaXiJB+yQjWjYg-e2UKOOUoy${b)@qPgi%I&9+Xb z;p1pzQW7|R>6V|-)NLdxAl5IvE+m+mA*eCJZxO7LmL2X;+Vm<|v~R~b)F(eI1AVfZ zkUlFaH26@DaYtz}e`@K;&FWirDk9hwzJ}~AXdc9VrMUg;^yXEqIoF(1+zB*{X1Gcv8qe*63$vf?Mdfbk4k)V3Us2s^7|Rs;*IBPp z8X5A9?+jJdB@K|xTm^h7k%}P`7X!5_)_SXNhhM^WGt%)VV@YNtp6W8;C{lAFv_lSf z;t0$f7}}x9A`A00*Ev5df3}3_pknxZ$l~X^LohKG{PhBX9`V-urpE43IyD1^Mrhvs zNoY3`OzM^&!PcB1$eM+YY01yknv0c?E-`w#s?LwiftQ}{YsXZ>nR zgvHv>GHp(r1PSpYcWyeZZ$)(Pn6QzCcvvC%3k6n5dljVaQZt)BmB~lXSi^=LiBG4< z!~Z%t-n;d^y&(iCZmXTc3XX=J2kGSO5?1sHw?gSJDJT`Aom)WHp01Wj`*SA5742g+ zA}!eE|D2Avp0{qyfN2ca`&I@L1cj}E!amLf#*X40kDbq(PLdQ%&0nEkqH`dfX^eSE zof+I`j^}K%?cB=TQ=u4^$!)Vu)n?5(^;g*sI5cfi*vd&!V;HV1*4k@);*kv(c+oj- z_T9f#TRBS@u$UT;lvJk0E_}(95U`gvsg_(gGyVoU(r;$`Q`B=UYKCD@b))YaeNT?n z)wyJ4jlmW}0%K}I%!Ik!mIk8zw}te_!6WR#iDkUI3m%2xvfWs1i44>})>dGYWRENo z&hx~`vAX7?B<@dr>I_!&7B+jjHBR<^98%Go7L^ZuvW9^=S)eFm#gHNNWgx( zar|?%T8lf;#rds21~6MO^ZUm&_gvKsTI;Xh50zV1(3NO3_9yOwJl-%fNpm8TNEqdT zUNT0)$mlVK-A$-FQU`^^tmb~ec(;7q=N>XRHp04;l`Fat$#96vQTm=TvP!jXecC$u z2gdxSd|5SKy9_elT5HMYxol-~U-5ErqryazDNH7_B^fyq1IEax{8m4^q$1BDf))=!Nyu?Ter z<50@9<2X8k`BPqSxS5hVjy0}iqJ2DoEfl3Fg5cdF+`w2RH6Hhl_eADYXNS&vF(7&Ant~a3R^0BeVa_Gf78E+( zYUAikdBis45AP@6SVm4BFqIhdl!$t4%~qVCXs3&?vbwfmd&y-z;4Z(q7rOT);SAI; z`HqyQgSAv_T-1l_K>v#9g-Of)711p^KfS$&h{EiKd%o66YQs9yV zZ?so;xKUq8hEF4vT-qCRZ{N%r!ugTt>EQv(Q`_ zEw{xb#cEd#s2Iw?)2I(iXiBOKp$UF?H-74B)y+>*a%K7JJ&ztO+7RuY>~6OZc>F<{ z>s29$rMr(uD8;I9e>sKJNTOZ{i!hPW@zkBXYFtzXa_}P;6?*%0JLdzN&wk9#t9!fq zJ%+f=aT=X%&<1GkYVC6E)jfI#(;4UtvT5ETNCEaAIa0_v_|VQe_38EU&=0{Ca`e#M zya)jm5BvOP1~MEbD<5~k;JZt{s;-BPV}yGUYwWErA;@g|Ve6rwSK}8vo!r99$~loi z!w#ME?Ar18se`YM82;Ti++S+WH*cl9f<&+KP-M1W_jdO)=P2Rvw_tSuY!@D6JL;ji z>TyuL-!#^QSsNbEsT<#yH;7p=uo+#zzjCyHh0KU@?Pr$(=v*EFuJQxYnUzw&f^0@F5wZjR{;ZHIaY=1~c&B78nUeZVM~Vk$T#tMK z#y2`Ylp1pZaN`ig%|@vx9KKrCJG5vQkledb!px$Gli6f)gZr>znUSe_nen@M-!Z9y zu!pV@VV;U*t)Y?KWX0u&c?ZGgv%rvAQ&Ajelp){fJ8X)dHC|*7JQ! zp9qjbsU7|0?<<DTLUvBPgwRns5q=0VW%arX` zgIX$jIE?*n$tN;~yQvw?oOlA@pKxK-UDuZG76iI%%GM{}+NXO@*Cd&GOZQ}tSA|*( z1Vzb@GrNnoVrOPpNbHZveS(!~xj^GED%WS{trIb=lT%#IoP?2lLlw#dp%v}kmL>1& zjt*|sk`-O=`4oHtU!heBgd2A3&ZMP(7Uh~COthO5XdC7=@+Z&r6*bYf@(7~8xPTf7 zySb=H(YF3I^GcD`0yTBmS6b$kl&Ol{mJz}^hC`eJ|J7>yXSvhze%W7yEFz$Qu#lQm z+o6%>!#72^tR6)dieDyE&aTIy;rZ`oU6)_;g(uBLE=c<-WUa-yMcuIKdg&W& z=@c;!&Ry^kVrco!zs>K-k|-!7`F%2yMioxg}cW9sP$0`%aiE z6SgG@@J+^ta$?#W6JNyYMmHvr@nYe-qqlvnNHtxrKP}{lE|OrJQ=NK)xZnX7im<%* zF;0CA7rVQQ_PjA4#_);8gMSRcV3c^7rcJy$d;KD4bh{4*zE=IK%w;=%N~t^SeZXfe z)2Oak*x?cQqzw2ZFgkq=zIx{i@z+~{?&pDL<n|I!&E5bDJE7i_no)`U}^Nq;QnQM;=xl zVCY^VAQQ@jryg0|^wyuz;KbrN?@*r4D5-KshZy2VLjQ74PsI(3F|BxK$dt3lfWm$)l@s{>6dVxJLw zwpBCp%%;Zg>>1tqn^cwWo8whJhif9g}9Wy69no1p? zN6DID$C2YyT_FJ3l!~iW*!g%8z)N63(#vqOq-~w)puBHoR|9&tLo9hyn5o2ZN+onv z1pBpFwv%WduKDW=H8~8f^j>~*GGsCft_2mr?(svbpBCJHDI#wh_F*B3r14+Yf<9E1 z4)BA-GWJ)DLNNGh;!SFE=J3ylJeKYv5zv)-=>v{{Ydhn+ZG2slpp{gVh(8Z8r;jFyi zG^QrF^^N6;A{AySEsH;}Sn189#8K6;{E^s+otQfu+kB4@8`i`-($3p4^1{Z03F5{-CC)9k9^wSuFlM3z?09DqC3 zbs-hIxp5I_vP3vvOl7}5;XJLw{RKSX3h@!lW&@JHYMy7PC6Y<`51DwL zg;YRWIggeWCC{c|XlLQ%E7A*3tq~i%V)p7^&-|9K+u%ZN^G!Flxid86D%wUnnyWi}ZRBbd_PN!J6o@CvdT5z1IfUZ(DcD zg5EP`TW81LvQ08B@twS2VM^>%mOz9c_Hy2&YN(6Gj&7)n){bZBk-9xt(u=XtD6bv+ zy-}VB(rUrv2c*@K$vdP&ogL^!SML>5O)$?%M|+X zWc+vrkVm}aFUHwo^>E3R|9|=aSM;FC%~*o5S8{rh%QlTfjzPMTx@`&pkl4UxKq9o6 zVK#3PE!2~-Q7KOdXSr(91Zg$Pu5=_uigX4o!=|m6KmhbH%G%>|@63&~yPwGZ6QfabDlphT_f(oAVbm9wez=(L`sF$nLUlG5iEiXU{H?{Vwps z9feRaP z_6Y5eJA()cxt|Je*^Lhys2$NDz(!1P!{qBiw`bi%DAP&U3DJ1AbEl9W<|)*60L`et#{jh-u9K(t1iZ+{TOU0l?t&Ujd3OC zkyTm(Q7zpQ&K!g5`xJAn*BF;dW(mPmHxd_KZ75U=VsDXM&w1mW?(A4MZCDFl8OrWc z51bdCD$(3Ge%w~_YxroV^qKAyE)reInBf#FJ5G!SmA?gY0QEs@kIjm-Ptaw{%CCpa z=3`I1?BOrbYeT(W4WN?`%zk3X4;i5kBfSMYO#`-9Coe1E2Om-!ZDJa?U~8;ORR}_a zvl2?kDsHmk-b8k-^@04LKp+>p1AcvdM<*&T^P2~DTd~4tOkhCB%K5AK&2+4iS1RpE z&871Z0@HCmMI=Av69zwpi9Z!d|cKK9KYY4*xL&u!8mk z`YgSM?d2p+nS#n+c%{GboWxTfslmx2gV=&mu$fEb04j&h+V-3M{x1jQY{iVvx+w}8 z8NzXl8gU64ll!1j&>#`uIFlG4Q*t;Pz~G|pnc8YciHwA1qI)Z;Tj&s*leg?npVD87 z#kYg$FC?@^#IsfZmdCc(c{Eq+mjK^a#d=y%##dFpylvWMd>2|u(?0CK>T9QK&->Bn zvUC3CvlglAij`^3D>VaLLIeHm(2#~&$tdq0tSvU5{97AP{IH%dqgj1Btq=FwKh38!L@U;AI1F8W8T z^!a4UE=%_m>UnW@jaI+e$duRJB-eevaoedkc|$7kN_A5q_={e!2hAs|YZdEj&x^T^ z;)x#Sb<~f6Ah}KWlBohW$iwj*xJVt90Mhv>RV%c8sB_ZU5Qgb;Psv!FbTuWO=S7fHMHPuL;0G?YNG3z?=cZS-@c zu=ggLe^d0nilK?|ph?UTu$G-QX-VBy3xV$XpAlyMH*+QHN_V=H*y7={U+;%n{!?{QZv zdj`dJY`Hw&VbPd;k+I!y5hk@;jG|c-;eiN3G7_r}Bk;uP`|Em~ zzFXh9xgEH6`IfF4(h}E9h8;UB?hBt&j(LwHK$vQVz&Y%^@Exq@-PK(sS{dY-DOUWY z30v~q;~H~P8yvFQ{!KCS*gL0sr);j~oLEp3VtCR;LnwkAsTIzhQ;>;(=Rjq^b>kcF zA8t!AVph^~sRhcVXA$KEP9K4l1?4%hJ(f!x#W|!Tc7#7IM>%lul|*`d2@CB`^9n{d z1fudlnWBVRTN=EbjY*wocDXB8y*@O^>sc{94LttpMuL~T=~z65WXg=FE3Mom&k8}k zj3w&Ip*|(*dn`#>8YaN6X&Fi&n2n^f5k|2Gt2%w$BfN(LSk_6GB!{oo736wg}o&@PYC znKp@p;*UxpBUn>#igp6rHVFeK)7aYB&s2h>8p3h7rxz?d`VBn+!T_zsWT)^^ulj&A zvT(^^3WO%k95^nU09NLtD@uKab6b6y^SMc?^Qu~{?=9VlnsFlW-|N*i-l;x-*m2!3 zW8sw3HN2n64spxl6o?EVUh^yFs4M{pl{fGsj6RE7Go_(FSUFu{q`t5I4yA0gxwaw? zD${rwm`rKDyBuo~ng;X+)6uwy$j9M+_z!r77B`9_4N0))yw+XL%l>Fjm z;_;)9mp%p@`MVL#GfJ?me2H!=4yhD12k9X6^P766uz}lL3S6&s&u z<>UM$kYe%Lt=L~X&n;^<@V!`13HZujq7lK6yue;qk8eHVrr5#*TSi~Q*Z*23ap5Dx~?SgmzO6*K`vT$O7|717qO;`B5LcjLhb9stE-J zWd_#A0rEU%TL!QiBZ2uK8O!UeMbdk2g6=Z+T- zsPjaQ!vkvk%fI^{pB*2l_(b-{2dX_4Ch&nOPX#gpp!!pxlK>(=mH^25zdMDe!c(&} zgnt@>R3ievBm{Ck@gUNOz3?x#CQBSc^vB1lIb^?nj(N%TkDlay+rf0b8y>Ma{F zQ2D9wR5y+Ij}bw^k96jVIqSqqN;)qwmj3`(U)tfSxp z2gm|Z$RCkF#(je<2(pkE3X1tJBsa&Sc(5=zkmRX<#^gXE7$S)$VhTAB_la2ZNaR+3 zQslkHGw>DpAGyLVq2^4Gyx+wT=cWBi?v~aQ+EE7?tU~bzUAN6)eM15TH7ojGw6^XO zdRY${l8y7PPJ(MGAZ;glJn@MBbK93BrJSC9isiQ8!G4=8g(=I{& zg#J?KKK@BW*gNw7)5O%Hq?~t8l8~u@cu$gWdX-SZA+JsE3qwKi{w2vT>j}wD4Ma(N zmV*vP<@uvgBo#!CUhDt3nBX}oAnB8^mwpxtuCJhkp zsh-m#XL;vePBjgX^ocX^$RYXh4=1teC)WS*yvwD}?@^vXL7`Cm*EmH#|EURnMGGXO zcyhm~aGPz2lctJ8L9zeUeE>W(*bNBH@npm&>`HoW=zxMx;jM}eNCbP&|3}aP9gyIu(Gf2)i!=-< zC{ybHHhLonoydVeoOl8a0L#$>iGS}`E;LrV(P~5tjz<(IP*5e1xBxNSKUZN;;|s7j!=GsUjsY@WT>g&) zX7Dn@pJthdukgGfbr&FY1^%h|7#fx%p}`W-(1KteDj>>}iZAw>WXlmCAcz6}#+Ic# zVd=mXjDJQFRl`CW57He;qW^ZMJm(2Z0%p#G#{PFsFfl<4j$ZYLXUha6e`?bnl}}iN4m?163FZ`zZ zGXEK}7sV`Zw;{%Wh6GCfzZ#_e{2N-l3Qh8l-YF~)Ar?QLI4Q_5K=AHQXv`<>(<~je z8K9Gb#M23KC@Ai~q=68@8!SK)NF9Q|T=a230rtIbb0Oh-9~%k^66gQ93WKl-9&1TG z$yOaH)@MhCf{MZYFA7Ngh@t~KvI2>J2a7X67yuIzQt1Bc^HFSIXf_}@7?lGC?O(MU zTruoIAy(g|{4XBzYd!=o_$1Ys4Ck9V#JkNH|BEWsdg>h5o9$1y4XdU4)Cn1udWbvx zJ?SK$|Auxuz+n6zLxet5=&?fV#JxWS{-#F#k6Qgm zeHRYa;Dq#XpB+f~gnh;Vp~9#CrmAoNDWAFntT7kWLW6>`h0MUeWAAbKBa{~GSqbwy zia+5?$y3C4AX6s=5`g~3C$>G}nZU&DFi8KWPj5Ywrlhc-pjsLJ>k^{_kJTifgkwc? z@(e-@whl4a-+pYd{D>k2udcxSKaTdJLvmRX;tazOXZRcMvGW^$ybHmLasBy-t!E64 zZG+%xAg=!RfWZ9tZ9~7GFc|;ND;J^Lh$x6l20+I9Z#)1B7Fn^o z@n`GqsSxYT7KRj^)2(O0wkFbVtJj_MNG)jj= zfxrF0iW2rQ?1I;*U~&GHMa%<{70LMz3jj9a0TMqgu6!O@xFWwfmC=KE3GVa%jt>#&H+}^K!9QB#_uP_l@*jjOnED`}RDZAYI_tq4 z0zhK0Zv!kEIEU|#Le+c_mmX>Q&5CG-h`N4cL81v5ksrchZ~x6=hn%zmmgNUNeW?MP zJhHq${KG;3XY>DA)^Ks06Wl@ueC_`P(w9B|;IW^U5QvX4i|z;G1uPhyABY3fKKcmY ze(HzmS5YKRNI#??3qMHk`R6JOf|>X&rfUKg6XWKqp;AD}97=J)!=bMO($_oTtfV_n&`N0qU_ zx$y7+@H25B?GsBt9Kzz?_}WQ*@eL#cWc9=~N+`R_- zrWYh5b_6Ul{eT;=Q~~+%E=W}A0z_269U2Qd?m*G`_aLJ2?!ZPXNNpoXblM|`=(Wde zqSMa+^B363h`}NBgkJF&q8>P01c?BpuC(>hz<|gC7Ae4 glossaries; - private static ConcurrentHashMap openEngines; - private static ConcurrentHashMap useCount; - private static Map openTasks; - private static boolean firstRun = true; - - @Override - public void handle(HttpExchange exchange) throws IOException { - try { - String request; - URI uri = exchange.getRequestURI(); - try (InputStream is = exchange.getRequestBody()) { - request = TmsServer.readRequestBody(is); - } - JSONObject response = processRequest(uri.toString(), request); - byte[] bytes = response.toString().getBytes(StandardCharsets.UTF_8); - exchange.sendResponseHeaders(200, bytes.length); - exchange.getResponseHeaders().add("content-type", "application/json; charset=utf-8"); - try (ByteArrayInputStream stream = new ByteArrayInputStream(bytes)) { - try (OutputStream os = exchange.getResponseBody()) { - byte[] array = new byte[2048]; - int read; - while ((read = stream.read(array)) != -1) { - os.write(array, 0, read); - } - } - } - } catch (IOException e) { - logger.log(Level.ERROR, "Error processing glossary " + exchange.getRequestURI().toString(), e); - } - - } - - private JSONObject processRequest(String url, String request) { - if (TmsServer.isDebug()) { - logger.log(Level.INFO, url); - } - JSONObject response = new JSONObject(); - try { - if ("/glossaries/create".equals(url)) { - response = createGlossary(request); - } else if ("/glossaries/list".equals(url)) { - response = listGlossaries(); - } else if ("/glossaries/delete".equals(url)) { - response = deleteGlossary(request); - } else if ("/glossaries/export".equals(url)) { - response = exportGlossary(request); - } else if ("/glossaries/import".equals(url)) { - response = importGlossary(request); - } else if ("/glossaries/status".equals(url)) { - response = getProcessStatus(request); - } else if ("/glossaries/search".equals(url)) { - response = searchTerm(request); - } else if ("/glossaries/addTerm".equals(url)) { - response = addTerm(request); - } else { - response.put(Constants.REASON, "Unknown request"); - } - - if (!response.has(Constants.REASON)) { - response.put(Constants.STATUS, Constants.SUCCESS); - } else { - response.put(Constants.STATUS, Constants.ERROR); - } - } catch (Exception j) { - logger.log(Level.ERROR, j.getMessage(), j); - response.put(Constants.STATUS, Constants.ERROR); - response.put(Constants.REASON, j.getMessage()); - } - return response; - } - - private static JSONObject getProcessStatus(String request) { - JSONObject json = new JSONObject(request); - if (!json.has("process")) { - JSONObject error = new JSONObject(); - error.put(Constants.REASON, "Missing 'process' parameter"); - return error; - } - String process = json.getString("process"); - if (openTasks == null) { - openTasks = new ConcurrentHashMap<>(); - } - if (openTasks.containsKey(process)) { - return openTasks.get(process); - } - JSONObject error = new JSONObject(); - error.put(Constants.REASON, "No such process: " + process); - return error; - } - - private static JSONObject createGlossary(String request) throws IOException, SQLException { - JSONObject result = new JSONObject(); - JSONObject json = new JSONObject(request); - if (!json.has("id")) { - json.put("id", "" + System.currentTimeMillis()); - } - if (!json.has("creationDate")) { - json.put("creationDate", System.currentTimeMillis()); - } - Memory mem = new Memory(json); - InternalDatabase engine = new InternalDatabase(mem.getId(), getWorkFolder()); - engine.close(); - if (glossaries == null) { - loadGlossariesList(); - } - glossaries.put(mem.getId(), mem); - ServicesHandler.addClient(json.getString("client")); - ServicesHandler.addSubject(json.getString("subject")); - ServicesHandler.addProject(json.getString("project")); - saveGlossariesList(); - return result; - } - - private static void loadGlossariesList() throws IOException { - glossaries = new ConcurrentHashMap<>(); - File home = new File(getWorkFolder()); - File list = new File(home, "glossaries.json"); - if (!list.exists()) { - return; - } - StringBuffer buffer = new StringBuffer(); - try (FileReader input = new FileReader(list, StandardCharsets.UTF_8)) { - try (BufferedReader reader = new BufferedReader(input)) { - String line; - while ((line = reader.readLine()) != null) { - buffer.append(line); - } - } - } - JSONObject json = new JSONObject(buffer.toString()); - Set keys = json.keySet(); - Iterator it = keys.iterator(); - while (it.hasNext()) { - String key = it.next(); - JSONObject obj = json.getJSONObject(key); - glossaries.put(key, new Memory(obj)); - } - if (firstRun) { - firstRun = false; - new Thread(() -> { - try { - File[] filesList = home.listFiles(); - for (int i = 0; i < filesList.length; i++) { - if (filesList[i].isDirectory() && !glossaries.containsKey(filesList[i].getName())) { - TmsServer.deleteFolder(filesList[i].getAbsolutePath()); - } - } - } catch (IOException e) { - logger.log(Level.WARNING, "Error deleting folder", e); - } - }).start(); - } - } - - private static void saveGlossariesList() throws IOException { - JSONObject json = new JSONObject(); - Set keys = glossaries.keySet(); - Iterator it = keys.iterator(); - while (it.hasNext()) { - String key = it.next(); - Memory m = glossaries.get(key); - json.put(key, m.toJSON()); - } - File home = new File(getWorkFolder()); - File list = new File(home, "glossaries.json"); - try (FileOutputStream out = new FileOutputStream(list)) { - out.write(json.toString(2).getBytes(StandardCharsets.UTF_8)); - } - } - - private static JSONObject listGlossaries() throws IOException { - JSONObject result = new JSONObject(); - JSONArray array = new JSONArray(); - result.put("glossaries", array); - if (glossaries == null) { - loadGlossariesList(); - } - Vector vector = new Vector<>(); - vector.addAll(glossaries.values()); - Collections.sort(vector); - Iterator it = vector.iterator(); - while (it.hasNext()) { - Memory m = it.next(); - array.put(m.toJSON()); - } - return result; - } - - private static JSONObject deleteGlossary(String request) { - JSONObject result = new JSONObject(); - final JSONObject json = new JSONObject(request); - - if (json.has("glossaries")) { - final String process = "" + System.currentTimeMillis(); - result.put("process", process); - if (openTasks == null) { - openTasks = new ConcurrentHashMap<>(); - } - JSONObject obj = new JSONObject(); - obj.put(Constants.PROGRESS, Constants.PROCESSING); - openTasks.put(process, obj); - new Thread(() -> { - try { - JSONArray array = json.getJSONArray("glossaries"); - for (int i = 0; i < array.length(); i++) { - Memory mem = glossaries.get(array.getString(i)); - if (openEngines != null && openEngines.containsKey(mem.getId())) { - ITmEngine engine = openEngines.get(mem.getId()); - engine.close(); - openEngines.remove(mem.getId()); - useCount.remove(mem.getId()); - } - if (mem.getType().equals(Memory.LOCAL)) { - try { - File wfolder = new File(getWorkFolder(), mem.getId()); - TmsServer.deleteFolder(wfolder.getAbsolutePath()); - } catch (IOException ioe) { - logger.log(Level.WARNING, "Folder '" + mem.getId() + "' will be deleted on next start"); - } - } - glossaries.remove(mem.getId()); - } - saveGlossariesList(); - JSONObject completed = new JSONObject(); - completed.put(Constants.PROGRESS, Constants.COMPLETED); - openTasks.put(process, completed); - } catch (IOException | SQLException e) { - logger.log(Level.ERROR, e.getMessage(), e); - JSONObject error = new JSONObject(); - error.put(Constants.REASON, e.getMessage()); - openTasks.put(process, error); - } - }).start(); - } else { - result.put(Constants.REASON, "Missing 'glossaries' parameter"); - } - return result; - } - - private static JSONObject exportGlossary(String request) { - JSONObject result = new JSONObject(); - final JSONObject json = new JSONObject(request); - if (!json.has("glossary")) { - result.put(Constants.REASON, "Missing 'glossary' parameter"); - return result; - } - if (!json.has("file")) { - result.put(Constants.REASON, "Missing 'file' parameter"); - return result; - } - if (!json.has("srcLang")) { - json.put("srcLang", "*all*"); - } - final String process = "" + System.currentTimeMillis(); - if (openTasks == null) { - openTasks = new ConcurrentHashMap<>(); - } - JSONObject obj = new JSONObject(); - obj.put(Constants.PROGRESS, Constants.PROCESSING); - openTasks.put(process, obj); - new Thread(() -> { - try { - if (glossaries == null) { - loadGlossariesList(); - } - Memory mem = glossaries.get(json.getString("glossary")); - openGlossary(mem); - ITmEngine engine = openEngines.get(mem.getId()); - File tmx = new File(json.getString("file")); - Set langSet = Collections.synchronizedSortedSet(new TreeSet<>()); - if (json.has("languages")) { - JSONArray langs = json.getJSONArray("languages"); - for (int i = 0; i < langs.length(); i++) { - langSet.add(langs.getString(i)); - } - } else { - langSet = engine.getAllLanguages(); - } - engine.exportMemory(tmx.getAbsolutePath(), langSet, json.getString("srcLang")); - closeGlossary(mem.getId()); - JSONObject completed = new JSONObject(); - completed.put(Constants.PROGRESS, Constants.COMPLETED); - openTasks.put(process, completed); - } catch (IOException | JSONException | SAXException | ParserConfigurationException | SQLException e) { - logger.log(Level.ERROR, e.getMessage(), e); - JSONObject error = new JSONObject(); - error.put(Constants.REASON, e.getMessage()); - openTasks.put(process, error); - } - }).start(); - result.put("process", process); - return result; - } - - public static synchronized void openGlossary(String id) throws IOException, SQLException { - openGlossary(glossaries.get(id)); - } - - public static synchronized void openGlossary(Memory memory) throws IOException, SQLException { - if (glossaries == null) { - loadGlossariesList(); - } - if (openEngines == null) { - openEngines = new ConcurrentHashMap<>(); - useCount = new ConcurrentHashMap<>(); - } - if (openEngines.containsKey(memory.getId())) { - int count = useCount.get(memory.getId()) + 1; - useCount.put(memory.getId(), count); - return; - } - ITmEngine engine = memory.getType().equals(Memory.LOCAL) ? new InternalDatabase(memory.getId(), getWorkFolder()) - : new RemoteDatabase(memory.getServer(), memory.getUser(), memory.getPassword(), memory.getId()); - openEngines.put(memory.getId(), engine); - useCount.put(memory.getId(), 1); - } - - public static ITmEngine getEngine(String id) throws IOException { - if (glossaries == null) { - loadGlossariesList(); - } - if (openEngines == null) { - throw new IOException("No open glossaries"); - } - if (!openEngines.containsKey(id)) { - throw new IOException("Glossary is not open"); - } - return openEngines.get(id); - } - - public static synchronized void closeGlossary(String id) throws IOException, SQLException { - if (openEngines == null) { - throw new IOException("No glossaries open"); - } - if (!openEngines.containsKey(id)) { - throw new IOException("Glossary already closed"); - } - int count = useCount.get(id); - useCount.put(id, count - 1); - if (count == 1) { - openEngines.get(id).close(); - openEngines.remove(id); - useCount.remove(id); - } - } - - private JSONObject importGlossary(String request) { - JSONObject result = new JSONObject(); - JSONObject json = new JSONObject(request); - if (!json.has("glossary")) { - result.put(Constants.REASON, "Missing 'glossary' parameter"); - return result; - } - String id = json.getString("glossary"); - - if (!json.has("file")) { - result.put(Constants.REASON, "Missing 'file' parameter"); - return result; - } - File glossFile = new File(json.getString("file")); - if (!glossFile.exists()) { - result.put(Constants.REASON, "Glossary file does not exist"); - return result; - } - - final String process = "" + System.currentTimeMillis(); - if (openTasks == null) { - openTasks = new ConcurrentHashMap<>(); - } - JSONObject obj = new JSONObject(); - obj.put(Constants.PROGRESS, Constants.PROCESSING); - openTasks.put(process, obj); - new Thread(() -> { - try { - openGlossary(glossaries.get(id)); - File tempFile = null; - String tmxFile = glossFile.getAbsolutePath(); - if (isTBX(glossFile)) { - tempFile = File.createTempFile("gloss", ".tmx"); - Tbx2Tmx.convert(tmxFile, tempFile.getAbsolutePath()); - tmxFile = tempFile.getAbsolutePath(); - } - ITmEngine engine = openEngines.get(id); - String project = json.has("project") ? json.getString("project") : ""; - String client = json.has("client") ? json.getString("client") : ""; - String subject = json.has("subject") ? json.getString("subject") : ""; - try { - int imported = engine.storeTMX(tmxFile, project, client, subject); - logger.log(Level.INFO, "Imported " + imported); - JSONObject completed = new JSONObject(); - completed.put("imported", imported); - completed.put(Constants.PROGRESS, Constants.COMPLETED); - openTasks.put(process, completed); - } catch (Exception e) { - JSONObject error = new JSONObject(); - error.put(Constants.REASON, e.getMessage()); - openTasks.put(process, error); - logger.log(Level.ERROR, e.getMessage(), e); - } - closeGlossary(id); - if (tempFile != null) { - Files.delete(tempFile.toPath()); - } - } catch (IOException | SQLException | SAXException | ParserConfigurationException | URISyntaxException e) { - logger.log(Level.ERROR, e.getMessage(), e); - JSONObject error = new JSONObject(); - error.put(Constants.REASON, e.getMessage()); - openTasks.put(process, error); - } - }).start(); - result.put("process", process); - return result; - } - - public static JSONArray getGlossaries() throws IOException { - JSONArray result = new JSONArray(); - if (glossaries == null) { - loadGlossariesList(); - } - Vector vector = new Vector<>(); - vector.addAll(glossaries.values()); - Collections.sort(vector); - Iterator it = vector.iterator(); - while (it.hasNext()) { - Memory m = it.next(); - JSONArray array = new JSONArray(); - array.put(m.getId()); - array.put(m.getName()); - result.put(array); - } - return result; - } - - public static String getWorkFolder() throws IOException { - File home = TmsServer.getWorkFolder(); - File workFolder = new File(home, "glossaries"); - if (!workFolder.exists()) { - Files.createDirectories(workFolder.toPath()); - } - return workFolder.getAbsolutePath(); - } - - private boolean isTBX(File file) throws IOException { - byte[] array = new byte[40960]; - try (FileInputStream input = new FileInputStream(file)) { - if (input.read(array) == -1) { - throw new IOException("Premature end of file"); - } - } - String string = ""; - Charset bom = EncodingResolver.getBOM(file.getAbsolutePath()); - if (bom != null) { - byte[] efbbbf = { -17, -69, -65 }; // UTF-8 - String utf8 = new String(efbbbf); - string = new String(array, bom); - if (string.startsWith("\uFFFE")) { - string = string.substring("\uFFFE".length()); - } else if (string.startsWith("\uFEFF")) { - string = string.substring("\uFEFF".length()); - } else if (string.startsWith(utf8)) { - string = string.substring(utf8.length()); - } - } else { - string = new String(array); - } - return string.indexOf(" matches = new Vector<>(); - openGlossary(glossaries.get(glossary)); - matches.addAll(openEngines.get(glossary).searchAll(searchStr, srcLang, similarity, caseSensitive)); - closeGlossary(glossary); - result.put("count", matches.size()); - result.put("html", generateHTML(matches)); - } catch (IOException | SAXException | ParserConfigurationException | SQLException e) { - logger.log(Level.ERROR, e); - result.put("result", Constants.ERROR); - result.put(Constants.REASON, e.getMessage()); - } - return result; - } - - private static String generateHTML(List matches) throws IOException { - StringBuilder builder = new StringBuilder(); - builder.append(""); - List languages = MemoriesHandler.getLanguages(matches); - Iterator st = languages.iterator(); - while (st.hasNext()) { - builder.append(""); - } - builder.append(""); - for (int i = 0; i < matches.size(); i++) { - builder.append(""); - builder.append(parseTU(matches.get(i), languages)); - builder.append(""); - } - builder.append("
"); - builder.append(st.next().getDescription()); - builder.append("
"); - return builder.toString(); - } - - private static String parseTU(Element element, List languages) { - StringBuilder builder = new StringBuilder(); - Map map = new Hashtable<>(); - List tuvs = element.getChildren("tuv"); - Iterator it = tuvs.iterator(); - while (it.hasNext()) { - Element tuv = it.next(); - map.put(tuv.getAttributeValue("xml:lang"), tuv); - } - for (int i = 0; i < languages.size(); i++) { - Language lang = languages.get(i); - builder.append(""); - if (map.containsKey(lang.getCode())) { - Element seg = map.get(lang.getCode()).getChild("seg"); - builder.append(MemoriesHandler.pureText(seg)); - } else { - builder.append(" "); - } - builder.append(""); - } - return builder.toString(); - } - - public static String getGlossaryName(String id) throws IOException { - if (glossaries == null) { - loadGlossariesList(); - } - return glossaries.get(id).getName(); - } - - protected static void addGlossary(Memory memory) throws IOException { - if (glossaries == null) { - loadGlossariesList(); - } - glossaries.put(memory.getId(), memory); - saveGlossariesList(); - } -} +/***************************************************************************** +Copyright (c) 2007-2021 - Maxprograms, http://www.maxprograms.com/ + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to compile, +modify and use the Software in its executable form without restrictions. + +Redistribution of this Software or parts of it in any form (source code or +executable binaries) requires prior written permission from Maxprograms. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*****************************************************************************/ +package com.maxprograms.swordfish; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.System.Logger; +import java.lang.System.Logger.Level; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.sql.SQLException; +import java.util.Collections; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; + +import javax.xml.parsers.ParserConfigurationException; + +import com.maxprograms.converters.EncodingResolver; +import com.maxprograms.languages.Language; +import com.maxprograms.swordfish.models.Memory; +import com.maxprograms.swordfish.tbx.Tbx2Tmx; +import com.maxprograms.swordfish.tm.ITmEngine; +import com.maxprograms.swordfish.tm.InternalDatabase; +import com.maxprograms.swordfish.tm.RemoteDatabase; +import com.maxprograms.xml.Element; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.xml.sax.SAXException; + +public class GlossariesHandler implements HttpHandler { + + private static Logger logger = System.getLogger(GlossariesHandler.class.getName()); + + private static ConcurrentHashMap glossaries; + private static ConcurrentHashMap openEngines; + private static ConcurrentHashMap useCount; + private static Map openTasks; + private static boolean firstRun = true; + + @Override + public void handle(HttpExchange exchange) throws IOException { + try { + String request; + URI uri = exchange.getRequestURI(); + try (InputStream is = exchange.getRequestBody()) { + request = TmsServer.readRequestBody(is); + } + JSONObject response = processRequest(uri.toString(), request); + byte[] bytes = response.toString().getBytes(StandardCharsets.UTF_8); + exchange.sendResponseHeaders(200, bytes.length); + exchange.getResponseHeaders().add("content-type", "application/json; charset=utf-8"); + try (ByteArrayInputStream stream = new ByteArrayInputStream(bytes)) { + try (OutputStream os = exchange.getResponseBody()) { + byte[] array = new byte[2048]; + int read; + while ((read = stream.read(array)) != -1) { + os.write(array, 0, read); + } + } + } + } catch (IOException e) { + logger.log(Level.ERROR, "Error processing glossary " + exchange.getRequestURI().toString(), e); + } + + } + + private JSONObject processRequest(String url, String request) { + if (TmsServer.isDebug()) { + logger.log(Level.INFO, url); + } + JSONObject response = new JSONObject(); + try { + if ("/glossaries/create".equals(url)) { + response = createGlossary(request); + } else if ("/glossaries/list".equals(url)) { + response = listGlossaries(); + } else if ("/glossaries/delete".equals(url)) { + response = deleteGlossary(request); + } else if ("/glossaries/export".equals(url)) { + response = exportGlossary(request); + } else if ("/glossaries/import".equals(url)) { + response = importGlossary(request); + } else if ("/glossaries/status".equals(url)) { + response = getProcessStatus(request); + } else if ("/glossaries/search".equals(url)) { + response = searchTerm(request); + } else if ("/glossaries/addTerm".equals(url)) { + response = addTerm(request); + } else { + response.put(Constants.REASON, "Unknown request"); + } + + if (!response.has(Constants.REASON)) { + response.put(Constants.STATUS, Constants.SUCCESS); + } else { + response.put(Constants.STATUS, Constants.ERROR); + } + } catch (Exception j) { + logger.log(Level.ERROR, j.getMessage(), j); + response.put(Constants.STATUS, Constants.ERROR); + response.put(Constants.REASON, j.getMessage()); + } + return response; + } + + private static JSONObject getProcessStatus(String request) { + JSONObject json = new JSONObject(request); + if (!json.has("process")) { + JSONObject error = new JSONObject(); + error.put(Constants.REASON, "Missing 'process' parameter"); + return error; + } + String process = json.getString("process"); + if (openTasks == null) { + openTasks = new ConcurrentHashMap<>(); + } + if (openTasks.containsKey(process)) { + return openTasks.get(process); + } + JSONObject error = new JSONObject(); + error.put(Constants.REASON, "No such process: " + process); + return error; + } + + private static JSONObject createGlossary(String request) throws IOException, SQLException { + JSONObject result = new JSONObject(); + JSONObject json = new JSONObject(request); + if (!json.has("id")) { + json.put("id", "" + System.currentTimeMillis()); + } + if (!json.has("creationDate")) { + json.put("creationDate", System.currentTimeMillis()); + } + Memory mem = new Memory(json); + InternalDatabase engine = new InternalDatabase(mem.getId(), getWorkFolder()); + engine.close(); + if (glossaries == null) { + loadGlossariesList(); + } + glossaries.put(mem.getId(), mem); + ServicesHandler.addClient(json.getString("client")); + ServicesHandler.addSubject(json.getString("subject")); + ServicesHandler.addProject(json.getString("project")); + saveGlossariesList(); + return result; + } + + private static void loadGlossariesList() throws IOException { + glossaries = new ConcurrentHashMap<>(); + File home = new File(getWorkFolder()); + File list = new File(home, "glossaries.json"); + if (!list.exists()) { + return; + } + StringBuffer buffer = new StringBuffer(); + try (FileReader input = new FileReader(list, StandardCharsets.UTF_8)) { + try (BufferedReader reader = new BufferedReader(input)) { + String line; + while ((line = reader.readLine()) != null) { + buffer.append(line); + } + } + } + JSONObject json = new JSONObject(buffer.toString()); + Set keys = json.keySet(); + Iterator it = keys.iterator(); + while (it.hasNext()) { + String key = it.next(); + JSONObject obj = json.getJSONObject(key); + glossaries.put(key, new Memory(obj)); + } + if (firstRun) { + firstRun = false; + new Thread(() -> { + try { + File[] filesList = home.listFiles(); + for (int i = 0; i < filesList.length; i++) { + if (filesList[i].isDirectory() && !glossaries.containsKey(filesList[i].getName())) { + TmsServer.deleteFolder(filesList[i].getAbsolutePath()); + } + } + } catch (IOException e) { + logger.log(Level.WARNING, "Error deleting folder", e); + } + }).start(); + } + } + + private static void saveGlossariesList() throws IOException { + JSONObject json = new JSONObject(); + Set keys = glossaries.keySet(); + Iterator it = keys.iterator(); + while (it.hasNext()) { + String key = it.next(); + Memory m = glossaries.get(key); + json.put(key, m.toJSON()); + } + File home = new File(getWorkFolder()); + File list = new File(home, "glossaries.json"); + try (FileOutputStream out = new FileOutputStream(list)) { + out.write(json.toString(2).getBytes(StandardCharsets.UTF_8)); + } + } + + private static JSONObject listGlossaries() throws IOException { + JSONObject result = new JSONObject(); + JSONArray array = new JSONArray(); + result.put("glossaries", array); + if (glossaries == null) { + loadGlossariesList(); + } + Vector vector = new Vector<>(); + vector.addAll(glossaries.values()); + Collections.sort(vector); + Iterator it = vector.iterator(); + while (it.hasNext()) { + Memory m = it.next(); + array.put(m.toJSON()); + } + return result; + } + + private static JSONObject deleteGlossary(String request) { + JSONObject result = new JSONObject(); + final JSONObject json = new JSONObject(request); + + if (json.has("glossaries")) { + final String process = "" + System.currentTimeMillis(); + result.put("process", process); + if (openTasks == null) { + openTasks = new ConcurrentHashMap<>(); + } + JSONObject obj = new JSONObject(); + obj.put(Constants.PROGRESS, Constants.PROCESSING); + openTasks.put(process, obj); + new Thread(() -> { + try { + JSONArray array = json.getJSONArray("glossaries"); + for (int i = 0; i < array.length(); i++) { + Memory mem = glossaries.get(array.getString(i)); + if (openEngines != null && openEngines.containsKey(mem.getId())) { + ITmEngine engine = openEngines.get(mem.getId()); + engine.close(); + openEngines.remove(mem.getId()); + useCount.remove(mem.getId()); + } + if (mem.getType().equals(Memory.LOCAL)) { + try { + File wfolder = new File(getWorkFolder(), mem.getId()); + TmsServer.deleteFolder(wfolder.getAbsolutePath()); + } catch (IOException ioe) { + logger.log(Level.WARNING, "Folder '" + mem.getId() + "' will be deleted on next start"); + } + } + glossaries.remove(mem.getId()); + } + saveGlossariesList(); + JSONObject completed = new JSONObject(); + completed.put(Constants.PROGRESS, Constants.COMPLETED); + openTasks.put(process, completed); + } catch (IOException | SQLException e) { + logger.log(Level.ERROR, e.getMessage(), e); + JSONObject error = new JSONObject(); + error.put(Constants.REASON, e.getMessage()); + openTasks.put(process, error); + } + }).start(); + } else { + result.put(Constants.REASON, "Missing 'glossaries' parameter"); + } + return result; + } + + private static JSONObject exportGlossary(String request) { + JSONObject result = new JSONObject(); + final JSONObject json = new JSONObject(request); + if (!json.has("glossary")) { + result.put(Constants.REASON, "Missing 'glossary' parameter"); + return result; + } + if (!json.has("file")) { + result.put(Constants.REASON, "Missing 'file' parameter"); + return result; + } + if (!json.has("srcLang")) { + json.put("srcLang", "*all*"); + } + final String process = "" + System.currentTimeMillis(); + if (openTasks == null) { + openTasks = new ConcurrentHashMap<>(); + } + JSONObject obj = new JSONObject(); + obj.put(Constants.PROGRESS, Constants.PROCESSING); + openTasks.put(process, obj); + new Thread(() -> { + try { + if (glossaries == null) { + loadGlossariesList(); + } + Memory mem = glossaries.get(json.getString("glossary")); + openGlossary(mem); + ITmEngine engine = openEngines.get(mem.getId()); + File tmx = new File(json.getString("file")); + Set langSet = Collections.synchronizedSortedSet(new TreeSet<>()); + if (json.has("languages")) { + JSONArray langs = json.getJSONArray("languages"); + for (int i = 0; i < langs.length(); i++) { + langSet.add(langs.getString(i)); + } + } else { + langSet = engine.getAllLanguages(); + } + engine.exportMemory(tmx.getAbsolutePath(), langSet, json.getString("srcLang")); + closeGlossary(mem.getId()); + JSONObject completed = new JSONObject(); + completed.put(Constants.PROGRESS, Constants.COMPLETED); + openTasks.put(process, completed); + } catch (IOException | JSONException | SAXException | ParserConfigurationException | SQLException e) { + logger.log(Level.ERROR, e.getMessage(), e); + JSONObject error = new JSONObject(); + error.put(Constants.REASON, e.getMessage()); + openTasks.put(process, error); + } + }).start(); + result.put("process", process); + return result; + } + + public static synchronized void openGlossary(String id) throws IOException, SQLException { + openGlossary(glossaries.get(id)); + } + + public static synchronized void openGlossary(Memory memory) throws IOException, SQLException { + if (glossaries == null) { + loadGlossariesList(); + } + if (openEngines == null) { + openEngines = new ConcurrentHashMap<>(); + useCount = new ConcurrentHashMap<>(); + } + if (openEngines.containsKey(memory.getId())) { + int count = useCount.get(memory.getId()) + 1; + useCount.put(memory.getId(), count); + return; + } + ITmEngine engine = memory.getType().equals(Memory.LOCAL) ? new InternalDatabase(memory.getId(), getWorkFolder()) + : new RemoteDatabase(memory.getServer(), memory.getUser(), memory.getPassword(), memory.getId()); + openEngines.put(memory.getId(), engine); + useCount.put(memory.getId(), 1); + } + + public static ITmEngine getEngine(String id) throws IOException { + if (glossaries == null) { + loadGlossariesList(); + } + if (openEngines == null) { + throw new IOException("No open glossaries"); + } + if (!openEngines.containsKey(id)) { + throw new IOException("Glossary is not open"); + } + return openEngines.get(id); + } + + public static synchronized void closeGlossary(String id) throws IOException, SQLException { + if (openEngines == null) { + throw new IOException("No glossaries open"); + } + if (!openEngines.containsKey(id)) { + throw new IOException("Glossary already closed"); + } + int count = useCount.get(id); + useCount.put(id, count - 1); + if (count == 1) { + openEngines.get(id).close(); + openEngines.remove(id); + useCount.remove(id); + } + } + + private JSONObject importGlossary(String request) { + JSONObject result = new JSONObject(); + JSONObject json = new JSONObject(request); + if (!json.has("glossary")) { + result.put(Constants.REASON, "Missing 'glossary' parameter"); + return result; + } + String id = json.getString("glossary"); + + if (!json.has("file")) { + result.put(Constants.REASON, "Missing 'file' parameter"); + return result; + } + File glossFile = new File(json.getString("file")); + if (!glossFile.exists()) { + result.put(Constants.REASON, "Glossary file does not exist"); + return result; + } + + final String process = "" + System.currentTimeMillis(); + if (openTasks == null) { + openTasks = new ConcurrentHashMap<>(); + } + JSONObject obj = new JSONObject(); + obj.put(Constants.PROGRESS, Constants.PROCESSING); + openTasks.put(process, obj); + new Thread(() -> { + try { + openGlossary(glossaries.get(id)); + File tempFile = null; + String tmxFile = glossFile.getAbsolutePath(); + if (isTBX(glossFile)) { + tempFile = File.createTempFile("gloss", ".tmx"); + Tbx2Tmx.convert(tmxFile, tempFile.getAbsolutePath()); + tmxFile = tempFile.getAbsolutePath(); + } + ITmEngine engine = openEngines.get(id); + String project = json.has("project") ? json.getString("project") : ""; + String client = json.has("client") ? json.getString("client") : ""; + String subject = json.has("subject") ? json.getString("subject") : ""; + try { + int imported = engine.storeTMX(tmxFile, project, client, subject); + logger.log(Level.INFO, "Imported " + imported); + JSONObject completed = new JSONObject(); + completed.put("imported", imported); + completed.put(Constants.PROGRESS, Constants.COMPLETED); + openTasks.put(process, completed); + } catch (Exception e) { + JSONObject error = new JSONObject(); + error.put(Constants.REASON, e.getMessage()); + openTasks.put(process, error); + logger.log(Level.ERROR, e.getMessage(), e); + } + closeGlossary(id); + if (tempFile != null) { + Files.delete(tempFile.toPath()); + } + } catch (IOException | SQLException | SAXException | ParserConfigurationException | URISyntaxException e) { + logger.log(Level.ERROR, e.getMessage(), e); + JSONObject error = new JSONObject(); + error.put(Constants.REASON, e.getMessage()); + openTasks.put(process, error); + } + }).start(); + result.put("process", process); + return result; + } + + public static JSONArray getGlossaries() throws IOException { + JSONArray result = new JSONArray(); + if (glossaries == null) { + loadGlossariesList(); + } + Vector vector = new Vector<>(); + vector.addAll(glossaries.values()); + Collections.sort(vector); + Iterator it = vector.iterator(); + while (it.hasNext()) { + Memory m = it.next(); + JSONArray array = new JSONArray(); + array.put(m.getId()); + array.put(m.getName()); + result.put(array); + } + return result; + } + + public static String getWorkFolder() throws IOException { + File home = TmsServer.getWorkFolder(); + File workFolder = new File(home, "glossaries"); + if (!workFolder.exists()) { + Files.createDirectories(workFolder.toPath()); + } + return workFolder.getAbsolutePath(); + } + + private boolean isTBX(File file) throws IOException { + byte[] array = new byte[40960]; + try (FileInputStream input = new FileInputStream(file)) { + if (input.read(array) == -1) { + throw new IOException("Premature end of file"); + } + } + String string = ""; + Charset bom = EncodingResolver.getBOM(file.getAbsolutePath()); + if (bom != null) { + byte[] efbbbf = { -17, -69, -65 }; // UTF-8 + String utf8 = new String(efbbbf); + string = new String(array, bom); + if (string.startsWith("\uFFFE")) { + string = string.substring("\uFFFE".length()); + } else if (string.startsWith("\uFEFF")) { + string = string.substring("\uFEFF".length()); + } else if (string.startsWith(utf8)) { + string = string.substring(utf8.length()); + } + } else { + string = new String(array); + } + return string.indexOf(" matches = new Vector<>(); + openGlossary(glossaries.get(glossary)); + matches.addAll(openEngines.get(glossary).searchAll(searchStr, srcLang, similarity, caseSensitive)); + closeGlossary(glossary); + result.put("count", matches.size()); + result.put("html", generateHTML(matches)); + } catch (IOException | SAXException | ParserConfigurationException | SQLException e) { + logger.log(Level.ERROR, e); + result.put("result", Constants.ERROR); + result.put(Constants.REASON, e.getMessage()); + } + return result; + } + + private static String generateHTML(List matches) throws IOException { + StringBuilder builder = new StringBuilder(); + builder.append(""); + List languages = MemoriesHandler.getLanguages(matches); + Iterator st = languages.iterator(); + while (st.hasNext()) { + builder.append(""); + } + builder.append(""); + for (int i = 0; i < matches.size(); i++) { + builder.append(""); + builder.append(parseTU(matches.get(i), languages)); + builder.append(""); + } + builder.append("
"); + builder.append(st.next().getDescription()); + builder.append("
"); + return builder.toString(); + } + + private static String parseTU(Element element, List languages) { + StringBuilder builder = new StringBuilder(); + Map map = new Hashtable<>(); + List tuvs = element.getChildren("tuv"); + Iterator it = tuvs.iterator(); + while (it.hasNext()) { + Element tuv = it.next(); + map.put(tuv.getAttributeValue("xml:lang"), tuv); + } + for (int i = 0; i < languages.size(); i++) { + Language lang = languages.get(i); + builder.append(""); + if (map.containsKey(lang.getCode())) { + Element seg = map.get(lang.getCode()).getChild("seg"); + builder.append(MemoriesHandler.pureText(seg)); + } else { + builder.append(" "); + } + builder.append(""); + } + return builder.toString(); + } + + public static String getGlossaryName(String id) throws IOException { + if (glossaries == null) { + loadGlossariesList(); + } + return glossaries.get(id).getName(); + } + + protected static void addGlossary(Memory memory) throws IOException { + if (glossaries == null) { + loadGlossariesList(); + } + glossaries.put(memory.getId(), memory); + saveGlossariesList(); + } +} diff --git a/src/com/maxprograms/swordfish/ProjectsHandler.java b/src/com/maxprograms/swordfish/ProjectsHandler.java index 6255a43..ce3b866 100644 --- a/src/com/maxprograms/swordfish/ProjectsHandler.java +++ b/src/com/maxprograms/swordfish/ProjectsHandler.java @@ -35,6 +35,8 @@ Redistribution of this Software or parts of it in any form (source code or import java.sql.SQLException; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; @@ -465,7 +467,6 @@ private void removeFromList(String id) { private JSONObject listProjects() { JSONObject result = new JSONObject(); - JSONArray array = projectsList.getJSONArray("projects"); for (int i = 0; i < array.length(); i++) { int status = array.getJSONObject(i).getInt("status"); @@ -496,11 +497,7 @@ private void loadProjectsList() throws IOException { } } projectsList = new JSONObject(buffer.toString()); - JSONArray array = projectsList.getJSONArray("projects"); - for (int i = 0; i < array.length(); i++) { - JSONObject project = array.getJSONObject(i); - projects.put(project.getString("id"), new Project(project)); - } + sortProjects(); if (firstRun) { firstRun = false; new Thread(() -> { @@ -518,6 +515,30 @@ private void loadProjectsList() throws IOException { } } + private void sortProjects() throws JSONException, IOException { + JSONArray array = projectsList.getJSONArray("projects"); + List list = new ArrayList<>(); + for (int i = 0; i < array.length(); i++) { + Project project = new Project(array.getJSONObject(i)); + list.add(project); + } + Collections.sort(list, new Comparator() { + + @Override + public int compare(Project o1, Project o2) { + return o2.getCreationDate().compareTo(o1.getCreationDate()); + } + + }); + array = new JSONArray(); + for (int i = 0; i < list.size(); i++) { + Project project = list.get(i); + projects.put(project.getId(), project); + array.put(project.toJSON()); + } + projectsList.put("projects", array); + } + private synchronized void saveProjectsList() throws IOException { File home = getWorkFolder(); File list = new File(home, "projects.json"); @@ -730,7 +751,7 @@ public void run() { p.setFiles(sourceFiles); projects.put(id, p); - projectsList.getJSONArray("projects").put(p.toJSON()); + projectsList.getJSONArray("projects").put(0, p.toJSON()); saveProjectsList(); if (applyTM) { XliffStore store = new XliffStore(p.getXliff(), p.getSourceLang().getCode(), diff --git a/src/com/maxprograms/swordfish/am/MatchAssembler.java b/src/com/maxprograms/swordfish/am/MatchAssembler.java index 15c4e49..6322d4c 100644 --- a/src/com/maxprograms/swordfish/am/MatchAssembler.java +++ b/src/com/maxprograms/swordfish/am/MatchAssembler.java @@ -77,8 +77,9 @@ public static Match assembleMatch(String textOnly, List tmMatches, ITmEng for (int i = 0; i < tmMatches.size(); i++) { Match match = tmMatches.get(i); - Element source = XliffUtils.toXliff("source", match.getSource(), new JSONObject()); - Element target = XliffUtils.toXliff("target", match.getTarget(), new JSONObject()); + XliffUtils.setTags(new JSONObject()); + Element source = XliffUtils.toXliff("", i, "source", match.getSource()); + Element target = XliffUtils.toXliff("", i, "target", match.getTarget()); String pureSource = clean(XliffUtils.pureText(source).trim()); if (visited.contains(pureSource)) { @@ -158,7 +159,8 @@ public static Match assembleMatch(String textOnly, List tmMatches, ITmEng properties.put("creationtool", Constants.APPNAME); properties.put("creationtoolversion", Constants.VERSION); - Match newMatch = new Match(uncleanElement(newSource), uncleanElement(newTarget), similarity, "Auto", properties); + Match newMatch = new Match(uncleanElement(newSource), uncleanElement(newTarget), similarity, "Auto", + properties); result.add(newMatch); } } @@ -282,7 +284,7 @@ private static String clean(String string) { private static String unclean(String string) { return string.replace("\uE0A1", "&").replace("\uE0A0", "<"); } - + private static Element uncleanElement(Element e) { List newContent = new Vector<>(); List oldContent = e.getContent(); diff --git a/src/com/maxprograms/swordfish/models/Memory.java b/src/com/maxprograms/swordfish/models/Memory.java index 7faa68d..224e7b4 100644 --- a/src/com/maxprograms/swordfish/models/Memory.java +++ b/src/com/maxprograms/swordfish/models/Memory.java @@ -18,7 +18,6 @@ Redistribution of this Software or parts of it in any form (source code or *****************************************************************************/ package com.maxprograms.swordfish.models; -import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @@ -26,9 +25,7 @@ Redistribution of this Software or parts of it in any form (source code or import org.json.JSONObject; -public class Memory implements Serializable, Comparable { - - private static final long serialVersionUID = -3800311066779683003L; +public class Memory implements Comparable { public static final String LOCAL = "Local"; public static final String REMOTE = "RemoteTM"; diff --git a/src/com/maxprograms/swordfish/models/Project.java b/src/com/maxprograms/swordfish/models/Project.java index f96fb24..ffe5be3 100644 --- a/src/com/maxprograms/swordfish/models/Project.java +++ b/src/com/maxprograms/swordfish/models/Project.java @@ -1,221 +1,218 @@ -/***************************************************************************** -Copyright (c) 2007-2021 - Maxprograms, http://www.maxprograms.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to compile, -modify and use the Software in its executable form without restrictions. - -Redistribution of this Software or parts of it in any form (source code or -executable binaries) requires prior written permission from Maxprograms. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*****************************************************************************/ -package com.maxprograms.swordfish.models; - -import java.io.IOException; -import java.io.Serializable; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import com.maxprograms.languages.Language; -import com.maxprograms.languages.LanguageUtils; - -import org.json.JSONArray; -import org.json.JSONObject; - -public class Project implements Serializable, Comparable { - - private static final long serialVersionUID = -7301458245016833998L; - - public static final int NEW = 0; - - private String id; - private String description; - private int status; - private String client; - private String subject; - private Language sourceLang; - private Language targetLang; - private LocalDate creationDate; - private List files; - private String memory; - private String glossary; - private String xliff; - - public Project(String id, String description, int status, Language sourceLang, Language targetLang, String client, - String subject, String memory, String glossary, LocalDate creationDate) { - this.id = id; - this.description = description; - this.status = status; - this.sourceLang = sourceLang; - this.targetLang = targetLang; - this.client = client; - this.subject = subject; - this.creationDate = creationDate; - this.memory = memory; - this.glossary = glossary; - } - - public String getXliff() { - return xliff; - } - - public void setXliff(String xliff) { - this.xliff = xliff; - } - - public Project(JSONObject json) throws IOException { - id = json.getString("id"); - description = json.getString("description"); - status = json.getInt("status"); - sourceLang = LanguageUtils.getLanguage(json.getString("sourceLang")); - targetLang = LanguageUtils.getLanguage(json.getString("targetLang")); - client = json.has("client") ? json.getString("client") : ""; - subject = json.has("subject") ? json.getString("subject") : ""; - creationDate = LocalDate.parse(json.getString("creationDate")); - files = new ArrayList<>(); - JSONArray filesArray = json.getJSONArray("files"); - for (int i = 0; i < filesArray.length(); i++) { - files.add(new SourceFile(filesArray.getJSONObject(i))); - } - xliff = json.getString("xliff"); - memory = json.getString("memory"); - glossary = json.getString("glossary"); - } - - public JSONObject toJSON() { - JSONObject json = new JSONObject(); - json.put("id", id); - json.put("description", description); - json.put("status", status); - json.put("sourceLang", sourceLang.getCode()); - json.put("targetLang", targetLang.getCode()); - json.put("client", client); - json.put("subject", subject); - json.put("creationDate", creationDate.toString()); - JSONArray filesArray = new JSONArray(); - Iterator it = files.iterator(); - while (it.hasNext()) { - filesArray.put(it.next().toJSON()); - } - json.put("files", filesArray); - json.put("xliff", xliff); - json.put("memory", memory); - json.put("glossary", glossary); - return json; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public int getStatus() { - return status; - } - - public void setStatus(int status) { - this.status = status; - } - - public Language getSourceLang() { - return sourceLang; - } - - public void setSourceLang(Language sourceLang) { - this.sourceLang = sourceLang; - } - - public Language getTargetLang() { - return targetLang; - } - - public void setTargetLang(Language targetLang) { - this.targetLang = targetLang; - } - - public LocalDate getCreationDate() { - return creationDate; - } - - public void setCreationDate(LocalDate creationDate) { - this.creationDate = creationDate; - } - - public List getFiles() { - return files; - } - - public void setFiles(List files) { - this.files = files; - } - - public void setFiles(JSONArray array) { - files = new ArrayList<>(); - for (int i=0 ; i { + + public static final int NEW = 0; + + private String id; + private String description; + private int status; + private String client; + private String subject; + private Language sourceLang; + private Language targetLang; + private LocalDate creationDate; + private List files; + private String memory; + private String glossary; + private String xliff; + + public Project(String id, String description, int status, Language sourceLang, Language targetLang, String client, + String subject, String memory, String glossary, LocalDate creationDate) { + this.id = id; + this.description = description; + this.status = status; + this.sourceLang = sourceLang; + this.targetLang = targetLang; + this.client = client; + this.subject = subject; + this.creationDate = creationDate; + this.memory = memory; + this.glossary = glossary; + } + + public String getXliff() { + return xliff; + } + + public void setXliff(String xliff) { + this.xliff = xliff; + } + + public Project(JSONObject json) throws IOException { + id = json.getString("id"); + description = json.getString("description"); + status = json.getInt("status"); + sourceLang = LanguageUtils.getLanguage(json.getString("sourceLang")); + targetLang = LanguageUtils.getLanguage(json.getString("targetLang")); + client = json.has("client") ? json.getString("client") : ""; + subject = json.has("subject") ? json.getString("subject") : ""; + creationDate = LocalDate.parse(json.getString("creationDate")); + files = new ArrayList<>(); + JSONArray filesArray = json.getJSONArray("files"); + for (int i = 0; i < filesArray.length(); i++) { + files.add(new SourceFile(filesArray.getJSONObject(i))); + } + xliff = json.getString("xliff"); + memory = json.getString("memory"); + glossary = json.getString("glossary"); + } + + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put("id", id); + json.put("description", description); + json.put("status", status); + json.put("sourceLang", sourceLang.getCode()); + json.put("targetLang", targetLang.getCode()); + json.put("client", client); + json.put("subject", subject); + json.put("creationDate", creationDate.toString()); + JSONArray filesArray = new JSONArray(); + Iterator it = files.iterator(); + while (it.hasNext()) { + filesArray.put(it.next().toJSON()); + } + json.put("files", filesArray); + json.put("xliff", xliff); + json.put("memory", memory); + json.put("glossary", glossary); + return json; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public Language getSourceLang() { + return sourceLang; + } + + public void setSourceLang(Language sourceLang) { + this.sourceLang = sourceLang; + } + + public Language getTargetLang() { + return targetLang; + } + + public void setTargetLang(Language targetLang) { + this.targetLang = targetLang; + } + + public LocalDate getCreationDate() { + return creationDate; + } + + public void setCreationDate(LocalDate creationDate) { + this.creationDate = creationDate; + } + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + + public void setFiles(JSONArray array) { + files = new ArrayList<>(); + for (int i = 0; i < array.length(); i++) { + files.add(new SourceFile(array.getJSONObject(i))); + } + } + + public String getMemory() { + return memory; + } + + public void setMemory(String memory) { + this.memory = memory; + } + + public String getGlossary() { + return glossary; + } + + public void setGlossary(String glossary) { + this.glossary = glossary; + } + + public String getClient() { + return client; + } + + public String getSubject() { + return subject; + } + + @Override + public int compareTo(Project o) { + return creationDate.compareTo(o.getCreationDate()); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Project)) { + return false; + } + Project p = (Project) obj; + return id.equals(p.getId()); + } + + @Override + public int hashCode() { + return id.hashCode(); + } +} diff --git a/src/com/maxprograms/swordfish/models/SourceFile.java b/src/com/maxprograms/swordfish/models/SourceFile.java index 902d733..132ff85 100644 --- a/src/com/maxprograms/swordfish/models/SourceFile.java +++ b/src/com/maxprograms/swordfish/models/SourceFile.java @@ -1,99 +1,97 @@ -/***************************************************************************** -Copyright (c) 2007-2021 - Maxprograms, http://www.maxprograms.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to compile, -modify and use the Software in its executable form without restrictions. - -Redistribution of this Software or parts of it in any form (source code or -executable binaries) requires prior written permission from Maxprograms. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*****************************************************************************/ -package com.maxprograms.swordfish.models; - -import java.io.Serializable; -import java.nio.charset.StandardCharsets; - -import org.json.JSONObject; - -public class SourceFile implements Serializable, Comparable { - - private static final long serialVersionUID = -3726822493975520037L; - private String file; - private String type; - private String encoding; - - public SourceFile(String file, String type, String encoding) { - this.file = file; - this.type = type; - this.encoding = encoding; - } - - public SourceFile(JSONObject json) { - this.file = json.getString("file"); - this.type = json.getString("type"); - if (json.has("encoding")) { - this.encoding = json.getString("encoding"); - } else { - this.encoding = StandardCharsets.UTF_8.name(); - } - } - - public String getFile() { - return file; - } - - public void setFile(String file) { - this.file = file; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getEncoding() { - return encoding; - } - - public void setEncoding(String encoding) { - this.encoding = encoding; - } - - public JSONObject toJSON() { - JSONObject result = new JSONObject(); - result.put("file", file); - result.put("type", type); - result.put("encoding", encoding); - return result; - } - - @Override - public int compareTo(SourceFile o) { - return file.compareTo(o.getFile()); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof SourceFile)) { - return false; - } - SourceFile s = (SourceFile) obj; - return file.equals(s.getFile()) && type.equals(s.getType()) && encoding.equals(s.getEncoding()); - } - - @Override - public int hashCode() { - return (file + type + encoding).hashCode(); - } -} +/***************************************************************************** +Copyright (c) 2007-2021 - Maxprograms, http://www.maxprograms.com/ + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to compile, +modify and use the Software in its executable form without restrictions. + +Redistribution of this Software or parts of it in any form (source code or +executable binaries) requires prior written permission from Maxprograms. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*****************************************************************************/ +package com.maxprograms.swordfish.models; + +import java.nio.charset.StandardCharsets; + +import org.json.JSONObject; + +public class SourceFile implements Comparable { + + private String file; + private String type; + private String encoding; + + public SourceFile(String file, String type, String encoding) { + this.file = file; + this.type = type; + this.encoding = encoding; + } + + public SourceFile(JSONObject json) { + this.file = json.getString("file"); + this.type = json.getString("type"); + if (json.has("encoding")) { + this.encoding = json.getString("encoding"); + } else { + this.encoding = StandardCharsets.UTF_8.name(); + } + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getEncoding() { + return encoding; + } + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + public JSONObject toJSON() { + JSONObject result = new JSONObject(); + result.put("file", file); + result.put("type", type); + result.put("encoding", encoding); + return result; + } + + @Override + public int compareTo(SourceFile o) { + return file.compareTo(o.getFile()); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof SourceFile)) { + return false; + } + SourceFile s = (SourceFile) obj; + return file.equals(s.getFile()) && type.equals(s.getType()) && encoding.equals(s.getEncoding()); + } + + @Override + public int hashCode() { + return (file + type + encoding).hashCode(); + } +} diff --git a/src/com/maxprograms/swordfish/tm/Match.java b/src/com/maxprograms/swordfish/tm/Match.java index 11fb699..3f33955 100644 --- a/src/com/maxprograms/swordfish/tm/Match.java +++ b/src/com/maxprograms/swordfish/tm/Match.java @@ -20,7 +20,6 @@ Redistribution of this Software or parts of it in any form (source code or package com.maxprograms.swordfish.tm; import java.io.IOException; -import java.io.Serializable; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; @@ -33,9 +32,7 @@ Redistribution of this Software or parts of it in any form (source code or import org.json.JSONObject; import org.xml.sax.SAXException; -public class Match implements Serializable, Comparable { - - private static final long serialVersionUID = -944405164833933436L; +public class Match implements Comparable { private Element source; private Element target; diff --git a/src/com/maxprograms/swordfish/tm/RemoteDatabase.java b/src/com/maxprograms/swordfish/tm/RemoteDatabase.java index 2d713d9..9b42067 100644 --- a/src/com/maxprograms/swordfish/tm/RemoteDatabase.java +++ b/src/com/maxprograms/swordfish/tm/RemoteDatabase.java @@ -32,7 +32,6 @@ Redistribution of this Software or parts of it in any form (source code or import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.Iterator; @@ -40,6 +39,7 @@ Redistribution of this Software or parts of it in any form (source code or import java.util.Map; import java.util.Set; import java.util.TreeSet; +import java.util.Vector; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -315,7 +315,7 @@ public List searchTranslation(String searchStr, String srcLang, String tg params.put("caseSensitive", caseSensitive); JSONObject json = postMessage("/memories", params); JSONArray array = json.getJSONArray("matches"); - List matches = new ArrayList<>(); + List matches = new Vector<>(); for (int i = 0; i < array.length(); i++) { matches.add(toMatch(array.getJSONObject(i))); } @@ -334,7 +334,7 @@ public List searchAll(String searchStr, String srcLang, int similarity, params.put("caseSensitive", caseSensitive); JSONObject json = postMessage("/memories", params); JSONArray array = json.getJSONArray("tus"); - List tus = new ArrayList<>(); + List tus = new Vector<>(); for (int i = 0; i < array.length(); i++) { tus.add(toElement(array.getString(i))); } @@ -354,7 +354,7 @@ public List concordanceSearch(String searchStr, String srcLang, int lim params.put("caseSensitive", caseSensitive); JSONObject json = postMessage("/memories", params); JSONArray array = json.getJSONArray("tus"); - List tus = new ArrayList<>(); + List tus = new Vector<>(); for (int i = 0; i < array.length(); i++) { tus.add(toElement(array.getString(i))); } diff --git a/src/com/maxprograms/swordfish/xliff/XliffStore.java b/src/com/maxprograms/swordfish/xliff/XliffStore.java index 4126a78..4af58c6 100644 --- a/src/com/maxprograms/swordfish/xliff/XliffStore.java +++ b/src/com/maxprograms/swordfish/xliff/XliffStore.java @@ -36,9 +36,7 @@ Redistribution of this Software or parts of it in any form (source code or import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; @@ -328,7 +326,7 @@ private void recurse(Element e) throws SQLException, IOException { } } - notesMap = new HashMap<>(); + notesMap = new Hashtable<>(); Element notes = e.getChild("notes"); if (notes != null) { List n = notes.getChildren("note"); @@ -394,7 +392,7 @@ private void recurse(Element e) throws SQLException, IOException { target.setAttribute("xml:lang", tgtLang); } - List segmentNotes = new ArrayList<>(); + List segmentNotes = new Vector<>(); if (!notesMap.isEmpty()) { segmentNotes.addAll(harvestNotes(source)); source = FromXliff2.removeComments(source); @@ -433,7 +431,7 @@ private void recurse(Element e) throws SQLException, IOException { } private List harvestNotes(Element element) { - List result = new ArrayList<>(); + List result = new Vector<>(); if ("mrk".equals(element.getName()) && "comment".equals(element.getAttributeValue("type"))) { if (element.hasAttribute("ref")) { String ref = element.getAttributeValue("ref"); @@ -932,7 +930,7 @@ public synchronized JSONObject saveSegment(JSONObject json) } result.put("propagated", propagated); - boolean checkErrors = translatable && (confirm || (!pureTarget.isEmpty() && acceptUnconfirmed)); + boolean checkErrors = translatable && (confirm || !pureTarget.isEmpty()); boolean tagErrors = false; boolean spaceErrors = false; @@ -1099,6 +1097,7 @@ private JSONArray propagate(Element source, Element target) String file = rs.getString(1); String unit = rs.getString(2); String segment = rs.getString(3); + Element sourceElement = XliffUtils.buildElement(rs.getNString(4)); int tags = rs.getInt(6); JSONObject tagsData = new JSONObject(); if (tags > 0) { @@ -1123,6 +1122,9 @@ private JSONArray propagate(Element source, Element target) translated.setAttribute("xml:lang", tgtLang); translated.setAttribute("xml:space", preserve ? "preserve" : "default"); translated.setContent(target.getContent()); + if (!translated.getChildren().isEmpty()) { + translated = fixTags(sourceElement, source, target); + } updateTarget(file, unit, segment, translated, XliffUtils.pureText(translated), false); } insertMatch(file, unit, segment, "Self", Constants.TM, similarity, source, target, tagsData); @@ -1174,9 +1176,9 @@ private synchronized void insertMatch(String file, String unit, String segment, d.setText(tagsData.getString(dataRef)); originalData.addContent(d); added.add(dataRef); - } else { - e.removeAttribute("dataRef"); + continue; } + e.removeAttribute("dataRef"); } children = target.getChildren(); it = children.iterator(); @@ -1186,15 +1188,18 @@ private synchronized void insertMatch(String file, String unit, String segment, continue; } String dataRef = e.getAttributeValue("dataRef"); + if (added.contains(dataRef)) { + continue; + } if (!added.contains(dataRef) && tagsData.has(dataRef)) { Element d = new Element("data"); d.setAttribute("id", dataRef); d.setText(tagsData.getString(dataRef)); originalData.addContent(d); added.add(dataRef); - } else { - e.removeAttribute("dataRef"); + continue; } + e.removeAttribute("dataRef"); } data = originalData.toString(); } @@ -1662,6 +1667,7 @@ public synchronized JSONArray getTaggedtMatches(JSONObject json) originalSource = XliffUtils.buildElement(src); } } + List originalTags = originalSource.getChildren(); String dummySource = dummyTagger(originalSource); getMatches.setString(1, file); @@ -1669,6 +1675,7 @@ public synchronized JSONArray getTaggedtMatches(JSONObject json) getMatches.setString(3, segment); try (ResultSet rs = getMatches.executeQuery()) { while (rs.next()) { + tag = 1; JSONObject match = new JSONObject(); match.put("file", file); match.put("unit", unit); @@ -1682,6 +1689,25 @@ public synchronized JSONArray getTaggedtMatches(JSONObject json) String src = TMUtils.getString(rs.getNCharacterStream(8)); Element source = XliffUtils.buildElement(src); + String tgt = TMUtils.getString(rs.getNCharacterStream(9)); + Element target = XliffUtils.buildElement(tgt); + + List sourceTags = source.getChildren(); + List targetTags = target.getChildren(); + + for (int i = 0; i < sourceTags.size(); i++) { + Element sourceTag = sourceTags.get(i); + for (int j = 0; j < targetTags.size(); j++) { + Element targetTag = targetTags.get(j); + if (sourceTag.equals(targetTag) && i < originalTags.size()) { + targetTag.clone(originalTags.get(i)); + } + } + if (i < originalTags.size()) { + sourceTag.clone(originalTags.get(i)); + } + } + String taggedSource = addHtmlTags(source, originalData); List tags = XliffUtils.harvestTags(taggedSource); @@ -1694,12 +1720,9 @@ public synchronized JSONArray getTaggedtMatches(JSONObject json) for (int i = 0; i < tags.size(); i++) { tagged = tagged.replace("" + (char) (0xF300 + (i + 1)), tags.get(i)[1]); } - match.put("source", tagged); - String tgt = TMUtils.getString(rs.getNCharacterStream(9)); - Element target = XliffUtils.buildElement(tgt); + match.put("source", tagged); match.put("target", addHtmlTags(target, "", false, false, originalData, true)); - result.put(match); } } @@ -1964,7 +1987,7 @@ private void insertNotes(Element unit, Element notes) { unit.removeChild(old); } boolean added = false; - List newContent = new ArrayList<>(); + List newContent = new Vector<>(); List oldContent = unit.getContent(); Iterator it = oldContent.iterator(); while (it.hasNext()) { @@ -2004,12 +2027,16 @@ private Element getUnitMatches(String file, String unit) match.setAttribute("origin", rs.getString(5)); match.setAttribute("type", rs.getString(6)); match.setAttribute("matchQuality", "" + rs.getInt(7)); + String data = TMUtils.getString(rs.getNCharacterStream(10)); + if (!data.isEmpty()) { + match.addContent(XliffUtils.buildElement(data)); + } match.addContent(XliffUtils.buildElement(TMUtils.getString(rs.getNCharacterStream(8)))); match.addContent(XliffUtils.buildElement(TMUtils.getString(rs.getNCharacterStream(9)))); matches.addContent(match); } } - return matches.getChildren().isEmpty() ? null : matches; + return matches.getChildren("mtc:match").isEmpty() ? null : matches; } private Element getUnitNotes(String file, String unit) throws SQLException, IOException { @@ -2207,16 +2234,15 @@ public JSONArray tmTranslate(JSONObject json) MemoriesHandler.openMemory(memory); ITmEngine engine = MemoriesHandler.getEngine(memory); List matches = engine.searchTranslation(pure, srcLang, tgtLang, 60, false); - Iterator it = matches.iterator(); - while (it.hasNext()) { - Match m = it.next(); - JSONObject tags = new JSONObject(); - Element source = XliffUtils.toXliff("source", m.getSource(), tags); + for (int i = 0; i < matches.size(); i++) { + Match m = matches.get(i); + XliffUtils.setTags(new JSONObject()); + Element source = XliffUtils.toXliff(segment, i, "source", m.getSource()); source.setAttribute("xml:lang", srcLang); - Element target = XliffUtils.toXliff("target", m.getTarget(), tags); + Element target = XliffUtils.toXliff(segment, i, "target", m.getTarget()); target.setAttribute("xml:lang", tgtLang); JSONObject obj = new JSONObject(); - obj.put("dataRef", tags); + obj.put("dataRef", XliffUtils.getTags()); int similarity = m.getSimilarity() - tagDifferences(original, source); insertMatch(file, unit, segment, memoryName, Constants.TM, similarity, source, target, obj); conn.commit(); @@ -2289,16 +2315,18 @@ private int storeMatches(JSONArray translations, String memoryName, int penaliza boolean updated = false; for (int j = 0; j < matches.length(); j++) { Match m = new Match(matches.getJSONObject(j)); - JSONObject tags = new JSONObject(); - Element source = XliffUtils.toXliff("source", m.getSource(), tags); + XliffUtils.setTags(new JSONObject()); + Element source = XliffUtils.toXliff(segment, j, "source", m.getSource()); source.setAttribute("xml:lang", srcLang); - Element target = XliffUtils.toXliff("target", m.getTarget(), tags); + Element target = XliffUtils.toXliff(segment, j, "target", m.getTarget()); target.setAttribute("xml:lang", tgtLang); - JSONObject obj = new JSONObject(); - obj.put("dataRef", tags); int similarity = m.getSimilarity() - tagDifferences(original, source) - penalization; - insertMatch(file, unit, segment, memoryName, Constants.TM, similarity, source, target, obj); + insertMatch(file, unit, segment, memoryName, Constants.TM, similarity, source, target, + XliffUtils.getTags()); if (similarity == 100 && originalTarget.getContent().isEmpty() && !updated) { + if (!target.getChildren().isEmpty()) { + target = fixTags(original, source, target); + } updateTarget(file, unit, segment, target, XliffUtils.pureText(target), false); updated = true; } @@ -2312,6 +2340,26 @@ private int storeMatches(JSONArray translations, String memoryName, int penaliza return count; } + private Element fixTags(Element source, Element matchSource, Element matchTarget) { + List sourceTags = source.getChildren(); + List matchSourceTags = matchSource.getChildren(); + List matchTargetTags = matchTarget.getChildren(); + for (int i = 0; i < matchTargetTags.size(); i++) { + Element targetTag = matchTargetTags.get(i); + for (int j = 0; j < matchSourceTags.size(); j++) { + Element sourceTag = matchSourceTags.get(j); + if (sourceTag.equals(targetTag)) { + if (j < sourceTags.size()) { + Element originalTag = sourceTags.get(j); + targetTag.clone(originalTag); + } + break; + } + } + } + return matchTarget; + } + public static String getCatalog() throws IOException { if (catalog == null) { getPreferences(); @@ -2478,26 +2526,30 @@ public void acceptAll100Matches() throws SQLException, SAXException, IOException String sql = "SELECT file, unitId, segId, source FROM segments WHERE type='S' AND (state='initial' OR targetText='') AND translate='Y' "; try (ResultSet rs = stmt.executeQuery(sql)) { try (PreparedStatement perfectMatches = conn.prepareStatement( - "SELECT target FROM matches WHERE file=? AND unitId=? AND segId=? AND type='tm' AND similarity=100 LIMIT 1")) { + "SELECT source, target FROM matches WHERE file=? AND unitId=? AND segId=? AND type='tm' AND similarity=100 LIMIT 1")) { while (rs.next()) { String file = rs.getString(1); String unit = rs.getString(2); String segment = rs.getString(3); String src = TMUtils.getString(rs.getNCharacterStream(4)); + Element originalSource = XliffUtils.buildElement(src); perfectMatches.setString(1, file); perfectMatches.setString(2, unit); perfectMatches.setString(3, segment); try (ResultSet rs2 = perfectMatches.executeQuery()) { while (rs2.next()) { - Element source = XliffUtils.buildElement(src); - String tgt = TMUtils.getString(rs2.getNCharacterStream(1)); + Element source = XliffUtils.buildElement(TMUtils.getString(rs2.getNCharacterStream(1))); + String tgt = TMUtils.getString(rs2.getNCharacterStream(2)); Element target = XliffUtils.buildElement(tgt); target.setAttribute("xml:lang", tgtLang); - if (source.hasAttribute("xml:space")) { - target.setAttribute("xml:space", source.getAttributeValue("xml:space")); + if (originalSource.hasAttribute("xml:space")) { + target.setAttribute("xml:space", originalSource.getAttributeValue("xml:space")); } String pureTarget = XliffUtils.pureText(target); + if (!target.getChildren().isEmpty()) { + target = fixTags(originalSource, source, target); + } updateTarget(file, unit, segment, target, pureTarget, false); } } @@ -2689,7 +2741,7 @@ public JSONArray getSegmentTerms(JSONObject json) List words = sourceLanguage.isCJK() ? cjkWordList(sourceText, NGrams.TERM_SEPARATORS) : NGrams.buildWordList(sourceText, NGrams.TERM_SEPARATORS); - List terms = new ArrayList<>(); + List terms = new Vector<>(); String glossary = json.getString("glossary"); GlossariesHandler.openGlossary(glossary); @@ -2732,8 +2784,8 @@ public JSONArray getSegmentTerms(JSONObject json) private JSONArray sortTerms(JSONArray array) { JSONArray result = new JSONArray(); - List terms = new ArrayList<>(); - Map map = new HashMap<>(); + List terms = new Vector<>(); + Map map = new Hashtable<>(); for (int i = 0; i < array.length(); i++) { JSONObject obj = array.getJSONObject(i); Term term = new Term(obj.getString("source"), obj.getString("target")); @@ -2981,8 +3033,7 @@ public JSONObject analyzeTags() throws SQLException, SAXException, IOException, idx++; boolean segTranslate = rs.getString(8).equals("Y"); String segState = rs.getString(7); - if (!segTranslate || Constants.INITIAL.equals(segState) - || (Constants.TRANSLATED.equals(segState) && !acceptUnconfirmed)) { + if (!segTranslate || Constants.INITIAL.equals(segState)) { continue; } String sourceText = TMUtils.getString(rs.getNCharacterStream(5)); @@ -3000,6 +3051,7 @@ public JSONObject analyzeTags() throws SQLException, SAXException, IOException, error.put("type", "Missing Tags"); error.put("index", idx); errors.put(error); + continue; } if (sourceTags.size() < targetTags.size()) { JSONObject error = new JSONObject(); @@ -3009,18 +3061,43 @@ public JSONObject analyzeTags() throws SQLException, SAXException, IOException, error.put("type", "Extra Tags"); error.put("index", idx); errors.put(error); + continue; } if (sourceTags.size() == targetTags.size()) { + boolean skip = false; for (int i = 0; i < sourceTags.size(); i++) { - if (!sourceTags.get(i).equals(targetTags.get(i))) { + String srcTag = sourceTags.get(i); + boolean found = false; + for (int j = 0; j < targetTags.size(); j++) { + String tgtTag = targetTags.get(j); + if (srcTag.equals(tgtTag)) { + found = true; + break; + } + } + if (!found) { JSONObject error = new JSONObject(); error.put("file", rs.getString(1)); error.put("unit", rs.getString(2)); error.put("segment", rs.getString(3)); - error.put("type", "Tags in wrong order"); + error.put("type", "Different Tag"); error.put("index", idx); errors.put(error); - break; + skip = true; + } + } + if (!skip) { + for (int i = 0; i < sourceTags.size(); i++) { + if (!sourceTags.get(i).equals(targetTags.get(i))) { + JSONObject error = new JSONObject(); + error.put("file", rs.getString(1)); + error.put("unit", rs.getString(2)); + error.put("segment", rs.getString(3)); + error.put("type", "Tags in wrong order"); + error.put("index", idx); + errors.put(error); + break; + } } } } diff --git a/src/com/maxprograms/swordfish/xliff/XliffUtils.java b/src/com/maxprograms/swordfish/xliff/XliffUtils.java index 4224508..a6431ea 100644 --- a/src/com/maxprograms/swordfish/xliff/XliffUtils.java +++ b/src/com/maxprograms/swordfish/xliff/XliffUtils.java @@ -33,6 +33,10 @@ Redistribution of this Software or parts of it in any form (source code or import javax.xml.parsers.ParserConfigurationException; +import org.json.JSONArray; +import org.json.JSONObject; +import org.xml.sax.SAXException; + import com.maxprograms.converters.FileFormats; import com.maxprograms.swordfish.Constants; import com.maxprograms.swordfish.TmsServer; @@ -44,414 +48,421 @@ Redistribution of this Software or parts of it in any form (source code or import com.maxprograms.xml.TextNode; import com.maxprograms.xml.XMLNode; -import org.json.JSONArray; -import org.json.JSONObject; -import org.xml.sax.SAXException; - public class XliffUtils { - public static final String STYLE = "class='highlighted'"; - private static final String NOTXLIFF = "Selected file is not an XLIFF document"; - private static final String NOTSWORDFISH = "Selected file is not a Swordfish project"; - private static int maxTag = 0; - private static SAXBuilder builder; - - private XliffUtils() { - // empty for security - } - - public static String highlight(String string, String target, boolean caseSensitive) { - String result = string; - int start = -1; - String replacement = "" + target + ""; - if (caseSensitive) { - start = result.indexOf(target); - } else { - start = result.toLowerCase().indexOf(target.toLowerCase()); - replacement = "" + result.substring(start, start + target.length()) + ""; - } - while (start != -1) { - result = result.substring(0, start) + replacement + result.substring(start + target.length()); - start = start + replacement.length(); - if (caseSensitive) { - start = result.indexOf(target, start); - } else { - start = result.toLowerCase().indexOf(target.toLowerCase(), start); - if (start != -1) { - replacement = "" + result.substring(start, start + target.length()) + ""; - } - } - } - return result; - } - - public static String highlightSpaces(String text) { - StringBuilder start = new StringBuilder(); - for (int i = 0; i < text.length(); i++) { - char c = text.charAt(i); - if (!isSpace(c)) { - break; - } - start.append(c); - } - if (start.length() > 0) { - text = "" + start.toString() + "" + text.substring(start.length()); - } - StringBuilder end = new StringBuilder(); - for (int i = text.length() - 1; i >= 0; i--) { - char c = text.charAt(i); - if (!isSpace(c)) { - break; - } - end.append(c); - } - if (end.length() > 0) { - text = text.substring(0, text.length() - end.length()) + "" + end.toString() - + ""; - } - return text; - } - - public static boolean isSpace(char c) { - if (c == '\u00A0') { - return true; - } - return Character.isWhitespace(c); - } - - public static void checkSVG(int tag) throws IOException { - if (tag <= maxTag) { - return; - } - File folder = new File(TmsServer.getWorkFolder(), "images"); - if (!folder.exists()) { - Files.createDirectories(folder.toPath()); - } - File f = new File(folder, tag + ".svg"); - if (!f.exists()) { - int width = 16; - if (tag >= 10) { - width = 22; - } - if (tag >= 100) { - width = 28; - } - String svg = "" - + "" + "" - + "\n" - + "" + tag + ""; - try (FileOutputStream out = new FileOutputStream(f)) { - out.write(svg.getBytes(StandardCharsets.UTF_8)); - } - maxTag = tag; - } - } - - public static String cleanAngles(String string) { - String res = string.replace("&", "&"); - res = res.replace("<", "\u200B\u2039"); - res = res.replace(">", "\u200B\u203A"); - return res; - } - - public static String getHeader(Element e) { - StringBuilder result = new StringBuilder(); - result.append('<'); - result.append(e.getName()); - List atts = e.getAttributes(); - Iterator it = atts.iterator(); - while (it.hasNext()) { - Attribute a = it.next(); - result.append(' '); - result.append(a.getName()); - result.append("=\""); - result.append(unquote(cleanString(a.getValue()))); - result.append("\""); - } - result.append('>'); - return result.toString(); - } - - public static String getTail(Element e) { - return ""; - } - - public static String cleanString(String string) { - return string.replace("&", "&").replace("<", "<"); - } - - public static String cleanQuote(String string) { - return string.replace("\"", """); - } - - public static String unquote(String string) { - return string.replaceAll("\"", "\u200B\u2033"); - } - - public static List harvestTags(String source) { - List result = new ArrayList<>(); - int index = source.indexOf(" currentTags = new ArrayList<>(); - while (index >= 0) { - String start = source.substring(0, index); - String rest = source.substring(index + 1); - int end = rest.indexOf('>'); - String tag = '<' + rest.substring(0, end) + ">"; - currentTags.add(tag); - source = start + "[[" + tagNumber++ + "]]" + rest.substring(end + 1); - index = source.indexOf(" newContent = new Vector<>(); - List content = tuv.getChild("seg").getContent(); - Iterator it = content.iterator(); - int tag = 1; - while (it.hasNext()) { - XMLNode node = it.next(); - if (node.getNodeType() == XMLNode.TEXT_NODE) { - newContent.add(node); - } - if (node.getNodeType() == XMLNode.ELEMENT_NODE) { - Element e = (Element) node; - if ("ph".equals(e.getName())) { - Element ph = new Element("ph"); - tag++; - ph.setAttribute("id", "ph" + tag); - ph.setAttribute("dataRef", "ph" + tag); - newContent.add(ph); - tags.put("ph" + tag, e.getText()); - } - if ("bpt".equals(e.getName())) { - Element sc = new Element("sc"); - tag++; - sc.setAttribute("id", e.getAttributeValue("i")); - sc.setAttribute("dataRef", "sc" + tag); - newContent.add(sc); - tags.put("sc" + tag, e.getText()); - } - if ("ept".equals(e.getName())) { - Element ec = new Element("ec"); - tag++; - ec.setAttribute("startRef", e.getAttributeValue("i")); - newContent.add(ec); - tags.put("sc" + tag, e.getText()); - } - } - } - xliff.setContent(newContent); - return xliff; - } - - public static Element toTu(String key, Element source, Element target, Map tags) { - String creationDate = TMUtils.creationDate(); - Element tu = new Element("tu"); - tu.setAttribute("tuid", key); - tu.setAttribute("creationtool", Constants.APPNAME); - tu.setAttribute("creationtoolversion", Constants.VERSION); - tu.setAttribute("creationdate", creationDate); - Element tuv = new Element("tuv"); - tuv.setAttribute("xml:lang", source.getAttributeValue("xml:lang")); - tuv.setAttribute("creationdate", creationDate); - tu.addContent(tuv); - Element seg = new Element("seg"); - seg.setContent(toTmx(source, tags)); - tuv.addContent(seg); - - tuv = new Element("tuv"); - tuv.setAttribute("xml:lang", target.getAttributeValue("xml:lang")); - tuv.setAttribute("creationdate", creationDate); - tu.addContent(tuv); - seg = new Element("seg"); - seg.setContent(toTmx(target, tags)); - tuv.addContent(seg); - return tu; - } - - private static List toTmx(Element element, Map tags) { - List result = new Vector<>(); - List content = element.getContent(); - Iterator it = content.iterator(); - while (it.hasNext()) { - XMLNode node = it.next(); - if (node.getNodeType() == XMLNode.TEXT_NODE) { - result.add(node); - } - if (node.getNodeType() == XMLNode.ELEMENT_NODE) { - Element e = (Element) node; - if ("ph".equals(e.getName())) { - Element ph = new Element("ph"); - String id = e.getAttributeValue("id"); - ph.setAttribute("x", id); - if (tags.containsKey(id)) { - ph.setText(tags.get(id)); - } - result.add(ph); - } - if ("pc".equals(e.getName())) { - Element head = new Element("ph"); - head.setText(""); - result.add(head); - result.addAll(e.getContent()); - Element tail = new Element("ph"); - tail.setText(""); - result.add(tail); - } - if ("mrk".equals(e.getName())) { - result.addAll(e.getContent()); - } - } - } - return result; - } - - public static JSONObject getProjectDetails(File xliffFile) throws IOException { - try { - JSONObject result = new JSONObject(); - if (builder == null) { - builder = new SAXBuilder(); - } - Document doc = builder.build(xliffFile); - Element xliff = doc.getRootElement(); - if (!"xliff".equals(xliff.getName())) { - throw new IOException(NOTXLIFF); - } - if (!"2.0".equals(xliff.getAttributeValue("version"))) { - throw new IOException(NOTSWORDFISH); - } - JSONArray filesArray = new JSONArray(); - List files = xliff.getChildren("file"); - Iterator it = files.iterator(); - while (it.hasNext()) { - Element file = it.next(); - JSONObject fileObject = new JSONObject(); - fileObject.put("file", file.getAttributeValue("original")); - Element skeleton = file.getChild("skeleton"); - if (skeleton == null) { - throw new IOException(NOTSWORDFISH); - } - if (!skeleton.getAttributeValue("href").isEmpty()) { - throw new IOException(NOTSWORDFISH); - } - Element metadata = file.getChild("mda:metadata"); - if (metadata == null) { - throw new IOException(NOTSWORDFISH); - } - boolean isOpenXLIFF = false; - List groups = metadata.getChildren("mda:metaGroup"); - Iterator gt = groups.iterator(); - while (gt.hasNext()) { - Element group = gt.next(); - if ("tool".equals(group.getAttributeValue("category"))) { - List metaList = group.getChildren("mda:meta"); - Iterator mt = metaList.iterator(); - while (mt.hasNext()) { - Element meta = mt.next(); - if ("tool-id".equals(meta.getAttributeValue("type"))) { - isOpenXLIFF = com.maxprograms.converters.Constants.TOOLID.equals(meta.getText()); - } - } - } - if ("format".equals(group.getAttributeValue("category"))) { - List metaList = group.getChildren("mda:meta"); - Iterator mt = metaList.iterator(); - while (mt.hasNext()) { - Element meta = mt.next(); - if ("datatype".equals(meta.getAttributeValue("type"))) { - fileObject.put("type", FileFormats.getFullName(meta.getText())); - } - } - } - if ("PI".equals(group.getAttributeValue("category"))) { - List metaList = group.getChildren("mda:meta"); - Iterator mt = metaList.iterator(); - while (mt.hasNext()) { - Element meta = mt.next(); - if ("encoding".equals(meta.getAttributeValue("type"))) { - fileObject.put("encoding", meta.getText()); - } - } - } - } - if (!isOpenXLIFF) { - throw new IOException(NOTSWORDFISH); - } - filesArray.put(fileObject); - } - result.put("sourceLang", xliff.getAttributeValue("srcLang")); - result.put("targetLang", xliff.getAttributeValue("trgLang")); - result.put("files", filesArray); - return result; - } catch (SAXException | ParserConfigurationException e) { - throw new IOException(NOTXLIFF); - } - } - - public static String makeSVG(int percentage) { - double width = percentage * 0.70; - return "" - + "" + percentage - + "%"; - } - - public static String clearHTML(String text) { - int index = text.indexOf("', index + 1); - text = start + text.substring(end + 1); - index = text.indexOf("", ""); - index = text.indexOf("', index + 1); - text = start + text.substring(end + 1); - index = text.indexOf("", ""); - } - - public static String pureText(Element e) { - StringBuilder string = new StringBuilder(); - List content = e.getContent(); - Iterator it = content.iterator(); - while (it.hasNext()) { - XMLNode n = it.next(); - if (n.getNodeType() == XMLNode.TEXT_NODE) { - TextNode t = (TextNode) n; - string.append(t.getText()); - } - if (n.getNodeType() == XMLNode.ELEMENT_NODE) { - Element el = (Element) n; - if ("mrk".equals(el.getName()) || "pc".equals(el.getName())) { - string.append(pureText(el)); - } - } - } - return string.toString(); - } - - public static Element buildElement(String string) throws SAXException, IOException, ParserConfigurationException { - if (builder == null) { - builder = new SAXBuilder(); - } - Document doc = builder.build(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8))); - return doc.getRootElement(); - } + public static final String STYLE = "class='highlighted'"; + private static final String NOTXLIFF = "Selected file is not an XLIFF document"; + private static final String NOTSWORDFISH = "Selected file is not a Swordfish project"; + private static int maxTag = 0; + private static JSONObject tags; + private static SAXBuilder builder; + + private XliffUtils() { + // empty for security + } + + public static String highlight(String string, String target, boolean caseSensitive) { + String result = string; + int start = -1; + String replacement = "" + target + ""; + if (caseSensitive) { + start = result.indexOf(target); + } else { + start = result.toLowerCase().indexOf(target.toLowerCase()); + replacement = "" + result.substring(start, start + target.length()) + ""; + } + while (start != -1) { + result = result.substring(0, start) + replacement + result.substring(start + target.length()); + start = start + replacement.length(); + if (caseSensitive) { + start = result.indexOf(target, start); + } else { + start = result.toLowerCase().indexOf(target.toLowerCase(), start); + if (start != -1) { + replacement = "" + result.substring(start, start + target.length()) + ""; + } + } + } + return result; + } + + public static String highlightSpaces(String text) { + StringBuilder start = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + if (!isSpace(c)) { + break; + } + start.append(c); + } + if (start.length() > 0) { + text = "" + start.toString() + "" + text.substring(start.length()); + } + StringBuilder end = new StringBuilder(); + for (int i = text.length() - 1; i >= 0; i--) { + char c = text.charAt(i); + if (!isSpace(c)) { + break; + } + end.append(c); + } + if (end.length() > 0) { + text = text.substring(0, text.length() - end.length()) + "" + end.toString() + + ""; + } + return text; + } + + public static boolean isSpace(char c) { + if (c == '\u00A0') { + return true; + } + return Character.isWhitespace(c); + } + + public static void checkSVG(int tag) throws IOException { + if (tag <= maxTag) { + return; + } + File folder = new File(TmsServer.getWorkFolder(), "images"); + if (!folder.exists()) { + Files.createDirectories(folder.toPath()); + } + File f = new File(folder, tag + ".svg"); + if (!f.exists()) { + int width = 16; + if (tag >= 10) { + width = 22; + } + if (tag >= 100) { + width = 28; + } + String svg = "" + + "" + + "" + + "\n" + + "" + tag + ""; + try (FileOutputStream out = new FileOutputStream(f)) { + out.write(svg.getBytes(StandardCharsets.UTF_8)); + } + maxTag = tag; + } + } + + public static String cleanAngles(String string) { + String res = string.replace("&", "&"); + res = res.replace("<", "\u200B\u2039"); + res = res.replace(">", "\u200B\u203A"); + return res; + } + + public static String getHeader(Element e) { + StringBuilder result = new StringBuilder(); + result.append('<'); + result.append(e.getName()); + List atts = e.getAttributes(); + Iterator it = atts.iterator(); + while (it.hasNext()) { + Attribute a = it.next(); + result.append(' '); + result.append(a.getName()); + result.append("=\""); + result.append(unquote(cleanString(a.getValue()))); + result.append("\""); + } + result.append('>'); + return result.toString(); + } + + public static String getTail(Element e) { + return ""; + } + + public static String cleanString(String string) { + return string.replace("&", "&").replace("<", "<"); + } + + public static String cleanQuote(String string) { + return string.replace("\"", """); + } + + public static String unquote(String string) { + return string.replaceAll("\"", "\u200B\u2033"); + } + + public static List harvestTags(String source) { + List result = new ArrayList<>(); + int index = source.indexOf(" currentTags = new ArrayList<>(); + while (index >= 0) { + String start = source.substring(0, index); + String rest = source.substring(index + 1); + int end = rest.indexOf('>'); + String tag = '<' + rest.substring(0, end) + ">"; + currentTags.add(tag); + source = start + "[[" + tagNumber++ + "]]" + rest.substring(end + 1); + index = source.indexOf(" newContent = new Vector<>(); + List content = tuv.getChild("seg").getContent(); + Iterator it = content.iterator(); + int tag = 0; + while (it.hasNext()) { + XMLNode node = it.next(); + if (node.getNodeType() == XMLNode.TEXT_NODE) { + newContent.add(node); + } + if (node.getNodeType() == XMLNode.ELEMENT_NODE) { + Element e = (Element) node; + if ("ph".equals(e.getName())) { + Element ph = new Element("ph"); + tag++; + ph.setAttribute("id", segId + "_" + match + "_ph" + tag); + ph.setAttribute("dataRef", segId + "_" + match + "_ph" + tag); + newContent.add(ph); + tags.put(segId + "_" + match + "_ph" + tag, e.getText()); + } + if ("bpt".equals(e.getName())) { + Element sc = new Element("sc"); + tag++; + sc.setAttribute("id", segId + "_" + match + "_sc" + tag); + sc.setAttribute("dataRef", segId + "_" + match + "_sc" + tag); + newContent.add(sc); + tags.put(segId + "_" + match + "_sc" + tag, e.getText()); + } + if ("ept".equals(e.getName())) { + Element ec = new Element("ec"); + tag++; + ec.setAttribute("id", segId + "_" + match + "_ec" + tag); + ec.setAttribute("dataRef", segId + "_" + match + "_ec" + tag); + newContent.add(ec); + tags.put(segId + "_" + match + "_ec" + tag, e.getText()); + } + } + } + xliff.setContent(newContent); + return xliff; + } + + public static Element toTu(String key, Element source, Element target, Map tags) { + String creationDate = TMUtils.creationDate(); + Element tu = new Element("tu"); + tu.setAttribute("tuid", key); + tu.setAttribute("creationtool", Constants.APPNAME); + tu.setAttribute("creationtoolversion", Constants.VERSION); + tu.setAttribute("creationdate", creationDate); + Element tuv = new Element("tuv"); + tuv.setAttribute("xml:lang", source.getAttributeValue("xml:lang")); + tuv.setAttribute("creationdate", creationDate); + tu.addContent(tuv); + Element seg = new Element("seg"); + seg.setContent(toTmx(source, tags)); + tuv.addContent(seg); + + tuv = new Element("tuv"); + tuv.setAttribute("xml:lang", target.getAttributeValue("xml:lang")); + tuv.setAttribute("creationdate", creationDate); + tu.addContent(tuv); + seg = new Element("seg"); + seg.setContent(toTmx(target, tags)); + tuv.addContent(seg); + return tu; + } + + private static List toTmx(Element element, Map tags) { + List result = new Vector<>(); + List content = element.getContent(); + Iterator it = content.iterator(); + while (it.hasNext()) { + XMLNode node = it.next(); + if (node.getNodeType() == XMLNode.TEXT_NODE) { + result.add(node); + } + if (node.getNodeType() == XMLNode.ELEMENT_NODE) { + Element e = (Element) node; + if ("ph".equals(e.getName())) { + Element ph = new Element("ph"); + String id = e.getAttributeValue("id"); + ph.setAttribute("x", id); + if (tags.containsKey(id)) { + ph.setText(tags.get(id)); + } + result.add(ph); + } + if ("pc".equals(e.getName())) { + Element head = new Element("ph"); + head.setText(""); + result.add(head); + result.addAll(e.getContent()); + Element tail = new Element("ph"); + tail.setText(""); + result.add(tail); + } + if ("mrk".equals(e.getName())) { + result.addAll(e.getContent()); + } + } + } + return result; + } + + public static JSONObject getProjectDetails(File xliffFile) throws IOException { + try { + JSONObject result = new JSONObject(); + if (builder == null) { + builder = new SAXBuilder(); + } + Document doc = builder.build(xliffFile); + Element xliff = doc.getRootElement(); + if (!"xliff".equals(xliff.getName())) { + throw new IOException(NOTXLIFF); + } + if (!"2.0".equals(xliff.getAttributeValue("version"))) { + throw new IOException(NOTSWORDFISH); + } + JSONArray filesArray = new JSONArray(); + List files = xliff.getChildren("file"); + Iterator it = files.iterator(); + while (it.hasNext()) { + Element file = it.next(); + JSONObject fileObject = new JSONObject(); + fileObject.put("file", file.getAttributeValue("original")); + Element skeleton = file.getChild("skeleton"); + if (skeleton == null) { + throw new IOException(NOTSWORDFISH); + } + if (!skeleton.getAttributeValue("href").isEmpty()) { + throw new IOException(NOTSWORDFISH); + } + Element metadata = file.getChild("mda:metadata"); + if (metadata == null) { + throw new IOException(NOTSWORDFISH); + } + boolean isOpenXLIFF = false; + List groups = metadata.getChildren("mda:metaGroup"); + Iterator gt = groups.iterator(); + while (gt.hasNext()) { + Element group = gt.next(); + if ("tool".equals(group.getAttributeValue("category"))) { + List metaList = group.getChildren("mda:meta"); + Iterator mt = metaList.iterator(); + while (mt.hasNext()) { + Element meta = mt.next(); + if ("tool-id".equals(meta.getAttributeValue("type"))) { + isOpenXLIFF = com.maxprograms.converters.Constants.TOOLID.equals(meta.getText()); + } + } + } + if ("format".equals(group.getAttributeValue("category"))) { + List metaList = group.getChildren("mda:meta"); + Iterator mt = metaList.iterator(); + while (mt.hasNext()) { + Element meta = mt.next(); + if ("datatype".equals(meta.getAttributeValue("type"))) { + fileObject.put("type", FileFormats.getFullName(meta.getText())); + } + } + } + if ("PI".equals(group.getAttributeValue("category"))) { + List metaList = group.getChildren("mda:meta"); + Iterator mt = metaList.iterator(); + while (mt.hasNext()) { + Element meta = mt.next(); + if ("encoding".equals(meta.getAttributeValue("type"))) { + fileObject.put("encoding", meta.getText()); + } + } + } + } + if (!isOpenXLIFF) { + throw new IOException(NOTSWORDFISH); + } + filesArray.put(fileObject); + } + result.put("sourceLang", xliff.getAttributeValue("srcLang")); + result.put("targetLang", xliff.getAttributeValue("trgLang")); + result.put("files", filesArray); + return result; + } catch (SAXException | ParserConfigurationException e) { + throw new IOException(NOTXLIFF); + } + } + + public static String makeSVG(int percentage) { + double width = percentage * 0.70; + return "" + + "" + percentage + + "%"; + } + + public static String clearHTML(String text) { + int index = text.indexOf("', index + 1); + text = start + text.substring(end + 1); + index = text.indexOf("", ""); + index = text.indexOf("', index + 1); + text = start + text.substring(end + 1); + index = text.indexOf("", ""); + } + + public static String pureText(Element e) { + StringBuilder string = new StringBuilder(); + List content = e.getContent(); + Iterator it = content.iterator(); + while (it.hasNext()) { + XMLNode n = it.next(); + if (n.getNodeType() == XMLNode.TEXT_NODE) { + TextNode t = (TextNode) n; + string.append(t.getText()); + } + if (n.getNodeType() == XMLNode.ELEMENT_NODE) { + Element el = (Element) n; + if ("mrk".equals(el.getName()) || "pc".equals(el.getName())) { + string.append(pureText(el)); + } + } + } + return string.toString(); + } + + public static Element buildElement(String string) throws SAXException, IOException, ParserConfigurationException { + if (builder == null) { + builder = new SAXBuilder(); + } + Document doc = builder.build(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8))); + return doc.getRootElement(); + } } \ No newline at end of file diff --git a/swordfish.pdf b/swordfish.pdf index caf41a613e1b53224fa17f660895899fca8d0f42..330d739916d0e8f0e5add49abc5a382fb2fe1174 100644 GIT binary patch delta 29641 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 delta 29712 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 az|Ql4kEes9045WtnF%aduwtFD!2bc4Vp~@L diff --git a/ts/App.ts b/ts/App.ts index 1b8b7c2..61949f8 100644 --- a/ts/App.ts +++ b/ts/App.ts @@ -138,6 +138,8 @@ class Swordfish { static htmlTitle: string; static htmlId: number; + static clipboardContent = ''; + stopping: boolean = false; static SUCCESS: string = 'Success'; @@ -167,6 +169,10 @@ class Swordfish { } } + if (process.platform === 'darwin' && process.arch === 'arm64') { + Swordfish.verticalPadding = 56; + } + if (process.platform === 'win32') { this.javapath = Swordfish.path.join(app.getAppPath(), 'bin', 'java.exe'); Swordfish.verticalPadding = 56; @@ -236,7 +242,7 @@ class Swordfish { if (Swordfish.currentPreferences.showGuide) { Swordfish.showGettingStarted(); } - + }); }); @@ -863,10 +869,13 @@ class Swordfish { ipcMain.on('show-getting-started', (event: IpcMainEvent, arg: any) => { Swordfish.currentPreferences.showGuide = arg.showGuide; Swordfish.savePreferences(Swordfish.currentPreferences); - }) + }); ipcMain.on('get-show guide', (event: IpcMainEvent) => { event.sender.send('set-show guide', { showGuide: Swordfish.currentPreferences.showGuide }); }); + ipcMain.on('set-selection', (event: IpcMainEvent, arg: any) => { + Swordfish.clipboardContent = arg; + }); } // end constructor static createWindow(): void { @@ -930,9 +939,9 @@ class Swordfish { let editMenu: Menu = Menu.buildFromTemplate([ { label: 'Undo', accelerator: 'CmdOrCtrl+Z', click: () => { Swordfish.mainWindow.webContents.undo(); } }, new MenuItem({ type: 'separator' }), - { label: 'Cut', accelerator: 'CmdOrCtrl+X', click: () => { Swordfish.mainWindow.webContents.cut(); } }, - { label: 'Copy', accelerator: 'CmdOrCtrl+C', click: () => { Swordfish.mainWindow.webContents.copy(); } }, - { label: 'Paste', accelerator: 'CmdOrCtrl+V', click: () => { Swordfish.mainWindow.webContents.paste(); } }, + { label: 'Cut', accelerator: 'CmdOrCtrl+X', click: () => { Swordfish.cut(); } }, + { label: 'Copy', accelerator: 'CmdOrCtrl+C', click: () => { Swordfish.copy(); } }, + { label: 'Paste', accelerator: 'CmdOrCtrl+V', click: () => { Swordfish.paste(); } }, { label: 'Select All', accelerator: 'CmdOrCtrl+A', click: () => { Swordfish.mainWindow.webContents.selectAll(); } }, new MenuItem({ type: 'separator' }), { label: 'Edit Previous Segment', accelerator: 'PageUp', click: () => { Swordfish.mainWindow.webContents.send('previous-segment'); } }, @@ -1003,8 +1012,8 @@ class Swordfish { { label: 'Project Statistics', click: () => { Swordfish.mainWindow.webContents.send('request-statistics'); } }, { label: 'Export HTML', accelerator: 'F5', click: () => { Swordfish.mainWindow.webContents.send('export-html'); } }, new MenuItem({ type: 'separator' }), - { label: 'Import XLIFF File as Project', click: () => { Swordfish.showImportXliff(); } }, - { label: 'Export Project as XLIFF File', click: () => { Swordfish.mainWindow.webContents.send('export-project'); } } + { label: 'Import Project', click: () => { Swordfish.showImportXliff(); } }, + { label: 'Export Project', click: () => { Swordfish.mainWindow.webContents.send('export-project'); } } ]); let memoriesMenu: Menu = Menu.buildFromTemplate([ { label: 'Add Memory', click: () => { Swordfish.showAddMemory(); } }, @@ -2044,11 +2053,14 @@ class Swordfish { if (app.getVersion() !== parsedData.version) { Swordfish.latestVersion = parsedData.version; switch (process.platform) { - case 'darwin': Swordfish.downloadLink = parsedData.darwin; + case 'darwin': + Swordfish.downloadLink = process.arch === 'arm64' ? parsedData.arm64 : parsedData.darwin; break; - case 'win32': Swordfish.downloadLink = parsedData.win32; + case 'win32': + Swordfish.downloadLink = parsedData.win32; break; - case 'linux': Swordfish.downloadLink = parsedData.linux; + case 'linux': + Swordfish.downloadLink = parsedData.linux; break; } Swordfish.updatesWindow = new BrowserWindow({ @@ -3228,7 +3240,7 @@ class Swordfish { static browseXLIFF(event: IpcMainEvent): void { dialog.showOpenDialog({ - title: 'Import XLIFF File', + title: 'Import Project File', properties: ['openFile'], filters: [ { name: 'XLIFF File', extensions: ['xlf'] }, @@ -4569,6 +4581,23 @@ class Swordfish { Swordfish.gettingStartedWindow.show(); }); } + + static cut(): void { + Swordfish.mainWindow.webContents.cut(); + Swordfish.mainWindow.webContents.send('get-selection'); + } + + static copy(): void { + Swordfish.mainWindow.webContents.copy(); + Swordfish.mainWindow.webContents.send('get-selection'); + } + + static paste(): void { + if (Swordfish.clipboardContent !== clipboard.readText()) { + clipboard.writeText(clipboard.readText()); + } + Swordfish.mainWindow.webContents.paste(); + } } new Swordfish(); \ No newline at end of file diff --git a/ts/Main.ts b/ts/Main.ts index 45166f1..f519c12 100644 --- a/ts/Main.ts +++ b/ts/Main.ts @@ -61,7 +61,7 @@ class Main { Main.tabHolder.selectTab('projects'); - let observerOptions = { + let observerOptions: MutationObserverInit = { childList: true, attributes: false } @@ -375,7 +375,7 @@ class Main { }); Main.electron.ipcRenderer.on('notes-closed', () => { this.notesClosed(); - }); + }); Main.electron.ipcRenderer.on('notes-removed', (event: Electron.IpcRendererEvent, arg: any) => { this.notesRemoved(arg); }); @@ -385,7 +385,10 @@ class Main { Main.electron.ipcRenderer.on('edit-source', () => { this.editSource(); }); - let config: any = { attributes: true, childList: false, subtree: false }; + Main.electron.ipcRenderer.on('get-selection', () => { + Main.electron.ipcRenderer.send('set-selection', window.getSelection().toString()) + }); + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -994,14 +997,14 @@ class Main { } } - setErrors(arg:any): void { + setErrors(arg: any): void { let selected = Main.tabHolder.getSelected(); if (Main.translationViews.has(selected)) { Main.translationViews.get(selected).setErrors(arg); } } - clearErrors(arg:any): void { + clearErrors(arg: any): void { let selected = Main.tabHolder.getSelected(); if (Main.translationViews.has(selected)) { Main.translationViews.get(selected).clearErrors(arg); diff --git a/ts/addProject.ts b/ts/addProject.ts index 3b76221..4964f72 100644 --- a/ts/addProject.ts +++ b/ts/addProject.ts @@ -217,7 +217,12 @@ class AddProject { td = document.createElement('td'); td.className = 'noWrap'; td.style.overflowX = 'hidden'; - td.innerText = file.file; + if (file.file.length > 50 && (file.file.indexOf('/') != -1 || file.file.indexOf('\\') != -1)) { + td.innerText = file.file.substring(0, 10) + ' ... ' + file.file.substring(file.file.length - 35); + td.title = file.file; + } else { + td.innerText = file.file; + } tr.appendChild(td); td = document.createElement('td'); diff --git a/ts/browseDatabases.ts b/ts/browseDatabases.ts index 721606d..89346d6 100644 --- a/ts/browseDatabases.ts +++ b/ts/browseDatabases.ts @@ -17,14 +17,25 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ +class Database { + id: string; + name: string; + owner: string; + project: string; + subject: string; + client: string; + creationDate: string; + open: boolean; +} + class BrowseDatabases { electron = require('electron'); databases: any; - selected: Map; + selected: Map; constructor() { - this.selected = new Map(); + this.selected = new Map(); this.electron.ipcRenderer.send('get-theme'); this.electron.ipcRenderer.on('set-theme', (event: Electron.IpcRendererEvent, arg: any) => { (document.getElementById('theme') as HTMLLinkElement).href = arg; @@ -55,7 +66,7 @@ class BrowseDatabases { let tbody = document.getElementById('tbody') as HTMLTableSectionElement; let length = this.databases.memories.length; for (let i = 0; i < length; i++) { - let database: any = this.databases.memories[i]; + let database: Database = this.databases.memories[i]; let tr: HTMLTableRowElement = document.createElement('tr'); tr.addEventListener('click', (event: MouseEvent) => { this.clicked(event, database); @@ -98,7 +109,7 @@ class BrowseDatabases { }); } - clicked(event: MouseEvent, memory: any): void { + clicked(event: MouseEvent, memory: Database): void { let tr: HTMLTableRowElement = event.currentTarget as HTMLTableRowElement; let isSelected: boolean = this.selected.has(memory.id); if (!isSelected) { diff --git a/ts/divider.ts b/ts/divider.ts index 258c878..04fe9e9 100644 --- a/ts/divider.ts +++ b/ts/divider.ts @@ -50,7 +50,7 @@ class VerticalSplit { this.right.style.width = '50%'; parent.appendChild(this.right); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -149,7 +149,7 @@ class ThreeVerticalPanels { this.right.style.width = '33%'; parent.appendChild(this.right); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -249,7 +249,7 @@ class HorizontalSplit { this.bottom.style.height = '50%'; parent.appendChild(this.bottom); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { diff --git a/ts/glossaries.ts b/ts/glossaries.ts index 12296a4..af8b572 100644 --- a/ts/glossaries.ts +++ b/ts/glossaries.ts @@ -25,10 +25,10 @@ class GlossariesView { topBar: HTMLDivElement; tbody: HTMLTableSectionElement; tableContainer: HTMLDivElement; - selected: Map; + selected: Map; constructor(div: HTMLDivElement) { - this.selected = new Map(); + this.selected = new Map(); this.container = div; this.topBar = document.createElement('div'); this.topBar.className = 'toolbar'; @@ -144,7 +144,7 @@ class GlossariesView { watchSizes(): void { let targetNode: HTMLElement = document.getElementById('main'); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -202,11 +202,11 @@ class GlossariesView { this.electron.ipcRenderer.send('get-glossaries'); } - displayGlossaries(glossaries: any[]) { + displayGlossaries(glossaries: Memory[]) { this.tbody.innerHTML = ''; let length = glossaries.length; for (let i = 0; i < length; i++) { - let p = glossaries[i]; + let p: Memory = glossaries[i]; let tr: HTMLTableRowElement = document.createElement('tr'); tr.id = p.id; tr.addEventListener('click', (event: MouseEvent) => { @@ -261,7 +261,7 @@ class GlossariesView { this.selected.clear(); } - clicked(event: MouseEvent, glossary: any): void { + clicked(event: MouseEvent, glossary: Memory): void { let tr: HTMLTableRowElement = event.currentTarget as HTMLTableRowElement; let isSelected: boolean = this.selected.has(glossary.id); if (!isSelected) { diff --git a/ts/memories.ts b/ts/memories.ts index 69e46a1..d06ccbb 100644 --- a/ts/memories.ts +++ b/ts/memories.ts @@ -17,6 +17,19 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ +class Memory { + id: string; + name: string; + project: string; + subject: string; + client: string; + creationDate: number; + creationString: string; + type: string; + server: string; + user: string; +} + class MemoriesView { electron = require('electron'); @@ -25,10 +38,10 @@ class MemoriesView { topBar: HTMLDivElement; tableContainer: HTMLDivElement; tbody: HTMLTableSectionElement; - selected: Map; + selected: Map; constructor(div: HTMLDivElement) { - this.selected = new Map(); + this.selected = new Map(); this.container = div; this.topBar = document.createElement('div'); @@ -136,7 +149,7 @@ class MemoriesView { watchSizes(): void { let targetNode: HTMLElement = document.getElementById('main'); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -194,7 +207,7 @@ class MemoriesView { this.electron.ipcRenderer.send('export-memories', memories); } - displayMemories(memories: any[]) { + displayMemories(memories: Memory[]) { this.tbody.innerHTML = ''; let length = memories.length; for (let i = 0; i < length; i++) { @@ -253,7 +266,7 @@ class MemoriesView { this.selected.clear(); } - clicked(event: MouseEvent, memory: any): void { + clicked(event: MouseEvent, memory: Memory): void { let tr: HTMLTableRowElement = event.currentTarget as HTMLTableRowElement; let isSelected: boolean = this.selected.has(memory.id); if (!isSelected) { diff --git a/ts/mtMatches.ts b/ts/mtMatches.ts index 0ab84e7..8c1fbcc 100644 --- a/ts/mtMatches.ts +++ b/ts/mtMatches.ts @@ -25,12 +25,12 @@ class MtMatches { projectId: string; tabHolder: TabHolder; - matches: Map; + matches: Map; constructor(div: HTMLDivElement, projectId: string) { this.container = div; this.projectId = projectId; - this.matches = new Map(); + this.matches = new Map(); let tabContainer: HTMLDivElement = document.createElement('div'); tabContainer.classList.add('fill_width'); @@ -74,7 +74,7 @@ class MtMatches { this.acceptTranslation(); }); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -90,7 +90,7 @@ class MtMatches { this.matches.clear(); } - add(match: any) { + add(match: Match) { this.matches.set(match.matchId, match); let tab = new Tab(match.matchId, match.origin, false); @@ -112,7 +112,7 @@ class MtMatches { return; } let selected: string = this.tabHolder.getSelected(); - let match: any = this.matches.get(selected); + let match: Match = this.matches.get(selected); this.electron.ipcRenderer.send('accept-match', match); } diff --git a/ts/projects.ts b/ts/projects.ts index 8e756f5..b864d6d 100644 --- a/ts/projects.ts +++ b/ts/projects.ts @@ -17,6 +17,28 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ +class SourceFile { + file: string; + type: string; + encoding: string; +} + +class Project { + id: string; + description: string; + status: string; + sourceLang: string; + targetLang: string; + client: string; + subject: string; + creationDate: string; + files: SourceFile[]; + xliff: string; + memory: string; + glossary: string; + svg: string; +} + class ProjectsView { electron = require('electron'); @@ -26,11 +48,11 @@ class ProjectsView { tableContainer: HTMLDivElement; tbody: HTMLTableSectionElement; - selected: Map; + selected: Map; shouldOpen: string; constructor(div: HTMLDivElement) { - this.selected = new Map(); + this.selected = new Map(); this.shouldOpen = ''; this.container = div; @@ -106,7 +128,7 @@ class ProjectsView { let importButton = document.createElement('a'); importButton.innerHTML = '' + - 'Import XLIFF File as Project'; + 'Import Project'; importButton.className = 'tooltip'; importButton.addEventListener('click', () => { this.electron.ipcRenderer.send('import-xliff'); @@ -116,7 +138,7 @@ class ProjectsView { let exportButton = document.createElement('a'); exportButton.innerHTML = '' + - 'Export Project as XLIFF File'; + 'Export Project'; exportButton.className = 'tooltip'; exportButton.addEventListener('click', () => { this.exportProject(); @@ -175,7 +197,7 @@ class ProjectsView { watchSizes(): void { let targetNode: HTMLElement = document.getElementById('main'); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -296,7 +318,7 @@ class ProjectsView { return; } for (let key of this.selected.keys()) { - let project = this.selected.get(key); + let project: Project = this.selected.get(key); this.electron.ipcRenderer.send('export-xliff', { projectId: key, description: project.description }); } } @@ -311,17 +333,17 @@ class ProjectsView { return; } for (let key of this.selected.keys()) { - let project = this.selected.get(key); + let project: Project = this.selected.get(key); this.electron.ipcRenderer.send('export-tmx-file', { projectId: key, description: project.description }); } } - displayProjects(projects: any[]) { + displayProjects(projects: Project[]) { this.selected.clear(); this.tbody.innerHTML = ''; let length = projects.length; for (let i = 0; i < length; i++) { - let p = projects[i]; + let p: Project = projects[i]; let tr = document.createElement('tr'); tr.id = p.id; tr.addEventListener('click', (event: MouseEvent) => { @@ -337,7 +359,12 @@ class ProjectsView { let td = document.createElement('td'); td.classList.add('list'); - td.innerText = p.description; + if (p.description.length > 90 && (p.description.indexOf('/') != -1 || p.description.indexOf('\\') != -1)) { + td.innerText = p.description.substring(0, 30) + ' ... ' + p.description.substring(p.description.length - 50); + td.title = p.description; + } else { + td.innerText = p.description; + } tr.append(td); td = document.createElement('td'); @@ -387,7 +414,7 @@ class ProjectsView { } } - dblclicked(event: MouseEvent, project: any): void { + dblclicked(event: MouseEvent, project: Project): void { for (let key of this.selected.keys()) { document.getElementById(key).classList.remove('selected'); } @@ -396,7 +423,7 @@ class ProjectsView { this.openProjects(); } - clicked(event: MouseEvent, project: any): void { + clicked(event: MouseEvent, project: Project): void { let tr: HTMLTableRowElement = event.currentTarget as HTMLTableRowElement; let isSelected: boolean = this.selected.has(project.id); if (!isSelected) { @@ -451,7 +478,7 @@ class ProjectsView { return; } for (let key of this.selected.keys()) { - let project = this.selected.get(key); + let project: Project = this.selected.get(key); this.electron.ipcRenderer.send('show-apply-tm', { project: key, memory: project.memory }); } } diff --git a/ts/tabs.ts b/ts/tabs.ts index 1d655f4..e31a59a 100644 --- a/ts/tabs.ts +++ b/ts/tabs.ts @@ -36,7 +36,7 @@ class Tab { this.label.id = this.id; if (description.length > 40) { this.label.title = description; - this.label.innerText = description.substr(0, 37) + '...'; + this.label.innerText = '...' + description.substr(description.length - 37); } else { this.label.innerText = description; } @@ -46,8 +46,8 @@ class Tab { this.labelDiv.appendChild(this.label); if (closeable) { let closeAnchor: HTMLAnchorElement = document.createElement('a'); - closeAnchor.innerHTML = ''; - closeAnchor.style.marginLeft = '10px'; + closeAnchor.innerHTML = ''; + closeAnchor.style.marginLeft = '8px'; closeAnchor.addEventListener('click', () => { this.parent.closeTab(this.id); }); diff --git a/ts/termsPanel.ts b/ts/termsPanel.ts index 8af23d4..3cabf4d 100644 --- a/ts/termsPanel.ts +++ b/ts/termsPanel.ts @@ -17,15 +17,23 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ +class Term { + srcLang: string; + tgtLang: string; + source: string; + target: string; + origin: string; +} + class TermsPanel { electron = require('electron'); container: HTMLDivElement; projectId: string; - selected: any; + selected: Term; selectedIndex: number = 0; - terms: any[] = []; + terms: Term[] = []; rows: HTMLTableRowElement[] = []; table: HTMLTableElement; @@ -63,7 +71,7 @@ class TermsPanel { this.originSpan.style.marginTop = '4px'; toolbar.appendChild(this.originSpan); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -93,7 +101,7 @@ class TermsPanel { return ''; } - setTerms(terms: any[]): void { + setTerms(terms: Term[]): void { if (terms.length === 0) { this.clear(); return; @@ -103,7 +111,7 @@ class TermsPanel { let length: number = terms.length; this.rows = []; for (let i: number = 0; i < length; i++) { - let term: any = terms[i]; + let term: Term = terms[i]; let row: HTMLTableRowElement = document.createElement('tr'); row.addEventListener('click', () => { this.selected = term; @@ -129,7 +137,7 @@ class TermsPanel { source.style.width = '49%'; source.classList.add('initial') if (TranslationView.isBiDi(term.srcLang)) { - source.dir='rtl'; + source.dir = 'rtl'; } row.appendChild(source); @@ -137,7 +145,7 @@ class TermsPanel { target.innerText = term.target; target.style.width = '49%'; if (TranslationView.isBiDi(term.tgtLang)) { - target.dir='rtl'; + target.dir = 'rtl'; } row.appendChild(target); diff --git a/ts/tmMatches.ts b/ts/tmMatches.ts index fee7a94..ab7a3f6 100644 --- a/ts/tmMatches.ts +++ b/ts/tmMatches.ts @@ -17,6 +17,16 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ +class Match { + matchId: string; + similarity: number; + srcLang: string; + tgtLang: string; + source: string; + target: string; + origin: string; +} + class TmMatches { electron = require('electron'); @@ -25,13 +35,13 @@ class TmMatches { projectId: string; tabHolder: TabHolder; - matches: Map; + matches: Map; origin: HTMLSpanElement; constructor(div: HTMLDivElement, projectId: string) { this.container = div; this.projectId = projectId; - this.matches = new Map(); + this.matches = new Map(); let tabContainer: HTMLDivElement = document.createElement('div'); tabContainer.classList.add('fill_width'); @@ -72,7 +82,7 @@ class TmMatches { this.acceptTranslation(); }); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -89,7 +99,7 @@ class TmMatches { this.matches.clear(); } - add(match: any) { + add(match: Match) { this.matches.set(match.matchId, match); let tab = new Tab(match.matchId, match.similarity + '%', false); @@ -137,7 +147,7 @@ class TmMatches { this.origin.innerText = match.origin; }); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -158,21 +168,21 @@ class TmMatches { return; } let selected: string = this.tabHolder.getSelected(); - let match: any = this.matches.get(selected); + let match: Match = this.matches.get(selected); this.electron.ipcRenderer.send('accept-match', match); } nextMatch(): void { this.tabHolder.selectNext(); let selected: string = this.tabHolder.getSelected(); - let match: any = this.matches.get(selected); + let match: Match = this.matches.get(selected); this.origin.innerText = match.origin; } previousMatch(): void { this.tabHolder.selectPrevious(); let selected: string = this.tabHolder.getSelected(); - let match: any = this.matches.get(selected); + let match: Match = this.matches.get(selected); this.origin.innerText = match.origin; } } \ No newline at end of file diff --git a/ts/translation.ts b/ts/translation.ts index 1ca3f11..7e6328b 100644 --- a/ts/translation.ts +++ b/ts/translation.ts @@ -17,6 +17,29 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ +class SegmentId { + file: string; + unit: string; + id: string; + +} + +class Segment { + index: number; + file: string; + unit: string; + segment: string; + state: string; + translate: boolean; + preserve: boolean; + source: string; + target: string; + match: number; + hasNotes: boolean; + tagErrors: boolean; + spaceErrors: boolean; +} + class TranslationView { electron = require('electron'); @@ -75,7 +98,7 @@ class TranslationView { currentState: HTMLTableCellElement; currentTranslate: HTMLTableCellElement; currentContent: string; - currentId: any = {}; + currentId: SegmentId = { id: '', file: '', unit: '' }; sourceTags: Map; filterButton: HTMLAnchorElement; @@ -600,7 +623,7 @@ class TranslationView { watchSizes(): void { let targetNode: HTMLDivElement = document.getElementById('main') as HTMLDivElement; - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; this.observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -819,7 +842,7 @@ class TranslationView { this.statistics.classList.add('stats'); this.statusArea.appendChild(this.statistics); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; this.rowsObserver = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -881,7 +904,7 @@ class TranslationView { this.memoryArea.appendChild(matchesContainer); this.tmMatches = new TmMatches(matchesContainer, this.projectId); - let config: any = { attributes: true, childList: false, subtree: false }; + let config: MutationObserverInit = { attributes: true, childList: false, subtree: false }; let observer: MutationObserver = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'attributes') { @@ -934,7 +957,7 @@ class TranslationView { this.electron.ipcRenderer.send('generate-statistics', { project: this.projectId }); } - setSegments(arg: any[]): void { + setSegments(arg: Segment[]): void { this.tbody.innerHTML = ''; this.tbody.parentElement.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); let length: number = arg.length; @@ -945,7 +968,7 @@ class TranslationView { } let returnRow: HTMLTableRowElement; for (let i = 0; i < length; i++) { - let row: any = arg[i]; + let row: Segment = arg[i]; let tr: HTMLTableRowElement = document.createElement('tr'); tr.setAttribute('data-file', row.file); tr.setAttribute('data-unit', row.unit); @@ -961,7 +984,7 @@ class TranslationView { td.classList.add('middle'); td.classList.add('center'); td.classList.add('initial'); - td.innerText = row.index + 1; + td.innerText = '' + (row.index + 1); tr.appendChild(td); if (row.index + 1 === this.returnNumber) {

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