[Mulgara-svn] r1366 - in trunk: . jxdata/iTQL/fulltext_queries lib src/jar/resolver-lucene src/jar/resolver-lucene/java/org/mulgara/resolver/lucene

ronald at mulgara.org ronald at mulgara.org
Mon Oct 27 12:38:49 UTC 2008


Author: ronald
Date: 2008-10-27 05:38:48 -0700 (Mon, 27 Oct 2008)
New Revision: 1366

Added:
   trunk/jxdata/iTQL/fulltext_queries/queryResult17.txt
   trunk/jxdata/iTQL/fulltext_queries/queryResult18.txt
   trunk/jxdata/iTQL/fulltext_queries/queryResult19.txt
   trunk/lib/jakarta-regexp-1.5.jar
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraint.java
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraintDescriptor.java
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneTransformer.java
Modified:
   trunk/common.xml
   trunk/jxdata/iTQL/fulltext_queries/test.jxu
   trunk/src/jar/resolver-lucene/build.xml
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/FullTextStringIndexTuples.java
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolver.java
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverFactory.java
   trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java
Log:
Added support for returning the score in fulltext (lucene) queries.

For this a new query graph is introduced with two new predicates, mulgara:search
and mulgara:score . As an example, the query

  select $foo from ... where $foo <title> 'sequencing' in <lucene-graph>;

now becomes

  select $foo $score from ... where
      $foo <mulgara:search> $search in <lucene-graph> and
                            $search <title> 'sequencing' in <lucene-graph> and
                            $search <mulgara:score> $score  in <lucene-graph>;

The score is optional; also, the previous simple form is still recognized. This
query graph is extensible, e.g. to add query parameters such as the analyzer to
use.

Modified: trunk/common.xml
===================================================================
--- trunk/common.xml	2008-10-27 12:38:39 UTC (rev 1365)
+++ trunk/common.xml	2008-10-27 12:38:48 UTC (rev 1366)
@@ -477,7 +477,7 @@
                                             ${server-rmi.jar}"/>
         <fileset dir="${lib.dir}" includes="xerces*.jar, xmlParserAPIs.jar,
                                             xmlc-xerces.jar, jxunit*.jar,
-                                            junit.jar"/>
+                                            jakarta-regexp*.jar, junit.jar"/>
       </classpath>
 
       <test name="net.sourceforge.jxunit.JXTestCase" haltonfailure="no"

Added: trunk/jxdata/iTQL/fulltext_queries/queryResult17.txt
===================================================================
--- trunk/jxdata/iTQL/fulltext_queries/queryResult17.txt	                        (rev 0)
+++ trunk/jxdata/iTQL/fulltext_queries/queryResult17.txt	2008-10-27 12:38:48 UTC (rev 1366)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<answer xmlns="http://mulgara.org/tql#"><query><variables><pmid/><title/><score/></variables><solution><pmid resource="urn:pmid:11076292"/><title>[The role of immunohistochemical methods for determining the type of treatment and prognosis of tumoral diseases]</title><score datatype="http://www.w3.org/2001/XMLSchema#double">1.67</score></solution><solution><pmid resource="urn:pmid:11076294"/><title>[Ultrastructural phenotypes of tumor cells of endocrine-cellular neoplasms of hepatopancreatoduodenal organs and their role in determining the degree of malignancy and prognosis of these diseases]</title><score datatype="http://www.w3.org/2001/XMLSchema#double">1.38</score></solution></query></answer>


Property changes on: trunk/jxdata/iTQL/fulltext_queries/queryResult17.txt
___________________________________________________________________
Name: svn:keywords
   + Id HeadURL Revision
Name: svn:eol-style
   + native

Added: trunk/jxdata/iTQL/fulltext_queries/queryResult18.txt
===================================================================
--- trunk/jxdata/iTQL/fulltext_queries/queryResult18.txt	                        (rev 0)
+++ trunk/jxdata/iTQL/fulltext_queries/queryResult18.txt	2008-10-27 12:38:48 UTC (rev 1366)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<answer xmlns="http://mulgara.org/tql#"><query><variables><pmid/><title/><sc1/><sc2/></variables><solution><pmid resource="urn:pmid:11076292"/><title>[The role of immunohistochemical methods for determining the type of treatment and prognosis of tumoral diseases]</title><sc1 datatype="http://www.w3.org/2001/XMLSchema#double">1.67</sc1></solution><solution><pmid resource="urn:pmid:11076294"/><title>[Ultrastructural phenotypes of tumor cells of endocrine-cellular neoplasms of hepatopancreatoduodenal organs and their role in determining the degree of malignancy and prognosis of these diseases]</title><sc1 datatype="http://www.w3.org/2001/XMLSchema#double">1.38</sc1></solution><solution><pmid resource="urn:pmid:11244589"/><title>[Cholelithiasis in heart transplant patients]</title><sc2 datatype="http://www.w3.org/2001/XMLSchema#double">2.75</sc2></solution></query></answer>


Property changes on: trunk/jxdata/iTQL/fulltext_queries/queryResult18.txt
___________________________________________________________________
Name: svn:keywords
   + Id HeadURL Revision
Name: svn:eol-style
   + native

Added: trunk/jxdata/iTQL/fulltext_queries/queryResult19.txt
===================================================================
--- trunk/jxdata/iTQL/fulltext_queries/queryResult19.txt	                        (rev 0)
+++ trunk/jxdata/iTQL/fulltext_queries/queryResult19.txt	2008-10-27 12:38:48 UTC (rev 1366)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<answer xmlns="http://mulgara.org/tql#"><query><variables><pmid/><title/><sc1/><sc2/></variables><solution><pmid resource="urn:pmid:11076294"/><title>[Ultrastructural phenotypes of tumor cells of endocrine-cellular neoplasms of hepatopancreatoduodenal organs and their role in determining the degree of malignancy and prognosis of these diseases]</title><sc1 datatype="http://www.w3.org/2001/XMLSchema#double">1.38</sc1><sc2 datatype="http://www.w3.org/2001/XMLSchema#double">1.04</sc2></solution></query></answer>


Property changes on: trunk/jxdata/iTQL/fulltext_queries/queryResult19.txt
___________________________________________________________________
Name: svn:keywords
   + Id HeadURL Revision
Name: svn:eol-style
   + native

Modified: trunk/jxdata/iTQL/fulltext_queries/test.jxu
===================================================================
--- trunk/jxdata/iTQL/fulltext_queries/test.jxu	2008-10-27 12:38:39 UTC (rev 1365)
+++ trunk/jxdata/iTQL/fulltext_queries/test.jxu	2008-10-27 12:38:48 UTC (rev 1366)
@@ -304,6 +304,64 @@
     <fail>Output failed.  Check badQuery16Result.xml for output.</fail>
   </ifEqual>
 
+  <!-- Query Lucene model with score -->
+  <set name="query"
+    value="select $pmid $title $score from &lt;@server@#model1&gt;
+           where $pmid &lt;http://mulgara.org/mulgara/Document#title&gt; $title and
+           $pmid &lt;http://mulgara.org/mulgara#search&gt; $x in &lt;@server@#fulltext2&gt; and
+           $x &lt;http://mulgara.org/mulgara/Document#title&gt; 'Diseases' in &lt;@server@#fulltext2&gt; and
+           $x &lt;http://mulgara.org/mulgara#score&gt; $score in &lt;@server@#fulltext2&gt;
+           order by $pmid $title;"/>
+
+  <eval stepClass="org.mulgara.store.jxunit.QueryJX" />
+  <subst name="queryResult" regexp="1\.67[0-9]*" value="1.67"/>
+  <subst name="queryResult" regexp="1\.38[0-9]*" value="1.38"/>
+  <ifEqual converse="true" file="queryResult17.txt" name="queryResult">
+    <save name="queryResult" file="badQuery17Result.xml"/>
+    <fail>Output failed.  Check badQuery17Result.xml for output.</fail>
+  </ifEqual>
+
+  <!-- Query Lucene model with 2 scores in disjunction -->
+  <set name="query"
+    value="select $pmid $title $sc1 $sc2 from &lt;@server@#model1&gt;
+           where $pmid &lt;http://mulgara.org/mulgara/Document#title&gt; $title and
+           (($pmid &lt;http://mulgara.org/mulgara#search&gt; $x in &lt;@server@#fulltext2&gt; and
+             $x &lt;http://mulgara.org/mulgara/Document#title&gt; 'Diseases' in &lt;@server@#fulltext2&gt; and
+             $x &lt;http://mulgara.org/mulgara#score&gt; $sc1 in &lt;@server@#fulltext2&gt;) or
+            ($pmid &lt;http://mulgara.org/mulgara#search&gt; $y in &lt;@server@#fulltext2&gt; and
+             $y &lt;http://mulgara.org/mulgara/Document#title&gt; 'Heart*' in &lt;@server@#fulltext2&gt; and
+             $y &lt;http://mulgara.org/mulgara#score&gt; $sc2 in &lt;@server@#fulltext2&gt;))
+           order by $pmid $title;"/>
+
+  <eval stepClass="org.mulgara.store.jxunit.QueryJX" />
+  <subst name="queryResult" regexp="1\.67[0-9]*" value="1.67"/>
+  <subst name="queryResult" regexp="1\.38[0-9]*" value="1.38"/>
+  <subst name="queryResult" regexp="2\.75[0-9]*" value="2.75"/>
+  <ifEqual converse="true" file="queryResult18.txt" name="queryResult">
+    <save name="queryResult" file="badQuery18Result.xml"/>
+    <fail>Output failed.  Check badQuery18Result.xml for output.</fail>
+  </ifEqual>
+
+  <!-- Query Lucene model with 2 scores in conjunction -->
+  <set name="query"
+    value="select $pmid $title $sc1 $sc2 from &lt;@server@#model1&gt;
+           where $pmid &lt;http://mulgara.org/mulgara/Document#title&gt; $title and
+           $pmid &lt;http://mulgara.org/mulgara#search&gt; $x in &lt;@server@#fulltext2&gt; and
+           $x &lt;http://mulgara.org/mulgara/Document#title&gt; 'Diseases*' in &lt;@server@#fulltext2&gt; and
+           $x &lt;http://mulgara.org/mulgara#score&gt; $sc1 in &lt;@server@#fulltext2&gt; and
+           $pmid &lt;http://mulgara.org/mulgara#search&gt; $y in &lt;@server@#fulltext2&gt; and
+           $y &lt;http://mulgara.org/mulgara/Document#title&gt; 'pheno*' in &lt;@server@#fulltext2&gt; and
+           $y &lt;http://mulgara.org/mulgara#score&gt; $sc2 in &lt;@server@#fulltext2&gt;
+           order by $pmid $title;"/>
+
+  <eval stepClass="org.mulgara.store.jxunit.QueryJX" />
+  <subst name="queryResult" regexp="1\.38[0-9]*" value="1.38"/>
+  <subst name="queryResult" regexp="1\.04[0-9]*" value="1.04"/>
+  <ifEqual converse="true" file="queryResult19.txt" name="queryResult">
+    <save name="queryResult" file="badQuery19Result.xml"/>
+    <fail>Output failed.  Check badQuery19Result.xml for output.</fail>
+  </ifEqual>
+
   <!-- Drop the fulltext model -->
   <set name="query"
     value="drop &lt;@server@#model1&gt; ;

Added: trunk/lib/jakarta-regexp-1.5.jar
===================================================================
--- trunk/lib/jakarta-regexp-1.5.jar	                        (rev 0)
+++ trunk/lib/jakarta-regexp-1.5.jar	2008-10-27 12:38:48 UTC (rev 1366)
@@ -0,0 +1,313 @@
+PK
+     r6            	  META-INF/þÊ  PK
+    r6sGV^   j      META-INF/MANIFEST.MFóMÌËLK-.Ñ
+K-*ÎÌϳR0Ô3àårÌCq,HLÎHU Š%ÍôLy¹œ‹RKRSt*Aêõã
+,u-Ì4”
+rRœósJKR‹t<ó’õ”4y¹x¹ PK
+      r6               org/PK
+      r6               org/apache/PK
+     r6               org/apache/regexp/PK
+     r6¸ƒR    7   org/apache/regexp/CharacterArrayCharacterIterator.class}R]OÓP~κ­¥TÄ9'¬C§ˆ”N?LJ°p±Ä„äÆҝÒŽ¶3ÓÄ_â•	‰7^hâXâ½÷Gß³Õ¡0mrޏó>ïGßçüøùõ$Ì㙊4¦†p·…˜1#ÃT‘Ä”‚Y¡ç„˜WpGè‚Šî*XPpOÆ}£XT)‡2ÉxÌ ¾ÍÛ-‘éU«¬LÖ!w’KŽë„+²±[*—g¶â%¯Â†‚Æ^úŽ[cÈz~`½²
+‡–[+luï‹WŒÁ÷I{ßò×B*F j›p‚
+·Òs_hÐñDCW5Œa\Cã“§eÊn…77áfuÝk¸•`£iózèx4oæl³õFµÊ}—»•nÞ²†§(
+±Ä0ZÌü¨Á]›çç
+§à2VÄ «Ã{¼æ¸½$òŠù~	J<ÛGää4\Ãu†ϯ¬ºeïó‚Ïk¼Y/”è-;äþšï[¯û^™Žzþ_7÷¸M»™üO™ÓDɤ$­z‹
+Îç÷}ž‚ÞVˆ}Aý¨z[Åiãh·zaiP˜ÞmJ0	&2»:ÛÕ	ŠÓÎHN—GqÒi³
+fζ3s-HæDñÏˍÐoéeK¤ræďavØé ¹Ó†œRN0”;š&CÄÉ>ÖÆ…ïú;(zîÓâG¦üÅ(1w0ºCé1:’þ2§WÚ¸ô©?J>%CƒÄH«¦Þë•ú¹›f,Âh§å?F¨IÜŠPYÂÔH·Ð{ÈñˆK=~PK
+     r62¯+óŸ   Ó   )   org/apache/regexp/CharacterIterator.class;õo×>f]v.vnFÎâҤ⒢̼tF1
+OOMŸ¬Ä²DýœÄ¼tý`°¸5#ƒ¨vq¶äŒÄ"ÇF gFÖÌb×¼7Š‘A9¿(]?± 19#U¿(5=µ¢@ߨ!1¹$µÈˆKò‹û'e¥&—°120201€ #й,@ˆfÓlì`šƒ¤ PK
+     r6R—àsè  '     org/apache/regexp/RE.class­Y
+|[Õu?Wzú°ôlËv^c9Øq ŽäÄI0j’€¬(‰YRý‘Ä$$V$Ù(’*ÉÄ@Hi1tck·•5¦íÀ¦Òz+¬‰Mšº²Ai¡íRºulëç6:ºŽnëè-î9÷Ý'?Ë"°þæßïÞsÿçžsî¹çžûñ䯼õ¹§ÀëÙý68Ī,Ìf³S%§ÚƒÌ^…­‚µT9,¬ÎÂêm`'Á0k°²eª–gµV’V#UWU5QËIúÍÔZE­«í¬…µ\MUUk¨º†z¯¥ÖZªÚ©ZG•ËÂÜVÖaƒ5l=YÝ`@ҝ7’Ì&‚›©uµºhë©j è¡ê=6¶…m¥jU7XÙvry‡•í¤î‰yU^ªº©òQµËÊüV¶ÛÊöXØ^t³õ$°²}D÷“AjõXXÈ5>­Ô
+S+B­÷ZX/Ñ>ì§jÀÊP÷A
+öJâ¢Á-ìf;laGÈ=Þ~ßÞc¡po7È€Tû2é|!š.ˆ¦FFÀ?Š*çóöù¡]þˆ«P?u2µjgÏ@°?„üÄ60p¨ì¾@hOЯñ%æpäêãh>âøUNw8Hè¨èWÑyCƒ„60°ª(¼›ðaU¤Ùë
+ùöã4	ô‡{zUØ×ïí%èRa$8ÐGЭZëñvsÏnT­ùû|ÞgQåÃ8Y‚í8QùÐF¿Ÿ[Ý®šñÃ}\kN\Ãz¹lä¬×·¿×ÏÝoSíï	÷‡	îQBáþ½1â„ØÉT8Ô
+pë>Õz¯?8àë÷†úµ¹m)ãk“ÜÁ NÏ/Ͷš‚îò½}\:‚ùyƒ¡¿S85ÿ±P	äÝÝáÐ.‚ÇÕîîæÝ}¯W»K¸wï
+ì	𼉫Ý%ŒùPǽ9ÆÝQ½X‹ìõ’p´¬£;è
+í/ãùBý½<‰be|È2Þž^o„§ÐHYG0|P]¿TYG¤7 n€lyÇ@ÈÇ;ZË:x$Êx‘ˆj~”A½¾ãP)0ce=ûhÍyÏ­eÆöEDÇmê“ѱP&žÀ¤îñ:†=j;pÏg†‡ó‰B8ãý%0®6†c\¡4Šô%ïäÇ€­fs™‘\ô$ƒæ`&7ÒÍFc'¹ÄHb,ÛÙ돨Ý7à¶Í'¢¹Ø	×Tôˆæ¢±B"À-dr¨`;-ÄNìNEG(qÐûH4—H#?KÔ—MÈj!š+ld %ÒñÞ¤âMÞ¬âÍF+†Ã•‰m™3»£±Ûr‰a ¹%`Ç9q™0Õð8¬ÓÐî@o_8d°\㉝ìÇÀúü˜ÜæíÉt²€Û\iÞ½=Ú™Š¦G:û
+¹dzä†upx·Í?KdI<e-ì4XA<@ò­íWŒ1—i¹²‰Û©^“OžÌ¦‘hCžîÏìM¥z#£©hÎ?–Í%òytˆÁµ•|_ÊÂÃs¤G·bR;÷§zd1ÇÀÛP8¢eŽmD®n_÷‰D#º°j˜¨ì›&ÒG­ú†^Ø5¶?‡O†‚‰ôHá„:#½–©=À§dÏëÕª“i
+`4åÏå29썦R™ïÏkILû
+ð-œëžÜŒ¦9ãí–ÖUZÖ¥»†ËVL7$ŸM%q̵•úWŠ›)?z<[*h¼Ë´Øú®T+/›4’KàaÚÞ®w.|üÖD¬ð6W%ó¡Ä©T2MÇX,s’Ž
+Š¾Ïwóº€ßaଔc>TH¦9’ù¾ÌŽ²cÔú®ÏÃ~ß“áŸàŸ4]!Aq
+ËýêF£lˆáijØà’Ùq£*.³¼"³a6"×iŒ¿„¿’Ù	j}…ª‡×dxž“á§ðš…%ev+»M†¯Rß‹T}ª¿†Ë2¼ŽÃ¿FÕ7¨ú&\Æ'Ê‚;"Czý-ZÒ¶$ˆ·­…&ú²ÌRì¤?‡ÿ‘Yš¼D–ÿþK†oQëgØbxCff•™Þ°°¬ÌÞÇpryª
+Í+é\"–Iã-oIäcÑl¢e-ͯ4¶V†ÿ¦‘n'ùST±;dv'µî"õÚîh¼%›É'ÇZb©hWÎHßM%ã-~Aµ¬E!_&—ÍZJ×Ϻ¥k¢FÉ&‘áMø%ºÊ´` „–B¦%7šn•ái~§)oÂ/pp¾ÑB2Õy óÕÙÝì.üDfï‡W4	ÝzËìö™1f”áßà'8é52û »—,¾%³qvƒe•Rh‘-5ÏQ’³’™Î¾D.‰a¸3z<…ÙÝVÉ@ßéBt¬tàASSšÁ¦Šçø;\Ù1ŒvJáCÓÍftæu¼«KAÍ{´ÓÔî»B¯9%Î[k!£vá¤Û+UÚ+ _1 K–5ø	¦]Nçw%³ö$~ßäFcjÌ‡qª¦aõº2%óü”oXP+‚i˜Ìt†s»’#I)µ–d^0ädþà‰d!‘GOŠ
+.”BaÕì‘Où>R¡ÑÐÞMýwdê xƒ(Éü>´ˆ'Ò…äp2‘wÔ²r~„³Íx¡'ñáh‹ÆãþTâd‚nÎE…v®Ò»$[½‰e²wÒ……®Ò|€&šŽ'ÆÂÃowuÑ-[È3§9_4/ü÷A+‚AüŠ¼Ð‡á¶o¡D8Šø˜!ŽêðqÄ1ŽÃJHÀp	 >¡ÃIÄ·êðmˆS:|qZ‡3ˆ³:ü>Ä9Î#.èð(âÛuøâ1¾ñ:|âÓ:|7â3:ü~Ä÷èðP‡ïE<®Ã÷!¾_‡?„ø7tø7? Ã¿…ø·uøÈ?¢Ã¿ƒøwuø÷T‡Düû:üˆÒá?Dü1>‹xB‡Füqþâ?ÒáIÄS:<øœ?‚øѲñÿX‡ÿq±lüOêðcˆ?UfÿÓ:<ƒøOuøÏF‡Gü„ÿ9âÏ–Íç¼_@<«ÃsˆŸÔወ?§Ã—^—ß툿 ÃO!~zÑ~Y	_\´_VÂ_,Ú/+áK:üÖøÊÀúzYЏ9ôôàôyNï¡·§_ôA_ôk‚~]ÐoŠN¿)èK‚~‹ÓFø›²}þ·eûüÛ‹ü^…m|”`ûï‘Ó FlX\nã°'¸Ãÿ@¿¡Ø?rÑïÑf¥ÏÓ:×%0΁Ñ=’sL•”¾‹5)µ¢2))®90»Ž4Ò,X]ÎY¨RIü{B|±;¦ïåÀ0›‹}l2Uðø¡yMHHç.ý”ƒÆE˜¢«w6š‹ãþ¨Á²ËýXÚ]'¨Ëi,n7z£ ‡="è-‚ô.AOz7Qw}Í,Ô,‚Ãí82ŽƒîfªÇ
+Ìéš…ºéù£šúÇŤñM,&T¢¨˜]M AÊ¿À+¢¿)Åä:
+3¢ûG¥ v
+õ6—û,s?ËÝçA1LB‹¸$E¨R×F³ý¯ðjÛË4×~\qèåÚÐø:Ýq!øï‹MÔš]M³°bpÇÃЀŒ•N‚á*#<ÎTãuô:Ú}Âñ=Bû¦¦Oq—º†¼¯	K–kP¤i+'UÍT­zóh®¦fӆÌ৿ö -d¶•ªÕTµ-Цà?J¬ù¼\PË'̃×ä—ѧ€?,öXXÈ„Cו9ÔF©ér^€¦":†ÔYÄØ"m.âV+›º3ü„èg¿þ@-b V1Ðju E!Ð’è[Dœkqc—`ؐ͠õ×à6ÀT¯ÅlŸƒkŸæJÚù±Å_/í÷E ¯sá–ÏÛ.ÀªR«Í¸½Ëø
+aî€!<ÎÍÈ2=ÿªæ~w©Æª:Á„A€ª¶fDé|Ön«jòØŠUæÆ*ÅÖå1+6j˜†ºò˜¨)
+uy,Š™ÇúŒnjÇ Œ•§öòo at z
+ˇøÒ€Ÿ¬zÙJe‰îvYÐS*ÏÔ$ú>+èÅÙ·µ-úL¼³Z±¼„óKªmãŠw¯÷ÿZN¸›y¨¾]‘faÝ Çj˜´*Ö—bÒóÀŒ<…Vˤ.œ­hñT’áÖç’‘’†^Òüs’äÉá’ÎœÛnÅ¢Hár“×*Ú;Ó`w)iè,GŠÛ0Å9$Ù±ÔÖúÿ‹­F­
+ª-ôeƒÇ®Úà‘;jW)2
+š3Š]‘§À\4oV°'CV‘”ê!)~:éÙ†RtK;©’ÑScôÔa½K•—ØEØh ŽìJíGJÍlâÊãµL©Uª§ç/M/(ÒYÓsdÎtÆ4…E’âs°ù,º`úh¥‘;ašRÍôÑ’R-*i*§qõ‚fiÃaéÆIJË'ù‘­Òƒ‚ýqó‚ž"ªH`uØðÂUG§(àlxü4gΪ5‹ú1xOÂuŠŒÕ”“bq×ÚSÒeur%¦Ìí«ÓÀýfáûQá{Aø¾Uø|Tø\>oåCO€M±;Žé?¥µ'a-ô“Ð…Üø·Iå^Üü—VLbE©Õ¥½<w)·ÞS¿E=gakQb´ –3–)õb.MlÕ¢‰N`
+‹å†_.m2Ì¹˜·WJ¼j̽"¬-K<Ü•²R3Ô¥T—R®†)5
+éß.—§&Œ¡Ô]+æ=Æ¢X>"òã<––—Ȩ±Œ`Áó?bÁ@ktÒF¤)Ô§ë>‹t¯XzΏ"îkD»1ÄÓ­9-{lQ<	Û&ØCe¬®	voë†	–-c]?Án)cmwÔN²½åL~1ᜁ|wbY¥/E¶¢\Á4ÉŒå<i^[:Ú¼\Îč!«ï¼×éAø¤>¢•"L.Rulœ^È+Â[ŸGËú‡Åת{§a…ï~DK"ôh‚vÄ"GwLè—³vN€Yõ7bºSâ²Ú+m`¹<UyV×PšNyj‡Rã©+ÂL׺ñ:Öå©/µ\˜Áõ<Æ÷	‚>¡Ys(ÚàuJíôü—¨-6ÜEWR—ã4éã6c2K.@~‘ioœ¼M‘ñÂSä³PÍŸ0¨;ÿ¢a¦¹
+.£zwH3¥à&: Ì‹ Å„FlÎé×ßpÕ{‹§©D?ÛŠ—Øiñ”Ϻø줪…*'U­T5SµÚÅ艆U›K¢k̈oÝݸ¢ô|s—Zë]Æúö&šâœ¡ÝeÄOµ
+è±
+µŠ7á“«„'58¥îA÷øP~ׂÜ/U9ÖŠrx…0z§.{?qêý85úZ)â7ÐÍê]4~ç^Ghk·¶î3.§¸›èñË;$ӁŸnn§šBó?Öƒçââßó=™BÛ$Íp)íTœÕXv*îjÛõ8=&£Çìr+¦q“8%Å<nf]͘OZ>YËY°+æFé©éù—8‚ê²!‘Y:ŒçÓ…õ­
+ßÞ³°W˜g Àç³é™KÀLÚ×c܉ø::±Å…*+<&"øŒ67OÁòw³b’†faÿ,Ñi¼d9Ke(æÍŠtoú
+Þ;1ÿ4Ñžm¦F¨;UÔvÌBèÞfîhÄœ4šÅ7(þ„_ËD>X]îÿ½F‘	W¡ç2Ò±¶aÐLÜw\Äˍ˜O€{V{°Ù„ËñÆÕñ–ÇÚAbUEHPø<‹ÏBµãÈ$D試Tƒ=ÄÅyVÓ&¢³Îƒdë#ÐÙ(áÐ4D×-7ì¢nTïÝfo´?öF©ÑN|Åⱎ[XG}‰öz,ŸPS®ÊE°!‹›áQÆUW0}ͨˆú¦fÊ!œÎ2|ášÏáò»)Ò×6•Q˧‰&ÒÂ
+Lb&Éý˜ &úêZXaüÜs7ož…m’‹´ð•‘hE¬Ù	÷Cm‰$Ώ4Jªaý'KÞ)~ÚL‡lÏäN‡mV9Õ“°ÒY÷MB³®¥}lHÖiO˜aˬÂÖ*ñóN}3zMOÂÁíN¬v49ãª,ü
+PK
+     r6û®Yä  G  *   org/apache/regexp/RECompiler$RERange.class}T[OÓ`~>Únlt0³-8Šlx Œ ‰Yˆ.!YÆD¼¡n
+Ù)Û Ìknü	Ä«‰	—f‰C£Æàðç¨ïÛ–±C—¾§ïyOÏ—îçï¯? a‚áz *n°ˆ³¸Éb–Å­ ‰‹¹ L̳u›Å‚)?î
+ȍâ[@dËÅʦUÙ%wà•ã[‡ž/Uö˾f¡Øˆ/
+LmTë»)«få
+vªnïÚ‡µÔæzºZ®Kv}U °Õª4v³˜£¬µb¥Ø|,0“¸<m®æ©Ÿ/o—ì&r"Ãa¥l×y%‘q|_Ý.W(à/Vr¥}'…Ž¶l"MZÅ$î©GDÅ0FT„qEÅ(‹1v¯AS¡Ãð㾊%,«˜‚¡b1?Vâ—Mß\÷xñ÷,5S©ØõtÉj4ì†@xÏ:°R%:Ke_ïÙ¹&q˜àéú¶Z¦M´¬zÝj媵–€™Øø7s5óŸÃ‚~ِˆÑ5‡ (ôà‡Hpô¨§Çœø(Ӂ	'æ£wWɏ’µ„úsægs¾‹3îB2ÍO¾»{–bJ]ø:p"Ø+ñ²Sâ}ÇÒX·1ÛÑäü;L“'“å¨d–”âz
+yGB¸è?¿Ì—¤å|_º=·ƒÑ’4¶ÒãS¼åÙH¶1¬s#y¹ãOõ‚mŒ˜Æü¦¦Ÿa°ÓKŠiçInh­¦÷`z?ŒŒGý°#IîÜû¬˜¡6žò
+’R`öÊÊžV¸ª•9îû‚ W”¢JύÊÌsTaŽ	ÉaÍaŠ-=ëR³ÓGÍÔ95øFäó~dj>¸ÓkmŒ¹Cë'Tç¾ØÿIo±7´,»eÅAFdí=T3ÂwF«ê…]]Þ‰(¼y¯Ã¤kQ‡c"Ûq+y§JïT1¨X¶µíóEè{ô‰ÑߝLzÜ8¦~ͧ4<ÁôŒ‡'¬DzÐÔ1ä"î’V‘Ä"ðPK
+    r6lˆá"¯  ™"  "   org/apache/regexp/RECompiler.class¥8
+x×qón÷îöN+±, î.œ1Ò
+ýàÀÙÆHd¹V-!Œ"c!·Ò-ÒáÓÝõî„%ƒ©‹'MÒ¤!?-Ä6¸=7¨­M@Ð@ìô/mÒ$MÓŸ´©“ºI›þ¥nú“ô+3oßžö$Aœ¯Ò·ï½™7ofÞüí}áÍO¿4±xÆàÅ ¤áWhød.ÀLW¿ê‡_Sà×ƒàƒ—ü𲃀—ˆèS4\¢árfá
+‘_
+Bü†Ÿ&àš®a%¼HÃghx%¯ÂgiËoúá·øm~‡ ßUàsôþ÷ø}>¯À$X6÷&
+7ˆã(ðEzÿ%¾¬ÀÒ›9¾BÿqøjöÃûáOˆüOéô?Sàk
+ü¹!ÌÍùáëAˆÃ_Òð½ÿ†ß$à¯x]¿àò[4|›^þ
+­þVïÐAß#ÌßÑð÷
+üƒÿ¨À?Ñ™ßUàŸ	û
+ÿ¢À÷øWZþ
+ÿNÃÐð}~ À’°ÿ¥À+ð?~øß <ÿç‡$ø‹
+¼I‚Ï!À@aLa…I
+“æU˜Oa~…)
+(,¨°*…©
+«ö³?[ÆÀ¿·s¯™±¨]™Œ•ïH›…‚U`P•ÊŠùñáb*›aàì`P“¶2]n,ëB9³X´ò…º˜GÍ–4²ké+æS™‘{H¸ÇTr‚/gæ­ñÞÝ{oç¡Ý½{{vv3¨îÈ"S3S|ÈL[ho DÚ$ýÝÝ;wuw’9Èwõîéî|¨³›T¸³¯ãPÏξ/-wíìx`oç}êèíAê‡8Ô½³¯6”7‡µŠý™¡ìx&i%¥9ücøžTfèÍq÷¨YÝÓÛ×…œt[Ïñb*Ýr?¢‹æPÚBU}ÛS™T±µ­oxˆÜ‘M¢Y}¨ñxr}G[c©"A3H„6µòˆóÕwtqµ`w[ÅÞÝ™$o½–3œ£ÉÐòÕ©ÞLwæóÙ<òꜶrt3dâÂd¦hNˆWzýâ»!Ž~¡#‰Y6sy×šøª(Ï6‹Ù146bÆRx&‰1ÈÅ𧳶†>ä–%'ryz“Ë¥ÒøfóRçwgó#-fεZòÖîiÙÛ¹'ŸÉ›chNeûpšT…÷ÁûUÈÁO©‡‚Ÿi*[ÎB*ü|Áú¥¸ôÙÊ;ö`°–ÖÞt¬0šÍcGÆÇr±<9~3±?Ã`Ù¼€Âh˺„}c!êTx
+*¥¡ã~¶Be+™®Â/ xl[fëœÈYhµd,™IU8M¬W-Ô}×øáÃV^ekX­ÊÖ²°ŸETeoSá@[¯›§ß=>6dåïËæÇÌ¢K½|ÎQ3JÆ2œw–ñhú13–ÍÇò©‘ÑbLܳ
+ï¡j*ÉT¶Ž,Øe&m›0XÑ“*PÒ]®Å·#vM'w’˜p‚¢Uˆ¸B*‹±:Š1‡/év
+ë„c£Ö„™´†SchKn˜BÌ<ŒLbðmçX®8I’ŽgÊ|Q0r;•m`oWá½ð³*»mD±æ-Óá8¨ÊêYƒ
+ƒ£þ]Û <Tce'¶ÙŐqÙpk*;rl)Ïê°]:¿AäMôf¨¬‘mRáYxE$+.`Iï›Ð¡ø+~†0s¤¿Bç…»šÑÕXkUáCðó*ÛÌZÑ“›Éæ,ä’Œ³1*<Ï©ðL£Ïõg¬ò%ó;äÉsîGgB¥„,V»h-ä˜=Kerãè-ä-ËIì!ôŸ¼…^ke†ñ ³tÐdëkàÈÄ ®£63Ñ
+-tÕtš¦
+Ÿ ¨þ|T…Ã)ÎÁ´
+ç9ËJçã‚«ì²®ÞŸ™Þ¥Õ—
+\öXÞ3S”	÷H3t{ïpܪ2¡c‚3ÓW”Ðö[ØVŽÉš8¡>Šóp¦˜§Tȝgä™ÃüçMg£pôæ08ŸÏÓ\Èñ8òŽçrôÞ7!6H ¬TZçø2r+Ä«œ†Þ¡#àBõMŠ¦ì€™Ï›“ÃÙÜ$݇í=÷t-âåF[˜¶P`rѝE»˜aGàOîµ5 z†Ý‡ÏDÍÈÂ/ÊùvÞ£Ü^Ì:,WÖ/¦CŠåó8JÃ#¤¯‚V)`µ,Þ¤ a1
+`åì¶2#E¼…ªb¶›î¡Ã,X¶€(ñ¦%+ÑM
+£ž7(Œ„«¨H/ٍP}½}	Ë7,F!O21ï„x-F‘ëê—¬”ŽØ…<•Nó~åØO(lø,¡£í0ɈFÏ3ØE°9!`_Z·ò®D bp×"¿%% {Ö1ìΖãƒe›::ªÜ|ÆÊÉç£~LÌ|^“83xœz;8†ðqüÂ'\ðO#ü¤î@øg\°ðI¼á§\ð„ŸvÁïÆñ!Ï{„<X|p!
+v!8~ ¡uHËp^a\f,‡'¯{/ƒÇ.ƒô2ØØ›âNð‚ŒóÝÆ%ð¼Ò†£ND¦¡±þˆwÔAœ›û~äºw7IM!¯‚l4!_‡%Ö Ár=²ôà¼ÚgÁK[ŒÜ°_N á~g¦U±áü#v>±!Ê_‚Š&é(‚Ãý|’‘SöÊ›ú9o_Â¥&mÁx? ½8uØ›ØÒ^‚µáÈ(ĸ-Ml/¿‰ž†ª0¡§ç^çó9¸=NÆeÿ?rª¯o ä¿Ê«b¢O•µÁ_¶¨·¨£
+·a¿³*‹O@¥„ñ%gKlÜÐŽÄr2¤
+^ƒÀ@(xª^忈Œo8c/'¨u¤&ûHâF¸‚؇ó'Öì
+„QZöU<[ŧú¬Å©†„Rù•©³°L;vüÆ,hóT+9Õ%þú*,?#š…×`åÀü
+AK7.f4«öÝœÇÜWŒÆYX}Ö\†Ú{ŒPY:¦éŒˆp¶iOL!Lgð#ÈË£/ßZ—Mg‰ÏÛ~LÆžJÆ7S¿Qš…uÿ?ÝY›ÄÓ*}–Nˆ¹„^Z¹'¸ruH÷2Þð3e…µì$;Å>kxv„¶x>0Šç3npݹL¡X=E¼o›vñr»ˆ
+r·l’»šç­<mûö[{hÏ­¶EÌwþhÚ›ò¸óÖðs>{ýGÐ}ü
+{/û>Ûæy±m¡õ3¡
+3am|
+üþÈÞ6	óÔ㮫 $¤µNÃjœî>ZÔ?¡Ë	­5‰t÷ëòUx;§0§a-N‡ÏÃ
+N¡™É„L ÑzC„eèöY؈ž^jÀúÖ*ô¹Ù
+G/»WUd at N¶=77Ñ3ZpF«žÑÔ™[Å@Xk‚£8&ÛæÉ’•d§¡/â›XÂu[“	׮慻¢7ß™	3á™EiîyÇÁåtoçõn\äàûŏp¿o¬ˆ½×ÜŒ¶MÁ+-¸½ÕKÙ´â|¼¯ŠŒóøs_vË’_pÆP9ØB¬=„	Û$›z.BÓ¦Yhþ,´ìnúæ‘ù Õö4ÍBë,lž);ÂxÿH½1ô„„¶Ð¨
+bÛ¼=´µ-Ò.ǽRÜGÄýR\¹ñì*îÜ,yF]Ò] _À~€¾&\SY<€O>ñ¹M÷ž¿ŒÞ-Å©&ªº
+ÔÚ ÚŠMÂ]ó¦*y4¼’»âU”JX?ýLJ?ˆ"ÇRØZ#´
+åÔ}§éZ¶¹Ò6OB\–58Ü‹ÏsøôáƒAûð9ŒOiªq¦.ê2ïó Þ@q4¿îEyjƒZ-îÁE¶ÎÁÕ…¶òe	.m‹ƒß¦½ÓYjeÂáp¬¼íDå¶2þ0B‡¼ÚY¨Î"è,gã‹4áÚÔw8îÔö;ËCi«v7ÇE0\Ò«NÅñãmGãÉq_["¿„—+n|÷ÒÁ	m%&«G#¦!d¼Q—ã]ÑÓÎÕ	b C•À˜‰Šh:Kn=I¯Ëí7!{dêÆSÎ+m“˜','jƒ— ýT¿¯*AÌ h‡^Õ|jÞɁxºŠéUœvzîµ%ÒÈY'°Úu’4´<H¤¶p›ìxEŒ¶WÔÓ)hä‘$“‡»Ze.ªvC—Qè.Å\
+ÀO€F׳CÌTg#§
+úÍ᤹ø Ï€z17ˆ™xŽ>47ü
+˜Âø$>ø ˜	ºã—à`äì7B»ðJð 	ÒNjRa
+uœuLA•¥ ‡-¨"7»‡• b,Õ(Ñ»rsöæ9dí$jºV쟗¸¥)˜·4`O°žJ“°­HU#šëa™Ia™Ë<+,sQX械̤°ÌEa™Ë\–ùea™Ia™‹Â2ç–ÐOâ‰x–¯sÆÝGÞK
+†~‚çáûù¸KTœ62¤ÝYá'Í|BŒˆç®Fé@³öæ‰^C;P‘
+ù9nVËSä“]Ñó4?ÉÖÍò“¸u}”“GPF‡_™ï,<°Øàçƒ{¾‹A_Óž×¹´òõà€$õî6°ætÇebÒ$5ãånÛ§Ë32¯åǧû.»ü\~»#tEÀëò–¸_÷kÏB§
+</ô Šxº|‚ç»Ý5<æŽÎShþ2?¬Rº÷4{—Šœ—‰ÝoËÁÚ2±:!S‰«ÈShm<@M{3Y¼JŠ£××rËz7Ö·YØó´ÊtÓäÜwô g
+ֺ«µ!éøúA$ö%hµ§7ôàóð¤”׃۪
+m‡MR[s¯¯)A´¶Z¯¡x½öatÒ¾§k˜^£§ç¾…ACÛMƒ½ñeR\£Î±Z³Ž¾²Ç^ú4ɉfPcºF{_+Ár‡¾QmûlYKØÝ‘,2‰k¿Aý1}+ÄO—Q~…ËßƵâd+sìFCëp67–7‹Mx‚ {¯pŽ§Àî0È7º„?¾q›¡µ¼59mÎfûôùÍè´‹bà¼ð!ÄùIFO»'.clóÊTèZk½F-Ö³½m¸n>>¬€ºìA7EæØŒï‰Äå(Þ¿7â*wâñ³•å¯ajîí¨º¶SÙ
+Š¨ˆ.ó…rn|	á Î/xÚ<<P€6{OœI÷õS2xûhKS.dvë‰Á²ÉÁx¢=]ëmãä³[Îí\°ÔÉm®8Õê	èâ¹°‹xŽ¹q¢—úB̆}؍ b݇[ۍ¨îã´…úÇe†v\"ă”<æyê>zÌâDÍÙ¸ÊëŠJKÎ]‰<½7É
+Y D9ã]˜3"2áµòˆÍqüH[chí’X£RöÅõ£ våÑobK<PâU¡-Úñ)ü*Ðô'"sÑPw”ˆãp;cþãÔôÜ—Ý#ƒ_Â:c»Ûqñ»]Îh¼Œâ£Êý—‘¹$~‘ì"ºx&öööØèw–-r".}QŇx¹Ùg'GiÑï|×àaêqºš®ÀÀKdR äüðÈVðÛ€ù¯Á~üÆü4á'IèÀ5hлÌÂÁ}„9Ä1¦“à˜!Æä˜afˆc’.Ì0ÇŒ¸0IŽI»0Çä\˜ÃSçÂŒpLÁ…å˜q&Å1.ÌŽ9âÂ<Ê1
+ŒýÓ ƒ,ŽAœã†ÀPK
+    r6¡Ö.
+i  
+  '   org/apache/regexp/REDebugCompiler.class•[wUÇÿÓ&™Ót€S4åš&…ˆÖZíÒÚHš‰M
+ÔriÚNÓ`šÄt‚ (^êý‚ŠWðÒ*ÊÒ'@M]v-—o®å'ñøîIÚ¡ôÁt圝ßÙû¿Ïì9ûôïÛ¿ÿzìÅv¡6à â2ž´´c72’C2ŽÚ! 
+ãù8Ã<<e‡
+#
+{ÂN±'N	œfsT eG3ÆÆyžИO
+¤¦2gžæµ,LËÈ5 “gصÈÖŒwB¹K<ŸxVàœÀyçž¸ ð‚À‹^xYàWf^x]à
+7Þx[àwe¼'ã}	ö©ÔÌ”ZÏOh\Ñ3©³©@IÏdýÄõÔXVë”`ëÊä2z„zoËQ	–PÅ{m¾–Ì'ôb&—¦po¨ÅPȦr送)\ŸJ—ݔ܊¨ÈªQ¥éB¼˜OSÓ¶x
+ŸL>'ýX1£kÅNÞŽèÏVö§àÂ
+z’°~Y1’Óµ´VäÕK
+>À‡+óIÕøéô‘°iåboirR+JN(ø—yøXÁ'øTÁgèWð9¾PЇ~Ús«'_˜Hé)O·GBÝ>‚'pDBC«'§Ó‰*¸‚«TÂ\>§±}‰ŠÚêQáxi/}OVÐv²è_⪂¯ðµ„
+«”@Æ7
+æ0Ϗ÷­‚(|‡pÍùîwION9Ž…’ÁX2‘*¸†ïWðxt(A%4£àp/‰Úˆ…c‡£WVIÍƆé}†z˜ž›½ƒ±P¿Qà`R0,NmXF2ªæ°“S“ý‘XŸáѧ&Uª-Y!5–ŒÄ†Â†r8
+ÆƏÇ•PTMTUzƒ¡#ƒaÚÇΣ&"ÇCÑ`‚²­«FóP"4ž¿¹ŒšóÅt UHOi" s…À`ø6VJ‡òÓ…L–DÓj>ËË:ÛtBëÓš.a·×tÌÕ±3Ú¸ÞÙr/¢J¦
+-7!¡Õ{ocÜÛ+Æñ¤8÷j´´*ô¥–Ûè]µã䳩lIS'©Ö™ÜŒ^,ë™|ŽÎñ5”µÀgŽÛu•=Ñ3Ê•õ,¹¯Íj¹ˆ9^ŠÜÝqçgtZº>_Ò—îœÚ¡&E-5M›ÙºÜðjI/”j+œË:™-ÍL‘B:V©ëÿª4ݬéÒ¨8|k%“M—‡é×zš©aõ-@º	ãC^]Þý Ü·P·ˆúa÷,eXÿ„m õ/Øœò@ëjPd)h?êèØåvxæÑàv\¼†Í‹ÃhpÚËht—¡”±æ†û7¬­…Ó%R
+ï Œš[}¿`»­»2YFÛzª¾¦2¤â\OöªTECâ»ÁP‘î'šõÝ×%™5šÚz*Iµ[*–u´ír»Õ_Õ%YÅé$MN°l¤ÄËp¹¬W ø›È¼ŽF“Ë:ZÆæÙºúmŽ‘9äüÎ-´Rßn»Ž¡ŠòlÔÖ./›Â%»Ä~ŸK.ckEÆ[K\cÎû8»K¿ŒÌ³6ÉesYæïüäwRÝ\ÛÁ9ì÷;›xWθÑï[Jdh»lÖ‰vÛ•;ÿøT —ßy4‘—gþö¿7—jU;ÍTq~a®E4ßÂöìˆúüeì¤ï.Ã] Vs—~­¼H?.b7íÏϨ«G§·Œ–c5ÒÍÄg&&~3	3i5“SLöšÉN&ûÌd“€™Œ0yÐL.0Ùo&A&™‰ÉÃfâgÒf&˜<b&1&ífÒÇäQ3	1é0“L3/“Çͤ…I§™ì`Òe&q&ÝfÒŤÇLz˜`Ríëÿ PK
+    r6ÑDVî   :      org/apache/regexp/REDemo$1.classmOMKÃ@}ÓĦÆ[õ$‚<$‚,ž+B‰=<)Äób†¸’nB²4õgyR<øüQÅÍ‚àÁ™73o>¿·Ÿ_ðp‰£>Â{ˆŒLÃk¥•¹!xq’ü´Ê™0î”Ϋ.-«Vé‚p߽ȵ²3‚׬xt‹ÞŸ%Y„L#àp\5…µ|zfÑpÁ›ZÜ/nyU_@ˆ–Zs“–²m¹%œü;{žËÚpC˜8º”º¯­á•=“7ÊXˆ—I†3û›^Ví!vC`½©Eê3ï 7W@a÷í¼~é}kC‹ž‹G?PK
+    r6¶l à       org/apache/regexp/REDemo.class…W	xWþŸ¯•×ÏŽ#ÛMÈ…“¦­,+IZì&ØN1HNp‚ã„vm­åM¥]±ZÅ6”B¡”û>ËQ(GÍMSj*(W(å.7”û÷}-3o%YŠÕ ïó;fþ™7oÞë{¸ënÔc‡:ÆájÈꨃیQxr:ýÍ)
+s:puÌcAÃSu´0üi:Zq]3mžÎÃõžÀ3u¬Å
+Œ|Ë<›97jxN 7éX‡Xás™ø¼ žÀxÿBÞ¿ˆ‡óð
+/Õ±Í?üe<¼\Ç+ðJV¯âÕ«u¼¯Õñ:ܬc^¯á
+:"l_oàM<ߢãÍx_èV
+oÕ±›-~›Ž=x;_ìL¹…5ÞÖŒE¼SÇ»ðn
+ïaÊ{5¼ßÀ¸µà&}‡;´@^Ç2>Ä}˜)wñPÐð‘ >ª#†»5|LÇ!6ëø¤†O1ßåáÓL9£ã3¸GÃg5Ü+ \bŽ›ŒczÖŒºfÒœÏDG‡úÓN:c¥LÂ\X3hNå’E	h3–™JŒ	tÆN§Œ¨1çEšóÞA¦@W€¸áMÏ
+4:9±ÕØý®iðáÄ-›®´lËÛ'Pêhp&ML$-Ycµt…|5)ÃNFx®e'û ~QÏZoÖu挩”yÔñ=•bGKüþžÕÊHU.“0<“Okñ—EÅíÙ=f¤ræÀ,I˜	Í¡•[™§LÛ¿Û¯”Y
+iòÉ÷¡ÉZfKLƒ”tÖrºÄŽ	lý¿"1‰ãtDÙŽ«\+qÀHÆŒò­†ÏI|_Øx.`À±³žKöyY5e5½,›öE‰/áË_Á}me@̘2Sôž£f2—2Ün²É5³Y˱ûXê«_Ã×%¾oJ|‹Eƒ«ƒD ûødh²9YÏp½¾þ&£Öážã'$NàÉßf
+šï²>VÃ0B“3Žs¢‡VW3æ;¸O⻸_â{¸Ÿ`U I\¦`hø¾ÄðC	ŽÄ0«áÇ?ÁO5üLâç8+ñœ-ù³â½äffØۿį(¡t‰_㬆ßHü¿“ø=þ °NÉXN”âÃÝïºÆ¸kyœX%ÎaRåùTvÖ%þ„?K$ÙŽ¿HüÓðw‰àŸ%!eÂÐü´™ñÈÅ'qm«Íÿ¿)ùT´šÙKuìÜÎÿ‡rª{o·Äñ€Äƒ( Û3Ûm;^wše4!¤¨õR4°R˜•H+\Ù¡]#MI©uši‡¯@ü
+µƒ4ílß) :nضMw ed³fVR4	M`ýC‰IÌ !E 	M4K¡‹–re2)Ó‹îWSeL¯$_ÌÊz¦ÍN_‰;
+u‰ÍÝ~jxEöú´¸aI*rœ»Zh˜~¼j²TNPdÅÎI*M†==ëf1̉¾:Ï•Šz#AA®8ó×±U¡¨E$¯ÓU9zYMéØyòZÝ£1Iô…â<O5iÆJQþjs¦•œõˆ!Ë»ùÊBÂÞ,ŸC%‚®PíàîšÕ¯Ä÷H—`"UÏÇš:iN)¤rTP@‡*k±"ö—ªÒ
+‰ô‘ȈŠÁÎPÍê­ N刞‘ß&“1mr|¤VÛXEòSœ[€Wî›jé@¹cjÅæ)°³æµ¤»N’òˆ%ïwÊ›çC³7;ŠgP!ñkˆ¢¶$réLYÍúLE±QÀŠ'8²@Dèz•]Õ"d½©ìë¨A¦;gx—²ÏéÆþ«ú!—ö;fÍn}Œoø|Þ§'<l¸¦:  ­%È€“ãؤOʾ.…ÌyV*ªZp)Κ	}Äɹӫ¦h³W~œ®tÂqËN8s”õøþz%ô·­
+ýj„ßýé)¯­®Cål⧳²ÖÇNCèX϶ÒÇÛ8•Ë'¡	àöþQwW3uC5_]œ©£©yJÍÍ$G4š´»„>¼©òbcx"\@ÝÄ2ê—Ð@ËFZ6-A;­„WZ_Hl‚FbíÔ÷æ¡ÐBÐ: ß2Ú–°&ÒÞº„ö^R¸v"l\FG‘<º"tΑöµŠKìuÁõí¡e<ìØ6T`6Fê°BͦJ5
+Ì­c\•®Í%][JÀÆ2DY³„n¶*‰mdû…„Þ¾
+]ž¨È߉
+á<.¦y‹šE—øž÷è¢{»è3½ŽN¸íä¤P	bÕ„\T	¡ö]„\N€š{‰Ý“G8NsïÄÈl, B†í ‹.
+FiØAy<"¹½¨$U>ç:RÁJ®¡sèO#%;óØUÀnRqYœI왈,ã‘y\&Wäñ¨;ÐG«þE:•éš»ÂÌÛK¼Et¬wøÄÓê6{p®Tsœþ3â_ºlÉõ<lÉI–%+}3F‚‰×ï[ÄîÊí§as‚´`,mK7å[ÞX/63=¡[¼‡­:¸H~^¥­ñ’¡O«?N±O…2}ÑmÙUôþŽgÐF¶<–ö6´…yÎc8Çñr‹Z>Þšfdð”¢ü^º¥v›Æ—1ë-àÝápO(`”VGâ½dGç8
+Géˆ'ö’Ác¥¬ú8:͇Ô>ð?PK
+     r6›¨Úe§    !   org/apache/regexp/REProgram.classmRKOQþn§3eJ¡£¶¼:Õ>ÊLa|4,|Ôµ‘„†%Q.u(CJÛL‹ãÂ…ÿÀ»²báBL¨CXºpéð§¨ç¶6ÄIÎ=ç;÷;Ï;?~;„IÜ	"ˆ1•Žñ zqUÀk^Ǎ ’˜–!3€T “L1„çóÏ^=Éf²OfXŽ¡/[­Ô¼ÒXäåM[À‚§Ôù9áñ1ô:Är7‹
+§Zað-eúËv%×íUj®½êl1È«e^ª3¨|+Ï]»B¶rß©8ºL.e'üÙêk›üÉ\+äÏ	#\²]y)ÖŸœÃõó*Qóí¢!#Âú…e…0*à%D¸Â-ÜaPxaˆUÝ’Åk¼¸f[®]²·jÖÂlÞ­–\¾Á ­ó7Ü*óJÉš_Y·‹
+†HÛåT­‚í:¼ì¼å+e@JŠ¦»ø…ízæ*w]¾]¬Ö¶ŒäÜù„÷rÿqÑ0
+ñ®!hž>ô“¯ ð….|‘Nšâ£QÛzÀÃjk…b†1BgŒP„~$éÃ4OÁ¾´™‚¡{Œabˆ—ï3R)Á0b-øþÑâM÷hšqÉðÇ0õ¯ðŸ2/ãŠÇLAn—Lw0"Ô±<GJ‘LI #Ì}¶ïE&Îjü¢H…ôOÃlA1ôdCjQï¬ÕüŽc}Gº²‹¦”ÖÞ5±`Êé3f\ZNk³Mdu.˜JzÚõk™&f =-Qj@¤Ð*¯JQÑÁ"ÄyÙ¤ÁŸ G~O…¤™=Ê)Ò}½=&3“Ü%ɐX$K$cq3î_NËkËë ajíl~‘m½$)®ïþù|º¥Ñ³-My[}‡.ÔIgMjgMêI÷žðPK
+     r6!õð¢ü   s  )   org/apache/regexp/RESyntaxException.classmPMKÃ@}ÓÔ$ÆXµ¶µzªè!õƒÜxPzóÔ‚àqi·qEwò•ø³¼´ àðG‰»æ Xg˜7̼æ1Ÿ¯ïðpŠÝ qÂzˆ†Ë6#„Ø
+Ð°MðÏ…æ‚ÐN®ïÙK˜ÌÓ‘ÑBæYÿ†P¿RNèü%/gÓ)×1VÑ"4FÏÒ°²ÇµVú¬£NŒt”ÎSV°ñO5ÏyY¤ÃAµ3(Ǽ0BIÂÞύáLñÈ‘^âÔø¬(¸œNþ“»ÔªDf„ШªCh%ËsöØ·8#ëV´Å5[ÚGÖln¨5½9êÇ6æXYÀùÞÁPK
+    r6üŠ4%3  ö&     org/apache/regexp/RETest.class9	X\ÕÕ÷¼Ù.Ã#!/L²ù $fHP1!›lIP Ó	$ñÁ<`fpæM€¸¶F[k÷Ö¶IëZ[b«u‹C*—Vmíjk÷ÚVk[k­­KÍÎ}ï
+C2Ð|ÿäã¾{ïÙÏ=÷Üsožy÷¡ãÌÁBR‡—¹`©Î Õ%^(…e(£ÉåÔ¬ fe‚ýʽ€ ‡
+ú†8Tæ!°ÊË^‡åXåes`9ͬ¦¦Úgz™¹ÀYp6õj<pŽ—Ãrkè»–Ðj©·Ž„¬÷À/Sa#ñÙD½s=PçzÞàeË¡ÑËÊ ‰Ãf¿…šsif+1oæp‡ó‰Q‡V²c‡6o㰝ÃĶC	ÜÁa'Q]HÍ.2þ=„¦f75Ôty`—ÕÃ^jöq¸È˰ך—mnÂèñ²W!BJèÔôrè#öý¢.æp	‡ƒb$h/‡¸†¼l\ꁄ—…ÉØ0$=`ÐdÊ˺`¿†½l»F8Œr8Àá2‚_Îá
+Wr¸ŠÃÕÄð½ÞÇá9\Ëá:ïçð×sø ‡8|ˆÃ‡9|„ÃG9|ŒÃÇ9|‚Ã'9|ŠÃ>M<>Ãá³q8Ìás>Ïá&7s¸…ínãp;‡/p¸ƒÃ9|‰Ã‡#îäðe_áp‡»9|•Ã=îåpŸîw0vâM<àe7ÁQñ ‡4‡qòÌ1_ãð‡	sx„ÃqrxŒÃãžðÀ×9|ƒÃ“žâð4“÷ÈÕÏpø6}¿Ãá»4ÿ=ßçðÏrø!‡qxŽÃ	ò?åð3?çðšø%‡_qxžÃ¯9ü†Ão9¼ÀáE¿ãð‡ßsø‡?rø‡—9ü™Ã_8¼Âá¯^åð7¯qø;‡×½ìnø‡rxƒÃ›Þâð6‡‘Nÿ&Ø8ü—¾ïpx—Ã	œ——€¾’WrHNäÂp‘Ü\ò`ÄIÜ#å+HöLJ;R==z2©'ÁnœkˆÇ’†3.ÔR:º“1`¼­i×¾–æ¶&`JËÅÚ~­j@‹õUu‰h¬oÂ{âƒCÑ=lYK<ÑW¥
+i=ýzUBïÓG†ªÚ›õîT_ƒ…„y†ž4⩘R›‘A¯H%H	砍›çï<URù…oˆGtü‡éÐÐoÓH>dDÑ`îõÑXÔØÌá's©XsÌÐZݯï@NˆäóçèˆDIi,t*R}ª·š†8©¢2äèíZB'eŠý9]$Ðç fu)#>¨zÄÒKøj›ÑOޝCýí	Ýòw¤W¤æ:†¢F],²%¡Y$©nò¬áâ&Œ¦KSÚ r[›ÃÊÓ™!íæç mnz÷éFÓȐރj·ëÉÔ€1?qeäÞh,Ò¦;Ä
+VXhÑx•éIâ EУå§Ò{$/°Ù(̦oÐ’¸8kfà‘Ë×6%…îúž2 H)_–d© cdRv&’<Ò,Yš
+.`¦ã*ƒ\2¸Á#Ã,l¤Bi°šI­O¯UMÕߊîQ;ážrV
+iF•¯¢uëÅ…­4FŒ=åI‘¥¹àÖP?ª6ê½:VŽ¨'ªfŠJdIµ7T‰Z]‰÷$-ˆÕJµ²²’X¡ê³O‚Éìö_`%ÿsÛÊì_ìß2ûaåÂöHE²ä“æÉÒ|inÍÜ“¥bi¡ÌÞboËÒ"i±ùdã\{	·#²±+Å
+Šî”–ÈÒRéYRIûy¹×w•
+hŽ
+¥¨kƒ&L–J¤Rb´Œš2`ÒFU––Óâ¬@áÒJ˜ܪ=ýjÒL†½©JL…æm|=R)ƒž¦D"ž¨U¼¹nG]‹ÚÔÞ¾­½V•!Œ8'ðÿûMG©ª›ëš[v¶7•¨jnJô9ÊÈ«~Ì8ê4¯\B at Pª¥„ªRPΡF¡FÄ°l{l3ÚGq‹©’VaBÁÄ<QcqC¥­J¶*Ù¸–[Ñ™«eXèÂjd*)­’¥³ˆ³å8#:¨eŠ¥³1ªƒÉÊSÍTwlmjoRëðϲ´£$—¥¸D"ª”útC¯TQ/n†~veÕ:CüÉr”ãòkòn`K:ôDTˆÐ#U=™¨6<P£†^—Hh£ÛRF&‚ÈH\ô…6Ò¶î‹1ÇMÁj¤s€->…MVÊÒi-±ªÍŠS“Õ¬uÒzô“¦i¨W 1j.Á ðåJš]‰{ßèW§˜ÑÞTI9žÀèk#‘Òei-‚Ò˜ÃÚ’­ZR‘ªõâËb¦QŠCf\ëîñw
+ʁ-m­ÛÑ°u_C]GSs[cÓö&lÚv¨6‚,m$ïxh!|7ö"‘ž'k/æWÒ¦2»–®D\ßÓØH4N¦1D4Ëêg¨x]}C#ýС'‘Ù¢›m&ÅùëÐ]«Q‘:­½V_'~hëÉ|²ÁĬhÊL†£»³.´{Æ'oÐêûõÕÕ§êdC„Nö ÃÁµ}‚yÉéÅ/ú®´+†R“XOª¥.RØ&X‰ëÉØJ[†…„\
+DKÌ„æ*0¥x33t=q­À,)íJ­Zµæì™pÝ/^}$ƒ\½ªzÍÿ@¾3yíŒÈ{µÊ@7zÉ¡y»ÉIZW¬{Š\JðžÈ	wjÄ ˜¦aáÔž¸Q!Š°8'’KC[m,2uZ¬;³°ÖæÄòúµËÖ¬^[}E9.péä@ź‘R1e6Õˆ«VÙ‡Q´,×Ü13´‘L¹‚RsamOÄûfj;—šä³@7mE3‰PÂÆ
+Q^J㓵š¬?ÕR¤D ɝDlEééÒàÊ;{Zšî¹±½=øÓ439L}UéäÄé	/<¹8A]Fð‡ŸQü¡K8€aDsÈ”>Ý 	‘¥z©K–]‰x¬OMRñMufV¬ çB¦K
+vc–÷NEJ–K‘‘ ,5JXÅKÉN”½G˜ã¥*^,:ìe§0úª½x{Š¨Ý£jŸ(ù•Po<êÓC£¡a­ç’ÑžJÂ# 	£ž £!$K›¥-À–›2¢r2èî5RFj4f{­¸ß0†j«ª:»*»†»B]›ª®ÜwîŠ
+Ë÷q
+÷G“QCM%kUkxx¸Ò¾JŒÃôæêê3ÏZ¯©ý	½wCi٪ҍe«ÖWiI‹­˜`-o’l¹¥
+°­“Œ§Ðç”Rº1ç4I)¡}VØT¾[<¬fí×ðàëÐ7짫.ž¢e«÷Q9±¯¬š’¸Ï†›“‰æ{5LC ™9´À+¾ÝâÛ÷Ç‘³=Ž+Z†§`'¯ë)ß$ò¥<WÙêPY5¥šîžù¡l#üÎñwj¡î=A$êì	Eö‘)?p€ŽNŠÊ<ꆨ/KÍÒyTûøuëö¥â2å—V¨xµÅ¤R¤–Ú¶¡èpSFŠ¸ƒ${Ñ!CÕ©š-‘Sõw¾´1—-“¥ª‰aÖÛYxXrµDc¢¦ƒPŒ±ø•aÌ÷H­²Ô&¡ŒÅ3Ý·(ÝlGÏãK¯Lê¸4#ŽúRû”-iÖFYW‚æmYY-{ïŽ&
+}ý§Dßé·Ñ¬»ÛŽþD|˜Þ!ºWtü;ðæ3ŽxŠî©-S.f1¶îäûˆ9IRpˆMciCæ!Äc¥`«s]„sÞK­Ô¼Ž^tÃáÖÊýb`c“ÉnmhHE&¯ÓS…MófQeÄíüWäÏqáÏ™’5«îRó#©Á¡Œšü-9®pÑÕ;JöcpÑÓΤóªßuSè³bE'AöÅž¸Šµ@#/B‘‰S"éãɇ‘0ƒÕ}è]ª‚é•""¢Ø(Ö+•Ã_ÞŒ³'•À9c^mZñM
+nA7F x®ÁánÚÁ-ÙW&¡®/í曇‹ÆCÆÕ3§÷‹EþófÐ6˜iï‰)Ï*椹F<s÷ PÞYO· ÎzzI ÍaêB[,„Rtô*¨â·y@ëKÒ[ŽWá~g}ùwÏ ½K|ÀVæ
+̏w¨»y¢ù§<íÙ–æ¤p%Í·®5§õ¸•s½Oï],w¬¸uëq-çÚì¦ÇÊDt6µAgÿ.¼Äa„LbÒ[dåŽ1©7Ǧ{=Ãìϝ(®Nëïԙݻ§yiÍï9hHOQ+N+±¬c%ÌÅ^gÛììŸØ8’Ø›8~‹½ýBzH¢‡ezKßwÄ·ˆå±wÙ	@sH)áwAàƒÃÌã<Ƥ1&·ÓÌIýû¡å³YŒ©óèõŽI‚rÎåÌgî–Àq×­¬ pV§™gŒUŽ;Å؁c>ÆθŸå)Þ4˧¯l~ÓWf!8x”Í&écÌé¸K¼†“8'
+w ¢NpYê® 1~ÆYa`‚ÍAÉʃlnÀñ +¢fö}ÂTFoƒÍè$~_˜`>DŸ×Z8Ê梁óÓhö+ÆÉ…Ê¢4[|?[‚­èíNÖ\š-M³3&˜FÕÇYIñ	¥Y)þ-sÖ òá	V†ËaÅ8[9Îüµ.2·<ÍÂÜ`±+Í*jÝÅî§Ø²Šbwš…19 T"ã1–Pª°¨H³U¸Ž§é#Ÿóð‰#c¬´-£íjT¥Vg´Â“ÖŠ³ãìqfþ‡ϸÀo­Õâƒ3-MjI¬´é¸<ðZT‹‘†8¢A ÕΚĴùßhñ¿>Æ…t^„ë0cMålÑÖLögÆ
+ÄEÔ¢ÓÓ윙ñmó3*¡‚¤"7É·1d(°0ê0ÞÈܳÆÐR›ÿdŠ\×*µä2ì­ËH9(9qým'ž³ÙÍBbàŸwc¯cê0\7âß&ü;7fu¬>g
+µÎbgš5fK'°n´E6M.Î8Ûü¨T[ÂÅÎq¶UÄÔóŠ]ã¬ÙŒ$Nt…Öù‡O¼|„ÍcEµž#Ì]ìy´–Ó|˝Ü6Èô•å±VlP?UO³6eÛ¤»qo¦pÜž½2 !EäŒv³?›úYnÖÁöã¿©[˜Ñ[¨éé&œsá÷zÚŽÊŽq¶³% \(6Ö®ðvõ8{Oë‡+ÆÙntBçë
+cÔíg{Û&ؾphœ]”fÚcXà•nÜ@‡iõ`\Ž±Y%bEË*¤ÑJ¯`|zÜp%‘Ñ}ÈkFÖBó~Só(Nq
+/(—PW°émº˜MTâ6pÈ^:	LØÀ¤
+4¦HL‘D!+¨ì·q‡mÜ‘)¸£Y¸lÜËlÜ˧à^!p•+E2Bû¯B4€!vµ9L÷
+ϼÏ^#†íáµbx=|¿~À^/†´‡7ØB>d	ù°-þ#ñ£öðcbøq{ø	1ü¤=ü”Þh?-†Ÿ±‡ŸBÄ!A;M9„IW at 9ŒÓ´ïÎc®ZJ›RŸttûÜ” •è=ßÌ
+p´0\¸äaWØQxùΰӱ3ì*\¸3즑G¼°`g¸Ð]X‡­Ç‰
+÷`“W¨aë%¤Â|Ä*”ÝØnÁvg+ŸÇ¶P Ì¡	…æ¶a[Dcç	¶ó‰íb[\؍íÂÂ&lÖbÇΖ	v¥•›[ɳò·´”[étÑ\ãÌlåÛpËúз[ûUxʐϾ€Î	)wLÅÿâôø_øcSñäÄkr§ÀÿòTü¯LÏÿ®Ì‰#Ñÿ­XÉúY\7~Ÿô<Âî;”¯v„Ô¸”{:ÂnåÞŽ\·bh·V(÷¥Ùým:¡‹ÊAŸ³:ä£2åèA'øœÁã·3¯Ï:~Û‰—ʃÁã¡ãi–ôãDïš"¢¥•;†Ü0¯Éð52ÀEÙð!:š}®ê¬³n"ˆcsîèAø\$êé€ò°%Ê6OÉÄ[Æ›“ŽðŒ-Ê#­Aå¸òhš=†«ú8iqT@Ÿ0·ïוo ü'ö”òtøMø-å™ðÛàwLàw•;2À;&Ö¾ü^ôûèLÒg•f€?Ê Ÿ3?V~’þôdàϲ€?Ï a™üM=úYІ;=Äê+žbùäŒç±Ù¡§0¶0½?˜UØK#*¹_cSAß˜…Óbå·öúœ5ÉÛgñ^gñ®Z¼ä–ŒD5@Œ–PçdF½ÔXŒVѱTy!(4t9îR^´ºÎ»ÊïÒì%³àEºPlÕÖý¨ %¢.eQëÛŽ­O3÷;­ø=FôÒ쏇hâÌ
+åOv¿²‚J 4~i&._¶Ÿ¬ó‚¢J¸§âÞì3¢äE°Ø’V.^ü^ÀlòçVAÂ\p/)ÒFM­SùeÐçk\Ž7ÔrŸë0«£#…ôg¯Ô¸}îC¬Êš8ÆþZãñÑV­åŽš¼16»˜û¨«è8˜¾<Ÿç¶¯M°WÁŠP±Óçò¹‹ù8ûÛÉ*rX’I >qÀ+‰òÚ1ö÷Ø«û?PK
+    r6­8µjõ  l  "   org/apache/regexp/RETestCase.classW	\Wÿ?vaÃÈ&Ä’v$Ú,„ÆÚ	½²¡ÍU’6–aÙdÙÙÌÎ6¡¶ZµµñÖÖ‹XÛÆ‹ªxDÃnmlÔª‰Öû¨÷­Õz[µÞ¶~ßÌì²À_ZøñÞ›ïý¿ã}ß÷¾÷qÿ£÷œ@¢IÅ)x¥Š*ªE¯ªÅ«ñ^½–‡×ñðzÞÀÃy¸…‡[¼‰ç7«xÞÊìo“˜äù°ÄÛy¾M%IïP	s;w(¸SÅJOËÖòNï»™ö‰÷2zJÁ]ï“x¿Šà6‰iæü |HâÃáåQ•ø˜Ä1‰f/H%î–ø¸Ä=Ìqœ‡OHÜ«à„ŠðIþþ”ħܧ¢Ÿáá³*ºñ9‰“
+N)ø<“¾ âܯâb|QâK
+¾¬à+*.cþ^|Uâk_—ø†Ä7%¾%ñ€Ä·%¾#ñ]‰ïI|ŸmùÄYۏ$~,ñ&ýTâg,ýç¿à­_2ñA‰_IüZâ!‰ß(ø­‚ß	„ÒVR`åÖ½Æ5FWÚÈ$»v9v*“Üœ5íM5™üø°iˆ>B;¡#ЄS²†ã˜v†VŽµÍpcê°1²³Dƒu¹1+Ÿñ·k²†mfrˆ‚$†3ç¬ÚjÙÉ.#k$ÆÌ.ÛLš³]ý½»i­ó+QŒèIeRÎEcÑÅ-T&”ÁÁ »Û®"ËãÖˆIŽ°ó™ÝîBQ&k| ¸mNÊʸDrI-}‡Ô‘e‰}ýf.Ÿ&¦ptq§ïªÇžpÑWæH[œb
+:W|Ì°9¾þDz7±(ÍÈåLÛéÝŸ7Ò$ëŠèbabþ`]Cf_s(¹|"aæÈž¦…¼äN
+×àZ
+p°X
+&Fü^Ã0¦!Ƀœ†öjØÇCš‡qd4X ·7Τ!‹ý
+þ¨áOø³†‡ñJÖ(/þJAjëÖ5ü
+hø;nÖð"\§áz6hyP6ip×ðüSÁ¿4üÿÑð_ü¢´ÇÈé„1)(#ºcéændtÓ¶-»CÎ;ú#—Yç¬×ð(£+1keïÁ„™õRf‰®ënô»õÞþ~•`;mk$Oî+Ó£
+™†¶½B#‰}™/h­dÊgÊV™%Ez+‰hÕDŸ³¡ÂV °:ngSiÓ֝1Û< Ž‘öµç²’‘º‘4R™œÓ­¯¨Z§j"$”…¥}s¤['ôî¢íí;H§ªáÅx‰†pÀº²œ<çºîEkAf“Ú†b0'Eñ¥x¥ê<ùeð¥¶mLéÙpš‹̤‰jQ£	EHÒ,jeãg~¨ 0EčQÊêÚ<ᘮ%}™lÞñðšPE«×x¨_hC¿iŒ˜öÚ°˜îCÉÏõŽ5.höâ]J˜r¢qü[æîÍK&Åρú-©=c9ú¸W,«x»¡uNšweŒ1Ë	s`ÌÌT^¿õTx}ÉYY‚0ã\X#9Ë-¾zÂÊg(—5Ñ $Õ£=¶E¾ó^GÝÕ½ÇLÃËq	/s‘¡ÌÓ(–REÏäÓiMDÄ2²Óã'¯¦räCo䲜ÞÍÙkÎ×%Z¶ˆL­ã'ªàüUÕÚFÑ_ì]‹9sNÁÛ1¼—Ñyãðߣ8un©œ +ÇiÛàìJXÙ	Xe½öDoê õñãWcd³f†âØTåï?Z¢}§Ù•ŽåQ(ÌÑ…8B„r™*~ÉXØl1‡óÉR]Û´ˆOãe!Š/jBàq‚¸©ê&mcœ„«9Óñ¿ôྤ„vû‰Q#•è|o+³U¼!»Çlë€1Ì«IÓÙFï­‘¤†,¡©N‰}»éB¥Ú¿^1·#ŽÅ—ß-2Ü£´
+Å)¸i3“tÆÜž†Z%:÷¢.IפœÝLò£C›yg¥/Ÿ
+FE­òìžÝòªˆK­'Qî•ò“S–¾ÙÖ€áÞÏô;¦€LåôYïD}
+Î¥6z€Š·´Šp·áÎÔk¸ó>Nû35îlù3õîL
+ÍUÜ+¸½Jh<H_ûQ
+I³+BÄŽ£j ˆÐ±öc¨_=8ƒêÔÄÚg Ä:f c3¨5‡g Æšh«.ÖT3­Y9‰³bÍʉ{Q?ƒ%ÍJ(vKBD¸
+SÄ&ˆzü#0k}õ—Ó?i‚æB+¾vZÊ#Ki uM‘È2o]KSËhŠ°b’L*âIžTp¯äK}a’<@ZI"›g°Š¸ùO9†OÐêÖЪn¦Ó_8rVg‡¦ÃÓ[½õ.ñɤtOÉ5‘Vúj/`-[ø”’9O
+MíœSPyk
+
+m+‰-±®#xóEK|g®m
+ë@Û=è9sÑDiMS$ô«»ó]ˆ¹Ñ½¾äT1€>¾¸Ð5¿ÃsÊ¢:Ý£xž ÂúÑEÔ–IÈȹS¨Žl`àÓ\`KçM⁴I
+wOŸÄ­.Ëù¾O.`IE<£€‡>ên>ÓßìðÔl
+ysOVâ.òqÇ%>öÒ"6¯„mña½»Ì×÷¬".÷1Sسu¾ûúfƒtz??{Q?%—®ÀƒxˆÜL³Xê»™F?Ën§,ãPÜÂ	¥Ý‰óc³	¬±;ŸÃîÜÊ¢·UÄ`{9iÂÓ²c¾U;*à;ËVM¡m>ðŠ
+`H)×ÖÊ7â>J	¶µàzt—Ƕª€Ý|¹¼`»;Wò­=QÞ»ê0ªCÓ¡ž)äÜí=œ)Ìò\_}”ó%2ÈÜ-´šÄÒÒö)ÔLaC¬ÒìçùbÈ\cVÔó]7
+Ñâqä±Cáiÿ†S퟇*ý“Œjð/Ù_H’W¥òj7•›æ¤²žB84½ )ú¼¤X;'({¶eOç‚ì霽¥qúÕÝ9í¦à®Ë?  šæm'¡u6‡=¯5‡O¢§9L2†ã<VØîks+ÇÕžÆƈAó4F†+âî{ŠÕÜä«Ùâ«Ù¸¦)|Ç"×pHYbS˜WÁÿÏùëÝÜ"-~áý?PK
+    r6lK ½       org/apache/regexp/REUtil.classuRÛNÛ@=‡8qÍ-ʝR(uÌÅ/}*/(•@‚ÊÛân‘k[ë
+2ŸÂ_À Vêô£*f
+jÕâÚòŒwöÌ™3ûó×·0°Ž
+/ð²ŽIS˜61£ý¬6sª˜×fÁ‚…W&M¼fô“¯i$ò})¾„9Cs÷œ_p/âqà(ÆÁ&¶“8S<V=õCíC‡j‹ÁpÚ=†êvò™¢u_
+®D·Ã°ê<§Ùiï&2ðxÊý3áIˆ<õº¢·:¹/RRKnIö’mcD—~ì⽉eo°Â0^†·ñŽ6\¸jc
+ë6šc˜,é0bùsš½Ósá+†¥2ôÁe¬xþ»™¿Û ^IG©²ãP1´Ê=!}#@úî04²þiö”ßrHÇ’M”*NÃYÎB-Í>WJÈø0ù؏¢®ú—<•"ËŠ£®”jþ,„Eè+0LÃÆ ù!ZUè5蟆Av”"£äù÷ìúih¡	¨·ßÑE¬wÜfåÆZßQýT,nQ›¹ƒy]DîQ/Ã8}U¢m\O\MòºTÍ5îÑø‰PK
+    r6ˆÐ²æ-  ¬  /   org/apache/regexp/ReaderCharacterIterator.classmSÛRÛV]Ç’-
+åf"¡4­­@
+!¡i’’€¡­SŒÛ’IûaŒ3É#É	¿Ò™¼´Í/<„™bÏ„NóžÈ7äú\º·,h‹mÏѾ¬µ¯zû÷ë?¡`?èE¶IÌi˜×Iw…>®ëtÜ`Ý¢ŽÏqSÃn鸍;:úð%›—Ør—}îñ±¬c9~[e뚆¯4|­á„'í²ôÖŸÚÏìlÕÍ>5·ÔíÆÎŽÀŶ¥f;•ìfàUÊ
+éCD©æú², ~$áNÕ©KÃéó\™-b˹e)Ðë7¶ýE`4Ïg:؉7™î®O”vmo9 2rÈ	Ä«þšSn‹”ÊÅ´¥¼€¾¶W’õ ê:¾€Æ¦åZM at Is6	éø
+O¶·L`ÆÀEŒQRÝ«e—Ï\‚i`)ƒ¦Db÷5|k`
+QݧUç‹g¡2çùòNYîAqgÅm8eÿÌWúîs¨
+W9¥)LøWñ†ï
+¤ñÀÀ&ò[†è]¯’µëviWf=Y‘{õ¨é9j•]
+¤—§¿¸<ãS)n?•%jät'¼°'p7£™¤»Nfà¼î´¡êá®ç>··kÔo½"ƒ‚ô}»"yΝ\átjÒ©»á°h’ýÿ_'š{ú§v½.y&HÑm—¢MÅ<­ý(>¤o`ˆçÐMä;Æ󤻇오ó2I¨dRVºz„˜uåñ`-¨Gˆ[ʇàŸàñG°
+ Ò=i· Y¿#ÞD9ÞD鬒cô=žmÂháÂrç† GÓÁ<(QÜþS|¼*0|æ¿ðzÚpZžà¦eFñ	<pÐ	
+þŸFàÕ<׎;h¾D\98cbÍoÐÔ}¨Jãª`:dŒñbÒÉŒjFœîeÂ'~f6óxAYRUÒÄ?´¨&Õ賨©‰}Œ¥’ê“%Ž6£$Õ&†¥Ì_NÞ¥ÂN[ôW)˜NôôyDA&éæ’†÷‰fPyßÂÈ£0ÞÉ_‡0úl#wš'|¥›zhFEþJï–©>‰Ä2ó'Â?PK
+    r6?s2Ð  ¢  /   org/apache/regexp/StreamCharacterIterator.classmSKSÓPþnQyûHÑ6€ßO*j¬Š#ƒ+C{)ujÒIRåøÜ9ãJaÃBf¤ÑÝû#\û\‹ç´ÚdrOÎãûιçÜûãÏ—oP0†Ç:úlC/Æ5Lèd;ÃÊY^Îé´œgÛqIÃe
+Wt\Å5í¸ÎîIöÜà˜›¼Lé˜FŠÿn±wFÃm
+w4܈|Þ¹çöK;Yp“i§TOÚ/®
+¨Ë啁CuwÑvòIòœü4Ù¥GÑlÑõeN@<%åZÁ)“ˆ7%L<!Ê”›“m~yÙ¯Q	ôÅÓéDC
+"ï7·G³«¶7¤Z
+þŒ“««T†JÉB-- Ï¬ee)(¸mTc×T±( Ä¹š¨tü²'ëÁOŨC8LE5ß2‡œ6p¦ú
+š©iÌj¸g`Ǻw¶žÙI-ØË—vrr-S2+ÓnÙÉù;±æÌc–SÝ70Â%
+bÈÀ	Èà†‡âx`àø/Aô®—OÚ%;»*“žÌ˵R²ÞôµÊÎÒKÓg®'Ðñ¿”Ìòs™¥F5› [w!œYO¼éd:öÚþµ£fz¼ê¹¯ìå"õ[ÏË`^ú¾—<çF®ÚtŠÒÉ«µa¥w7öÿ™¢ »T’<}3žj¬)<¨˜ c߁ƒtºx I#ÉO’d+ùb€Öc¤% ’è·ªÖÈ"ÖW(KT¡n¡ÅR¶Ý?‚ÂÎR•ä€«B³>£¥‚V3VAÛ§û_Ѿ4VQžïÎtA	†B‚	"P¼ûÿá+8ðižá£»áôÖát4Bx2„›–æ'pÇF#x?½uðIœ
+Á·Bðx=o§ù-ÊÆ[>@Sס*
+ŒûhC5ÆIZ™1E’Ûq‘ðÑ·ÌfN®c´H]×cïÐnQ7£ëèá±7t/¾V¶ûßmÿ4ûsµþZô©”B'2º!õ IÞH÷:qt*¿ªèY¬eÙþ½Ù £k¸¿<×ázEê¦ní=ý[¦ú,TsÌ·—PK
+    r6½ñ68U  O  /   org/apache/regexp/StringCharacterIterator.classuËNÂ@†ÿ¡…B­
+(x¯¸(Ó¸Ö˜⢉‰î†2)%¤i5¾Ž+7.4QL\ø >”ñTLçdþÌå›ÿœ9Ÿ_ïÐp€=Y”s0°bbkJÖ•T”T
+lØ4°Å EÒc(žwù-wz<ôËX¡Đ9 >a(ÙÓ×õ+½Ùo†\tÓŠF§eÛuë³ÌJöìóŒ×áò4&3šé :ÛãíµÛLÌر°ˆ¼’‚…"–,ì¢ÆPïKßáîu„#…/î‰w“|¹éÒäq_2äó_´ºÂ£¬µéç3j¶únþoùT}O„~Ü.©ßYPChUÕ Ò´¶0Oº@»2R€Ùxkì¿"õ5˜úÛ„Ñ(ó‚T¥:„ö4a
+	SJ|r#fý¡Æüƒ¤d™®ÆÈF‚*Š"sC€®Q|PK
+    r6ß»œÃÏ  Ú  !   org/apache/regexp/recompile.classuUKsEþF¯­üHd°qb,)rL0A~ q1ÇØq ˜@Æòx½FÚÝZ­¥(n9s‡TùäsrpRI•¸ó;ø	=«‡åXìaf§ûëþ¾én­þyñ¬(
+ðtŒ¡ á}’(b‚㢎I| Óá’†upÔ2Åñ‘Ú/s|ÌQâ˜æ˜QÐY<§ã|Êñ™Ž+˜ç¸ªcŸs|Áqc‘ãKŽ¯8–4|ͱÌq]Ç
+.kø†cUÃÇ
+
+ën2$flÇæ¢Ùcóî–¤­*l‡a8»±´+îŠbE8Vq-ðmÇšÎÝ4EŽ!ãúVQx¢¼#‹¾´dÝ+®.Ì»UÏ®H_÷¾Ã-†ìzMX²dú²Üô™3žé;Ž¨Ê¹ÎiNÃ÷6ðƒÛø‘È_e¾²·½-}?ჱèԯخS3 °ÉÓMzŠEsÅ—…ÙñZ{ᛤϗµáÍ1†È˜Î à¦çÛwE ÍZ »lnÛŽ¨˜åáoÜ6’欦ýÅ@YiÛ‚Ô°mÀÂyC—z4Øvñ3›ÐP1P02Q§eœòh!ò×i†óúÿ²®.¬ø®å‹*±#ïÙ²”)Gñçz•}í¾ˆúB½,=UjNÓbJßw}Óvº¯?BÝ)‘d—áÔQ•»¢‡×ÂËr@õ“ms‰TõwÁUf†EGuÔ‡T
+tæ¤ÂNó)à(ÅõÍ]â8fZ»_d•º{äH5ÇÏv‹+4́Õé¶êãfª±§NÒŸÊöš[škY·)m,»¨N	áyÒÙbï?ajαóÀmZNgO═¢Î­/ö¤èÕÊV»§{Ö±ã¦VX2èþ¨kå6æirŽˆTo,I]êÜk²ÞV¢û÷’=ðªjT‘Žì„߇ÅcãrcÇwï‰ÍŠÄY¼G6õDÀÔ·Ö<ig´ÇóOÀ…€$.`¼éf#†>Ú>GäÖD—ò¿ çqïwô?Fl(~ˆDô)´èìóó™Éå|&vg²{NødáúP-‡0Jq
+hÙ‡^#[:¦¼¯«¥_ãêm 	>Äàå*%´)-8Ä©N% RÉ”æý>Åš€ižJ^zŠTI?@ºM0¬2ê-æðí
+mÿå¿]Þl#†ÒÎI–J¦ycÿåŸ*û[t»®ˆ3„o”éÈ}»š8€»Ü…}—T…1›ag» WK±.ì¹V1º#ÇÊ5Ú"<B<ˆD2ùÆþ‹ßÑÿÖ(a£x'ÜW0î>ΫnþPK
+    èŒr6¼]{l  ],     META-INF/LICENSEÝZ[sÛÆ~÷¯Ør¦Si¦4i牱䆭CiD¹n&“‡%° ·°È. Šýõ=—½¤dwúVM¦5IìÙ³çòïœ…Ÿù[ô²Ü)ñ^—ªsêÅ3OþCY§M'¾ž¿.Äßd7J{_¿~ýÍ“‹vÃпyõj¿ßÏ%m37vûªá­Ü«¸ðþúX¬®ÄÛ›ÕÕò~y³Z‹w7wâÃúºw×·w7WÞâ×=uµ\ßß-ø€ß€¯æâJÕºÓ(çæ/¼63¢™p;Ù4¢U²œtP¶uBv•(MWñ*Q+F§
+aUoM5–øuáE᳕vƒÕ›¿Ò‰
+·T•ØÄZ•,ä+o͸݉჆çL9¶ªŽõ2öD±Òô«·»A˜}§¬ •`¡BŽÃÎXýoÚÏË9·bØÉAÀ¦[+aa·¥‡¼2ÔV6âšDŸ(1vx@Ò^	Y’” ˜žõb<àÔÊñÖ`ÐÁš¦Òªð¡!¥<
+~;v,+MÛšÎKòŠ½v,‡7œ‹wÆ’ýh{“¬|4óRft'.ô%/5{epŸ/¡ºãb0¢”àt|ÎKáŸÈV´²“[…ÎÃ}ÝXî¼b…Øï¼OûJ’[f¯1š@Ê…MÈ=n§{”Të¬Ù+[¢è‹o_ÿþ’¶3`6|4n «£ÀMV¹ DnTF(5¸r"=Ó3¹üg3ÎĬÅÙÙeîuømò «eY‘LJ A[íPлÕÎQÀSœq[NBm
+»•‚^íq¤õVÕÊZXN¿ÖdñO¸Ek*
+G“”UÁÁº+›‘LI(:3ˆF·w?:S{/G‚S*°~È=äÅðEÈÿZoGK¿ƒ[•ÁÇÍæ_
+§ªËîÀ߁;Ɔò£¶¦…˝ì@ë Ã'e(ú¦ñk!›‡ÄÓzGÇ„´é5&”!åü1·	pøzrà½à¤ŒÞåpÒR‡>?öGc?€Â¾$	‡0ÒR
+è.#& ›Î«• ɃԍÜ4!ÿ3\*M1 KéCIF\èf€‡#¼±¥àaMf•Ã€µ…,´õ".à êQ¶=ìÚ!Ìy!>¹è{;?B25f™¬p¥¬~ +>(q³ãÀ=ÎÛÀŸÞKbÅ7Ò¡ó:JÅ
+÷Àè‡èa¬Â­È]˜û.w€³¨™V=hr%F1˜Æç‰P`acÃ'áÝœg“†UN9ˆ²¾„ÍLCIËôVw°Ë©ÏOñ8àT=IÿB›Ï[£ÙûŽÄûªaU+uÌOÕKK‘‚v¡c´Êªæ yÐ}"Ãm Z0N:ÙªËàt
+ at dkYR‘(²z¢ZG™:yý-B¹¯ñg=~œ1e³ý¢}Â…Zõ@aŸPWž‰I†mC«à÷§”/²¤õ
+lÝØvã°ÃƒGà]¤9©çS6"?¡ÁËTîž­9QAT¦í1Þ7
+ŒYƒ)ž&/_VíÅ,žiæeq½°‹T	h
+€q^ØȆâhoq]Gäcì¼õfAnt•…v\J²¿+ž-E»ò=࿤ ¢npq”¤e%+R!wpƒj]áPsG…%¤¤éŸ`÷cåc¶¹Vnô"ƒ‘IdÖF»Ç-GGUžvl	/=üHˆ—J“zF˜ž5Ä#ÅõºÍè y[i?!ôÙÄŽåRNo;Â~Eôöl$"XÍV`o)ò\ÏNSøˆ_Çc‡ü,åÉ
+ˆøØm*v ÌFA<eT„ä t¾OJB§~!~ܶ4`o.×Hx³ôc úz.þŠ´
+·}˜•X\\}¬žmf²4ËQYA•™BèL,ŽxC8%0¼^
+`™~ }Mµ×È5:Ó½$Ï;81~|	¬Çn±q2Ù‡—µUðI±{0%ùI5÷ýnº-X9ÖcŸ ]‚ó~ÜÀZ°"jßHôø
+èÌ¥ÖÑ7žXä}[Nó#Y>ÙñL9'laý1sЭDÐý?ðÎ,Sý€	-Ç((è¸!º=Ÿ5óÐu¶“ŠX^PˆúhS×Èó ¨à—ÿÅ؁qÀeÏ
+	fÂÉÐ죰«ìûÛMӁÓÉʈ]^µ²‘ìÍÏf‡+’Üº7;È^ç¤Õ”µô	Ò¡öå‰á.¡
+6òàIdõ´ìxA8w¸¾Ú‚úLò¦Êù-öèŠPëæbY£ÿc/ä ©0¦£S½eäVâÏr¾q¿H+rkkœ{IÃc”fDþÄŸÁóR4rïF=àQµå" Ê'Np„ŠÏÕVÜùV;É)“sáXÁ-1UÃTl‰2…fÔgJh4RŽù’XWLQô^ˆéa«àË|Ѻ 
+ûÄŠ¡à›¹¸SùdhN[·òí… uà6<z†å‘K6Âf#€Å2ø+ò´mæþ’©"ƒ¤Ðj•b/צžˆë{À®7¡Î^ÈK>鑶E}Q=î7À­Žˆ •SßØâßÉA%Õ‡ãNâ{*£aÏM¶'n•Æ>
+ûwêX!ht‡qÂݣ˶Gˆ‹!2±uß’1Ë™î\f;[5@‚7g-<u Ññ᲍ã†) 
+Ì°TÝÂb¥7™ Rºù³ñâŒ>ǐŠ‰¹1z¤\eˆÐB•Ác¢99ãì
+Ÿä´TOV]"hEÿûÆ]=[ÝÜ/ß^Ï ù²7¦ß)w¶Ož]œÉ”Ë’¿2Q¡õ”àCYQ™‚N5+‚’Ä9o&ƃ!„ŽP|‰]31ç-|Ö®l £QÒa;•Oéý’”­@Œ`Ó7AMtL¶NšD•{V‡ïs0ŸYž×Ó”ÐuÂ,™ÛTOå[œZY®—M¹|opÆJõQ¦€mõyˆ¾ép>
+3%¡	½ßq†øujæÌßD¸•ŽC>è!RóŠeªŽÏ-B¬Ãd6ˆ¬*ü·Å~'ÈLJPÝ[èK2¡`ë;pD~&ê§p¼QUª«Æ6ÐÖIÄ`áþ/¸óÓÈÀaˆf8›L4­‚ž‰y€ã
+óÔ½ÅY¥®‚h+
+ë™ 
+¾2W Ž\eÉid­–{†Á§ÑÞ™+#“Ý™úŒ6EJ›ššÅíH>‹©Dòpëlš—8¹­šTáȺq–LTãh2–‰ÊQ'0qÈ·Ôìø› îUtsñ¡ƒ*êÈiê6*5¶¿$1» ‰óÃ1‹Ì†YÙëÉÑUbú¸ãñ ‡©Þ&Ÿ>ÿ7­™§Y¤f0,‚©knyýÊ¸(ÞÞP}ÙnÊ0m·ÔÞa!ÕÜåÀ©JñE¦A濳‚cK´…žŽÿà3„:2õ¨Êâ	x£A¬ÚJË÷Jǽ‡¿ø@a  a1ãÑ•!ä˜rg7Bhx¡Æô%\cÈçf‘ÑàÔKÙœéû “a~8mÐ8DJjS­úmÔþöºŸ`I'—Bá7-^O£6`eà%л"68©=™Ï†l
+~óÕàL	`Kýy.®´£Ö	/mkñø'Øå“ ªº9pK7¶X	È‹Ô¼¤)X‘æsß%U/PW·¨ùÓ8¾œ8÷çZ ù³ÅZ,×3ñÃb½\ã~\Þÿxóá^|\ÜÝ-V÷Ë뵸¹Ë¯åoÞ‰Åêgñ÷åê
+èŽæàGœŽºtM¸RecÒ”A4'•§Ðä’©¨!²§Ƽ_Þ¿¿.Àê«—ËÕ»»åê¯×?]¯îñÓõÝÛAËÅË÷ËûŸ)„Þ-ïW×k~}`áeÜ.îÀaÞ/îÄ퇻ۛõ5W[¾-lðfôïaSM·t3Ã]á4\ÀsÖôV#=§×]øÅ_BÜl^ÊÓFç€áq\kGÈîL©c›Ì îïYi›_´ž6³{™Ãç`R\ô^ˍnèò|‰•W ýéÒƒeÀW
+
+;AGè´³QK¸É‚ ò‘A§¶öUªË"Þv“Qnœü|6Þ/˜(àL¿Ñ"t¤ÜçñÞ"l9àŽnÇÏç£ç¤|àP&¸¬Ñ´±Ÿke+·Ó>®¯¤—\¯ðn=»}†„bËW	H`x¦‹r^h at hœ¹Þ8®¶|gŽU<Öj¼5>ntÉšcĘ‘¿Ñwf†«ùÄàâÙ;ñ »1°[cª½nòÙá'(ʦï%N	‘Œ¨x-u3Z®F²©Ç.‘*‚gÞÁ[ Þܼ±r8‡HЏq^F¦ËêAÓ%ií_߀ðF/7xñœßÍŢĚ€VÈ‹;/R¡Î’âã©û4]/Ÿ½n,´ÜÃSPštN.Ûiæ
+¼­V„' u¤¡ìJŇèyêÑï@q§Ú_-I16ktfÓø)ñ–W;È|ùª΃ùâû+46?š=vBÜJFƒ‘=3Áé|ôFK×d·!‘sûkâú¯HŒ’¾ÄtÒ-JBô4)ÊÂÀÏ„±gÒ5ã3&<ç;Ù¦Ž¶©T
+í
+¯ f\KÛr­˜Òy´6Ý–ùÉ1`2tåجòµ8ožl¤Ðɦ‘Ìï³hÌhcÔ…øzu…uõÜkpôûâöYþó
+º¦€¨ÿúBþêþFªìã]üÝá‚¿F1&Zm k,´áC˜j©“¯µj*' @@²3èoð–RAdÎ~ùu&¾ÚB0ªú®/ë¤çââÊtˆïd9„ÿîRP·Nmªz‘ ?êể¬lgw³˜+î xþ/B©©g '`aãð‚ŠŸösÒ€âô,Ç
+D2Vn»ˆfö¡‡«ÕJ¯¬Ð
+iÐÄáÂ(GƒkÄàÖŠéͧùÕ„ÀÓñ>Þ[.Ü»ÆñLrH[îðÆšƒ!]&þr€¿_Å/¤7èytËú+=Êz¦iøù¡âˆï\^~"B?‚@ÀåˏύםoC	cDEŠ#R×o64-““‘]d9„pÿÜ+§ï»¯Ö×/AeZò%ý)îáß9C1ÙHíô
+'¼4ÈxŠÿô;o2ÛZ©‰
+!ȉÖ@ÌÀѺí” ÊBwüfŸŸ–$¾îNÏ5ñPK
+    èŒr6v贲à   .     META-INF/NOTICE}±nÃ0Dw}Çf±÷n]
+tü mÑYDÊ®ÿ¾r‚2Aï®r_GNc¬žT&Û°xZ)J&Ãà#ãØäòkø”š<K‚·`–ßû~Û¶¶NÊÜŸ:ç¾FIÊj
+2Á*±&ò[+<Ô#@aAOíQÓ´7Ï+ûŠQ]K(`œŽk{‰ÑÁ9*ÁÊÊv˜]«w£V/ÈBgú#½á‹áÚB3}çLR`‘BŽS—g´ûPK
+     r6            	         íA    META-INF/þÊ  PK
+    r6sGV^   j              ¤+   META-INF/MANIFEST.MFPK
+      r6                      íA»   org/PK
+      r6                      íAÝ   org/apache/PK
+     r6                      íA  org/apache/regexp/PK
+     r6¸ƒR    7           ¤6  org/apache/regexp/CharacterArrayCharacterIterator.classPK
+     r62¯+óŸ   Ó   )           ¤Ý  org/apache/regexp/CharacterIterator.classPK
+     r6R—àsè  '             ¤Ã  org/apache/regexp/RE.classPK
+     r6û®Yä  G  *           ¤ã  org/apache/regexp/RECompiler$RERange.classPK
+    r6lˆá"¯  ™"  "           ¤  org/apache/regexp/RECompiler.classPK
+    r6¡Ö.
+i  
+  '           ¤þ*  org/apache/regexp/REDebugCompiler.classPK
+    r6ÑDVî   :              ¤¬0  org/apache/regexp/REDemo$1.classPK
+    r6¶l à               ¤Ø1  org/apache/regexp/REDemo.classPK
+     r6›¨Úe§    !           ¤×9  org/apache/regexp/REProgram.classPK
+     r6!õð¢ü   s  )           ¤½<  org/apache/regexp/RESyntaxException.classPK
+    r6üŠ4%3  ö&             ¤ >  org/apache/regexp/RETest.classPK
+    r6­8µjõ  l  "           ¤oQ  org/apache/regexp/RETestCase.classPK
+    r6lK ½               ¤¤Z  org/apache/regexp/REUtil.classPK
+    r6ˆÐ²æ-  ¬  /           ¤\  org/apache/regexp/ReaderCharacterIterator.classPK
+    r6?s2Ð  ¢  /           ¤`  org/apache/regexp/StreamCharacterIterator.classPK
+    r6½ñ68U  O  /           ¤‚c  org/apache/regexp/StringCharacterIterator.classPK
+    r6ß»œÃÏ  Ú  !           ¤$e  org/apache/regexp/recompile.classPK
+    èŒr6¼]{l  ],             ¤2i  META-INF/LICENSEPK
+    èŒr6v贲à   .             ¤Ìx  META-INF/NOTICEPK      2  ¼y    
\ No newline at end of file

Modified: trunk/src/jar/resolver-lucene/build.xml
===================================================================
--- trunk/src/jar/resolver-lucene/build.xml	2008-10-27 12:38:39 UTC (rev 1365)
+++ trunk/src/jar/resolver-lucene/build.xml	2008-10-27 12:38:48 UTC (rev 1366)
@@ -70,7 +70,7 @@
   </target>
 
   <target name="resolver-lucene-compile"
-          depends="-resolver-lucene-prepare, resolver-spi-jar"
+          depends="-resolver-lucene-prepare, resolver-spi-jar, resolver-jar, server-local-jar"
           description="Compiles all resolver-lucene related files included
                        generated source code">
 

Modified: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/FullTextStringIndexTuples.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/FullTextStringIndexTuples.java	2008-10-27 12:38:39 UTC (rev 1365)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/FullTextStringIndexTuples.java	2008-10-27 12:38:48 UTC (rev 1366)
@@ -82,20 +82,6 @@
   /** Logger.  */
   private final static Logger logger = Logger.getLogger(FullTextStringIndexTuples.class);
 
-  /** Description of the Field */
-  private final static String SCORE_COLUMN = "score";
-
-  /** Description of the Field */
-  private final static URI LUCENE_SCORE_URI;
-
-  static {
-    try {
-      LUCENE_SCORE_URI = new URI("lucene:score");
-    } catch (URISyntaxException e) {
-      throw new ExceptionInInitializerError("Failed to create required URIs");
-    }
-  }
-
   /**
    * The native Lucene query result to represent as a {@link Tuples}.
    */
@@ -126,7 +112,7 @@
   private final List<Variable> variableList = new ArrayList<Variable>(3);
   private final List<String> luceneKeyList = new ArrayList<String>(3);
 
-  private Constraint constraint;
+  private LuceneConstraint constraint;
 
   //
   // Constructor
@@ -146,14 +132,19 @@
    * @throws QueryException if the set of triples couldn't be determined
    */
   FullTextStringIndexTuples(FullTextStringIndex fullTextStringIndex,
-      Constraint constraint, ResolverSession session) throws QueryException {
+      LuceneConstraint constraint, ResolverSession session) throws QueryException {
     this.session = session;
     this.constraint = constraint;
 
     try {
       // Validate and globalize subject
       String subject = null;
-      ConstraintElement subjectElement = constraint.getElement(0);
+      ConstraintElement subjectElement = constraint.getSubject();
+      if (subjectElement == null) {
+        // backwards compat with simple constraint
+        subjectElement = constraint.getBindingVar();
+      }
+
       if (subjectElement instanceof Variable) {
         variableList.add((Variable)subjectElement);
         luceneKeyList.add(FullTextStringIndex.SUBJECT_KEY);
@@ -169,7 +160,7 @@
 
       // Validate and globalize predicate
       String predicate = null;
-      ConstraintElement predicateElement = constraint.getElement(1);
+      ConstraintElement predicateElement = constraint.getPredicate();
       if (predicateElement instanceof Variable) {
         variableList.add((Variable)predicateElement);
         luceneKeyList.add(FullTextStringIndex.PREDICATE_KEY);
@@ -185,7 +176,7 @@
 
       // Validate and globalize object
       String object;
-      ConstraintElement objectElement = constraint.getElement(2);
+      ConstraintElement objectElement = constraint.getObject();
       try {
         LiteralImpl objectLiteral = (LiteralImpl) session.globalize(((LocalNode)
             objectElement).getValue());
@@ -195,9 +186,11 @@
                                  "must be a literal.", e);
       }
 
-      // Add the synthesized $score column
-      // Removed as it causes failure to join.
-      // variableList.add(new Variable(SCORE_COLUMN));
+      // Get the score variable
+      Variable score = constraint.getScoreVar();
+      if (score != null) {
+        variableList.add(score);
+      }
 
       if (logger.isInfoEnabled()) {
         logger.info("Searching for " + subject + " : " + predicate + " : " + object);
@@ -234,31 +227,9 @@
     try {
       if (column >= 0 && column < luceneKeyList.size()) {
         URI uri = new URI(document.get((String) luceneKeyList.get(column)));
-        /* I believe this is just localizing the uri in either the global or query
-         * string pools.  So just attempt to localize and let the ResolverSession
-         * worry about where to localize it.
-                long node = session.getGlobalResource(uri, false);
-                if (node == NodePool.NONE) {
-
-                  // Attempt to get the resource from the query.
-                  node = session.getQueryResource(uri, true);
-
-                  // This should basically never happen.
-                  if (node == NodePool.NONE) {
-         throw new TuplesException("Can't generate absent resource");
-                  }
-                }
-         */
         return session.localize(new URIReferenceImpl(uri));
       } else if (column == luceneKeyList.size()) {
-        // Generate the $score column
-        /* I believe this requires access to the session string-pool. So this will
-         * probably have to be delegated to the ResolverSession.localize method as
-         * well.
-                return session.getQueryLiteral(
-         Float.toString(hits.score(nextDocumentIndex - 1)), XSD.DOUBLE_URI,
-                    "", true);
-         */
+        // Generate the score column
         return session.localize(new LiteralImpl(hits.score(nextDocumentIndex - 1)));
       } else {
         throw new TuplesException("Column " + column + " does not exist");

Added: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraint.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraint.java	                        (rev 0)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraint.java	2008-10-27 12:38:48 UTC (rev 1366)
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2008 The Topaz Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ * Contributions:
+ */
+
+package org.mulgara.resolver.lucene;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.jrdf.graph.URIReference;
+
+import org.mulgara.query.Constraint;
+import org.mulgara.query.ConstraintElement;
+import org.mulgara.query.Value;
+import org.mulgara.query.Variable;
+import org.mulgara.resolver.spi.QueryEvaluationContext;
+import org.mulgara.resolver.spi.SymbolicTransformationException;
+
+/**
+ * A constraint representing a lucene query and a score.
+ *
+ * @created 2008-09-28
+ * @author Ronald Tschalär
+ * @licence Apache License v2.0
+ */
+public class LuceneConstraint implements Constraint {
+  @SuppressWarnings("unused")
+  private static final Logger logger = Logger.getLogger(LuceneConstraint.class);
+  private static final long serialVersionUID = 1L;
+
+  private final URIReference searchPred;
+  private final URIReference scorePred;
+
+  private ConstraintElement model;
+  private ConstraintElement subject;
+  private ConstraintElement predicate;
+  private ConstraintElement object;
+  private Variable binder;
+  private Variable score;
+
+  /**
+   * Empty constructor. Used internally during constraint rewriting.
+   */
+  private LuceneConstraint() {
+    searchPred = null;
+    scorePred = null;
+  }
+
+  /**
+   * Create a new lucene constraint wrapping a non-lucene constraint.
+   *
+   * @param constraint the underlying constraint to wrap
+   */
+  LuceneConstraint(Constraint constraint) {
+    this();
+
+    subject = constraint.getElement(0);
+    predicate = constraint.getElement(1);
+    object = constraint.getElement(2);
+    model = constraint.getModel();
+  }
+
+  /**
+   * Create a new lucene constraint.
+   *
+   * @param constraint the first raw constraint
+   * @param searchPred our predicate indicating a lucene search
+   * @param scorePred  our predicate indicating the variable to hold the score
+   * @throws SymbolicTransformationException
+   */
+  LuceneConstraint(Constraint constraint, URIReference searchPred, URIReference scorePred)
+      throws SymbolicTransformationException {
+    this.searchPred = searchPred;
+    this.scorePred = scorePred;
+
+    // extract model
+    model = constraint.getModel();
+
+    ConstraintElement s = constraint.getElement(0);
+    ConstraintElement p = constraint.getElement(1);
+    ConstraintElement o = constraint.getElement(2);
+
+    // extract the binding variable
+    ConstraintElement b = p.equals(searchPred) ? o : s;
+
+    if (!(b instanceof Variable)) {
+      throw new SymbolicTransformationException("Lucene query binder must be a variable: " + b);
+    }
+
+    binder = (Variable)b;
+
+    // extract predicate, object, score
+    if (p.equals(searchPred)) {
+      if (s.equals(binder)) {
+        throw new SymbolicTransformationException("subject and object of '" + searchPred +
+                                                  "' may not be the same: " + s);
+      }
+      subject = s;
+    } else if (p.equals(scorePred)) {
+      if (!(o instanceof Variable)) {
+        throw new SymbolicTransformationException("Lucene query score must be a variable: " + o);
+      }
+      score = (Variable)o;
+    } else {
+      predicate = p;
+      object = o;
+    }
+  }
+
+  /**
+   * Merge the given constraint into this lucene constraint.
+   *
+   * @param constraint another raw constraint
+   */
+  void conjoinWith(LuceneConstraint constraint) throws SymbolicTransformationException {
+    model = getNoDup(constraint.model, model, "Can't combine lucene constraints against different models", "model");
+    subject = getNoDup(constraint.subject, subject, "Can't combine lucene constraints with different subjects", "subj");
+    predicate = getNoDup(constraint.predicate, predicate, "Only one predicate supported per search", "pred");
+    object = getNoDup(constraint.object, object, "Only one object supported per search", "obj");
+
+    binder = getNoDup(constraint.binder, binder, "Mismatched binder variable", "var");
+    score = getNoDup(constraint.score, score, "Only one score supported per search", "score");
+  }
+
+  private static <T extends ConstraintElement> T getNoDup(T elem, T existing, String msg, String elemType)
+      throws SymbolicTransformationException {
+    if (existing == null) {
+      return elem;
+    } else if (elem == null) {
+      return existing;
+    } else if (existing.equals(elem)) {
+      return existing;
+    } else {
+      throw new SymbolicTransformationException(msg + ": " + elemType + "1=" + existing + ", " +
+                                                elemType + "2=" + elem);
+    }
+  }
+
+  /**
+   * Do some basic validations on the finished constraint.
+   *
+   * @throws SymbolicTransformationException if validation fails
+   */
+  void validate() throws SymbolicTransformationException {
+    if (predicate == null)
+      throw new SymbolicTransformationException("Missing predicate for lucene constraint: " +
+                                                "subject=" + subject + ", binder=" + binder);
+
+    if (subject == null && score != null)
+      throw new SymbolicTransformationException("Missing <mulgara:search> for lucene constraint: " +
+                                                "binder=" + binder + ", predicate=" + predicate +
+                                                "query=" + object + ", score=" + score);
+  }
+
+  public ConstraintElement getModel() {
+    return model;
+  }
+
+  public ConstraintElement getElement(int index) {
+    throw new UnsupportedOperationException("Cannot index LuceneConstraint");
+  }
+
+  public boolean isRepeating() {
+    return false;
+  }
+
+  public Set<Variable> getVariables() {
+    Set<Variable> vars = new HashSet<Variable>();
+    if (subject instanceof Variable)
+      vars.add((Variable)subject);
+    if (predicate instanceof Variable)
+      vars.add((Variable)predicate);
+    if (score != null)
+      vars.add(score);
+    return vars;
+  }
+
+  /** the subject of the search triple */
+  ConstraintElement getSubject() {
+    return subject;
+  }
+
+  /** the predicate of the search triple */
+  ConstraintElement getPredicate() {
+    return predicate;
+  }
+
+  /** the object of the search triple */
+  ConstraintElement getObject() {
+    return object;
+  }
+
+  /** the variable that binds the raw constraints */
+  Variable getBindingVar() {
+    return binder;
+  }
+
+  /** the variable that holds the score, or null */
+  Variable getScoreVar() {
+    return score;
+  }
+
+  static LuceneConstraint localize(QueryEvaluationContext context, LuceneConstraint constraint)
+      throws Exception {
+    LuceneConstraint localized = new LuceneConstraint();
+
+    localized.subject = (constraint.subject != null) ? context.localize(constraint.subject) : null;
+    localized.predicate = context.localize(constraint.predicate);
+    localized.object = context.localize(constraint.object);
+    localized.model = context.localize(constraint.model);
+
+    localized.binder = constraint.binder;
+    localized.score = constraint.score;
+
+    return localized;
+  }
+
+  static LuceneConstraint bind(Map<Variable,Value> bindings, LuceneConstraint constraint)
+      throws Exception {
+    LuceneConstraint bound = new LuceneConstraint();
+
+    Value val = bindings.get(constraint.subject);
+    bound.subject = (val != null) ? val : constraint.subject;
+
+    bound.predicate = constraint.predicate;
+    bound.object = constraint.object;
+    bound.model = constraint.model;
+
+    bound.binder = constraint.binder;
+
+    bound.score = constraint.score;
+
+    return bound;
+  }
+
+  public String toString() {
+    return "LC{subj=" + subject + ", pred=" + predicate + ", obj=" + object + ", score=" + score +
+           ", binder=" + binder + "}";
+  }
+}


Property changes on: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraint.java
___________________________________________________________________
Name: svn:keywords
   + Id HeadURL Revision
Name: svn:eol-style
   + native

Added: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraintDescriptor.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraintDescriptor.java	                        (rev 0)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraintDescriptor.java	2008-10-27 12:38:48 UTC (rev 1366)
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 The Topaz Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ * Contributions:
+ */
+
+package org.mulgara.resolver.lucene;
+
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.mulgara.resolver.ConstraintOperations;
+import org.mulgara.resolver.spi.ConstraintBindingHandler;
+import org.mulgara.resolver.spi.ConstraintDescriptor;
+import org.mulgara.resolver.spi.ConstraintLocalization;
+import org.mulgara.resolver.spi.QueryEvaluationContext;
+import org.mulgara.query.ModelExpression;
+import org.mulgara.query.ConstraintExpression;
+import org.mulgara.query.ConstraintElement;
+import org.mulgara.query.Constraint;
+import org.mulgara.query.Value;
+import org.mulgara.query.Variable;
+import org.mulgara.store.tuples.Tuples;
+
+/**
+ * The descriptor for the {@link LuceneConstraint lucene constraint}.
+ *
+ * @created 2008-09-28
+ * @author Ronald Tschalär
+ * @licence Apache License v2.0
+ */
+public class LuceneConstraintDescriptor implements ConstraintDescriptor, ConstraintLocalization, ConstraintBindingHandler {
+  @SuppressWarnings("unused")
+  private static final Logger logger = Logger.getLogger(LuceneConstraintDescriptor.class);
+
+  public Class<LuceneConstraint> getConstraintClass() {
+    return LuceneConstraint.class;
+  }
+
+
+  public Tuples resolve(QueryEvaluationContext queryContext, ModelExpression modelExpr,
+                        ConstraintExpression constraintExpr) throws Exception {
+    return ConstraintOperations.resolveModelExpression(queryContext, modelExpr, (Constraint)constraintExpr);
+  }
+
+  public Constraint rewrite(ConstraintElement newModel, Constraint constraint) throws Exception {
+    throw new Exception("Not implemented");
+  }
+
+  public Constraint localize(QueryEvaluationContext context, Constraint constraint) throws Exception {
+    return LuceneConstraint.localize(context, (LuceneConstraint)constraint);
+  }
+
+  public ConstraintExpression bindVariables(Map<Variable,Value> bindings,
+                                            ConstraintExpression constraintExpr) throws Exception {
+    return LuceneConstraint.bind(bindings, (LuceneConstraint)constraintExpr);
+  }
+}


Property changes on: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneConstraintDescriptor.java
___________________________________________________________________
Name: svn:keywords
   + Id HeadURL Revision
Name: svn:eol-style
   + native

Modified: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolver.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolver.java	2008-10-27 12:38:39 UTC (rev 1365)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolver.java	2008-10-27 12:38:48 UTC (rev 1366)
@@ -355,6 +355,7 @@
       logger.debug("Resolve " + constraint);
     }
 
+    // check the model
     ConstraintElement modelElement = constraint.getModel();
     if (modelElement instanceof Variable) {
       if (logger.isDebugEnabled()) logger.debug("Ignoring solutions for " + constraint);
@@ -363,9 +364,17 @@
       throw new QueryException("Failed to localize Lucene Model before resolution " + constraint);
     }
 
+    /* temporary hack because $_from is not resolved before transformation occurs, and hence
+     * no LuceneConstraint's are created when doing ... from <lucene-model> where ... .
+     */
+    if (!(constraint instanceof LuceneConstraint)) {
+      constraint = new LuceneConstraint(constraint);
+    }
+
+    // generate the tuples
     try {
       FullTextStringIndex stringIndex = getFullTextStringIndex(((LocalNode)modelElement).getValue());
-      Tuples tmpTuples = new FullTextStringIndexTuples(stringIndex, constraint, resolverSession);
+      Tuples tmpTuples = new FullTextStringIndexTuples(stringIndex, (LuceneConstraint) constraint, resolverSession);
       Tuples tuples = TuplesOperations.sort(tmpTuples);
       tmpTuples.close();
 

Modified: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverFactory.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverFactory.java	2008-10-27 12:38:39 UTC (rev 1365)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverFactory.java	2008-10-27 12:38:48 UTC (rev 1366)
@@ -68,6 +68,8 @@
   private static final Logger logger = Logger.getLogger(LuceneResolverFactory.class);
 
   public static final URI modelTypeURI = URI.create(Mulgara.NAMESPACE + "LuceneModel");
+  public static final URI searchURI = URI.create(Mulgara.NAMESPACE + "search");
+  public static final URI scoreURI = URI.create(Mulgara.NAMESPACE + "score");
 
   private String directory;
 
@@ -95,6 +97,12 @@
     } catch (NoSystemResolverFactoryException en) {
       throw new InitializerException("Unable to obtain system resolver", en);
     }
+
+    // Register LuceneConstraint
+    initializer.registerNewConstraint(new LuceneConstraintDescriptor());
+
+    // Register the LuceneConstraint's transformation
+    initializer.addSymbolicTransformation(new LuceneTransformer(modelTypeURI, searchURI, scoreURI));
   }
 
   //

Modified: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java	2008-10-27 12:38:39 UTC (rev 1365)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneResolverUnitTest.java	2008-10-27 12:38:48 UTC (rev 1366)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 The Topaz Foundation 
+ * Copyright 2008 The Topaz Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -22,6 +22,8 @@
 import java.io.StringWriter;
 import java.io.PrintWriter;
 import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.transaction.xa.XAResource;
 import javax.transaction.xa.Xid;
@@ -30,16 +32,25 @@
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import org.jrdf.graph.Literal;
+import org.jrdf.graph.URIReference;
+
 import org.apache.log4j.Logger;
 import org.mulgara.itql.TqlInterpreter;
 import org.mulgara.query.Answer;
+import org.mulgara.query.ConstraintConjunction;
+import org.mulgara.query.ConstraintExpression;
 import org.mulgara.query.ModelResource;
 import org.mulgara.query.Query;
+import org.mulgara.query.Variable;
 import org.mulgara.query.operation.Modification;
 import org.mulgara.query.rdf.Mulgara;
 import org.mulgara.query.rdf.URIReferenceImpl;
 import org.mulgara.resolver.Database;
 import org.mulgara.resolver.JotmTransactionManagerFactory;
+import org.mulgara.resolver.spi.MutableLocalQuery;
+import org.mulgara.resolver.spi.SymbolicTransformationContext;
+import org.mulgara.resolver.spi.SymbolicTransformationException;
 import org.mulgara.server.Session;
 import org.mulgara.util.FileUtil;
 
@@ -72,6 +83,7 @@
     suite.addTest(new LuceneResolverUnitTest("testConcurrentQuery"));
     suite.addTest(new LuceneResolverUnitTest("testConcurrentReadTransction"));
     suite.addTest(new LuceneResolverUnitTest("testTransactionIsolation"));
+    suite.addTest(new LuceneResolverUnitTest("testLuceneConstraint"));
 
     return suite;
   }
@@ -412,6 +424,331 @@
     }
   }
 
+  /**
+   * Test LuceneConstraint generation.
+   */
+  public void testLuceneConstraint() throws Exception {
+    logger.info("Testing LuceneConstraint generation");
+
+    LuceneTransformer transf = new LuceneTransformer(LuceneResolverFactory.modelTypeURI,
+                                                     LuceneResolverFactory.searchURI,
+                                                     LuceneResolverFactory.scoreURI);
+
+    Map<URI,URI> modelsToTypes = new HashMap<URI,URI>();
+    modelsToTypes.put(URI.create("test:lucene"), LuceneResolverFactory.modelTypeURI);
+    SymbolicTransformationContext context = new TestSymbolicTransformationContext(modelsToTypes);
+
+    try {
+      // simple query
+      MutableLocalQuery q = new TestMutableLocalQuery(parseQuery(
+            "select $foo from <test:bar> where $foo <test:title> 'blah' in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      ConstraintExpression ce = q.getConstraintExpression();
+      checkConstraint(ce, null, "test:title", "blah", "foo", null);
+
+      // basic complex query
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo from <test:bar> where " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <test:title> 'blah' in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      ConstraintConjunction cc = checkConstraint(q.getConstraintExpression(), 1);
+      checkConstraint(cc.getElements().get(0), "foo", "test:title", "blah", "search1", null);
+
+      // complex query with score
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 from <test:bar> where " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <test:title> 'blah' in <test:lucene> and " +
+              "$search1 <mulgara:score> $score1 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 1);
+      checkConstraint(cc.getElements().get(0), "foo", "test:title", "blah", "search1", "score1");
+
+      // complex query with score, different constraint order
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 from <test:bar> where " +
+              "$search1 <test:title> 'blah' in <test:lucene> and " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <mulgara:score> $score1 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 1);
+      checkConstraint(cc.getElements().get(0), "foo", "test:title", "blah", "search1", "score1");
+
+      // complex query with score, another different constraint order
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 from <test:bar> where " +
+              "$search1 <mulgara:score> $score1 in <test:lucene> and " +
+              "$search1 <test:title> 'blah' in <test:lucene> and " +
+              "$foo <mulgara:search> $search1 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 1);
+      checkConstraint(cc.getElements().get(0), "foo", "test:title", "blah", "search1", "score1");
+
+      // two simple queries, shared var
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo from <test:bar> where " +
+              "$foo <test:title> 'blah' in <test:lucene> and " +
+              "$foo <test:author> 'Smith' in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), null, "test:title", "blah", "foo", null);
+      checkConstraint(cc.getElements().get(1), null, "test:author", "Smith", "foo", null);
+
+      // two simple queries, shared var and predicate
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo from <test:bar> where " +
+              "$foo <test:title> 'blah' in <test:lucene> and " +
+              "$foo <test:title> 'Smith' in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), null, "test:title", "blah", "foo", null);
+      checkConstraint(cc.getElements().get(1), null, "test:title", "Smith", "foo", null);
+
+      // two simple queries, separate vars
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $bar from <test:bar> where " +
+              "$foo <test:title> 'blah' in <test:lucene> and " +
+              "$bar <test:author> 'Smith' in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), null, "test:title", "blah", "foo", null);
+      checkConstraint(cc.getElements().get(1), null, "test:author", "Smith", "bar", null);
+
+      // two complex queries with scores but shared var
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 $score2 from <test:bar> where " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <test:title> 'blah' in <test:lucene> and " +
+              "$search1 <mulgara:score> $score1 in <test:lucene> and " +
+              "$foo <mulgara:search> $search2 in <test:lucene> and " +
+              "$search2 <test:author> 'Smith' in <test:lucene> and " +
+              "$search2 <mulgara:score> $score2 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), "foo", "test:title", "blah", "search1", "score1");
+      checkConstraint(cc.getElements().get(1), "foo", "test:author", "Smith", "search2", "score2");
+
+      // two complex queries with scores and separate vars
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 $bar $score2 from <test:bar> where " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <test:title> 'blah' in <test:lucene> and " +
+              "$search1 <mulgara:score> $score1 in <test:lucene> and " +
+              "$bar <mulgara:search> $search2 in <test:lucene> and " +
+              "$search2 <test:author> 'Smith' in <test:lucene> and " +
+              "$search2 <mulgara:score> $score2 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), "foo", "test:title", "blah", "search1", "score1");
+      checkConstraint(cc.getElements().get(1), "bar", "test:author", "Smith", "search2", "score2");
+
+      // a simple query and a complex query, shared var
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score2 from <test:bar> where " +
+              "$foo <test:title> 'blah' in <test:lucene> and " +
+              "$foo <mulgara:search> $search2 in <test:lucene> and " +
+              "$search2 <test:author> 'Smith' in <test:lucene> and " +
+              "$search2 <mulgara:score> $score2 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), null, "test:title", "blah", "foo", null);
+      checkConstraint(cc.getElements().get(1), "foo", "test:author", "Smith", "search2", "score2");
+
+      // a simple query and a complex query, shared var, different constraint order
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score2 from <test:bar> where " +
+              "$foo <mulgara:search> $search2 in <test:lucene> and " +
+              "$search2 <test:author> 'Smith' in <test:lucene> and " +
+              "$foo <test:title> 'blah' in <test:lucene> and " +
+              "$search2 <mulgara:score> $score2 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), null, "test:title", "blah", "foo", null);
+      checkConstraint(cc.getElements().get(1), "foo", "test:author", "Smith", "search2", "score2");
+
+      // a simple query and a complex query, separate vars
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $bar $score2 from <test:bar> where " +
+              "$foo <test:title> 'blah' in <test:lucene> and " +
+              "$bar <mulgara:search> $search2 in <test:lucene> and " +
+              "$search2 <test:author> 'Smith' in <test:lucene> and " +
+              "$search2 <mulgara:score> $score2 in <test:lucene>;"));
+
+      transf.transform(context, q);
+
+      cc = checkConstraint(q.getConstraintExpression(), 2);
+      checkConstraint(cc.getElements().get(0), null, "test:title", "blah", "foo", null);
+      checkConstraint(cc.getElements().get(1), "bar", "test:author", "Smith", "search2", "score2");
+
+      // invalid: complex query with multiple different predicates
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 from <test:bar> where " +
+              "$search1 <test:author> 'Smith' in <test:lucene> and " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <test:title> 'blah' in <test:lucene> and " +
+              "$search1 <mulgara:score> $score1 in <test:lucene>;"));
+
+      try {
+        transf.transform(context, q);
+        fail("query transform should've failed: " + q);
+      } catch (SymbolicTransformationException ste) {
+        logger.debug("Caught expected transformation exception", ste);
+      }
+
+      // invalid: complex query with multiple same predicates
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 from <test:bar> where " +
+              "$search1 <test:author> 'Smith' in <test:lucene> and " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <test:author> 'Jones' in <test:lucene> and " +
+              "$search1 <mulgara:score> $score1 in <test:lucene>;"));
+
+      try {
+        transf.transform(context, q);
+        fail("query transform should've failed: " + q);
+      } catch (SymbolicTransformationException ste) {
+        logger.debug("Caught expected transformation exception", ste);
+      }
+
+      // invalid: complex query with multiple scores
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score1 from <test:bar> where " +
+              "$search1 <mulgara:score> $score2 in <test:lucene> and " +
+              "$foo <mulgara:search> $search1 in <test:lucene> and " +
+              "$search1 <test:author> 'Jones' in <test:lucene> and " +
+              "$search1 <mulgara:score> $score1 in <test:lucene>;"));
+
+      try {
+        transf.transform(context, q);
+        fail("query transform should've failed: " + q);
+      } catch (SymbolicTransformationException ste) {
+        logger.debug("Caught expected transformation exception", ste);
+      }
+
+      // invalid: complex query with binder and subject shared
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score2 from <test:bar> where " +
+              "$foo <mulgara:search> $foo in <test:lucene> and " +
+              "$foo <test:author> 'Smith' in <test:lucene> and " +
+              "$foo <mulgara:score> $score2 in <test:lucene>;"));
+
+      try {
+        transf.transform(context, q);
+        fail("query transform should've failed: " + q);
+      } catch (SymbolicTransformationException ste) {
+        logger.debug("Caught expected transformation exception", ste);
+      }
+
+      // invalid: complex query with binder not a variable
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $foo $score2 from <test:bar> where " +
+              "$foo <mulgara:search> <test:it> in <test:lucene> and " +
+              "<test:it> <test:author> 'Smith' in <test:lucene> and " +
+              "<test:it> <mulgara:score> $score2 in <test:lucene>;"));
+
+      try {
+        transf.transform(context, q);
+        fail("query transform should've failed: " + q);
+      } catch (SymbolicTransformationException ste) {
+        logger.debug("Caught expected transformation exception", ste);
+      }
+
+      // invalid: complex query with missing predicate
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $bar $score2 from <test:bar> where " +
+              "$bar <mulgara:search> $search2 in <test:lucene> and " +
+              "$search2 <mulgara:score> $score2 in <test:lucene>;"));
+
+      try {
+        transf.transform(context, q);
+        fail("query transform should've failed: " + q);
+      } catch (SymbolicTransformationException ste) {
+        logger.debug("Caught expected transformation exception", ste);
+      }
+
+      // invalid: complex query with missing <mulgara:search>
+      q = new TestMutableLocalQuery(parseQuery(
+            "select $score2 from <test:bar> where " +
+              "$search2 <test:author> 'Smith' in <test:lucene> and " +
+              "$search2 <mulgara:score> $score2 in <test:lucene>;"));
+
+      try {
+        transf.transform(context, q);
+        fail("query transform should've failed: " + q);
+      } catch (SymbolicTransformationException ste) {
+        logger.debug("Caught expected transformation exception", ste);
+      }
+    } catch (Exception e) {
+      fail(e);
+    }
+  }
+
+  /*
+   * Internal helpers
+   */
+
+  private static ConstraintConjunction checkConstraint(ConstraintExpression ce, int numConstr) {
+    assertTrue(ce instanceof ConstraintConjunction);
+
+    ConstraintConjunction cc = (ConstraintConjunction)ce;
+    assertEquals(numConstr, cc.getElements().size());
+
+    return cc;
+  }
+
+  private static void checkConstraint(ConstraintExpression ce, String expSubj, String expPred,
+                                      String expObj, String expBind, String expScore)
+      throws Exception {
+    assertTrue(ce instanceof LuceneConstraint);
+    LuceneConstraint lc = (LuceneConstraint)ce;
+
+    if (expSubj != null) {
+      assertTrue(lc.getSubject() instanceof Variable);
+      assertEquals(expSubj, ((Variable)lc.getSubject()).getName());
+    } else {
+      assertNull(lc.getSubject());
+    }
+
+    assertTrue(lc.getPredicate() instanceof URIReference);
+    assertEquals(URI.create(expPred), ((URIReference)lc.getPredicate()).getURI());
+
+    assertTrue(lc.getObject() instanceof Literal);
+    assertEquals(expObj, ((Literal)lc.getObject()).getLexicalForm());
+
+    assertEquals(expBind, lc.getBindingVar().getName());
+
+    if (expScore != null) {
+      assertEquals(expScore, lc.getScoreVar().getName());
+    } else {
+      assertNull(lc.getScoreVar());
+    }
+  }
+
   private String[][] expectedStudyResults() {
     return new String[][] {
         { "foo:node3" }, { "foo:node4" }, { "foo:node11" }, { "foo:node13" }, { "foo:node19" },
@@ -490,4 +827,33 @@
       return new byte[] { (byte)(xid >> 0x10), (byte)(xid >> 0x18) };
     }
   }
+
+  private static class TestSymbolicTransformationContext implements SymbolicTransformationContext {
+    private final Map<URI,URI> mappings;
+
+    public TestSymbolicTransformationContext(Map<URI,URI> mappings) {
+      this.mappings = mappings;
+    }
+
+    public URI mapToModelTypeURI(URI modelURI) {
+      return mappings.get(modelURI);
+    }
+  }
+
+  private static class TestMutableLocalQuery implements MutableLocalQuery {
+    private ConstraintExpression expr;
+
+    public TestMutableLocalQuery(Query query) {
+      expr = query.getConstraintExpression();
+    }
+
+    public ConstraintExpression getConstraintExpression() {
+      return expr;
+    }
+
+    public void setConstraintExpression(ConstraintExpression newExpr) {
+      expr = newExpr;
+    }
+  }
+
 }

Added: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneTransformer.java
===================================================================
--- trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneTransformer.java	                        (rev 0)
+++ trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneTransformer.java	2008-10-27 12:38:48 UTC (rev 1366)
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2008 The Topaz Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ * Contributions:
+ */
+
+package org.mulgara.resolver.lucene;
+
+import org.apache.log4j.Logger;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jrdf.graph.URIReference;
+
+import org.mulgara.query.ConstraintExpression;
+import org.mulgara.query.ConstraintElement;
+import org.mulgara.query.ConstraintImpl;
+import org.mulgara.query.ConstraintConjunction;
+import org.mulgara.query.ConstraintDisjunction;
+import org.mulgara.query.QueryException;
+import org.mulgara.query.rdf.URIReferenceImpl;
+import org.mulgara.resolver.spi.MutableLocalQuery;
+import org.mulgara.resolver.spi.SymbolicTransformation;
+import org.mulgara.resolver.spi.SymbolicTransformationContext;
+import org.mulgara.resolver.spi.SymbolicTransformationException;
+
+/**
+ * A query transformer for lucene. This accept constraints like in the following example:
+ * <pre>
+ *   select $x $score from ... where
+ *     $x <mulgara:search> $s in <lucene> and
+ *     $s <foo> 'story' in <lucene> and
+ *     $s <mulgara:score> $score in <lucene>
+ * </pre>
+ *
+ * @created 2008-09-28
+ * @author Ronald Tschalär
+ * @licence Apache License v2.0
+ */
+public class LuceneTransformer implements SymbolicTransformation {
+  private static final Logger logger = Logger.getLogger(LuceneTransformer.class);
+
+  private final URI modelTypeURI;
+  private final URIReference searchPred;
+  private final URIReference scorePred;
+
+  /**
+   * Create a new tranformer to rewrite lucene queries.
+   *
+   * @param modelTypeURI  the uri of the lucene model type
+   * @param searchPredURI the uri of the search predicate
+   * @param scorePredURI  the uri of the score predicate
+   */
+  public LuceneTransformer(URI modelTypeURI, URI searchPredUri, URI scorePredUri) {
+    this.modelTypeURI = modelTypeURI;
+    searchPred = new URIReferenceImpl(searchPredUri);
+    scorePred = new URIReferenceImpl(scorePredUri);
+  }
+
+  public void transform(SymbolicTransformationContext context, MutableLocalQuery query)
+      throws SymbolicTransformationException {
+    ConstraintExpression expr = query.getConstraintExpression();
+    ConstraintExpression trans = transformExpr(context, expr);
+
+    if (expr != trans) {
+      query.setConstraintExpression(trans);
+    }
+  }
+
+  private ConstraintExpression transformExpr(SymbolicTransformationContext context, ConstraintExpression expr) throws SymbolicTransformationException {
+    if (expr instanceof ConstraintImpl) {
+      return transformConstr(context, (ConstraintImpl)expr);
+    }
+    if (expr instanceof ConstraintConjunction) {
+      return transformConj(context, (ConstraintConjunction)expr);
+    }
+    if (expr instanceof ConstraintDisjunction) {
+      return transformDisj(context, (ConstraintDisjunction)expr);
+    }
+
+    return expr;
+  }
+
+  private ConstraintExpression transformConstr(SymbolicTransformationContext context, ConstraintImpl c) throws SymbolicTransformationException {
+    try {
+      ConstraintElement ce = c.getModel();
+      if (ce instanceof URIReference) {
+        URI constraintModelType = context.mapToModelTypeURI(((URIReference)ce).getURI());
+        if (constraintModelType != null && constraintModelType.equals(modelTypeURI)) {
+          return new LuceneConstraint(c, searchPred, scorePred);
+        }
+      }
+      return c;
+    } catch (QueryException eq) {
+      throw new SymbolicTransformationException("Failed to map model to model-type", eq);
+    }
+  }
+
+  public ConstraintExpression transformConj(SymbolicTransformationContext context, ConstraintConjunction cc) throws SymbolicTransformationException {
+    List<ConstraintExpression> retainedArgs = new ArrayList<ConstraintExpression>();
+    Map<ConstraintElement, List<LuceneConstraint>> luceneArgs =
+                                    new HashMap<ConstraintElement, List<LuceneConstraint>>();
+
+    boolean transformed = false;
+
+    for (ConstraintExpression arg : cc.getElements()) {
+      ConstraintExpression trans = transformExpr(context, arg);
+      if (trans != arg) {
+        transformed = true;
+      }
+
+      if (trans instanceof LuceneConstraint) {
+        LuceneConstraint lc = (LuceneConstraint)trans;
+        List<LuceneConstraint> cumulative = luceneArgs.get(lc.getBindingVar());
+        if (cumulative == null) {
+          cumulative = new ArrayList<LuceneConstraint>();
+          cumulative.add(lc);
+          luceneArgs.put(lc.getBindingVar(), cumulative);
+        } else if (cumulative.size() > 1 ||
+                   cumulative.get(0).getSubject() == null &&
+                   cumulative.get(0).getPredicate() != null &&
+                   lc.getSubject() == null && lc.getPredicate() != null) {
+          // backwards compat hack for multiple simple queries
+          cumulative.add(lc);
+        } else {
+          cumulative.iterator().next().conjoinWith(lc);
+          transformed = true;
+        }
+      } else {
+        retainedArgs.add(trans);
+      }
+    }
+
+    if (transformed) {
+      for (List<LuceneConstraint> c : luceneArgs.values()) {
+        for (LuceneConstraint lc : c) {
+          lc.validate();
+          retainedArgs.add(lc);
+        }
+      }
+
+      return new ConstraintConjunction(retainedArgs);
+    } else {
+      return cc;
+    }
+  }
+
+  private ConstraintExpression transformDisj(SymbolicTransformationContext context, ConstraintDisjunction cd) throws SymbolicTransformationException {
+    List<ConstraintExpression> transArgs = new ArrayList<ConstraintExpression>();
+    boolean transformed = false;
+    for (ConstraintExpression ce : cd.getElements()) {
+      ConstraintExpression trans = transformExpr(context, ce);
+      if (trans != ce) {
+        transformed = true;
+      }
+      transArgs.add(trans);
+    }
+
+    return transformed ? new ConstraintDisjunction(transArgs) : cd;
+  }
+}


Property changes on: trunk/src/jar/resolver-lucene/java/org/mulgara/resolver/lucene/LuceneTransformer.java
___________________________________________________________________
Name: svn:keywords
   + Id HeadURL Revision
Name: svn:eol-style
   + native




More information about the Mulgara-svn mailing list