{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Monad Query Language" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The LAF resource which is ETCBC Hebrew Text Database is the result of converting an EMDROS database into LAF.\n", "[EMDROS](http://emdros.org) is a text database system written by Ulrik Sandborg-Petersen based on the PhD. thesis of Crist-Jan Doedens: [Text Databases. One Database Model and Several Retrieval Languages](http://books.google.nl/books?id=9ggOBRz1dO4C&dq=editions%3AISBN9051837291&source=gbs_book_other_versions).\n", "\n", "The query language of this system, MQL, is a so-called *topographic* query language, meaning that the query instruction is at the same time a template for the query results. More formally, there is a correspondence between the structure of the query instruction and the structure of the query results, and this correspondence holds for the sequential order and the embedding order.\n", "\n", "Put otherwise, MQL is a very convenient language to query the data for tree fragments.\n", "\n", "A specification of MQL can be found at the [Emdros docs page](http://emdros.org/docs.html).\n", "\n", "In order to run this notebook, you need to have the [EMDROS software](http://sourceforge.net/projects/emdros/files/) installed. It is open source and there are binaries for Windows and Mac. The ETCBC database file is included in the laf-fabric-data working directory, that you can download from [DANS](http://www.persistent-identifier.nl/?identifier=urn%3Anbn%3Anl%3Aui%3A13-048i-71)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# LAF Fabric and MQL" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook shows how you can integrate MQL with LAF-Fabric. This is what you can do:\n", "\n", "* write an MQL query in a code cell as a python string\n", "* fire that query to the EMDROS database containing the ETCBC data\n", "* getting the results back in the form of sets of nodes of LAF-Fabric.\n", "\n", "Because the LAF data has been migrated from the EMDROS data, we have a mapping from EMDROS object identifiers to LAF nodes.\n", "We apply this mapping to the query results in order to translate them to nodesets." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Sheafs, straws, and grains" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An MQL query has a form like this:\n", "\n", " select all objects\n", " in {1-40}\n", " where\n", " [phrase\n", " [word g_cons = 'H']\n", " [word]\n", " ]\n", " ..\n", " [phrase\n", " [word]\n", " [word]\n", " ]\n", "\n", "After the ``where`` there is a sequence of objects, which in turn may contain objects.\n", "The query result after firing this query is a so-called *sheaf*. It is a list of results or *straws*, where each straw looks like the sequence of objects after the ``where``. These objects are the *matched objects* or *grains*.\n", "And here is the catch: a grain may contain a sheaf itself, because the objects inside objects also may have multiple subresults in the data.\n", "\n", "In other words: a sheaf is a recursive structure: it is a list of straws, which are lists of grains, which are monads (words) or objects containing a sheaf.\n", "\n", "The sheaf is a very economic representation of the set of tree fragments that are the result of an MQL query.\n", "\n", "Yet for some purposes it is necessary to have a list of ordinary results. We provide a method to generate results from a sheaf.\n", "What this method does can be thought of as making copies of the sheaf, and wherever there is a sheaf (a list of straws), it replaces the sheaf by choosing a single straw. The results correspond to all possible ways of making those choices.\n", "\n", "In other words: a ``result`` is a recursive structure: it is list of grains, which are monads (words) or objects containing a result.\n", "\n", "Put otherwise: a ``result`` is a simplified sheaf, without the aggregating level of sheaf, leaving only straws and grains." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# MQL API" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inside the *etcbc* package there is a module *mql*.\n", "This module exposes two classes: ``MQL`` and ``Sheaf``.\n", "\n", " from etcbc.mql import MQL\n", "\n", "You initialize the MQL object after loading LAF-Fabric by passing the API as a parameter:\n", "\n", " Q = MQL(API)\n", " \n", "If you have a query, e.g. the example above as a string in a variable ``query``, you can say:\n", "\n", " sheaf = Q.mql(query)\n", "\n", "Then you have the results of the query in ``sheaf``. It is a list of lists of tuples (corresponding to *sheaf*, *straw*, *grain*),\n", "where a grain is either an integer, which is the node corresponding to a monad (word object), or it is a tuple ``(node, subsheaf)``, where ``node`` corresponds to an object of an other type, containing a sheaf of subobjects.\n", "\n", "``sheaf`` is an object of class ``Sheaf``, and there are the following methods in this class:\n", "\n", "* ``render(callable)``: prints out the sheaf in a pretty format, each word is rendered by applying ``callable`` to its node.\n", "* ``compact(callable)``: returns as string a compact representation of the sheaf, ``callable`` has the same meaning as above.\n", "* ``results()``: generates (as a generator) the list of results that is represented by the sheaf.\n", "* ``compact_results(callable)``: returns the compact representations of the results of the sheaf." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0.00s This is LAF-Fabric 4.4.6\n", "API reference: http://laf-fabric.readthedocs.org/en/latest/texts/API-reference.html\n", "Feature doc: http://shebanq-doc.readthedocs.org/en/latest/texts/welcome.html\n", "\n" ] } ], "source": [ "import sys\n", "import collections\n", "import subprocess\n", "\n", "from lxml import etree\n", "\n", "import laf\n", "from laf.fabric import LafFabric\n", "from etcbc.preprocess import prepare\n", "from etcbc.mql import MQL\n", "fabric = LafFabric()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0.00s LOADING API: please wait ... \n", " 0.00s DETAIL: COMPILING m: UP TO DATE\n", " 0.00s INFO: USING DATA COMPILED AT: 2014-07-23T09-31-37\n", " 0.01s DETAIL: COMPILING a: UP TO DATE\n", " 0.01s DETAIL: load main: G.node_anchor_min\n", " 0.08s DETAIL: load main: G.node_anchor_max\n", " 0.14s DETAIL: load main: G.node_sort\n", " 0.20s DETAIL: load main: G.node_sort_inv\n", " 0.63s DETAIL: load main: G.edges_from\n", " 0.70s DETAIL: load main: G.edges_to\n", " 0.77s DETAIL: load main: F.etcbc4_db_monads [node] \n", " 1.48s DETAIL: load main: F.etcbc4_db_oid [node] \n", " 2.17s DETAIL: load main: F.etcbc4_db_otype [node] \n", " 2.81s DETAIL: load main: F.etcbc4_ft_function [node] \n", " 2.93s DETAIL: load main: F.etcbc4_ft_g_cons [node] \n", " 3.11s DETAIL: load main: F.etcbc4_ft_g_word_utf8 [node] \n", " 3.43s DETAIL: load main: F.etcbc4_ft_lex [node] \n", " 3.63s DETAIL: load main: F.etcbc4_sft_book [node] \n", " 3.65s DETAIL: load main: F.etcbc4_sft_chapter [node] \n", " 3.66s DETAIL: load main: F.etcbc4_sft_label [node] \n", " 3.68s DETAIL: load main: F.etcbc4_sft_verse [node] \n", " 3.69s DETAIL: load main: F.etcbc4_ft_functional_parent [e] \n", " 3.99s DETAIL: load main: C.etcbc4_ft_functional_parent -> \n", " 4.92s DETAIL: load main: C.etcbc4_ft_functional_parent <- \n", " 5.49s LOGFILE=/Users/dirk/Dropbox/laf-fabric-output/etcbc4/mql/__log__mql.txt\n", " 5.49s DETAIL: prep prep: G.node_sort\n", " 5.57s DETAIL: prep prep: G.node_sort_inv\n", " 6.15s INFO: DATA LOADED FROM SOURCE etcbc4 AND ANNOX -- FOR TASK mql AT 2014-10-30T22-04-18\n" ] } ], "source": [ "API = fabric.load('etcbc4', '--', 'mql', {\n", " \"xmlids\": {\"node\": False, \"edge\": False},\n", " \"features\": ('''\n", " oid otype monads\n", " g_word_utf8 g_cons lex function\n", " book chapter verse label\n", " ''','''\n", " functional_parent\n", " '''),\n", " \"prepare\": prepare,\n", "}, verbose='DETAIL')\n", "exec(fabric.localnames.format(var='fabric'))\n", "Q = MQL(API)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "qu1 = '''\n", "select all objects where\n", "[subphrase\n", " [word lex=\"MRYH'\n", "'>RYH'\n", "'>RYH'\n", "'HRH'\n", "'NGBH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'NGBH'\n", "'YPNH'\n", "'NGBH'\n", "'QDMH'\n", "'JMH'\n", "'CMH'\n", "'HRH'\n", "'XWYH'\n", "'CMJMH'\n", "'>RYH'\n", "'>HLH'\n", "'SDMH'\n", "'SDMH'\n", "'>RYH'\n", "'PTXH'\n", "'BJTH'\n", "'XWYH'\n", "'HRH'\n", "'HRH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'YRYH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'RYH'\n", "'>HLH'\n", "'QDMH'\n", "'CMH'\n", "'>CWRH'\n", "'GRRH'\n", "'MYRJMH'\n", "'XRNH'\n", "'PDNH'\n", "'BJTH'\n", "'PDNH'\n", "'PDNH'\n", "'PDNH'\n", "'XRNH'\n", "'>RYH'\n", "'CMJMH'\n", "'JMH'\n", "'QDMH'\n", "'YPNH'\n", "'NGBH'\n", "'>RYH'\n", "'CMH'\n", "'>RYH'\n", "'>RYH'\n", "'>RYH'\n", "'FPRTH'\n", "'>PRTH'\n", "'>RYH'\n", "'CKMH'\n", "'DTJNH'\n", "'BRH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'C>LH'\n", "'>RYH'\n", "'TMNTH'\n", "'TMNTH'\n", "'TMNTH'\n", "'MYRJMH'\n", "'CMH'\n", "'BJTH'\n", "'XWYH'\n", "'XWYH'\n", "'XWYH'\n", "'XWYH'\n", "'MYRJMH'\n", "'CMH'\n", "'>RYH'\n", "'>RYH'\n", "'C>WLH'\n", "'BJTH'\n", "'BJTH'\n", "'BJTH'\n", "'BJTH'\n", "'BJTH'\n", "'>RYH'\n", "'XDRH'\n", "'CMH'\n", "'>RYH'\n", "'RYH'\n", "'C>LH'\n", "'C>LH'\n", "'MYRJMH'\n", "'>RYH'\n", "'B>RH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'GCNH'\n", "'>RYH'\n", "'GCNH'\n", "'BJTH'\n", "'MYRJMH'\n", "'>PRTH'\n", "'>RYH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'>RYH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'J>RH'\n", "'XRBH'\n", "'>RYH'\n", "'>RYH'\n", "'>RYH'\n", "'MYRJMH'\n", "'MDBRH'\n", "'MJMH'\n", "'MJMH'\n", "'BJTH'\n", "'CMJMH'\n", "'CMJMH'\n", "'BJTH'\n", "'>RYH'\n", "'>RYH'\n", "'JMH'\n", "'CMH'\n", "'SKTH'\n", "'XWYH'\n", "'JMJMH'\n", "'MYRJMH'\n", "'MRTH'\n", "'>JLMH'\n", "'CMH'\n", "'>HLH'\n", "'CMH'\n", "'CMH'\n", "'HRH'\n", "'MHLH'\n", "'>HLH'\n", "'>RYH'\n", "'MHLH'\n", "'QDCH'\n", "'MYRJMH'\n", "'MYRJMH'\n", "'CMH'\n", "'MLH'\n", "'C>LH'\n", "'CMH'\n", "'MYRJMH'\n", "'B>RH'\n", "'MDBRH'\n", "'PTWRH'\n", "'MJLMH'\n", "'CMH'\n", "'QDMH'\n", "'YNH'\n", "'RYH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'HRH'\n", "'CMH'\n", "'CMH'\n", "'MDBRH'\n", "'HRH'\n", "'HRH'\n", "'MDBRH'\n", "'YPNH'\n", "'MZRXH'\n", "'CMH'\n", "'JMH'\n", "'YPNH'\n", "'TJMNH'\n", "'MZRXH'\n", "'CMH'\n", "'CMH'\n", "'CMJMH'\n", "'CMH'\n", "'CMH'\n", "'MZRXH'\n", "'CMH'\n", "'MZRXH'\n", "'CMH'\n", "'CMH'\n", "'HRH'\n", "'HRH'\n", "'HRH'\n", "'MWSRH'\n", "'GDGDH'\n", "'GDGDH'\n", "'MYRJMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'MYRJMH'\n", "'CMH'\n", "'CMH'\n", "'CRYH'\n", "'RYH'\n", "'>HLH'\n", "'CMJMH'\n", "'GLGLH'\n", "'GLGLH'\n", "'LKJCH'\n", "'PQH'\n", "'MZRXH'\n", "'MZRXH'\n", "'MZRXH'\n", "'NGBH'\n", "'NGBH'\n", "'YNH'\n", "'>DRH'\n", "'QRQLH'\n", "'JMH'\n", "'YPWNH'\n", "'JMH'\n", "'>KZJBH'\n", "'JMH'\n", "'XWQQH'\n", "'TMNTH'\n", "'CMH'\n", "'RYH'\n", "'FHLH'\n", "'MRH'\n", "'CKMH'\n", "'CMH'\n", "'QDCH'\n", "'JMJMH'\n", "'YPWNH'\n", "'XWYH'\n", "'CMJMH'\n", "'>RYH'\n", "'TMNTH'\n", "'TMNTH'\n", "'TMNTH'\n", "'TMNTH'\n", "'TMNTH'\n", "'XRSH'\n", "'XDRH'\n", "'RYH'\n", "'>RYH'\n", "'GBRYH'\n", "'>CDWDH'\n", "'>RYH'\n", "'>RYH'\n", "'BJTH'\n", "'MYPTH'\n", "'MYPTH'\n", "'MYPTH'\n", "'RMTH'\n", "'RMTH'\n", "'MJLNH'\n", "'>RYH'\n", "'>RYH'\n", "'KRMLH'\n", "'RMTH'\n", "'MRYH'\n", "'RMTH'\n", "'RMTH'\n", "'YDH'\n", "'>RYH'\n", "'CMH'\n", "'GBRYH'\n", "'KRMLH'\n", "'KRMLH'\n", "'>RYH'\n", "'GBRYH'\n", "'CWRH'\n", "'>RYH'\n", "'>RYH'\n", "'>PQH'\n", "'MRYH'\n", "'XBRNH'\n", "'GBRYH'\n", "'GTJMH'\n", "'XBRWNH'\n", "'XBRWNH'\n", "'BJTH'\n", "'>RYH'\n", "'XL>MH'\n", "'>RYH'\n", "'RBTH'\n", "'BJTH'\n", "'XDRH'\n", "'XWYH'\n", "'>RYH'\n", "'TQWRYH'\n", "'>RYH'\n", "'>RYH'\n", "'>RYH'\n", "'GCWRH'\n", "'BJTH'\n", "'>RYH'\n", "'XBRWNH'\n", "'RYH'\n", "'>RYH'\n", "'GLGLH'\n", "'GLGLH'\n", "'>RYH'\n", "'>BLH'\n", "'>BLH'\n", "'GLRYH'\n", "'XDRH'\n", "'>RYH'\n", "'>RYH'\n", "'GTH'\n", "'GBWPJRH'\n", "'JRWCLMH'\n", "'BJTH'\n", "'BJTH'\n", "'RYH'\n", "'JZR<>LH'\n", "'JZR<>LH'\n", "'MDBRH'\n", "'PQH'\n", "'>PQH'\n", "'CMRWNH'\n", "'>WPJRH'\n", "'JRDNH'\n", "'>RYH'\n", "'MRYH'\n", "'GLGLH'\n", "'CMH'\n", "'JRDNH'\n", "'CMH'\n", "'CMH'\n", "'CMRWNH'\n", "'YLH'\n", "'CMH'\n", "'JRWCLMH'\n", "'JZR<>LH'\n", "'JZR<>LH'\n", "'JZR<>LH'\n", "'>RYH'\n", "'CMH'\n", "'QDMH'\n", "'>RYH'\n", "'CMRWNH'\n", "'LKJCH'\n", "'LKJCH'\n", "'GLJLH'\n", "'>CWRH'\n", "'QJRH'\n", "'YPWNH'\n", "'>CWRH'\n", "'>CWRH'\n", "'KWTH'\n", "'CMH'\n", "'>CWRH'\n", "'LKJCH'\n", "'MRYH'\n", "'>RYH'\n", "'JMH'\n", "'BJTH'\n", "'MDBRH'\n", "'>CWRH'\n", "'>CDWDH'\n", "'CWLH'\n", "'C>WLH'\n", "'C>WLH'\n", "'CMH'\n", "'CMH'\n", "'XWYH'\n", "'CMH'\n", "'MYJLH'\n", "'MWLH'\n", "'BJTH'\n", "'MRYH'\n", "'CMH'\n", "'CMJMH'\n", "'CKMH'\n", "'>RYH'\n", "'>RYH'\n", "'XWYH'\n", "'MRYH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'CMH'\n", "'MCH'\n", "'MLKWTH'\n", "'RZH'\n", "'CRYH'\n", "'>RYH'\n", "'>RYH'\n", "'>RYH'\n", "'>RYH'\n", "'>RYH'\n", "'MRYH'\n", "'TRCJCH'\n", "'CMH'\n", "'MDBRH'\n", "'MZRXH'\n", "'JMH'\n", "'YPWNH'\n", "'NGBH'\n", "'JBJCH'\n", "'XBRWNH'\n", "'XBRWNH'\n", "'MDBRH'\n", "'XBRWNH'\n", "'XBRWNH'\n", "'BRYH'\n", "'MRYH'\n", "'MRYH'\n", "'>WPJRH'\n", "'CKMH'\n", "'MRYH'\n", "'MRYH'\n", "'XWYH'\n", "'MRYH'\n", " '>RYH'\n", " '>RYH'\n", " 'HRH'\n", " 'NGBH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'NGBH'\n", " 'YPNH'\n", " 'NGBH'\n", " 'QDMH'\n", " 'JMH'\n", " 'CMH'\n", " 'HRH'\n", " 'XWYH'\n", " 'CMJMH'\n", " '>RYH'\n", " '>HLH'\n", " 'SDMH'\n", " 'SDMH'\n", " '>RYH'\n", " 'PTXH'\n", " 'BJTH'\n", " 'XWYH'\n", " 'HRH'\n", " 'HRH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'YRYH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'RYH'\n", " '>HLH'\n", " 'QDMH'\n", " 'CMH'\n", " '>CWRH'\n", " 'GRRH'\n", " 'MYRJMH'\n", " 'XRNH'\n", " 'PDNH'\n", " 'BJTH'\n", " 'PDNH'\n", " 'PDNH'\n", " 'PDNH'\n", " 'XRNH'\n", " '>RYH'\n", " 'CMJMH'\n", " 'JMH'\n", " 'QDMH'\n", " 'YPNH'\n", " 'NGBH'\n", " '>RYH'\n", " 'CMH'\n", " '>RYH'\n", " '>RYH'\n", " '>RYH'\n", " 'FPRTH'\n", " '>PRTH'\n", " '>RYH'\n", " 'CKMH'\n", " 'DTJNH'\n", " 'BRH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'C>LH'\n", " '>RYH'\n", " 'TMNTH'\n", " 'TMNTH'\n", " 'TMNTH'\n", " 'MYRJMH'\n", " 'CMH'\n", " 'BJTH'\n", " 'XWYH'\n", " 'XWYH'\n", " 'XWYH'\n", " 'XWYH'\n", " 'MYRJMH'\n", " 'CMH'\n", " '>RYH'\n", " '>RYH'\n", " 'C>WLH'\n", " 'BJTH'\n", " 'BJTH'\n", " 'BJTH'\n", " 'BJTH'\n", " 'BJTH'\n", " '>RYH'\n", " 'XDRH'\n", " 'CMH'\n", " '>RYH'\n", " 'RYH'\n", " 'C>LH'\n", " 'C>LH'\n", " 'MYRJMH'\n", " '>RYH'\n", " 'B>RH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'GCNH'\n", " '>RYH'\n", " 'GCNH'\n", " 'BJTH'\n", " 'MYRJMH'\n", " '>PRTH'\n", " '>RYH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " '>RYH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'J>RH'\n", " 'XRBH'\n", " '>RYH'\n", " '>RYH'\n", " '>RYH'\n", " 'MYRJMH'\n", " 'MDBRH'\n", " 'MJMH'\n", " 'MJMH'\n", " 'BJTH'\n", " 'CMJMH'\n", " 'CMJMH'\n", " 'BJTH'\n", " '>RYH'\n", " '>RYH'\n", " 'JMH'\n", " 'CMH'\n", " 'SKTH'\n", " 'XWYH'\n", " 'JMJMH'\n", " 'MYRJMH'\n", " 'MRTH'\n", " '>JLMH'\n", " 'CMH'\n", " '>HLH'\n", " 'CMH'\n", " 'CMH'\n", " 'HRH'\n", " 'MHLH'\n", " '>HLH'\n", " '>RYH'\n", " 'MHLH'\n", " 'QDCH'\n", " 'MYRJMH'\n", " 'MYRJMH'\n", " 'CMH'\n", " 'MLH'\n", " 'C>LH'\n", " 'CMH'\n", " 'MYRJMH'\n", " 'B>RH'\n", " 'MDBRH'\n", " 'PTWRH'\n", " 'MJLMH'\n", " 'CMH'\n", " 'QDMH'\n", " 'YNH'\n", " 'RYH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'HRH'\n", " 'CMH'\n", " 'CMH'\n", " 'MDBRH'\n", " 'HRH'\n", " 'HRH'\n", " 'MDBRH'\n", " 'YPNH'\n", " 'MZRXH'\n", " 'CMH'\n", " 'JMH'\n", " 'YPNH'\n", " 'TJMNH'\n", " 'MZRXH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMJMH'\n", " 'CMH'\n", " 'CMH'\n", " 'MZRXH'\n", " 'CMH'\n", " 'MZRXH'\n", " 'CMH'\n", " 'CMH'\n", " 'HRH'\n", " 'HRH'\n", " 'HRH'\n", " 'MWSRH'\n", " 'GDGDH'\n", " 'GDGDH'\n", " 'MYRJMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'MYRJMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CRYH'\n", " 'RYH'\n", " '>HLH'\n", " 'CMJMH'\n", " 'GLGLH'\n", " 'GLGLH'\n", " 'LKJCH'\n", " 'PQH'\n", " 'MZRXH'\n", " 'MZRXH'\n", " 'MZRXH'\n", " 'NGBH'\n", " 'NGBH'\n", " 'YNH'\n", " '>DRH'\n", " 'QRQLH'\n", " 'JMH'\n", " 'YPWNH'\n", " 'JMH'\n", " '>KZJBH'\n", " 'JMH'\n", " 'XWQQH'\n", " 'TMNTH'\n", " 'CMH'\n", " 'RYH'\n", " 'FHLH'\n", " 'MRH'\n", " 'CKMH'\n", " 'CMH'\n", " 'QDCH'\n", " 'JMJMH'\n", " 'YPWNH'\n", " 'XWYH'\n", " 'CMJMH'\n", " '>RYH'\n", " 'TMNTH'\n", " 'TMNTH'\n", " 'TMNTH'\n", " 'TMNTH'\n", " 'TMNTH'\n", " 'XRSH'\n", " 'XDRH'\n", " 'RYH'\n", " '>RYH'\n", " 'GBRYH'\n", " '>CDWDH'\n", " '>RYH'\n", " '>RYH'\n", " 'BJTH'\n", " 'MYPTH'\n", " 'MYPTH'\n", " 'MYPTH'\n", " 'RMTH'\n", " 'RMTH'\n", " 'MJLNH'\n", " '>RYH'\n", " '>RYH'\n", " 'KRMLH'\n", " 'RMTH'\n", " 'MRYH'\n", " 'RMTH'\n", " 'RMTH'\n", " 'YDH'\n", " '>RYH'\n", " 'CMH'\n", " 'GBRYH'\n", " 'KRMLH'\n", " 'KRMLH'\n", " '>RYH'\n", " 'GBRYH'\n", " 'CWRH'\n", " '>RYH'\n", " '>RYH'\n", " '>PQH'\n", " 'MRYH'\n", " 'XBRNH'\n", " 'GBRYH'\n", " 'GTJMH'\n", " 'XBRWNH'\n", " 'XBRWNH'\n", " 'BJTH'\n", " '>RYH'\n", " 'XL>MH'\n", " '>RYH'\n", " 'RBTH'\n", " 'BJTH'\n", " 'XDRH'\n", " 'XWYH'\n", " '>RYH'\n", " 'TQWRYH'\n", " '>RYH'\n", " '>RYH'\n", " '>RYH'\n", " 'GCWRH'\n", " 'BJTH'\n", " '>RYH'\n", " 'XBRWNH'\n", " 'RYH'\n", " '>RYH'\n", " 'GLGLH'\n", " 'GLGLH'\n", " '>RYH'\n", " '>BLH'\n", " '>BLH'\n", " 'GLRYH'\n", " 'XDRH'\n", " '>RYH'\n", " '>RYH'\n", " 'GTH'\n", " 'GBWPJRH'\n", " 'JRWCLMH'\n", " 'BJTH'\n", " 'BJTH'\n", " 'RYH'\n", " 'JZR<>LH'\n", " 'JZR<>LH'\n", " 'MDBRH'\n", " 'PQH'\n", " '>PQH'\n", " 'CMRWNH'\n", " '>WPJRH'\n", " 'JRDNH'\n", " '>RYH'\n", " 'MRYH'\n", " 'GLGLH'\n", " 'CMH'\n", " 'JRDNH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMRWNH'\n", " 'YLH'\n", " 'CMH'\n", " 'JRWCLMH'\n", " 'JZR<>LH'\n", " 'JZR<>LH'\n", " 'JZR<>LH'\n", " '>RYH'\n", " 'CMH'\n", " 'QDMH'\n", " '>RYH'\n", " 'CMRWNH'\n", " 'LKJCH'\n", " 'LKJCH'\n", " 'GLJLH'\n", " '>CWRH'\n", " 'QJRH'\n", " 'YPWNH'\n", " '>CWRH'\n", " '>CWRH'\n", " 'KWTH'\n", " 'CMH'\n", " '>CWRH'\n", " 'LKJCH'\n", " 'MRYH'\n", " '>RYH'\n", " 'JMH'\n", " 'BJTH'\n", " 'MDBRH'\n", " '>CWRH'\n", " '>CDWDH'\n", " 'CWLH'\n", " 'C>WLH'\n", " 'C>WLH'\n", " 'CMH'\n", " 'CMH'\n", " 'XWYH'\n", " 'CMH'\n", " 'MYJLH'\n", " 'MWLH'\n", " 'BJTH'\n", " 'MRYH'\n", " 'CMH'\n", " 'CMJMH'\n", " 'CKMH'\n", " '>RYH'\n", " '>RYH'\n", " 'XWYH'\n", " 'MRYH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'CMH'\n", " 'MCH'\n", " 'MLKWTH'\n", " 'RZH'\n", " 'CRYH'\n", " '>RYH'\n", " '>RYH'\n", " '>RYH'\n", " '>RYH'\n", " '>RYH'\n", " 'MRYH'\n", " 'TRCJCH'\n", " 'CMH'\n", " 'MDBRH'\n", " 'MZRXH'\n", " 'JMH'\n", " 'YPWNH'\n", " 'NGBH'\n", " 'JBJCH'\n", " 'XBRWNH'\n", " 'XBRWNH'\n", " 'MDBRH'\n", " 'XBRWNH'\n", " 'XBRWNH'\n", " 'BRYH'\n", " 'MRYH'\n", " 'MRYH'\n", " '>WPJRH'\n", " 'CKMH'\n", " 'MRYH'\n", " 'MRYH'\n", " 'XWYH'\n", " 'M