﻿/*

Copyright (c) 2001, Dr Martin Porter
Copyright (c) 2002, Richard Boulton
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
    * this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
    * notice, this list of conditions and the following disclaimer in the
    * documentation and/or other materials provided with the distribution.
    * Neither the name of the copyright holders nor the names of its contributors
    * may be used to endorse or promote products derived from this software
    * without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 */

namespace Lucene.Net.Tartarus.Snowball.Ext
{
    /// <summary>
    /// This class was automatically generated by a Snowball to Java compiler
    /// It implements the stemming algorithm defined by a snowball script.
    /// </summary>
    public class HungarianStemmer : SnowballProgram
    {
        private readonly static HungarianStemmer methodObject = new HungarianStemmer();

        private readonly static Among[] a_0 = {
                    new Among ( "cs", -1, -1, "", methodObject ),
                    new Among ( "dzs", -1, -1, "", methodObject ),
                    new Among ( "gy", -1, -1, "", methodObject ),
                    new Among ( "ly", -1, -1, "", methodObject ),
                    new Among ( "ny", -1, -1, "", methodObject ),
                    new Among ( "sz", -1, -1, "", methodObject ),
                    new Among ( "ty", -1, -1, "", methodObject ),
                    new Among ( "zs", -1, -1, "", methodObject )
                };

        private readonly static Among[] a_1 = {
                    new Among ( "\u00E1", -1, 1, "", methodObject ),
                    new Among ( "\u00E9", -1, 2, "", methodObject )
                };

        private readonly static Among[] a_2 = {
                    new Among ( "bb", -1, -1, "", methodObject ),
                    new Among ( "cc", -1, -1, "", methodObject ),
                    new Among ( "dd", -1, -1, "", methodObject ),
                    new Among ( "ff", -1, -1, "", methodObject ),
                    new Among ( "gg", -1, -1, "", methodObject ),
                    new Among ( "jj", -1, -1, "", methodObject ),
                    new Among ( "kk", -1, -1, "", methodObject ),
                    new Among ( "ll", -1, -1, "", methodObject ),
                    new Among ( "mm", -1, -1, "", methodObject ),
                    new Among ( "nn", -1, -1, "", methodObject ),
                    new Among ( "pp", -1, -1, "", methodObject ),
                    new Among ( "rr", -1, -1, "", methodObject ),
                    new Among ( "ccs", -1, -1, "", methodObject ),
                    new Among ( "ss", -1, -1, "", methodObject ),
                    new Among ( "zzs", -1, -1, "", methodObject ),
                    new Among ( "tt", -1, -1, "", methodObject ),
                    new Among ( "vv", -1, -1, "", methodObject ),
                    new Among ( "ggy", -1, -1, "", methodObject ),
                    new Among ( "lly", -1, -1, "", methodObject ),
                    new Among ( "nny", -1, -1, "", methodObject ),
                    new Among ( "tty", -1, -1, "", methodObject ),
                    new Among ( "ssz", -1, -1, "", methodObject ),
                    new Among ( "zz", -1, -1, "", methodObject )
                };

        private readonly static Among[] a_3 = {
                    new Among ( "al", -1, 1, "", methodObject ),
                    new Among ( "el", -1, 2, "", methodObject )
                };

        private readonly static Among[] a_4 = {
                    new Among ( "ba", -1, -1, "", methodObject ),
                    new Among ( "ra", -1, -1, "", methodObject ),
                    new Among ( "be", -1, -1, "", methodObject ),
                    new Among ( "re", -1, -1, "", methodObject ),
                    new Among ( "ig", -1, -1, "", methodObject ),
                    new Among ( "nak", -1, -1, "", methodObject ),
                    new Among ( "nek", -1, -1, "", methodObject ),
                    new Among ( "val", -1, -1, "", methodObject ),
                    new Among ( "vel", -1, -1, "", methodObject ),
                    new Among ( "ul", -1, -1, "", methodObject ),
                    new Among ( "n\u00E1l", -1, -1, "", methodObject ),
                    new Among ( "n\u00E9l", -1, -1, "", methodObject ),
                    new Among ( "b\u00F3l", -1, -1, "", methodObject ),
                    new Among ( "r\u00F3l", -1, -1, "", methodObject ),
                    new Among ( "t\u00F3l", -1, -1, "", methodObject ),
                    new Among ( "b\u00F5l", -1, -1, "", methodObject ),
                    new Among ( "r\u00F5l", -1, -1, "", methodObject ),
                    new Among ( "t\u00F5l", -1, -1, "", methodObject ),
                    new Among ( "\u00FCl", -1, -1, "", methodObject ),
                    new Among ( "n", -1, -1, "", methodObject ),
                    new Among ( "an", 19, -1, "", methodObject ),
                    new Among ( "ban", 20, -1, "", methodObject ),
                    new Among ( "en", 19, -1, "", methodObject ),
                    new Among ( "ben", 22, -1, "", methodObject ),
                    new Among ( "k\u00E9ppen", 22, -1, "", methodObject ),
                    new Among ( "on", 19, -1, "", methodObject ),
                    new Among ( "\u00F6n", 19, -1, "", methodObject ),
                    new Among ( "k\u00E9pp", -1, -1, "", methodObject ),
                    new Among ( "kor", -1, -1, "", methodObject ),
                    new Among ( "t", -1, -1, "", methodObject ),
                    new Among ( "at", 29, -1, "", methodObject ),
                    new Among ( "et", 29, -1, "", methodObject ),
                    new Among ( "k\u00E9nt", 29, -1, "", methodObject ),
                    new Among ( "ank\u00E9nt", 32, -1, "", methodObject ),
                    new Among ( "enk\u00E9nt", 32, -1, "", methodObject ),
                    new Among ( "onk\u00E9nt", 32, -1, "", methodObject ),
                    new Among ( "ot", 29, -1, "", methodObject ),
                    new Among ( "\u00E9rt", 29, -1, "", methodObject ),
                    new Among ( "\u00F6t", 29, -1, "", methodObject ),
                    new Among ( "hez", -1, -1, "", methodObject ),
                    new Among ( "hoz", -1, -1, "", methodObject ),
                    new Among ( "h\u00F6z", -1, -1, "", methodObject ),
                    new Among ( "v\u00E1", -1, -1, "", methodObject ),
                    new Among ( "v\u00E9", -1, -1, "", methodObject )
                };

        private readonly static Among[] a_5 = {
                    new Among ( "\u00E1n", -1, 2, "", methodObject ),
                    new Among ( "\u00E9n", -1, 1, "", methodObject ),
                    new Among ( "\u00E1nk\u00E9nt", -1, 3, "", methodObject )
                };

        private readonly static Among[] a_6 = {
                    new Among ( "stul", -1, 2, "", methodObject ),
                    new Among ( "astul", 0, 1, "", methodObject ),
                    new Among ( "\u00E1stul", 0, 3, "", methodObject ),
                    new Among ( "st\u00FCl", -1, 2, "", methodObject ),
                    new Among ( "est\u00FCl", 3, 1, "", methodObject ),
                    new Among ( "\u00E9st\u00FCl", 3, 4, "", methodObject )
                };

        private readonly static Among[] a_7 = {
                    new Among ( "\u00E1", -1, 1, "", methodObject ),
                    new Among ( "\u00E9", -1, 2, "", methodObject )
                };

        private readonly static Among[] a_8 = {
                    new Among ( "k", -1, 7, "", methodObject ),
                    new Among ( "ak", 0, 4, "", methodObject ),
                    new Among ( "ek", 0, 6, "", methodObject ),
                    new Among ( "ok", 0, 5, "", methodObject ),
                    new Among ( "\u00E1k", 0, 1, "", methodObject ),
                    new Among ( "\u00E9k", 0, 2, "", methodObject ),
                    new Among ( "\u00F6k", 0, 3, "", methodObject )
                };

        private readonly static Among[] a_9 = {
                    new Among ( "\u00E9i", -1, 7, "", methodObject ),
                    new Among ( "\u00E1\u00E9i", 0, 6, "", methodObject ),
                    new Among ( "\u00E9\u00E9i", 0, 5, "", methodObject ),
                    new Among ( "\u00E9", -1, 9, "", methodObject ),
                    new Among ( "k\u00E9", 3, 4, "", methodObject ),
                    new Among ( "ak\u00E9", 4, 1, "", methodObject ),
                    new Among ( "ek\u00E9", 4, 1, "", methodObject ),
                    new Among ( "ok\u00E9", 4, 1, "", methodObject ),
                    new Among ( "\u00E1k\u00E9", 4, 3, "", methodObject ),
                    new Among ( "\u00E9k\u00E9", 4, 2, "", methodObject ),
                    new Among ( "\u00F6k\u00E9", 4, 1, "", methodObject ),
                    new Among ( "\u00E9\u00E9", 3, 8, "", methodObject )
                };

        private readonly static Among[] a_10 = {
                    new Among ( "a", -1, 18, "", methodObject ),
                    new Among ( "ja", 0, 17, "", methodObject ),
                    new Among ( "d", -1, 16, "", methodObject ),
                    new Among ( "ad", 2, 13, "", methodObject ),
                    new Among ( "ed", 2, 13, "", methodObject ),
                    new Among ( "od", 2, 13, "", methodObject ),
                    new Among ( "\u00E1d", 2, 14, "", methodObject ),
                    new Among ( "\u00E9d", 2, 15, "", methodObject ),
                    new Among ( "\u00F6d", 2, 13, "", methodObject ),
                    new Among ( "e", -1, 18, "", methodObject ),
                    new Among ( "je", 9, 17, "", methodObject ),
                    new Among ( "nk", -1, 4, "", methodObject ),
                    new Among ( "unk", 11, 1, "", methodObject ),
                    new Among ( "\u00E1nk", 11, 2, "", methodObject ),
                    new Among ( "\u00E9nk", 11, 3, "", methodObject ),
                    new Among ( "\u00FCnk", 11, 1, "", methodObject ),
                    new Among ( "uk", -1, 8, "", methodObject ),
                    new Among ( "juk", 16, 7, "", methodObject ),
                    new Among ( "\u00E1juk", 17, 5, "", methodObject ),
                    new Among ( "\u00FCk", -1, 8, "", methodObject ),
                    new Among ( "j\u00FCk", 19, 7, "", methodObject ),
                    new Among ( "\u00E9j\u00FCk", 20, 6, "", methodObject ),
                    new Among ( "m", -1, 12, "", methodObject ),
                    new Among ( "am", 22, 9, "", methodObject ),
                    new Among ( "em", 22, 9, "", methodObject ),
                    new Among ( "om", 22, 9, "", methodObject ),
                    new Among ( "\u00E1m", 22, 10, "", methodObject ),
                    new Among ( "\u00E9m", 22, 11, "", methodObject ),
                    new Among ( "o", -1, 18, "", methodObject ),
                    new Among ( "\u00E1", -1, 19, "", methodObject ),
                    new Among ( "\u00E9", -1, 20, "", methodObject )
                };

        private readonly static Among[] a_11 = {
                    new Among ( "id", -1, 10, "", methodObject ),
                    new Among ( "aid", 0, 9, "", methodObject ),
                    new Among ( "jaid", 1, 6, "", methodObject ),
                    new Among ( "eid", 0, 9, "", methodObject ),
                    new Among ( "jeid", 3, 6, "", methodObject ),
                    new Among ( "\u00E1id", 0, 7, "", methodObject ),
                    new Among ( "\u00E9id", 0, 8, "", methodObject ),
                    new Among ( "i", -1, 15, "", methodObject ),
                    new Among ( "ai", 7, 14, "", methodObject ),
                    new Among ( "jai", 8, 11, "", methodObject ),
                    new Among ( "ei", 7, 14, "", methodObject ),
                    new Among ( "jei", 10, 11, "", methodObject ),
                    new Among ( "\u00E1i", 7, 12, "", methodObject ),
                    new Among ( "\u00E9i", 7, 13, "", methodObject ),
                    new Among ( "itek", -1, 24, "", methodObject ),
                    new Among ( "eitek", 14, 21, "", methodObject ),
                    new Among ( "jeitek", 15, 20, "", methodObject ),
                    new Among ( "\u00E9itek", 14, 23, "", methodObject ),
                    new Among ( "ik", -1, 29, "", methodObject ),
                    new Among ( "aik", 18, 26, "", methodObject ),
                    new Among ( "jaik", 19, 25, "", methodObject ),
                    new Among ( "eik", 18, 26, "", methodObject ),
                    new Among ( "jeik", 21, 25, "", methodObject ),
                    new Among ( "\u00E1ik", 18, 27, "", methodObject ),
                    new Among ( "\u00E9ik", 18, 28, "", methodObject ),
                    new Among ( "ink", -1, 20, "", methodObject ),
                    new Among ( "aink", 25, 17, "", methodObject ),
                    new Among ( "jaink", 26, 16, "", methodObject ),
                    new Among ( "eink", 25, 17, "", methodObject ),
                    new Among ( "jeink", 28, 16, "", methodObject ),
                    new Among ( "\u00E1ink", 25, 18, "", methodObject ),
                    new Among ( "\u00E9ink", 25, 19, "", methodObject ),
                    new Among ( "aitok", -1, 21, "", methodObject ),
                    new Among ( "jaitok", 32, 20, "", methodObject ),
                    new Among ( "\u00E1itok", -1, 22, "", methodObject ),
                    new Among ( "im", -1, 5, "", methodObject ),
                    new Among ( "aim", 35, 4, "", methodObject ),
                    new Among ( "jaim", 36, 1, "", methodObject ),
                    new Among ( "eim", 35, 4, "", methodObject ),
                    new Among ( "jeim", 38, 1, "", methodObject ),
                    new Among ( "\u00E1im", 35, 2, "", methodObject ),
                    new Among ( "\u00E9im", 35, 3, "", methodObject )
                };

        private static readonly char[] g_v = { (char)17, (char)65, (char)16, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)1, (char)17, (char)52, (char)14 };

        private int I_p1;

        private void copy_from(HungarianStemmer other)
        {
            I_p1 = other.I_p1;
            base.CopyFrom(other);
        }

        private bool r_mark_regions()
        {
            int v_1;
            int v_2;
            int v_3;
            // (, line 44
            I_p1 = m_limit;
            // or, line 51
            do
            {
                v_1 = m_cursor;
                do
                {
                    // (, line 48
                    if (!(InGrouping(g_v, 97, 252)))
                    {
                        goto lab1;
                    }
                    // goto, line 48
                    while (true)
                    {
                        v_2 = m_cursor;
                        do
                        {
                            if (!(OutGrouping(g_v, 97, 252)))
                            {
                                goto lab3;
                            }
                            m_cursor = v_2;
                            goto golab2;
                        } while (false);
                        lab3:
                        m_cursor = v_2;
                        if (m_cursor >= m_limit)
                        {
                            goto lab1;
                        }
                        m_cursor++;
                    }
                    golab2:
                    // or, line 49
                    do
                    {
                        v_3 = m_cursor;
                        do
                        {
                            // among, line 49
                            if (FindAmong(a_0, 8) == 0)
                            {
                                goto lab5;
                            }
                            goto lab4;
                        } while (false);
                        lab5:
                        m_cursor = v_3;
                        // next, line 49
                        if (m_cursor >= m_limit)
                        {
                            goto lab1;
                        }
                        m_cursor++;
                    } while (false);
                    lab4:
                    // setmark p1, line 50
                    I_p1 = m_cursor;
                    goto lab0;
                } while (false);
                lab1:
                m_cursor = v_1;
                // (, line 53
                if (!(OutGrouping(g_v, 97, 252)))
                {
                    return false;
                }
                // gopast, line 53
                while (true)
                {
                    do
                    {
                        if (!(InGrouping(g_v, 97, 252)))
                        {
                            goto lab7;
                        }
                        goto golab6;
                    } while (false);
                    lab7:
                    if (m_cursor >= m_limit)
                    {
                        return false;
                    }
                    m_cursor++;
                }
                golab6:
                // setmark p1, line 53
                I_p1 = m_cursor;
            } while (false);
            lab0:
            return true;
        }

        private bool r_R1()
        {
            if (!(I_p1 <= m_cursor))
            {
                return false;
            }
            return true;
        }

        private bool r_v_ending()
        {
            int among_var;
            // (, line 60
            // [, line 61
            m_ket = m_cursor;
            // substring, line 61
            among_var = FindAmongB(a_1, 2);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 61
            m_bra = m_cursor;
            // call R1, line 61
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 62
                    // <-, line 62
                    SliceFrom("a");
                    break;
                case 2:
                    // (, line 63
                    // <-, line 63
                    SliceFrom("e");
                    break;
            }
            return true;
        }

        private bool r_double()
        {
            int v_1;
            // (, line 67
            // test, line 68
            v_1 = m_limit - m_cursor;
            // among, line 68
            if (FindAmongB(a_2, 23) == 0)
            {
                return false;
            }
            m_cursor = m_limit - v_1;
            return true;
        }

        private bool r_undouble()
        {
            // (, line 72
            // next, line 73
            if (m_cursor <= m_limit_backward)
            {
                return false;
            }
            m_cursor--;
            // [, line 73
            m_ket = m_cursor;
            // hop, line 73
            {
                int c = m_cursor - 1;
                if (m_limit_backward > c || c > m_limit)
                {
                    return false;
                }
                m_cursor = c;
            }
            // ], line 73
            m_bra = m_cursor;
            // delete, line 73
            SliceDel();
            return true;
        }

        private bool r_instrum()
        {
            int among_var;
            // (, line 76
            // [, line 77
            m_ket = m_cursor;
            // substring, line 77
            among_var = FindAmongB(a_3, 2);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 77
            m_bra = m_cursor;
            // call R1, line 77
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 78
                    // call double, line 78
                    if (!r_double())
                    {
                        return false;
                    }
                    break;
                case 2:
                    // (, line 79
                    // call double, line 79
                    if (!r_double())
                    {
                        return false;
                    }
                    break;
            }
            // delete, line 81
            SliceDel();
            // call undouble, line 82
            if (!r_undouble())
            {
                return false;
            }
            return true;
        }

        private bool r_case()
        {
            // (, line 86
            // [, line 87
            m_ket = m_cursor;
            // substring, line 87
            if (FindAmongB(a_4, 44) == 0)
            {
                return false;
            }
            // ], line 87
            m_bra = m_cursor;
            // call R1, line 87
            if (!r_R1())
            {
                return false;
            }
            // delete, line 111
            SliceDel();
            // call v_ending, line 112
            if (!r_v_ending())
            {
                return false;
            }
            return true;
        }

        private bool r_case_special()
        {
            int among_var;
            // (, line 115
            // [, line 116
            m_ket = m_cursor;
            // substring, line 116
            among_var = FindAmongB(a_5, 3);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 116
            m_bra = m_cursor;
            // call R1, line 116
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 117
                    // <-, line 117
                    SliceFrom("e");
                    break;
                case 2:
                    // (, line 118
                    // <-, line 118
                    SliceFrom("a");
                    break;
                case 3:
                    // (, line 119
                    // <-, line 119
                    SliceFrom("a");
                    break;
            }
            return true;
        }

        private bool r_case_other()
        {
            int among_var;
            // (, line 123
            // [, line 124
            m_ket = m_cursor;
            // substring, line 124
            among_var = FindAmongB(a_6, 6);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 124
            m_bra = m_cursor;
            // call R1, line 124
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 125
                    // delete, line 125
                    SliceDel();
                    break;
                case 2:
                    // (, line 126
                    // delete, line 126
                    SliceDel();
                    break;
                case 3:
                    // (, line 127
                    // <-, line 127
                    SliceFrom("a");
                    break;
                case 4:
                    // (, line 128
                    // <-, line 128
                    SliceFrom("e");
                    break;
            }
            return true;
        }

        private bool r_factive()
        {
            int among_var;
            // (, line 132
            // [, line 133
            m_ket = m_cursor;
            // substring, line 133
            among_var = FindAmongB(a_7, 2);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 133
            m_bra = m_cursor;
            // call R1, line 133
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 134
                    // call double, line 134
                    if (!r_double())
                    {
                        return false;
                    }
                    break;
                case 2:
                    // (, line 135
                    // call double, line 135
                    if (!r_double())
                    {
                        return false;
                    }
                    break;
            }
            // delete, line 137
            SliceDel();
            // call undouble, line 138
            if (!r_undouble())
            {
                return false;
            }
            return true;
        }

        private bool r_plural()
        {
            int among_var;
            // (, line 141
            // [, line 142
            m_ket = m_cursor;
            // substring, line 142
            among_var = FindAmongB(a_8, 7);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 142
            m_bra = m_cursor;
            // call R1, line 142
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 143
                    // <-, line 143
                    SliceFrom("a");
                    break;
                case 2:
                    // (, line 144
                    // <-, line 144
                    SliceFrom("e");
                    break;
                case 3:
                    // (, line 145
                    // delete, line 145
                    SliceDel();
                    break;
                case 4:
                    // (, line 146
                    // delete, line 146
                    SliceDel();
                    break;
                case 5:
                    // (, line 147
                    // delete, line 147
                    SliceDel();
                    break;
                case 6:
                    // (, line 148
                    // delete, line 148
                    SliceDel();
                    break;
                case 7:
                    // (, line 149
                    // delete, line 149
                    SliceDel();
                    break;
            }
            return true;
        }

        private bool r_owned()
        {
            int among_var;
            // (, line 153
            // [, line 154
            m_ket = m_cursor;
            // substring, line 154
            among_var = FindAmongB(a_9, 12);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 154
            m_bra = m_cursor;
            // call R1, line 154
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 155
                    // delete, line 155
                    SliceDel();
                    break;
                case 2:
                    // (, line 156
                    // <-, line 156
                    SliceFrom("e");
                    break;
                case 3:
                    // (, line 157
                    // <-, line 157
                    SliceFrom("a");
                    break;
                case 4:
                    // (, line 158
                    // delete, line 158
                    SliceDel();
                    break;
                case 5:
                    // (, line 159
                    // <-, line 159
                    SliceFrom("e");
                    break;
                case 6:
                    // (, line 160
                    // <-, line 160
                    SliceFrom("a");
                    break;
                case 7:
                    // (, line 161
                    // delete, line 161
                    SliceDel();
                    break;
                case 8:
                    // (, line 162
                    // <-, line 162
                    SliceFrom("e");
                    break;
                case 9:
                    // (, line 163
                    // delete, line 163
                    SliceDel();
                    break;
            }
            return true;
        }

        private bool r_sing_owner()
        {
            int among_var;
            // (, line 167
            // [, line 168
            m_ket = m_cursor;
            // substring, line 168
            among_var = FindAmongB(a_10, 31);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 168
            m_bra = m_cursor;
            // call R1, line 168
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 169
                    // delete, line 169
                    SliceDel();
                    break;
                case 2:
                    // (, line 170
                    // <-, line 170
                    SliceFrom("a");
                    break;
                case 3:
                    // (, line 171
                    // <-, line 171
                    SliceFrom("e");
                    break;
                case 4:
                    // (, line 172
                    // delete, line 172
                    SliceDel();
                    break;
                case 5:
                    // (, line 173
                    // <-, line 173
                    SliceFrom("a");
                    break;
                case 6:
                    // (, line 174
                    // <-, line 174
                    SliceFrom("e");
                    break;
                case 7:
                    // (, line 175
                    // delete, line 175
                    SliceDel();
                    break;
                case 8:
                    // (, line 176
                    // delete, line 176
                    SliceDel();
                    break;
                case 9:
                    // (, line 177
                    // delete, line 177
                    SliceDel();
                    break;
                case 10:
                    // (, line 178
                    // <-, line 178
                    SliceFrom("a");
                    break;
                case 11:
                    // (, line 179
                    // <-, line 179
                    SliceFrom("e");
                    break;
                case 12:
                    // (, line 180
                    // delete, line 180
                    SliceDel();
                    break;
                case 13:
                    // (, line 181
                    // delete, line 181
                    SliceDel();
                    break;
                case 14:
                    // (, line 182
                    // <-, line 182
                    SliceFrom("a");
                    break;
                case 15:
                    // (, line 183
                    // <-, line 183
                    SliceFrom("e");
                    break;
                case 16:
                    // (, line 184
                    // delete, line 184
                    SliceDel();
                    break;
                case 17:
                    // (, line 185
                    // delete, line 185
                    SliceDel();
                    break;
                case 18:
                    // (, line 186
                    // delete, line 186
                    SliceDel();
                    break;
                case 19:
                    // (, line 187
                    // <-, line 187
                    SliceFrom("a");
                    break;
                case 20:
                    // (, line 188
                    // <-, line 188
                    SliceFrom("e");
                    break;
            }
            return true;
        }

        private bool r_plur_owner()
        {
            int among_var;
            // (, line 192
            // [, line 193
            m_ket = m_cursor;
            // substring, line 193
            among_var = FindAmongB(a_11, 42);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 193
            m_bra = m_cursor;
            // call R1, line 193
            if (!r_R1())
            {
                return false;
            }
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 194
                    // delete, line 194
                    SliceDel();
                    break;
                case 2:
                    // (, line 195
                    // <-, line 195
                    SliceFrom("a");
                    break;
                case 3:
                    // (, line 196
                    // <-, line 196
                    SliceFrom("e");
                    break;
                case 4:
                    // (, line 197
                    // delete, line 197
                    SliceDel();
                    break;
                case 5:
                    // (, line 198
                    // delete, line 198
                    SliceDel();
                    break;
                case 6:
                    // (, line 199
                    // delete, line 199
                    SliceDel();
                    break;
                case 7:
                    // (, line 200
                    // <-, line 200
                    SliceFrom("a");
                    break;
                case 8:
                    // (, line 201
                    // <-, line 201
                    SliceFrom("e");
                    break;
                case 9:
                    // (, line 202
                    // delete, line 202
                    SliceDel();
                    break;
                case 10:
                    // (, line 203
                    // delete, line 203
                    SliceDel();
                    break;
                case 11:
                    // (, line 204
                    // delete, line 204
                    SliceDel();
                    break;
                case 12:
                    // (, line 205
                    // <-, line 205
                    SliceFrom("a");
                    break;
                case 13:
                    // (, line 206
                    // <-, line 206
                    SliceFrom("e");
                    break;
                case 14:
                    // (, line 207
                    // delete, line 207
                    SliceDel();
                    break;
                case 15:
                    // (, line 208
                    // delete, line 208
                    SliceDel();
                    break;
                case 16:
                    // (, line 209
                    // delete, line 209
                    SliceDel();
                    break;
                case 17:
                    // (, line 210
                    // delete, line 210
                    SliceDel();
                    break;
                case 18:
                    // (, line 211
                    // <-, line 211
                    SliceFrom("a");
                    break;
                case 19:
                    // (, line 212
                    // <-, line 212
                    SliceFrom("e");
                    break;
                case 20:
                    // (, line 214
                    // delete, line 214
                    SliceDel();
                    break;
                case 21:
                    // (, line 215
                    // delete, line 215
                    SliceDel();
                    break;
                case 22:
                    // (, line 216
                    // <-, line 216
                    SliceFrom("a");
                    break;
                case 23:
                    // (, line 217
                    // <-, line 217
                    SliceFrom("e");
                    break;
                case 24:
                    // (, line 218
                    // delete, line 218
                    SliceDel();
                    break;
                case 25:
                    // (, line 219
                    // delete, line 219
                    SliceDel();
                    break;
                case 26:
                    // (, line 220
                    // delete, line 220
                    SliceDel();
                    break;
                case 27:
                    // (, line 221
                    // <-, line 221
                    SliceFrom("a");
                    break;
                case 28:
                    // (, line 222
                    // <-, line 222
                    SliceFrom("e");
                    break;
                case 29:
                    // (, line 223
                    // delete, line 223
                    SliceDel();
                    break;
            }
            return true;
        }


        public override bool Stem()
        {
            int v_1;
            int v_2;
            int v_3;
            int v_4;
            int v_5;
            int v_6;
            int v_7;
            int v_8;
            int v_9;
            int v_10;
            // (, line 228
            // do, line 229
            v_1 = m_cursor;
            do
            {
                // call mark_regions, line 229
                if (!r_mark_regions())
                {
                    goto lab0;
                }
            } while (false);
            lab0:
            m_cursor = v_1;
            // backwards, line 230
            m_limit_backward = m_cursor; m_cursor = m_limit;
            // (, line 230
            // do, line 231
            v_2 = m_limit - m_cursor;
            do
            {
                // call instrum, line 231
                if (!r_instrum())
                {
                    goto lab1;
                }
            } while (false);
            lab1:
            m_cursor = m_limit - v_2;
            // do, line 232
            v_3 = m_limit - m_cursor;
            do
            {
                // call case, line 232
                if (!r_case())
                {
                    goto lab2;
                }
            } while (false);
            lab2:
            m_cursor = m_limit - v_3;
            // do, line 233
            v_4 = m_limit - m_cursor;
            do
            {
                // call case_special, line 233
                if (!r_case_special())
                {
                    goto lab3;
                }
            } while (false);
            lab3:
            m_cursor = m_limit - v_4;
            // do, line 234
            v_5 = m_limit - m_cursor;
            do
            {
                // call case_other, line 234
                if (!r_case_other())
                {
                    goto lab4;
                }
            } while (false);
            lab4:
            m_cursor = m_limit - v_5;
            // do, line 235
            v_6 = m_limit - m_cursor;
            do
            {
                // call factive, line 235
                if (!r_factive())
                {
                    goto lab5;
                }
            } while (false);
            lab5:
            m_cursor = m_limit - v_6;
            // do, line 236
            v_7 = m_limit - m_cursor;
            do
            {
                // call owned, line 236
                if (!r_owned())
                {
                    goto lab6;
                }
            } while (false);
            lab6:
            m_cursor = m_limit - v_7;
            // do, line 237
            v_8 = m_limit - m_cursor;
            do
            {
                // call sing_owner, line 237
                if (!r_sing_owner())
                {
                    goto lab7;
                }
            } while (false);
            lab7:
            m_cursor = m_limit - v_8;
            // do, line 238
            v_9 = m_limit - m_cursor;
            do
            {
                // call plur_owner, line 238
                if (!r_plur_owner())
                {
                    goto lab8;
                }
            } while (false);
            lab8:
            m_cursor = m_limit - v_9;
            // do, line 239
            v_10 = m_limit - m_cursor;
            do
            {
                // call plural, line 239
                if (!r_plural())
                {
                    goto lab9;
                }
            } while (false);
            lab9:
            m_cursor = m_limit - v_10;
            m_cursor = m_limit_backward; return true;
        }

        public override bool Equals(object o)
        {
            return o is HungarianStemmer;
        }

        public override int GetHashCode()
        {
            return this.GetType().FullName.GetHashCode();
        }
    }
}
