# Generated by Haxe 4.2.2
# coding: utf-8
import sys

import math as python_lib_Math
import math as Math
import inspect as python_lib_Inspect
import sys as python_lib_Sys
import traceback as python_lib_Traceback
import re as python_lib_Re
import builtins as python_lib_Builtins
import functools as python_lib_Functools
from io import StringIO as python_lib_io_StringIO
import urllib.parse as python_lib_urllib_Parse


class _hx_AnonObject:
    _hx_disable_getattr = False
    def __init__(self, fields):
        self.__dict__ = fields
    def __repr__(self):
        return repr(self.__dict__)
    def __contains__(self, item):
        return item in self.__dict__
    def __getitem__(self, item):
        return self.__dict__[item]
    def __getattr__(self, name):
        if (self._hx_disable_getattr):
            raise AttributeError('field does not exist')
        else:
            return None
    def _hx_hasattr(self,field):
        self._hx_disable_getattr = True
        try:
            getattr(self, field)
            self._hx_disable_getattr = False
            return True
        except AttributeError:
            self._hx_disable_getattr = False
            return False



class Enum:
    _hx_class_name = "Enum"
    __slots__ = ("tag", "index", "params")
    _hx_fields = ["tag", "index", "params"]
    _hx_methods = ["__str__"]

    def __init__(self,tag,index,params):
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:39
        self.tag = tag
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:40
        self.index = index
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:41
        self.params = params

    def __str__(self):
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:46
        if (self.params is None):
            return self.tag
        else:
            return self.tag + '(' + (', '.join(str(v) for v in self.params)) + ')'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.tag = None
        _hx_o.index = None
        _hx_o.params = None


class AstNode:
    _hx_class_name = "AstNode"
    __slots__ = ("isError",)
    _hx_fields = ["isError"]
    _hx_methods = ["getResultType", "getResult", "toString"]

    def __init__(self):
        # src/AstNode.hx:4
        self.isError = False

    def getResultType(self,context):
        # src/AstNode.hx:7
        return DataTypeInstance.fromData(self.getResult(context))

    def getResult(self,context):
        # src/AstNode.hx:11
        return Data.Nothing

    def toString(self):
        # src/AstNode.hx:15
        return "Default Node"

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.isError = None


class AstDataTypeNode(AstNode):
    _hx_class_name = "AstDataTypeNode"
    __slots__ = ("type", "dependencies")
    _hx_fields = ["type", "dependencies"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,_hx_type,dependencies = None):
        # src/AstNode.hx:20
        self.type = None
        # src/AstNode.hx:21
        self.dependencies = []
        # src/AstNode.hx:23
        super().__init__()
        # src/AstNode.hx:24
        self.type = _hx_type
        # src/AstNode.hx:25
        if (dependencies is not None):
            self.dependencies = dependencies

    def getResultType(self,context):
        # src/AstNode.hx:30
        instDependencies = []
        # src/AstNode.hx:31
        # src/AstNode.hx:31
        _g = 0
        _g1 = self.dependencies
        while (_g < len(_g1)):
            dependency = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # src/AstNode.hx:32
            # src/AstNode.hx:32
            _g2 = dependency.getResult(context)
            if (_g2.index == 0):
                # src/AstNode.hx:33
                dataType = _g2.params[0]
                # src/AstNode.hx:34
                instDependencies.append(dataType)
            else:
                # src/AstNode.hx:35
                exception = _g2
                # src/AstNode.hx:36
                raise haxe_Exception.thrown((("Cannot use " + Std.string(exception)) + " as a dependency"))
        # src/AstNode.hx:40
        return DataTypeInstance(self.type,instDependencies)

    def getResult(self,context):
        # src/AstNode.hx:44
        return Data.DType(self.getResultType(context))

    def toString(self):
        # src/AstNode.hx:48
        depString = ", DEPENDENCIES:"
        # src/AstNode.hx:49
        # src/AstNode.hx:49
        _g = 0
        _g1 = len(self.dependencies)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/AstNode.hx:50
            depString = (("null" if depString is None else depString) + HxOverrides.stringOrNull(((HxOverrides.stringOrNull((self.dependencies[i] if i >= 0 and i < len(self.dependencies) else None).toString()) + HxOverrides.stringOrNull(((", " if ((i < ((len(self.dependencies) - 1)))) else "")))))))
        # src/AstNode.hx:51
        return ((("(TYPE:" + HxOverrides.stringOrNull(self.type.identifier)) + HxOverrides.stringOrNull(((depString if ((len(self.dependencies) > 0)) else "")))) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.type = None
        _hx_o.dependencies = None


class AstNumbNode(AstNode):
    _hx_class_name = "AstNumbNode"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,value):
        # src/AstNode.hx:56
        self.value = None
        # src/AstNode.hx:58
        super().__init__()
        # src/AstNode.hx:59
        self.value = value

    def getResultType(self,context):
        # src/AstNode.hx:63
        return DataTypeInstance(DataTypes.TYPES.REAL)

    def getResult(self,context):
        # src/AstNode.hx:67
        return Data.Real(self.value)

    def toString(self):
        # src/AstNode.hx:71
        return ("NUMB:" + Std.string(self.value))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class AstStrNode(AstNode):
    _hx_class_name = "AstStrNode"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,value):
        # src/AstNode.hx:76
        self.value = None
        # src/AstNode.hx:78
        super().__init__()
        # src/AstNode.hx:79
        self.value = value

    def getResultType(self,context):
        # src/AstNode.hx:83
        return DataTypeInstance(DataTypes.TYPES.STRING)

    def getResult(self,context):
        # src/AstNode.hx:87
        return Data.Str(self.value)

    def toString(self):
        # src/AstNode.hx:91
        return ("STRING:" + HxOverrides.stringOrNull(self.value))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class AstBoolNode(AstNode):
    _hx_class_name = "AstBoolNode"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,value):
        # src/AstNode.hx:96
        self.value = None
        # src/AstNode.hx:98
        super().__init__()
        # src/AstNode.hx:99
        self.value = value

    def getResultType(self,context):
        # src/AstNode.hx:103
        return DataTypeInstance(DataTypes.TYPES.BOOL)

    def getResult(self,context):
        # src/AstNode.hx:107
        return Data.Boolean(self.value)

    def toString(self):
        # src/AstNode.hx:111
        return ("BOOL:" + Std.string(self.value))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None

class OpPair(Enum):
    __slots__ = ()
    _hx_class_name = "OpPair"
    _hx_constructs = ["Invalid", "RealReal", "StrStr", "StrReal", "RealStr", "BoolBool"]

    @staticmethod
    def RealReal(v1,v2):
        return OpPair("RealReal", 1, (v1,v2))

    @staticmethod
    def StrStr(v1,v2):
        return OpPair("StrStr", 2, (v1,v2))

    @staticmethod
    def StrReal(v1,v2):
        return OpPair("StrReal", 3, (v1,v2))

    @staticmethod
    def RealStr(v1,v2):
        return OpPair("RealStr", 4, (v1,v2))

    @staticmethod
    def BoolBool(v1,v2):
        return OpPair("BoolBool", 5, (v1,v2))
OpPair.Invalid = OpPair("Invalid", 0, ())


class AstBinOpNode(AstNode):
    _hx_class_name = "AstBinOpNode"
    __slots__ = ("left", "right", "operatorToken")
    _hx_fields = ["left", "right", "operatorToken"]
    _hx_methods = ["getResult", "getPair", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,left,right,operatorToken):
        # src/AstNode.hx:127
        self.operatorToken = None
        # src/AstNode.hx:126
        self.right = None
        # src/AstNode.hx:125
        self.left = None
        # src/AstNode.hx:129
        super().__init__()
        # src/AstNode.hx:130
        self.left = left
        # src/AstNode.hx:131
        self.right = right
        # src/AstNode.hx:132
        self.operatorToken = operatorToken

    def getResult(self,context):
        # src/AstNode.hx:136
        data1 = self.left.getResult(context)
        data2 = self.right.getResult(context)
        pair = None
        pair1 = data1.index
        if (pair1 == 2):
            float1 = data1.params[0]
            pair1 = data2.index
            if (pair1 == 2):
                float2 = data2.params[0]
                pair = OpPair.RealReal(float1,float2)
            elif (pair1 == 3):
                string = data2.params[0]
                pair = OpPair.RealStr(float1,string)
            else:
                pair = OpPair.Invalid
        elif (pair1 == 3):
            string1 = data1.params[0]
            pair1 = data2.index
            if (pair1 == 2):
                _hx_float = data2.params[0]
                pair = OpPair.StrReal(string1,_hx_float)
            elif (pair1 == 3):
                string2 = data2.params[0]
                pair = OpPair.StrStr(string1,string2)
            else:
                pair = OpPair.Invalid
        elif (pair1 == 4):
            bool1 = data1.params[0]
            if (data2.index == 4):
                bool2 = data2.params[0]
                pair = OpPair.BoolBool(bool1,bool2)
            else:
                pair = OpPair.Invalid
        else:
            pair = OpPair.Invalid
        # src/AstNode.hx:138
        # src/AstNode.hx:138
        tmp = self.operatorToken.index
        # src/AstNode.hx:140
        if (tmp == 6):
            if (pair.index == 1):
                # src/AstNode.hx:141
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:142
                return Data.Real(Math.pow(v1,v2))
        elif (tmp == 7):
            # src/AstNode.hx:146
            tmp = pair.index
            # src/AstNode.hx:147
            if (tmp == 1):
                # src/AstNode.hx:147
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:148
                return Data.Real((v1 + v2))
            elif (tmp == 2):
                # src/AstNode.hx:149
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:150
                return Data.Str((("null" if v1 is None else v1) + ("null" if v2 is None else v2)))
            elif (tmp == 3):
                # src/AstNode.hx:153
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:154
                return Data.Str((("" + ("null" if v1 is None else v1)) + Std.string(v2)))
            elif (tmp == 4):
                # src/AstNode.hx:151
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:152
                return Data.Str((("" + Std.string(v1)) + ("null" if v2 is None else v2)))
            else:
                pass
        elif (tmp == 8):
            if (pair.index == 1):
                # src/AstNode.hx:159
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:160
                return Data.Real((v1 - v2))
        elif (tmp == 9):
            if (pair.index == 1):
                # src/AstNode.hx:165
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:166
                return Data.Real((v1 * v2))
        elif (tmp == 10):
            if (pair.index == 1):
                # src/AstNode.hx:171
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:172
                return Data.Real((v1 / v2))
        elif (tmp == 11):
            if (pair.index == 1):
                # src/AstNode.hx:177
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:178
                return Data.Real(HxOverrides.modf(v1, v2))
        elif (tmp == 12):
            # src/AstNode.hx:182
            tmp = pair.index
            # src/AstNode.hx:183
            if (tmp == 1):
                # src/AstNode.hx:183
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:184
                return Data.Boolean((v1 == v2))
            elif (tmp == 2):
                # src/AstNode.hx:185
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:186
                return Data.Boolean((v1 == v2))
            elif (tmp == 5):
                # src/AstNode.hx:187
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:188
                return Data.Boolean((v1 == v2))
            else:
                pass
        elif (tmp == 13):
            # src/AstNode.hx:192
            tmp = pair.index
            # src/AstNode.hx:193
            if (tmp == 1):
                # src/AstNode.hx:193
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:194
                return Data.Boolean((v1 > v2))
            elif (tmp == 2):
                # src/AstNode.hx:195
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:196
                return Data.Boolean((v1 > v2))
            else:
                pass
        elif (tmp == 14):
            # src/AstNode.hx:208
            tmp = pair.index
            # src/AstNode.hx:209
            if (tmp == 1):
                # src/AstNode.hx:209
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:210
                return Data.Boolean((v1 < v2))
            elif (tmp == 2):
                # src/AstNode.hx:211
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:212
                return Data.Boolean((v1 < v2))
            else:
                pass
        elif (tmp == 15):
            # src/AstNode.hx:200
            tmp = pair.index
            # src/AstNode.hx:201
            if (tmp == 1):
                # src/AstNode.hx:201
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:202
                return Data.Boolean((v1 >= v2))
            elif (tmp == 2):
                # src/AstNode.hx:203
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:204
                return Data.Boolean((v1 >= v2))
            else:
                pass
        elif (tmp == 16):
            # src/AstNode.hx:216
            tmp = pair.index
            # src/AstNode.hx:217
            if (tmp == 1):
                # src/AstNode.hx:217
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:218
                return Data.Boolean((v1 <= v2))
            elif (tmp == 2):
                # src/AstNode.hx:219
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:220
                return Data.Boolean((v1 <= v2))
            else:
                pass
        elif (tmp == 17):
            if (pair.index == 5):
                # src/AstNode.hx:225
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:226
                return Data.Boolean((v1 and v2))
        elif (tmp == 18):
            if (pair.index == 5):
                # src/AstNode.hx:231
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:232
                return Data.Boolean((v1 or v2))
        else:
            pass
        # src/AstNode.hx:238
        return Data.Nothing

    def getPair(self,data1,data2):
        # src/AstNode.hx:242
        tmp = data1.index
        # src/AstNode.hx:243
        if (tmp == 2):
            # src/AstNode.hx:243
            float1 = data1.params[0]
            # src/AstNode.hx:244
            tmp = data2.index
            # src/AstNode.hx:245
            if (tmp == 2):
                # src/AstNode.hx:245
                float2 = data2.params[0]
                # src/AstNode.hx:246
                return OpPair.RealReal(float1,float2)
            elif (tmp == 3):
                # src/AstNode.hx:247
                string = data2.params[0]
                # src/AstNode.hx:248
                return OpPair.RealStr(float1,string)
            else:
                return OpPair.Invalid
        elif (tmp == 3):
            # src/AstNode.hx:252
            string1 = data1.params[0]
            # src/AstNode.hx:253
            tmp = data2.index
            # src/AstNode.hx:256
            if (tmp == 2):
                # src/AstNode.hx:256
                _hx_float = data2.params[0]
                # src/AstNode.hx:257
                return OpPair.StrReal(string1,_hx_float)
            elif (tmp == 3):
                # src/AstNode.hx:254
                string2 = data2.params[0]
                # src/AstNode.hx:255
                return OpPair.StrStr(string1,string2)
            else:
                return OpPair.Invalid
        elif (tmp == 4):
            # src/AstNode.hx:261
            bool1 = data1.params[0]
            # src/AstNode.hx:262
            if (data2.index == 4):
                # src/AstNode.hx:263
                bool2 = data2.params[0]
                # src/AstNode.hx:264
                return OpPair.BoolBool(bool1,bool2)
            else:
                return OpPair.Invalid
        else:
            return OpPair.Invalid

    def toString(self):
        # src/AstNode.hx:274
        tmp = (("(" + HxOverrides.stringOrNull(self.left.toString())) + " ")
        tokenType = self.operatorToken
        tmp1 = None
        tmp2 = tokenType.index
        if (tmp2 == 0):
            name = tokenType.params[0]
            tmp1 = ("IDENTIFIER:" + ("null" if name is None else name))
        elif (tmp2 == 1):
            _hx_type = tokenType.params[0]
            tmp1 = ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
        elif (tmp2 == 2):
            number = tokenType.params[0]
            tmp1 = ("REAL:" + Std.string(number))
        elif (tmp2 == 3):
            string = tokenType.params[0]
            tmp1 = ("TEXT:" + ("null" if string is None else string))
        elif (tmp2 == 4):
            _hx_bool = tokenType.params[0]
            tmp1 = ("BOOL:" + Std.string(_hx_bool))
        elif (tmp2 == 5):
            tmp1 = "="
        elif (tmp2 == 6):
            tmp1 = "^"
        elif (tmp2 == 7):
            tmp1 = "+"
        elif (tmp2 == 8):
            tmp1 = "-"
        elif (tmp2 == 9):
            tmp1 = "*"
        elif (tmp2 == 10):
            tmp1 = "/"
        elif (tmp2 == 11):
            tmp1 = "%"
        elif (tmp2 == 12):
            tmp1 = "=="
        elif (tmp2 == 13):
            tmp1 = ">"
        elif (tmp2 == 14):
            tmp1 = "<"
        elif (tmp2 == 15):
            tmp1 = ">="
        elif (tmp2 == 16):
            tmp1 = "<="
        elif (tmp2 == 17):
            tmp1 = "AND"
        elif (tmp2 == 18):
            tmp1 = "OR"
        elif (tmp2 == 19):
            tmp1 = "("
        elif (tmp2 == 20):
            tmp1 = ")"
        elif (tmp2 == 23):
            tmp1 = "["
        elif (tmp2 == 24):
            tmp1 = "]"
        elif (tmp2 == 25):
            tmp1 = ","
        elif (tmp2 == 26):
            tmp1 = "IF"
        elif (tmp2 == 27):
            tmp1 = "ELIF"
        elif (tmp2 == 28):
            tmp1 = "ELSE"
        elif (tmp2 == 29):
            tmp1 = ";"
        else:
            tmp1 = "Default Token"
        return ((((("null" if tmp is None else tmp) + ("null" if tmp1 is None else tmp1)) + " ") + HxOverrides.stringOrNull(self.right.toString())) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.left = None
        _hx_o.right = None
        _hx_o.operatorToken = None


class AstUnaryOpNode(AstNode):
    _hx_class_name = "AstUnaryOpNode"
    __slots__ = ("opToken", "node")
    _hx_fields = ["opToken", "node"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,opToken,node):
        # src/AstNode.hx:280
        self.node = None
        # src/AstNode.hx:279
        self.opToken = None
        # src/AstNode.hx:282
        super().__init__()
        # src/AstNode.hx:283
        self.opToken = opToken
        # src/AstNode.hx:284
        self.node = node

    def getResultType(self,context):
        # src/AstNode.hx:288
        return DataTypeInstance(DataTypes.TYPES.REAL)

    def getResult(self,context):
        # src/AstNode.hx:292
        r = self.node.getResult(context)
        # src/AstNode.hx:293
        number = None
        # src/AstNode.hx:295
        if (r.index == 2):
            # src/AstNode.hx:296
            _hx_float = r.params[0]
            # src/AstNode.hx:297
            number = _hx_float
        else:
            return Data.Nothing
        # src/AstNode.hx:302
        tmp = self.opToken.index
        # src/AstNode.hx:304
        if (tmp == 7):
            return Data.Real(number)
        elif (tmp == 8):
            return Data.Real(-number)
        else:
            return Data.Nothing

    def toString(self):
        # src/AstNode.hx:313
        tokenType = self.opToken
        tmp = None
        tmp1 = tokenType.index
        if (tmp1 == 0):
            name = tokenType.params[0]
            tmp = ("IDENTIFIER:" + ("null" if name is None else name))
        elif (tmp1 == 1):
            _hx_type = tokenType.params[0]
            tmp = ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
        elif (tmp1 == 2):
            number = tokenType.params[0]
            tmp = ("REAL:" + Std.string(number))
        elif (tmp1 == 3):
            string = tokenType.params[0]
            tmp = ("TEXT:" + ("null" if string is None else string))
        elif (tmp1 == 4):
            _hx_bool = tokenType.params[0]
            tmp = ("BOOL:" + Std.string(_hx_bool))
        elif (tmp1 == 5):
            tmp = "="
        elif (tmp1 == 6):
            tmp = "^"
        elif (tmp1 == 7):
            tmp = "+"
        elif (tmp1 == 8):
            tmp = "-"
        elif (tmp1 == 9):
            tmp = "*"
        elif (tmp1 == 10):
            tmp = "/"
        elif (tmp1 == 11):
            tmp = "%"
        elif (tmp1 == 12):
            tmp = "=="
        elif (tmp1 == 13):
            tmp = ">"
        elif (tmp1 == 14):
            tmp = "<"
        elif (tmp1 == 15):
            tmp = ">="
        elif (tmp1 == 16):
            tmp = "<="
        elif (tmp1 == 17):
            tmp = "AND"
        elif (tmp1 == 18):
            tmp = "OR"
        elif (tmp1 == 19):
            tmp = "("
        elif (tmp1 == 20):
            tmp = ")"
        elif (tmp1 == 23):
            tmp = "["
        elif (tmp1 == 24):
            tmp = "]"
        elif (tmp1 == 25):
            tmp = ","
        elif (tmp1 == 26):
            tmp = "IF"
        elif (tmp1 == 27):
            tmp = "ELIF"
        elif (tmp1 == 28):
            tmp = "ELSE"
        elif (tmp1 == 29):
            tmp = ";"
        else:
            tmp = "Default Token"
        return ((("(" + ("null" if tmp is None else tmp)) + HxOverrides.stringOrNull(self.node.toString())) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.opToken = None
        _hx_o.node = None


class AstVarAccessNode(AstNode):
    _hx_class_name = "AstVarAccessNode"
    __slots__ = ("variableName",)
    _hx_fields = ["variableName"]
    _hx_methods = ["getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,variableName):
        # src/AstNode.hx:318
        self.variableName = None
        # src/AstNode.hx:320
        super().__init__()
        # src/AstNode.hx:321
        self.variableName = variableName

    def getResult(self,context):
        # src/AstNode.hx:325
        variable = context.getVariable(self.variableName)
        # src/AstNode.hx:326
        if (variable is None):
            raise haxe_Exception.thrown("Trying to access variable that was never defined")
        # src/AstNode.hx:328
        return variable.value

    def toString(self):
        # src/AstNode.hx:332
        return ("VARIABLE:" + HxOverrides.stringOrNull(self.variableName))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.variableName = None


class AstAssignmentNode(AstNode):
    _hx_class_name = "AstAssignmentNode"
    __slots__ = ("variableName", "initType", "assignedTo")
    _hx_fields = ["variableName", "initType", "assignedTo"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,variableName,initType = None,assignedTo = None):
        # src/AstNode.hx:339
        self.assignedTo = None
        # src/AstNode.hx:338
        self.initType = None
        # src/AstNode.hx:337
        self.variableName = None
        # src/AstNode.hx:341
        super().__init__()
        # src/AstNode.hx:342
        self.variableName = variableName
        # src/AstNode.hx:343
        self.initType = initType
        # src/AstNode.hx:344
        self.assignedTo = assignedTo

    def getResultType(self,context):
        # src/AstNode.hx:348
        if (self.initType is not None):
            return self.initType.getResultType(context)
        # src/AstNode.hx:351
        variable = context.getVariable(self.variableName)
        # src/AstNode.hx:352
        if (variable is None):
            return DataTypeInstance(DataTypes.TYPES.DYNAMIC)
        # src/AstNode.hx:354
        return variable.typeInst

    def getResult(self,context):
        # src/AstNode.hx:358
        if (self.initType is not None):
            # src/AstNode.hx:359
            _g = self.initType.getResult(context)
            if (_g.index == 0):
                # src/AstNode.hx:360
                dataType = _g.params[0]
                # src/AstNode.hx:361
                value = (None if ((self.assignedTo is None)) else self.assignedTo.getResult(context))
                # src/AstNode.hx:362
                context.createVariable(self.variableName,dataType,value)
                # src/AstNode.hx:363
                if (value is None):
                    return Data.Nothing
                else:
                    return value
            else:
                return Data.Nothing
        else:
            # src/AstNode.hx:369
            variable = context.getVariable(self.variableName)
            # src/AstNode.hx:370
            if ((variable is None) or ((self.assignedTo is None))):
                return Data.Nothing
            # src/AstNode.hx:373
            value = self.assignedTo.getResult(context)
            # src/AstNode.hx:374
            context.setVariable(variable,value)
            # src/AstNode.hx:375
            return value

    def toString(self):
        # src/AstNode.hx:382
        return ((((("(ASSIGN:" + HxOverrides.stringOrNull(((("" + Std.string(self.initType)) if ((self.initType is not None)) else "")))) + " ") + HxOverrides.stringOrNull(self.variableName)) + HxOverrides.stringOrNull((((" = " + HxOverrides.stringOrNull(self.assignedTo.toString())) if ((self.assignedTo is not None)) else "")))) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.variableName = None
        _hx_o.initType = None
        _hx_o.assignedTo = None


class AstArrayAccessNode(AstNode):
    _hx_class_name = "AstArrayAccessNode"
    __slots__ = ("accessed", "index", "assign")
    _hx_fields = ["accessed", "index", "assign"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,accessed,index,assign = None):
        # src/AstNode.hx:389
        self.assign = None
        # src/AstNode.hx:388
        self.index = None
        # src/AstNode.hx:387
        self.accessed = None
        # src/AstNode.hx:391
        super().__init__()
        # src/AstNode.hx:392
        self.accessed = accessed
        # src/AstNode.hx:393
        self.index = index
        # src/AstNode.hx:394
        self.assign = assign

    def getResultType(self,context):
        # src/AstNode.hx:398
        t = self.accessed.getResultType(context)
        # src/AstNode.hx:399
        if (t.type.typeDependencies > 0):
            # src/AstNode.hx:399
            _this = self.accessed.getResultType(context)
            if (len(_this.dependencies) < 1):
                return None
            else:
                return (_this.dependencies[0] if 0 < len(_this.dependencies) else None)
        else:
            return DataTypeInstance(DataTypes.TYPES.DYNAMIC)

    def getResult(self,context):
        # src/AstNode.hx:403
        resultA = self.accessed.getResult(context)
        # src/AstNode.hx:404
        resultB = self.index.getResult(context)
        # src/AstNode.hx:406
        if (resultA.index == 5):
            # src/AstNode.hx:407
            _hx_type = resultA.params[0]
            _hx_list = resultA.params[1]
            # src/AstNode.hx:408
            if (resultB.index == 2):
                # src/AstNode.hx:409
                _hx_float = resultB.params[0]
                # src/AstNode.hx:410
                i = Math.floor(_hx_float)
                # src/AstNode.hx:411
                if (self.assign is None):
                    return (_hx_list[i] if i >= 0 and i < len(_hx_list) else None)
                else:
                    # src/AstNode.hx:414
                    if (not _hx_type.equals(self.assign.getResultType(context))):
                        raise haxe_Exception.thrown("Trying to set array value to invalid type")
                    # src/AstNode.hx:417
                    def _hx_local_1():
                        # src/AstNode.hx:417
                        def _hx_local_0():
                            # src/AstNode.hx:417
                            python_internal_ArrayImpl._set(_hx_list, i, self.assign.getResult(context))
                            return (_hx_list[i] if i >= 0 and i < len(_hx_list) else None)
                        return _hx_local_0()
                    return _hx_local_1()
        # src/AstNode.hx:424
        raise haxe_Exception.thrown("Invalid use of array access")

    def toString(self):
        # src/AstNode.hx:429
        return (((((("(" + HxOverrides.stringOrNull(self.accessed.toString())) + "[") + HxOverrides.stringOrNull(self.index.toString())) + "]") + HxOverrides.stringOrNull((((" = " + HxOverrides.stringOrNull(self.assign.toString())) if ((self.assign is not None)) else "")))) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.accessed = None
        _hx_o.index = None
        _hx_o.assign = None


class AstListNode(AstNode):
    _hx_class_name = "AstListNode"
    __slots__ = ("elementNodes",)
    _hx_fields = ["elementNodes"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,elementNodes):
        # src/AstNode.hx:434
        self.elementNodes = []
        # src/AstNode.hx:436
        super().__init__()
        # src/AstNode.hx:437
        self.elementNodes = elementNodes

    def getResultType(self,context):
        # src/AstNode.hx:442
        _hx_type = None
        # src/AstNode.hx:443
        if (len(self.elementNodes) > 0):
            # src/AstNode.hx:444
            _hx_type = (self.elementNodes[0] if 0 < len(self.elementNodes) else None).getResultType(context)
            # src/AstNode.hx:445
            # src/AstNode.hx:445
            _g = 0
            _g1 = self.elementNodes
            while (_g < len(_g1)):
                element = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # src/AstNode.hx:446
                if (not _hx_type.equals(element.getResultType(context))):
                    # src/AstNode.hx:447
                    _hx_type = None
                    # src/AstNode.hx:448
                    break
        # src/AstNode.hx:452
        if (_hx_type is None):
            _hx_type = DataTypeInstance(DataTypes.TYPES.DYNAMIC)
        # src/AstNode.hx:454
        return DataTypeInstance(DataTypes.TYPES.ARRAY_LIST,[_hx_type])

    def getResult(self,context):
        # src/AstNode.hx:458
        _this = self.getResultType(context)
        _hx_type = (None if ((len(_this.dependencies) < 1)) else (_this.dependencies[0] if 0 < len(_this.dependencies) else None))
        # src/AstNode.hx:459
        _g = []
        # src/AstNode.hx:460
        # src/AstNode.hx:460
        _g1 = 0
        _g2 = self.elementNodes
        while (_g1 < len(_g2)):
            element = (_g2[_g1] if _g1 >= 0 and _g1 < len(_g2) else None)
            _g1 = (_g1 + 1)
            # src/AstNode.hx:461
            # src/AstNode.hx:461
            x = element.getResult(context)
            _g.append(x)
        # src/AstNode.hx:459
        _hx_list = _g
        # src/AstNode.hx:463
        return Data.ArrayList(_hx_type,_hx_list)

    def toString(self):
        # src/AstNode.hx:467
        _hx_str = "["
        # src/AstNode.hx:468
        # src/AstNode.hx:468
        _g = 0
        _g1 = len(self.elementNodes)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/AstNode.hx:469
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull(((HxOverrides.stringOrNull((self.elementNodes[i] if i >= 0 and i < len(self.elementNodes) else None).toString()) + HxOverrides.stringOrNull(((", " if ((i < ((len(self.elementNodes) - 1)))) else "")))))))
        # src/AstNode.hx:471
        return (("null" if _hx_str is None else _hx_str) + "]")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.elementNodes = None


class AstIfChainNode(AstNode):
    _hx_class_name = "AstIfChainNode"
    __slots__ = ("cases", "elseCase")
    _hx_fields = ["cases", "elseCase"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,cases,elseCase = None):
        # src/AstNode.hx:482
        self.elseCase = None
        # src/AstNode.hx:481
        self.cases = None
        # src/AstNode.hx:484
        super().__init__()
        # src/AstNode.hx:485
        self.cases = list(cases)
        # src/AstNode.hx:486
        self.elseCase = elseCase

    def getResultType(self,context):
        # src/AstNode.hx:490
        _hx_type = None
        # src/AstNode.hx:492
        allCases = list(self.cases)
        # src/AstNode.hx:493
        if (self.elseCase is not None):
            # src/AstNode.hx:494
            x = _hx_AnonObject({'condition': None, 'result': self.elseCase})
            allCases.append(x)
        # src/AstNode.hx:496
        if (len(allCases) > 0):
            # src/AstNode.hx:497
            _hx_type = (allCases[0] if 0 < len(allCases) else None).result.getResultType(context)
            # src/AstNode.hx:498
            # src/AstNode.hx:498
            _g = 0
            while (_g < len(allCases)):
                ifCase = (allCases[_g] if _g >= 0 and _g < len(allCases) else None)
                _g = (_g + 1)
                # src/AstNode.hx:499
                if (not _hx_type.equals(ifCase.result.getResultType(context))):
                    # src/AstNode.hx:500
                    _hx_type = None
                    # src/AstNode.hx:501
                    break
        # src/AstNode.hx:506
        if (_hx_type is None):
            _hx_type = DataTypeInstance(DataTypes.TYPES.DYNAMIC)
        # src/AstNode.hx:508
        return _hx_type

    def getResult(self,context):
        # src/AstNode.hx:512
        # src/AstNode.hx:512
        _g = 0
        _g1 = self.cases
        while (_g < len(_g1)):
            ifCase = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # src/AstNode.hx:513
            # src/AstNode.hx:513
            _g2 = ifCase.condition.getResult(context)
            if (_g2.index == 4):
                # src/AstNode.hx:514
                _hx_bool = _g2.params[0]
                # src/AstNode.hx:515
                if _hx_bool:
                    # src/AstNode.hx:516
                    context.addScope()
                    # src/AstNode.hx:517
                    result = ifCase.result.getResult(context)
                    # src/AstNode.hx:518
                    context.pop()
                    # src/AstNode.hx:519
                    return result
            else:
                raise haxe_Exception.thrown("Bool Expected")
        # src/AstNode.hx:526
        if (self.elseCase is not None):
            # src/AstNode.hx:527
            context.addScope()
            # src/AstNode.hx:528
            result = self.elseCase.getResult(context)
            # src/AstNode.hx:529
            context.pop()
            # src/AstNode.hx:530
            return result
        # src/AstNode.hx:533
        return Data.Nothing

    def toString(self):
        # src/AstNode.hx:537
        _hx_str = ""
        # src/AstNode.hx:539
        # src/AstNode.hx:539
        _g = 0
        _g1 = len(self.cases)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/AstNode.hx:540
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull(("IF: (" if ((i == 0)) else "ELIF: (")))
            # src/AstNode.hx:541
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull((((HxOverrides.stringOrNull((self.cases[i] if i >= 0 and i < len(self.cases) else None).condition.toString()) + "): ") + HxOverrides.stringOrNull((self.cases[i] if i >= 0 and i < len(self.cases) else None).result.toString())))))
            # src/AstNode.hx:542
            if (i < ((len(self.cases) - 1))):
                _hx_str = (("null" if _hx_str is None else _hx_str) + ", ")
        # src/AstNode.hx:546
        if (self.elseCase is not None):
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull((((", ELSE: (" + HxOverrides.stringOrNull(self.elseCase.toString())) + ")"))))
        # src/AstNode.hx:549
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.cases = None
        _hx_o.elseCase = None


class Class: pass


class Context:
    _hx_class_name = "Context"
    __slots__ = ("root", "current")
    _hx_fields = ["root", "current"]
    _hx_methods = ["addScope", "pop", "getVariable", "setVariable", "createVariable", "variableCanHave"]

    def __init__(self):
        # src/Context.hx:15
        self.current = None
        # src/Context.hx:18
        self.root = _hx_AnonObject({'variables': haxe_ds_StringMap()})
        # src/Context.hx:19
        self.current = self.root

    def addScope(self):
        # src/Context.hx:23
        newScope = _hx_AnonObject({'variables': haxe_ds_StringMap(), 'parent': self.current})
        # src/Context.hx:28
        def _hx_local_1():
            # src/Context.hx:28
            def _hx_local_0():
                # src/Context.hx:28
                self.current = newScope
                return self.current
            return _hx_local_0()
        return _hx_local_1()

    def pop(self):
        # src/Context.hx:32
        if (Reflect.field(self.current,"parent") is not None):
            self.current = Reflect.field(self.current,"parent")
        # src/Context.hx:35
        return self.current

    def getVariable(self,varName):
        # src/Context.hx:39
        variable = None
        # src/Context.hx:40
        scope = None
        # src/Context.hx:41
        while True:
            # src/Context.hx:42
            scope = (self.current if ((scope is None)) else Reflect.field(scope,"parent"))
            # src/Context.hx:43
            if (varName in scope.variables.h):
                variable = scope.variables.h.get(varName,None)
            # src/Context.hx:41
            if (not (((variable is None) and ((Reflect.field(scope,"parent") is not None))))):
                break
        # src/Context.hx:47
        return variable

    def setVariable(self,variable,value):
        # src/Context.hx:51
        if (not self.variableCanHave(variable,value)):
            return False
        # src/Context.hx:54
        variable.value = value
        # src/Context.hx:55
        return True

    def createVariable(self,varName,_hx_type,init = None):
        # src/Context.hx:59
        variable = _hx_AnonObject({'typeInst': _hx_type, 'value': Data.Nothing})
        # src/Context.hx:64
        if ((init is not None) and (not self.setVariable(variable,init))):
            raise haxe_Exception.thrown(((("Could not initialize variable " + ("null" if varName is None else varName)) + " with ") + Std.string(init)))
        # src/Context.hx:68
        self.current.variables.h[varName] = variable

    def variableCanHave(self,variable,value):
        # src/Context.hx:72
        if (variable.typeInst.type == DataTypes.TYPES.DYNAMIC):
            return True
        # src/Context.hx:75
        tmp = value.index
        # src/Context.hx:77
        if (tmp == 1):
            return True
        elif (tmp == 2):
            # src/Context.hx:78
            _hx_float = value.params[0]
            # src/Context.hx:79
            return (variable.typeInst.type == DataTypes.TYPES.REAL)
        elif (tmp == 3):
            # src/Context.hx:80
            string = value.params[0]
            # src/Context.hx:81
            return (variable.typeInst.type == DataTypes.TYPES.STRING)
        elif (tmp == 4):
            # src/Context.hx:82
            _hx_bool = value.params[0]
            # src/Context.hx:83
            return (variable.typeInst.type == DataTypes.TYPES.BOOL)
        elif (tmp == 5):
            # src/Context.hx:84
            _hx_type = value.params[0]
            _hx_list = value.params[1]
            # src/Context.hx:85
            if (variable.typeInst.type == DataTypes.TYPES.ARRAY_LIST):
                # src/Context.hx:86
                _this = variable.typeInst
                return ((None if ((len(_this.dependencies) < 1)) else (_this.dependencies[0] if 0 < len(_this.dependencies) else None))).equals(_hx_type)
            # src/Context.hx:88
            return False
        else:
            return False

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.root = None
        _hx_o.current = None


class DataTypeInstance:
    _hx_class_name = "DataTypeInstance"
    __slots__ = ("type", "dependencies")
    _hx_fields = ["type", "dependencies"]
    _hx_methods = ["getDependency", "equals"]
    _hx_statics = ["fromData"]

    def __init__(self,_hx_type,dependencies = None):
        # src/Data.hx:8
        self.dependencies = []
        # src/Data.hx:28
        self.type = _hx_type
        # src/Data.hx:29
        if (dependencies is not None):
            self.dependencies = dependencies
        # src/Data.hx:32
        if (_hx_type.typeDependencies != len(self.dependencies)):
            raise haxe_Exception.thrown("Incorrect number of dependencies")

    def getDependency(self,i = None):
        # src/Data.hx:36
        if (i is None):
            i = 0
        # src/Data.hx:37
        if (len(self.dependencies) < ((i + 1))):
            return None
        # src/Data.hx:40
        return (self.dependencies[i] if i >= 0 and i < len(self.dependencies) else None)

    def equals(self,d):
        # src/Data.hx:44
        if (((d is None) or ((self.type != d.type))) or ((len(self.dependencies) != len(d.dependencies)))):
            return False
        # src/Data.hx:47
        # src/Data.hx:47
        _g = 0
        _g1 = len(self.dependencies)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/Data.hx:48
            if (not (self.dependencies[i] if i >= 0 and i < len(self.dependencies) else None).equals((d.dependencies[i] if i >= 0 and i < len(d.dependencies) else None))):
                return False
        # src/Data.hx:52
        return True

    @staticmethod
    def fromData(data):
        # src/Data.hx:11
        tmp = data.index
        # src/Data.hx:12
        if (tmp == 0):
            # src/Data.hx:12
            dataType = data.params[0]
            # src/Data.hx:13
            return dataType
        elif (tmp == 1):
            return None
        elif (tmp == 2):
            # src/Data.hx:16
            _hx_float = data.params[0]
            # src/Data.hx:17
            return DataTypeInstance(DataTypes.TYPES.REAL)
        elif (tmp == 3):
            # src/Data.hx:18
            string = data.params[0]
            # src/Data.hx:19
            return DataTypeInstance(DataTypes.TYPES.STRING)
        elif (tmp == 4):
            # src/Data.hx:20
            _hx_bool = data.params[0]
            # src/Data.hx:21
            return DataTypeInstance(DataTypes.TYPES.BOOL)
        elif (tmp == 5):
            # src/Data.hx:22
            _hx_type = data.params[0]
            _hx_list = data.params[1]
            # src/Data.hx:23
            return DataTypeInstance(DataTypes.TYPES.ARRAY_LIST,[_hx_type])
        else:
            pass

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.type = None
        _hx_o.dependencies = None


class DataTypes:
    _hx_class_name = "DataTypes"
    __slots__ = ()
    _hx_statics = ["TYPES", "TYPES_ARRAY"]

class Data(Enum):
    __slots__ = ()
    _hx_class_name = "Data"
    _hx_constructs = ["DType", "Nothing", "Real", "Str", "Boolean", "ArrayList"]

    @staticmethod
    def DType(dataType):
        return Data("DType", 0, (dataType,))

    @staticmethod
    def Real(float):
        return Data("Real", 2, (float,))

    @staticmethod
    def Str(string):
        return Data("Str", 3, (string,))

    @staticmethod
    def Boolean(bool):
        return Data("Boolean", 4, (bool,))

    @staticmethod
    def ArrayList(type,list):
        return Data("ArrayList", 5, (type,list))
Data.Nothing = Data("Nothing", 1, ())


class EReg:
    _hx_class_name = "EReg"
    __slots__ = ("pattern", "matchObj", "_hx_global")
    _hx_fields = ["pattern", "matchObj", "global"]
    _hx_methods = ["matchSub", "split", "replace", "map"]

    def __init__(self,r,opt):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:31
        self.matchObj = None
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:35
        self._hx_global = False
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:36
        options = 0
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:37
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:37
        _g = 0
        _g1 = len(opt)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:38
            c = (-1 if ((i >= len(opt))) else ord(opt[i]))
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:39
            if (c == 109):
                options = (options | python_lib_Re.M)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:41
            if (c == 105):
                options = (options | python_lib_Re.I)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:43
            if (c == 115):
                options = (options | python_lib_Re.S)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:45
            if (c == 117):
                options = (options | python_lib_Re.U)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:47
            if (c == 103):
                self._hx_global = True
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:50
        self.pattern = python_lib_Re.compile(r,options)

    def matchSub(self,s,pos,_hx_len = None):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:74
        if (_hx_len is None):
            _hx_len = -1
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:75
        if (_hx_len != -1):
            self.matchObj = self.pattern.search(s,pos,(pos + _hx_len))
        else:
            self.matchObj = self.pattern.search(s,pos)
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:81
        return (self.matchObj is not None)

    def split(self,s):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:85
        if self._hx_global:
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:86
            ret = []
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:87
            lastEnd = 0
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:89
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:89
            x = python_HaxeIterator(python_lib_Re.finditer(self.pattern,s))
            while x.hasNext():
                x1 = x.next()
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:90
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:90
                x2 = HxString.substring(s,lastEnd,x1.start())
                ret.append(x2)
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:91
                lastEnd = x1.end()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:93
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:93
            x = HxString.substr(s,lastEnd,None)
            ret.append(x)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:94
            return ret
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:96
            self.matchObj = python_lib_Re.search(self.pattern,s)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:97
            if (self.matchObj is None):
                return [s]
            else:
                return [HxString.substring(s,0,self.matchObj.start()), HxString.substr(s,self.matchObj.end(),None)]

    def replace(self,s,by):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:106
        _this = by.split("$$")
        by = "_hx_#repl#__".join([python_Boot.toString1(x1,'') for x1 in _this])
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:107
        def _hx_local_0(x):
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:108
            res = by
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:109
            g = x.groups()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:110
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:110
            _g = 0
            _g1 = len(g)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:111
                gs = g[i]
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:112
                if (gs is None):
                    continue
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:114
                delimiter = ("$" + HxOverrides.stringOrNull(str((i + 1))))
                _this = (list(res) if ((delimiter == "")) else res.split(delimiter))
                res = gs.join([python_Boot.toString1(x1,'') for x1 in _this])
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:116
            _this = res.split("_hx_#repl#__")
            res = "$".join([python_Boot.toString1(x1,'') for x1 in _this])
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:117
            return res
        replace = _hx_local_0
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:119
        return python_lib_Re.sub(self.pattern,replace,s,(0 if (self._hx_global) else 1))

    def map(self,s,f):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:123
        buf_b = python_lib_io_StringIO()
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:124
        pos = 0
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:125
        right = s
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:127
        cur = self
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:128
        while (pos < len(s)):
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:129
            if (self.matchObj is None):
                self.matchObj = python_lib_Re.search(self.pattern,s)
            else:
                self.matchObj = self.matchObj.re.search(s,pos)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:135
            if (self.matchObj is None):
                break
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:138
            pos1 = self.matchObj.end()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:140
            curPos_pos = cur.matchObj.start()
            curPos_len = (cur.matchObj.end() - cur.matchObj.start())
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:142
            buf_b.write(Std.string(HxString.substr(HxString.substr(cur.matchObj.string,0,cur.matchObj.start()),pos,None)))
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:143
            buf_b.write(Std.string(f(cur)))
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:145
            right = HxString.substr(cur.matchObj.string,cur.matchObj.end(),None)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:147
            if (not self._hx_global):
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:148
                buf_b.write(Std.string(right))
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:149
                return buf_b.getvalue()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:152
            if (curPos_len == 0):
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:153
                buf_b.write(Std.string(("" if (((pos1 < 0) or ((pos1 >= len(s))))) else s[pos1])))
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:154
                right = HxString.substr(right,1,None)
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:155
                pos = (pos1 + 1)
            else:
                pos = pos1
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:160
        buf_b.write(Std.string(right))
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:161
        return buf_b.getvalue()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.matchObj = None
        _hx_o._hx_global = None


class Main:
    _hx_class_name = "Main"
    __slots__ = ()
    _hx_statics = ["main", "dataText"]

    @staticmethod
    def main():
        # src/Main.hx:3
        code = sys_io_File.getContent("res/code.txt")
        tokens = []
        idleUntil = 0
        _g = 0
        _g1 = len(code)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            isLast = (i == ((len(code) - 1)))
            if (i < idleUntil):
                continue
            char = ("" if (((i < 0) or ((i >= len(code))))) else code[i])
            if (char == " "):
                continue
            tmp = None
            searchIn = Tokenizer.DIGITS
            tmp1 = None
            if ((searchIn is None) or ((char is None))):
                tmp1 = False
            elif (char == ""):
                tmp1 = True
            else:
                startIndex = None
                tmp1 = (((searchIn.find(char) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,char,startIndex))) > -1)
            if (not tmp1):
                if ((char == ".") and (not isLast)):
                    searchIn1 = Tokenizer.DIGITS
                    index = (i + 1)
                    searchFor = ("" if (((index < 0) or ((index >= len(code))))) else code[index])
                    if ((searchIn1 is None) or ((searchFor is None))):
                        tmp = False
                    elif (searchFor == ""):
                        tmp = True
                    else:
                        startIndex1 = None
                        tmp = (((searchIn1.find(searchFor) if ((startIndex1 is None)) else HxString.indexOfImpl(searchIn1,searchFor,startIndex1))) > -1)
                else:
                    tmp = False
            else:
                tmp = True
            if tmp:
                numb = char
                periods = (1 if ((char == ".")) else 0)
                _g2 = (i + 1)
                _g3 = len(code)
                while (_g2 < _g3):
                    j = _g2
                    _g2 = (_g2 + 1)
                    char1 = ("" if (((j < 0) or ((j >= len(code))))) else code[j])
                    searchIn2 = Tokenizer.DIGITS
                    tmp2 = None
                    if ((searchIn2 is None) or ((char1 is None))):
                        tmp2 = False
                    elif (char1 == ""):
                        tmp2 = True
                    else:
                        startIndex2 = None
                        tmp2 = (((searchIn2.find(char1) if ((startIndex2 is None)) else HxString.indexOfImpl(searchIn2,char1,startIndex2))) > -1)
                    if ((not tmp2) and ((char1 != "."))):
                        idleUntil = j
                        break
                    if (char1 == "."):
                        periods = (periods + 1)
                        if (periods > 1):
                            idleUntil = j
                            break
                    numb = (("null" if numb is None else numb) + ("null" if char1 is None else char1))
                    if (j == ((len(code) - 1))):
                        idleUntil = (j + 1)
                result = Std.parseFloat(numb)
                real = (None if (python_lib_Math.isnan(result)) else result)
                if (real is None):
                    raise haxe_Exception.thrown("Number is unparseable")
                tokens.append(_hx_AnonObject({'type': TokenType.Real(real), 'startPos': i, 'endPos': idleUntil}))
                continue
            searchIn3 = Tokenizer.LETTERS
            tmp3 = None
            if ((searchIn3 is None) or ((char is None))):
                tmp3 = False
            elif (char == ""):
                tmp3 = True
            else:
                startIndex3 = None
                tmp3 = (((searchIn3.find(char) if ((startIndex3 is None)) else HxString.indexOfImpl(searchIn3,char,startIndex3))) > -1)
            if tmp3:
                word = char
                _g4 = (i + 1)
                _g5 = len(code)
                while (_g4 < _g5):
                    j1 = _g4
                    _g4 = (_g4 + 1)
                    char2 = ("" if (((j1 < 0) or ((j1 >= len(code))))) else code[j1])
                    searchIn4 = Tokenizer.LETTERS_DIGITS
                    tmp4 = None
                    if ((searchIn4 is None) or ((char2 is None))):
                        tmp4 = False
                    elif (char2 == ""):
                        tmp4 = True
                    else:
                        startIndex4 = None
                        tmp4 = (((searchIn4.find(char2) if ((startIndex4 is None)) else HxString.indexOfImpl(searchIn4,char2,startIndex4))) > -1)
                    if tmp4:
                        word = (("null" if word is None else word) + ("null" if char2 is None else char2))
                    else:
                        idleUntil = j1
                        break
                    if (j1 == ((len(code) - 1))):
                        idleUntil = (j1 + 1)
                dataTypeFound = False
                _g6 = 0
                _g7 = DataTypes.TYPES_ARRAY
                while (_g6 < len(_g7)):
                    dataType = (_g7[_g6] if _g6 >= 0 and _g6 < len(_g7) else None)
                    _g6 = (_g6 + 1)
                    if (dataType.identifier == word):
                        tokens.append(_hx_AnonObject({'type': TokenType.DataType(dataType), 'startPos': i, 'endPos': idleUntil}))
                        dataTypeFound = True
                        break
                if (not dataTypeFound):
                    keywordFound = False
                    _g8 = 0
                    _g9 = Tokenizer.KEYWORDS
                    while (_g8 < len(_g9)):
                        keyword = (_g9[_g8] if _g8 >= 0 and _g8 < len(_g9) else None)
                        _g8 = (_g8 + 1)
                        if (keyword.identifier == word):
                            x = _hx_AnonObject({'type': keyword.tType, 'startPos': i, 'endPos': idleUntil})
                            tokens.append(x)
                            keywordFound = True
                            break
                    if (not keywordFound):
                        tokens.append(_hx_AnonObject({'type': TokenType.Identifier(word), 'startPos': i, 'endPos': idleUntil}))
            char3 = char
            if ((char3 == "'") or ((char3 == "\""))):
                _hx_str = ""
                _g10 = (i + 1)
                _g11 = len(code)
                while (_g10 < _g11):
                    j2 = _g10
                    _g10 = (_g10 + 1)
                    char4 = ("" if (((j2 < 0) or ((j2 >= len(code))))) else code[j2])
                    if ((char4 == "\"") or ((char4 == "'"))):
                        idleUntil = (j2 + 1)
                        break
                    _hx_str = (("null" if _hx_str is None else _hx_str) + ("null" if char4 is None else char4))
                    if (j2 == ((len(code) - 1))):
                        raise haxe_Exception.thrown("\" or ' Expected")
                tokens.append(_hx_AnonObject({'type': TokenType.Text(_hx_str), 'startPos': i, 'endPos': (idleUntil - 1)}))
            elif (char3 == "#"):
                _g12 = (i + 1)
                _g13 = len(code)
                while (_g12 < _g13):
                    j3 = _g12
                    _g12 = (_g12 + 1)
                    if (((("" if (((j3 < 0) or ((j3 >= len(code))))) else code[j3])) == "\n") or ((j3 == ((len(code) - 1))))):
                        idleUntil = (j3 + 1)
                        break
            elif (char3 == "%"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mod, 'startPos': i}))
            elif (char3 == "&"):
                tmp5 = None
                if (not isLast):
                    index1 = (i + 1)
                    tmp5 = ((("" if (((index1 < 0) or ((index1 >= len(code))))) else code[index1])) == "&")
                else:
                    tmp5 = False
                if tmp5:
                    tokens.append(_hx_AnonObject({'type': TokenType.And, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
            elif (char3 == "("):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenParen, 'startPos': i}))
            elif (char3 == ")"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseParen, 'startPos': i}))
            elif (char3 == "*"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mult, 'startPos': i}))
            elif (char3 == "+"):
                tokens.append(_hx_AnonObject({'type': TokenType.Add, 'startPos': i}))
            elif (char3 == ","):
                tokens.append(_hx_AnonObject({'type': TokenType.Comma, 'startPos': i}))
            elif (char3 == "-"):
                tokens.append(_hx_AnonObject({'type': TokenType.Sub, 'startPos': i}))
            elif (char3 == "/"):
                tokens.append(_hx_AnonObject({'type': TokenType.Div, 'startPos': i}))
            elif (char3 == ";"):
                tokens.append(_hx_AnonObject({'type': TokenType.NewLine, 'startPos': i}))
            elif (char3 == "<"):
                tmp6 = None
                if (not isLast):
                    index2 = (i + 1)
                    tmp6 = ((("" if (((index2 < 0) or ((index2 >= len(code))))) else code[index2])) == "=")
                else:
                    tmp6 = False
                if tmp6:
                    tokens.append(_hx_AnonObject({'type': TokenType.LesserEquals, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Lesser, 'startPos': i}))
            elif (char3 == "="):
                tmp7 = None
                if (not isLast):
                    index3 = (i + 1)
                    tmp7 = ((("" if (((index3 < 0) or ((index3 >= len(code))))) else code[index3])) == "=")
                else:
                    tmp7 = False
                if tmp7:
                    tokens.append(_hx_AnonObject({'type': TokenType.Equals, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Assign, 'startPos': i}))
            elif (char3 == ">"):
                tmp8 = None
                if (not isLast):
                    index4 = (i + 1)
                    tmp8 = ((("" if (((index4 < 0) or ((index4 >= len(code))))) else code[index4])) == "=")
                else:
                    tmp8 = False
                if tmp8:
                    tokens.append(_hx_AnonObject({'type': TokenType.GreaterEquals, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Greater, 'startPos': i}))
            elif (char3 == "["):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenBracket, 'startPos': i}))
            elif (char3 == "]"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseBracket, 'startPos': i}))
            elif (char3 == "^"):
                tokens.append(_hx_AnonObject({'type': TokenType.Pow, 'startPos': i}))
            elif (char3 == "{"):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenCurly, 'startPos': i}))
            elif (char3 == "|"):
                tmp9 = None
                if (not isLast):
                    index5 = (i + 1)
                    tmp9 = ((("" if (((index5 < 0) or ((index5 >= len(code))))) else code[index5])) == "|")
                else:
                    tmp9 = False
                if tmp9:
                    tokens.append(_hx_AnonObject({'type': TokenType.Or, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
            elif (char3 == "}"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseCurly, 'startPos': i}))
            else:
                pass
        tokens1 = tokens
        # src/Main.hx:4
        tokenString = "\n----------------"
        # src/Main.hx:5
        # src/Main.hx:5
        _g = 0
        while (_g < len(tokens1)):
            token = (tokens1[_g] if _g >= 0 and _g < len(tokens1) else None)
            _g = (_g + 1)
            # src/Main.hx:6
            tokenType = token.type
            tokenString1 = None
            tokenString2 = tokenType.index
            if (tokenString2 == 0):
                name = tokenType.params[0]
                tokenString1 = ("IDENTIFIER:" + ("null" if name is None else name))
            elif (tokenString2 == 1):
                _hx_type = tokenType.params[0]
                tokenString1 = ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
            elif (tokenString2 == 2):
                number = tokenType.params[0]
                tokenString1 = ("REAL:" + Std.string(number))
            elif (tokenString2 == 3):
                string = tokenType.params[0]
                tokenString1 = ("TEXT:" + ("null" if string is None else string))
            elif (tokenString2 == 4):
                _hx_bool = tokenType.params[0]
                tokenString1 = ("BOOL:" + Std.string(_hx_bool))
            elif (tokenString2 == 5):
                tokenString1 = "="
            elif (tokenString2 == 6):
                tokenString1 = "^"
            elif (tokenString2 == 7):
                tokenString1 = "+"
            elif (tokenString2 == 8):
                tokenString1 = "-"
            elif (tokenString2 == 9):
                tokenString1 = "*"
            elif (tokenString2 == 10):
                tokenString1 = "/"
            elif (tokenString2 == 11):
                tokenString1 = "%"
            elif (tokenString2 == 12):
                tokenString1 = "=="
            elif (tokenString2 == 13):
                tokenString1 = ">"
            elif (tokenString2 == 14):
                tokenString1 = "<"
            elif (tokenString2 == 15):
                tokenString1 = ">="
            elif (tokenString2 == 16):
                tokenString1 = "<="
            elif (tokenString2 == 17):
                tokenString1 = "AND"
            elif (tokenString2 == 18):
                tokenString1 = "OR"
            elif (tokenString2 == 19):
                tokenString1 = "("
            elif (tokenString2 == 20):
                tokenString1 = ")"
            elif (tokenString2 == 23):
                tokenString1 = "["
            elif (tokenString2 == 24):
                tokenString1 = "]"
            elif (tokenString2 == 25):
                tokenString1 = ","
            elif (tokenString2 == 26):
                tokenString1 = "IF"
            elif (tokenString2 == 27):
                tokenString1 = "ELIF"
            elif (tokenString2 == 28):
                tokenString1 = "ELSE"
            elif (tokenString2 == 29):
                tokenString1 = ";"
            else:
                tokenString1 = "Default Token"
            tokenString = (("null" if tokenString is None else tokenString) + HxOverrides.stringOrNull((("\n" + ("null" if tokenString1 is None else tokenString1)))))
        # src/Main.hx:7
        tokenString = (("null" if tokenString is None else tokenString) + "\n----------------")
        # src/Main.hx:9
        print(str(tokenString))
        # src/Main.hx:11
        parser = Parser(tokens1)
        # src/Main.hx:13
        tree = parser.parse()
        # src/Main.hx:14
        print(str(tree.toString()))
        # src/Main.hx:16
        context = Context()
        # src/Main.hx:17
        r = tree.getResult(context)
        # src/Main.hx:18
        if (r.index == 5):
            # src/Main.hx:19
            _hx_type = r.params[0]
            _hx_list = r.params[1]
            # src/Main.hx:20
            _hx_str = "\n----------------"
            # src/Main.hx:21
            # src/Main.hx:21
            _g = 0
            while (_g < len(_hx_list)):
                item = (_hx_list[_g] if _g >= 0 and _g < len(_hx_list) else None)
                _g = (_g + 1)
                # src/Main.hx:22
                str1 = None
                str2 = item.index
                if (str2 == 0):
                    dataType = item.params[0]
                    str1 = dataType.type.identifier
                elif (str2 == 1):
                    str1 = "null"
                elif (str2 == 2):
                    _hx_float = item.params[0]
                    str1 = Std.string(_hx_float)
                elif (str2 == 3):
                    string = item.params[0]
                    str1 = (("\"" + ("null" if string is None else string)) + "\"")
                elif (str2 == 4):
                    _hx_bool = item.params[0]
                    str1 = Std.string(_hx_bool)
                elif (str2 == 5):
                    _hx_type = item.params[0]
                    list1 = item.params[1]
                    lString = "["
                    _g1 = 0
                    _g2 = len(list1)
                    while (_g1 < _g2):
                        i = _g1
                        _g1 = (_g1 + 1)
                        data = (list1[i] if i >= 0 and i < len(list1) else None)
                        lString1 = None
                        lString2 = data.index
                        if (lString2 == 0):
                            dataType1 = data.params[0]
                            lString1 = dataType1.type.identifier
                        elif (lString2 == 1):
                            lString1 = "null"
                        elif (lString2 == 2):
                            float1 = data.params[0]
                            lString1 = Std.string(float1)
                        elif (lString2 == 3):
                            string1 = data.params[0]
                            lString1 = (("\"" + ("null" if string1 is None else string1)) + "\"")
                        elif (lString2 == 4):
                            bool1 = data.params[0]
                            lString1 = Std.string(bool1)
                        elif (lString2 == 5):
                            type1 = data.params[0]
                            list2 = data.params[1]
                            lString3 = "["
                            _g3 = 0
                            _g4 = len(list2)
                            while (_g3 < _g4):
                                i1 = _g3
                                _g3 = (_g3 + 1)
                                lString3 = (("null" if lString3 is None else lString3) + HxOverrides.stringOrNull(Main.dataText((list2[i1] if i1 >= 0 and i1 < len(list2) else None))))
                                if (i1 < ((len(list2) - 1))):
                                    lString3 = (("null" if lString3 is None else lString3) + ", ")
                            lString3 = (("null" if lString3 is None else lString3) + "]")
                            lString1 = ((("List<" + HxOverrides.stringOrNull(type1.type.identifier)) + "> ") + ("null" if lString3 is None else lString3))
                        else:
                            pass
                        lString = (("null" if lString is None else lString) + ("null" if lString1 is None else lString1))
                        if (i < ((len(list1) - 1))):
                            lString = (("null" if lString is None else lString) + ", ")
                    lString = (("null" if lString is None else lString) + "]")
                    str1 = ((("List<" + HxOverrides.stringOrNull(_hx_type.type.identifier)) + "> ") + ("null" if lString is None else lString))
                else:
                    pass
                _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull((("\n" + ("null" if str1 is None else str1)))))
            # src/Main.hx:23
            _hx_str = (("null" if _hx_str is None else _hx_str) + "\n----------------")
            # src/Main.hx:24
            print(str(_hx_str))

    @staticmethod
    def dataText(data):
        # src/Main.hx:30
        tmp = data.index
        # src/Main.hx:31
        if (tmp == 0):
            # src/Main.hx:31
            dataType = data.params[0]
            # src/Main.hx:32
            return dataType.type.identifier
        elif (tmp == 1):
            return "null"
        elif (tmp == 2):
            # src/Main.hx:35
            _hx_float = data.params[0]
            # src/Main.hx:36
            return Std.string(_hx_float)
        elif (tmp == 3):
            # src/Main.hx:37
            string = data.params[0]
            # src/Main.hx:38
            return (("\"" + ("null" if string is None else string)) + "\"")
        elif (tmp == 4):
            # src/Main.hx:39
            _hx_bool = data.params[0]
            # src/Main.hx:40
            return Std.string(_hx_bool)
        elif (tmp == 5):
            # src/Main.hx:41
            _hx_type = data.params[0]
            _hx_list = data.params[1]
            # src/Main.hx:42
            lString = "["
            # src/Main.hx:43
            # src/Main.hx:43
            _g = 0
            _g1 = len(_hx_list)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # src/Main.hx:44
                lString = (("null" if lString is None else lString) + HxOverrides.stringOrNull(Main.dataText((_hx_list[i] if i >= 0 and i < len(_hx_list) else None))))
                # src/Main.hx:45
                if (i < ((len(_hx_list) - 1))):
                    lString = (("null" if lString is None else lString) + ", ")
            # src/Main.hx:48
            lString = (("null" if lString is None else lString) + "]")
            # src/Main.hx:49
            return ((("List<" + HxOverrides.stringOrNull(_hx_type.type.identifier)) + "> ") + ("null" if lString is None else lString))
        else:
            pass


class Parser:
    _hx_class_name = "Parser"
    __slots__ = ("tokens", "tokenIndex", "currentToken", "peekToken", "errors")
    _hx_fields = ["tokens", "tokenIndex", "currentToken", "peekToken", "errors"]
    _hx_methods = ["nextToken", "peek", "parse", "factor", "accesssor", "power", "term", "arithmatic", "compare", "expression", "statement", "binOperation", "listExpr", "ifExpr", "curlyStatement"]

    def __init__(self,tokens):
        # src/Parser.hx:14
        self.errors = None
        # src/Parser.hx:12
        self.peekToken = None
        # src/Parser.hx:11
        self.currentToken = None
        # src/Parser.hx:10
        self.tokenIndex = None
        # src/Parser.hx:17
        self.tokens = tokens

    def nextToken(self,i = None):
        # src/Parser.hx:20
        if (i is None):
            i = 1
        # src/Parser.hx:21
        # src/Parser.hx:21
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.tokenIndex
        _hx_local_0.tokenIndex = (_hx_local_1 + i)
        _hx_local_0.tokenIndex
        # src/Parser.hx:22
        self.currentToken = (python_internal_ArrayImpl._get(self.tokens, self.tokenIndex) if ((self.tokenIndex < len(self.tokens))) else None)
        # src/Parser.hx:23
        return (self.currentToken is not None)

    def peek(self,i = None):
        # src/Parser.hx:26
        if (i is None):
            i = 1
        # src/Parser.hx:27
        peekIndex = (self.tokenIndex + i)
        # src/Parser.hx:28
        def _hx_local_1():
            # src/Parser.hx:28
            def _hx_local_0():
                # src/Parser.hx:28
                self.peekToken = ((self.tokens[peekIndex] if peekIndex >= 0 and peekIndex < len(self.tokens) else None) if ((peekIndex < len(self.tokens))) else None)
                return self.peekToken
            return _hx_local_0()
        return _hx_local_1()

    def parse(self):
        # src/Parser.hx:32
        self.errors = []
        # src/Parser.hx:33
        self.tokenIndex = -1
        # src/Parser.hx:34
        self.currentToken = None
        # src/Parser.hx:35
        self.peekToken = None
        # src/Parser.hx:36
        self.nextToken()
        # src/Parser.hx:37
        return self.statement()

    def factor(self):
        # src/Parser.hx:41
        token = self.currentToken
        # src/Parser.hx:42
        if (token is None):
            return None
        # src/Parser.hx:45
        _g = token.type
        tmp = _g.index
        # src/Parser.hx:58
        if (tmp == 0):
            # src/Parser.hx:58
            name = _g.params[0]
            # src/Parser.hx:59
            self.nextToken()
            # src/Parser.hx:60
            return AstVarAccessNode(name)
        elif (tmp == 1):
            # src/Parser.hx:46
            _hx_type = _g.params[0]
            # src/Parser.hx:47
            dependencies = []
            # src/Parser.hx:48
            if (self.nextToken() and ((self.currentToken.type == TokenType.Lesser))):
                # src/Parser.hx:49
                self.nextToken()
                # src/Parser.hx:50
                dependentType = self.factor()
                # src/Parser.hx:51
                dependencies.append(dependentType)
                # src/Parser.hx:52
                if ((self.currentToken is not None) and ((self.currentToken.type == TokenType.Greater))):
                    self.nextToken()
                else:
                    raise haxe_Exception.thrown("> expected")
            # src/Parser.hx:57
            return AstDataTypeNode(_hx_type,dependencies)
        elif (tmp == 2):
            # src/Parser.hx:61
            number = _g.params[0]
            # src/Parser.hx:62
            self.nextToken()
            # src/Parser.hx:63
            return AstNumbNode(number)
        elif (tmp == 3):
            # src/Parser.hx:64
            string = _g.params[0]
            # src/Parser.hx:65
            self.nextToken()
            # src/Parser.hx:66
            return AstStrNode(string)
        elif (tmp == 4):
            # src/Parser.hx:67
            _hx_bool = _g.params[0]
            # src/Parser.hx:68
            self.nextToken()
            # src/Parser.hx:69
            return AstBoolNode(_hx_bool)
        elif ((tmp == 8) or ((tmp == 7))):
            # src/Parser.hx:71
            self.nextToken()
            # src/Parser.hx:72
            fact = self.factor()
            # src/Parser.hx:73
            return AstUnaryOpNode(token.type,fact)
        elif (tmp == 19):
            # src/Parser.hx:75
            self.nextToken()
            # src/Parser.hx:76
            expr = self.expression()
            # src/Parser.hx:77
            if ((self.currentToken is not None) and ((self.currentToken.type == TokenType.CloseParen))):
                # src/Parser.hx:78
                self.nextToken()
                # src/Parser.hx:79
                return expr
            # src/Parser.hx:81
            return None
        elif (tmp == 26):
            return self.ifExpr()
        else:
            return None

    def accesssor(self):
        # src/Parser.hx:90
        left = self.factor()
        # src/Parser.hx:92
        gotAccessor = False
        # src/Parser.hx:93
        while ((self.currentToken is not None) and ((self.currentToken.type == TokenType.OpenBracket))):
            # src/Parser.hx:94
            self.nextToken()
            # src/Parser.hx:95
            index = self.expression()
            # src/Parser.hx:96
            if ((self.currentToken is None) or ((self.currentToken.type != TokenType.CloseBracket))):
                raise haxe_Exception.thrown("] Expected")
            # src/Parser.hx:98
            self.nextToken()
            # src/Parser.hx:99
            left = AstArrayAccessNode(left,index)
            # src/Parser.hx:100
            gotAccessor = True
        # src/Parser.hx:103
        if ((gotAccessor and ((self.currentToken is not None))) and ((self.currentToken.type == TokenType.Assign))):
            # src/Parser.hx:104
            accessNode = left
            # src/Parser.hx:105
            self.nextToken()
            # src/Parser.hx:106
            accessNode.assign = self.expression()
        # src/Parser.hx:109
        return left

    def power(self):
        # src/Parser.hx:113
        return self.binOperation(self.accesssor,[TokenType.Pow])

    def term(self):
        # src/Parser.hx:117
        return self.binOperation(self.power,[TokenType.Mult, TokenType.Div, TokenType.Mod])

    def arithmatic(self):
        # src/Parser.hx:121
        return self.binOperation(self.term,[TokenType.Add, TokenType.Sub])

    def compare(self):
        # src/Parser.hx:125
        return self.binOperation(self.arithmatic,[TokenType.Equals, TokenType.Greater, TokenType.Lesser, TokenType.GreaterEquals, TokenType.LesserEquals])

    def expression(self):
        # src/Parser.hx:129
        token = self.currentToken
        # src/Parser.hx:130
        # src/Parser.hx:130
        _g = token.type
        tmp = _g.index
        # src/Parser.hx:144
        if (tmp == 0):
            # src/Parser.hx:144
            name = _g.params[0]
            # src/Parser.hx:145
            self.peek()
            # src/Parser.hx:146
            if (self.peekToken.type.index == 5):
                # src/Parser.hx:148
                self.nextToken(2)
                # src/Parser.hx:149
                value = self.expression()
                # src/Parser.hx:150
                return AstAssignmentNode(name,None,value)
        elif (tmp == 1):
            # src/Parser.hx:131
            _hx_type = _g.params[0]
            # src/Parser.hx:132
            _hx_type = self.factor()
            # src/Parser.hx:133
            # src/Parser.hx:133
            _g = self.currentToken.type
            if (_g.index == 0):
                # src/Parser.hx:134
                name = _g.params[0]
                # src/Parser.hx:135
                init = None
                # src/Parser.hx:136
                if (self.nextToken() and ((self.currentToken.type == TokenType.Assign))):
                    # src/Parser.hx:137
                    self.nextToken()
                    # src/Parser.hx:138
                    init = self.expression()
                # src/Parser.hx:140
                return AstAssignmentNode(name,_hx_type,init)
        elif (tmp == 23):
            return self.listExpr()
        else:
            pass
        # src/Parser.hx:158
        return self.binOperation(self.compare,[TokenType.And, TokenType.Or])

    def statement(self):
        # src/Parser.hx:162
        statements = [self.expression()]
        # src/Parser.hx:163
        afterCurly = False
        # src/Parser.hx:164
        while True:
            # src/Parser.hx:165
            tmp = None
            if (self.currentToken is not None):
                if (self.currentToken.type != TokenType.NewLine):
                    # src/Parser.hx:168
                    afterCurly = ((self.peek(-1) is not None) and ((self.peekToken.type == TokenType.CloseCurly)))
                    # src/Parser.hx:165
                    tmp = afterCurly
                else:
                    tmp = True
            else:
                tmp = False
            # src/Parser.hx:164
            if (not tmp):
                break
            # src/Parser.hx:172
            if (afterCurly or self.nextToken()):
                # src/Parser.hx:173
                afterCurly = False
                # src/Parser.hx:174
                if (self.currentToken.type == TokenType.CloseCurly):
                    break
                # src/Parser.hx:177
                # src/Parser.hx:177
                x = self.expression()
                statements.append(x)
        # src/Parser.hx:181
        return AstListNode(statements)

    def binOperation(self,func,operators):
        # src/Parser.hx:185
        left = func()
        # src/Parser.hx:187
        while ((self.currentToken is not None) and (self.currentToken.type in operators)):
            # src/Parser.hx:188
            opToken = self.currentToken.type
            # src/Parser.hx:189
            self.nextToken()
            # src/Parser.hx:190
            right = func()
            # src/Parser.hx:191
            left = AstBinOpNode(left,right,opToken)
        # src/Parser.hx:194
        return left

    def listExpr(self):
        # src/Parser.hx:198
        if (self.nextToken() and ((self.currentToken.type == TokenType.CloseBracket))):
            # src/Parser.hx:199
            self.nextToken()
            # src/Parser.hx:200
            return AstListNode([])
        # src/Parser.hx:202
        elements = [self.expression()]
        # src/Parser.hx:204
        while (self.currentToken.type == TokenType.Comma):
            if self.nextToken():
                # src/Parser.hx:206
                x = self.expression()
                elements.append(x)
            else:
                raise haxe_Exception.thrown("] Expected")
        # src/Parser.hx:211
        if ((self.currentToken is None) or ((self.currentToken.type != TokenType.CloseBracket))):
            raise haxe_Exception.thrown(", or ] Expected")
        # src/Parser.hx:214
        self.nextToken()
        # src/Parser.hx:215
        return AstListNode(elements)

    def ifExpr(self):
        # src/Parser.hx:219
        cases = []
        # src/Parser.hx:221
        self.nextToken()
        # src/Parser.hx:222
        condition = self.expression()
        # src/Parser.hx:223
        # src/Parser.hx:223
        x = _hx_AnonObject({'condition': condition, 'result': self.curlyStatement()})
        cases.append(x)
        # src/Parser.hx:225
        if ((((self.currentToken is not None) and ((self.currentToken.type == TokenType.NewLine))) and ((self.peek(1) is not None))) and (((self.peekToken.type == TokenType.Elif) or ((self.peekToken.type == TokenType.Else))))):
            self.nextToken()
        # src/Parser.hx:234
        while ((self.currentToken is not None) and ((self.currentToken.type == TokenType.Elif))):
            # src/Parser.hx:235
            self.nextToken()
            # src/Parser.hx:236
            condition = self.expression()
            # src/Parser.hx:237
            # src/Parser.hx:237
            x = _hx_AnonObject({'condition': condition, 'result': self.curlyStatement()})
            cases.append(x)
            # src/Parser.hx:239
            if ((((self.currentToken is not None) and ((self.currentToken.type == TokenType.NewLine))) and ((self.peek(1) is not None))) and (((self.peekToken.type == TokenType.Elif) or ((self.peekToken.type == TokenType.Else))))):
                self.nextToken()
        # src/Parser.hx:249
        elseCase = None
        # src/Parser.hx:250
        if ((self.currentToken is not None) and ((self.currentToken.type == TokenType.Else))):
            # src/Parser.hx:251
            self.nextToken()
            # src/Parser.hx:252
            elseCase = self.curlyStatement()
        # src/Parser.hx:255
        return AstIfChainNode(cases,elseCase)

    def curlyStatement(self):
        # src/Parser.hx:259
        if (self.currentToken is None):
            raise haxe_Exception.thrown("{ or Expression Expected")
        # src/Parser.hx:262
        caseResult = None
        # src/Parser.hx:263
        if (self.currentToken.type == TokenType.OpenCurly):
            # src/Parser.hx:264
            if (self.nextToken() and ((self.currentToken.type == TokenType.CloseCurly))):
                # src/Parser.hx:265
                self.nextToken()
                # src/Parser.hx:266
                return AstListNode([])
            # src/Parser.hx:269
            caseResult = self.statement()
            # src/Parser.hx:270
            if ((self.currentToken is None) or ((self.currentToken.type != TokenType.CloseCurly))):
                raise haxe_Exception.thrown("} Expected")
            # src/Parser.hx:272
            self.nextToken()
        else:
            caseResult = self.expression()
        # src/Parser.hx:277
        return caseResult

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.tokens = None
        _hx_o.tokenIndex = None
        _hx_o.currentToken = None
        _hx_o.peekToken = None
        _hx_o.errors = None


class Reflect:
    _hx_class_name = "Reflect"
    __slots__ = ()
    _hx_statics = ["field"]

    @staticmethod
    def field(o,field):
        # C:\HaxeToolkit\haxe\std/python/_std/Reflect.hx:43
        return python_Boot.field(o,field)


class Std:
    _hx_class_name = "Std"
    __slots__ = ()
    _hx_statics = ["isOfType", "string", "parseInt", "shortenPossibleNumber", "parseFloat"]

    @staticmethod
    def isOfType(v,t):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:61
        if ((v is None) and ((t is None))):
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:64
        if (t is None):
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:67
        if (t == Dynamic):
            return (v is not None)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:70
        isBool = isinstance(v,bool)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:72
        if ((t == Bool) and isBool):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:75
        if ((((not isBool) and (not (t == Bool))) and (t == Int)) and isinstance(v,int)):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:78
        vIsFloat = isinstance(v,float)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:80
        tmp = None
        tmp1 = None
        if (((not isBool) and vIsFloat) and (t == Int)):
            f = v
            tmp1 = (((f != Math.POSITIVE_INFINITY) and ((f != Math.NEGATIVE_INFINITY))) and (not python_lib_Math.isnan(f)))
        else:
            tmp1 = False
        if tmp1:
            tmp1 = None
            try:
                tmp1 = int(v)
            except BaseException as _g:
                tmp1 = None
            tmp = (v == tmp1)
        else:
            tmp = False
        if ((tmp and ((v <= 2147483647))) and ((v >= -2147483648))):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:84
        if (((not isBool) and (t == Float)) and isinstance(v,(float, int))):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:88
        if (t == str):
            return isinstance(v,str)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:91
        isEnumType = (t == Enum)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:92
        if ((isEnumType and python_lib_Inspect.isclass(v)) and hasattr(v,"_hx_constructs")):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:95
        if isEnumType:
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:98
        isClassType = (t == Class)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:99
        if ((((isClassType and (not isinstance(v,Enum))) and python_lib_Inspect.isclass(v)) and hasattr(v,"_hx_class_name")) and (not hasattr(v,"_hx_constructs"))):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:106
        if isClassType:
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:109
        tmp = None
        try:
            tmp = isinstance(v,t)
        except BaseException as _g:
            tmp = False
        if tmp:
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:113
        if python_lib_Inspect.isclass(t):
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:114
            cls = t
            loop = None
            def _hx_local_1(intf):
                f = (intf._hx_interfaces if (hasattr(intf,"_hx_interfaces")) else [])
                if (f is not None):
                    _g = 0
                    while (_g < len(f)):
                        i = (f[_g] if _g >= 0 and _g < len(f) else None)
                        _g = (_g + 1)
                        if (i == cls):
                            return True
                        else:
                            l = loop(i)
                            if l:
                                return True
                    return False
                else:
                    return False
            loop = _hx_local_1
            currentClass = v.__class__
            result = False
            while (currentClass is not None):
                if loop(currentClass):
                    result = True
                    break
                currentClass = python_Boot.getSuperClass(currentClass)
            return result
        else:
            return False

    @staticmethod
    def string(s):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:122
        return python_Boot.toString1(s,"")

    @staticmethod
    def parseInt(x):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:134
        if (x is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:136
        try:
            return int(x)
        except BaseException as _g:
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:139
            base = 10
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:140
            _hx_len = len(x)
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:141
            foundCount = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:142
            sign = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:143
            firstDigitIndex = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:144
            lastDigitIndex = -1
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:145
            previous = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:147
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:147
            _g = 0
            _g1 = _hx_len
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:148
                c = (-1 if ((i >= len(x))) else ord(x[i]))
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:149
                if (((c > 8) and ((c < 14))) or ((c == 32))):
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:151
                    if (foundCount > 0):
                        return None
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:154
                    continue
                else:
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:149
                    c1 = c
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:157
                    if (c1 == 43):
                        if (foundCount == 0):
                            sign = 1
                        elif (not (((48 <= c) and ((c <= 57))))):
                            if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                break
                    elif (c1 == 45):
                        if (foundCount == 0):
                            sign = -1
                        elif (not (((48 <= c) and ((c <= 57))))):
                            if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                break
                    elif (c1 == 48):
                        if (not (((foundCount == 0) or (((foundCount == 1) and ((sign != 0))))))):
                            if (not (((48 <= c) and ((c <= 57))))):
                                if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                    break
                    elif ((c1 == 120) or ((c1 == 88))):
                        if ((previous == 48) and ((((foundCount == 1) and ((sign == 0))) or (((foundCount == 2) and ((sign != 0))))))):
                            base = 16
                        elif (not (((48 <= c) and ((c <= 57))))):
                            if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                break
                    elif (not (((48 <= c) and ((c <= 57))))):
                        if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                            break
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:167
                if (((foundCount == 0) and ((sign == 0))) or (((foundCount == 1) and ((sign != 0))))):
                    firstDigitIndex = i
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:170
                foundCount = (foundCount + 1)
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:171
                lastDigitIndex = i
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:172
                previous = c
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:174
            if (firstDigitIndex <= lastDigitIndex):
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:175
                digits = HxString.substring(x,firstDigitIndex,(lastDigitIndex + 1))
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:176
                try:
                    return (((-1 if ((sign == -1)) else 1)) * int(digits,base))
                except BaseException as _g:
                    return None
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:182
            return None

    @staticmethod
    def shortenPossibleNumber(x):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:187
        r = ""
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:188
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:188
        _g = 0
        _g1 = len(x)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:189
            c = ("" if (((i < 0) or ((i >= len(x))))) else x[i])
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:190
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:190
            _g2 = HxString.charCodeAt(c,0)
            if (_g2 is None):
                break
            else:
                _g3 = _g2
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:192
                if (((((((((((_g3 == 57) or ((_g3 == 56))) or ((_g3 == 55))) or ((_g3 == 54))) or ((_g3 == 53))) or ((_g3 == 52))) or ((_g3 == 51))) or ((_g3 == 50))) or ((_g3 == 49))) or ((_g3 == 48))) or ((_g3 == 46))):
                    r = (("null" if r is None else r) + ("null" if c is None else c))
                else:
                    break
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:197
        return r

    @staticmethod
    def parseFloat(x):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:201
        try:
            return float(x)
        except BaseException as _g:
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:204
            if (x is not None):
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:205
                r1 = Std.shortenPossibleNumber(x)
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:206
                if (r1 != x):
                    return Std.parseFloat(r1)
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:210
            return Math.NaN


class Float: pass


class Int: pass


class Bool: pass


class Dynamic: pass


class StringBuf:
    _hx_class_name = "StringBuf"
    __slots__ = ("b",)
    _hx_fields = ["b"]
    _hx_methods = ["get_length"]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:31
        self.b = python_lib_io_StringIO()

    def get_length(self):
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:37
        pos = self.b.tell()
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:38
        self.b.seek(0,2)
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:39
        _hx_len = self.b.tell()
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:40
        self.b.seek(pos,0)
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:41
        return _hx_len

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class StringTools:
    _hx_class_name = "StringTools"
    __slots__ = ()
    _hx_statics = ["isSpace", "ltrim", "rtrim", "trim", "replace", "hex"]

    @staticmethod
    def isSpace(s,pos):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:280
        if (((len(s) == 0) or ((pos < 0))) or ((pos >= len(s)))):
            return False
        # C:\HaxeToolkit\haxe\std/StringTools.hx:283
        c = HxString.charCodeAt(s,pos)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:284
        if (not (((c > 8) and ((c < 14))))):
            return (c == 32)
        else:
            return True

    @staticmethod
    def ltrim(s):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:300
        l = len(s)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:301
        r = 0
        # C:\HaxeToolkit\haxe\std/StringTools.hx:302
        while ((r < l) and StringTools.isSpace(s,r)):
            r = (r + 1)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:305
        if (r > 0):
            return HxString.substr(s,r,(l - r))
        else:
            return s

    @staticmethod
    def rtrim(s):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:325
        l = len(s)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:326
        r = 0
        # C:\HaxeToolkit\haxe\std/StringTools.hx:327
        while ((r < l) and StringTools.isSpace(s,((l - r) - 1))):
            r = (r + 1)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:330
        if (r > 0):
            return HxString.substr(s,0,(l - r))
        else:
            return s

    @staticmethod
    def trim(s):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:349
        return StringTools.ltrim(StringTools.rtrim(s))

    @staticmethod
    def replace(s,sub,by):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:424
        _this = (list(s) if ((sub == "")) else s.split(sub))
        return by.join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def hex(n,digits = None):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:440
        s = ""
        # C:\HaxeToolkit\haxe\std/StringTools.hx:441
        hexChars = "0123456789ABCDEF"
        # C:\HaxeToolkit\haxe\std/StringTools.hx:442
        while True:
            # C:\HaxeToolkit\haxe\std/StringTools.hx:443
            index = (n & 15)
            s = (HxOverrides.stringOrNull((("" if (((index < 0) or ((index >= len(hexChars))))) else hexChars[index]))) + ("null" if s is None else s))
            # C:\HaxeToolkit\haxe\std/StringTools.hx:444
            n = HxOverrides.rshift(n, 4)
            # C:\HaxeToolkit\haxe\std/StringTools.hx:442
            if (not ((n > 0))):
                break
        # C:\HaxeToolkit\haxe\std/StringTools.hx:448
        if ((digits is not None) and ((len(s) < digits))):
            # C:\HaxeToolkit\haxe\std/StringTools.hx:449
            diff = (digits - len(s))
            # C:\HaxeToolkit\haxe\std/StringTools.hx:450
            # C:\HaxeToolkit\haxe\std/StringTools.hx:450
            _g = 0
            _g1 = diff
            while (_g < _g1):
                _ = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/StringTools.hx:451
                s = ("0" + ("null" if s is None else s))
        # C:\HaxeToolkit\haxe\std/StringTools.hx:459
        return s


class Sys:
    _hx_class_name = "Sys"
    __slots__ = ()
    _hx_statics = ["systemName"]

    @staticmethod
    def systemName():
        # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:96
        _g = python_lib_Sys.platform
        # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:97
        x = _g
        # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:96
        if x.startswith("linux"):
            return "Linux"
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:96
            _g1 = _g
            _hx_local_0 = len(_g1)
            # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:100
            if (_hx_local_0 == 5):
                if (_g1 == "win32"):
                    return "Windows"
                else:
                    raise haxe_Exception.thrown("not supported platform")
            elif (_hx_local_0 == 6):
                if (_g1 == "cygwin"):
                    return "Windows"
                elif (_g1 == "darwin"):
                    return "Mac"
                else:
                    raise haxe_Exception.thrown("not supported platform")
            else:
                raise haxe_Exception.thrown("not supported platform")

class TokenType(Enum):
    __slots__ = ()
    _hx_class_name = "TokenType"
    _hx_constructs = ["Identifier", "DataType", "Real", "Text", "BoolConst", "Assign", "Pow", "Add", "Sub", "Mult", "Div", "Mod", "Equals", "Greater", "Lesser", "GreaterEquals", "LesserEquals", "And", "Or", "OpenParen", "CloseParen", "OpenCurly", "CloseCurly", "OpenBracket", "CloseBracket", "Comma", "If", "Elif", "Else", "NewLine"]

    @staticmethod
    def Identifier(name):
        return TokenType("Identifier", 0, (name,))

    @staticmethod
    def DataType(type):
        return TokenType("DataType", 1, (type,))

    @staticmethod
    def Real(number):
        return TokenType("Real", 2, (number,))

    @staticmethod
    def Text(string):
        return TokenType("Text", 3, (string,))

    @staticmethod
    def BoolConst(bool):
        return TokenType("BoolConst", 4, (bool,))
TokenType.Assign = TokenType("Assign", 5, ())
TokenType.Pow = TokenType("Pow", 6, ())
TokenType.Add = TokenType("Add", 7, ())
TokenType.Sub = TokenType("Sub", 8, ())
TokenType.Mult = TokenType("Mult", 9, ())
TokenType.Div = TokenType("Div", 10, ())
TokenType.Mod = TokenType("Mod", 11, ())
TokenType.Equals = TokenType("Equals", 12, ())
TokenType.Greater = TokenType("Greater", 13, ())
TokenType.Lesser = TokenType("Lesser", 14, ())
TokenType.GreaterEquals = TokenType("GreaterEquals", 15, ())
TokenType.LesserEquals = TokenType("LesserEquals", 16, ())
TokenType.And = TokenType("And", 17, ())
TokenType.Or = TokenType("Or", 18, ())
TokenType.OpenParen = TokenType("OpenParen", 19, ())
TokenType.CloseParen = TokenType("CloseParen", 20, ())
TokenType.OpenCurly = TokenType("OpenCurly", 21, ())
TokenType.CloseCurly = TokenType("CloseCurly", 22, ())
TokenType.OpenBracket = TokenType("OpenBracket", 23, ())
TokenType.CloseBracket = TokenType("CloseBracket", 24, ())
TokenType.Comma = TokenType("Comma", 25, ())
TokenType.If = TokenType("If", 26, ())
TokenType.Elif = TokenType("Elif", 27, ())
TokenType.Else = TokenType("Else", 28, ())
TokenType.NewLine = TokenType("NewLine", 29, ())


class Tokenizer:
    _hx_class_name = "Tokenizer"
    __slots__ = ()
    _hx_statics = ["DIGITS", "LETTERS", "LETTERS_DIGITS", "KEYWORDS", "getTokens", "toString"]

    @staticmethod
    def getTokens(code):
        # src/Tokenizer.hx:85
        tokens = []
        # src/Tokenizer.hx:87
        idleUntil = 0
        # src/Tokenizer.hx:88
        # src/Tokenizer.hx:88
        _g = 0
        _g1 = len(code)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/Tokenizer.hx:89
            isLast = (i == ((len(code) - 1)))
            # src/Tokenizer.hx:90
            if (i < idleUntil):
                continue
            # src/Tokenizer.hx:93
            char = ("" if (((i < 0) or ((i >= len(code))))) else code[i])
            # src/Tokenizer.hx:94
            if (char == " "):
                continue
            # src/Tokenizer.hx:98
            tmp = None
            searchIn = Tokenizer.DIGITS
            tmp1 = None
            if ((searchIn is None) or ((char is None))):
                tmp1 = False
            elif (char == ""):
                tmp1 = True
            else:
                startIndex = None
                tmp1 = (((searchIn.find(char) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,char,startIndex))) > -1)
            if (not tmp1):
                if ((char == ".") and (not isLast)):
                    searchIn1 = Tokenizer.DIGITS
                    index = (i + 1)
                    searchFor = ("" if (((index < 0) or ((index >= len(code))))) else code[index])
                    if ((searchIn1 is None) or ((searchFor is None))):
                        tmp = False
                    elif (searchFor == ""):
                        tmp = True
                    else:
                        startIndex1 = None
                        tmp = (((searchIn1.find(searchFor) if ((startIndex1 is None)) else HxString.indexOfImpl(searchIn1,searchFor,startIndex1))) > -1)
                else:
                    tmp = False
            else:
                tmp = True
            if tmp:
                # src/Tokenizer.hx:99
                numb = char
                # src/Tokenizer.hx:101
                periods = (1 if ((char == ".")) else 0)
                # src/Tokenizer.hx:103
                # src/Tokenizer.hx:103
                _g2 = (i + 1)
                _g3 = len(code)
                while (_g2 < _g3):
                    j = _g2
                    _g2 = (_g2 + 1)
                    # src/Tokenizer.hx:104
                    char1 = ("" if (((j < 0) or ((j >= len(code))))) else code[j])
                    # src/Tokenizer.hx:107
                    searchIn2 = Tokenizer.DIGITS
                    tmp2 = None
                    if ((searchIn2 is None) or ((char1 is None))):
                        tmp2 = False
                    elif (char1 == ""):
                        tmp2 = True
                    else:
                        startIndex2 = None
                        tmp2 = (((searchIn2.find(char1) if ((startIndex2 is None)) else HxString.indexOfImpl(searchIn2,char1,startIndex2))) > -1)
                    if ((not tmp2) and ((char1 != "."))):
                        # src/Tokenizer.hx:108
                        idleUntil = j
                        # src/Tokenizer.hx:109
                        break
                    # src/Tokenizer.hx:113
                    if (char1 == "."):
                        # src/Tokenizer.hx:114
                        periods = (periods + 1)
                        # src/Tokenizer.hx:116
                        if (periods > 1):
                            # src/Tokenizer.hx:117
                            idleUntil = j
                            # src/Tokenizer.hx:118
                            break
                    # src/Tokenizer.hx:122
                    numb = (("null" if numb is None else numb) + ("null" if char1 is None else char1))
                    # src/Tokenizer.hx:123
                    if (j == ((len(code) - 1))):
                        idleUntil = (j + 1)
                # src/Tokenizer.hx:128
                result = Std.parseFloat(numb)
                real = (None if (python_lib_Math.isnan(result)) else result)
                # src/Tokenizer.hx:129
                if (real is None):
                    raise haxe_Exception.thrown("Number is unparseable")
                # src/Tokenizer.hx:132
                tokens.append(_hx_AnonObject({'type': TokenType.Real(real), 'startPos': i, 'endPos': idleUntil}))
                # src/Tokenizer.hx:133
                continue
            # src/Tokenizer.hx:137
            searchIn3 = Tokenizer.LETTERS
            tmp3 = None
            if ((searchIn3 is None) or ((char is None))):
                tmp3 = False
            elif (char == ""):
                tmp3 = True
            else:
                startIndex3 = None
                tmp3 = (((searchIn3.find(char) if ((startIndex3 is None)) else HxString.indexOfImpl(searchIn3,char,startIndex3))) > -1)
            if tmp3:
                # src/Tokenizer.hx:138
                word = char
                # src/Tokenizer.hx:141
                # src/Tokenizer.hx:141
                _g4 = (i + 1)
                _g5 = len(code)
                while (_g4 < _g5):
                    j1 = _g4
                    _g4 = (_g4 + 1)
                    # src/Tokenizer.hx:142
                    char2 = ("" if (((j1 < 0) or ((j1 >= len(code))))) else code[j1])
                    # src/Tokenizer.hx:144
                    searchIn4 = Tokenizer.LETTERS_DIGITS
                    tmp4 = None
                    if ((searchIn4 is None) or ((char2 is None))):
                        tmp4 = False
                    elif (char2 == ""):
                        tmp4 = True
                    else:
                        startIndex4 = None
                        tmp4 = (((searchIn4.find(char2) if ((startIndex4 is None)) else HxString.indexOfImpl(searchIn4,char2,startIndex4))) > -1)
                    if tmp4:
                        word = (("null" if word is None else word) + ("null" if char2 is None else char2))
                    else:
                        # src/Tokenizer.hx:147
                        idleUntil = j1
                        # src/Tokenizer.hx:148
                        break
                    # src/Tokenizer.hx:151
                    if (j1 == ((len(code) - 1))):
                        idleUntil = (j1 + 1)
                # src/Tokenizer.hx:156
                dataTypeFound = False
                # src/Tokenizer.hx:157
                # src/Tokenizer.hx:157
                _g6 = 0
                _g7 = DataTypes.TYPES_ARRAY
                while (_g6 < len(_g7)):
                    dataType = (_g7[_g6] if _g6 >= 0 and _g6 < len(_g7) else None)
                    _g6 = (_g6 + 1)
                    # src/Tokenizer.hx:158
                    if (dataType.identifier == word):
                        # src/Tokenizer.hx:159
                        tokens.append(_hx_AnonObject({'type': TokenType.DataType(dataType), 'startPos': i, 'endPos': idleUntil}))
                        # src/Tokenizer.hx:160
                        dataTypeFound = True
                        # src/Tokenizer.hx:161
                        break
                # src/Tokenizer.hx:167
                if (not dataTypeFound):
                    # src/Tokenizer.hx:168
                    keywordFound = False
                    # src/Tokenizer.hx:169
                    # src/Tokenizer.hx:169
                    _g8 = 0
                    _g9 = Tokenizer.KEYWORDS
                    while (_g8 < len(_g9)):
                        keyword = (_g9[_g8] if _g8 >= 0 and _g8 < len(_g9) else None)
                        _g8 = (_g8 + 1)
                        # src/Tokenizer.hx:170
                        if (keyword.identifier == word):
                            # src/Tokenizer.hx:171
                            # src/Tokenizer.hx:171
                            x = _hx_AnonObject({'type': keyword.tType, 'startPos': i, 'endPos': idleUntil})
                            tokens.append(x)
                            # src/Tokenizer.hx:172
                            keywordFound = True
                            # src/Tokenizer.hx:173
                            break
                    # src/Tokenizer.hx:177
                    if (not keywordFound):
                        tokens.append(_hx_AnonObject({'type': TokenType.Identifier(word), 'startPos': i, 'endPos': idleUntil}))
            # src/Tokenizer.hx:182
            char3 = char
            # src/Tokenizer.hx:190
            if ((char3 == "'") or ((char3 == "\""))):
                # src/Tokenizer.hx:191
                _hx_str = ""
                # src/Tokenizer.hx:192
                # src/Tokenizer.hx:192
                _g10 = (i + 1)
                _g11 = len(code)
                while (_g10 < _g11):
                    j2 = _g10
                    _g10 = (_g10 + 1)
                    # src/Tokenizer.hx:193
                    char4 = ("" if (((j2 < 0) or ((j2 >= len(code))))) else code[j2])
                    # src/Tokenizer.hx:194
                    if ((char4 == "\"") or ((char4 == "'"))):
                        # src/Tokenizer.hx:195
                        idleUntil = (j2 + 1)
                        # src/Tokenizer.hx:196
                        break
                    # src/Tokenizer.hx:199
                    _hx_str = (("null" if _hx_str is None else _hx_str) + ("null" if char4 is None else char4))
                    # src/Tokenizer.hx:200
                    if (j2 == ((len(code) - 1))):
                        raise haxe_Exception.thrown("\" or ' Expected")
                # src/Tokenizer.hx:203
                tokens.append(_hx_AnonObject({'type': TokenType.Text(_hx_str), 'startPos': i, 'endPos': (idleUntil - 1)}))
            elif (char3 == "#"):
                # src/Tokenizer.hx:184
                _g12 = (i + 1)
                _g13 = len(code)
                while (_g12 < _g13):
                    j3 = _g12
                    _g12 = (_g12 + 1)
                    # src/Tokenizer.hx:185
                    if (((("" if (((j3 < 0) or ((j3 >= len(code))))) else code[j3])) == "\n") or ((j3 == ((len(code) - 1))))):
                        # src/Tokenizer.hx:186
                        idleUntil = (j3 + 1)
                        # src/Tokenizer.hx:187
                        break
            elif (char3 == "%"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mod, 'startPos': i}))
            elif (char3 == "&"):
                # src/Tokenizer.hx:238
                tmp5 = None
                if (not isLast):
                    index1 = (i + 1)
                    tmp5 = ((("" if (((index1 < 0) or ((index1 >= len(code))))) else code[index1])) == "&")
                else:
                    tmp5 = False
                if tmp5:
                    # src/Tokenizer.hx:239
                    tokens.append(_hx_AnonObject({'type': TokenType.And, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:240
                    idleUntil = (i + 2)
            elif (char3 == "("):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenParen, 'startPos': i}))
            elif (char3 == ")"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseParen, 'startPos': i}))
            elif (char3 == "*"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mult, 'startPos': i}))
            elif (char3 == "+"):
                tokens.append(_hx_AnonObject({'type': TokenType.Add, 'startPos': i}))
            elif (char3 == ","):
                tokens.append(_hx_AnonObject({'type': TokenType.Comma, 'startPos': i}))
            elif (char3 == "-"):
                tokens.append(_hx_AnonObject({'type': TokenType.Sub, 'startPos': i}))
            elif (char3 == "/"):
                tokens.append(_hx_AnonObject({'type': TokenType.Div, 'startPos': i}))
            elif (char3 == ";"):
                tokens.append(_hx_AnonObject({'type': TokenType.NewLine, 'startPos': i}))
            elif (char3 == "<"):
                # src/Tokenizer.hx:231
                tmp6 = None
                if (not isLast):
                    index2 = (i + 1)
                    tmp6 = ((("" if (((index2 < 0) or ((index2 >= len(code))))) else code[index2])) == "=")
                else:
                    tmp6 = False
                if tmp6:
                    # src/Tokenizer.hx:232
                    tokens.append(_hx_AnonObject({'type': TokenType.LesserEquals, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:233
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Lesser, 'startPos': i}))
            elif (char3 == "="):
                # src/Tokenizer.hx:205
                tmp7 = None
                if (not isLast):
                    index3 = (i + 1)
                    tmp7 = ((("" if (((index3 < 0) or ((index3 >= len(code))))) else code[index3])) == "=")
                else:
                    tmp7 = False
                if tmp7:
                    # src/Tokenizer.hx:206
                    tokens.append(_hx_AnonObject({'type': TokenType.Equals, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:207
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Assign, 'startPos': i}))
            elif (char3 == ">"):
                # src/Tokenizer.hx:224
                tmp8 = None
                if (not isLast):
                    index4 = (i + 1)
                    tmp8 = ((("" if (((index4 < 0) or ((index4 >= len(code))))) else code[index4])) == "=")
                else:
                    tmp8 = False
                if tmp8:
                    # src/Tokenizer.hx:225
                    tokens.append(_hx_AnonObject({'type': TokenType.GreaterEquals, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:226
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Greater, 'startPos': i}))
            elif (char3 == "["):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenBracket, 'startPos': i}))
            elif (char3 == "]"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseBracket, 'startPos': i}))
            elif (char3 == "^"):
                tokens.append(_hx_AnonObject({'type': TokenType.Pow, 'startPos': i}))
            elif (char3 == "{"):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenCurly, 'startPos': i}))
            elif (char3 == "|"):
                # src/Tokenizer.hx:243
                tmp9 = None
                if (not isLast):
                    index5 = (i + 1)
                    tmp9 = ((("" if (((index5 < 0) or ((index5 >= len(code))))) else code[index5])) == "|")
                else:
                    tmp9 = False
                if tmp9:
                    # src/Tokenizer.hx:244
                    tokens.append(_hx_AnonObject({'type': TokenType.Or, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:245
                    idleUntil = (i + 2)
            elif (char3 == "}"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseCurly, 'startPos': i}))
            else:
                pass
        # src/Tokenizer.hx:266
        return tokens

    @staticmethod
    def toString(tokenType):
        # src/Tokenizer.hx:270
        tmp = tokenType.index
        # src/Tokenizer.hx:273
        if (tmp == 0):
            # src/Tokenizer.hx:273
            name = tokenType.params[0]
            # src/Tokenizer.hx:274
            return ("IDENTIFIER:" + ("null" if name is None else name))
        elif (tmp == 1):
            # src/Tokenizer.hx:271
            _hx_type = tokenType.params[0]
            # src/Tokenizer.hx:272
            return ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
        elif (tmp == 2):
            # src/Tokenizer.hx:275
            number = tokenType.params[0]
            # src/Tokenizer.hx:276
            return ("REAL:" + Std.string(number))
        elif (tmp == 3):
            # src/Tokenizer.hx:277
            string = tokenType.params[0]
            # src/Tokenizer.hx:278
            return ("TEXT:" + ("null" if string is None else string))
        elif (tmp == 4):
            # src/Tokenizer.hx:279
            _hx_bool = tokenType.params[0]
            # src/Tokenizer.hx:280
            return ("BOOL:" + Std.string(_hx_bool))
        elif (tmp == 5):
            return "="
        elif (tmp == 6):
            return "^"
        elif (tmp == 7):
            return "+"
        elif (tmp == 8):
            return "-"
        elif (tmp == 9):
            return "*"
        elif (tmp == 10):
            return "/"
        elif (tmp == 11):
            return "%"
        elif (tmp == 12):
            return "=="
        elif (tmp == 13):
            return ">"
        elif (tmp == 14):
            return "<"
        elif (tmp == 15):
            return ">="
        elif (tmp == 16):
            return "<="
        elif (tmp == 17):
            return "AND"
        elif (tmp == 18):
            return "OR"
        elif (tmp == 19):
            return "("
        elif (tmp == 20):
            return ")"
        elif (tmp == 23):
            return "["
        elif (tmp == 24):
            return "]"
        elif (tmp == 25):
            return ","
        elif (tmp == 26):
            return "IF"
        elif (tmp == 27):
            return "ELIF"
        elif (tmp == 28):
            return "ELSE"
        elif (tmp == 29):
            return ";"
        else:
            return "Default Token"


class Type:
    _hx_class_name = "Type"
    __slots__ = ()
    _hx_statics = ["getSuperClass", "createEmptyInstance"]

    @staticmethod
    def getSuperClass(c):
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:70
        return python_Boot.getSuperClass(c)

    @staticmethod
    def createEmptyInstance(cl):
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:124
        i = cl.__new__(cl)
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:126
        callInit = None
        def _hx_local_0(cl):
            # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:127
            sc = Type.getSuperClass(cl)
            # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:128
            if (sc is not None):
                callInit(sc)
            # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:131
            if hasattr(cl,"_hx_empty_init"):
                cl._hx_empty_init(i)
        callInit = _hx_local_0
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:135
        callInit(cl)
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:137
        return i


class haxe_IMap:
    _hx_class_name = "haxe.IMap"
    __slots__ = ()


class haxe_Exception(Exception):
    _hx_class_name = "haxe.Exception"
    __slots__ = ("_hx___nativeStack", "_hx___skipStack", "_hx___nativeException", "_hx___previousException")
    _hx_fields = ["__nativeStack", "__skipStack", "__nativeException", "__previousException"]
    _hx_methods = ["unwrap", "toString", "get_message", "get_native"]
    _hx_statics = ["caught", "thrown"]
    _hx_interfaces = []
    _hx_super = Exception


    def __init__(self,message,previous = None,native = None):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:21
        self._hx___previousException = None
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:20
        self._hx___nativeException = None
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:18
        self._hx___nativeStack = None
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:19
        self._hx___skipStack = 0
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:46
        super().__init__(message)
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:47
        self._hx___previousException = previous
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:48
        if ((native is not None) and Std.isOfType(native,BaseException)):
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:49
            self._hx___nativeException = native
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:50
            self._hx___nativeStack = haxe_NativeStackTrace.exceptionStack()
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:52
            self._hx___nativeException = self
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:53
            infos = python_lib_Traceback.extract_stack()
            if (len(infos) != 0):
                infos.pop()
            infos.reverse()
            self._hx___nativeStack = infos

    def unwrap(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:58
        return self._hx___nativeException

    def toString(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:62
        return self.get_message()

    def get_message(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:76
        return str(self)

    def get_native(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:84
        return self._hx___nativeException

    @staticmethod
    def caught(value):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:24
        if Std.isOfType(value,haxe_Exception):
            return value
        elif Std.isOfType(value,BaseException):
            return haxe_Exception(str(value),None,value)
        else:
            return haxe_ValueException(value,None,value)

    @staticmethod
    def thrown(value):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:34
        if Std.isOfType(value,haxe_Exception):
            return value.get_native()
        elif Std.isOfType(value,BaseException):
            return value
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:39
            e = haxe_ValueException(value)
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:40
            e._hx___skipStack = (e._hx___skipStack + 1)
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:41
            return e

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o._hx___nativeStack = None
        _hx_o._hx___skipStack = None
        _hx_o._hx___nativeException = None
        _hx_o._hx___previousException = None


class haxe_NativeStackTrace:
    _hx_class_name = "haxe.NativeStackTrace"
    __slots__ = ()
    _hx_statics = ["saveStack", "exceptionStack"]

    @staticmethod
    def saveStack(exception):
        pass

    @staticmethod
    def exceptionStack():
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:25
        exc = python_lib_Sys.exc_info()
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:26
        if (exc[2] is not None):
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:27
            infos = python_lib_Traceback.extract_tb(exc[2])
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:28
            infos.reverse()
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:29
            return infos
        else:
            return []


class haxe_ValueException(haxe_Exception):
    _hx_class_name = "haxe.ValueException"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["unwrap"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception


    def __init__(self,value,previous = None,native = None):
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:21
        self.value = None
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:24
        super().__init__(Std.string(value),previous,native)
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:25
        self.value = value

    def unwrap(self):
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:36
        return self.value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class haxe_crypto_Adler32:
    _hx_class_name = "haxe.crypto.Adler32"
    __slots__ = ("a1", "a2")
    _hx_fields = ["a1", "a2"]
    _hx_methods = ["get", "update"]
    _hx_statics = ["make"]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:33
        self.a1 = 1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:34
        self.a2 = 0

    def get(self):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:38
        return ((self.a2 << 16) | self.a1)

    def update(self,b,pos,_hx_len):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:42
        a1 = self.a1
        a2 = self.a2
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:43
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:43
        _g = pos
        _g1 = (pos + _hx_len)
        while (_g < _g1):
            p = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:44
            c = b.b[p]
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:45
            a1 = HxOverrides.mod(((a1 + c)), 65521)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:46
            a2 = HxOverrides.mod(((a2 + a1)), 65521)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:48
        self.a1 = a1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:49
        self.a2 = a2

    @staticmethod
    def make(b):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:72
        a = haxe_crypto_Adler32()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:73
        a.update(b,0,b.length)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:74
        return a.get()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.a1 = None
        _hx_o.a2 = None


class haxe_io_Bytes:
    _hx_class_name = "haxe.io.Bytes"
    __slots__ = ("length", "b")
    _hx_fields = ["length", "b"]
    _hx_methods = ["getString", "toString"]
    _hx_statics = ["alloc", "ofString"]

    def __init__(self,length,b):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:35
        self.length = length
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:36
        self.b = b

    def getString(self,pos,_hx_len,encoding = None):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:416
        tmp = (encoding is None)
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:419
        if (((pos < 0) or ((_hx_len < 0))) or (((pos + _hx_len) > self.length))):
            raise haxe_Exception.thrown(haxe_io_Error.OutsideBounds)
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:450
        return self.b[pos:pos+_hx_len].decode('UTF-8','replace')

    def toString(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:516
        return self.getString(0,self.length)

    @staticmethod
    def alloc(length):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:566
        return haxe_io_Bytes(length,bytearray(length))

    @staticmethod
    def ofString(s,encoding = None):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:615
        b = bytearray(s,"UTF-8")
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:616
        return haxe_io_Bytes(len(b),b)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.length = None
        _hx_o.b = None


class haxe_crypto_Base64:
    _hx_class_name = "haxe.crypto.Base64"
    __slots__ = ()
    _hx_statics = ["CHARS", "BYTES", "encode", "decode"]

    @staticmethod
    def encode(_hx_bytes,complement = None):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:35
        if (complement is None):
            complement = True
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:36
        _hx_str = haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).encodeBytes(_hx_bytes).toString()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:37
        if complement:
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:38
            _g = HxOverrides.mod(_hx_bytes.length, 3)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:40
            if (_g == 1):
                _hx_str = (("null" if _hx_str is None else _hx_str) + "==")
            elif (_g == 2):
                _hx_str = (("null" if _hx_str is None else _hx_str) + "=")
            else:
                pass
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:45
        return _hx_str

    @staticmethod
    def decode(_hx_str,complement = None):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:48
        if (complement is None):
            complement = True
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:49
        if complement:
            while (HxString.charCodeAt(_hx_str,(len(_hx_str) - 1)) == 61):
                _hx_str = HxString.substr(_hx_str,0,-1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:52
        return haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).decodeBytes(haxe_io_Bytes.ofString(_hx_str))


class haxe_crypto_BaseCode:
    _hx_class_name = "haxe.crypto.BaseCode"
    __slots__ = ("base", "nbits", "tbl")
    _hx_fields = ["base", "nbits", "tbl"]
    _hx_methods = ["encodeBytes", "initTable", "decodeBytes"]

    def __init__(self,base):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:31
        self.tbl = None
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:34
        _hx_len = base.length
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:35
        nbits = 1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:36
        while (_hx_len > ((1 << nbits))):
            nbits = (nbits + 1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:38
        if ((nbits > 8) or ((_hx_len != ((1 << nbits))))):
            raise haxe_Exception.thrown("BaseCode : base length must be a power of two.")
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:40
        self.base = base
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:41
        self.nbits = nbits

    def encodeBytes(self,b):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:48
        nbits = self.nbits
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:49
        base = self.base
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:50
        x = ((b.length * 8) / nbits)
        size = None
        try:
            size = int(x)
        except BaseException as _g:
            size = None
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:51
        out = haxe_io_Bytes.alloc((size + ((0 if ((HxOverrides.mod((b.length * 8), nbits) == 0)) else 1))))
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:52
        buf = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:53
        curbits = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:54
        mask = (((1 << nbits)) - 1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:55
        pin = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:56
        pout = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:57
        while (pout < size):
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:58
            while (curbits < nbits):
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:59
                curbits = (curbits + 8)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:60
                buf = (buf << 8)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:61
                pos = pin
                pin = (pin + 1)
                buf = (buf | b.b[pos])
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:63
            curbits = (curbits - nbits)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:64
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:64
            pos1 = pout
            pout = (pout + 1)
            v = base.b[((buf >> curbits) & mask)]
            out.b[pos1] = (v & 255)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:66
        if (curbits > 0):
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:67
            pos = pout
            pout = (pout + 1)
            v = base.b[((buf << ((nbits - curbits))) & mask)]
            out.b[pos] = (v & 255)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:68
        return out

    def initTable(self):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:73
        tbl = list()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:74
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:74
        _g = 0
        while (_g < 256):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:75
            python_internal_ArrayImpl._set(tbl, i, -1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:76
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:76
        _g = 0
        _g1 = self.base.length
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:77
            python_internal_ArrayImpl._set(tbl, self.base.b[i], i)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:78
        self.tbl = tbl

    def decodeBytes(self,b):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:85
        nbits = self.nbits
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:86
        base = self.base
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:87
        if (self.tbl is None):
            self.initTable()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:89
        tbl = self.tbl
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:90
        size = ((b.length * nbits) >> 3)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:91
        out = haxe_io_Bytes.alloc(size)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:92
        buf = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:93
        curbits = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:94
        pin = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:95
        pout = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:96
        while (pout < size):
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:97
            while (curbits < 8):
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:98
                curbits = (curbits + nbits)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:99
                buf = (buf << nbits)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:100
                pos = pin
                pin = (pin + 1)
                i = python_internal_ArrayImpl._get(tbl, b.b[pos])
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:101
                if (i == -1):
                    raise haxe_Exception.thrown("BaseCode : invalid encoded char")
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:103
                buf = (buf | i)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:105
            curbits = (curbits - 8)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:106
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:106
            pos1 = pout
            pout = (pout + 1)
            out.b[pos1] = (((buf >> curbits) & 255) & 255)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:108
        return out

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.base = None
        _hx_o.nbits = None
        _hx_o.tbl = None


class haxe_crypto_Crc32:
    _hx_class_name = "haxe.crypto.Crc32"
    __slots__ = ()
    _hx_statics = ["make"]

    @staticmethod
    def make(data):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:60
        c_crc = -1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:61
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:61
        b = data.b
        _g = 0
        _g1 = data.length
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            tmp = (((c_crc ^ b[i])) & 255)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:47
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            c_crc = (HxOverrides.rshift(c_crc, 8) ^ tmp)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:62
        return (c_crc ^ -1)


class haxe_ds_IntMap:
    _hx_class_name = "haxe.ds.IntMap"
    __slots__ = ("h",)
    _hx_fields = ["h"]
    _hx_methods = ["set"]
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/ds/IntMap.hx:32
        self.h = dict()

    def set(self,key,value):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/ds/IntMap.hx:36
        self.h[key] = value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_ds_StringMap:
    _hx_class_name = "haxe.ds.StringMap"
    __slots__ = ("h",)
    _hx_fields = ["h"]
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/ds/StringMap.hx:32
        self.h = dict()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_exceptions_PosException(haxe_Exception):
    _hx_class_name = "haxe.exceptions.PosException"
    __slots__ = ("posInfos",)
    _hx_fields = ["posInfos"]
    _hx_methods = ["toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception


    def __init__(self,message,previous = None,pos = None):
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:10
        self.posInfos = None
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:13
        super().__init__(message,previous)
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:14
        if (pos is None):
            self.posInfos = _hx_AnonObject({'fileName': "(unknown)", 'lineNumber': 0, 'className': "(unknown)", 'methodName': "(unknown)"})
        else:
            self.posInfos = pos

    def toString(self):
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:25
        return ((((((((("" + HxOverrides.stringOrNull(super().toString())) + " in ") + HxOverrides.stringOrNull(self.posInfos.className)) + ".") + HxOverrides.stringOrNull(self.posInfos.methodName)) + " at ") + HxOverrides.stringOrNull(self.posInfos.fileName)) + ":") + Std.string(self.posInfos.lineNumber))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.posInfos = None


class haxe_exceptions_NotImplementedException(haxe_exceptions_PosException):
    _hx_class_name = "haxe.exceptions.NotImplementedException"
    __slots__ = ()
    _hx_fields = []
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_exceptions_PosException


    def __init__(self,message = None,previous = None,pos = None):
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/NotImplementedException.hx:7
        if (message is None):
            message = "Not implemented"
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/NotImplementedException.hx:8
        super().__init__(message,previous,pos)


class haxe_io_BytesBuffer:
    _hx_class_name = "haxe.io.BytesBuffer"
    __slots__ = ("b",)
    _hx_fields = ["b"]
    _hx_methods = ["getBytes"]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:58
        self.b = bytearray()

    def getBytes(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:216
        _hx_bytes = haxe_io_Bytes(len(self.b),self.b)
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:222
        self.b = None
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:223
        return _hx_bytes

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class haxe_io_Output:
    _hx_class_name = "haxe.io.Output"
    __slots__ = ("bigEndian",)
    _hx_fields = ["bigEndian"]
    _hx_methods = ["set_bigEndian"]

    def set_bigEndian(self,b):
        # C:\HaxeToolkit\haxe\std/haxe/io/Output.hx:95
        self.bigEndian = b
        # C:\HaxeToolkit\haxe\std/haxe/io/Output.hx:96
        return b

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bigEndian = None


class haxe_io_BytesOutput(haxe_io_Output):
    _hx_class_name = "haxe.io.BytesOutput"
    __slots__ = ("b",)
    _hx_fields = ["b"]
    _hx_methods = ["writeByte", "getBytes"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output


    def __init__(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:40
        self.b = haxe_io_BytesBuffer()
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:43
        self.set_bigEndian(False)

    def writeByte(self,c):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:55
        self.b.b.append(c)

    def getBytes(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:143
        return self.b.getBytes()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None

class haxe_io_Encoding(Enum):
    __slots__ = ()
    _hx_class_name = "haxe.io.Encoding"
    _hx_constructs = ["UTF8", "RawNative"]
haxe_io_Encoding.UTF8 = haxe_io_Encoding("UTF8", 0, ())
haxe_io_Encoding.RawNative = haxe_io_Encoding("RawNative", 1, ())


class haxe_io_Eof:
    _hx_class_name = "haxe.io.Eof"
    __slots__ = ()
    _hx_methods = ["toString"]

    def __init__(self):
        pass

    def toString(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/Eof.hx:33
        return "Eof"

    @staticmethod
    def _hx_empty_init(_hx_o):        pass

class haxe_io_Error(Enum):
    __slots__ = ()
    _hx_class_name = "haxe.io.Error"
    _hx_constructs = ["Blocked", "Overflow", "OutsideBounds", "Custom"]

    @staticmethod
    def Custom(e):
        return haxe_io_Error("Custom", 3, (e,))
haxe_io_Error.Blocked = haxe_io_Error("Blocked", 0, ())
haxe_io_Error.Overflow = haxe_io_Error("Overflow", 1, ())
haxe_io_Error.OutsideBounds = haxe_io_Error("OutsideBounds", 2, ())


class haxe_io_Input:
    _hx_class_name = "haxe.io.Input"
    __slots__ = ()
    _hx_methods = ["readByte"]

    def readByte(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/Input.hx:53
        raise haxe_exceptions_NotImplementedException(None,None,_hx_AnonObject({'fileName': "haxe/io/Input.hx", 'lineNumber': 53, 'className': "haxe.io.Input", 'methodName': "readByte"}))

    @staticmethod
    def _hx_empty_init(_hx_o):        pass


class haxe_iterators_ArrayIterator:
    _hx_class_name = "haxe.iterators.ArrayIterator"
    __slots__ = ("array", "current")
    _hx_fields = ["array", "current"]
    _hx_methods = ["hasNext", "next"]

    def __init__(self,array):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:30
        self.current = 0
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:37
        self.array = array

    def hasNext(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:45
        return (self.current < len(self.array))

    def next(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:53
        def _hx_local_3():
            # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:53
            def _hx_local_2():
                # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:53
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = (_hx_local_1 + 1)
                return _hx_local_1
            return python_internal_ArrayImpl._get(self.array, _hx_local_2())
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.array = None
        _hx_o.current = None


class haxe_iterators_ArrayKeyValueIterator:
    _hx_class_name = "haxe.iterators.ArrayKeyValueIterator"
    __slots__ = ("current", "array")
    _hx_fields = ["current", "array"]
    _hx_methods = ["hasNext", "next"]

    def __init__(self,array):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:27
        self.current = 0
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:32
        self.array = array

    def hasNext(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:37
        return (self.current < len(self.array))

    def next(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:42
        def _hx_local_3():
            # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:42
            def _hx_local_2():
                # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:42
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = (_hx_local_1 + 1)
                return _hx_local_1
            return _hx_AnonObject({'value': python_internal_ArrayImpl._get(self.array, self.current), 'key': _hx_local_2()})
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.current = None
        _hx_o.array = None


class hx_strings__AnyAsString_AnyAsString_Impl_:
    _hx_class_name = "hx.strings._AnyAsString.AnyAsString_Impl_"
    __slots__ = ()
    _hx_statics = ["fromBool", "fromAny"]

    @staticmethod
    def fromBool(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/AnyAsString.hx:24
        if value:
            return "true"
        else:
            return "false"

    @staticmethod
    def fromAny(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/AnyAsString.hx:29
        return Std.string(value)


class hx_strings__Char_CharCaseMapper:
    _hx_class_name = "hx.strings._Char.CharCaseMapper"
    __slots__ = ("mapU2L", "mapL2U")
    _hx_fields = ["mapU2L", "mapL2U"]
    _hx_methods = ["_addCaseMapping", "isLowerCase", "isUpperCase", "toLowerCase", "toUpperCase"]

    def __init__(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:646
        self.mapL2U = haxe_ds_IntMap()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:645
        self.mapU2L = haxe_ds_IntMap()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:684
        self._addCaseMapping(97,65)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:685
        self._addCaseMapping(98,66)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:686
        self._addCaseMapping(99,67)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:687
        self._addCaseMapping(100,68)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:688
        self._addCaseMapping(101,69)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:689
        self._addCaseMapping(102,70)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:690
        self._addCaseMapping(103,71)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:691
        self._addCaseMapping(104,72)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:692
        self._addCaseMapping(105,73)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:693
        self._addCaseMapping(106,74)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:694
        self._addCaseMapping(107,75)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:695
        self._addCaseMapping(108,76)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:696
        self._addCaseMapping(109,77)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:697
        self._addCaseMapping(110,78)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:698
        self._addCaseMapping(111,79)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:699
        self._addCaseMapping(112,80)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:700
        self._addCaseMapping(113,81)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:701
        self._addCaseMapping(114,82)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:702
        self._addCaseMapping(115,83)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:703
        self._addCaseMapping(116,84)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:704
        self._addCaseMapping(117,85)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:705
        self._addCaseMapping(118,86)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:706
        self._addCaseMapping(119,87)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:707
        self._addCaseMapping(120,88)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:708
        self._addCaseMapping(121,89)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:709
        self._addCaseMapping(122,90)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:710
        self._addCaseMapping(224,192)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:711
        self._addCaseMapping(225,193)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:712
        self._addCaseMapping(226,194)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:713
        self._addCaseMapping(227,195)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:714
        self._addCaseMapping(228,196)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:715
        self._addCaseMapping(229,197)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:716
        self._addCaseMapping(230,198)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:717
        self._addCaseMapping(231,199)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:718
        self._addCaseMapping(232,200)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:719
        self._addCaseMapping(233,201)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:720
        self._addCaseMapping(234,202)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:721
        self._addCaseMapping(235,203)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:722
        self._addCaseMapping(236,204)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:723
        self._addCaseMapping(237,205)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:724
        self._addCaseMapping(238,206)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:725
        self._addCaseMapping(239,207)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:726
        self._addCaseMapping(240,208)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:727
        self._addCaseMapping(241,209)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:728
        self._addCaseMapping(242,210)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:729
        self._addCaseMapping(243,211)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:730
        self._addCaseMapping(244,212)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:731
        self._addCaseMapping(245,213)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:732
        self._addCaseMapping(246,214)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:733
        self._addCaseMapping(248,216)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:734
        self._addCaseMapping(249,217)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:735
        self._addCaseMapping(250,218)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:736
        self._addCaseMapping(251,219)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:737
        self._addCaseMapping(252,220)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:738
        self._addCaseMapping(253,221)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:739
        self._addCaseMapping(254,222)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:740
        self._addCaseMapping(255,376)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:741
        self._addCaseMapping(257,256)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:742
        self._addCaseMapping(259,258)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:743
        self._addCaseMapping(261,260)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:744
        self._addCaseMapping(263,262)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:745
        self._addCaseMapping(265,264)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:746
        self._addCaseMapping(267,266)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:747
        self._addCaseMapping(269,268)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:748
        self._addCaseMapping(271,270)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:749
        self._addCaseMapping(273,272)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:750
        self._addCaseMapping(275,274)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:751
        self._addCaseMapping(277,276)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:752
        self._addCaseMapping(279,278)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:753
        self._addCaseMapping(281,280)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:754
        self._addCaseMapping(283,282)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:755
        self._addCaseMapping(285,284)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:756
        self._addCaseMapping(287,286)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:757
        self._addCaseMapping(289,288)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:758
        self._addCaseMapping(291,290)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:759
        self._addCaseMapping(293,292)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:760
        self._addCaseMapping(295,294)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:761
        self._addCaseMapping(297,296)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:762
        self._addCaseMapping(299,298)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:763
        self._addCaseMapping(301,300)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:764
        self._addCaseMapping(303,302)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:765
        self._addCaseMapping(305,73)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:766
        self._addCaseMapping(307,306)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:767
        self._addCaseMapping(309,308)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:768
        self._addCaseMapping(311,310)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:769
        self._addCaseMapping(314,313)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:770
        self._addCaseMapping(316,315)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:771
        self._addCaseMapping(318,317)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:772
        self._addCaseMapping(320,319)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:773
        self._addCaseMapping(322,321)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:774
        self._addCaseMapping(324,323)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:775
        self._addCaseMapping(326,325)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:776
        self._addCaseMapping(328,327)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:777
        self._addCaseMapping(331,330)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:778
        self._addCaseMapping(333,332)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:779
        self._addCaseMapping(335,334)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:780
        self._addCaseMapping(337,336)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:781
        self._addCaseMapping(339,338)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:782
        self._addCaseMapping(341,340)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:783
        self._addCaseMapping(343,342)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:784
        self._addCaseMapping(345,344)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:785
        self._addCaseMapping(347,346)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:786
        self._addCaseMapping(349,348)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:787
        self._addCaseMapping(351,350)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:788
        self._addCaseMapping(353,352)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:789
        self._addCaseMapping(355,354)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:790
        self._addCaseMapping(357,356)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:791
        self._addCaseMapping(359,358)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:792
        self._addCaseMapping(361,360)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:793
        self._addCaseMapping(363,362)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:794
        self._addCaseMapping(365,364)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:795
        self._addCaseMapping(367,366)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:796
        self._addCaseMapping(369,368)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:797
        self._addCaseMapping(371,370)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:798
        self._addCaseMapping(373,372)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:799
        self._addCaseMapping(375,374)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:800
        self._addCaseMapping(378,377)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:801
        self._addCaseMapping(380,379)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:802
        self._addCaseMapping(382,381)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:803
        self._addCaseMapping(387,386)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:804
        self._addCaseMapping(389,388)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:805
        self._addCaseMapping(392,391)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:806
        self._addCaseMapping(396,395)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:807
        self._addCaseMapping(402,401)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:808
        self._addCaseMapping(409,408)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:809
        self._addCaseMapping(417,416)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:810
        self._addCaseMapping(419,418)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:811
        self._addCaseMapping(421,420)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:812
        self._addCaseMapping(424,423)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:813
        self._addCaseMapping(429,428)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:814
        self._addCaseMapping(432,431)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:815
        self._addCaseMapping(436,435)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:816
        self._addCaseMapping(438,437)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:817
        self._addCaseMapping(441,440)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:818
        self._addCaseMapping(445,444)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:819
        self._addCaseMapping(454,452)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:820
        self._addCaseMapping(457,455)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:821
        self._addCaseMapping(460,458)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:822
        self._addCaseMapping(462,461)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:823
        self._addCaseMapping(464,463)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:824
        self._addCaseMapping(466,465)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:825
        self._addCaseMapping(468,467)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:826
        self._addCaseMapping(470,469)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:827
        self._addCaseMapping(472,471)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:828
        self._addCaseMapping(474,473)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:829
        self._addCaseMapping(476,475)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:830
        self._addCaseMapping(479,478)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:831
        self._addCaseMapping(481,480)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:832
        self._addCaseMapping(483,482)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:833
        self._addCaseMapping(485,484)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:834
        self._addCaseMapping(487,486)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:835
        self._addCaseMapping(489,488)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:836
        self._addCaseMapping(491,490)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:837
        self._addCaseMapping(493,492)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:838
        self._addCaseMapping(495,494)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:839
        self._addCaseMapping(499,497)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:840
        self._addCaseMapping(501,500)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:841
        self._addCaseMapping(507,506)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:842
        self._addCaseMapping(509,508)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:843
        self._addCaseMapping(511,510)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:844
        self._addCaseMapping(513,512)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:845
        self._addCaseMapping(515,514)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:846
        self._addCaseMapping(517,516)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:847
        self._addCaseMapping(519,518)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:848
        self._addCaseMapping(521,520)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:849
        self._addCaseMapping(523,522)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:850
        self._addCaseMapping(525,524)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:851
        self._addCaseMapping(527,526)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:852
        self._addCaseMapping(529,528)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:853
        self._addCaseMapping(531,530)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:854
        self._addCaseMapping(533,532)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:855
        self._addCaseMapping(535,534)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:856
        self._addCaseMapping(595,385)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:857
        self._addCaseMapping(596,390)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:858
        self._addCaseMapping(599,394)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:859
        self._addCaseMapping(600,398)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:860
        self._addCaseMapping(601,399)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:861
        self._addCaseMapping(603,400)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:862
        self._addCaseMapping(608,403)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:863
        self._addCaseMapping(611,404)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:864
        self._addCaseMapping(616,407)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:865
        self._addCaseMapping(617,406)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:866
        self._addCaseMapping(623,412)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:867
        self._addCaseMapping(626,413)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:868
        self._addCaseMapping(629,415)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:869
        self._addCaseMapping(643,425)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:870
        self._addCaseMapping(648,430)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:871
        self._addCaseMapping(650,433)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:872
        self._addCaseMapping(651,434)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:873
        self._addCaseMapping(658,439)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:874
        self._addCaseMapping(924,181)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:875
        self._addCaseMapping(940,902)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:876
        self._addCaseMapping(941,904)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:877
        self._addCaseMapping(942,905)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:878
        self._addCaseMapping(943,906)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:879
        self._addCaseMapping(945,913)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:880
        self._addCaseMapping(946,914)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:881
        self._addCaseMapping(947,915)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:882
        self._addCaseMapping(948,916)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:883
        self._addCaseMapping(949,917)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:884
        self._addCaseMapping(950,918)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:885
        self._addCaseMapping(951,919)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:886
        self._addCaseMapping(952,920)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:887
        self._addCaseMapping(953,921)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:888
        self._addCaseMapping(954,922)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:889
        self._addCaseMapping(955,923)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:890
        self._addCaseMapping(956,924)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:891
        self._addCaseMapping(957,925)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:892
        self._addCaseMapping(958,926)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:893
        self._addCaseMapping(959,927)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:894
        self._addCaseMapping(960,928)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:895
        self._addCaseMapping(961,929)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:896
        self._addCaseMapping(963,931)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:897
        self._addCaseMapping(964,932)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:898
        self._addCaseMapping(965,933)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:899
        self._addCaseMapping(966,934)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:900
        self._addCaseMapping(967,935)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:901
        self._addCaseMapping(968,936)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:902
        self._addCaseMapping(969,937)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:903
        self._addCaseMapping(970,938)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:904
        self._addCaseMapping(971,939)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:905
        self._addCaseMapping(972,908)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:906
        self._addCaseMapping(973,910)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:907
        self._addCaseMapping(974,911)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:908
        self._addCaseMapping(995,994)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:909
        self._addCaseMapping(997,996)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:910
        self._addCaseMapping(999,998)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:911
        self._addCaseMapping(1001,1000)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:912
        self._addCaseMapping(1003,1002)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:913
        self._addCaseMapping(1005,1004)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:914
        self._addCaseMapping(1007,1006)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:915
        self._addCaseMapping(1072,1040)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:916
        self._addCaseMapping(1073,1041)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:917
        self._addCaseMapping(1074,1042)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:918
        self._addCaseMapping(1075,1043)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:919
        self._addCaseMapping(1076,1044)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:920
        self._addCaseMapping(1077,1045)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:921
        self._addCaseMapping(1078,1046)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:922
        self._addCaseMapping(1079,1047)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:923
        self._addCaseMapping(1080,1048)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:924
        self._addCaseMapping(1081,1049)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:925
        self._addCaseMapping(1082,1050)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:926
        self._addCaseMapping(1083,1051)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:927
        self._addCaseMapping(1084,1052)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:928
        self._addCaseMapping(1085,1053)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:929
        self._addCaseMapping(1086,1054)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:930
        self._addCaseMapping(1087,1055)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:931
        self._addCaseMapping(1088,1056)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:932
        self._addCaseMapping(1089,1057)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:933
        self._addCaseMapping(1090,1058)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:934
        self._addCaseMapping(1091,1059)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:935
        self._addCaseMapping(1092,1060)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:936
        self._addCaseMapping(1093,1061)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:937
        self._addCaseMapping(1094,1062)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:938
        self._addCaseMapping(1095,1063)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:939
        self._addCaseMapping(1096,1064)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:940
        self._addCaseMapping(1097,1065)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:941
        self._addCaseMapping(1098,1066)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:942
        self._addCaseMapping(1099,1067)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:943
        self._addCaseMapping(1100,1068)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:944
        self._addCaseMapping(1101,1069)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:945
        self._addCaseMapping(1102,1070)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:946
        self._addCaseMapping(1103,1071)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:947
        self._addCaseMapping(1105,1025)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:948
        self._addCaseMapping(1106,1026)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:949
        self._addCaseMapping(1107,1027)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:950
        self._addCaseMapping(1108,1028)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:951
        self._addCaseMapping(1109,1029)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:952
        self._addCaseMapping(1110,1030)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:953
        self._addCaseMapping(1111,1031)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:954
        self._addCaseMapping(1112,1032)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:955
        self._addCaseMapping(1113,1033)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:956
        self._addCaseMapping(1114,1034)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:957
        self._addCaseMapping(1115,1035)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:958
        self._addCaseMapping(1116,1036)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:959
        self._addCaseMapping(1118,1038)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:960
        self._addCaseMapping(1119,1039)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:961
        self._addCaseMapping(1121,1120)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:962
        self._addCaseMapping(1123,1122)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:963
        self._addCaseMapping(1125,1124)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:964
        self._addCaseMapping(1127,1126)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:965
        self._addCaseMapping(1129,1128)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:966
        self._addCaseMapping(1131,1130)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:967
        self._addCaseMapping(1133,1132)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:968
        self._addCaseMapping(1135,1134)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:969
        self._addCaseMapping(1137,1136)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:970
        self._addCaseMapping(1139,1138)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:971
        self._addCaseMapping(1141,1140)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:972
        self._addCaseMapping(1143,1142)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:973
        self._addCaseMapping(1145,1144)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:974
        self._addCaseMapping(1147,1146)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:975
        self._addCaseMapping(1149,1148)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:976
        self._addCaseMapping(1151,1150)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:977
        self._addCaseMapping(1153,1152)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:978
        self._addCaseMapping(1169,1168)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:979
        self._addCaseMapping(1171,1170)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:980
        self._addCaseMapping(1173,1172)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:981
        self._addCaseMapping(1175,1174)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:982
        self._addCaseMapping(1177,1176)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:983
        self._addCaseMapping(1179,1178)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:984
        self._addCaseMapping(1181,1180)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:985
        self._addCaseMapping(1183,1182)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:986
        self._addCaseMapping(1185,1184)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:987
        self._addCaseMapping(1187,1186)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:988
        self._addCaseMapping(1189,1188)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:989
        self._addCaseMapping(1191,1190)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:990
        self._addCaseMapping(1193,1192)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:991
        self._addCaseMapping(1195,1194)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:992
        self._addCaseMapping(1197,1196)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:993
        self._addCaseMapping(1199,1198)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:994
        self._addCaseMapping(1201,1200)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:995
        self._addCaseMapping(1203,1202)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:996
        self._addCaseMapping(1205,1204)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:997
        self._addCaseMapping(1207,1206)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:998
        self._addCaseMapping(1209,1208)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:999
        self._addCaseMapping(1211,1210)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1000
        self._addCaseMapping(1213,1212)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1001
        self._addCaseMapping(1215,1214)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1002
        self._addCaseMapping(1218,1217)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1003
        self._addCaseMapping(1220,1219)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1004
        self._addCaseMapping(1224,1223)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1005
        self._addCaseMapping(1228,1227)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1006
        self._addCaseMapping(1233,1232)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1007
        self._addCaseMapping(1235,1234)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1008
        self._addCaseMapping(1237,1236)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1009
        self._addCaseMapping(1239,1238)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1010
        self._addCaseMapping(1241,1240)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1011
        self._addCaseMapping(1243,1242)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1012
        self._addCaseMapping(1245,1244)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1013
        self._addCaseMapping(1247,1246)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1014
        self._addCaseMapping(1249,1248)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1015
        self._addCaseMapping(1251,1250)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1016
        self._addCaseMapping(1253,1252)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1017
        self._addCaseMapping(1255,1254)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1018
        self._addCaseMapping(1257,1256)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1019
        self._addCaseMapping(1259,1258)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1020
        self._addCaseMapping(1263,1262)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1021
        self._addCaseMapping(1265,1264)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1022
        self._addCaseMapping(1267,1266)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1023
        self._addCaseMapping(1269,1268)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1024
        self._addCaseMapping(1273,1272)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1025
        self._addCaseMapping(1377,1329)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1026
        self._addCaseMapping(1378,1330)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1027
        self._addCaseMapping(1379,1331)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1028
        self._addCaseMapping(1380,1332)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1029
        self._addCaseMapping(1381,1333)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1030
        self._addCaseMapping(1382,1334)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1031
        self._addCaseMapping(1383,1335)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1032
        self._addCaseMapping(1384,1336)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1033
        self._addCaseMapping(1385,1337)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1034
        self._addCaseMapping(1386,1338)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1035
        self._addCaseMapping(1387,1339)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1036
        self._addCaseMapping(1388,1340)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1037
        self._addCaseMapping(1389,1341)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1038
        self._addCaseMapping(1390,1342)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1039
        self._addCaseMapping(1391,1343)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1040
        self._addCaseMapping(1392,1344)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1041
        self._addCaseMapping(1393,1345)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1042
        self._addCaseMapping(1394,1346)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1043
        self._addCaseMapping(1395,1347)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1044
        self._addCaseMapping(1396,1348)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1045
        self._addCaseMapping(1397,1349)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1046
        self._addCaseMapping(1398,1350)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1047
        self._addCaseMapping(1399,1351)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1048
        self._addCaseMapping(1400,1352)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1049
        self._addCaseMapping(1401,1353)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1050
        self._addCaseMapping(1402,1354)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1051
        self._addCaseMapping(1403,1355)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1052
        self._addCaseMapping(1404,1356)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1053
        self._addCaseMapping(1405,1357)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1054
        self._addCaseMapping(1406,1358)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1055
        self._addCaseMapping(1407,1359)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1056
        self._addCaseMapping(1408,1360)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1057
        self._addCaseMapping(1409,1361)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1058
        self._addCaseMapping(1410,1362)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1059
        self._addCaseMapping(1411,1363)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1060
        self._addCaseMapping(1412,1364)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1061
        self._addCaseMapping(1413,1365)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1062
        self._addCaseMapping(1414,1366)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1063
        self._addCaseMapping(4304,4256)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1064
        self._addCaseMapping(4305,4257)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1065
        self._addCaseMapping(4306,4258)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1066
        self._addCaseMapping(4307,4259)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1067
        self._addCaseMapping(4308,4260)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1068
        self._addCaseMapping(4309,4261)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1069
        self._addCaseMapping(4310,4262)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1070
        self._addCaseMapping(4311,4263)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1071
        self._addCaseMapping(4312,4264)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1072
        self._addCaseMapping(4313,4265)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1073
        self._addCaseMapping(4314,4266)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1074
        self._addCaseMapping(4315,4267)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1075
        self._addCaseMapping(4316,4268)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1076
        self._addCaseMapping(4317,4269)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1077
        self._addCaseMapping(4318,4270)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1078
        self._addCaseMapping(4319,4271)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1079
        self._addCaseMapping(4320,4272)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1080
        self._addCaseMapping(4321,4273)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1081
        self._addCaseMapping(4322,4274)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1082
        self._addCaseMapping(4323,4275)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1083
        self._addCaseMapping(4324,4276)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1084
        self._addCaseMapping(4325,4277)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1085
        self._addCaseMapping(4326,4278)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1086
        self._addCaseMapping(4327,4279)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1087
        self._addCaseMapping(4328,4280)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1088
        self._addCaseMapping(4329,4281)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1089
        self._addCaseMapping(4330,4282)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1090
        self._addCaseMapping(4331,4283)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1091
        self._addCaseMapping(4332,4284)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1092
        self._addCaseMapping(4333,4285)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1093
        self._addCaseMapping(4334,4286)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1094
        self._addCaseMapping(4335,4287)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1095
        self._addCaseMapping(4336,4288)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1096
        self._addCaseMapping(4337,4289)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1097
        self._addCaseMapping(4338,4290)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1098
        self._addCaseMapping(4339,4291)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1099
        self._addCaseMapping(4340,4292)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1100
        self._addCaseMapping(4341,4293)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1101
        self._addCaseMapping(7681,7680)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1102
        self._addCaseMapping(7683,7682)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1103
        self._addCaseMapping(7685,7684)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1104
        self._addCaseMapping(7687,7686)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1105
        self._addCaseMapping(7689,7688)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1106
        self._addCaseMapping(7691,7690)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1107
        self._addCaseMapping(7693,7692)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1108
        self._addCaseMapping(7695,7694)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1109
        self._addCaseMapping(7697,7696)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1110
        self._addCaseMapping(7699,7698)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1111
        self._addCaseMapping(7701,7700)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1112
        self._addCaseMapping(7703,7702)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1113
        self._addCaseMapping(7705,7704)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1114
        self._addCaseMapping(7707,7706)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1115
        self._addCaseMapping(7709,7708)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1116
        self._addCaseMapping(7711,7710)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1117
        self._addCaseMapping(7713,7712)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1118
        self._addCaseMapping(7715,7714)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1119
        self._addCaseMapping(7717,7716)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1120
        self._addCaseMapping(7719,7718)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1121
        self._addCaseMapping(7721,7720)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1122
        self._addCaseMapping(7723,7722)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1123
        self._addCaseMapping(7725,7724)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1124
        self._addCaseMapping(7727,7726)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1125
        self._addCaseMapping(7729,7728)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1126
        self._addCaseMapping(7731,7730)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1127
        self._addCaseMapping(7733,7732)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1128
        self._addCaseMapping(7735,7734)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1129
        self._addCaseMapping(7737,7736)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1130
        self._addCaseMapping(7739,7738)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1131
        self._addCaseMapping(7741,7740)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1132
        self._addCaseMapping(7743,7742)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1133
        self._addCaseMapping(7745,7744)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1134
        self._addCaseMapping(7747,7746)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1135
        self._addCaseMapping(7749,7748)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1136
        self._addCaseMapping(7751,7750)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1137
        self._addCaseMapping(7753,7752)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1138
        self._addCaseMapping(7755,7754)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1139
        self._addCaseMapping(7757,7756)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1140
        self._addCaseMapping(7759,7758)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1141
        self._addCaseMapping(7761,7760)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1142
        self._addCaseMapping(7763,7762)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1143
        self._addCaseMapping(7765,7764)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1144
        self._addCaseMapping(7767,7766)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1145
        self._addCaseMapping(7769,7768)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1146
        self._addCaseMapping(7771,7770)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1147
        self._addCaseMapping(7773,7772)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1148
        self._addCaseMapping(7775,7774)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1149
        self._addCaseMapping(7777,7776)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1150
        self._addCaseMapping(7779,7778)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1151
        self._addCaseMapping(7781,7780)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1152
        self._addCaseMapping(7783,7782)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1153
        self._addCaseMapping(7785,7784)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1154
        self._addCaseMapping(7787,7786)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1155
        self._addCaseMapping(7789,7788)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1156
        self._addCaseMapping(7791,7790)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1157
        self._addCaseMapping(7793,7792)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1158
        self._addCaseMapping(7795,7794)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1159
        self._addCaseMapping(7797,7796)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1160
        self._addCaseMapping(7799,7798)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1161
        self._addCaseMapping(7801,7800)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1162
        self._addCaseMapping(7803,7802)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1163
        self._addCaseMapping(7805,7804)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1164
        self._addCaseMapping(7807,7806)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1165
        self._addCaseMapping(7809,7808)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1166
        self._addCaseMapping(7811,7810)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1167
        self._addCaseMapping(7813,7812)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1168
        self._addCaseMapping(7815,7814)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1169
        self._addCaseMapping(7817,7816)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1170
        self._addCaseMapping(7819,7818)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1171
        self._addCaseMapping(7821,7820)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1172
        self._addCaseMapping(7823,7822)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1173
        self._addCaseMapping(7825,7824)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1174
        self._addCaseMapping(7827,7826)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1175
        self._addCaseMapping(7829,7828)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1176
        self._addCaseMapping(7841,7840)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1177
        self._addCaseMapping(7843,7842)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1178
        self._addCaseMapping(7845,7844)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1179
        self._addCaseMapping(7847,7846)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1180
        self._addCaseMapping(7849,7848)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1181
        self._addCaseMapping(7851,7850)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1182
        self._addCaseMapping(7853,7852)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1183
        self._addCaseMapping(7855,7854)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1184
        self._addCaseMapping(7857,7856)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1185
        self._addCaseMapping(7859,7858)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1186
        self._addCaseMapping(7861,7860)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1187
        self._addCaseMapping(7863,7862)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1188
        self._addCaseMapping(7865,7864)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1189
        self._addCaseMapping(7867,7866)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1190
        self._addCaseMapping(7869,7868)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1191
        self._addCaseMapping(7871,7870)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1192
        self._addCaseMapping(7873,7872)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1193
        self._addCaseMapping(7875,7874)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1194
        self._addCaseMapping(7877,7876)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1195
        self._addCaseMapping(7879,7878)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1196
        self._addCaseMapping(7881,7880)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1197
        self._addCaseMapping(7883,7882)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1198
        self._addCaseMapping(7885,7884)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1199
        self._addCaseMapping(7887,7886)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1200
        self._addCaseMapping(7889,7888)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1201
        self._addCaseMapping(7891,7890)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1202
        self._addCaseMapping(7893,7892)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1203
        self._addCaseMapping(7895,7894)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1204
        self._addCaseMapping(7897,7896)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1205
        self._addCaseMapping(7899,7898)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1206
        self._addCaseMapping(7901,7900)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1207
        self._addCaseMapping(7903,7902)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1208
        self._addCaseMapping(7905,7904)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1209
        self._addCaseMapping(7907,7906)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1210
        self._addCaseMapping(7909,7908)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1211
        self._addCaseMapping(7911,7910)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1212
        self._addCaseMapping(7913,7912)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1213
        self._addCaseMapping(7915,7914)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1214
        self._addCaseMapping(7917,7916)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1215
        self._addCaseMapping(7919,7918)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1216
        self._addCaseMapping(7921,7920)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1217
        self._addCaseMapping(7923,7922)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1218
        self._addCaseMapping(7925,7924)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1219
        self._addCaseMapping(7927,7926)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1220
        self._addCaseMapping(7929,7928)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1221
        self._addCaseMapping(7936,7944)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1222
        self._addCaseMapping(7937,7945)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1223
        self._addCaseMapping(7938,7946)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1224
        self._addCaseMapping(7939,7947)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1225
        self._addCaseMapping(7940,7948)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1226
        self._addCaseMapping(7941,7949)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1227
        self._addCaseMapping(7942,7950)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1228
        self._addCaseMapping(7943,7951)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1229
        self._addCaseMapping(7952,7960)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1230
        self._addCaseMapping(7953,7961)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1231
        self._addCaseMapping(7954,7962)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1232
        self._addCaseMapping(7955,7963)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1233
        self._addCaseMapping(7956,7964)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1234
        self._addCaseMapping(7957,7965)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1235
        self._addCaseMapping(7968,7976)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1236
        self._addCaseMapping(7969,7977)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1237
        self._addCaseMapping(7970,7978)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1238
        self._addCaseMapping(7971,7979)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1239
        self._addCaseMapping(7972,7980)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1240
        self._addCaseMapping(7973,7981)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1241
        self._addCaseMapping(7974,7982)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1242
        self._addCaseMapping(7975,7983)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1243
        self._addCaseMapping(7984,7992)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1244
        self._addCaseMapping(7985,7993)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1245
        self._addCaseMapping(7986,7994)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1246
        self._addCaseMapping(7987,7995)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1247
        self._addCaseMapping(7988,7996)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1248
        self._addCaseMapping(7989,7997)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1249
        self._addCaseMapping(7990,7998)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1250
        self._addCaseMapping(7991,7999)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1251
        self._addCaseMapping(8000,8008)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1252
        self._addCaseMapping(8001,8009)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1253
        self._addCaseMapping(8002,8010)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1254
        self._addCaseMapping(8003,8011)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1255
        self._addCaseMapping(8004,8012)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1256
        self._addCaseMapping(8005,8013)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1257
        self._addCaseMapping(8017,8025)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1258
        self._addCaseMapping(8019,8027)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1259
        self._addCaseMapping(8021,8029)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1260
        self._addCaseMapping(8023,8031)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1261
        self._addCaseMapping(8032,8040)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1262
        self._addCaseMapping(8033,8041)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1263
        self._addCaseMapping(8034,8042)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1264
        self._addCaseMapping(8035,8043)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1265
        self._addCaseMapping(8036,8044)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1266
        self._addCaseMapping(8037,8045)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1267
        self._addCaseMapping(8038,8046)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1268
        self._addCaseMapping(8039,8047)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1269
        self._addCaseMapping(8064,8072)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1270
        self._addCaseMapping(8065,8073)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1271
        self._addCaseMapping(8066,8074)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1272
        self._addCaseMapping(8067,8075)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1273
        self._addCaseMapping(8068,8076)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1274
        self._addCaseMapping(8069,8077)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1275
        self._addCaseMapping(8070,8078)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1276
        self._addCaseMapping(8071,8079)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1277
        self._addCaseMapping(8080,8088)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1278
        self._addCaseMapping(8081,8089)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1279
        self._addCaseMapping(8082,8090)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1280
        self._addCaseMapping(8083,8091)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1281
        self._addCaseMapping(8084,8092)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1282
        self._addCaseMapping(8085,8093)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1283
        self._addCaseMapping(8086,8094)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1284
        self._addCaseMapping(8087,8095)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1285
        self._addCaseMapping(8096,8104)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1286
        self._addCaseMapping(8097,8105)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1287
        self._addCaseMapping(8098,8106)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1288
        self._addCaseMapping(8099,8107)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1289
        self._addCaseMapping(8100,8108)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1290
        self._addCaseMapping(8101,8109)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1291
        self._addCaseMapping(8102,8110)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1292
        self._addCaseMapping(8103,8111)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1293
        self._addCaseMapping(8112,8120)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1294
        self._addCaseMapping(8113,8121)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1295
        self._addCaseMapping(8144,8152)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1296
        self._addCaseMapping(8145,8153)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1297
        self._addCaseMapping(8160,8168)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1298
        self._addCaseMapping(8161,8169)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1299
        self._addCaseMapping(9424,9398)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1300
        self._addCaseMapping(9425,9399)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1301
        self._addCaseMapping(9426,9400)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1302
        self._addCaseMapping(9427,9401)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1303
        self._addCaseMapping(9428,9402)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1304
        self._addCaseMapping(9429,9403)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1305
        self._addCaseMapping(9430,9404)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1306
        self._addCaseMapping(9431,9405)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1307
        self._addCaseMapping(9432,9406)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1308
        self._addCaseMapping(9433,9407)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1309
        self._addCaseMapping(9434,9408)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1310
        self._addCaseMapping(9435,9409)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1311
        self._addCaseMapping(9436,9410)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1312
        self._addCaseMapping(9437,9411)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1313
        self._addCaseMapping(9438,9412)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1314
        self._addCaseMapping(9439,9413)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1315
        self._addCaseMapping(9440,9414)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1316
        self._addCaseMapping(9441,9415)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1317
        self._addCaseMapping(9442,9416)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1318
        self._addCaseMapping(9443,9417)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1319
        self._addCaseMapping(9444,9418)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1320
        self._addCaseMapping(9445,9419)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1321
        self._addCaseMapping(9446,9420)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1322
        self._addCaseMapping(9447,9421)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1323
        self._addCaseMapping(9448,9422)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1324
        self._addCaseMapping(9449,9423)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1325
        self._addCaseMapping(65345,65313)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1326
        self._addCaseMapping(65346,65314)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1327
        self._addCaseMapping(65347,65315)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1328
        self._addCaseMapping(65348,65316)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1329
        self._addCaseMapping(65349,65317)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1330
        self._addCaseMapping(65350,65318)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1331
        self._addCaseMapping(65351,65319)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1332
        self._addCaseMapping(65352,65320)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1333
        self._addCaseMapping(65353,65321)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1334
        self._addCaseMapping(65354,65322)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1335
        self._addCaseMapping(65355,65323)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1336
        self._addCaseMapping(65356,65324)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1337
        self._addCaseMapping(65357,65325)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1338
        self._addCaseMapping(65358,65326)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1339
        self._addCaseMapping(65359,65327)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1340
        self._addCaseMapping(65360,65328)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1341
        self._addCaseMapping(65361,65329)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1342
        self._addCaseMapping(65362,65330)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1343
        self._addCaseMapping(65363,65331)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1344
        self._addCaseMapping(65364,65332)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1345
        self._addCaseMapping(65365,65333)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1346
        self._addCaseMapping(65366,65334)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1347
        self._addCaseMapping(65367,65335)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1348
        self._addCaseMapping(65368,65336)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1349
        self._addCaseMapping(65369,65337)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1350
        self._addCaseMapping(65370,65338)

    def _addCaseMapping(self,lowerChar,upperChar):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:653
        if (not (upperChar in self.mapU2L.h)):
            self.mapU2L.set(upperChar,lowerChar)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:654
        if (not (lowerChar in self.mapL2U.h)):
            self.mapL2U.set(lowerChar,upperChar)

    def isLowerCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:659
        return (ch in self.mapL2U.h)

    def isUpperCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:664
        return (ch in self.mapU2L.h)

    def toLowerCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:669
        lowerChar = self.mapU2L.h.get(ch,None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:670
        if (lowerChar is None):
            return ch
        else:
            return lowerChar

    def toUpperCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:676
        upperChar = self.mapL2U.h.get(ch,None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:677
        if (upperChar is None):
            return ch
        else:
            return upperChar

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.mapU2L = None
        _hx_o.mapL2U = None


class hx_strings__Char_Char_Impl_:
    _hx_class_name = "hx.strings._Char.Char_Impl_"
    __slots__ = ()
    _hx_statics = ["CHAR_CASE_MAPPER", "BACKSPACE", "TAB", "LF", "CR", "ESC", "SPACE", "EXCLAMATION_MARK", "DOUBLE_QUOTE", "HASH", "DOLLAR", "AMPERSAND", "SINGLE_QUOTE", "BRACKET_ROUND_LEFT", "BRACKET_ROUND_RIGHT", "ASTERISK", "PLUS", "COMMA", "MINUS", "DOT", "SLASH", "ZERO", "ONE", "TWO", "TRHEE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "COLON", "SEMICOLON", "LOWER_THAN", "EQUALS", "GREATER_THAN", "QUESTION_MARK", "BRACKET_SQUARE_LEFT", "BACKSLASH", "BRACKET_SQUARE_RIGHT", "CARET", "UNDERSCORE", "BRACKET_CURLY_LEFT", "PIPE", "BRACKET_CURLY_RIGHT", "fromString", "of", "op_plus_string", "op_plus_string2", "op_plus", "isAscii", "isAsciiAlpha", "isAsciiAlphanumeric", "isAsciiControl", "isAsciiPrintable", "isDigit", "isEOF", "isSpace", "isUTF8", "isWhitespace", "isLowerCase", "isUpperCase", "toLowerCase", "toUpperCase", "toInt", "toString"]

    @staticmethod
    def fromString(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:261
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        if ((strLen == 0) or ((0 >= strLen))):
            return -1
        else:
            return HxString.charCodeAt(_hx_str,0)

    @staticmethod
    def of(ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:266
        return ch

    @staticmethod
    def op_plus_string(ch,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:272
        return (HxOverrides.stringOrNull("".join(map(chr,[ch]))) + ("null" if other is None else other))

    @staticmethod
    def op_plus_string2(_hx_str,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:278
        return (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull("".join(map(chr,[ch]))))

    @staticmethod
    def op_plus(ch,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:284
        return (ch + other)

    @staticmethod
    def isAscii(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:338
        if (this1 > -1):
            return (this1 < 128)
        else:
            return False

    @staticmethod
    def isAsciiAlpha(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:364
        if (not (((this1 > 64) and ((this1 < 91))))):
            if (this1 > 96):
                return (this1 < 123)
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiAlphanumeric(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:390
        if (not ((((this1 > 64) and ((this1 < 91))) or (((this1 > 96) and ((this1 < 123))))))):
            if (this1 > 47):
                return (this1 < 58)
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiControl(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:414
        if (not (((this1 > -1) and ((this1 < 32))))):
            return (this1 == 127)
        else:
            return True

    @staticmethod
    def isAsciiPrintable(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:439
        if (this1 > 31):
            return (this1 < 127)
        else:
            return False

    @staticmethod
    def isDigit(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:474
        if (this1 > 47):
            return (this1 < 58)
        else:
            return False

    @staticmethod
    def isEOF(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:486
        return (this1 == -1)

    @staticmethod
    def isSpace(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:507
        return (this1 == 32)

    @staticmethod
    def isUTF8(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:533
        if (this1 > -1):
            return (this1 < 1114112)
        else:
            return False

    @staticmethod
    def isWhitespace(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:554
        if (not (((this1 > 8) and ((this1 < 14))))):
            return (this1 == 32)
        else:
            return True

    @staticmethod
    def isLowerCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:566
        return (this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h)

    @staticmethod
    def isUpperCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:578
        return (this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h)

    @staticmethod
    def toLowerCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:590
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(this1,None)
        if (lowerChar is None):
            return this1
        else:
            return lowerChar

    @staticmethod
    def toUpperCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:602
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(this1,None)
        if (upperChar is None):
            return this1
        else:
            return upperChar

    @staticmethod
    def toInt(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:614
        return this1

    @staticmethod
    def toString(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:630
        return "".join(map(chr,[this1]))


class hx_strings_CharIterator:
    _hx_class_name = "hx.strings.CharIterator"
    __slots__ = ("index", "line", "col", "currChar", "prevBuffer", "prevBufferPrevIdx", "prevBufferNextIdx")
    _hx_fields = ["index", "line", "col", "currChar", "prevBuffer", "prevBufferPrevIdx", "prevBufferNextIdx"]
    _hx_methods = ["get_current", "get_pos", "hasPrev", "prev", "hasNext", "next", "getChar", "isEOF"]
    _hx_statics = ["fromString", "fromArray", "fromInput", "fromIterator"]

    def __init__(self,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:103
        self.prevBufferNextIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:102
        self.prevBufferPrevIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:99
        self.currChar = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:98
        self.col = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:97
        self.line = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:96
        self.index = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:117
        tmp = None
        if (prevBufferSize > 0):
            this1 = hx_strings_internal__RingBuffer_RingBufferImpl((prevBufferSize + 1))
            tmp = this1
        else:
            tmp = None
        self.prevBuffer = tmp

    def get_current(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:108
        if (self.index > -1):
            return self.currChar
        else:
            return None

    def get_pos(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:113
        return hx_strings_CharPos(self.index,self.line,self.col)

    def hasPrev(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:122
        return (self.prevBufferPrevIdx > -1)

    def prev(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:131
        if (self.prevBufferPrevIdx <= -1):
            raise haxe_Exception.thrown(haxe_io_Eof())
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:134
        prevChar = self.prevBuffer.get(self.prevBufferPrevIdx)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:135
        self.currChar = prevChar.char
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:136
        self.index = prevChar.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:137
        self.line = prevChar.line
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:138
        self.col = prevChar.col
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:140
        self.prevBufferNextIdx = ((self.prevBufferPrevIdx + 1) if (((self.prevBufferPrevIdx + 1) < self.prevBuffer.length)) else -1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:141
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:141
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.prevBufferPrevIdx
        _hx_local_0.prevBufferPrevIdx = (_hx_local_1 - 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:142
        return self.currChar

    def hasNext(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:148
        if (self.prevBufferNextIdx > -1):
            return True
        else:
            return (not self.isEOF())

    def next(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:158
        if (self.prevBufferNextIdx > -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:159
            prevChar = self.prevBuffer.get(self.prevBufferNextIdx)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:160
            self.currChar = prevChar.char
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:161
            self.index = prevChar.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:162
            self.line = prevChar.line
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:163
            self.col = prevChar.col
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:164
            self.prevBufferPrevIdx = (self.prevBufferNextIdx - 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:165
            self.prevBufferNextIdx = ((self.prevBufferNextIdx + 1) if (((self.prevBufferNextIdx + 1) < self.prevBuffer.length)) else -1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:166
            return self.currChar
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:169
        if self.isEOF():
            raise haxe_Exception.thrown(haxe_io_Eof())
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:172
        if ((self.currChar == 10) or ((self.currChar < 0))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:173
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:173
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.line
            _hx_local_0.line = (_hx_local_1 + 1)
            _hx_local_1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:174
            self.col = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:177
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:177
        _hx_local_2 = self
        _hx_local_3 = _hx_local_2.index
        _hx_local_2.index = (_hx_local_3 + 1)
        _hx_local_3
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:178
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:178
        _hx_local_4 = self
        _hx_local_5 = _hx_local_4.col
        _hx_local_4.col = (_hx_local_5 + 1)
        _hx_local_5
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:179
        self.currChar = self.getChar()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:181
        if (self.prevBuffer is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:182
            self.prevBuffer.add(hx_strings__CharIterator_CharWithPos(self.currChar,self.index,self.col,self.line))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:183
            self.prevBufferPrevIdx = (self.prevBuffer.length - 2)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:184
            self.prevBufferNextIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:187
        return self.currChar

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:194
        raise haxe_Exception.thrown("Not implemented")

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:196
        raise haxe_Exception.thrown("Not implemented")

    @staticmethod
    def fromString(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:34
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:35
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:36
        return hx_strings__CharIterator_StringCharIterator(chars,prevBufferSize)

    @staticmethod
    def fromArray(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:52
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:53
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:54
        return hx_strings__CharIterator_ArrayCharIterator(chars,prevBufferSize)

    @staticmethod
    def fromInput(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:72
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:73
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:74
        return hx_strings__CharIterator_InputCharIterator(chars,prevBufferSize)

    @staticmethod
    def fromIterator(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:90
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:91
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:92
        return hx_strings__CharIterator_IteratorCharIterator(chars,prevBufferSize)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None
        _hx_o.currChar = None
        _hx_o.prevBuffer = None
        _hx_o.prevBufferPrevIdx = None
        _hx_o.prevBufferNextIdx = None


class hx_strings_CharPos:
    _hx_class_name = "hx.strings.CharPos"
    __slots__ = ("index", "line", "col")
    _hx_fields = ["index", "line", "col"]
    _hx_methods = ["toString"]

    def __init__(self,index,line,col):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4124
        self.index = index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4125
        self.line = line
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4126
        self.col = col

    def toString(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4151
        return (((((("CharPos[index=" + Std.string(self.index)) + ", line=") + Std.string(self.line)) + ", col=") + Std.string(self.col)) + "]")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None


class hx_strings__CharIterator_CharWithPos(hx_strings_CharPos):
    _hx_class_name = "hx.strings._CharIterator.CharWithPos"
    __slots__ = ("char",)
    _hx_fields = ["char"]
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharPos


    def __init__(self,char,index,line,col):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:202
        self.char = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:205
        super().__init__(index,line,col)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:206
        self.char = char

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.char = None


class hx_strings_internal__RingBuffer_RingBufferImpl:
    _hx_class_name = "hx.strings.internal._RingBuffer.RingBufferImpl"
    __slots__ = ("buffer", "bufferStartIdx", "bufferEndIdx", "bufferMaxIdx", "length", "size")
    _hx_fields = ["buffer", "bufferStartIdx", "bufferEndIdx", "bufferMaxIdx", "length", "size"]
    _hx_methods = ["add", "get", "iterator", "toArray"]

    def __init__(self,size):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:46
        self.length = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:42
        self.bufferEndIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:41
        self.bufferStartIdx = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:51
        if (size < 1):
            raise haxe_Exception.thrown("[size] must be > 0")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:57
        this1 = [None]*size
        self.buffer = this1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:59
        self.size = size
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:60
        self.bufferMaxIdx = (size - 1)

    def add(self,item):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:65
        if (self.length == self.size):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:66
            self.bufferEndIdx = self.bufferStartIdx
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:67
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:67
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.bufferStartIdx
            _hx_local_0.bufferStartIdx = (_hx_local_1 + 1)
            _hx_local_1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:68
            if (self.bufferStartIdx > self.bufferMaxIdx):
                self.bufferStartIdx = 0
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:71
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:71
            _hx_local_2 = self
            _hx_local_3 = _hx_local_2.bufferEndIdx
            _hx_local_2.bufferEndIdx = (_hx_local_3 + 1)
            _hx_local_3
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:72
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:72
            _hx_local_4 = self
            _hx_local_5 = _hx_local_4.length
            _hx_local_4.length = (_hx_local_5 + 1)
            _hx_local_5
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:74
        self.buffer[self.bufferEndIdx] = item

    def get(self,index):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:79
        if ((index < 0) or ((index > self.bufferMaxIdx))):
            raise haxe_Exception.thrown((("[index] " + Std.string(index)) + " is out of bound"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:82
        realIdx = (self.bufferStartIdx + index)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:83
        if (realIdx > self.bufferMaxIdx):
            realIdx = (realIdx - self.length)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:85
        return self.buffer[realIdx]

    def iterator(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:90
        return hx_strings_internal__RingBuffer_RingBufferIterator(self)

    def toArray(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:94
        arr = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:95
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:95
        i = self.iterator()
        while i.hasNext():
            i1 = i.next()
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:96
            arr.append(i1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:97
        return arr

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buffer = None
        _hx_o.bufferStartIdx = None
        _hx_o.bufferEndIdx = None
        _hx_o.bufferMaxIdx = None
        _hx_o.length = None
        _hx_o.size = None


class python_Boot:
    _hx_class_name = "python.Boot"
    __slots__ = ()
    _hx_statics = ["keywords", "toString1", "fields", "simpleField", "field", "getInstanceFields", "getSuperClass", "getClassFields", "prefixLength", "unhandleKeywords"]

    @staticmethod
    def toString1(o,s):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:87
        if (o is None):
            return "null"
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:90
        if isinstance(o,str):
            return o
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:93
        if (s is None):
            s = ""
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:95
        if (len(s) >= 5):
            return "<...>"
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:98
        if isinstance(o,bool):
            if o:
                return "true"
            else:
                return "false"
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:104
        if (isinstance(o,int) and (not isinstance(o,bool))):
            return str(o)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:108
        if isinstance(o,float):
            try:
                if (o == int(o)):
                    return str(Math.floor((o + 0.5)))
                else:
                    return str(o)
            except BaseException as _g:
                return str(o)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:120
        if isinstance(o,list):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:121
            o1 = o
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:123
            l = len(o1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:125
            st = "["
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:126
            s = (("null" if s is None else s) + "\t")
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:127
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:127
            _g = 0
            _g1 = l
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:128
                prefix = ""
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:129
                if (i > 0):
                    prefix = ","
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:132
                st = (("null" if st is None else st) + HxOverrides.stringOrNull(((("null" if prefix is None else prefix) + HxOverrides.stringOrNull(python_Boot.toString1((o1[i] if i >= 0 and i < len(o1) else None),s))))))
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:134
            st = (("null" if st is None else st) + "]")
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:135
            return st
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:138
        try:
            if hasattr(o,"toString"):
                return o.toString()
        except BaseException as _g:
            pass
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:143
        if hasattr(o,"__class__"):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:144
            if isinstance(o,_hx_AnonObject):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:145
                toStr = None
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:146
                try:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:147
                    fields = python_Boot.fields(o)
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:148
                    _g = []
                    _g1 = 0
                    while (_g1 < len(fields)):
                        f = (fields[_g1] if _g1 >= 0 and _g1 < len(fields) else None)
                        _g1 = (_g1 + 1)
                        x = ((("" + ("null" if f is None else f)) + " : ") + HxOverrides.stringOrNull(python_Boot.toString1(python_Boot.simpleField(o,f),(("null" if s is None else s) + "\t"))))
                        _g.append(x)
                    fieldsStr = _g
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:149
                    toStr = (("{ " + HxOverrides.stringOrNull(", ".join([x1 for x1 in fieldsStr]))) + " }")
                except BaseException as _g:
                    return "{ ... }"
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:154
                if (toStr is None):
                    return "{ ... }"
                else:
                    return toStr
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:160
            if isinstance(o,Enum):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:161
                o1 = o
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:163
                l = len(o1.params)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:164
                hasParams = (l > 0)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:165
                if hasParams:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:166
                    paramsStr = ""
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:167
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:167
                    _g = 0
                    _g1 = l
                    while (_g < _g1):
                        i = _g
                        _g = (_g + 1)
                        # C:\HaxeToolkit\haxe\std/python/Boot.hx:168
                        prefix = ""
                        # C:\HaxeToolkit\haxe\std/python/Boot.hx:169
                        if (i > 0):
                            prefix = ","
                        # C:\HaxeToolkit\haxe\std/python/Boot.hx:172
                        paramsStr = (("null" if paramsStr is None else paramsStr) + HxOverrides.stringOrNull(((("null" if prefix is None else prefix) + HxOverrides.stringOrNull(python_Boot.toString1(o1.params[i],s))))))
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:174
                    return (((HxOverrides.stringOrNull(o1.tag) + "(") + ("null" if paramsStr is None else paramsStr)) + ")")
                else:
                    return o1.tag
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:180
            if hasattr(o,"_hx_class_name"):
                if (o.__class__.__name__ != "type"):
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:182
                    fields = python_Boot.getInstanceFields(o)
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:183
                    _g = []
                    _g1 = 0
                    while (_g1 < len(fields)):
                        f = (fields[_g1] if _g1 >= 0 and _g1 < len(fields) else None)
                        _g1 = (_g1 + 1)
                        x = ((("" + ("null" if f is None else f)) + " : ") + HxOverrides.stringOrNull(python_Boot.toString1(python_Boot.simpleField(o,f),(("null" if s is None else s) + "\t"))))
                        _g.append(x)
                    fieldsStr = _g
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:185
                    toStr = (((HxOverrides.stringOrNull(o._hx_class_name) + "( ") + HxOverrides.stringOrNull(", ".join([x1 for x1 in fieldsStr]))) + " )")
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:186
                    return toStr
                else:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:188
                    fields = python_Boot.getClassFields(o)
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:189
                    _g = []
                    _g1 = 0
                    while (_g1 < len(fields)):
                        f = (fields[_g1] if _g1 >= 0 and _g1 < len(fields) else None)
                        _g1 = (_g1 + 1)
                        x = ((("" + ("null" if f is None else f)) + " : ") + HxOverrides.stringOrNull(python_Boot.toString1(python_Boot.simpleField(o,f),(("null" if s is None else s) + "\t"))))
                        _g.append(x)
                    fieldsStr = _g
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:190
                    toStr = (((("#" + HxOverrides.stringOrNull(o._hx_class_name)) + "( ") + HxOverrides.stringOrNull(", ".join([x1 for x1 in fieldsStr]))) + " )")
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:191
                    return toStr
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:195
            if (o == str):
                return "#String"
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:199
            if (o == list):
                return "#Array"
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:203
            if callable(o):
                return "function"
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:206
            try:
                if hasattr(o,"__repr__"):
                    return o.__repr__()
            except BaseException as _g:
                pass
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:212
            if hasattr(o,"__str__"):
                return o.__str__([])
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:216
            if hasattr(o,"__name__"):
                return o.__name__
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:219
            return "???"
        else:
            return str(o)

    @staticmethod
    def fields(o):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:231
        a = []
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:232
        if (o is not None):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:233
            if hasattr(o,"_hx_fields"):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:234
                fields = o._hx_fields
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:235
                if (fields is not None):
                    return list(fields)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:239
            if isinstance(o,_hx_AnonObject):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:240
                d = o.__dict__
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:241
                keys = d.keys()
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:242
                handler = python_Boot.unhandleKeywords
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:244
                for k in keys:
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:245
                    if (k != '_hx_disable_getattr'):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:246
                        a.append(handler(k))
            elif hasattr(o,"__dict__"):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:249
                d = o.__dict__
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:250
                keys1 = d.keys()
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:251
                for k in keys1:
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:252
                    a.append(k)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:255
        return a

    @staticmethod
    def simpleField(o,field):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:267
        if (field is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:270
        field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:271
        if hasattr(o,field1):
            return getattr(o,field1)
        else:
            return None

    @staticmethod
    def field(o,field):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:287
        if (field is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:295
        if isinstance(o,str):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:296
            field1 = field
            _hx_local_0 = len(field1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:306
            if (_hx_local_0 == 10):
                if (field1 == "charCodeAt"):
                    return python_internal_MethodClosure(o,HxString.charCodeAt)
                else:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:320
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 11):
                if (field1 == "lastIndexOf"):
                    return python_internal_MethodClosure(o,HxString.lastIndexOf)
                elif (field1 == "toLowerCase"):
                    return python_internal_MethodClosure(o,HxString.toLowerCase)
                elif (field1 == "toUpperCase"):
                    return python_internal_MethodClosure(o,HxString.toUpperCase)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 9):
                if (field1 == "substring"):
                    return python_internal_MethodClosure(o,HxString.substring)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 5):
                if (field1 == "split"):
                    return python_internal_MethodClosure(o,HxString.split)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 7):
                if (field1 == "indexOf"):
                    return python_internal_MethodClosure(o,HxString.indexOf)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 8):
                if (field1 == "toString"):
                    return python_internal_MethodClosure(o,HxString.toString)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 6):
                if (field1 == "charAt"):
                    return python_internal_MethodClosure(o,HxString.charAt)
                elif (field1 == "length"):
                    return len(o)
                elif (field1 == "substr"):
                    return python_internal_MethodClosure(o,HxString.substr)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            else:
                field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                if hasattr(o,field1):
                    return getattr(o,field1)
                else:
                    return None
        elif isinstance(o,list):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:323
            field1 = field
            _hx_local_1 = len(field1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:353
            if (_hx_local_1 == 11):
                if (field1 == "lastIndexOf"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.lastIndexOf)
                else:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:369
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 4):
                if (field1 == "copy"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.copy)
                elif (field1 == "join"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.join)
                elif (field1 == "push"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.push)
                elif (field1 == "sort"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.sort)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 5):
                if (field1 == "shift"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.shift)
                elif (field1 == "slice"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.slice)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 7):
                if (field1 == "indexOf"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.indexOf)
                elif (field1 == "reverse"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.reverse)
                elif (field1 == "unshift"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.unshift)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 3):
                if (field1 == "map"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.map)
                elif (field1 == "pop"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.pop)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 8):
                if (field1 == "contains"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.contains)
                elif (field1 == "iterator"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.iterator)
                elif (field1 == "toString"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.toString)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 16):
                if (field1 == "keyValueIterator"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.keyValueIterator)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 6):
                if (field1 == "concat"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.concat)
                elif (field1 == "filter"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.filter)
                elif (field1 == "insert"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.insert)
                elif (field1 == "length"):
                    return len(o)
                elif (field1 == "remove"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.remove)
                elif (field1 == "splice"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.splice)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            else:
                field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                if hasattr(o,field1):
                    return getattr(o,field1)
                else:
                    return None
        else:
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:372
            field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
            if hasattr(o,field1):
                return getattr(o,field1)
            else:
                return None

    @staticmethod
    def getInstanceFields(c):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:377
        f = (list(c._hx_fields) if (hasattr(c,"_hx_fields")) else [])
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:378
        if hasattr(c,"_hx_methods"):
            f = (f + c._hx_methods)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:381
        sc = python_Boot.getSuperClass(c)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:383
        if (sc is None):
            return f
        else:
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:386
            scArr = python_Boot.getInstanceFields(sc)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:387
            scMap = set(scArr)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:388
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:388
            _g = 0
            while (_g < len(f)):
                f1 = (f[_g] if _g >= 0 and _g < len(f) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:389
                if (not (f1 in scMap)):
                    scArr.append(f1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:394
            return scArr

    @staticmethod
    def getSuperClass(c):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:399
        if (c is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:402
        try:
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:403
            if hasattr(c,"_hx_super"):
                return c._hx_super
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:406
            return None
        except BaseException as _g:
            pass
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:408
        return None

    @staticmethod
    def getClassFields(c):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:412
        if hasattr(c,"_hx_statics"):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:413
            x = c._hx_statics
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:414
            return list(x)
        else:
            return []

    @staticmethod
    def unhandleKeywords(name):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:439
        if (HxString.substr(name,0,python_Boot.prefixLength) == "_hx_"):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:440
            real = HxString.substr(name,python_Boot.prefixLength,None)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:441
            if (real in python_Boot.keywords):
                return real
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:444
        return name


class HxString:
    _hx_class_name = "HxString"
    __slots__ = ()
    _hx_statics = ["split", "charCodeAt", "charAt", "lastIndexOf", "toUpperCase", "toLowerCase", "indexOf", "indexOfImpl", "toString", "substring", "substr"]

    @staticmethod
    def split(s,d):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:31
        if (d == ""):
            return list(s)
        else:
            return s.split(d)

    @staticmethod
    def charCodeAt(s,index):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:36
        if ((((s is None) or ((len(s) == 0))) or ((index < 0))) or ((index >= len(s)))):
            return None
        else:
            return ord(s[index])

    @staticmethod
    def charAt(s,index):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:41
        if ((index < 0) or ((index >= len(s)))):
            return ""
        else:
            return s[index]

    @staticmethod
    def lastIndexOf(s,_hx_str,startIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:46
        if (startIndex is None):
            return s.rfind(_hx_str, 0, len(s))
        elif (_hx_str == ""):
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:49
            length = len(s)
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:50
            if (startIndex < 0):
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:51
                startIndex = (length + startIndex)
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:52
                if (startIndex < 0):
                    startIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:54
            if (startIndex > length):
                return length
            else:
                return startIndex
        else:
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:56
            i = s.rfind(_hx_str, 0, (startIndex + 1))
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:57
            startLeft = (max(0,((startIndex + 1) - len(_hx_str))) if ((i == -1)) else (i + 1))
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:58
            check = s.find(_hx_str, startLeft, len(s))
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:59
            if ((check > i) and ((check <= startIndex))):
                return check
            else:
                return i

    @staticmethod
    def toUpperCase(s):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:69
        return s.upper()

    @staticmethod
    def toLowerCase(s):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:74
        return s.lower()

    @staticmethod
    def indexOf(s,_hx_str,startIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:79
        if (startIndex is None):
            return s.find(_hx_str)
        else:
            return HxString.indexOfImpl(s,_hx_str,startIndex)

    @staticmethod
    def indexOfImpl(s,_hx_str,startIndex):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:86
        if (_hx_str == ""):
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:87
            length = len(s)
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:88
            if (startIndex < 0):
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:89
                startIndex = (length + startIndex)
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:90
                if (startIndex < 0):
                    startIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:92
            if (startIndex > length):
                return length
            else:
                return startIndex
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:94
        return s.find(_hx_str, startIndex)

    @staticmethod
    def toString(s):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:99
        return s

    @staticmethod
    def substring(s,startIndex,endIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:118
        if (startIndex < 0):
            startIndex = 0
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:120
        if (endIndex is None):
            return s[startIndex:]
        else:
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:123
            if (endIndex < 0):
                endIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:125
            if (endIndex < startIndex):
                return s[endIndex:startIndex]
            else:
                return s[startIndex:endIndex]

    @staticmethod
    def substr(s,startIndex,_hx_len = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:135
        if (_hx_len is None):
            return s[startIndex:]
        else:
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:138
            if (_hx_len == 0):
                return ""
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:140
            if (startIndex < 0):
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:141
                startIndex = (len(s) + startIndex)
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:142
                if (startIndex < 0):
                    startIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:145
            return s[startIndex:(startIndex + _hx_len)]


class hx_strings__CharIterator_NullCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.NullCharIterator"
    __slots__ = ()
    _hx_fields = []
    _hx_methods = ["isEOF"]
    _hx_statics = ["INSTANCE"]
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:218
        super().__init__(0)

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:223
        return True

    @staticmethod
    def _hx_empty_init(_hx_o):        pass


class hx_strings__CharIterator_ArrayCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.ArrayCharIterator"
    __slots__ = ("chars", "charsMaxIndex")
    _hx_fields = ["chars", "charsMaxIndex"]
    _hx_methods = ["isEOF", "getChar"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:230
        self.charsMaxIndex = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:229
        self.chars = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:234
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:235
        self.chars = chars
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:236
        self.charsMaxIndex = (len(chars) - 1)

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:242
        return (self.index >= self.charsMaxIndex)

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:247
        return python_internal_ArrayImpl._get(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings__CharIterator_IteratorCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.IteratorCharIterator"
    __slots__ = ("chars",)
    _hx_fields = ["chars"]
    _hx_methods = ["isEOF", "getChar"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:253
        self.chars = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:257
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:258
        self.chars = chars

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:263
        return (not self.chars.hasNext())

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:268
        return self.chars.next()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None


class hx_strings__CharIterator_InputCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.InputCharIterator"
    __slots__ = ("byteIndex", "input", "currCharIndex", "nextChar", "nextCharAvailable")
    _hx_fields = ["byteIndex", "input", "currCharIndex", "nextChar", "nextCharAvailable"]
    _hx_methods = ["isEOF", "getChar", "readUtf8Char", "readUtf8MultiSequenceByte"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:277
        self.nextChar = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:275
        self.input = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:278
        self.nextCharAvailable = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:276
        self.currCharIndex = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:274
        self.byteIndex = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:281
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:282
        self.input = chars

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:288
        if (self.nextCharAvailable == None):
            try:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:290
                byte1 = self.input.readByte()
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.byteIndex
                _hx_local_0.byteIndex = (_hx_local_1 + 1)
                _hx_local_1
                tmp = None
                if (byte1 <= 127):
                    tmp = byte1
                else:
                    byte1 = (byte1 & -129)
                    byte1 = (byte1 & -65)
                    totalBytes = 2
                    isBit6Set = (1 == (((byte1 >> 5) & 1)))
                    isBit5Set = False
                    if isBit6Set:
                        byte1 = (byte1 & -33)
                        totalBytes = (totalBytes + 1)
                        isBit5Set = (1 == (((byte1 >> 4) & 1)))
                        if isBit5Set:
                            byte1 = (byte1 & -17)
                            totalBytes = (totalBytes + 1)
                            if (1 == (((byte1 >> 3) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte1)) + "]!"))
                    result = (byte1 << ((6 * ((totalBytes - 1)))))
                    byte = self.input.readByte()
                    _hx_local_8 = self
                    _hx_local_9 = _hx_local_8.byteIndex
                    _hx_local_8.byteIndex = (_hx_local_9 + 1)
                    _hx_local_9
                    if (1 != (((byte >> 7) & 1))):
                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                    if (1 == (((byte >> 6) & 1))):
                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                    byte2 = (byte & -129)
                    result = (result + ((byte2 << ((6 * ((totalBytes - 2)))))))
                    if isBit6Set:
                        byte = self.input.readByte()
                        _hx_local_11 = self
                        _hx_local_12 = _hx_local_11.byteIndex
                        _hx_local_11.byteIndex = (_hx_local_12 + 1)
                        _hx_local_12
                        if (1 != (((byte >> 7) & 1))):
                            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                        if (1 == (((byte >> 6) & 1))):
                            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                        byte3 = (byte & -129)
                        result = (result + ((byte3 << ((6 * ((totalBytes - 3)))))))
                        if isBit5Set:
                            byte = self.input.readByte()
                            _hx_local_14 = self
                            _hx_local_15 = _hx_local_14.byteIndex
                            _hx_local_14.byteIndex = (_hx_local_15 + 1)
                            _hx_local_15
                            if (1 != (((byte >> 7) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            if (1 == (((byte >> 6) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            byte4 = (byte & -129)
                            result = (result + ((byte4 << ((6 * ((totalBytes - 4)))))))
                    if ((self.index == 0) and ((result == 65279))):
                        byte1 = self.input.readByte()
                        _hx_local_17 = self
                        _hx_local_18 = _hx_local_17.byteIndex
                        _hx_local_17.byteIndex = (_hx_local_18 + 1)
                        _hx_local_18
                        if (byte1 <= 127):
                            tmp = byte1
                        else:
                            byte1 = (byte1 & -129)
                            byte1 = (byte1 & -65)
                            totalBytes = 2
                            isBit6Set = (1 == (((byte1 >> 5) & 1)))
                            isBit5Set = False
                            if isBit6Set:
                                byte1 = (byte1 & -33)
                                totalBytes = (totalBytes + 1)
                                isBit5Set = (1 == (((byte1 >> 4) & 1)))
                                if isBit5Set:
                                    byte1 = (byte1 & -17)
                                    totalBytes = (totalBytes + 1)
                                    if (1 == (((byte1 >> 3) & 1))):
                                        raise haxe_Exception.thrown((((("Valid UTF-8 byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte1)) + "]!"))
                            result1 = (byte1 << ((6 * ((totalBytes - 1)))))
                            byte = self.input.readByte()
                            _hx_local_25 = self
                            _hx_local_26 = _hx_local_25.byteIndex
                            _hx_local_25.byteIndex = (_hx_local_26 + 1)
                            _hx_local_26
                            if (1 != (((byte >> 7) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            if (1 == (((byte >> 6) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            byte2 = (byte & -129)
                            result1 = (result1 + ((byte2 << ((6 * ((totalBytes - 2)))))))
                            if isBit6Set:
                                byte = self.input.readByte()
                                _hx_local_28 = self
                                _hx_local_29 = _hx_local_28.byteIndex
                                _hx_local_28.byteIndex = (_hx_local_29 + 1)
                                _hx_local_29
                                if (1 != (((byte >> 7) & 1))):
                                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                if (1 == (((byte >> 6) & 1))):
                                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                byte3 = (byte & -129)
                                result1 = (result1 + ((byte3 << ((6 * ((totalBytes - 3)))))))
                                if isBit5Set:
                                    byte = self.input.readByte()
                                    _hx_local_31 = self
                                    _hx_local_32 = _hx_local_31.byteIndex
                                    _hx_local_31.byteIndex = (_hx_local_32 + 1)
                                    _hx_local_32
                                    if (1 != (((byte >> 7) & 1))):
                                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                    if (1 == (((byte >> 6) & 1))):
                                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                    byte4 = (byte & -129)
                                    result1 = (result1 + ((byte4 << ((6 * ((totalBytes - 4)))))))
                            tmp = (self.readUtf8Char() if (((self.index == 0) and ((result1 == 65279)))) else result1)
                    else:
                        tmp = result
                self.nextChar = tmp
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:291
                self.nextCharAvailable = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),haxe_io_Eof):
                    self.nextCharAvailable = False
                else:
                    raise _g
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:296
        return (self.nextCharAvailable != True)

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:302
        if (self.index != self.currCharIndex):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:303
            self.currCharIndex = self.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:304
            self.nextCharAvailable = None
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:305
            return self.nextChar
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:307
        return self.currChar

    def readUtf8Char(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:316
        byte1 = self.input.readByte()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:317
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:317
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:318
        if (byte1 <= 127):
            return byte1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:325
        byte1 = (byte1 & -129)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:326
        byte1 = (byte1 & -65)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:327
        totalBytes = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:329
        isBit6Set = (1 == (((byte1 >> 5) & 1)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:330
        isBit5Set = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:331
        if isBit6Set:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:332
            byte1 = (byte1 & -33)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:333
            totalBytes = (totalBytes + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:335
            isBit5Set = (1 == (((byte1 >> 4) & 1)))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:336
            if isBit5Set:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:337
                byte1 = (byte1 & -17)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:338
                totalBytes = (totalBytes + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:340
                if (1 == (((byte1 >> 3) & 1))):
                    raise haxe_Exception.thrown((((("Valid UTF-8 byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte1)) + "]!"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:345
        result = (byte1 << ((6 * ((totalBytes - 1)))))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:350
        byte = self.input.readByte()
        _hx_local_8 = self
        _hx_local_9 = _hx_local_8.byteIndex
        _hx_local_8.byteIndex = (_hx_local_9 + 1)
        _hx_local_9
        if (1 != (((byte >> 7) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        if (1 == (((byte >> 6) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        byte2 = (byte & -129)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:351
        result = (result + ((byte2 << ((6 * ((totalBytes - 2)))))))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:356
        if isBit6Set:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:357
            byte = self.input.readByte()
            _hx_local_11 = self
            _hx_local_12 = _hx_local_11.byteIndex
            _hx_local_11.byteIndex = (_hx_local_12 + 1)
            _hx_local_12
            if (1 != (((byte >> 7) & 1))):
                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
            if (1 == (((byte >> 6) & 1))):
                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
            byte3 = (byte & -129)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:358
            result = (result + ((byte3 << ((6 * ((totalBytes - 3)))))))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:363
            if isBit5Set:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:364
                byte = self.input.readByte()
                _hx_local_14 = self
                _hx_local_15 = _hx_local_14.byteIndex
                _hx_local_14.byteIndex = (_hx_local_15 + 1)
                _hx_local_15
                if (1 != (((byte >> 7) & 1))):
                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                if (1 == (((byte >> 6) & 1))):
                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                byte4 = (byte & -129)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:365
                result = (result + ((byte4 << ((6 * ((totalBytes - 4)))))))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:370
        if ((self.index == 0) and ((result == 65279))):
            return self.readUtf8Char()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:373
        return result

    def readUtf8MultiSequenceByte(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:379
        byte = self.input.readByte()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:380
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:380
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:382
        if (1 != (((byte >> 7) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:385
        if (1 == (((byte >> 6) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:388
        return (byte & -129)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.byteIndex = None
        _hx_o.input = None
        _hx_o.currCharIndex = None
        _hx_o.nextChar = None
        _hx_o.nextCharAvailable = None


class hx_strings__CharIterator_StringCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.StringCharIterator"
    __slots__ = ("chars", "charsMaxIndex")
    _hx_fields = ["chars", "charsMaxIndex"]
    _hx_methods = ["isEOF", "getChar"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:396
        self.charsMaxIndex = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:395
        self.chars = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:400
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:401
        self.chars = chars
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:402
        self.charsMaxIndex = (((0 if ((chars is None)) else len(chars))) - 1)

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:408
        return (self.index >= self.charsMaxIndex)

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:413
        return HxString.charCodeAt(self.chars,self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings_Pattern:
    _hx_class_name = "hx.strings.Pattern"
    __slots__ = ("pattern", "options", "ereg")
    _hx_fields = ["pattern", "options", "ereg"]
    _hx_methods = ["matcher", "replace", "remove", "split"]
    _hx_statics = ["__meta__", "compile"]

    def __init__(self,pattern,options):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:52
        self.pattern = pattern
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:53
        self.options = options
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:54
        self.ereg = EReg(pattern,options)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:57
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:57
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.options
        _hx_local_0.options = (("null" if _hx_local_1 is None else _hx_local_1) + "u")
        _hx_local_0.options

    def matcher(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:70
        return hx_strings__Pattern_MatcherImpl(self.ereg,self.pattern,self.options,_hx_str)

    def replace(self,_hx_str,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:84
        return self.ereg.replace(_hx_str,replaceWith)

    def remove(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:98
        return self.ereg.replace(_hx_str,"")

    def split(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:111
        return self.ereg.split(_hx_str)

    @staticmethod
    def compile(pattern,options = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:34
        if (options is None):
            return hx_strings_Pattern(pattern,"")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
        _g = options
        tmp = None
        tmp1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:38
        if (tmp1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:38
            _hx_str = _g.params[0]
            str1 = hx_strings_Strings.toLowerCase8(_hx_str)
            if ((str1 is None) or ((len(str1) == 0))):
                tmp = str1
            else:
                def _hx_local_0(ch):
                    return "".join(map(chr,[ch]))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:40
                def _hx_local_1(ch):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:40
                    _this = None
                    strLen = len("i")
                    if (ch != ((-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt("i",0)))):
                        strLen = len("m")
                        _this = (ch == ((-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt("m",0))))
                    else:
                        _this = True
                    if (not _this):
                        strLen = len("g")
                        return (ch == ((-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt("g",0))))
                    else:
                        return True
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:38
                _this = list(map(_hx_local_0,list(filter(_hx_local_1,hx_strings_Strings.toChars(str1)))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
                tmp = "".join([python_Boot.toString1(x1,'') for x1 in _this])
        elif (tmp1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:45
            opt = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
            tmp = Std.string(opt)
        elif (tmp1 == 2):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:46
            arr = _g.params[0]
            def _hx_local_2(m):
                return (m is not None)
            _this = list(filter(_hx_local_2,arr))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
            tmp = "".join([python_Boot.toString1(x1,'') for x1 in _this])
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
        return hx_strings_Pattern(pattern,tmp)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.options = None
        _hx_o.ereg = None


class hx_strings_Matcher:
    _hx_class_name = "hx.strings.Matcher"
    __slots__ = ()
    _hx_methods = ["iterate", "map", "matched", "matchedPos", "matches", "matchesInRegion", "reset", "substringAfterMatch", "substringBeforeMatch"]
    _hx_statics = ["__meta__"]


class hx_strings__Pattern_MatcherImpl:
    _hx_class_name = "hx.strings._Pattern.MatcherImpl"
    __slots__ = ("ereg", "isMatch", "str")
    _hx_fields = ["ereg", "isMatch", "str"]
    _hx_methods = ["reset", "iterate", "map", "matched", "matches", "matchesInRegion", "matchedPos", "substringAfterMatch", "substringBeforeMatch", "_cloneEReg"]
    _hx_interfaces = [hx_strings_Matcher]

    def __init__(self,ereg,pattern,options,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:260
        self.str = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:259
        self.isMatch = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:258
        self.ereg = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:264
        self.ereg = self._cloneEReg(ereg,pattern,options)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:265
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:265
        self.str = _hx_str
        self.isMatch = None

    def reset(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:271
        self.str = _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:272
        self.isMatch = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:273
        return self

    def iterate(self,onMatch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:278
        startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:279
        while self.ereg.matchSub(self.str,startAt):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:280
            self.isMatch = True
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:281
            _this = self.ereg
            matchedPos_pos = _this.matchObj.start()
            matchedPos_len = (_this.matchObj.end() - _this.matchObj.start())
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:282
            onMatch(self)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:283
            startAt = (matchedPos_pos + matchedPos_len)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:285
        self.isMatch = False

    def map(self,mapper):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:289
        _gthis = self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:290
        def _hx_local_1():
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:290
            def _hx_local_0(ereg):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:291
                _gthis.isMatch = True
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:292
                return mapper(_gthis)
            return self.ereg.map(self.str,_hx_local_0)
        return _hx_local_1()

    def matched(self,n = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:297
        if (n is None):
            n = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:298
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:298
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:299
        if (not self.isMatch):
            raise haxe_Exception.thrown("No string matched")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:301
        result = self.ereg.matchObj.group(n)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:307
        return result

    def matches(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:313
        _this = self.ereg
        _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
        def _hx_local_1():
            def _hx_local_0():
                self.isMatch = (_this.matchObj is not None)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchesInRegion(self,pos,_hx_len = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:323
        if (_hx_len is None):
            _hx_len = -1
        def _hx_local_1():
            def _hx_local_0():
                self.isMatch = self.ereg.matchSub(self.str,pos,_hx_len)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchedPos(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:328
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:328
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:329
        if (not self.isMatch):
            raise haxe_Exception.thrown("No string matched")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:330
        _this = self.ereg
        return _hx_AnonObject({'pos': _this.matchObj.start(), 'len': (_this.matchObj.end() - _this.matchObj.start())})

    def substringAfterMatch(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:335
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:335
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:336
        if (not self.isMatch):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:337
        _this = self.ereg
        return HxString.substr(_this.matchObj.string,_this.matchObj.end(),None)

    def substringBeforeMatch(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:342
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:342
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:343
        if (not self.isMatch):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:344
        _this = self.ereg
        return HxString.substr(_this.matchObj.string,0,_this.matchObj.start())

    def _cloneEReg(self,_hx_from,pattern,options):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:371
        clone = Type.createEmptyInstance(EReg)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:372
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:372
        value = Reflect.field(_hx_from,"pattern")
        setattr(clone,(("_hx_" + "pattern") if (("pattern" in python_Boot.keywords)) else (("_hx_" + "pattern") if (((((len("pattern") > 2) and ((ord("pattern"[0]) == 95))) and ((ord("pattern"[1]) == 95))) and ((ord("pattern"[(len("pattern") - 1)]) != 95)))) else "pattern")),value)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:373
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:373
        value = Reflect.field(_hx_from,"global")
        setattr(clone,(("_hx_" + "global") if (("global" in python_Boot.keywords)) else (("_hx_" + "global") if (((((len("global") > 2) and ((ord("global"[0]) == 95))) and ((ord("global"[1]) == 95))) and ((ord("global"[(len("global") - 1)]) != 95)))) else "global")),value)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:381
        return clone

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.ereg = None
        _hx_o.isMatch = None
        _hx_o.str = None


class hx_strings_StringBuilder:
    _hx_class_name = "hx.strings.StringBuilder"
    __slots__ = ("sb", "pre", "len", "length")
    _hx_fields = ["sb", "pre", "len"]
    _hx_methods = ["get_length", "add", "addChar", "addAll", "clear", "isEmpty", "newLine", "insert", "insertChar", "insertAll", "asOutput", "toString"]

    def __init__(self,initialContent = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:48
        self.length = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:26
        self.len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:25
        self.pre = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:22
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:32
        if (initialContent is not None):
            self.add(initialContent)

    def get_length(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:54
        return self.len

    def add(self,item):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:72
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:72
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:74
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:74
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = (_hx_local_1 + (0 if ((item is None)) else len(item)))
        _hx_local_0.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:76
        return self

    def addChar(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:90
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:90
        _this = self.sb
        s = "".join(map(chr,[ch]))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:99
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:99
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:101
        return self

    def addAll(self,items):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:113
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:113
        _g = 0
        while (_g < len(items)):
            item = (items[_g] if _g >= 0 and _g < len(items) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:114
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:114
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:116
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:116
            _hx_local_1 = self
            _hx_local_2 = _hx_local_1.len
            _hx_local_1.len = (_hx_local_2 + (0 if ((item is None)) else len(item)))
            _hx_local_1.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:119
        return self

    def clear(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:138
        self.pre = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:139
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:140
        self.len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:142
        return self

    def isEmpty(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:156
        return (self.len == 0)

    def newLine(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:165
        self.sb.b.write("\n")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:168
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:168
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:170
        return self

    def insert(self,pos,item):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:192
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must not be negative")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:193
        if (pos > self.len):
            raise haxe_Exception.thrown("[pos] must not be greater than this.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:195
        if (pos == self.len):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:196
            self.add(item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:197
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:205
        if (pos == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:206
            if (self.pre is None):
                self.pre = []
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:207
            self.pre.insert(0, item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:208
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:208
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = (_hx_local_1 + (0 if ((item is None)) else len(item)))
            _hx_local_0.len
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:209
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:213
        pre_len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:214
        if (self.pre is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:215
            i = len(self.pre)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:216
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:216
            _g = 0
            _g1 = len(self.pre)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:217
                _hx_str = (self.pre[i] if i >= 0 and i < len(self.pre) else None)
                next_pre_len = (pre_len + ((0 if ((_hx_str is None)) else len(_hx_str))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:218
                if (next_pre_len == pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:219
                    self.pre.insert((i + 1), item)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:220
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:220
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = (_hx_local_3 + (0 if ((item is None)) else len(item)))
                    _hx_local_2.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:221
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:223
                if (next_pre_len > pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:224
                    preSplitted = hx_strings_Strings.splitAt((self.pre[i] if i >= 0 and i < len(self.pre) else None),[(pos - pre_len)])
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:225
                    python_internal_ArrayImpl._set(self.pre, i, (preSplitted[0] if 0 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:226
                    self.pre.insert((i + 1), item)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:227
                    self.pre.insert((i + 2), (preSplitted[1] if 1 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:228
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:228
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = (_hx_local_5 + (0 if ((item is None)) else len(item)))
                    _hx_local_4.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:229
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:231
                pre_len = next_pre_len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:235
        if (self.sb.get_length() == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:236
            self.add(item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:237
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:240
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(),[(pos - pre_len)])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:241
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:242
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:242
        _this = self.sb
        s = Std.string((sbSplitted[0] if 0 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:243
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:243
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:244
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:244
        _hx_local_6 = self
        _hx_local_7 = _hx_local_6.len
        _hx_local_6.len = (_hx_local_7 + (0 if ((item is None)) else len(item)))
        _hx_local_6.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:245
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:245
        _this = self.sb
        s = Std.string((sbSplitted[1] if 1 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:247
        return self

    def insertChar(self,pos,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:269
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must not be negative")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:270
        if (pos > self.len):
            raise haxe_Exception.thrown("[pos] must not be greater than this.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:272
        if (pos == self.len):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:273
            self.addChar(ch)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:274
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:282
        if (pos == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:283
            if (self.pre is None):
                self.pre = []
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:284
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:284
            _this = self.pre
            x = "".join(map(chr,[ch]))
            _this.insert(0, x)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:285
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:285
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = (_hx_local_1 + 1)
            _hx_local_1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:286
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:290
        pre_len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:291
        if (self.pre is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:292
            i = len(self.pre)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:293
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:293
            _g = 0
            _g1 = len(self.pre)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:294
                _hx_str = (self.pre[i] if i >= 0 and i < len(self.pre) else None)
                next_pre_len = (pre_len + ((0 if ((_hx_str is None)) else len(_hx_str))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:295
                if (next_pre_len == pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:296
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:296
                    _this = self.pre
                    x = "".join(map(chr,[ch]))
                    _this.insert((i + 1), x)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:297
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:297
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = (_hx_local_3 + 1)
                    _hx_local_3
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:298
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:300
                if (next_pre_len > pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:301
                    preSplitted = hx_strings_Strings.splitAt((self.pre[i] if i >= 0 and i < len(self.pre) else None),[(pos - pre_len)])
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:302
                    python_internal_ArrayImpl._set(self.pre, i, (preSplitted[0] if 0 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:303
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:303
                    _this1 = self.pre
                    x1 = "".join(map(chr,[ch]))
                    _this1.insert((i + 1), x1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:304
                    self.pre.insert((i + 2), (preSplitted[1] if 1 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:305
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:305
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = (_hx_local_5 + 1)
                    _hx_local_5
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:306
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:308
                pre_len = next_pre_len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:312
        if (self.sb.get_length() == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:313
            self.addChar(ch)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:314
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:317
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(),[(pos - pre_len)])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:318
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:319
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:319
        _this = self.sb
        s = Std.string((sbSplitted[0] if 0 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:320
        self.addChar(ch)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:321
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:321
        _this = self.sb
        s = Std.string((sbSplitted[1] if 1 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:323
        return self

    def insertAll(self,pos,items):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:337
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must not be negative")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:338
        if (pos > self.len):
            raise haxe_Exception.thrown("[pos] must not be greater than this.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:340
        if (pos == self.len):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:341
            self.addAll(items)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:342
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:356
        if (pos == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:357
            if (self.pre is None):
                self.pre = []
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:358
            i = len(items)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:359
            while True:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:359
                tmp = i
                i = (i - 1)
                if (not ((tmp > 0))):
                    break
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:360
                item = (items[i] if i >= 0 and i < len(items) else None)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:361
                self.pre.insert(0, item)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:362
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:362
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.len
                _hx_local_0.len = (_hx_local_1 + (0 if ((item is None)) else len(item)))
                _hx_local_0.len
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:364
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:368
        pre_len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:369
        if (self.pre is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:370
            i = len(self.pre)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:371
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:371
            _g = 0
            _g1 = len(self.pre)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:372
                _hx_str = (self.pre[i] if i >= 0 and i < len(self.pre) else None)
                next_pre_len = (pre_len + ((0 if ((_hx_str is None)) else len(_hx_str))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:373
                if (next_pre_len == pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:374
                    j = len(items)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:375
                    while True:
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:375
                        tmp = j
                        j = (j - 1)
                        if (not ((tmp > 0))):
                            break
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:376
                        item = (items[j] if j >= 0 and j < len(items) else None)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:377
                        self.pre.insert((i + 1), item)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:378
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:378
                        _hx_local_2 = self
                        _hx_local_3 = _hx_local_2.len
                        _hx_local_2.len = (_hx_local_3 + (0 if ((item is None)) else len(item)))
                        _hx_local_2.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:380
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:382
                if (next_pre_len > pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:383
                    preSplitted = hx_strings_Strings.splitAt((self.pre[i] if i >= 0 and i < len(self.pre) else None),[(pos - pre_len)])
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:384
                    python_internal_ArrayImpl._set(self.pre, i, (preSplitted[0] if 0 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:385
                    self.pre.insert((i + 1), (preSplitted[1] if 1 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:386
                    j1 = len(items)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:387
                    while True:
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:387
                        tmp1 = j1
                        j1 = (j1 - 1)
                        if (not ((tmp1 > 0))):
                            break
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:388
                        item1 = (items[j1] if j1 >= 0 and j1 < len(items) else None)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:389
                        self.pre.insert((i + 1), item1)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:390
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:390
                        _hx_local_4 = self
                        _hx_local_5 = _hx_local_4.len
                        _hx_local_4.len = (_hx_local_5 + (0 if ((item1 is None)) else len(item1)))
                        _hx_local_4.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:392
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:394
                pre_len = next_pre_len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:398
        if (self.sb.get_length() == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:399
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:399
            _g = 0
            while (_g < len(items)):
                item = (items[_g] if _g >= 0 and _g < len(items) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:400
                self.add(item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:401
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:404
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(),[(pos - pre_len)])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:405
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:406
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:406
        _this = self.sb
        s = Std.string((sbSplitted[0] if 0 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:407
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:407
        _g = 0
        while (_g < len(items)):
            item = (items[_g] if _g >= 0 and _g < len(items) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:408
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:408
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:409
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:409
            _hx_local_8 = self
            _hx_local_9 = _hx_local_8.len
            _hx_local_8.len = (_hx_local_9 + (0 if ((item is None)) else len(item)))
            _hx_local_8.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:411
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:411
        _this = self.sb
        s = Std.string((sbSplitted[1] if 1 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:413
        return self

    def asOutput(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:425
        return hx_strings__StringBuilder_OutputWrapper(self)

    def toString(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:443
        if (self.pre is None):
            return self.sb.b.getvalue()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:445
        _this = self.pre
        _hx_str = (HxOverrides.stringOrNull("".join([python_Boot.toString1(x1,'') for x1 in _this])) + HxOverrides.stringOrNull(self.sb.b.getvalue()))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:446
        self.clear()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:447
        self.add(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:448
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.pre = None
        _hx_o.len = None


class hx_strings__StringBuilder_OutputWrapper(haxe_io_Output):
    _hx_class_name = "hx.strings._StringBuilder.OutputWrapper"
    __slots__ = ("sb", "bo")
    _hx_fields = ["sb", "bo"]
    _hx_methods = ["flush", "writeByte", "writeString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output


    def __init__(self,sb):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:457
        self.bo = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:461
        self.sb = sb

    def flush(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:466
        if ((self.bo is not None) and ((len(self.bo.b.b) > 0))):
            self.sb.add(self.bo.getBytes().toString())

    def writeByte(self,c):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:475
        if (self.bo is None):
            self.bo = haxe_io_BytesOutput()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:476
        self.bo.writeByte(c)

    def writeString(self,_hx_str,encoding = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:483
        self.flush()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:484
        self.sb.add(_hx_str)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.bo = None


class hx_strings_internal_OS:
    _hx_class_name = "hx.strings.internal.OS"
    __slots__ = ()
    _hx_statics = ["isWindows"]

class hx_strings_internal__Either3__Either3(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.internal._Either3._Either3"
    _hx_constructs = ["a", "b", "c"]

    @staticmethod
    def a(v):
        return hx_strings_internal__Either3__Either3("a", 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either3__Either3("b", 1, (v,))

    @staticmethod
    def c(v):
        return hx_strings_internal__Either3__Either3("c", 2, (v,))


class hx_strings_Strings:
    _hx_class_name = "hx.strings.Strings"
    __slots__ = ()
    _hx_statics = ["REGEX_ANSI_ESC", "REGEX_HTML_UNESCAPE", "REGEX_SPLIT_LINES", "REGEX_REMOVE_XML_TAGS", "POS_NOT_FOUND", "NEW_LINE_NIX", "NEW_LINE_WIN", "NEW_LINE", "_getNotFoundDefault", "_charCodeAt8Unsafe", "_splitAsciiWordsUnsafe", "ansiToHtml", "appendIfMissing", "base64Encode", "base64Decode", "charAt8", "charCodeAt8", "compact", "contains", "containsOnly", "containsAll", "containsAllIgnoreCase", "containsAny", "containsAnyIgnoreCase", "containsNone", "containsNoneIgnoreCase", "containsWhitespaces", "countMatches", "countMatchesIgnoreCase", "compare", "compareIgnoreCase", "diff", "diffAt", "ellipsizeLeft", "ellipsizeMiddle", "ellipsizeRight", "endsWith", "endsWithAny", "endsWithAnyIgnoreCase", "endsWithIgnoreCase", "equals", "equalsIgnoreCase", "filter", "filterChars", "getFuzzyDistance", "getLevenshteinDistance", "getLongestCommonSubstring", "hashCode", "htmlDecode", "htmlEncode", "insertAt", "ifBlank", "ifEmpty", "ifNull", "indentLines", "indexOf8", "isBlank", "isDigits", "isEmpty", "isNotBlank", "isNotEmpty", "isLowerCase", "isUpperCase", "iterate", "iterateChars", "lastIndexOf8", "length8", "left", "lpad", "map", "prependIfMissing", "quoteDouble", "quoteSingle", "removeAfter", "removeAfterLast", "removeAfterIgnoreCase", "removeAfterLastIgnoreCase", "removeAt", "removeBefore", "removeBeforeLast", "removeBeforeIgnoreCase", "removeBeforeLastIgnoreCase", "removeAll", "removeFirst", "removeFirstIgnoreCase", "removeAnsi", "removeLeading", "removeTags", "removeTrailing", "repeat", "replaceAll", "replaceFirst", "replaceFirstIgnoreCase", "reverse", "right", "rpad", "split8", "splitAt", "splitEvery", "splitLines", "startsWith", "startsWithAny", "startsWithAnyIgnoreCase", "startsWithIgnoreCase", "substr8", "substring8", "substringAfter", "substringAfterIgnoreCase", "substringBetween", "substringBetweenIgnoreCase", "substringAfterLast", "substringAfterLastIgnoreCase", "substringBefore", "substringBeforeIgnoreCase", "substringBeforeLast", "substringBeforeLastIgnoreCase", "toBool", "toBytes", "toChar", "toCharIterator", "toChars", "toPattern", "toEReg", "toFloat", "toHex", "toInt", "toLowerCase8", "toLowerCaseFirstChar", "toLowerCamel", "toLowerHyphen", "toLowerUnderscore", "toTitle", "toUpperCamel", "toUpperUnderscore", "toString", "toUpperCase8", "toUpperCaseFirstChar", "trim", "trimRight", "trimLeft", "trimLines", "trimToNull", "trimToEmpty", "truncate", "urlDecode", "urlEncode", "wrap"]

    @staticmethod
    def _getNotFoundDefault(_hx_str,notFoundDefault):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:63
        notFoundDefault1 = notFoundDefault
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:64
        if (notFoundDefault1 == 1):
            return None
        elif (notFoundDefault1 == 2):
            return ""
        elif (notFoundDefault1 == 3):
            return _hx_str
        else:
            pass

    @staticmethod
    def _charCodeAt8Unsafe(_hx_str,pos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:79
        return HxString.charCodeAt(_hx_str,pos)

    @staticmethod
    def _splitAsciiWordsUnsafe(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:90
        words = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:91
        currentWord = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:93
        chars = hx_strings_Strings.toChars(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:95
        _hx_len = len(chars)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:96
        lastIndex = (_hx_len - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:97
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:97
        _g = 0
        _g1 = _hx_len
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:98
            ch = (chars[i] if i >= 0 and i < len(chars) else None)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:99
            if (((ch > 64) and ((ch < 91))) or (((ch > 96) and ((ch < 123))))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:100
                chNext = (python_internal_ArrayImpl._get(chars, (i + 1)) if ((i < lastIndex)) else -1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:101
                currentWord.addChar(ch)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:102
                if ((chNext > 47) and ((chNext < 58))):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:103
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:103
                    x = currentWord.toString()
                    words.append(x)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:104
                    currentWord.clear()
                elif (ch in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h):
                    if ((chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h) and ((len(chars) > ((i + 2))))):
                        if (not (python_internal_ArrayImpl._get(chars, (i + 2)) in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h)):
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:108
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:108
                            x1 = currentWord.toString()
                            words.append(x1)
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:109
                            currentWord.clear()
                elif (chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:114
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:114
                    x2 = currentWord.toString()
                    words.append(x2)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:115
                    currentWord.clear()
            elif ((ch > 47) and ((ch < 58))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:119
                currentWord.addChar(ch)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:120
                chNext1 = (python_internal_ArrayImpl._get(chars, (i + 1)) if ((i < lastIndex)) else -1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:121
                if (not (((chNext1 > 47) and ((chNext1 < 58))))):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:122
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:122
                    x3 = currentWord.toString()
                    words.append(x3)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:123
                    currentWord.clear()
            elif (currentWord.len > 0):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:126
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:126
                x4 = currentWord.toString()
                words.append(x4)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:127
                currentWord.clear()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:131
        if (currentWord.len > 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:132
            x = currentWord.toString()
            words.append(x)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:133
        return words

    @staticmethod
    def ansiToHtml(_hx_str,renderMethod = None,initialState = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:167
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:170
        if (renderMethod is None):
            renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:171
        styleOrClassAttribute = None
        styleOrClassAttribute1 = renderMethod.index
        if (styleOrClassAttribute1 == 0):
            styleOrClassAttribute = "style"
        elif (styleOrClassAttribute1 == 1):
            styleOrClassAttribute = "class"
        elif (styleOrClassAttribute1 == 2):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:174
            cb = renderMethod.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:171
            styleOrClassAttribute = "class"
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:177
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:179
        if ((initialState is not None) and ((((((initialState.fgcolor is not None) or ((initialState.bgcolor is not None))) or initialState.bold) or initialState.underline) or initialState.blink))):
            sb.add((("<span " + ("null" if styleOrClassAttribute is None else styleOrClassAttribute)) + "=\"")).add(initialState.toCSS(renderMethod)).add("\">")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:182
        effectiveState = hx_strings_AnsiState(initialState)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:183
        strLenMinus1 = (((0 if ((_hx_str is None)) else len(_hx_str))) - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:184
        i = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:185
        lookAhead = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:186
        while (i < strLenMinus1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:187
            i = (i + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:188
            ch = HxString.charCodeAt(_hx_str,i)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:189
            if (((ch == 27) and ((i < strLenMinus1))) and ((HxString.charCodeAt(_hx_str,(i + 1)) == 91))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:190
                lookAhead.clear()
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:191
                currentState = hx_strings_AnsiState(effectiveState)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:192
                currentGraphicModeParam = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:193
                isValidEscapeSequence = False
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:194
                i = (i + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:195
                while (i < strLenMinus1):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:196
                    i = (i + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:197
                    ch2 = HxString.charCodeAt(_hx_str,i)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:198
                    lookAhead.addChar(ch2)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:199
                    ch21 = ch2
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:200
                    if (ch21 == 48):
                        currentGraphicModeParam = (currentGraphicModeParam * 10)
                    elif (ch21 == 49):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 1)
                    elif (ch21 == 50):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 2)
                    elif (ch21 == 51):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 3)
                    elif (ch21 == 52):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 4)
                    elif (ch21 == 53):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 5)
                    elif (ch21 == 54):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 6)
                    elif (ch21 == 55):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 7)
                    elif (ch21 == 56):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 8)
                    elif (ch21 == 57):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 9)
                    elif (ch21 == 59):
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:211
                        currentState.setGraphicModeParameter(currentGraphicModeParam)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:212
                        currentGraphicModeParam = 0
                    elif (ch21 == 109):
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:214
                        currentState.setGraphicModeParameter(currentGraphicModeParam)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:215
                        if (((((effectiveState.fgcolor is not None) or ((effectiveState.bgcolor is not None))) or effectiveState.bold) or effectiveState.underline) or effectiveState.blink):
                            sb.add("</span>")
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:217
                        if (((((currentState.fgcolor is not None) or ((currentState.bgcolor is not None))) or currentState.bold) or currentState.underline) or currentState.blink):
                            sb.add((("<span " + ("null" if styleOrClassAttribute is None else styleOrClassAttribute)) + "=\"")).add(currentState.toCSS(renderMethod)).add("\">")
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:219
                        effectiveState = currentState
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:220
                        isValidEscapeSequence = True
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:221
                        break
                    else:
                        break
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:227
                if (not isValidEscapeSequence):
                    sb.addChar(27).add("[").add(Std.string(lookAhead))
            else:
                sb.addChar(ch)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:235
        if (((((effectiveState.fgcolor is not None) or ((effectiveState.bgcolor is not None))) or effectiveState.bold) or effectiveState.underline) or effectiveState.blink):
            sb.add("</span>")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:238
        return sb.toString()

    @staticmethod
    def appendIfMissing(_hx_str,suffix):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:256
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:259
        if (len(_hx_str) == 0):
            return (("null" if _hx_str is None else _hx_str) + ("null" if suffix is None else suffix))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:262
        if hx_strings_Strings.endsWith(_hx_str,suffix):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:265
        return (("null" if _hx_str is None else _hx_str) + ("null" if suffix is None else suffix))

    @staticmethod
    def base64Encode(plain):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:279
        if (plain is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:285
        return haxe_crypto_Base64.encode((None if ((plain is None)) else haxe_io_Bytes.ofString(plain)))

    @staticmethod
    def base64Decode(encoded):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:300
        if (encoded is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:306
        return haxe_crypto_Base64.decode(encoded).toString()

    @staticmethod
    def charAt8(_hx_str,pos,resultIfOutOfBound = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:331
        if (resultIfOutOfBound is None):
            resultIfOutOfBound = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:332
        if ((((_hx_str is None) or ((len(_hx_str) == 0))) or ((pos < 0))) or ((pos >= ((0 if ((_hx_str is None)) else len(_hx_str)))))):
            return resultIfOutOfBound
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:335
        if ((pos < 0) or ((pos >= len(_hx_str)))):
            return ""
        else:
            return _hx_str[pos]

    @staticmethod
    def charCodeAt8(_hx_str,pos,resultIfOutOfBound = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:368
        if (resultIfOutOfBound is None):
            resultIfOutOfBound = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:369
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:370
        if (((strLen == 0) or ((pos < 0))) or ((pos >= strLen))):
            return resultIfOutOfBound
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:373
        return HxString.charCodeAt(_hx_str,pos)

    @staticmethod
    def compact(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:389
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:392
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:393
        needWhiteSpace = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:394
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:394
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while (_g < len(_g1)):
            char = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:395
            if (((char > 8) and ((char < 14))) or ((char == 32))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:396
                if (sb.len != 0):
                    needWhiteSpace = True
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:398
                continue
            elif needWhiteSpace:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:400
                sb.addChar(32)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:401
                needWhiteSpace = False
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:403
            sb.addChar(char)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:405
        return sb.toString()

    @staticmethod
    def contains(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:426
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:428
        if (searchFor == ""):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:431
        startIndex = None
        return (((searchIn.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor,startIndex))) > -1)

    @staticmethod
    def containsOnly(searchIn,allowedChars):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:450
        if ((searchIn is None) or ((len(searchIn) == 0))):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:453
        if (allowedChars is None):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:456
        allowedCharsArray = None
        _g = allowedChars
        allowedCharsArray1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:457
        if (allowedCharsArray1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:457
            _hx_str = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:456
            allowedCharsArray = hx_strings_Strings.toChars(_hx_str)
        elif (allowedCharsArray1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:458
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:456
            allowedCharsArray = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:461
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:461
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while (_g < len(_g1)):
            ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:462
            if (python_internal_ArrayImpl.indexOf(allowedCharsArray,ch,None) < 0):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:465
        return True

    @staticmethod
    def containsAll(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:487
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:490
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:490
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:491
            tmp = None
            if ((searchIn is None) or ((candidate is None))):
                tmp = False
            elif (candidate == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(candidate) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,candidate,startIndex))) > -1)
            if (not tmp):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:494
        return True

    @staticmethod
    def containsAllIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:516
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:519
        searchIn = searchIn.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:521
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:521
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:522
            searchFor1 = candidate.lower()
            tmp = None
            if ((searchIn is None) or ((searchFor1 is None))):
                tmp = False
            elif (searchFor1 == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(searchFor1) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor1,startIndex))) > -1)
            if (not tmp):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:525
        return True

    @staticmethod
    def containsAny(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:548
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:551
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:551
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:552
            tmp = None
            if ((searchIn is None) or ((candidate is None))):
                tmp = False
            elif (candidate == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(candidate) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,candidate,startIndex))) > -1)
            if tmp:
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:555
        return False

    @staticmethod
    def containsAnyIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:577
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:580
        searchIn = searchIn.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:582
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:582
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:583
            searchFor1 = candidate.lower()
            tmp = None
            if ((searchIn is None) or ((searchFor1 is None))):
                tmp = False
            elif (searchFor1 == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(searchFor1) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor1,startIndex))) > -1)
            if tmp:
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:586
        return False

    @staticmethod
    def containsNone(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:609
        return (not hx_strings_Strings.containsAny(searchIn,searchFor))

    @staticmethod
    def containsNoneIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:631
        return (not hx_strings_Strings.containsAnyIgnoreCase(searchIn,searchFor))

    @staticmethod
    def containsWhitespaces(searchIn):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:648
        if (searchIn is None):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:651
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:651
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while (_g < len(_g1)):
            ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:652
            if (((ch > 8) and ((ch < 14))) or ((ch == 32))):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:656
        return False

    @staticmethod
    def countMatches(searchIn,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:676
        if (startAt is None):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:677
        if ((((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))) or ((startAt >= len(searchIn)))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:680
        if (startAt < 0):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:683
        count = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:684
        foundAt = ((startAt - 1) if ((startAt > -1)) else 0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:685
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:685
            startIndex = (foundAt + 1)
            foundAt = (searchIn.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor,startIndex))
            if (not ((foundAt > -1))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:686
            count = (count + 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:687
        return count

    @staticmethod
    def countMatchesIgnoreCase(searchIn,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:707
        if (startAt is None):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:708
        if ((((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))) or ((startAt >= len(searchIn)))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:711
        if (startAt < 0):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:714
        searchIn = searchIn.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:715
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:717
        count = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:718
        foundAt = ((startAt - 1) if ((startAt > -1)) else 0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:719
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:719
            startIndex = (foundAt + 1)
            foundAt = (searchIn.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor,startIndex))
            if (not ((foundAt > -1))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:720
            count = (count + 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:721
        return count

    @staticmethod
    def compare(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:744
        if (_hx_str is None):
            if (other is None):
                return 0
            else:
                return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:747
        if (other is None):
            if (_hx_str is None):
                return 0
            else:
                return 1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:751
        if (_hx_str > other):
            return 1
        elif (_hx_str == other):
            return 0
        else:
            return -1

    @staticmethod
    def compareIgnoreCase(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:777
        if (_hx_str is None):
            if (other is None):
                return 0
            else:
                return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:780
        if (other is None):
            if (_hx_str is None):
                return 0
            else:
                return 1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:783
        _hx_str = hx_strings_Strings.toLowerCase8(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:784
        other = hx_strings_Strings.toLowerCase8(other)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:787
        if (_hx_str > other):
            return 1
        elif (_hx_str == other):
            return 0
        else:
            return -1

    @staticmethod
    def diff(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:807
        diff = hx_strings_StringDiff()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:808
        diff.at = hx_strings_Strings.diffAt(left,right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:809
        diff.left = hx_strings_Strings.substr8(left,diff.at)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:810
        diff.right = hx_strings_Strings.substr8(right,diff.at)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:811
        return diff

    @staticmethod
    def diffAt(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:833
        if (_hx_str == other):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:836
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:837
        otherLen = (0 if ((other is None)) else len(other))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:839
        if ((strLen == 0) or ((otherLen == 0))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:842
        checkLen = (otherLen if ((strLen > otherLen)) else strLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:844
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:844
        _g = 0
        _g1 = checkLen
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:845
            if (HxString.charCodeAt(_hx_str,i) != HxString.charCodeAt(other,i)):
                return i
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:847
        return checkLen

    @staticmethod
    def ellipsizeLeft(_hx_str,maxLength,ellipsis = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:865
        if (ellipsis is None):
            ellipsis = "..."
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:866
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLength):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:869
        ellipsisLen = (0 if ((ellipsis is None)) else len(ellipsis))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:870
        if (maxLength < ellipsisLen):
            raise haxe_Exception.thrown(("[maxLength] must not be smaller than " + Std.string(ellipsisLen)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:872
        return (("null" if ellipsis is None else ellipsis) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,(maxLength - ellipsisLen))))

    @staticmethod
    def ellipsizeMiddle(_hx_str,maxLength,ellipsis = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:890
        if (ellipsis is None):
            ellipsis = "..."
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:891
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:892
        if (strLen <= maxLength):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:895
        ellipsisLen = (0 if ((ellipsis is None)) else len(ellipsis))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:896
        if (maxLength < ellipsisLen):
            raise haxe_Exception.thrown(("[maxLength] must not be smaller than " + Std.string(ellipsisLen)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:898
        maxStrLen = (maxLength - ellipsisLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:899
        leftLen = Math.floor(((maxStrLen / 2) + 0.5))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:900
        rightLen = (maxStrLen - leftLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:902
        return ((HxOverrides.stringOrNull(((_hx_str if ((((0 if ((_hx_str is None)) else len(_hx_str))) <= leftLen)) else hx_strings_Strings.substring8(_hx_str,0,leftLen)))) + ("null" if ellipsis is None else ellipsis)) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,rightLen)))

    @staticmethod
    def ellipsizeRight(_hx_str,maxLength,ellipsis = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:920
        if (ellipsis is None):
            ellipsis = "..."
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:921
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLength):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:924
        ellipsisLen = (0 if ((ellipsis is None)) else len(ellipsis))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:925
        if (maxLength < ellipsisLen):
            raise haxe_Exception.thrown(("[maxLength] must not be smaller than " + Std.string(ellipsisLen)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:927
        _hx_len = (maxLength - ellipsisLen)
        return (HxOverrides.stringOrNull(((_hx_str if ((((0 if ((_hx_str is None)) else len(_hx_str))) <= _hx_len)) else hx_strings_Strings.substring8(_hx_str,0,_hx_len)))) + ("null" if ellipsis is None else ellipsis))

    @staticmethod
    def endsWith(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:944
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:953
        return searchIn.endswith(searchFor)

    @staticmethod
    def endsWithAny(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:972
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:975
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:975
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:976
            if ((candidate is not None) and hx_strings_Strings.endsWith(searchIn,candidate)):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:978
        return False

    @staticmethod
    def endsWithAnyIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:997
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1000
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1001
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1001
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1002
            if ((candidate is not None) and hx_strings_Strings.endsWith(searchIn,hx_strings_Strings.toLowerCase8(candidate))):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1004
        return False

    @staticmethod
    def endsWithIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1022
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1025
        return hx_strings_Strings.endsWith(searchIn.lower(),searchFor.lower())

    @staticmethod
    def equals(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1046
        return (_hx_str == other)

    @staticmethod
    def equalsIgnoreCase(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1066
        return (hx_strings_Strings.toLowerCase8(_hx_str) == hx_strings_Strings.toLowerCase8(other))

    @staticmethod
    def filter(_hx_str,_hx_filter,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1081
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1082
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1085
        _this = list(filter(_hx_filter,hx_strings_Strings.split8(_hx_str,[separator])))
        return separator.join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def filterChars(_hx_str,_hx_filter):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1101
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1104
        def _hx_local_0(ch):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1104
            return "".join(map(chr,[ch]))
        _this = list(map(_hx_local_0,list(filter(_hx_filter,hx_strings_Strings.toChars(_hx_str)))))
        return "".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def getFuzzyDistance(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1130
        if (((left is None) or ((len(left) == 0))) or (((right is None) or ((len(right) == 0))))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1133
        left = hx_strings_Strings.toLowerCase8(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1134
        right = hx_strings_Strings.toLowerCase8(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1136
        leftChars = hx_strings_Strings.toChars(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1137
        rightChars = hx_strings_Strings.toChars(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1138
        leftLastMatchAt = -100
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1139
        rightLastMatchAt = -100
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1141
        score = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1143
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1143
        _g = 0
        _g1 = len(leftChars)
        while (_g < _g1):
            leftIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1144
            leftChar = (leftChars[leftIdx] if leftIdx >= 0 and leftIdx < len(leftChars) else None)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1145
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1145
            _g2 = ((rightLastMatchAt + 1) if ((rightLastMatchAt > -1)) else 0)
            _g3 = len(rightChars)
            while (_g2 < _g3):
                rightIdx = _g2
                _g2 = (_g2 + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1146
                rightChar = (rightChars[rightIdx] if rightIdx >= 0 and rightIdx < len(rightChars) else None)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1147
                if (leftChar == rightChar):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1148
                    score = (score + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1149
                    if ((leftLastMatchAt == ((leftIdx - 1))) and ((rightLastMatchAt == ((rightIdx - 1))))):
                        score = (score + 2)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1151
                    leftLastMatchAt = leftIdx
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1152
                    rightLastMatchAt = rightIdx
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1153
                    break
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1158
        return score

    @staticmethod
    def getLevenshteinDistance(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1185
        leftLen = (0 if ((left is None)) else len(left))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1186
        rightLen = (0 if ((right is None)) else len(right))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1188
        if (leftLen == 0):
            return rightLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1189
        if (rightLen == 0):
            return leftLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1191
        if (leftLen > rightLen):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1193
            tmp = left
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1194
            left = right
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1195
            right = tmp
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1196
            tmpLen = leftLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1197
            leftLen = rightLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1198
            rightLen = tmpLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1201
        prevCosts = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1202
        costs = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1204
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1204
        _g = 0
        _g1 = (leftLen + 1)
        while (_g < _g1):
            leftIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1205
            prevCosts.append(leftIdx)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1206
            costs.append(0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1209
        leftChars = hx_strings_Strings.toChars(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1210
        rightChars = hx_strings_Strings.toChars(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1212
        def _hx_local_0(a,b):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1212
            if (a > b):
                return b
            else:
                return a
        _hx_min = _hx_local_0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1214
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1214
        _g = 1
        _g1 = (rightLen + 1)
        while (_g < _g1):
            rightIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1215
            rightChar = python_internal_ArrayImpl._get(rightChars, (rightIdx - 1))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1216
            python_internal_ArrayImpl._set(costs, 0, rightIdx)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1218
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1218
            _g2 = 1
            _g3 = (leftLen + 1)
            while (_g2 < _g3):
                leftIdx = _g2
                _g2 = (_g2 + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1219
                leftIdxMinus1 = (leftIdx - 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1220
                cost = (0 if (((leftChars[leftIdxMinus1] if leftIdxMinus1 >= 0 and leftIdxMinus1 < len(leftChars) else None) == rightChar)) else 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1221
                python_internal_ArrayImpl._set(costs, leftIdx, _hx_min(_hx_min(((costs[leftIdxMinus1] if leftIdxMinus1 >= 0 and leftIdxMinus1 < len(costs) else None) + 1),((prevCosts[leftIdx] if leftIdx >= 0 and leftIdx < len(prevCosts) else None) + 1)),((prevCosts[leftIdxMinus1] if leftIdxMinus1 >= 0 and leftIdxMinus1 < len(prevCosts) else None) + cost)))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1224
            tmp = prevCosts
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1225
            prevCosts = costs
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1226
            costs = tmp
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1229
        return (prevCosts[leftLen] if leftLen >= 0 and leftLen < len(prevCosts) else None)

    @staticmethod
    def getLongestCommonSubstring(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1249
        if ((left is None) or ((right is None))):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1252
        leftLen = (0 if ((left is None)) else len(left))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1253
        rightLen = (0 if ((right is None)) else len(right))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1255
        if ((leftLen == 0) or ((rightLen == 0))):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1258
        leftChars = hx_strings_Strings.toChars(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1259
        rightChars = hx_strings_Strings.toChars(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1261
        leftSubStartAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1262
        leftSubLen = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1264
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1264
        _g = 0
        _g1 = leftLen
        while (_g < _g1):
            leftIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1265
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1265
            _g2 = 0
            _g3 = rightLen
            while (_g2 < _g3):
                rightIdx = _g2
                _g2 = (_g2 + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1266
                currLen = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1267
                while (python_internal_ArrayImpl._get(leftChars, (leftIdx + currLen)) == python_internal_ArrayImpl._get(rightChars, (rightIdx + currLen))):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1268
                    currLen = (currLen + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1269
                    if (((leftIdx + currLen) >= leftLen) or (((rightIdx + currLen) >= rightLen))):
                        break
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1272
                if (currLen > leftSubLen):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1273
                    leftSubLen = currLen
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1274
                    leftSubStartAt = leftIdx
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1278
        return hx_strings_Strings.substr8(left,leftSubStartAt,leftSubLen)

    @staticmethod
    def hashCode(_hx_str,algo = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1297
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1300
        if (algo is None):
            algo = hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1302
        if (algo is None):
            return hash(_hx_str)
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1302
            tmp = algo.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1304
            if (tmp == 1):
                return haxe_crypto_Adler32.make((None if ((_hx_str is None)) else haxe_io_Bytes.ofString(_hx_str)))
            elif (tmp == 2):
                return haxe_crypto_Crc32.make((None if ((_hx_str is None)) else haxe_io_Bytes.ofString(_hx_str)))
            elif (tmp == 3):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1310
                hc = 5381
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1311
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1311
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while (_g < len(_g1)):
                    ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                    _g = (_g + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1312
                    hc = (((((((((((hc << 5)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + hc) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) ^ ch)) + (2 ** 31)) % (2 ** 32) - (2 ** 31))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1313
                return hc
            elif (tmp == 4):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1316
                hc = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1317
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1317
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while (_g < len(_g1)):
                    ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                    _g = (_g + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1318
                    hc = ((((((((((hc << 5)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) - hc) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + ch) + (2 ** 31)) % (2 ** 32) - (2 ** 31))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1319
                return hc
            elif (tmp == 5):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1322
                hc = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1323
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1323
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while (_g < len(_g1)):
                    ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                    _g = (_g + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1324
                    hc = (((((((((((((hc << 6)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + (((((hc << 16)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)))) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) - hc) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + ch) + (2 ** 31)) % (2 ** 32) - (2 ** 31))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1325
                return hc
            else:
                return hash(_hx_str)

    @staticmethod
    def htmlDecode(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1365
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1368
        _this = hx_strings_Strings.REGEX_HTML_UNESCAPE
        def _hx_local_2():
            def _hx_local_1(m):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1369
                match = m.matched()
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1370
                match1 = match
                _hx_local_0 = len(match1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1371
                if (_hx_local_0 == 5):
                    if (match1 == "&amp;"):
                        return "&"
                    else:
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1378
                        this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                        return "".join(map(chr,[this1]))
                elif (_hx_local_0 == 4):
                    if (match1 == "&gt;"):
                        return ">"
                    elif (match1 == "&lt;"):
                        return "<"
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                        return "".join(map(chr,[this1]))
                elif (_hx_local_0 == 6):
                    if (match1 == "&apos;"):
                        return "'"
                    elif (match1 == "&nbsp;"):
                        return " "
                    elif (match1 == "&quot;"):
                        return "\""
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                        return "".join(map(chr,[this1]))
                else:
                    this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                    return "".join(map(chr,[this1]))
            return hx_strings__Pattern_MatcherImpl(_this.ereg,_this.pattern,_this.options,_hx_str).map(_hx_local_1)
        return _hx_local_2()

    @staticmethod
    def htmlEncode(_hx_str,escapeQuotes = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1401
        if (escapeQuotes is None):
            escapeQuotes = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1402
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1405
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1406
        isFirstSpace = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1407
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1407
        _g = 0
        _g1 = (0 if ((_hx_str is None)) else len(_hx_str))
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1408
            ch = HxString.charCodeAt(_hx_str,i)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1409
            ch1 = ch
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1411
            if (ch1 == 32):
                if isFirstSpace:
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1412
                    sb.add(" ")
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1413
                    isFirstSpace = False
                else:
                    sb.add("&nbsp;")
            elif (ch1 == 34):
                sb.add(("&quot;" if escapeQuotes else "\""))
            elif (ch1 == 38):
                sb.add("&amp;")
            elif (ch1 == 39):
                sb.add(("&#039;" if escapeQuotes else "'"))
            elif (ch1 == 60):
                sb.add("&lt;")
            elif (ch1 == 62):
                sb.add("&gt;")
            elif (ch > 127):
                sb.add("&#").add(Std.string(ch)).add(";")
            else:
                sb.addChar(ch)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1440
            if (ch != 32):
                isFirstSpace = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1444
        return sb.toString()

    @staticmethod
    def insertAt(_hx_str,pos,insertion):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1467
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1470
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1471
        if (pos < 0):
            pos = (strLen + pos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1473
        if ((pos < 0) or ((pos > strLen))):
            raise haxe_Exception.thrown("Absolute value of [pos] must be <= str.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1476
        if ((insertion is None) or ((len(insertion) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1479
        return ((HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,0,pos)) + Std.string(insertion)) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,pos)))

    @staticmethod
    def ifBlank(_hx_str,fallback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1501
        if (True if ((_hx_str is None)) else (len(StringTools.trim(_hx_str)) == 0)):
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifEmpty(_hx_str,fallback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1522
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifNull(_hx_str,fallback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1540
        if (_hx_str is None):
            return fallback
        else:
            return _hx_str

    @staticmethod
    def indentLines(_hx_str,indentWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1558
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1561
        if ((len(_hx_str) == 0) or (((indentWith is None) or ((len(indentWith) == 0))))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1564
        isFirstLine = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1565
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1566
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1566
        _g = 0
        _g1 = hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)
        while (_g < len(_g1)):
            line = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1567
            if isFirstLine:
                isFirstLine = False
            else:
                sb.newLine()
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1571
            sb.add(indentWith)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1572
            sb.add(line)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1574
        return sb.toString()

    @staticmethod
    def indexOf8(_hx_str,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1623
        if (startAt is None):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1624
        if ((_hx_str is None) or ((searchFor is None))):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1627
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1628
        searchForLen = (0 if ((searchFor is None)) else len(searchFor))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1631
        if (startAt < 0):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1635
        if (searchForLen == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1636
            if (startAt == 0):
                return 0
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1638
            if ((startAt > 0) and ((startAt < strLen))):
                return startAt
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1641
            return strLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1645
        if (startAt >= strLen):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1649
        if (startAt is None):
            return _hx_str.find(searchFor)
        else:
            return HxString.indexOfImpl(_hx_str,searchFor,startAt)

    @staticmethod
    def isBlank(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1695
        if (_hx_str is None):
            return True
        else:
            return (len(StringTools.trim(_hx_str)) == 0)

    @staticmethod
    def isDigits(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1716
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1719
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1719
        _g = 0
        _g1 = (0 if ((_hx_str is None)) else len(_hx_str))
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1720
            this1 = HxString.charCodeAt(_hx_str,i)
            if (not (((this1 > 47) and ((this1 < 58))))):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1723
        return True

    @staticmethod
    def isEmpty(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1742
        if (_hx_str is not None):
            return (len(_hx_str) == 0)
        else:
            return True

    @staticmethod
    def isNotBlank(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1759
        if (_hx_str is not None):
            return (len(StringTools.trim(_hx_str)) > 0)
        else:
            return False

    @staticmethod
    def isNotEmpty(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1776
        if (_hx_str is not None):
            return (len(_hx_str) > 0)
        else:
            return False

    @staticmethod
    def isLowerCase(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1790
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1793
        return (_hx_str == hx_strings_Strings.toLowerCase8(_hx_str))

    @staticmethod
    def isUpperCase(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1808
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1811
        return (_hx_str == hx_strings_Strings.toUpperCase8(_hx_str))

    @staticmethod
    def iterate(_hx_str,callback,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1818
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1819
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1822
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1822
        _g = 0
        _g1 = hx_strings_Strings.split8(_hx_str,[separator])
        while (_g < len(_g1)):
            sub = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1823
            callback(sub)

    @staticmethod
    def iterateChars(_hx_str,callback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1831
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1834
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1834
        _g = 0
        _g1 = (0 if ((_hx_str is None)) else len(_hx_str))
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1835
            callback(HxString.charCodeAt(_hx_str,i))

    @staticmethod
    def lastIndexOf8(_hx_str,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1888
        if ((_hx_str is None) or ((searchFor is None))):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1891
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1892
        searchForLen = (0 if ((searchFor is None)) else len(searchFor))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1894
        if (startAt is None):
            startAt = strLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1898
        if (searchForLen == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1899
            if (startAt < 0):
                return 0
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1901
            if (startAt > strLen):
                return strLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1903
            return startAt
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1907
        if (startAt < 0):
            return -1
        elif (startAt >= strLen):
            startAt = (strLen - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1917
        strNeedsUTF8Workaround = (len(_hx_str) != strLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1918
        searchForNeedsUTF8Workaround = (len(searchFor) != searchForLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1926
        if (searchForNeedsUTF8Workaround and (not strNeedsUTF8Workaround)):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1930
        searchForChars = hx_strings_Strings.toChars(searchFor)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1931
        startAt = (startAt + ((searchForLen - 1)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1933
        searchForPosToCheck = (searchForLen - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1934
        strPos = strLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1935
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1935
            tmp = strPos
            strPos = (strPos - 1)
            if (not ((tmp > 0))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1936
            if (strPos > startAt):
                continue
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1937
            strCh = HxString.charCodeAt(_hx_str,strPos)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1939
            if (strCh == (searchForChars[searchForPosToCheck] if searchForPosToCheck >= 0 and searchForPosToCheck < len(searchForChars) else None)):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1940
                if (searchForPosToCheck == 0):
                    return strPos
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1942
                searchForPosToCheck = (searchForPosToCheck - 1)
            else:
                searchForPosToCheck = (searchForLen - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1946
        return -1

    @staticmethod
    def length8(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1963
        if (_hx_str is None):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1967
        return len(_hx_str)

    @staticmethod
    def left(_hx_str,_hx_len):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1990
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= _hx_len):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1993
        return hx_strings_Strings.substring8(_hx_str,0,_hx_len)

    @staticmethod
    def lpad(_hx_str,targetLength,padStr = None,canOverflow = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2016
        if (padStr is None):
            padStr = " "
        if (canOverflow is None):
            canOverflow = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2017
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2018
        if ((_hx_str is None) or ((strLen > targetLength))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2021
        if ((padStr is None) or ((len(padStr) == 0))):
            padStr = " "
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2024
        sb = [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2025
        padLen = (0 if ((padStr is None)) else len(padStr))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2026
        while (strLen < targetLength):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2027
            sb.insert(0, padStr)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2028
            strLen = (strLen + padLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2031
        if canOverflow:
            return "".join([python_Boot.toString1(x1,'') for x1 in sb])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2034
        return hx_strings_Strings.right("".join([python_Boot.toString1(x1,'') for x1 in sb]),targetLength)

    @staticmethod
    def map(_hx_str,mapper,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2050
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2051
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2054
        if (separator is None):
            raise haxe_Exception.thrown("[separator] must not be null")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2057
        return list(map(mapper,hx_strings_Strings.split8(_hx_str,[separator])))

    @staticmethod
    def prependIfMissing(_hx_str,suffix):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2074
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2077
        if (len(_hx_str) == 0):
            return (("null" if suffix is None else suffix) + ("null" if _hx_str is None else _hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2080
        if hx_strings_Strings.startsWith(_hx_str,suffix):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2083
        return (("null" if suffix is None else suffix) + ("null" if _hx_str is None else _hx_str))

    @staticmethod
    def quoteDouble(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2100
        if (_hx_str is None):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2103
        if (len(_hx_str) == 0):
            return "\"\""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2106
        tmp = None
        if (_hx_str is None):
            tmp = False
        else:
            startIndex = None
            tmp = (((_hx_str.find("\"") if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,"\"",startIndex))) > -1)
        if (not tmp):
            return (("\"" + ("null" if _hx_str is None else _hx_str)) + "\"")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2109
        return (("\"" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll(_hx_str,"\"","\\\""))) + "\"")

    @staticmethod
    def quoteSingle(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2126
        if (_hx_str is None):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2129
        if (len(_hx_str) == 0):
            return "''"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2132
        tmp = None
        if (_hx_str is None):
            tmp = False
        else:
            startIndex = None
            tmp = (((_hx_str.find("'") if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,"'",startIndex))) > -1)
        if (not tmp):
            return (("'" + ("null" if _hx_str is None else _hx_str)) + "'")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2135
        return (("'" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll(_hx_str,"'","\\'"))) + "'")

    @staticmethod
    def removeAfter(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2144
        return hx_strings_Strings.substringBefore(_hx_str,searchFor)

    @staticmethod
    def removeAfterLast(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2152
        return hx_strings_Strings.substringBeforeLast(_hx_str,searchFor)

    @staticmethod
    def removeAfterIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2160
        return hx_strings_Strings.substringBeforeIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeAfterLastIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2168
        return hx_strings_Strings.substringBeforeLastIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeAt(_hx_str,pos,length):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2192
        if (((_hx_str is None) or ((len(_hx_str) == 0))) or ((length < 1))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2195
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2196
        if (pos < 0):
            pos = (strLen + pos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2198
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must be smaller than -1 * str.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2201
        if ((pos + length) >= strLen):
            return hx_strings_Strings.substring8(_hx_str,0,pos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2204
        return (HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,0,pos)) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,(pos + length))))

    @staticmethod
    def removeBefore(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2213
        return hx_strings_Strings.substringAfter(_hx_str,searchFor)

    @staticmethod
    def removeBeforeLast(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2221
        return hx_strings_Strings.substringAfterLast(_hx_str,searchFor)

    @staticmethod
    def removeBeforeIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2229
        return hx_strings_Strings.substringAfterIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeBeforeLastIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2237
        return hx_strings_Strings.substringAfterLastIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeAll(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2254
        return hx_strings_Strings.replaceAll(searchIn,searchFor,"")

    @staticmethod
    def removeFirst(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2272
        return hx_strings_Strings.replaceFirst(searchIn,searchFor,"")

    @staticmethod
    def removeFirstIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2290
        return hx_strings_Strings.replaceFirstIgnoreCase(searchIn,searchFor,"")

    @staticmethod
    def removeAnsi(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2303
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2306
        return hx_strings_Strings.REGEX_ANSI_ESC.ereg.replace(_hx_str,"")

    @staticmethod
    def removeLeading(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2327
        if (((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2330
        while hx_strings_Strings.startsWith(searchIn,searchFor):
            searchIn = HxString.substring(searchIn,len(searchFor),len(searchIn))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2333
        return searchIn

    @staticmethod
    def removeTags(xml):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2353
        if ((xml is None) or ((len(xml) == 0))):
            return xml
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2359
        return hx_strings_Strings.REGEX_REMOVE_XML_TAGS.ereg.replace(xml,"")

    @staticmethod
    def removeTrailing(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2381
        if (((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2384
        while hx_strings_Strings.endsWith(searchIn,searchFor):
            searchIn = HxString.substring(searchIn,0,(len(searchIn) - len(searchFor)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2387
        return searchIn

    @staticmethod
    def repeat(_hx_str,count,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2407
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2408
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2411
        if (count < 1):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2414
        if (count == 1):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2417
        _g = []
        _g1 = 0
        _g2 = count
        while (_g1 < _g2):
            i = _g1
            _g1 = (_g1 + 1)
            _g.append(_hx_str)
        return separator.join([python_Boot.toString1(x1,'') for x1 in _g])

    @staticmethod
    def replaceAll(searchIn,searchFor,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2436
        if (((searchIn is None) or (((searchIn is None) or ((len(searchIn) == 0))))) or ((searchFor is None))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2439
        if (replaceWith is None):
            replaceWith = "null"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2441
        return StringTools.replace(searchIn,searchFor,replaceWith)

    @staticmethod
    def replaceFirst(searchIn,searchFor,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2460
        if (((searchIn is None) or (((searchIn is None) or ((len(searchIn) == 0))))) or ((searchFor is None))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2463
        if (replaceWith is None):
            replaceWith = "null"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2465
        foundAt = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2466
        if (len(searchFor) == 0):
            if (((0 if ((searchIn is None)) else len(searchIn))) > 1):
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn,searchFor)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2474
        return ((HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,0,foundAt)) + ("null" if replaceWith is None else replaceWith)) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,(foundAt + ((0 if ((searchFor is None)) else len(searchFor)))))))

    @staticmethod
    def replaceFirstIgnoreCase(searchIn,searchFor,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2493
        if (((searchIn is None) or (((searchIn is None) or ((len(searchIn) == 0))))) or ((searchFor is None))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2496
        if (replaceWith is None):
            replaceWith = "null"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2498
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2500
        foundAt = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2501
        if (len(searchFor) == 0):
            if (((0 if ((searchIn is None)) else len(searchIn))) > 1):
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn.lower(),searchFor)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2509
        return ((HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,0,foundAt)) + ("null" if replaceWith is None else replaceWith)) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,(foundAt + ((0 if ((searchFor is None)) else len(searchFor)))))))

    @staticmethod
    def reverse(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2523
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2526
        chars = hx_strings_Strings.split8(_hx_str,[""])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2527
        chars.reverse()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2528
        return "".join([python_Boot.toString1(x1,'') for x1 in chars])

    @staticmethod
    def right(_hx_str,_hx_len):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2546
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2549
        return hx_strings_Strings.substring8(_hx_str,(((0 if ((_hx_str is None)) else len(_hx_str))) - _hx_len))

    @staticmethod
    def rpad(_hx_str,targetLength,padStr = None,canOverflow = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2572
        if (padStr is None):
            padStr = " "
        if (canOverflow is None):
            canOverflow = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2573
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2574
        if ((_hx_str is None) or ((strLen > targetLength))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2577
        if ((padStr is None) or ((len(padStr) == 0))):
            padStr = " "
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2580
        padLen = (0 if ((padStr is None)) else len(padStr))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2581
        sb = hx_strings_StringBuilder(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2582
        while (strLen < targetLength):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2583
            sb.add(padStr)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2584
            strLen = (strLen + padLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2587
        if canOverflow:
            return sb.toString()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2590
        _hx_str = sb.toString()
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= targetLength):
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str,0,targetLength)

    @staticmethod
    def split8(_hx_str,separator,maxParts = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2619
        if (maxParts is None):
            maxParts = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2620
        if ((_hx_str is None) or ((separator is None))):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2623
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2625
        if (strLen == 0):
            return []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2628
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2628
            return (s is not None)
        separators = list(filter(_hx_local_0,separator))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2629
        if (len(separators) == 0):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2633
        if ((maxParts <= 0) and ((len(separators) == 1))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2634
            delimiter = (separators[0] if 0 < len(separators) else None)
            if (delimiter == ""):
                return list(_hx_str)
            else:
                return _hx_str.split(delimiter)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2646
        if (python_internal_ArrayImpl.indexOf(separators,"",None) > -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2647
            if (maxParts <= 0):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2648
                _g = []
                _g1 = 0
                _g2 = strLen
                while (_g1 < _g2):
                    i = _g1
                    _g1 = (_g1 + 1)
                    x = HxString.substr(_hx_str,i,1)
                    _g.append(x)
                return _g
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2650
            if (maxParts > strLen):
                maxParts = strLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2652
            maxParts = (maxParts - 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2653
            _g = []
            _g1 = 0
            _g2 = maxParts
            while (_g1 < _g2):
                i = _g1
                _g1 = (_g1 + 1)
                x = HxString.substr(_hx_str,i,1)
                _g.append(x)
            result = _g
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2654
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2654
            x = HxString.substr(_hx_str,maxParts,(strLen - maxParts))
            result.append(x)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2655
            return result
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2658
        _g = []
        _g1 = 0
        while (_g1 < len(separators)):
            sep = (separators[_g1] if _g1 >= 0 and _g1 < len(separators) else None)
            _g1 = (_g1 + 1)
            x = (0 if ((sep is None)) else len(sep))
            _g.append(x)
        separatorsLengths = _g
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2659
        lastFoundAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2660
        result = []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2661
        resultCount = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2662
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2663
            separatorLen = 0
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2664
            foundAt = -1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2665
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2665
            _g = 0
            _g1 = len(separators)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2666
                sepFoundAt = hx_strings_Strings.indexOf8(_hx_str,(separators[i] if i >= 0 and i < len(separators) else None),lastFoundAt)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2667
                if (sepFoundAt != -1):
                    if ((foundAt == -1) or ((sepFoundAt < foundAt))):
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2669
                        foundAt = sepFoundAt
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2670
                        separatorLen = (separatorsLengths[i] if i >= 0 and i < len(separatorsLengths) else None)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2674
            resultCount = (resultCount + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2675
            if ((foundAt == -1) or ((resultCount == maxParts))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2676
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2676
                x = HxString.substr(_hx_str,lastFoundAt,(strLen - lastFoundAt))
                result.append(x)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2677
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2679
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2679
            x1 = HxString.substr(_hx_str,lastFoundAt,(foundAt - lastFoundAt))
            result.append(x1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2680
            lastFoundAt = (foundAt + separatorLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2682
        return result

    @staticmethod
    def splitAt(_hx_str,splitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2703
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2706
        if ((splitPos is None) or ((len(splitPos) == 0))):
            return [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2709
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2710
        if (strLen == 0):
            return [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2714
        pos = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2715
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2715
        _g = 0
        _g1 = splitPos
        while (_g < len(_g1)):
            p = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2716
            if (p < 0):
                p = (strLen + p)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2718
            if ((p < 0) or ((p >= strLen))):
                continue
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2720
            if (python_internal_ArrayImpl.indexOf(pos,p,None) > -1):
                continue
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2722
            pos.append(p)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2725
        def _hx_local_1(a,b):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2725
            if (a < b):
                return -1
            elif (a > b):
                return 1
            else:
                return 0
        pos.sort(key= python_lib_Functools.cmp_to_key(_hx_local_1))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2727
        result = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2729
        lastPos = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2730
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2730
        _g = 0
        while (_g < len(pos)):
            p = (pos[_g] if _g >= 0 and _g < len(pos) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2731
            chunk = hx_strings_Strings.substring8(_hx_str,lastPos,p)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2732
            if ((chunk is not None) and ((len(chunk) > 0))):
                result.append(chunk)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2734
            lastPos = p
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2736
        chunk = hx_strings_Strings.substring8(_hx_str,lastPos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2737
        if ((chunk is not None) and ((len(chunk) > 0))):
            result.append(chunk)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2739
        return result

    @staticmethod
    def splitEvery(_hx_str,count):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2756
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2759
        if (count < 1):
            raise haxe_Exception.thrown("[count] must be greater than 0")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2762
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2763
        if ((strLen == 0) or ((count >= strLen))):
            return [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2766
        result = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2767
        pos = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2768
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2769
            chunk = hx_strings_Strings.substr8(_hx_str,pos,count)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2770
            pos = (pos + count)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2771
            if ((chunk is None) or ((len(chunk) == 0))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2773
            result.append(chunk)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2775
        return result

    @staticmethod
    def splitLines(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2792
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return []
        else:
            return hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)

    @staticmethod
    def startsWith(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2806
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2809
        if (((searchFor is None) or ((len(searchFor) == 0))) or ((searchIn == searchFor))):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2817
        return searchIn.startswith(searchFor)

    @staticmethod
    def startsWithAny(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2836
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2839
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2839
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2840
            if ((candidate is not None) and hx_strings_Strings.startsWith(searchIn,candidate)):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2842
        return False

    @staticmethod
    def startsWithAnyIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2861
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2864
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2865
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2865
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2866
            if ((candidate is not None) and hx_strings_Strings.startsWith(searchIn,hx_strings_Strings.toLowerCase8(candidate))):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2869
        return False

    @staticmethod
    def startsWithIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2884
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2887
        if ((searchFor is None) or ((len(searchFor) == 0))):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2890
        return hx_strings_Strings.startsWith(searchIn.lower(),searchFor.lower())

    @staticmethod
    def substr8(_hx_str,startAt,_hx_len = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2916
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2919
        if (_hx_len is None):
            _hx_len = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2922
        if (_hx_len <= 0):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2925
        if (startAt < 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2926
            startAt = (startAt + (0 if ((_hx_str is None)) else len(_hx_str)))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2927
            if (startAt < 0):
                startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2931
        return HxString.substr(_hx_str,startAt,_hx_len)

    @staticmethod
    def substring8(_hx_str,startAt,endAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2973
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2976
        if (endAt is None):
            endAt = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2980
        return HxString.substring(_hx_str,startAt,endAt)

    @staticmethod
    def substringAfter(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3007
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3008
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3011
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3012
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3014
        startIndex = None
        foundAt = (_hx_str.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3015
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3016
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3018
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringAfterIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3035
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3036
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3039
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3040
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3042
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3044
        _this = _hx_str.lower()
        startIndex = None
        foundAt = (_this.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_this,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3045
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3046
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3048
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringBetween(_hx_str,after,before = None,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3068
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3069
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3072
        if (before is None):
            before = after
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3074
        if (((_hx_str == "") or (((after is None) or ((len(after) == 0))))) or (((before is None) or ((len(before) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3075
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3077
        startIndex = None
        foundAfterAt = (_hx_str.find(after) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,after,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3078
        if (foundAfterAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3079
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3081
        startIndex = (foundAfterAt + len(after))
        foundBeforeAt = (_hx_str.find(before) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,before,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3082
        if (foundBeforeAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3083
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3085
        return HxString.substring(_hx_str,(foundAfterAt + len(after)),foundBeforeAt)

    @staticmethod
    def substringBetweenIgnoreCase(_hx_str,after,before = None,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3105
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3106
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3109
        if (before is None):
            before = after
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3111
        if (((_hx_str == "") or (((after is None) or ((len(after) == 0))))) or (((before is None) or ((len(before) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3112
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3114
        strLower = hx_strings_Strings.toLowerCase8(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3115
        after = hx_strings_Strings.toLowerCase8(after)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3116
        before = hx_strings_Strings.toLowerCase8(before)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3118
        startIndex = None
        foundAfterAt = (strLower.find(after) if ((startIndex is None)) else HxString.indexOfImpl(strLower,after,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3119
        if (foundAfterAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3120
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3122
        startIndex = (foundAfterAt + len(after))
        foundBeforeAt = (strLower.find(before) if ((startIndex is None)) else HxString.indexOfImpl(strLower,before,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3123
        if (foundBeforeAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3124
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3126
        return HxString.substring(_hx_str,(foundAfterAt + len(after)),foundBeforeAt)

    @staticmethod
    def substringAfterLast(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3143
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3144
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3147
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3148
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3150
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif (searchFor == ""):
            length = len(_hx_str)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _hx_str.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3151
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3152
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3154
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringAfterLastIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3172
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3173
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3176
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3177
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3179
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3181
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif (searchFor == ""):
            length = len(_this)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _this.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3182
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3183
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3185
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringBefore(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3202
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3203
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3206
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3207
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3209
        startIndex = None
        foundAt = (_hx_str.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3210
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3211
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3213
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def substringBeforeIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3231
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3232
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3235
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3236
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3238
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3240
        _this = _hx_str.lower()
        startIndex = None
        foundAt = (_this.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_this,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3241
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3242
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3244
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def substringBeforeLast(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3263
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3264
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3267
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3268
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3270
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif (searchFor == ""):
            length = len(_hx_str)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _hx_str.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3271
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3272
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3274
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def substringBeforeLastIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3292
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3293
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3296
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3297
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3299
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3301
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif (searchFor == ""):
            length = len(_this)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _this.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3302
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3303
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3305
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def toBool(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3325
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3328
        _g = _hx_str.lower()
        _hx_local_0 = len(_g)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3329
        if (_hx_local_0 == 1):
            if (_g == "0"):
                return False
            else:
                return True
        elif (_hx_local_0 == 5):
            if (_g == "false"):
                return False
            else:
                return True
        elif (_hx_local_0 == 2):
            if (_g == "no"):
                return False
            else:
                return True
        else:
            return True

    @staticmethod
    def toBytes(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3348
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3351
        return haxe_io_Bytes.ofString(_hx_str)

    @staticmethod
    def toChar(charCode):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3367
        return charCode

    @staticmethod
    def toCharIterator(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3381
        if (_hx_str is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        else:
            return hx_strings__CharIterator_StringCharIterator(_hx_str,0)

    @staticmethod
    def toChars(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3395
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3398
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3400
        if (strLen == 0):
            return []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3403
        _g = []
        _g1 = 0
        _g2 = strLen
        while (_g1 < _g2):
            i = _g1
            _g1 = (_g1 + 1)
            x = HxString.charCodeAt(_hx_str,i)
            _g.append(x)
        return _g

    @staticmethod
    def toPattern(_hx_str,options = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3417
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3419
        return hx_strings_Pattern.compile(_hx_str,options)

    @staticmethod
    def toEReg(_hx_str,opt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3432
        if (opt is None):
            opt = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3433
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3435
        return EReg(_hx_str,opt)

    @staticmethod
    def toFloat(_hx_str,ifUnparseable = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3456
        result = Std.parseFloat(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3457
        if python_lib_Math.isnan(result):
            return ifUnparseable
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3459
        return result

    @staticmethod
    def toHex(num,minDigits = None,upperCase = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3481
        if (minDigits is None):
            minDigits = 0
        if (upperCase is None):
            upperCase = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3482
        hexed = StringTools.hex(num,0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3483
        if (not upperCase):
            return hexed.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3485
        if (len(hexed) >= minDigits):
            return hexed
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3487
        return hx_strings_Strings.lpad(hexed,minDigits,"0")

    @staticmethod
    def toInt(_hx_str,ifUnparseable = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3508
        result = Std.parseInt(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3509
        if (result is None):
            return ifUnparseable
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3511
        return result

    @staticmethod
    def toLowerCase8(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3531
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3537
        return _hx_str.lower()

    @staticmethod
    def toLowerCaseFirstChar(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3561
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3564
        this1 = HxString.charCodeAt(_hx_str,0)
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(this1,None)
        firstChar = (this1 if ((lowerChar is None)) else lowerChar)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3566
        if (len(_hx_str) == 1):
            return "".join(map(chr,[firstChar]))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3569
        other = hx_strings_Strings.substr8(_hx_str,1)
        return (HxOverrides.stringOrNull("".join(map(chr,[firstChar]))) + ("null" if other is None else other))

    @staticmethod
    def toLowerCamel(_hx_str,keepUppercasedWords = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3592
        if (keepUppercasedWords is None):
            keepUppercasedWords = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3593
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3596
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3597
        if keepUppercasedWords:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3598
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3599
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3601
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3602
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(word)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3603
        return hx_strings_Strings.toLowerCaseFirstChar(sb.toString())

    @staticmethod
    def toLowerHyphen(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3626
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3629
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3629
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return "-".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toLowerUnderscore(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3652
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3655
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3655
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return "_".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toTitle(_hx_str,keepUppercasedWords = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3675
        if (keepUppercasedWords is None):
            keepUppercasedWords = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3676
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3679
        if keepUppercasedWords:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3681
            def _hx_local_0(s):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3681
                if (hx_strings_Strings.toUpperCase8(s) == s):
                    return s
                else:
                    return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(s))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3680
            _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
            return " ".join([python_Boot.toString1(x1,'') for x1 in _this])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3685
        def _hx_local_1(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3685
            return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(s))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3684
        _this = list(map(_hx_local_1,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return " ".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toUpperCamel(_hx_str,keepUppercasedWords = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3705
        if (keepUppercasedWords is None):
            keepUppercasedWords = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3706
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3709
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3710
        if keepUppercasedWords:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3711
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3712
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3714
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3715
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(word)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3716
        return sb.toString()

    @staticmethod
    def toUpperUnderscore(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3735
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3738
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3738
            return hx_strings_Strings.toUpperCase8(s)
        _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return "_".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toString(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3754
        if (_hx_str is None):
            return "null"
        else:
            return _hx_str

    @staticmethod
    def toUpperCase8(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3773
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3779
        return _hx_str.upper()

    @staticmethod
    def toUpperCaseFirstChar(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3804
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3807
        this1 = HxString.charCodeAt(_hx_str,0)
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(this1,None)
        firstChar = (this1 if ((upperChar is None)) else upperChar)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3809
        if (len(_hx_str) == 1):
            return "".join(map(chr,[firstChar]))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3811
        other = hx_strings_Strings.substr8(_hx_str,1)
        return (HxOverrides.stringOrNull("".join(map(chr,[firstChar]))) + ("null" if other is None else other))

    @staticmethod
    def trim(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3831
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3834
        if (charsToRemove is None):
            return StringTools.trim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3837
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3838
        if (removableChars1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3838
            str1 = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3837
            removableChars = hx_strings_Strings.toChars(str1)
        elif (removableChars1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3839
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3837
            removableChars = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3842
        this1 = hx_strings_internal__Either2__Either2.b(removableChars)
        this2 = hx_strings_internal__Either2__Either2.b(removableChars)
        return hx_strings_Strings.trimLeft(hx_strings_Strings.trimRight(_hx_str,this1),this2)

    @staticmethod
    def trimRight(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3864
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3867
        if (charsToRemove is None):
            return StringTools.rtrim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3870
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3871
        if (removableChars1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3871
            str1 = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3870
            removableChars = hx_strings_Strings.toChars(str1)
        elif (removableChars1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3872
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3870
            removableChars = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3875
        if (len(removableChars) == 0):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3878
        _hx_len = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3879
        i = (_hx_len - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3880
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3880
            tmp = None
            if (i > -1):
                str1 = hx_strings_Strings.charAt8(_hx_str,i)
                strLen = (0 if ((str1 is None)) else len(str1))
                tmp = (python_internal_ArrayImpl.indexOf(removableChars,(-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt(str1,0)),None) > -1)
            else:
                tmp = False
            if (not tmp):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3881
            i = (i - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3882
        if (i < ((_hx_len - 1))):
            return hx_strings_Strings.substring8(_hx_str,0,(i + 1))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3884
        return _hx_str

    @staticmethod
    def trimLeft(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3906
        if (_hx_str is None):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3909
        if (charsToRemove is None):
            return StringTools.ltrim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3912
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3913
        if (removableChars1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3913
            str1 = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3912
            removableChars = hx_strings_Strings.toChars(str1)
        elif (removableChars1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3914
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3912
            removableChars = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3917
        if (len(removableChars) == 0):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3920
        _hx_len = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3921
        i = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3922
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3922
            tmp = None
            if (i < _hx_len):
                str1 = hx_strings_Strings.charAt8(_hx_str,i)
                strLen = (0 if ((str1 is None)) else len(str1))
                tmp = (python_internal_ArrayImpl.indexOf(removableChars,(-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt(str1,0)),None) > -1)
            else:
                tmp = False
            if (not tmp):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3923
            i = (i + 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3925
        if (i > 0):
            return hx_strings_Strings.substring8(_hx_str,i,_hx_len)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3927
        return _hx_str

    @staticmethod
    def trimLines(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3945
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3948
        def _hx_local_0(line):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3948
            return hx_strings_Strings.trim(line,charsToRemove)
        _this = list(map(_hx_local_0,hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)))
        return "\n".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def trimToNull(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3963
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3966
        trimmed = hx_strings_Strings.trim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3968
        if ((trimmed is None) or ((len(trimmed) == 0))):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3971
        return trimmed

    @staticmethod
    def trimToEmpty(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3986
        trimmed = hx_strings_Strings.trim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3988
        if ((trimmed is None) or ((len(trimmed) == 0))):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3991
        return trimmed

    @staticmethod
    def truncate(_hx_str,maxLength):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4008
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLength):
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str,0,maxLength)

    @staticmethod
    def urlDecode(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4020
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4026
        return python_lib_urllib_Parse.unquote(_hx_str)

    @staticmethod
    def urlEncode(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4042
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4048
        return python_lib_urllib_Parse.quote(_hx_str,"")

    @staticmethod
    def wrap(_hx_str,maxLineLength,splitLongWords = None,newLineSeparator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4065
        if (splitLongWords is None):
            splitLongWords = True
        if (newLineSeparator is None):
            newLineSeparator = "\n"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4066
        if ((((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLineLength) or ((maxLineLength < 1))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4069
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4070
        wordChars = []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4071
        currLineLength = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4072
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4072
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while (_g < len(_g1)):
            ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4073
            if (((ch > 8) and ((ch < 14))) or ((ch == 32))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4074
                if (len(wordChars) > 0):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4075
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4075
                    _g2 = 0
                    while (_g2 < len(wordChars)):
                        wordCh = (wordChars[_g2] if _g2 >= 0 and _g2 < len(wordChars) else None)
                        _g2 = (_g2 + 1)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4076
                        if ((currLineLength == maxLineLength) and splitLongWords):
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4077
                            sb.add(newLineSeparator)
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4078
                            currLineLength = 0
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4080
                        currLineLength = (currLineLength + 1)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4081
                        sb.addChar(wordCh)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4083
                    wordChars = []
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4085
                if (currLineLength >= maxLineLength):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4086
                    sb.add(newLineSeparator)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4087
                    currLineLength = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4089
                sb.addChar(ch)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4090
                currLineLength = (currLineLength + 1)
            else:
                wordChars.append(ch)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4094
        if (len(wordChars) > 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4095
            _g = 0
            while (_g < len(wordChars)):
                wordCh = (wordChars[_g] if _g >= 0 and _g < len(wordChars) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4096
                if ((currLineLength == maxLineLength) and splitLongWords):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4097
                    sb.add(newLineSeparator)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4098
                    currLineLength = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4100
                currLineLength = (currLineLength + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4101
                sb.addChar(wordCh)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4104
        return sb.toString()


class hx_strings_StringDiff:
    _hx_class_name = "hx.strings.StringDiff"
    __slots__ = ("at", "left", "right")
    _hx_fields = ["at", "left", "right"]
    _hx_methods = ["toString"]

    def __init__(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4177
        self.right = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4172
        self.left = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4167
        self.at = None

    def toString(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4180
        return (((((("StringDiff[at=" + Std.string(self.at)) + ", left=") + HxOverrides.stringOrNull(self.left)) + ", right=") + HxOverrides.stringOrNull(self.right)) + "]")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.at = None
        _hx_o.left = None
        _hx_o.right = None

class hx_strings_HashCodeAlgorithm(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.HashCodeAlgorithm"
    _hx_constructs = ["PLATFORM_SPECIFIC", "ADLER32", "CRC32B", "DJB2A", "JAVA", "SDBM"]
hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC = hx_strings_HashCodeAlgorithm("PLATFORM_SPECIFIC", 0, ())
hx_strings_HashCodeAlgorithm.ADLER32 = hx_strings_HashCodeAlgorithm("ADLER32", 1, ())
hx_strings_HashCodeAlgorithm.CRC32B = hx_strings_HashCodeAlgorithm("CRC32B", 2, ())
hx_strings_HashCodeAlgorithm.DJB2A = hx_strings_HashCodeAlgorithm("DJB2A", 3, ())
hx_strings_HashCodeAlgorithm.JAVA = hx_strings_HashCodeAlgorithm("JAVA", 4, ())
hx_strings_HashCodeAlgorithm.SDBM = hx_strings_HashCodeAlgorithm("SDBM", 5, ())

class hx_strings_AnsiToHtmlRenderMethod(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.AnsiToHtmlRenderMethod"
    _hx_constructs = ["StyleAttributes", "CssClasses", "CssClassesCallback"]

    @staticmethod
    def CssClassesCallback(func):
        return hx_strings_AnsiToHtmlRenderMethod("CssClassesCallback", 2, (func,))
hx_strings_AnsiToHtmlRenderMethod.StyleAttributes = hx_strings_AnsiToHtmlRenderMethod("StyleAttributes", 0, ())
hx_strings_AnsiToHtmlRenderMethod.CssClasses = hx_strings_AnsiToHtmlRenderMethod("CssClasses", 1, ())


class hx_strings_AnsiState:
    _hx_class_name = "hx.strings.AnsiState"
    __slots__ = ("bgcolor", "blink", "bold", "fgcolor", "underline")
    _hx_fields = ["bgcolor", "blink", "bold", "fgcolor", "underline"]
    _hx_methods = ["isActive", "reset", "copyFrom", "setGraphicModeParameter", "toCSS"]
    _hx_statics = ["defaultCssClassesCallback"]

    def __init__(self,copyFrom = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4255
        self.underline = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4254
        self.fgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4253
        self.bold = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4252
        self.blink = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4251
        self.bgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4260
        if (copyFrom is None):
            self.reset()
        else:
            self.copyFrom(copyFrom)

    def isActive(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4268
        if (not (((((self.fgcolor is not None) or ((self.bgcolor is not None))) or self.bold) or self.underline))):
            return self.blink
        else:
            return True

    def reset(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4272
        self.fgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4273
        self.bgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4274
        self.bold = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4275
        self.underline = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4276
        self.blink = False

    def copyFrom(self,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4281
        self.fgcolor = other.fgcolor
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4282
        self.bgcolor = other.bgcolor
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4283
        self.bold = other.bold
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4284
        self.underline = other.underline
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4285
        self.blink = other.blink

    def setGraphicModeParameter(self,param):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4290
        param1 = param
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4291
        if (param1 == 0):
            self.reset()
        elif (param1 == 1):
            self.bold = True
        elif (param1 == 4):
            self.underline = True
        elif (param1 == 5):
            self.blink = True
        elif (param1 == 30):
            self.fgcolor = "black"
        elif (param1 == 31):
            self.fgcolor = "red"
        elif (param1 == 32):
            self.fgcolor = "green"
        elif (param1 == 33):
            self.fgcolor = "yellow"
        elif (param1 == 34):
            self.fgcolor = "blue"
        elif (param1 == 35):
            self.fgcolor = "magenta"
        elif (param1 == 36):
            self.fgcolor = "cyan"
        elif (param1 == 37):
            self.fgcolor = "white"
        elif (param1 == 40):
            self.bgcolor = "black"
        elif (param1 == 41):
            self.bgcolor = "red"
        elif (param1 == 42):
            self.bgcolor = "green"
        elif (param1 == 43):
            self.bgcolor = "yellow"
        elif (param1 == 44):
            self.bgcolor = "blue"
        elif (param1 == 45):
            self.bgcolor = "magenta"
        elif (param1 == 46):
            self.bgcolor = "cyan"
        elif (param1 == 47):
            self.bgcolor = "white"
        else:
            pass

    def toCSS(self,renderMethod):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4316
        if (((((self.fgcolor is not None) or ((self.bgcolor is not None))) or self.bold) or self.underline) or self.blink):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4317
            sb = hx_strings_StringBuilder()
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4318
            if (renderMethod is None):
                renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4319
            tmp = renderMethod.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4320
            if (tmp == 0):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4321
                if (self.fgcolor is not None):
                    sb.add("color:").add(self.fgcolor).add(";")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4323
                if (self.bgcolor is not None):
                    sb.add("background-color:").add(self.bgcolor).add(";")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4325
                if self.bold:
                    sb.add("font-weight:bold;")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4327
                if self.underline:
                    sb.add("text-decoration:underline;")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4329
                if self.blink:
                    sb.add("text-decoration:blink;")
            elif (tmp == 1):
                sb.add(hx_strings_AnsiState.defaultCssClassesCallback(self))
            elif (tmp == 2):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4335
                func = renderMethod.params[0]
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4336
                sb.add(func(self))
            else:
                pass
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4338
            return sb.toString()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4340
        return ""

    @staticmethod
    def defaultCssClassesCallback(state):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4362
        classes = []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4363
        if (state.fgcolor is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4363
            x = ("ansi_fg_" + HxOverrides.stringOrNull(state.fgcolor))
            classes.append(x)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4364
        if (state.bgcolor is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4364
            x = ("ansi_bg_" + HxOverrides.stringOrNull(state.bgcolor))
            classes.append(x)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4365
        if state.bold:
            classes.append("ansi_bold")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4366
        if state.underline:
            classes.append("ansi_underline")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4367
        if state.blink:
            classes.append("ansi_blink")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4368
        return " ".join([python_Boot.toString1(x1,'') for x1 in classes])

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bgcolor = None
        _hx_o.blink = None
        _hx_o.bold = None
        _hx_o.fgcolor = None
        _hx_o.underline = None


class hx_strings_internal_Bits:
    _hx_class_name = "hx.strings.internal.Bits"
    __slots__ = ()
    _hx_statics = ["clearBit", "setBit", "toggleBit", "getBit"]

    @staticmethod
    def clearBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:22
        return (num & ~((1 << ((bitPos - 1)))))

    @staticmethod
    def setBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:33
        return (num | ((1 << ((bitPos - 1)))))

    @staticmethod
    def toggleBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:44
        return (num ^ ((1 << ((bitPos - 1)))))

    @staticmethod
    def getBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:57
        return (1 == (((num >> ((bitPos - 1))) & 1)))


class hx_strings_internal__Either2_Either2_Impl_:
    _hx_class_name = "hx.strings.internal._Either2.Either2_Impl_"
    __slots__ = ()
    _hx_statics = ["_new", "get_value", "fromA", "fromB"]
    value = None

    @staticmethod
    def _new(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:16
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:24
        return this1

    @staticmethod
    def fromA(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:30
        this1 = hx_strings_internal__Either2__Either2.a(value)
        return this1

    @staticmethod
    def fromB(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:36
        this1 = hx_strings_internal__Either2__Either2.b(value)
        return this1

class hx_strings_internal__Either2__Either2(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.internal._Either2._Either2"
    _hx_constructs = ["a", "b"]

    @staticmethod
    def a(v):
        return hx_strings_internal__Either2__Either2("a", 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either2__Either2("b", 1, (v,))


class hx_strings_internal__Either3_Either3_Impl_:
    _hx_class_name = "hx.strings.internal._Either3.Either3_Impl_"
    __slots__ = ()
    _hx_statics = ["_new", "get_value", "fromA", "fromB", "fromC"]
    value = None

    @staticmethod
    def _new(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:16
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:24
        return this1

    @staticmethod
    def fromA(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:30
        this1 = hx_strings_internal__Either3__Either3.a(value)
        return this1

    @staticmethod
    def fromB(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:36
        this1 = hx_strings_internal__Either3__Either3.b(value)
        return this1

    @staticmethod
    def fromC(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:42
        this1 = hx_strings_internal__Either3__Either3.c(value)
        return this1


class hx_strings_internal__OneOrMany_OneOrMany_Impl_:
    _hx_class_name = "hx.strings.internal._OneOrMany.OneOrMany_Impl_"
    __slots__ = ()
    _hx_statics = ["fromSingle"]

    @staticmethod
    def fromSingle(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OneOrMany.hx:20
        return [value]


class hx_strings_internal__RingBuffer_RingBuffer_Impl_:
    _hx_class_name = "hx.strings.internal._RingBuffer.RingBuffer_Impl_"
    __slots__ = ()
    _hx_statics = ["_new", "get"]

    @staticmethod
    def _new(size):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:19
        this1 = hx_strings_internal__RingBuffer_RingBufferImpl(size)
        return this1

    @staticmethod
    def get(this1,index):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:27
        return this1.get(index)


class hx_strings_internal__RingBuffer_RingBufferIterator:
    _hx_class_name = "hx.strings.internal._RingBuffer.RingBufferIterator"
    __slots__ = ("buff", "idx")
    _hx_fields = ["buff", "idx"]
    _hx_methods = ["hasNext", "next"]

    def __init__(self,buff):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:107
        self.idx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:112
        self.buff = buff

    def hasNext(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:117
        return ((self.idx + 1) < self.buff.length)

    def next(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:122
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:122
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.idx
        _hx_local_0.idx = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:123
        return self.buff.get(self.idx)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buff = None
        _hx_o.idx = None


class python_HaxeIterator:
    _hx_class_name = "python.HaxeIterator"
    __slots__ = ("it", "x", "has", "checked")
    _hx_fields = ["it", "x", "has", "checked"]
    _hx_methods = ["next", "hasNext"]

    def __init__(self,it):
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:32
        self.checked = False
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:31
        self.has = False
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:30
        self.x = None
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:35
        self.it = it

    def next(self):
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:39
        if (not self.checked):
            self.hasNext()
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:41
        self.checked = False
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:42
        return self.x

    def hasNext(self):
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:46
        if (not self.checked):
            # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:47
            try:
                # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:48
                self.x = self.it.__next__()
                # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:49
                self.has = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),StopIteration):
                    # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:51
                    self.has = False
                    # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:52
                    self.x = None
                else:
                    raise _g
            # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:54
            self.checked = True
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:56
        return self.has

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.it = None
        _hx_o.x = None
        _hx_o.has = None
        _hx_o.checked = None


class python_internal_ArrayImpl:
    _hx_class_name = "python.internal.ArrayImpl"
    __slots__ = ()
    _hx_statics = ["concat", "copy", "iterator", "keyValueIterator", "indexOf", "lastIndexOf", "join", "toString", "pop", "push", "unshift", "remove", "contains", "shift", "slice", "sort", "splice", "map", "filter", "insert", "reverse", "_get", "_set"]

    @staticmethod
    def concat(a1,a2):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:35
        return (a1 + a2)

    @staticmethod
    def copy(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:40
        return list(x)

    @staticmethod
    def iterator(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:45
        return python_HaxeIterator(x.__iter__())

    @staticmethod
    def keyValueIterator(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:50
        return haxe_iterators_ArrayKeyValueIterator(x)

    @staticmethod
    def indexOf(a,x,fromIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:55
        _hx_len = len(a)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:56
        l = (0 if ((fromIndex is None)) else ((_hx_len + fromIndex) if ((fromIndex < 0)) else fromIndex))
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:57
        if (l < 0):
            l = 0
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:59
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:59
        _g = l
        _g1 = _hx_len
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:60
            if HxOverrides.eq(a[i],x):
                return i
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:63
        return -1

    @staticmethod
    def lastIndexOf(a,x,fromIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:68
        _hx_len = len(a)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:69
        l = (_hx_len if ((fromIndex is None)) else (((_hx_len + fromIndex) + 1) if ((fromIndex < 0)) else (fromIndex + 1)))
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:70
        if (l > _hx_len):
            l = _hx_len
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:72
        while True:
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:72
            l = (l - 1)
            tmp = l
            if (not ((tmp > -1))):
                break
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:73
            if HxOverrides.eq(a[l],x):
                return l
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:76
        return -1

    @staticmethod
    def join(x,sep):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:82
        return sep.join([python_Boot.toString1(x1,'') for x1 in x])

    @staticmethod
    def toString(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:87
        return (("[" + HxOverrides.stringOrNull(",".join([python_Boot.toString1(x1,'') for x1 in x]))) + "]")

    @staticmethod
    def pop(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:92
        if (len(x) == 0):
            return None
        else:
            return x.pop()

    @staticmethod
    def push(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:97
        x.append(e)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:98
        return len(x)

    @staticmethod
    def unshift(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:103
        x.insert(0, e)

    @staticmethod
    def remove(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:108
        try:
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:109
            x.remove(e)
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:110
            return True
        except BaseException as _g:
            return False

    @staticmethod
    def contains(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:118
        return (e in x)

    @staticmethod
    def shift(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:123
        if (len(x) == 0):
            return None
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:125
        return x.pop(0)

    @staticmethod
    def slice(x,pos,end = None):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:130
        return x[pos:end]

    @staticmethod
    def sort(x,f):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:135
        x.sort(key= python_lib_Functools.cmp_to_key(f))

    @staticmethod
    def splice(x,pos,_hx_len):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:140
        if (pos < 0):
            pos = (len(x) + pos)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:142
        if (pos < 0):
            pos = 0
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:144
        res = x[pos:(pos + _hx_len)]
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:145
        del x[pos:(pos + _hx_len)]
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:146
        return res

    @staticmethod
    def map(x,f):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:151
        return list(map(f,x))

    @staticmethod
    def filter(x,f):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:156
        return list(filter(f,x))

    @staticmethod
    def insert(a,pos,x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:161
        a.insert(pos, x)

    @staticmethod
    def reverse(a):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:166
        a.reverse()

    @staticmethod
    def _get(x,idx):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:171
        if ((idx > -1) and ((idx < len(x)))):
            return x[idx]
        else:
            return None

    @staticmethod
    def _set(x,idx,v):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:176
        l = len(x)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:177
        while (l < idx):
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:178
            x.append(None)
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:179
            l = (l + 1)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:181
        if (l == idx):
            x.append(v)
        else:
            x[idx] = v
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:186
        return v


class HxOverrides:
    _hx_class_name = "HxOverrides"
    __slots__ = ()
    _hx_statics = ["eq", "stringOrNull", "rshift", "modf", "mod"]

    @staticmethod
    def eq(a,b):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:53
        if (isinstance(a,list) or isinstance(b,list)):
            return a is b
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:56
        return (a == b)

    @staticmethod
    def stringOrNull(s):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:61
        if (s is None):
            return "null"
        else:
            return s

    @staticmethod
    def rshift(val,n):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:148
        return ((val % 0x100000000) >> n)

    @staticmethod
    def modf(a,b):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:153
        if (b == 0.0):
            return float('nan')
        elif (a < 0):
            if (b < 0):
                return -(-a % (-b))
            else:
                return -(-a % b)
        elif (b < 0):
            return a % (-b)
        else:
            return a % b

    @staticmethod
    def mod(a,b):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:170
        if (a < 0):
            if (b < 0):
                return -(-a % (-b))
            else:
                return -(-a % b)
        elif (b < 0):
            return a % (-b)
        else:
            return a % b


class python_internal_MethodClosure:
    _hx_class_name = "python.internal.MethodClosure"
    __slots__ = ("obj", "func")
    _hx_fields = ["obj", "func"]
    _hx_methods = ["__call__"]

    def __init__(self,obj,func):
        # C:\HaxeToolkit\haxe\std/python/internal/MethodClosure.hx:30
        self.obj = obj
        # C:\HaxeToolkit\haxe\std/python/internal/MethodClosure.hx:31
        self.func = func

    def __call__(self,*args):
        # C:\HaxeToolkit\haxe\std/python/internal/MethodClosure.hx:35
        return self.func(self.obj,*args)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.obj = None
        _hx_o.func = None


class sys_io_File:
    _hx_class_name = "sys.io.File"
    __slots__ = ()
    _hx_statics = ["getContent"]

    @staticmethod
    def getContent(path):
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:31
        f = python_lib_Builtins.open(path,"r",-1,"utf-8",None,"")
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:32
        content = f.read(-1)
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:33
        f.close()
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:34
        return content

# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:126
Math.NEGATIVE_INFINITY = float("-inf")
# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:127
Math.POSITIVE_INFINITY = float("inf")
# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:128
Math.NaN = float("nan")
# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:129
Math.PI = python_lib_Math.pi

DataTypes.TYPES = _hx_AnonObject({'DYNAMIC': _hx_AnonObject({'identifier': "Dynamic", 'typeDependencies': 0}), 'STRING': _hx_AnonObject({'identifier': "String", 'typeDependencies': 0}), 'REAL': _hx_AnonObject({'identifier': "Real", 'typeDependencies': 0}), 'BOOL': _hx_AnonObject({'identifier': "Bool", 'typeDependencies': 0}), 'ARRAY_LIST': _hx_AnonObject({'identifier': "List", 'typeDependencies': 1})})
DataTypes.TYPES_ARRAY = [DataTypes.TYPES.DYNAMIC, DataTypes.TYPES.STRING, DataTypes.TYPES.REAL, DataTypes.TYPES.BOOL, DataTypes.TYPES.ARRAY_LIST]
Tokenizer.DIGITS = "1234567890"
Tokenizer.LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"
Tokenizer.LETTERS_DIGITS = (HxOverrides.stringOrNull(Tokenizer.DIGITS) + HxOverrides.stringOrNull(Tokenizer.LETTERS))
Tokenizer.KEYWORDS = [_hx_AnonObject({'identifier': "true", 'tType': TokenType.BoolConst(True)}), _hx_AnonObject({'identifier': "false", 'tType': TokenType.BoolConst(False)}), _hx_AnonObject({'identifier': "and", 'tType': TokenType.And}), _hx_AnonObject({'identifier': "or", 'tType': TokenType.Or}), _hx_AnonObject({'identifier': "if", 'tType': TokenType.If}), _hx_AnonObject({'identifier': "elif", 'tType': TokenType.Elif}), _hx_AnonObject({'identifier': "else", 'tType': TokenType.Else})]
haxe_crypto_Base64.CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
haxe_crypto_Base64.BYTES = haxe_io_Bytes.ofString(haxe_crypto_Base64.CHARS)
hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER = hx_strings__Char_CharCaseMapper()
hx_strings__Char_Char_Impl_.BACKSPACE = 8
hx_strings__Char_Char_Impl_.TAB = 9
hx_strings__Char_Char_Impl_.LF = 10
hx_strings__Char_Char_Impl_.CR = 13
hx_strings__Char_Char_Impl_.ESC = 27
hx_strings__Char_Char_Impl_.SPACE = 32
hx_strings__Char_Char_Impl_.EXCLAMATION_MARK = 33
hx_strings__Char_Char_Impl_.DOUBLE_QUOTE = 34
hx_strings__Char_Char_Impl_.HASH = 35
hx_strings__Char_Char_Impl_.DOLLAR = 36
hx_strings__Char_Char_Impl_.AMPERSAND = 38
hx_strings__Char_Char_Impl_.SINGLE_QUOTE = 39
hx_strings__Char_Char_Impl_.BRACKET_ROUND_LEFT = 40
hx_strings__Char_Char_Impl_.BRACKET_ROUND_RIGHT = 41
hx_strings__Char_Char_Impl_.ASTERISK = 42
hx_strings__Char_Char_Impl_.PLUS = 43
hx_strings__Char_Char_Impl_.COMMA = 44
hx_strings__Char_Char_Impl_.MINUS = 45
hx_strings__Char_Char_Impl_.DOT = 46
hx_strings__Char_Char_Impl_.SLASH = 47
hx_strings__Char_Char_Impl_.ZERO = 48
hx_strings__Char_Char_Impl_.ONE = 49
hx_strings__Char_Char_Impl_.TWO = 50
hx_strings__Char_Char_Impl_.TRHEE = 51
hx_strings__Char_Char_Impl_.FOUR = 52
hx_strings__Char_Char_Impl_.FIVE = 53
hx_strings__Char_Char_Impl_.SIX = 54
hx_strings__Char_Char_Impl_.SEVEN = 55
hx_strings__Char_Char_Impl_.EIGHT = 56
hx_strings__Char_Char_Impl_.NINE = 57
hx_strings__Char_Char_Impl_.COLON = 58
hx_strings__Char_Char_Impl_.SEMICOLON = 59
hx_strings__Char_Char_Impl_.LOWER_THAN = 60
hx_strings__Char_Char_Impl_.EQUALS = 61
hx_strings__Char_Char_Impl_.GREATER_THAN = 62
hx_strings__Char_Char_Impl_.QUESTION_MARK = 63
hx_strings__Char_Char_Impl_.BRACKET_SQUARE_LEFT = 91
hx_strings__Char_Char_Impl_.BACKSLASH = 92
hx_strings__Char_Char_Impl_.BRACKET_SQUARE_RIGHT = 93
hx_strings__Char_Char_Impl_.CARET = 94
hx_strings__Char_Char_Impl_.UNDERSCORE = 95
hx_strings__Char_Char_Impl_.BRACKET_CURLY_LEFT = 123
hx_strings__Char_Char_Impl_.PIPE = 124
hx_strings__Char_Char_Impl_.BRACKET_CURLY_RIGHT = 125
python_Boot.keywords = set(["and", "del", "from", "not", "with", "as", "elif", "global", "or", "yield", "assert", "else", "if", "pass", "None", "break", "except", "import", "raise", "True", "class", "exec", "in", "return", "False", "continue", "finally", "is", "try", "def", "for", "lambda", "while"])
python_Boot.prefixLength = len("_hx_")
hx_strings__CharIterator_NullCharIterator.INSTANCE = hx_strings__CharIterator_NullCharIterator()
hx_strings_Pattern.__meta__ = _hx_AnonObject({'obj': _hx_AnonObject({'immutable': None, 'threadSafe': None})})
hx_strings_Matcher.__meta__ = _hx_AnonObject({'obj': _hx_AnonObject({'notThreadSafe': None})})
def _hx_init_hx_strings_internal_OS_isWindows():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OS.hx:20
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OS.hx:26
        os = Sys.systemName()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OS.hx:28
        _this = EReg("win","i")
        _this.matchObj = python_lib_Re.search(_this.pattern,os)
        return (_this.matchObj is not None)
    return _hx_local_0()
hx_strings_internal_OS.isWindows = _hx_init_hx_strings_internal_OS_isWindows()
def _hx_init_hx_strings_Strings_REGEX_ANSI_ESC():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:35
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:35
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile((HxOverrides.stringOrNull("".join(map(chr,[27]))) + "\\[[;\\d]*m"),this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_ANSI_ESC = _hx_init_hx_strings_Strings_REGEX_ANSI_ESC()
def _hx_init_hx_strings_Strings_REGEX_HTML_UNESCAPE():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:36
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:36
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile("&(#\\d+|amp|nbsp|apos|lt|gt|quot);",this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_HTML_UNESCAPE = _hx_init_hx_strings_Strings_REGEX_HTML_UNESCAPE()
def _hx_init_hx_strings_Strings_REGEX_SPLIT_LINES():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:37
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:37
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile("\\r?\\n",this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_SPLIT_LINES = _hx_init_hx_strings_Strings_REGEX_SPLIT_LINES()
def _hx_init_hx_strings_Strings_REGEX_REMOVE_XML_TAGS():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:40
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:40
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile("<[!a-zA-Z\\/][^>]*>",this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_REMOVE_XML_TAGS = _hx_init_hx_strings_Strings_REGEX_REMOVE_XML_TAGS()
hx_strings_Strings.POS_NOT_FOUND = -1
hx_strings_Strings.NEW_LINE_NIX = "\n"
hx_strings_Strings.NEW_LINE_WIN = "\r\n"
hx_strings_Strings.NEW_LINE = ("\r\n" if (hx_strings_internal_OS.isWindows) else "\n")

Main.main()

9bf7ef733bfe34b3c3c9d163eb05ce5ed4a7c329
<mask token>


class hx_strings_internal__RingBuffer_RingBufferImpl:
    <mask token>
    <mask token>
    <mask token>
    <mask token>

    def __init__(self, size):
        self.length = 0
        self.bufferEndIdx = -1
        self.bufferStartIdx = 0
        if size < 1:
            raise haxe_Exception.thrown('[size] must be > 0')
        this1 = [None] * size
        self.buffer = this1
        self.size = size
        self.bufferMaxIdx = size - 1
    <mask token>
    <mask token>
    <mask token>

    def toArray(self):
        arr = list()
        i = self.iterator()
        while i.hasNext():
            i1 = i.next()
            arr.append(i1)
        return arr

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buffer = None
        _hx_o.bufferStartIdx = None
        _hx_o.bufferEndIdx = None
        _hx_o.bufferMaxIdx = None
        _hx_o.length = None
        _hx_o.size = None


class python_Boot:
    _hx_class_name = 'python.Boot'
    __slots__ = ()
    _hx_statics = ['keywords', 'toString1', 'fields', 'simpleField',
        'field', 'getInstanceFields', 'getSuperClass', 'getClassFields',
        'prefixLength', 'unhandleKeywords']

    @staticmethod
    def toString1(o, s):
        if o is None:
            return 'null'
        if isinstance(o, str):
            return o
        if s is None:
            s = ''
        if len(s) >= 5:
            return '<...>'
        if isinstance(o, bool):
            if o:
                return 'true'
            else:
                return 'false'
        if isinstance(o, int) and not isinstance(o, bool):
            return str(o)
        if isinstance(o, float):
            try:
                if o == int(o):
                    return str(Math.floor(o + 0.5))
                else:
                    return str(o)
            except BaseException as _g:
                return str(o)
        if isinstance(o, list):
            o1 = o
            l = len(o1)
            st = '['
            s = ('null' if s is None else s) + '\t'
            _g = 0
            _g1 = l
            while _g < _g1:
                i = _g
                _g = _g + 1
                prefix = ''
                if i > 0:
                    prefix = ','
                st = ('null' if st is None else st) + HxOverrides.stringOrNull(
                    ('null' if prefix is None else prefix) + HxOverrides.
                    stringOrNull(python_Boot.toString1(o1[i] if i >= 0 and 
                    i < len(o1) else None, s)))
            st = ('null' if st is None else st) + ']'
            return st
        try:
            if hasattr(o, 'toString'):
                return o.toString()
        except BaseException as _g:
            pass
        if hasattr(o, '__class__'):
            if isinstance(o, _hx_AnonObject):
                toStr = None
                try:
                    fields = python_Boot.fields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '{ ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' }'
                except BaseException as _g:
                    return '{ ... }'
                if toStr is None:
                    return '{ ... }'
                else:
                    return toStr
            if isinstance(o, Enum):
                o1 = o
                l = len(o1.params)
                hasParams = l > 0
                if hasParams:
                    paramsStr = ''
                    _g = 0
                    _g1 = l
                    while _g < _g1:
                        i = _g
                        _g = _g + 1
                        prefix = ''
                        if i > 0:
                            prefix = ','
                        paramsStr = ('null' if paramsStr is None else paramsStr
                            ) + HxOverrides.stringOrNull(('null' if prefix is
                            None else prefix) + HxOverrides.stringOrNull(
                            python_Boot.toString1(o1.params[i], s)))
                    return HxOverrides.stringOrNull(o1.tag) + '(' + ('null' if
                        paramsStr is None else paramsStr) + ')'
                else:
                    return o1.tag
            if hasattr(o, '_hx_class_name'):
                if o.__class__.__name__ != 'type':
                    fields = python_Boot.getInstanceFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
                else:
                    fields = python_Boot.getClassFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '#' + HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
            if o == str:
                return '#String'
            if o == list:
                return '#Array'
            if callable(o):
                return 'function'
            try:
                if hasattr(o, '__repr__'):
                    return o.__repr__()
            except BaseException as _g:
                pass
            if hasattr(o, '__str__'):
                return o.__str__([])
            if hasattr(o, '__name__'):
                return o.__name__
            return '???'
        else:
            return str(o)

    @staticmethod
    def fields(o):
        a = []
        if o is not None:
            if hasattr(o, '_hx_fields'):
                fields = o._hx_fields
                if fields is not None:
                    return list(fields)
            if isinstance(o, _hx_AnonObject):
                d = o.__dict__
                keys = d.keys()
                handler = python_Boot.unhandleKeywords
                for k in keys:
                    if k != '_hx_disable_getattr':
                        a.append(handler(k))
            elif hasattr(o, '__dict__'):
                d = o.__dict__
                keys1 = d.keys()
                for k in keys1:
                    a.append(k)
        return a

    @staticmethod
    def simpleField(o, field):
        if field is None:
            return None
        field1 = ('_hx_' + field if field in python_Boot.keywords else 
            '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
            ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
            field)
        if hasattr(o, field1):
            return getattr(o, field1)
        else:
            return None

    @staticmethod
    def field(o, field):
        if field is None:
            return None
        if isinstance(o, str):
            field1 = field
            _hx_local_0 = len(field1)
            if _hx_local_0 == 10:
                if field1 == 'charCodeAt':
                    return python_internal_MethodClosure(o, HxString.charCodeAt
                        )
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o, HxString.
                        lastIndexOf)
                elif field1 == 'toLowerCase':
                    return python_internal_MethodClosure(o, HxString.
                        toLowerCase)
                elif field1 == 'toUpperCase':
                    return python_internal_MethodClosure(o, HxString.
                        toUpperCase)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 9:
                if field1 == 'substring':
                    return python_internal_MethodClosure(o, HxString.substring)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 5:
                if field1 == 'split':
                    return python_internal_MethodClosure(o, HxString.split)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o, HxString.indexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 8:
                if field1 == 'toString':
                    return python_internal_MethodClosure(o, HxString.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 6:
                if field1 == 'charAt':
                    return python_internal_MethodClosure(o, HxString.charAt)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'substr':
                    return python_internal_MethodClosure(o, HxString.substr)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        elif isinstance(o, list):
            field1 = field
            _hx_local_1 = len(field1)
            if _hx_local_1 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.lastIndexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 4:
                if field1 == 'copy':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.copy)
                elif field1 == 'join':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.join)
                elif field1 == 'push':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.push)
                elif field1 == 'sort':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.sort)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 5:
                if field1 == 'shift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.shift)
                elif field1 == 'slice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.slice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.indexOf)
                elif field1 == 'reverse':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.reverse)
                elif field1 == 'unshift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.unshift)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 3:
                if field1 == 'map':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.map)
                elif field1 == 'pop':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.pop)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 8:
                if field1 == 'contains':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.contains)
                elif field1 == 'iterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.iterator)
                elif field1 == 'toString':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 16:
                if field1 == 'keyValueIterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.keyValueIterator)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 6:
                if field1 == 'concat':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.concat)
                elif field1 == 'filter':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.filter)
                elif field1 == 'insert':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.insert)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'remove':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.remove)
                elif field1 == 'splice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.splice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        else:
            field1 = ('_hx_' + field if field in python_Boot.keywords else 
                '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
                ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
                field)
            if hasattr(o, field1):
                return getattr(o, field1)
            else:
                return None

    @staticmethod
    def getInstanceFields(c):
        f = list(c._hx_fields) if hasattr(c, '_hx_fields') else []
        if hasattr(c, '_hx_methods'):
            f = f + c._hx_methods
        sc = python_Boot.getSuperClass(c)
        if sc is None:
            return f
        else:
            scArr = python_Boot.getInstanceFields(sc)
            scMap = set(scArr)
            _g = 0
            while _g < len(f):
                f1 = f[_g] if _g >= 0 and _g < len(f) else None
                _g = _g + 1
                if not f1 in scMap:
                    scArr.append(f1)
            return scArr

    @staticmethod
    def getSuperClass(c):
        if c is None:
            return None
        try:
            if hasattr(c, '_hx_super'):
                return c._hx_super
            return None
        except BaseException as _g:
            pass
        return None

    @staticmethod
    def getClassFields(c):
        if hasattr(c, '_hx_statics'):
            x = c._hx_statics
            return list(x)
        else:
            return []

    @staticmethod
    def unhandleKeywords(name):
        if HxString.substr(name, 0, python_Boot.prefixLength) == '_hx_':
            real = HxString.substr(name, python_Boot.prefixLength, None)
            if real in python_Boot.keywords:
                return real
        return name


class HxString:
    _hx_class_name = 'HxString'
    __slots__ = ()
    _hx_statics = ['split', 'charCodeAt', 'charAt', 'lastIndexOf',
        'toUpperCase', 'toLowerCase', 'indexOf', 'indexOfImpl', 'toString',
        'substring', 'substr']

    @staticmethod
    def split(s, d):
        if d == '':
            return list(s)
        else:
            return s.split(d)

    @staticmethod
    def charCodeAt(s, index):
        if ((s is None or len(s) == 0) or index < 0) or index >= len(s):
            return None
        else:
            return ord(s[index])

    @staticmethod
    def charAt(s, index):
        if index < 0 or index >= len(s):
            return ''
        else:
            return s[index]

    @staticmethod
    def lastIndexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.rfind(_hx_str, 0, len(s))
        elif _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        else:
            i = s.rfind(_hx_str, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(_hx_str)
                ) if i == -1 else i + 1
            check = s.find(_hx_str, startLeft, len(s))
            if check > i and check <= startIndex:
                return check
            else:
                return i

    @staticmethod
    def toUpperCase(s):
        return s.upper()

    @staticmethod
    def toLowerCase(s):
        return s.lower()

    @staticmethod
    def indexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.find(_hx_str)
        else:
            return HxString.indexOfImpl(s, _hx_str, startIndex)

    @staticmethod
    def indexOfImpl(s, _hx_str, startIndex):
        if _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        return s.find(_hx_str, startIndex)

    @staticmethod
    def toString(s):
        return s

    @staticmethod
    def substring(s, startIndex, endIndex=None):
        if startIndex < 0:
            startIndex = 0
        if endIndex is None:
            return s[startIndex:]
        else:
            if endIndex < 0:
                endIndex = 0
            if endIndex < startIndex:
                return s[endIndex:startIndex]
            else:
                return s[startIndex:endIndex]

    @staticmethod
    def substr(s, startIndex, _hx_len=None):
        if _hx_len is None:
            return s[startIndex:]
        else:
            if _hx_len == 0:
                return ''
            if startIndex < 0:
                startIndex = len(s) + startIndex
                if startIndex < 0:
                    startIndex = 0
            return s[startIndex:startIndex + _hx_len]


class hx_strings__CharIterator_NullCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.NullCharIterator'
    __slots__ = ()
    _hx_fields = []
    _hx_methods = ['isEOF']
    _hx_statics = ['INSTANCE']
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self):
        super().__init__(0)

    def isEOF(self):
        return True

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class hx_strings__CharIterator_ArrayCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.ArrayCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = len(chars) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return python_internal_ArrayImpl._get(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings__CharIterator_IteratorCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.IteratorCharIterator'
    __slots__ = 'chars',
    _hx_fields = ['chars']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars

    def isEOF(self):
        return not self.chars.hasNext()

    def getChar(self):
        return self.chars.next()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None


class hx_strings__CharIterator_InputCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.InputCharIterator'
    __slots__ = ('byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable')
    _hx_fields = ['byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable']
    _hx_methods = ['isEOF', 'getChar', 'readUtf8Char',
        'readUtf8MultiSequenceByte']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.nextChar = None
        self.input = None
        self.nextCharAvailable = None
        self.currCharIndex = -1
        self.byteIndex = 0
        super().__init__(prevBufferSize)
        self.input = chars

    def isEOF(self):
        if self.nextCharAvailable == None:
            try:
                byte1 = self.input.readByte()
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.byteIndex
                _hx_local_0.byteIndex = _hx_local_1 + 1
                _hx_local_1
                tmp = None
                if byte1 <= 127:
                    tmp = byte1
                else:
                    byte1 = byte1 & -129
                    byte1 = byte1 & -65
                    totalBytes = 2
                    isBit6Set = 1 == byte1 >> 5 & 1
                    isBit5Set = False
                    if isBit6Set:
                        byte1 = byte1 & -33
                        totalBytes = totalBytes + 1
                        isBit5Set = 1 == byte1 >> 4 & 1
                        if isBit5Set:
                            byte1 = byte1 & -17
                            totalBytes = totalBytes + 1
                            if 1 == byte1 >> 3 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 byte expected at position [' +
                                    Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte1) + ']!')
                    result = byte1 << 6 * (totalBytes - 1)
                    byte = self.input.readByte()
                    _hx_local_8 = self
                    _hx_local_9 = _hx_local_8.byteIndex
                    _hx_local_8.byteIndex = _hx_local_9 + 1
                    _hx_local_9
                    if 1 != byte >> 7 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    if 1 == byte >> 6 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    byte2 = byte & -129
                    result = result + (byte2 << 6 * (totalBytes - 2))
                    if isBit6Set:
                        byte = self.input.readByte()
                        _hx_local_11 = self
                        _hx_local_12 = _hx_local_11.byteIndex
                        _hx_local_11.byteIndex = _hx_local_12 + 1
                        _hx_local_12
                        if 1 != byte >> 7 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        if 1 == byte >> 6 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        byte3 = byte & -129
                        result = result + (byte3 << 6 * (totalBytes - 3))
                        if isBit5Set:
                            byte = self.input.readByte()
                            _hx_local_14 = self
                            _hx_local_15 = _hx_local_14.byteIndex
                            _hx_local_14.byteIndex = _hx_local_15 + 1
                            _hx_local_15
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte4 = byte & -129
                            result = result + (byte4 << 6 * (totalBytes - 4))
                    if self.index == 0 and result == 65279:
                        byte1 = self.input.readByte()
                        _hx_local_17 = self
                        _hx_local_18 = _hx_local_17.byteIndex
                        _hx_local_17.byteIndex = _hx_local_18 + 1
                        _hx_local_18
                        if byte1 <= 127:
                            tmp = byte1
                        else:
                            byte1 = byte1 & -129
                            byte1 = byte1 & -65
                            totalBytes = 2
                            isBit6Set = 1 == byte1 >> 5 & 1
                            isBit5Set = False
                            if isBit6Set:
                                byte1 = byte1 & -33
                                totalBytes = totalBytes + 1
                                isBit5Set = 1 == byte1 >> 4 & 1
                                if isBit5Set:
                                    byte1 = byte1 & -17
                                    totalBytes = totalBytes + 1
                                    if 1 == byte1 >> 3 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte1) + ']!')
                            result1 = byte1 << 6 * (totalBytes - 1)
                            byte = self.input.readByte()
                            _hx_local_25 = self
                            _hx_local_26 = _hx_local_25.byteIndex
                            _hx_local_25.byteIndex = _hx_local_26 + 1
                            _hx_local_26
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte2 = byte & -129
                            result1 = result1 + (byte2 << 6 * (totalBytes - 2))
                            if isBit6Set:
                                byte = self.input.readByte()
                                _hx_local_28 = self
                                _hx_local_29 = _hx_local_28.byteIndex
                                _hx_local_28.byteIndex = _hx_local_29 + 1
                                _hx_local_29
                                if 1 != byte >> 7 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                if 1 == byte >> 6 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                byte3 = byte & -129
                                result1 = result1 + (byte3 << 6 * (
                                    totalBytes - 3))
                                if isBit5Set:
                                    byte = self.input.readByte()
                                    _hx_local_31 = self
                                    _hx_local_32 = _hx_local_31.byteIndex
                                    _hx_local_31.byteIndex = _hx_local_32 + 1
                                    _hx_local_32
                                    if 1 != byte >> 7 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    if 1 == byte >> 6 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    byte4 = byte & -129
                                    result1 = result1 + (byte4 << 6 * (
                                        totalBytes - 4))
                            tmp = (self.readUtf8Char() if self.index == 0 and
                                result1 == 65279 else result1)
                    else:
                        tmp = result
                self.nextChar = tmp
                self.nextCharAvailable = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(), haxe_io_Eof
                    ):
                    self.nextCharAvailable = False
                else:
                    raise _g
        return self.nextCharAvailable != True

    def getChar(self):
        if self.index != self.currCharIndex:
            self.currCharIndex = self.index
            self.nextCharAvailable = None
            return self.nextChar
        return self.currChar

    def readUtf8Char(self):
        byte1 = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if byte1 <= 127:
            return byte1
        byte1 = byte1 & -129
        byte1 = byte1 & -65
        totalBytes = 2
        isBit6Set = 1 == byte1 >> 5 & 1
        isBit5Set = False
        if isBit6Set:
            byte1 = byte1 & -33
            totalBytes = totalBytes + 1
            isBit5Set = 1 == byte1 >> 4 & 1
            if isBit5Set:
                byte1 = byte1 & -17
                totalBytes = totalBytes + 1
                if 1 == byte1 >> 3 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 byte expected at position [' + Std.
                        string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte1) +
                        ']!')
        result = byte1 << 6 * (totalBytes - 1)
        byte = self.input.readByte()
        _hx_local_8 = self
        _hx_local_9 = _hx_local_8.byteIndex
        _hx_local_8.byteIndex = _hx_local_9 + 1
        _hx_local_9
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        byte2 = byte & -129
        result = result + (byte2 << 6 * (totalBytes - 2))
        if isBit6Set:
            byte = self.input.readByte()
            _hx_local_11 = self
            _hx_local_12 = _hx_local_11.byteIndex
            _hx_local_11.byteIndex = _hx_local_12 + 1
            _hx_local_12
            if 1 != byte >> 7 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            if 1 == byte >> 6 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            byte3 = byte & -129
            result = result + (byte3 << 6 * (totalBytes - 3))
            if isBit5Set:
                byte = self.input.readByte()
                _hx_local_14 = self
                _hx_local_15 = _hx_local_14.byteIndex
                _hx_local_14.byteIndex = _hx_local_15 + 1
                _hx_local_15
                if 1 != byte >> 7 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                if 1 == byte >> 6 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                byte4 = byte & -129
                result = result + (byte4 << 6 * (totalBytes - 4))
        if self.index == 0 and result == 65279:
            return self.readUtf8Char()
        return result

    def readUtf8MultiSequenceByte(self):
        byte = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        return byte & -129

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.byteIndex = None
        _hx_o.input = None
        _hx_o.currCharIndex = None
        _hx_o.nextChar = None
        _hx_o.nextCharAvailable = None


class hx_strings__CharIterator_StringCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.StringCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = (0 if chars is None else len(chars)) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return HxString.charCodeAt(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings_Pattern:
    _hx_class_name = 'hx.strings.Pattern'
    __slots__ = 'pattern', 'options', 'ereg'
    _hx_fields = ['pattern', 'options', 'ereg']
    _hx_methods = ['matcher', 'replace', 'remove', 'split']
    _hx_statics = ['__meta__', 'compile']

    def __init__(self, pattern, options):
        self.pattern = pattern
        self.options = options
        self.ereg = EReg(pattern, options)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.options
        _hx_local_0.options = ('null' if _hx_local_1 is None else _hx_local_1
            ) + 'u'
        _hx_local_0.options

    def matcher(self, _hx_str):
        return hx_strings__Pattern_MatcherImpl(self.ereg, self.pattern,
            self.options, _hx_str)

    def replace(self, _hx_str, replaceWith):
        return self.ereg.replace(_hx_str, replaceWith)

    def remove(self, _hx_str):
        return self.ereg.replace(_hx_str, '')

    def split(self, _hx_str):
        return self.ereg.split(_hx_str)

    @staticmethod
    def compile(pattern, options=None):
        if options is None:
            return hx_strings_Pattern(pattern, '')
        _g = options
        tmp = None
        tmp1 = _g.index
        if tmp1 == 0:
            _hx_str = _g.params[0]
            str1 = hx_strings_Strings.toLowerCase8(_hx_str)
            if str1 is None or len(str1) == 0:
                tmp = str1
            else:

                def _hx_local_0(ch):
                    return ''.join(map(chr, [ch]))

                def _hx_local_1(ch):
                    _this = None
                    strLen = len('i')
                    if ch != (-1 if strLen == 0 or 0 >= strLen else
                        HxString.charCodeAt('i', 0)):
                        strLen = len('m')
                        _this = ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('m', 0))
                    else:
                        _this = True
                    if not _this:
                        strLen = len('g')
                        return ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('g', 0))
                    else:
                        return True
                _this = list(map(_hx_local_0, list(filter(_hx_local_1,
                    hx_strings_Strings.toChars(str1)))))
                tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        elif tmp1 == 1:
            opt = _g.params[0]
            tmp = Std.string(opt)
        elif tmp1 == 2:
            arr = _g.params[0]

            def _hx_local_2(m):
                return m is not None
            _this = list(filter(_hx_local_2, arr))
            tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        else:
            pass
        return hx_strings_Pattern(pattern, tmp)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.options = None
        _hx_o.ereg = None


class hx_strings_Matcher:
    _hx_class_name = 'hx.strings.Matcher'
    __slots__ = ()
    _hx_methods = ['iterate', 'map', 'matched', 'matchedPos', 'matches',
        'matchesInRegion', 'reset', 'substringAfterMatch',
        'substringBeforeMatch']
    _hx_statics = ['__meta__']


class hx_strings__Pattern_MatcherImpl:
    _hx_class_name = 'hx.strings._Pattern.MatcherImpl'
    __slots__ = 'ereg', 'isMatch', 'str'
    _hx_fields = ['ereg', 'isMatch', 'str']
    _hx_methods = ['reset', 'iterate', 'map', 'matched', 'matches',
        'matchesInRegion', 'matchedPos', 'substringAfterMatch',
        'substringBeforeMatch', '_cloneEReg']
    _hx_interfaces = [hx_strings_Matcher]

    def __init__(self, ereg, pattern, options, _hx_str):
        self.str = None
        self.isMatch = None
        self.ereg = None
        self.ereg = self._cloneEReg(ereg, pattern, options)
        self.str = _hx_str
        self.isMatch = None

    def reset(self, _hx_str):
        self.str = _hx_str
        self.isMatch = None
        return self

    def iterate(self, onMatch):
        startAt = 0
        while self.ereg.matchSub(self.str, startAt):
            self.isMatch = True
            _this = self.ereg
            matchedPos_pos = _this.matchObj.start()
            matchedPos_len = _this.matchObj.end() - _this.matchObj.start()
            onMatch(self)
            startAt = matchedPos_pos + matchedPos_len
        self.isMatch = False

    def map(self, mapper):
        _gthis = self

        def _hx_local_1():

            def _hx_local_0(ereg):
                _gthis.isMatch = True
                return mapper(_gthis)
            return self.ereg.map(self.str, _hx_local_0)
        return _hx_local_1()

    def matched(self, n=None):
        if n is None:
            n = 0
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        result = self.ereg.matchObj.group(n)
        return result

    def matches(self):
        _this = self.ereg
        _this.matchObj = python_lib_Re.search(_this.pattern, self.str)

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = _this.matchObj is not None
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchesInRegion(self, pos, _hx_len=None):
        if _hx_len is None:
            _hx_len = -1

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = self.ereg.matchSub(self.str, pos, _hx_len)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchedPos(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        _this = self.ereg
        return _hx_AnonObject({'pos': _this.matchObj.start(), 'len': _this.
            matchObj.end() - _this.matchObj.start()})

    def substringAfterMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, _this.matchObj.end(),
            None)

    def substringBeforeMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, 0, _this.matchObj.start()
            )

    def _cloneEReg(self, _hx_from, pattern, options):
        clone = Type.createEmptyInstance(EReg)
        value = Reflect.field(_hx_from, 'pattern')
        setattr(clone, '_hx_' + 'pattern' if 'pattern' in python_Boot.
            keywords else '_hx_' + 'pattern' if ((len('pattern') > 2 and 
            ord('pattern'[0]) == 95) and ord('pattern'[1]) == 95) and ord(
            'pattern'[len('pattern') - 1]) != 95 else 'pattern', value)
        value = Reflect.field(_hx_from, 'global')
        setattr(clone, '_hx_' + 'global' if 'global' in python_Boot.
            keywords else '_hx_' + 'global' if ((len('global') > 2 and ord(
            'global'[0]) == 95) and ord('global'[1]) == 95) and ord(
            'global'[len('global') - 1]) != 95 else 'global', value)
        return clone

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.ereg = None
        _hx_o.isMatch = None
        _hx_o.str = None


class hx_strings_StringBuilder:
    _hx_class_name = 'hx.strings.StringBuilder'
    __slots__ = 'sb', 'pre', 'len', 'length'
    _hx_fields = ['sb', 'pre', 'len']
    _hx_methods = ['get_length', 'add', 'addChar', 'addAll', 'clear',
        'isEmpty', 'newLine', 'insert', 'insertChar', 'insertAll',
        'asOutput', 'toString']

    def __init__(self, initialContent=None):
        self.length = None
        self.len = 0
        self.pre = None
        self.sb = StringBuf()
        if initialContent is not None:
            self.add(initialContent)

    def get_length(self):
        return self.len

    def add(self, item):
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
        _hx_local_0.len
        return self

    def addChar(self, ch):
        _this = self.sb
        s = ''.join(map(chr, [ch]))
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def addAll(self, items):
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_1 = self
            _hx_local_2 = _hx_local_1.len
            _hx_local_1.len = _hx_local_2 + (0 if item is None else len(item))
            _hx_local_1.len
        return self

    def clear(self):
        self.pre = None
        self.sb = StringBuf()
        self.len = 0
        return self

    def isEmpty(self):
        return self.len == 0

    def newLine(self):
        self.sb.b.write('\n')
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def insert(self, pos, item):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.add(item)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            self.pre.insert(0, item)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
            _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    self.pre.insert(i + 1, item)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + (0 if item is None else
                        len(item))
                    _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, item)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + (0 if item is None else
                        len(item))
                    _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_6 = self
        _hx_local_7 = _hx_local_6.len
        _hx_local_6.len = _hx_local_7 + (0 if item is None else len(item))
        _hx_local_6.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertChar(self, pos, ch):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addChar(ch)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            _this = self.pre
            x = ''.join(map(chr, [ch]))
            _this.insert(0, x)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + 1
            _hx_local_1
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    _this = self.pre
                    x = ''.join(map(chr, [ch]))
                    _this.insert(i + 1, x)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + 1
                    _hx_local_3
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    _this1 = self.pre
                    x1 = ''.join(map(chr, [ch]))
                    _this1.insert(i + 1, x1)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + 1
                    _hx_local_5
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.addChar(ch)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        self.addChar(ch)
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertAll(self, pos, items):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addAll(items)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            i = len(items)
            while True:
                tmp = i
                i = i - 1
                if not tmp > 0:
                    break
                item = items[i] if i >= 0 and i < len(items) else None
                self.pre.insert(0, item)
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.len
                _hx_local_0.len = _hx_local_1 + (0 if item is None else len
                    (item))
                _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    j = len(items)
                    while True:
                        tmp = j
                        j = j - 1
                        if not tmp > 0:
                            break
                        item = items[j] if j >= 0 and j < len(items) else None
                        self.pre.insert(i + 1, item)
                        _hx_local_2 = self
                        _hx_local_3 = _hx_local_2.len
                        _hx_local_2.len = _hx_local_3 + (0 if item is None else
                            len(item))
                        _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    j1 = len(items)
                    while True:
                        tmp1 = j1
                        j1 = j1 - 1
                        if not tmp1 > 0:
                            break
                        item1 = items[j1] if j1 >= 0 and j1 < len(items
                            ) else None
                        self.pre.insert(i + 1, item1)
                        _hx_local_4 = self
                        _hx_local_5 = _hx_local_4.len
                        _hx_local_4.len = _hx_local_5 + (0 if item1 is None
                             else len(item1))
                        _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            _g = 0
            while _g < len(items):
                item = items[_g] if _g >= 0 and _g < len(items) else None
                _g = _g + 1
                self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_8 = self
            _hx_local_9 = _hx_local_8.len
            _hx_local_8.len = _hx_local_9 + (0 if item is None else len(item))
            _hx_local_8.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def asOutput(self):
        return hx_strings__StringBuilder_OutputWrapper(self)

    def toString(self):
        if self.pre is None:
            return self.sb.b.getvalue()
        _this = self.pre
        _hx_str = HxOverrides.stringOrNull(''.join([python_Boot.toString1(
            x1, '') for x1 in _this])) + HxOverrides.stringOrNull(self.sb.b
            .getvalue())
        self.clear()
        self.add(_hx_str)
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.pre = None
        _hx_o.len = None


class hx_strings__StringBuilder_OutputWrapper(haxe_io_Output):
    _hx_class_name = 'hx.strings._StringBuilder.OutputWrapper'
    __slots__ = 'sb', 'bo'
    _hx_fields = ['sb', 'bo']
    _hx_methods = ['flush', 'writeByte', 'writeString']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output

    def __init__(self, sb):
        self.bo = None
        self.sb = sb

    def flush(self):
        if self.bo is not None and len(self.bo.b.b) > 0:
            self.sb.add(self.bo.getBytes().toString())

    def writeByte(self, c):
        if self.bo is None:
            self.bo = haxe_io_BytesOutput()
        self.bo.writeByte(c)

    def writeString(self, _hx_str, encoding=None):
        self.flush()
        self.sb.add(_hx_str)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.bo = None


class hx_strings_internal_OS:
    _hx_class_name = 'hx.strings.internal.OS'
    __slots__ = ()
    _hx_statics = ['isWindows']


class hx_strings_internal__Either3__Either3(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either3._Either3'
    _hx_constructs = ['a', 'b', 'c']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either3__Either3('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either3__Either3('b', 1, (v,))

    @staticmethod
    def c(v):
        return hx_strings_internal__Either3__Either3('c', 2, (v,))


class hx_strings_Strings:
    _hx_class_name = 'hx.strings.Strings'
    __slots__ = ()
    _hx_statics = ['REGEX_ANSI_ESC', 'REGEX_HTML_UNESCAPE',
        'REGEX_SPLIT_LINES', 'REGEX_REMOVE_XML_TAGS', 'POS_NOT_FOUND',
        'NEW_LINE_NIX', 'NEW_LINE_WIN', 'NEW_LINE', '_getNotFoundDefault',
        '_charCodeAt8Unsafe', '_splitAsciiWordsUnsafe', 'ansiToHtml',
        'appendIfMissing', 'base64Encode', 'base64Decode', 'charAt8',
        'charCodeAt8', 'compact', 'contains', 'containsOnly', 'containsAll',
        'containsAllIgnoreCase', 'containsAny', 'containsAnyIgnoreCase',
        'containsNone', 'containsNoneIgnoreCase', 'containsWhitespaces',
        'countMatches', 'countMatchesIgnoreCase', 'compare',
        'compareIgnoreCase', 'diff', 'diffAt', 'ellipsizeLeft',
        'ellipsizeMiddle', 'ellipsizeRight', 'endsWith', 'endsWithAny',
        'endsWithAnyIgnoreCase', 'endsWithIgnoreCase', 'equals',
        'equalsIgnoreCase', 'filter', 'filterChars', 'getFuzzyDistance',
        'getLevenshteinDistance', 'getLongestCommonSubstring', 'hashCode',
        'htmlDecode', 'htmlEncode', 'insertAt', 'ifBlank', 'ifEmpty',
        'ifNull', 'indentLines', 'indexOf8', 'isBlank', 'isDigits',
        'isEmpty', 'isNotBlank', 'isNotEmpty', 'isLowerCase', 'isUpperCase',
        'iterate', 'iterateChars', 'lastIndexOf8', 'length8', 'left',
        'lpad', 'map', 'prependIfMissing', 'quoteDouble', 'quoteSingle',
        'removeAfter', 'removeAfterLast', 'removeAfterIgnoreCase',
        'removeAfterLastIgnoreCase', 'removeAt', 'removeBefore',
        'removeBeforeLast', 'removeBeforeIgnoreCase',
        'removeBeforeLastIgnoreCase', 'removeAll', 'removeFirst',
        'removeFirstIgnoreCase', 'removeAnsi', 'removeLeading',
        'removeTags', 'removeTrailing', 'repeat', 'replaceAll',
        'replaceFirst', 'replaceFirstIgnoreCase', 'reverse', 'right',
        'rpad', 'split8', 'splitAt', 'splitEvery', 'splitLines',
        'startsWith', 'startsWithAny', 'startsWithAnyIgnoreCase',
        'startsWithIgnoreCase', 'substr8', 'substring8', 'substringAfter',
        'substringAfterIgnoreCase', 'substringBetween',
        'substringBetweenIgnoreCase', 'substringAfterLast',
        'substringAfterLastIgnoreCase', 'substringBefore',
        'substringBeforeIgnoreCase', 'substringBeforeLast',
        'substringBeforeLastIgnoreCase', 'toBool', 'toBytes', 'toChar',
        'toCharIterator', 'toChars', 'toPattern', 'toEReg', 'toFloat',
        'toHex', 'toInt', 'toLowerCase8', 'toLowerCaseFirstChar',
        'toLowerCamel', 'toLowerHyphen', 'toLowerUnderscore', 'toTitle',
        'toUpperCamel', 'toUpperUnderscore', 'toString', 'toUpperCase8',
        'toUpperCaseFirstChar', 'trim', 'trimRight', 'trimLeft',
        'trimLines', 'trimToNull', 'trimToEmpty', 'truncate', 'urlDecode',
        'urlEncode', 'wrap']

    @staticmethod
    def _getNotFoundDefault(_hx_str, notFoundDefault):
        notFoundDefault1 = notFoundDefault
        if notFoundDefault1 == 1:
            return None
        elif notFoundDefault1 == 2:
            return ''
        elif notFoundDefault1 == 3:
            return _hx_str
        else:
            pass

    @staticmethod
    def _charCodeAt8Unsafe(_hx_str, pos):
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def _splitAsciiWordsUnsafe(_hx_str):
        words = list()
        currentWord = hx_strings_StringBuilder()
        chars = hx_strings_Strings.toChars(_hx_str)
        _hx_len = len(chars)
        lastIndex = _hx_len - 1
        _g = 0
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = chars[i] if i >= 0 and i < len(chars) else None
            if ch > 64 and ch < 91 or ch > 96 and ch < 123:
                chNext = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                currentWord.addChar(ch)
                if chNext > 47 and chNext < 58:
                    x = currentWord.toString()
                    words.append(x)
                    currentWord.clear()
                elif ch in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    if (chNext in hx_strings__Char_Char_Impl_.
                        CHAR_CASE_MAPPER.mapU2L.h and len(chars) > i + 2):
                        if (not python_internal_ArrayImpl._get(chars, i + 2
                            ) in hx_strings__Char_Char_Impl_.
                            CHAR_CASE_MAPPER.mapU2L.h):
                            x1 = currentWord.toString()
                            words.append(x1)
                            currentWord.clear()
                elif chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    x2 = currentWord.toString()
                    words.append(x2)
                    currentWord.clear()
            elif ch > 47 and ch < 58:
                currentWord.addChar(ch)
                chNext1 = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                if not (chNext1 > 47 and chNext1 < 58):
                    x3 = currentWord.toString()
                    words.append(x3)
                    currentWord.clear()
            elif currentWord.len > 0:
                x4 = currentWord.toString()
                words.append(x4)
                currentWord.clear()
        if currentWord.len > 0:
            x = currentWord.toString()
            words.append(x)
        return words

    @staticmethod
    def ansiToHtml(_hx_str, renderMethod=None, initialState=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if renderMethod is None:
            renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
        styleOrClassAttribute = None
        styleOrClassAttribute1 = renderMethod.index
        if styleOrClassAttribute1 == 0:
            styleOrClassAttribute = 'style'
        elif styleOrClassAttribute1 == 1:
            styleOrClassAttribute = 'class'
        elif styleOrClassAttribute1 == 2:
            cb = renderMethod.params[0]
            styleOrClassAttribute = 'class'
        else:
            pass
        sb = hx_strings_StringBuilder()
        if initialState is not None and ((((initialState.fgcolor is not
            None or initialState.bgcolor is not None) or initialState.bold) or
            initialState.underline) or initialState.blink):
            sb.add('<span ' + ('null' if styleOrClassAttribute is None else
                styleOrClassAttribute) + '="').add(initialState.toCSS(
                renderMethod)).add('">')
        effectiveState = hx_strings_AnsiState(initialState)
        strLenMinus1 = (0 if _hx_str is None else len(_hx_str)) - 1
        i = -1
        lookAhead = hx_strings_StringBuilder()
        while i < strLenMinus1:
            i = i + 1
            ch = HxString.charCodeAt(_hx_str, i)
            if (ch == 27 and i < strLenMinus1) and HxString.charCodeAt(_hx_str,
                i + 1) == 91:
                lookAhead.clear()
                currentState = hx_strings_AnsiState(effectiveState)
                currentGraphicModeParam = 0
                isValidEscapeSequence = False
                i = i + 1
                while i < strLenMinus1:
                    i = i + 1
                    ch2 = HxString.charCodeAt(_hx_str, i)
                    lookAhead.addChar(ch2)
                    ch21 = ch2
                    if ch21 == 48:
                        currentGraphicModeParam = currentGraphicModeParam * 10
                    elif ch21 == 49:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 1)
                    elif ch21 == 50:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 2)
                    elif ch21 == 51:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 3)
                    elif ch21 == 52:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 4)
                    elif ch21 == 53:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 5)
                    elif ch21 == 54:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 6)
                    elif ch21 == 55:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 7)
                    elif ch21 == 56:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 8)
                    elif ch21 == 57:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 9)
                    elif ch21 == 59:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        currentGraphicModeParam = 0
                    elif ch21 == 109:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        if (((effectiveState.fgcolor is not None or 
                            effectiveState.bgcolor is not None) or
                            effectiveState.bold) or effectiveState.underline
                            ) or effectiveState.blink:
                            sb.add('</span>')
                        if (((currentState.fgcolor is not None or 
                            currentState.bgcolor is not None) or
                            currentState.bold) or currentState.underline
                            ) or currentState.blink:
                            sb.add('<span ' + ('null' if 
                                styleOrClassAttribute is None else
                                styleOrClassAttribute) + '="').add(currentState
                                .toCSS(renderMethod)).add('">')
                        effectiveState = currentState
                        isValidEscapeSequence = True
                        break
                    else:
                        break
                if not isValidEscapeSequence:
                    sb.addChar(27).add('[').add(Std.string(lookAhead))
            else:
                sb.addChar(ch)
        if (((effectiveState.fgcolor is not None or effectiveState.bgcolor
             is not None) or effectiveState.bold) or effectiveState.underline
            ) or effectiveState.blink:
            sb.add('</span>')
        return sb.toString()

    @staticmethod
    def appendIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if _hx_str is None else _hx_str) + ('null' if 
                suffix is None else suffix)
        if hx_strings_Strings.endsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if _hx_str is None else _hx_str) + ('null' if suffix is
            None else suffix)

    @staticmethod
    def base64Encode(plain):
        if plain is None:
            return None
        return haxe_crypto_Base64.encode(None if plain is None else
            haxe_io_Bytes.ofString(plain))

    @staticmethod
    def base64Decode(encoded):
        if encoded is None:
            return None
        return haxe_crypto_Base64.decode(encoded).toString()

    @staticmethod
    def charAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = ''
        if ((_hx_str is None or len(_hx_str) == 0) or pos < 0) or pos >= (0 if
            _hx_str is None else len(_hx_str)):
            return resultIfOutOfBound
        if pos < 0 or pos >= len(_hx_str):
            return ''
        else:
            return _hx_str[pos]

    @staticmethod
    def charCodeAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        if (strLen == 0 or pos < 0) or pos >= strLen:
            return resultIfOutOfBound
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def compact(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        needWhiteSpace = False
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            char = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if char > 8 and char < 14 or char == 32:
                if sb.len != 0:
                    needWhiteSpace = True
                continue
            elif needWhiteSpace:
                sb.addChar(32)
                needWhiteSpace = False
            sb.addChar(char)
        return sb.toString()

    @staticmethod
    def contains(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor == '':
            return True
        startIndex = None
        return (searchIn.find(searchFor) if startIndex is None else
            HxString.indexOfImpl(searchIn, searchFor, startIndex)) > -1

    @staticmethod
    def containsOnly(searchIn, allowedChars):
        if searchIn is None or len(searchIn) == 0:
            return True
        if allowedChars is None:
            return False
        allowedCharsArray = None
        _g = allowedChars
        allowedCharsArray1 = _g.index
        if allowedCharsArray1 == 0:
            _hx_str = _g.params[0]
            allowedCharsArray = hx_strings_Strings.toChars(_hx_str)
        elif allowedCharsArray1 == 1:
            chars = _g.params[0]
            allowedCharsArray = chars
        else:
            pass
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if python_internal_ArrayImpl.indexOf(allowedCharsArray, ch, None
                ) < 0:
                return False
        return True

    @staticmethod
    def containsAll(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAllIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsNone(searchIn, searchFor):
        return not hx_strings_Strings.containsAny(searchIn, searchFor)

    @staticmethod
    def containsNoneIgnoreCase(searchIn, searchFor):
        return not hx_strings_Strings.containsAnyIgnoreCase(searchIn, searchFor
            )

    @staticmethod
    def containsWhitespaces(searchIn):
        if searchIn is None:
            return False
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                return True
        return False

    @staticmethod
    def countMatches(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def countMatchesIgnoreCase(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        searchIn = searchIn.lower()
        searchFor = searchFor.lower()
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def compare(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def compareIgnoreCase(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        _hx_str = hx_strings_Strings.toLowerCase8(_hx_str)
        other = hx_strings_Strings.toLowerCase8(other)
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def diff(left, right):
        diff = hx_strings_StringDiff()
        diff.at = hx_strings_Strings.diffAt(left, right)
        diff.left = hx_strings_Strings.substr8(left, diff.at)
        diff.right = hx_strings_Strings.substr8(right, diff.at)
        return diff

    @staticmethod
    def diffAt(_hx_str, other):
        if _hx_str == other:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        otherLen = 0 if other is None else len(other)
        if strLen == 0 or otherLen == 0:
            return 0
        checkLen = otherLen if strLen > otherLen else strLen
        _g = 0
        _g1 = checkLen
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxString.charCodeAt(_hx_str, i) != HxString.charCodeAt(other, i
                ):
                return i
        return checkLen

    @staticmethod
    def ellipsizeLeft(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        return ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str, 
            maxLength - ellipsisLen))

    @staticmethod
    def ellipsizeMiddle(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        maxStrLen = maxLength - ellipsisLen
        leftLen = Math.floor(maxStrLen / 2 + 0.5)
        rightLen = maxStrLen - leftLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= leftLen else hx_strings_Strings.substring8(
            _hx_str, 0, leftLen)) + ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,
            rightLen))

    @staticmethod
    def ellipsizeRight(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        _hx_len = maxLength - ellipsisLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= _hx_len else hx_strings_Strings.substring8(
            _hx_str, 0, _hx_len)) + ('null' if ellipsis is None else ellipsis)

    @staticmethod
    def endsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return searchIn.endswith(searchFor)

    @staticmethod
    def endsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                candidate):
                return True
        return False

    @staticmethod
    def endsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def endsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return hx_strings_Strings.endsWith(searchIn.lower(), searchFor.lower())

    @staticmethod
    def equals(_hx_str, other):
        return _hx_str == other

    @staticmethod
    def equalsIgnoreCase(_hx_str, other):
        return hx_strings_Strings.toLowerCase8(_hx_str
            ) == hx_strings_Strings.toLowerCase8(other)

    @staticmethod
    def filter(_hx_str, _hx_filter, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = list(filter(_hx_filter, hx_strings_Strings.split8(_hx_str,
            [separator])))
        return separator.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def filterChars(_hx_str, _hx_filter):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(ch):
            return ''.join(map(chr, [ch]))
        _this = list(map(_hx_local_0, list(filter(_hx_filter,
            hx_strings_Strings.toChars(_hx_str)))))
        return ''.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def getFuzzyDistance(left, right):
        if (left is None or len(left) == 0) or (right is None or len(right) ==
            0):
            return 0
        left = hx_strings_Strings.toLowerCase8(left)
        right = hx_strings_Strings.toLowerCase8(right)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftLastMatchAt = -100
        rightLastMatchAt = -100
        score = 0
        _g = 0
        _g1 = len(leftChars)
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            leftChar = leftChars[leftIdx] if leftIdx >= 0 and leftIdx < len(
                leftChars) else None
            _g2 = rightLastMatchAt + 1 if rightLastMatchAt > -1 else 0
            _g3 = len(rightChars)
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                rightChar = rightChars[rightIdx
                    ] if rightIdx >= 0 and rightIdx < len(rightChars) else None
                if leftChar == rightChar:
                    score = score + 1
                    if (leftLastMatchAt == leftIdx - 1 and rightLastMatchAt ==
                        rightIdx - 1):
                        score = score + 2
                    leftLastMatchAt = leftIdx
                    rightLastMatchAt = rightIdx
                    break
        return score

    @staticmethod
    def getLevenshteinDistance(left, right):
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0:
            return rightLen
        if rightLen == 0:
            return leftLen
        if leftLen > rightLen:
            tmp = left
            left = right
            right = tmp
            tmpLen = leftLen
            leftLen = rightLen
            rightLen = tmpLen
        prevCosts = list()
        costs = list()
        _g = 0
        _g1 = leftLen + 1
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            prevCosts.append(leftIdx)
            costs.append(0)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)

        def _hx_local_0(a, b):
            if a > b:
                return b
            else:
                return a
        _hx_min = _hx_local_0
        _g = 1
        _g1 = rightLen + 1
        while _g < _g1:
            rightIdx = _g
            _g = _g + 1
            rightChar = python_internal_ArrayImpl._get(rightChars, rightIdx - 1
                )
            python_internal_ArrayImpl._set(costs, 0, rightIdx)
            _g2 = 1
            _g3 = leftLen + 1
            while _g2 < _g3:
                leftIdx = _g2
                _g2 = _g2 + 1
                leftIdxMinus1 = leftIdx - 1
                cost = 0 if (leftChars[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(leftChars) else None
                    ) == rightChar else 1
                python_internal_ArrayImpl._set(costs, leftIdx, _hx_min(
                    _hx_min((costs[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(costs) else None) + 1, (prevCosts[
                    leftIdx] if leftIdx >= 0 and leftIdx < len(prevCosts) else
                    None) + 1), (prevCosts[leftIdxMinus1] if leftIdxMinus1 >=
                    0 and leftIdxMinus1 < len(prevCosts) else None) + cost))
            tmp = prevCosts
            prevCosts = costs
            costs = tmp
        return prevCosts[leftLen] if leftLen >= 0 and leftLen < len(prevCosts
            ) else None

    @staticmethod
    def getLongestCommonSubstring(left, right):
        if left is None or right is None:
            return None
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0 or rightLen == 0:
            return ''
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftSubStartAt = 0
        leftSubLen = 0
        _g = 0
        _g1 = leftLen
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            _g2 = 0
            _g3 = rightLen
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                currLen = 0
                while python_internal_ArrayImpl._get(leftChars, leftIdx +
                    currLen) == python_internal_ArrayImpl._get(rightChars, 
                    rightIdx + currLen):
                    currLen = currLen + 1
                    if (leftIdx + currLen >= leftLen or rightIdx + currLen >=
                        rightLen):
                        break
                if currLen > leftSubLen:
                    leftSubLen = currLen
                    leftSubStartAt = leftIdx
        return hx_strings_Strings.substr8(left, leftSubStartAt, leftSubLen)

    @staticmethod
    def hashCode(_hx_str, algo=None):
        if _hx_str is None or len(_hx_str) == 0:
            return 0
        if algo is None:
            algo = hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC
        if algo is None:
            return hash(_hx_str)
        else:
            tmp = algo.index
            if tmp == 1:
                return haxe_crypto_Adler32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 2:
                return haxe_crypto_Crc32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 3:
                hc = 5381
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 + hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 ^ ch) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 4:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = ((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 - hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 + ch + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 5:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 6) + 2 ** 31) % 2 ** 32 - 2 ** 31 + (((
                        hc << 16) + 2 ** 31) % 2 ** 32 - 2 ** 31) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31 - hc + 2 ** 31) % 2 ** 32 - 2 **
                        31 + ch + 2 ** 31) % 2 ** 32 - 2 ** 31
                return hc
            else:
                return hash(_hx_str)

    @staticmethod
    def htmlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = hx_strings_Strings.REGEX_HTML_UNESCAPE

        def _hx_local_2():

            def _hx_local_1(m):
                match = m.matched()
                match1 = match
                _hx_local_0 = len(match1)
                if _hx_local_0 == 5:
                    if match1 == '&amp;':
                        return '&'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 4:
                    if match1 == '&gt;':
                        return '>'
                    elif match1 == '&lt;':
                        return '<'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 6:
                    if match1 == '&apos;':
                        return "'"
                    elif match1 == '&nbsp;':
                        return ' '
                    elif match1 == '&quot;':
                        return '"'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                else:
                    this1 = Std.parseInt(hx_strings_Strings.substr8(match, 
                        2, (0 if match is None else len(match)) - 3))
                    return ''.join(map(chr, [this1]))
            return hx_strings__Pattern_MatcherImpl(_this.ereg, _this.
                pattern, _this.options, _hx_str).map(_hx_local_1)
        return _hx_local_2()

    @staticmethod
    def htmlEncode(_hx_str, escapeQuotes=None):
        if escapeQuotes is None:
            escapeQuotes = False
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        isFirstSpace = True
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = HxString.charCodeAt(_hx_str, i)
            ch1 = ch
            if ch1 == 32:
                if isFirstSpace:
                    sb.add(' ')
                    isFirstSpace = False
                else:
                    sb.add('&nbsp;')
            elif ch1 == 34:
                sb.add('&quot;' if escapeQuotes else '"')
            elif ch1 == 38:
                sb.add('&amp;')
            elif ch1 == 39:
                sb.add('&#039;' if escapeQuotes else "'")
            elif ch1 == 60:
                sb.add('&lt;')
            elif ch1 == 62:
                sb.add('&gt;')
            elif ch > 127:
                sb.add('&#').add(Std.string(ch)).add(';')
            else:
                sb.addChar(ch)
            if ch != 32:
                isFirstSpace = True
        return sb.toString()

    @staticmethod
    def insertAt(_hx_str, pos, insertion):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0 or pos > strLen:
            raise haxe_Exception.thrown(
                'Absolute value of [pos] must be <= str.length')
        if insertion is None or len(insertion) == 0:
            return _hx_str
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + Std.string(insertion
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, pos))

    @staticmethod
    def ifBlank(_hx_str, fallback):
        if True if _hx_str is None else len(StringTools.trim(_hx_str)) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifEmpty(_hx_str, fallback):
        if _hx_str is None or len(_hx_str) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifNull(_hx_str, fallback):
        if _hx_str is None:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def indentLines(_hx_str, indentWith):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0 or (indentWith is None or len(indentWith) == 0):
            return _hx_str
        isFirstLine = True
        sb = hx_strings_StringBuilder()
        _g = 0
        _g1 = hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)
        while _g < len(_g1):
            line = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if isFirstLine:
                isFirstLine = False
            else:
                sb.newLine()
            sb.add(indentWith)
            sb.add(line)
        return sb.toString()

    @staticmethod
    def indexOf8(_hx_str, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt < 0:
            startAt = 0
        if searchForLen == 0:
            if startAt == 0:
                return 0
            if startAt > 0 and startAt < strLen:
                return startAt
            return strLen
        if startAt >= strLen:
            return -1
        if startAt is None:
            return _hx_str.find(searchFor)
        else:
            return HxString.indexOfImpl(_hx_str, searchFor, startAt)

    @staticmethod
    def isBlank(_hx_str):
        if _hx_str is None:
            return True
        else:
            return len(StringTools.trim(_hx_str)) == 0

    @staticmethod
    def isDigits(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            this1 = HxString.charCodeAt(_hx_str, i)
            if not (this1 > 47 and this1 < 58):
                return False
        return True

    @staticmethod
    def isEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) == 0
        else:
            return True

    @staticmethod
    def isNotBlank(_hx_str):
        if _hx_str is not None:
            return len(StringTools.trim(_hx_str)) > 0
        else:
            return False

    @staticmethod
    def isNotEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) > 0
        else:
            return False

    @staticmethod
    def isLowerCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toLowerCase8(_hx_str)

    @staticmethod
    def isUpperCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toUpperCase8(_hx_str)

    @staticmethod
    def iterate(_hx_str, callback, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = hx_strings_Strings.split8(_hx_str, [separator])
        while _g < len(_g1):
            sub = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            callback(sub)

    @staticmethod
    def iterateChars(_hx_str, callback):
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            callback(HxString.charCodeAt(_hx_str, i))

    @staticmethod
    def lastIndexOf8(_hx_str, searchFor, startAt=None):
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt is None:
            startAt = strLen
        if searchForLen == 0:
            if startAt < 0:
                return 0
            if startAt > strLen:
                return strLen
            return startAt
        if startAt < 0:
            return -1
        elif startAt >= strLen:
            startAt = strLen - 1
        strNeedsUTF8Workaround = len(_hx_str) != strLen
        searchForNeedsUTF8Workaround = len(searchFor) != searchForLen
        if searchForNeedsUTF8Workaround and not strNeedsUTF8Workaround:
            return -1
        searchForChars = hx_strings_Strings.toChars(searchFor)
        startAt = startAt + (searchForLen - 1)
        searchForPosToCheck = searchForLen - 1
        strPos = strLen
        while True:
            tmp = strPos
            strPos = strPos - 1
            if not tmp > 0:
                break
            if strPos > startAt:
                continue
            strCh = HxString.charCodeAt(_hx_str, strPos)
            if strCh == (searchForChars[searchForPosToCheck] if 
                searchForPosToCheck >= 0 and searchForPosToCheck < len(
                searchForChars) else None):
                if searchForPosToCheck == 0:
                    return strPos
                searchForPosToCheck = searchForPosToCheck - 1
            else:
                searchForPosToCheck = searchForLen - 1
        return -1

    @staticmethod
    def length8(_hx_str):
        if _hx_str is None:
            return 0
        return len(_hx_str)

    @staticmethod
    def left(_hx_str, _hx_len):
        if (0 if _hx_str is None else len(_hx_str)) <= _hx_len:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, 0, _hx_len)

    @staticmethod
    def lpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        sb = [_hx_str]
        padLen = 0 if padStr is None else len(padStr)
        while strLen < targetLength:
            sb.insert(0, padStr)
            strLen = strLen + padLen
        if canOverflow:
            return ''.join([python_Boot.toString1(x1, '') for x1 in sb])
        return hx_strings_Strings.right(''.join([python_Boot.toString1(x1,
            '') for x1 in sb]), targetLength)

    @staticmethod
    def map(_hx_str, mapper, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if separator is None:
            raise haxe_Exception.thrown('[separator] must not be null')
        return list(map(mapper, hx_strings_Strings.split8(_hx_str, [
            separator])))

    @staticmethod
    def prependIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if suffix is None else suffix) + ('null' if 
                _hx_str is None else _hx_str)
        if hx_strings_Strings.startsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if suffix is None else suffix) + ('null' if _hx_str is
            None else _hx_str)

    @staticmethod
    def quoteDouble(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return '""'
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find('"') if startIndex is None else HxString.
                indexOfImpl(_hx_str, '"', startIndex)) > -1
        if not tmp:
            return '"' + ('null' if _hx_str is None else _hx_str) + '"'
        return '"' + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, '"', '\\"')) + '"'

    @staticmethod
    def quoteSingle(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return "''"
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find("'") if startIndex is None else HxString.
                indexOfImpl(_hx_str, "'", startIndex)) > -1
        if not tmp:
            return "'" + ('null' if _hx_str is None else _hx_str) + "'"
        return "'" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, "'", "\\'")) + "'"

    @staticmethod
    def removeAfter(_hx_str, searchFor):
        return hx_strings_Strings.substringBefore(_hx_str, searchFor)

    @staticmethod
    def removeAfterLast(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLast(_hx_str, searchFor)

    @staticmethod
    def removeAfterIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeAfterLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAt(_hx_str, pos, length):
        if (_hx_str is None or len(_hx_str) == 0) or length < 1:
            return _hx_str
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0:
            raise haxe_Exception.thrown(
                '[pos] must be smaller than -1 * str.length')
        if pos + length >= strLen:
            return hx_strings_Strings.substring8(_hx_str, 0, pos)
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + HxOverrides.stringOrNull(hx_strings_Strings
            .substring8(_hx_str, pos + length))

    @staticmethod
    def removeBefore(_hx_str, searchFor):
        return hx_strings_Strings.substringAfter(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLast(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLast(_hx_str, searchFor)

    @staticmethod
    def removeBeforeIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAll(searchIn, searchFor):
        return hx_strings_Strings.replaceAll(searchIn, searchFor, '')

    @staticmethod
    def removeFirst(searchIn, searchFor):
        return hx_strings_Strings.replaceFirst(searchIn, searchFor, '')

    @staticmethod
    def removeFirstIgnoreCase(searchIn, searchFor):
        return hx_strings_Strings.replaceFirstIgnoreCase(searchIn,
            searchFor, '')

    @staticmethod
    def removeAnsi(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.REGEX_ANSI_ESC.ereg.replace(_hx_str, '')

    @staticmethod
    def removeLeading(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.startsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, len(searchFor), len(
                searchIn))
        return searchIn

    @staticmethod
    def removeTags(xml):
        if xml is None or len(xml) == 0:
            return xml
        return hx_strings_Strings.REGEX_REMOVE_XML_TAGS.ereg.replace(xml, '')

    @staticmethod
    def removeTrailing(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.endsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, 0, len(searchIn) - len(
                searchFor))
        return searchIn

    @staticmethod
    def repeat(_hx_str, count, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if count < 1:
            return ''
        if count == 1:
            return _hx_str
        _g = []
        _g1 = 0
        _g2 = count
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            _g.append(_hx_str)
        return separator.join([python_Boot.toString1(x1, '') for x1 in _g])

    @staticmethod
    def replaceAll(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        return StringTools.replace(searchIn, searchFor, replaceWith)

    @staticmethod
    def replaceFirst(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn, searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def replaceFirstIgnoreCase(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        searchFor = searchFor.lower()
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn.lower(), searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def reverse(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        chars = hx_strings_Strings.split8(_hx_str, [''])
        chars.reverse()
        return ''.join([python_Boot.toString1(x1, '') for x1 in chars])

    @staticmethod
    def right(_hx_str, _hx_len):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, (0 if _hx_str is None
             else len(_hx_str)) - _hx_len)

    @staticmethod
    def rpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        padLen = 0 if padStr is None else len(padStr)
        sb = hx_strings_StringBuilder(_hx_str)
        while strLen < targetLength:
            sb.add(padStr)
            strLen = strLen + padLen
        if canOverflow:
            return sb.toString()
        _hx_str = sb.toString()
        if (0 if _hx_str is None else len(_hx_str)) <= targetLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, targetLength)

    @staticmethod
    def split8(_hx_str, separator, maxParts=None):
        if maxParts is None:
            maxParts = 0
        if _hx_str is None or separator is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []

        def _hx_local_0(s):
            return s is not None
        separators = list(filter(_hx_local_0, separator))
        if len(separators) == 0:
            return None
        if maxParts <= 0 and len(separators) == 1:
            delimiter = separators[0] if 0 < len(separators) else None
            if delimiter == '':
                return list(_hx_str)
            else:
                return _hx_str.split(delimiter)
        if python_internal_ArrayImpl.indexOf(separators, '', None) > -1:
            if maxParts <= 0:
                _g = []
                _g1 = 0
                _g2 = strLen
                while _g1 < _g2:
                    i = _g1
                    _g1 = _g1 + 1
                    x = HxString.substr(_hx_str, i, 1)
                    _g.append(x)
                return _g
            if maxParts > strLen:
                maxParts = strLen
            maxParts = maxParts - 1
            _g = []
            _g1 = 0
            _g2 = maxParts
            while _g1 < _g2:
                i = _g1
                _g1 = _g1 + 1
                x = HxString.substr(_hx_str, i, 1)
                _g.append(x)
            result = _g
            x = HxString.substr(_hx_str, maxParts, strLen - maxParts)
            result.append(x)
            return result
        _g = []
        _g1 = 0
        while _g1 < len(separators):
            sep = separators[_g1] if _g1 >= 0 and _g1 < len(separators
                ) else None
            _g1 = _g1 + 1
            x = 0 if sep is None else len(sep)
            _g.append(x)
        separatorsLengths = _g
        lastFoundAt = 0
        result = []
        resultCount = 0
        while True:
            separatorLen = 0
            foundAt = -1
            _g = 0
            _g1 = len(separators)
            while _g < _g1:
                i = _g
                _g = _g + 1
                sepFoundAt = hx_strings_Strings.indexOf8(_hx_str, 
                    separators[i] if i >= 0 and i < len(separators) else
                    None, lastFoundAt)
                if sepFoundAt != -1:
                    if foundAt == -1 or sepFoundAt < foundAt:
                        foundAt = sepFoundAt
                        separatorLen = separatorsLengths[i
                            ] if i >= 0 and i < len(separatorsLengths
                            ) else None
            resultCount = resultCount + 1
            if foundAt == -1 or resultCount == maxParts:
                x = HxString.substr(_hx_str, lastFoundAt, strLen - lastFoundAt)
                result.append(x)
                break
            x1 = HxString.substr(_hx_str, lastFoundAt, foundAt - lastFoundAt)
            result.append(x1)
            lastFoundAt = foundAt + separatorLen
        return result

    @staticmethod
    def splitAt(_hx_str, splitPos):
        if _hx_str is None:
            return None
        if splitPos is None or len(splitPos) == 0:
            return [_hx_str]
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return [_hx_str]
        pos = list()
        _g = 0
        _g1 = splitPos
        while _g < len(_g1):
            p = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if p < 0:
                p = strLen + p
            if p < 0 or p >= strLen:
                continue
            if python_internal_ArrayImpl.indexOf(pos, p, None) > -1:
                continue
            pos.append(p)

        def _hx_local_1(a, b):
            if a < b:
                return -1
            elif a > b:
                return 1
            else:
                return 0
        pos.sort(key=python_lib_Functools.cmp_to_key(_hx_local_1))
        result = list()
        lastPos = 0
        _g = 0
        while _g < len(pos):
            p = pos[_g] if _g >= 0 and _g < len(pos) else None
            _g = _g + 1
            chunk = hx_strings_Strings.substring8(_hx_str, lastPos, p)
            if chunk is not None and len(chunk) > 0:
                result.append(chunk)
            lastPos = p
        chunk = hx_strings_Strings.substring8(_hx_str, lastPos)
        if chunk is not None and len(chunk) > 0:
            result.append(chunk)
        return result

    @staticmethod
    def splitEvery(_hx_str, count):
        if _hx_str is None:
            return None
        if count < 1:
            raise haxe_Exception.thrown('[count] must be greater than 0')
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0 or count >= strLen:
            return [_hx_str]
        result = list()
        pos = 0
        while True:
            chunk = hx_strings_Strings.substr8(_hx_str, pos, count)
            pos = pos + count
            if chunk is None or len(chunk) == 0:
                break
            result.append(chunk)
        return result

    @staticmethod
    def splitLines(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return []
        else:
            return hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)

    @staticmethod
    def startsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if (searchFor is None or len(searchFor) == 0) or searchIn == searchFor:
            return True
        return searchIn.startswith(searchFor)

    @staticmethod
    def startsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , candidate):
                return True
        return False

    @staticmethod
    def startsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def startsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor is None or len(searchFor) == 0:
            return True
        return hx_strings_Strings.startsWith(searchIn.lower(), searchFor.
            lower())

    @staticmethod
    def substr8(_hx_str, startAt, _hx_len=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if _hx_len is None:
            _hx_len = 0 if _hx_str is None else len(_hx_str)
        if _hx_len <= 0:
            return ''
        if startAt < 0:
            startAt = startAt + (0 if _hx_str is None else len(_hx_str))
            if startAt < 0:
                startAt = 0
        return HxString.substr(_hx_str, startAt, _hx_len)

    @staticmethod
    def substring8(_hx_str, startAt, endAt=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if endAt is None:
            endAt = 0 if _hx_str is None else len(_hx_str)
        return HxString.substring(_hx_str, startAt, endAt)

    @staticmethod
    def substringAfter(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBetween(_hx_str, after, before=None, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAfterAt = _hx_str.find(after
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = _hx_str.find(before
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringBetweenIgnoreCase(_hx_str, after, before=None,
        notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        strLower = hx_strings_Strings.toLowerCase8(_hx_str)
        after = hx_strings_Strings.toLowerCase8(after)
        before = hx_strings_Strings.toLowerCase8(before)
        startIndex = None
        foundAfterAt = strLower.find(after
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = strLower.find(before
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringAfterLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBefore(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None
        ):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def toBool(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = _hx_str.lower()
        _hx_local_0 = len(_g)
        if _hx_local_0 == 1:
            if _g == '0':
                return False
            else:
                return True
        elif _hx_local_0 == 5:
            if _g == 'false':
                return False
            else:
                return True
        elif _hx_local_0 == 2:
            if _g == 'no':
                return False
            else:
                return True
        else:
            return True

    @staticmethod
    def toBytes(_hx_str):
        if _hx_str is None:
            return None
        return haxe_io_Bytes.ofString(_hx_str)

    @staticmethod
    def toChar(charCode):
        return charCode

    @staticmethod
    def toCharIterator(_hx_str):
        if _hx_str is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        else:
            return hx_strings__CharIterator_StringCharIterator(_hx_str, 0)

    @staticmethod
    def toChars(_hx_str):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []
        _g = []
        _g1 = 0
        _g2 = strLen
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            x = HxString.charCodeAt(_hx_str, i)
            _g.append(x)
        return _g

    @staticmethod
    def toPattern(_hx_str, options=None):
        if _hx_str is None:
            return None
        return hx_strings_Pattern.compile(_hx_str, options)

    @staticmethod
    def toEReg(_hx_str, opt=None):
        if opt is None:
            opt = ''
        if _hx_str is None:
            return None
        return EReg(_hx_str, opt)

    @staticmethod
    def toFloat(_hx_str, ifUnparseable=None):
        result = Std.parseFloat(_hx_str)
        if python_lib_Math.isnan(result):
            return ifUnparseable
        return result

    @staticmethod
    def toHex(num, minDigits=None, upperCase=None):
        if minDigits is None:
            minDigits = 0
        if upperCase is None:
            upperCase = True
        hexed = StringTools.hex(num, 0)
        if not upperCase:
            return hexed.lower()
        if len(hexed) >= minDigits:
            return hexed
        return hx_strings_Strings.lpad(hexed, minDigits, '0')

    @staticmethod
    def toInt(_hx_str, ifUnparseable=None):
        result = Std.parseInt(_hx_str)
        if result is None:
            return ifUnparseable
        return result

    @staticmethod
    def toLowerCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.lower()

    @staticmethod
    def toLowerCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(
            this1, None)
        firstChar = this1 if lowerChar is None else lowerChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def toLowerCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return hx_strings_Strings.toLowerCaseFirstChar(sb.toString())

    @staticmethod
    def toLowerHyphen(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '-'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toLowerUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toTitle(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if keepUppercasedWords:

            def _hx_local_0(s):
                if hx_strings_Strings.toUpperCase8(s) == s:
                    return s
                else:
                    return hx_strings_Strings.toUpperCaseFirstChar(
                        hx_strings_Strings.toLowerCase8(s))
            _this = list(map(_hx_local_0, hx_strings_Strings.
                _splitAsciiWordsUnsafe(_hx_str)))
            return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

        def _hx_local_1(s):
            return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings
                .toLowerCase8(s))
        _this = list(map(_hx_local_1, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toUpperCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return sb.toString()

    @staticmethod
    def toUpperUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toUpperCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toString(_hx_str):
        if _hx_str is None:
            return 'null'
        else:
            return _hx_str

    @staticmethod
    def toUpperCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.upper()

    @staticmethod
    def toUpperCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(
            this1, None)
        firstChar = this1 if upperChar is None else upperChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def trim(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.trim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        this1 = hx_strings_internal__Either2__Either2.b(removableChars)
        this2 = hx_strings_internal__Either2__Either2.b(removableChars)
        return hx_strings_Strings.trimLeft(hx_strings_Strings.trimRight(
            _hx_str, this1), this2)

    @staticmethod
    def trimRight(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.rtrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = _hx_len - 1
        while True:
            tmp = None
            if i > -1:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i - 1
        if i < _hx_len - 1:
            return hx_strings_Strings.substring8(_hx_str, 0, i + 1)
        return _hx_str

    @staticmethod
    def trimLeft(_hx_str, charsToRemove=None):
        if _hx_str is None:
            return _hx_str
        if charsToRemove is None:
            return StringTools.ltrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = 0
        while True:
            tmp = None
            if i < _hx_len:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i + 1
        if i > 0:
            return hx_strings_Strings.substring8(_hx_str, i, _hx_len)
        return _hx_str

    @staticmethod
    def trimLines(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(line):
            return hx_strings_Strings.trim(line, charsToRemove)
        _this = list(map(_hx_local_0, hx_strings_Strings.REGEX_SPLIT_LINES.
            ereg.split(_hx_str)))
        return '\n'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def trimToNull(_hx_str):
        if _hx_str is None:
            return None
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return None
        return trimmed

    @staticmethod
    def trimToEmpty(_hx_str):
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return ''
        return trimmed

    @staticmethod
    def truncate(_hx_str, maxLength):
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, maxLength)

    @staticmethod
    def urlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.unquote(_hx_str)

    @staticmethod
    def urlEncode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.quote(_hx_str, '')

    @staticmethod
    def wrap(_hx_str, maxLineLength, splitLongWords=None, newLineSeparator=None
        ):
        if splitLongWords is None:
            splitLongWords = True
        if newLineSeparator is None:
            newLineSeparator = '\n'
        if (0 if _hx_str is None else len(_hx_str)
            ) <= maxLineLength or maxLineLength < 1:
            return _hx_str
        sb = hx_strings_StringBuilder()
        wordChars = []
        currLineLength = 0
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                if len(wordChars) > 0:
                    _g2 = 0
                    while _g2 < len(wordChars):
                        wordCh = wordChars[_g2] if _g2 >= 0 and _g2 < len(
                            wordChars) else None
                        _g2 = _g2 + 1
                        if currLineLength == maxLineLength and splitLongWords:
                            sb.add(newLineSeparator)
                            currLineLength = 0
                        currLineLength = currLineLength + 1
                        sb.addChar(wordCh)
                    wordChars = []
                if currLineLength >= maxLineLength:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                sb.addChar(ch)
                currLineLength = currLineLength + 1
            else:
                wordChars.append(ch)
        if len(wordChars) > 0:
            _g = 0
            while _g < len(wordChars):
                wordCh = wordChars[_g] if _g >= 0 and _g < len(wordChars
                    ) else None
                _g = _g + 1
                if currLineLength == maxLineLength and splitLongWords:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                currLineLength = currLineLength + 1
                sb.addChar(wordCh)
        return sb.toString()


class hx_strings_StringDiff:
    _hx_class_name = 'hx.strings.StringDiff'
    __slots__ = 'at', 'left', 'right'
    _hx_fields = ['at', 'left', 'right']
    _hx_methods = ['toString']

    def __init__(self):
        self.right = None
        self.left = None
        self.at = None

    def toString(self):
        return 'StringDiff[at=' + Std.string(self.at
            ) + ', left=' + HxOverrides.stringOrNull(self.left
            ) + ', right=' + HxOverrides.stringOrNull(self.right) + ']'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.at = None
        _hx_o.left = None
        _hx_o.right = None


class hx_strings_HashCodeAlgorithm(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.HashCodeAlgorithm'
    _hx_constructs = ['PLATFORM_SPECIFIC', 'ADLER32', 'CRC32B', 'DJB2A',
        'JAVA', 'SDBM']


<mask token>


class hx_strings_AnsiToHtmlRenderMethod(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.AnsiToHtmlRenderMethod'
    _hx_constructs = ['StyleAttributes', 'CssClasses', 'CssClassesCallback']

    @staticmethod
    def CssClassesCallback(func):
        return hx_strings_AnsiToHtmlRenderMethod('CssClassesCallback', 2, (
            func,))


<mask token>


class hx_strings_AnsiState:
    _hx_class_name = 'hx.strings.AnsiState'
    __slots__ = 'bgcolor', 'blink', 'bold', 'fgcolor', 'underline'
    _hx_fields = ['bgcolor', 'blink', 'bold', 'fgcolor', 'underline']
    _hx_methods = ['isActive', 'reset', 'copyFrom',
        'setGraphicModeParameter', 'toCSS']
    _hx_statics = ['defaultCssClassesCallback']

    def __init__(self, copyFrom=None):
        self.underline = None
        self.fgcolor = None
        self.bold = None
        self.blink = None
        self.bgcolor = None
        if copyFrom is None:
            self.reset()
        else:
            self.copyFrom(copyFrom)

    def isActive(self):
        if not (((self.fgcolor is not None or self.bgcolor is not None) or
            self.bold) or self.underline):
            return self.blink
        else:
            return True

    def reset(self):
        self.fgcolor = None
        self.bgcolor = None
        self.bold = False
        self.underline = False
        self.blink = False

    def copyFrom(self, other):
        self.fgcolor = other.fgcolor
        self.bgcolor = other.bgcolor
        self.bold = other.bold
        self.underline = other.underline
        self.blink = other.blink

    def setGraphicModeParameter(self, param):
        param1 = param
        if param1 == 0:
            self.reset()
        elif param1 == 1:
            self.bold = True
        elif param1 == 4:
            self.underline = True
        elif param1 == 5:
            self.blink = True
        elif param1 == 30:
            self.fgcolor = 'black'
        elif param1 == 31:
            self.fgcolor = 'red'
        elif param1 == 32:
            self.fgcolor = 'green'
        elif param1 == 33:
            self.fgcolor = 'yellow'
        elif param1 == 34:
            self.fgcolor = 'blue'
        elif param1 == 35:
            self.fgcolor = 'magenta'
        elif param1 == 36:
            self.fgcolor = 'cyan'
        elif param1 == 37:
            self.fgcolor = 'white'
        elif param1 == 40:
            self.bgcolor = 'black'
        elif param1 == 41:
            self.bgcolor = 'red'
        elif param1 == 42:
            self.bgcolor = 'green'
        elif param1 == 43:
            self.bgcolor = 'yellow'
        elif param1 == 44:
            self.bgcolor = 'blue'
        elif param1 == 45:
            self.bgcolor = 'magenta'
        elif param1 == 46:
            self.bgcolor = 'cyan'
        elif param1 == 47:
            self.bgcolor = 'white'
        else:
            pass

    def toCSS(self, renderMethod):
        if (((self.fgcolor is not None or self.bgcolor is not None) or self
            .bold) or self.underline) or self.blink:
            sb = hx_strings_StringBuilder()
            if renderMethod is None:
                renderMethod = (hx_strings_AnsiToHtmlRenderMethod.
                    StyleAttributes)
            tmp = renderMethod.index
            if tmp == 0:
                if self.fgcolor is not None:
                    sb.add('color:').add(self.fgcolor).add(';')
                if self.bgcolor is not None:
                    sb.add('background-color:').add(self.bgcolor).add(';')
                if self.bold:
                    sb.add('font-weight:bold;')
                if self.underline:
                    sb.add('text-decoration:underline;')
                if self.blink:
                    sb.add('text-decoration:blink;')
            elif tmp == 1:
                sb.add(hx_strings_AnsiState.defaultCssClassesCallback(self))
            elif tmp == 2:
                func = renderMethod.params[0]
                sb.add(func(self))
            else:
                pass
            return sb.toString()
        return ''

    @staticmethod
    def defaultCssClassesCallback(state):
        classes = []
        if state.fgcolor is not None:
            x = 'ansi_fg_' + HxOverrides.stringOrNull(state.fgcolor)
            classes.append(x)
        if state.bgcolor is not None:
            x = 'ansi_bg_' + HxOverrides.stringOrNull(state.bgcolor)
            classes.append(x)
        if state.bold:
            classes.append('ansi_bold')
        if state.underline:
            classes.append('ansi_underline')
        if state.blink:
            classes.append('ansi_blink')
        return ' '.join([python_Boot.toString1(x1, '') for x1 in classes])

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bgcolor = None
        _hx_o.blink = None
        _hx_o.bold = None
        _hx_o.fgcolor = None
        _hx_o.underline = None


class hx_strings_internal_Bits:
    _hx_class_name = 'hx.strings.internal.Bits'
    __slots__ = ()
    _hx_statics = ['clearBit', 'setBit', 'toggleBit', 'getBit']

    @staticmethod
    def clearBit(num, bitPos):
        return num & ~(1 << bitPos - 1)

    @staticmethod
    def setBit(num, bitPos):
        return num | 1 << bitPos - 1

    @staticmethod
    def toggleBit(num, bitPos):
        return num ^ 1 << bitPos - 1

    @staticmethod
    def getBit(num, bitPos):
        return 1 == num >> bitPos - 1 & 1


class hx_strings_internal__Either2_Either2_Impl_:
    _hx_class_name = 'hx.strings.internal._Either2.Either2_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either2__Either2.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either2__Either2.b(value)
        return this1


class hx_strings_internal__Either2__Either2(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either2._Either2'
    _hx_constructs = ['a', 'b']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either2__Either2('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either2__Either2('b', 1, (v,))


class hx_strings_internal__Either3_Either3_Impl_:
    _hx_class_name = 'hx.strings.internal._Either3.Either3_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB', 'fromC']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either3__Either3.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either3__Either3.b(value)
        return this1

    @staticmethod
    def fromC(value):
        this1 = hx_strings_internal__Either3__Either3.c(value)
        return this1


class hx_strings_internal__OneOrMany_OneOrMany_Impl_:
    _hx_class_name = 'hx.strings.internal._OneOrMany.OneOrMany_Impl_'
    __slots__ = ()
    _hx_statics = ['fromSingle']

    @staticmethod
    def fromSingle(value):
        return [value]


class hx_strings_internal__RingBuffer_RingBuffer_Impl_:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBuffer_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get']

    @staticmethod
    def _new(size):
        this1 = hx_strings_internal__RingBuffer_RingBufferImpl(size)
        return this1

    @staticmethod
    def get(this1, index):
        return this1.get(index)


class hx_strings_internal__RingBuffer_RingBufferIterator:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBufferIterator'
    __slots__ = 'buff', 'idx'
    _hx_fields = ['buff', 'idx']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, buff):
        self.idx = -1
        self.buff = buff

    def hasNext(self):
        return self.idx + 1 < self.buff.length

    def next(self):
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.idx
        _hx_local_0.idx = _hx_local_1 + 1
        _hx_local_1
        return self.buff.get(self.idx)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buff = None
        _hx_o.idx = None


class python_HaxeIterator:
    _hx_class_name = 'python.HaxeIterator'
    __slots__ = 'it', 'x', 'has', 'checked'
    _hx_fields = ['it', 'x', 'has', 'checked']
    _hx_methods = ['next', 'hasNext']

    def __init__(self, it):
        self.checked = False
        self.has = False
        self.x = None
        self.it = it

    def next(self):
        if not self.checked:
            self.hasNext()
        self.checked = False
        return self.x

    def hasNext(self):
        if not self.checked:
            try:
                self.x = self.it.__next__()
                self.has = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),
                    StopIteration):
                    self.has = False
                    self.x = None
                else:
                    raise _g
            self.checked = True
        return self.has

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.it = None
        _hx_o.x = None
        _hx_o.has = None
        _hx_o.checked = None


class python_internal_ArrayImpl:
    _hx_class_name = 'python.internal.ArrayImpl'
    __slots__ = ()
    _hx_statics = ['concat', 'copy', 'iterator', 'keyValueIterator',
        'indexOf', 'lastIndexOf', 'join', 'toString', 'pop', 'push',
        'unshift', 'remove', 'contains', 'shift', 'slice', 'sort', 'splice',
        'map', 'filter', 'insert', 'reverse', '_get', '_set']

    @staticmethod
    def concat(a1, a2):
        return a1 + a2

    @staticmethod
    def copy(x):
        return list(x)

    @staticmethod
    def iterator(x):
        return python_HaxeIterator(x.__iter__())

    @staticmethod
    def keyValueIterator(x):
        return haxe_iterators_ArrayKeyValueIterator(x)

    @staticmethod
    def indexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (0 if fromIndex is None else _hx_len + fromIndex if fromIndex <
            0 else fromIndex)
        if l < 0:
            l = 0
        _g = l
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxOverrides.eq(a[i], x):
                return i
        return -1

    @staticmethod
    def lastIndexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (_hx_len if fromIndex is None else _hx_len + fromIndex + 1 if 
            fromIndex < 0 else fromIndex + 1)
        if l > _hx_len:
            l = _hx_len
        while True:
            l = l - 1
            tmp = l
            if not tmp > -1:
                break
            if HxOverrides.eq(a[l], x):
                return l
        return -1

    @staticmethod
    def join(x, sep):
        return sep.join([python_Boot.toString1(x1, '') for x1 in x])

    @staticmethod
    def toString(x):
        return '[' + HxOverrides.stringOrNull(','.join([python_Boot.
            toString1(x1, '') for x1 in x])) + ']'

    @staticmethod
    def pop(x):
        if len(x) == 0:
            return None
        else:
            return x.pop()

    @staticmethod
    def push(x, e):
        x.append(e)
        return len(x)

    @staticmethod
    def unshift(x, e):
        x.insert(0, e)

    @staticmethod
    def remove(x, e):
        try:
            x.remove(e)
            return True
        except BaseException as _g:
            return False

    @staticmethod
    def contains(x, e):
        return e in x

    @staticmethod
    def shift(x):
        if len(x) == 0:
            return None
        return x.pop(0)

    @staticmethod
    def slice(x, pos, end=None):
        return x[pos:end]

    @staticmethod
    def sort(x, f):
        x.sort(key=python_lib_Functools.cmp_to_key(f))

    @staticmethod
    def splice(x, pos, _hx_len):
        if pos < 0:
            pos = len(x) + pos
        if pos < 0:
            pos = 0
        res = x[pos:pos + _hx_len]
        del x[pos:pos + _hx_len]
        return res

    @staticmethod
    def map(x, f):
        return list(map(f, x))

    @staticmethod
    def filter(x, f):
        return list(filter(f, x))

    @staticmethod
    def insert(a, pos, x):
        a.insert(pos, x)

    @staticmethod
    def reverse(a):
        a.reverse()

    @staticmethod
    def _get(x, idx):
        if idx > -1 and idx < len(x):
            return x[idx]
        else:
            return None

    @staticmethod
    def _set(x, idx, v):
        l = len(x)
        while l < idx:
            x.append(None)
            l = l + 1
        if l == idx:
            x.append(v)
        else:
            x[idx] = v
        return v


class HxOverrides:
    _hx_class_name = 'HxOverrides'
    __slots__ = ()
    _hx_statics = ['eq', 'stringOrNull', 'rshift', 'modf', 'mod']

    @staticmethod
    def eq(a, b):
        if isinstance(a, list) or isinstance(b, list):
            return a is b
        return a == b

    @staticmethod
    def stringOrNull(s):
        if s is None:
            return 'null'
        else:
            return s

    @staticmethod
    def rshift(val, n):
        return val % 4294967296 >> n

    @staticmethod
    def modf(a, b):
        if b == 0.0:
            return float('nan')
        elif a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b

    @staticmethod
    def mod(a, b):
        if a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b


class python_internal_MethodClosure:
    _hx_class_name = 'python.internal.MethodClosure'
    __slots__ = 'obj', 'func'
    _hx_fields = ['obj', 'func']
    _hx_methods = ['__call__']

    def __init__(self, obj, func):
        self.obj = obj
        self.func = func

    def __call__(self, *args):
        return self.func(self.obj, *args)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.obj = None
        _hx_o.func = None


class sys_io_File:
    _hx_class_name = 'sys.io.File'
    __slots__ = ()
    _hx_statics = ['getContent']

    @staticmethod
    def getContent(path):
        f = python_lib_Builtins.open(path, 'r', -1, 'utf-8', None, '')
        content = f.read(-1)
        f.close()
        return content


<mask token>

<mask token>


class haxe_io_Output:
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>


class haxe_io_BytesOutput(haxe_io_Output):
    _hx_class_name = 'haxe.io.BytesOutput'
    __slots__ = 'b',
    _hx_fields = ['b']
    _hx_methods = ['writeByte', 'getBytes']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output

    def __init__(self):
        self.b = haxe_io_BytesBuffer()
        self.set_bigEndian(False)

    def writeByte(self, c):
        self.b.b.append(c)

    def getBytes(self):
        return self.b.getBytes()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class haxe_io_Encoding(Enum):
    __slots__ = ()
    _hx_class_name = 'haxe.io.Encoding'
    _hx_constructs = ['UTF8', 'RawNative']


<mask token>


class haxe_io_Eof:
    _hx_class_name = 'haxe.io.Eof'
    __slots__ = ()
    _hx_methods = ['toString']

    def __init__(self):
        pass

    def toString(self):
        return 'Eof'

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class haxe_io_Error(Enum):
    __slots__ = ()
    _hx_class_name = 'haxe.io.Error'
    _hx_constructs = ['Blocked', 'Overflow', 'OutsideBounds', 'Custom']

    @staticmethod
    def Custom(e):
        return haxe_io_Error('Custom', 3, (e,))


<mask token>


class haxe_io_Input:
    _hx_class_name = 'haxe.io.Input'
    __slots__ = ()
    _hx_methods = ['readByte']

    def readByte(self):
        raise haxe_exceptions_NotImplementedException(None, None,
            _hx_AnonObject({'fileName': 'haxe/io/Input.hx', 'lineNumber': 
            53, 'className': 'haxe.io.Input', 'methodName': 'readByte'}))

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class haxe_iterators_ArrayIterator:
    _hx_class_name = 'haxe.iterators.ArrayIterator'
    __slots__ = 'array', 'current'
    _hx_fields = ['array', 'current']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, array):
        self.current = 0
        self.array = array

    def hasNext(self):
        return self.current < len(self.array)

    def next(self):

        def _hx_local_3():

            def _hx_local_2():
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = _hx_local_1 + 1
                return _hx_local_1
            return python_internal_ArrayImpl._get(self.array, _hx_local_2())
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.array = None
        _hx_o.current = None


class haxe_iterators_ArrayKeyValueIterator:
    _hx_class_name = 'haxe.iterators.ArrayKeyValueIterator'
    __slots__ = 'current', 'array'
    _hx_fields = ['current', 'array']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, array):
        self.current = 0
        self.array = array

    def hasNext(self):
        return self.current < len(self.array)

    def next(self):

        def _hx_local_3():

            def _hx_local_2():
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = _hx_local_1 + 1
                return _hx_local_1
            return _hx_AnonObject({'value': python_internal_ArrayImpl._get(
                self.array, self.current), 'key': _hx_local_2()})
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.current = None
        _hx_o.array = None


class hx_strings__AnyAsString_AnyAsString_Impl_:
    _hx_class_name = 'hx.strings._AnyAsString.AnyAsString_Impl_'
    __slots__ = ()
    _hx_statics = ['fromBool', 'fromAny']

    @staticmethod
    def fromBool(value):
        if value:
            return 'true'
        else:
            return 'false'

    @staticmethod
    def fromAny(value):
        return Std.string(value)


class hx_strings__Char_CharCaseMapper:
    _hx_class_name = 'hx.strings._Char.CharCaseMapper'
    __slots__ = 'mapU2L', 'mapL2U'
    _hx_fields = ['mapU2L', 'mapL2U']
    _hx_methods = ['_addCaseMapping', 'isLowerCase', 'isUpperCase',
        'toLowerCase', 'toUpperCase']

    def __init__(self):
        self.mapL2U = haxe_ds_IntMap()
        self.mapU2L = haxe_ds_IntMap()
        self._addCaseMapping(97, 65)
        self._addCaseMapping(98, 66)
        self._addCaseMapping(99, 67)
        self._addCaseMapping(100, 68)
        self._addCaseMapping(101, 69)
        self._addCaseMapping(102, 70)
        self._addCaseMapping(103, 71)
        self._addCaseMapping(104, 72)
        self._addCaseMapping(105, 73)
        self._addCaseMapping(106, 74)
        self._addCaseMapping(107, 75)
        self._addCaseMapping(108, 76)
        self._addCaseMapping(109, 77)
        self._addCaseMapping(110, 78)
        self._addCaseMapping(111, 79)
        self._addCaseMapping(112, 80)
        self._addCaseMapping(113, 81)
        self._addCaseMapping(114, 82)
        self._addCaseMapping(115, 83)
        self._addCaseMapping(116, 84)
        self._addCaseMapping(117, 85)
        self._addCaseMapping(118, 86)
        self._addCaseMapping(119, 87)
        self._addCaseMapping(120, 88)
        self._addCaseMapping(121, 89)
        self._addCaseMapping(122, 90)
        self._addCaseMapping(224, 192)
        self._addCaseMapping(225, 193)
        self._addCaseMapping(226, 194)
        self._addCaseMapping(227, 195)
        self._addCaseMapping(228, 196)
        self._addCaseMapping(229, 197)
        self._addCaseMapping(230, 198)
        self._addCaseMapping(231, 199)
        self._addCaseMapping(232, 200)
        self._addCaseMapping(233, 201)
        self._addCaseMapping(234, 202)
        self._addCaseMapping(235, 203)
        self._addCaseMapping(236, 204)
        self._addCaseMapping(237, 205)
        self._addCaseMapping(238, 206)
        self._addCaseMapping(239, 207)
        self._addCaseMapping(240, 208)
        self._addCaseMapping(241, 209)
        self._addCaseMapping(242, 210)
        self._addCaseMapping(243, 211)
        self._addCaseMapping(244, 212)
        self._addCaseMapping(245, 213)
        self._addCaseMapping(246, 214)
        self._addCaseMapping(248, 216)
        self._addCaseMapping(249, 217)
        self._addCaseMapping(250, 218)
        self._addCaseMapping(251, 219)
        self._addCaseMapping(252, 220)
        self._addCaseMapping(253, 221)
        self._addCaseMapping(254, 222)
        self._addCaseMapping(255, 376)
        self._addCaseMapping(257, 256)
        self._addCaseMapping(259, 258)
        self._addCaseMapping(261, 260)
        self._addCaseMapping(263, 262)
        self._addCaseMapping(265, 264)
        self._addCaseMapping(267, 266)
        self._addCaseMapping(269, 268)
        self._addCaseMapping(271, 270)
        self._addCaseMapping(273, 272)
        self._addCaseMapping(275, 274)
        self._addCaseMapping(277, 276)
        self._addCaseMapping(279, 278)
        self._addCaseMapping(281, 280)
        self._addCaseMapping(283, 282)
        self._addCaseMapping(285, 284)
        self._addCaseMapping(287, 286)
        self._addCaseMapping(289, 288)
        self._addCaseMapping(291, 290)
        self._addCaseMapping(293, 292)
        self._addCaseMapping(295, 294)
        self._addCaseMapping(297, 296)
        self._addCaseMapping(299, 298)
        self._addCaseMapping(301, 300)
        self._addCaseMapping(303, 302)
        self._addCaseMapping(305, 73)
        self._addCaseMapping(307, 306)
        self._addCaseMapping(309, 308)
        self._addCaseMapping(311, 310)
        self._addCaseMapping(314, 313)
        self._addCaseMapping(316, 315)
        self._addCaseMapping(318, 317)
        self._addCaseMapping(320, 319)
        self._addCaseMapping(322, 321)
        self._addCaseMapping(324, 323)
        self._addCaseMapping(326, 325)
        self._addCaseMapping(328, 327)
        self._addCaseMapping(331, 330)
        self._addCaseMapping(333, 332)
        self._addCaseMapping(335, 334)
        self._addCaseMapping(337, 336)
        self._addCaseMapping(339, 338)
        self._addCaseMapping(341, 340)
        self._addCaseMapping(343, 342)
        self._addCaseMapping(345, 344)
        self._addCaseMapping(347, 346)
        self._addCaseMapping(349, 348)
        self._addCaseMapping(351, 350)
        self._addCaseMapping(353, 352)
        self._addCaseMapping(355, 354)
        self._addCaseMapping(357, 356)
        self._addCaseMapping(359, 358)
        self._addCaseMapping(361, 360)
        self._addCaseMapping(363, 362)
        self._addCaseMapping(365, 364)
        self._addCaseMapping(367, 366)
        self._addCaseMapping(369, 368)
        self._addCaseMapping(371, 370)
        self._addCaseMapping(373, 372)
        self._addCaseMapping(375, 374)
        self._addCaseMapping(378, 377)
        self._addCaseMapping(380, 379)
        self._addCaseMapping(382, 381)
        self._addCaseMapping(387, 386)
        self._addCaseMapping(389, 388)
        self._addCaseMapping(392, 391)
        self._addCaseMapping(396, 395)
        self._addCaseMapping(402, 401)
        self._addCaseMapping(409, 408)
        self._addCaseMapping(417, 416)
        self._addCaseMapping(419, 418)
        self._addCaseMapping(421, 420)
        self._addCaseMapping(424, 423)
        self._addCaseMapping(429, 428)
        self._addCaseMapping(432, 431)
        self._addCaseMapping(436, 435)
        self._addCaseMapping(438, 437)
        self._addCaseMapping(441, 440)
        self._addCaseMapping(445, 444)
        self._addCaseMapping(454, 452)
        self._addCaseMapping(457, 455)
        self._addCaseMapping(460, 458)
        self._addCaseMapping(462, 461)
        self._addCaseMapping(464, 463)
        self._addCaseMapping(466, 465)
        self._addCaseMapping(468, 467)
        self._addCaseMapping(470, 469)
        self._addCaseMapping(472, 471)
        self._addCaseMapping(474, 473)
        self._addCaseMapping(476, 475)
        self._addCaseMapping(479, 478)
        self._addCaseMapping(481, 480)
        self._addCaseMapping(483, 482)
        self._addCaseMapping(485, 484)
        self._addCaseMapping(487, 486)
        self._addCaseMapping(489, 488)
        self._addCaseMapping(491, 490)
        self._addCaseMapping(493, 492)
        self._addCaseMapping(495, 494)
        self._addCaseMapping(499, 497)
        self._addCaseMapping(501, 500)
        self._addCaseMapping(507, 506)
        self._addCaseMapping(509, 508)
        self._addCaseMapping(511, 510)
        self._addCaseMapping(513, 512)
        self._addCaseMapping(515, 514)
        self._addCaseMapping(517, 516)
        self._addCaseMapping(519, 518)
        self._addCaseMapping(521, 520)
        self._addCaseMapping(523, 522)
        self._addCaseMapping(525, 524)
        self._addCaseMapping(527, 526)
        self._addCaseMapping(529, 528)
        self._addCaseMapping(531, 530)
        self._addCaseMapping(533, 532)
        self._addCaseMapping(535, 534)
        self._addCaseMapping(595, 385)
        self._addCaseMapping(596, 390)
        self._addCaseMapping(599, 394)
        self._addCaseMapping(600, 398)
        self._addCaseMapping(601, 399)
        self._addCaseMapping(603, 400)
        self._addCaseMapping(608, 403)
        self._addCaseMapping(611, 404)
        self._addCaseMapping(616, 407)
        self._addCaseMapping(617, 406)
        self._addCaseMapping(623, 412)
        self._addCaseMapping(626, 413)
        self._addCaseMapping(629, 415)
        self._addCaseMapping(643, 425)
        self._addCaseMapping(648, 430)
        self._addCaseMapping(650, 433)
        self._addCaseMapping(651, 434)
        self._addCaseMapping(658, 439)
        self._addCaseMapping(924, 181)
        self._addCaseMapping(940, 902)
        self._addCaseMapping(941, 904)
        self._addCaseMapping(942, 905)
        self._addCaseMapping(943, 906)
        self._addCaseMapping(945, 913)
        self._addCaseMapping(946, 914)
        self._addCaseMapping(947, 915)
        self._addCaseMapping(948, 916)
        self._addCaseMapping(949, 917)
        self._addCaseMapping(950, 918)
        self._addCaseMapping(951, 919)
        self._addCaseMapping(952, 920)
        self._addCaseMapping(953, 921)
        self._addCaseMapping(954, 922)
        self._addCaseMapping(955, 923)
        self._addCaseMapping(956, 924)
        self._addCaseMapping(957, 925)
        self._addCaseMapping(958, 926)
        self._addCaseMapping(959, 927)
        self._addCaseMapping(960, 928)
        self._addCaseMapping(961, 929)
        self._addCaseMapping(963, 931)
        self._addCaseMapping(964, 932)
        self._addCaseMapping(965, 933)
        self._addCaseMapping(966, 934)
        self._addCaseMapping(967, 935)
        self._addCaseMapping(968, 936)
        self._addCaseMapping(969, 937)
        self._addCaseMapping(970, 938)
        self._addCaseMapping(971, 939)
        self._addCaseMapping(972, 908)
        self._addCaseMapping(973, 910)
        self._addCaseMapping(974, 911)
        self._addCaseMapping(995, 994)
        self._addCaseMapping(997, 996)
        self._addCaseMapping(999, 998)
        self._addCaseMapping(1001, 1000)
        self._addCaseMapping(1003, 1002)
        self._addCaseMapping(1005, 1004)
        self._addCaseMapping(1007, 1006)
        self._addCaseMapping(1072, 1040)
        self._addCaseMapping(1073, 1041)
        self._addCaseMapping(1074, 1042)
        self._addCaseMapping(1075, 1043)
        self._addCaseMapping(1076, 1044)
        self._addCaseMapping(1077, 1045)
        self._addCaseMapping(1078, 1046)
        self._addCaseMapping(1079, 1047)
        self._addCaseMapping(1080, 1048)
        self._addCaseMapping(1081, 1049)
        self._addCaseMapping(1082, 1050)
        self._addCaseMapping(1083, 1051)
        self._addCaseMapping(1084, 1052)
        self._addCaseMapping(1085, 1053)
        self._addCaseMapping(1086, 1054)
        self._addCaseMapping(1087, 1055)
        self._addCaseMapping(1088, 1056)
        self._addCaseMapping(1089, 1057)
        self._addCaseMapping(1090, 1058)
        self._addCaseMapping(1091, 1059)
        self._addCaseMapping(1092, 1060)
        self._addCaseMapping(1093, 1061)
        self._addCaseMapping(1094, 1062)
        self._addCaseMapping(1095, 1063)
        self._addCaseMapping(1096, 1064)
        self._addCaseMapping(1097, 1065)
        self._addCaseMapping(1098, 1066)
        self._addCaseMapping(1099, 1067)
        self._addCaseMapping(1100, 1068)
        self._addCaseMapping(1101, 1069)
        self._addCaseMapping(1102, 1070)
        self._addCaseMapping(1103, 1071)
        self._addCaseMapping(1105, 1025)
        self._addCaseMapping(1106, 1026)
        self._addCaseMapping(1107, 1027)
        self._addCaseMapping(1108, 1028)
        self._addCaseMapping(1109, 1029)
        self._addCaseMapping(1110, 1030)
        self._addCaseMapping(1111, 1031)
        self._addCaseMapping(1112, 1032)
        self._addCaseMapping(1113, 1033)
        self._addCaseMapping(1114, 1034)
        self._addCaseMapping(1115, 1035)
        self._addCaseMapping(1116, 1036)
        self._addCaseMapping(1118, 1038)
        self._addCaseMapping(1119, 1039)
        self._addCaseMapping(1121, 1120)
        self._addCaseMapping(1123, 1122)
        self._addCaseMapping(1125, 1124)
        self._addCaseMapping(1127, 1126)
        self._addCaseMapping(1129, 1128)
        self._addCaseMapping(1131, 1130)
        self._addCaseMapping(1133, 1132)
        self._addCaseMapping(1135, 1134)
        self._addCaseMapping(1137, 1136)
        self._addCaseMapping(1139, 1138)
        self._addCaseMapping(1141, 1140)
        self._addCaseMapping(1143, 1142)
        self._addCaseMapping(1145, 1144)
        self._addCaseMapping(1147, 1146)
        self._addCaseMapping(1149, 1148)
        self._addCaseMapping(1151, 1150)
        self._addCaseMapping(1153, 1152)
        self._addCaseMapping(1169, 1168)
        self._addCaseMapping(1171, 1170)
        self._addCaseMapping(1173, 1172)
        self._addCaseMapping(1175, 1174)
        self._addCaseMapping(1177, 1176)
        self._addCaseMapping(1179, 1178)
        self._addCaseMapping(1181, 1180)
        self._addCaseMapping(1183, 1182)
        self._addCaseMapping(1185, 1184)
        self._addCaseMapping(1187, 1186)
        self._addCaseMapping(1189, 1188)
        self._addCaseMapping(1191, 1190)
        self._addCaseMapping(1193, 1192)
        self._addCaseMapping(1195, 1194)
        self._addCaseMapping(1197, 1196)
        self._addCaseMapping(1199, 1198)
        self._addCaseMapping(1201, 1200)
        self._addCaseMapping(1203, 1202)
        self._addCaseMapping(1205, 1204)
        self._addCaseMapping(1207, 1206)
        self._addCaseMapping(1209, 1208)
        self._addCaseMapping(1211, 1210)
        self._addCaseMapping(1213, 1212)
        self._addCaseMapping(1215, 1214)
        self._addCaseMapping(1218, 1217)
        self._addCaseMapping(1220, 1219)
        self._addCaseMapping(1224, 1223)
        self._addCaseMapping(1228, 1227)
        self._addCaseMapping(1233, 1232)
        self._addCaseMapping(1235, 1234)
        self._addCaseMapping(1237, 1236)
        self._addCaseMapping(1239, 1238)
        self._addCaseMapping(1241, 1240)
        self._addCaseMapping(1243, 1242)
        self._addCaseMapping(1245, 1244)
        self._addCaseMapping(1247, 1246)
        self._addCaseMapping(1249, 1248)
        self._addCaseMapping(1251, 1250)
        self._addCaseMapping(1253, 1252)
        self._addCaseMapping(1255, 1254)
        self._addCaseMapping(1257, 1256)
        self._addCaseMapping(1259, 1258)
        self._addCaseMapping(1263, 1262)
        self._addCaseMapping(1265, 1264)
        self._addCaseMapping(1267, 1266)
        self._addCaseMapping(1269, 1268)
        self._addCaseMapping(1273, 1272)
        self._addCaseMapping(1377, 1329)
        self._addCaseMapping(1378, 1330)
        self._addCaseMapping(1379, 1331)
        self._addCaseMapping(1380, 1332)
        self._addCaseMapping(1381, 1333)
        self._addCaseMapping(1382, 1334)
        self._addCaseMapping(1383, 1335)
        self._addCaseMapping(1384, 1336)
        self._addCaseMapping(1385, 1337)
        self._addCaseMapping(1386, 1338)
        self._addCaseMapping(1387, 1339)
        self._addCaseMapping(1388, 1340)
        self._addCaseMapping(1389, 1341)
        self._addCaseMapping(1390, 1342)
        self._addCaseMapping(1391, 1343)
        self._addCaseMapping(1392, 1344)
        self._addCaseMapping(1393, 1345)
        self._addCaseMapping(1394, 1346)
        self._addCaseMapping(1395, 1347)
        self._addCaseMapping(1396, 1348)
        self._addCaseMapping(1397, 1349)
        self._addCaseMapping(1398, 1350)
        self._addCaseMapping(1399, 1351)
        self._addCaseMapping(1400, 1352)
        self._addCaseMapping(1401, 1353)
        self._addCaseMapping(1402, 1354)
        self._addCaseMapping(1403, 1355)
        self._addCaseMapping(1404, 1356)
        self._addCaseMapping(1405, 1357)
        self._addCaseMapping(1406, 1358)
        self._addCaseMapping(1407, 1359)
        self._addCaseMapping(1408, 1360)
        self._addCaseMapping(1409, 1361)
        self._addCaseMapping(1410, 1362)
        self._addCaseMapping(1411, 1363)
        self._addCaseMapping(1412, 1364)
        self._addCaseMapping(1413, 1365)
        self._addCaseMapping(1414, 1366)
        self._addCaseMapping(4304, 4256)
        self._addCaseMapping(4305, 4257)
        self._addCaseMapping(4306, 4258)
        self._addCaseMapping(4307, 4259)
        self._addCaseMapping(4308, 4260)
        self._addCaseMapping(4309, 4261)
        self._addCaseMapping(4310, 4262)
        self._addCaseMapping(4311, 4263)
        self._addCaseMapping(4312, 4264)
        self._addCaseMapping(4313, 4265)
        self._addCaseMapping(4314, 4266)
        self._addCaseMapping(4315, 4267)
        self._addCaseMapping(4316, 4268)
        self._addCaseMapping(4317, 4269)
        self._addCaseMapping(4318, 4270)
        self._addCaseMapping(4319, 4271)
        self._addCaseMapping(4320, 4272)
        self._addCaseMapping(4321, 4273)
        self._addCaseMapping(4322, 4274)
        self._addCaseMapping(4323, 4275)
        self._addCaseMapping(4324, 4276)
        self._addCaseMapping(4325, 4277)
        self._addCaseMapping(4326, 4278)
        self._addCaseMapping(4327, 4279)
        self._addCaseMapping(4328, 4280)
        self._addCaseMapping(4329, 4281)
        self._addCaseMapping(4330, 4282)
        self._addCaseMapping(4331, 4283)
        self._addCaseMapping(4332, 4284)
        self._addCaseMapping(4333, 4285)
        self._addCaseMapping(4334, 4286)
        self._addCaseMapping(4335, 4287)
        self._addCaseMapping(4336, 4288)
        self._addCaseMapping(4337, 4289)
        self._addCaseMapping(4338, 4290)
        self._addCaseMapping(4339, 4291)
        self._addCaseMapping(4340, 4292)
        self._addCaseMapping(4341, 4293)
        self._addCaseMapping(7681, 7680)
        self._addCaseMapping(7683, 7682)
        self._addCaseMapping(7685, 7684)
        self._addCaseMapping(7687, 7686)
        self._addCaseMapping(7689, 7688)
        self._addCaseMapping(7691, 7690)
        self._addCaseMapping(7693, 7692)
        self._addCaseMapping(7695, 7694)
        self._addCaseMapping(7697, 7696)
        self._addCaseMapping(7699, 7698)
        self._addCaseMapping(7701, 7700)
        self._addCaseMapping(7703, 7702)
        self._addCaseMapping(7705, 7704)
        self._addCaseMapping(7707, 7706)
        self._addCaseMapping(7709, 7708)
        self._addCaseMapping(7711, 7710)
        self._addCaseMapping(7713, 7712)
        self._addCaseMapping(7715, 7714)
        self._addCaseMapping(7717, 7716)
        self._addCaseMapping(7719, 7718)
        self._addCaseMapping(7721, 7720)
        self._addCaseMapping(7723, 7722)
        self._addCaseMapping(7725, 7724)
        self._addCaseMapping(7727, 7726)
        self._addCaseMapping(7729, 7728)
        self._addCaseMapping(7731, 7730)
        self._addCaseMapping(7733, 7732)
        self._addCaseMapping(7735, 7734)
        self._addCaseMapping(7737, 7736)
        self._addCaseMapping(7739, 7738)
        self._addCaseMapping(7741, 7740)
        self._addCaseMapping(7743, 7742)
        self._addCaseMapping(7745, 7744)
        self._addCaseMapping(7747, 7746)
        self._addCaseMapping(7749, 7748)
        self._addCaseMapping(7751, 7750)
        self._addCaseMapping(7753, 7752)
        self._addCaseMapping(7755, 7754)
        self._addCaseMapping(7757, 7756)
        self._addCaseMapping(7759, 7758)
        self._addCaseMapping(7761, 7760)
        self._addCaseMapping(7763, 7762)
        self._addCaseMapping(7765, 7764)
        self._addCaseMapping(7767, 7766)
        self._addCaseMapping(7769, 7768)
        self._addCaseMapping(7771, 7770)
        self._addCaseMapping(7773, 7772)
        self._addCaseMapping(7775, 7774)
        self._addCaseMapping(7777, 7776)
        self._addCaseMapping(7779, 7778)
        self._addCaseMapping(7781, 7780)
        self._addCaseMapping(7783, 7782)
        self._addCaseMapping(7785, 7784)
        self._addCaseMapping(7787, 7786)
        self._addCaseMapping(7789, 7788)
        self._addCaseMapping(7791, 7790)
        self._addCaseMapping(7793, 7792)
        self._addCaseMapping(7795, 7794)
        self._addCaseMapping(7797, 7796)
        self._addCaseMapping(7799, 7798)
        self._addCaseMapping(7801, 7800)
        self._addCaseMapping(7803, 7802)
        self._addCaseMapping(7805, 7804)
        self._addCaseMapping(7807, 7806)
        self._addCaseMapping(7809, 7808)
        self._addCaseMapping(7811, 7810)
        self._addCaseMapping(7813, 7812)
        self._addCaseMapping(7815, 7814)
        self._addCaseMapping(7817, 7816)
        self._addCaseMapping(7819, 7818)
        self._addCaseMapping(7821, 7820)
        self._addCaseMapping(7823, 7822)
        self._addCaseMapping(7825, 7824)
        self._addCaseMapping(7827, 7826)
        self._addCaseMapping(7829, 7828)
        self._addCaseMapping(7841, 7840)
        self._addCaseMapping(7843, 7842)
        self._addCaseMapping(7845, 7844)
        self._addCaseMapping(7847, 7846)
        self._addCaseMapping(7849, 7848)
        self._addCaseMapping(7851, 7850)
        self._addCaseMapping(7853, 7852)
        self._addCaseMapping(7855, 7854)
        self._addCaseMapping(7857, 7856)
        self._addCaseMapping(7859, 7858)
        self._addCaseMapping(7861, 7860)
        self._addCaseMapping(7863, 7862)
        self._addCaseMapping(7865, 7864)
        self._addCaseMapping(7867, 7866)
        self._addCaseMapping(7869, 7868)
        self._addCaseMapping(7871, 7870)
        self._addCaseMapping(7873, 7872)
        self._addCaseMapping(7875, 7874)
        self._addCaseMapping(7877, 7876)
        self._addCaseMapping(7879, 7878)
        self._addCaseMapping(7881, 7880)
        self._addCaseMapping(7883, 7882)
        self._addCaseMapping(7885, 7884)
        self._addCaseMapping(7887, 7886)
        self._addCaseMapping(7889, 7888)
        self._addCaseMapping(7891, 7890)
        self._addCaseMapping(7893, 7892)
        self._addCaseMapping(7895, 7894)
        self._addCaseMapping(7897, 7896)
        self._addCaseMapping(7899, 7898)
        self._addCaseMapping(7901, 7900)
        self._addCaseMapping(7903, 7902)
        self._addCaseMapping(7905, 7904)
        self._addCaseMapping(7907, 7906)
        self._addCaseMapping(7909, 7908)
        self._addCaseMapping(7911, 7910)
        self._addCaseMapping(7913, 7912)
        self._addCaseMapping(7915, 7914)
        self._addCaseMapping(7917, 7916)
        self._addCaseMapping(7919, 7918)
        self._addCaseMapping(7921, 7920)
        self._addCaseMapping(7923, 7922)
        self._addCaseMapping(7925, 7924)
        self._addCaseMapping(7927, 7926)
        self._addCaseMapping(7929, 7928)
        self._addCaseMapping(7936, 7944)
        self._addCaseMapping(7937, 7945)
        self._addCaseMapping(7938, 7946)
        self._addCaseMapping(7939, 7947)
        self._addCaseMapping(7940, 7948)
        self._addCaseMapping(7941, 7949)
        self._addCaseMapping(7942, 7950)
        self._addCaseMapping(7943, 7951)
        self._addCaseMapping(7952, 7960)
        self._addCaseMapping(7953, 7961)
        self._addCaseMapping(7954, 7962)
        self._addCaseMapping(7955, 7963)
        self._addCaseMapping(7956, 7964)
        self._addCaseMapping(7957, 7965)
        self._addCaseMapping(7968, 7976)
        self._addCaseMapping(7969, 7977)
        self._addCaseMapping(7970, 7978)
        self._addCaseMapping(7971, 7979)
        self._addCaseMapping(7972, 7980)
        self._addCaseMapping(7973, 7981)
        self._addCaseMapping(7974, 7982)
        self._addCaseMapping(7975, 7983)
        self._addCaseMapping(7984, 7992)
        self._addCaseMapping(7985, 7993)
        self._addCaseMapping(7986, 7994)
        self._addCaseMapping(7987, 7995)
        self._addCaseMapping(7988, 7996)
        self._addCaseMapping(7989, 7997)
        self._addCaseMapping(7990, 7998)
        self._addCaseMapping(7991, 7999)
        self._addCaseMapping(8000, 8008)
        self._addCaseMapping(8001, 8009)
        self._addCaseMapping(8002, 8010)
        self._addCaseMapping(8003, 8011)
        self._addCaseMapping(8004, 8012)
        self._addCaseMapping(8005, 8013)
        self._addCaseMapping(8017, 8025)
        self._addCaseMapping(8019, 8027)
        self._addCaseMapping(8021, 8029)
        self._addCaseMapping(8023, 8031)
        self._addCaseMapping(8032, 8040)
        self._addCaseMapping(8033, 8041)
        self._addCaseMapping(8034, 8042)
        self._addCaseMapping(8035, 8043)
        self._addCaseMapping(8036, 8044)
        self._addCaseMapping(8037, 8045)
        self._addCaseMapping(8038, 8046)
        self._addCaseMapping(8039, 8047)
        self._addCaseMapping(8064, 8072)
        self._addCaseMapping(8065, 8073)
        self._addCaseMapping(8066, 8074)
        self._addCaseMapping(8067, 8075)
        self._addCaseMapping(8068, 8076)
        self._addCaseMapping(8069, 8077)
        self._addCaseMapping(8070, 8078)
        self._addCaseMapping(8071, 8079)
        self._addCaseMapping(8080, 8088)
        self._addCaseMapping(8081, 8089)
        self._addCaseMapping(8082, 8090)
        self._addCaseMapping(8083, 8091)
        self._addCaseMapping(8084, 8092)
        self._addCaseMapping(8085, 8093)
        self._addCaseMapping(8086, 8094)
        self._addCaseMapping(8087, 8095)
        self._addCaseMapping(8096, 8104)
        self._addCaseMapping(8097, 8105)
        self._addCaseMapping(8098, 8106)
        self._addCaseMapping(8099, 8107)
        self._addCaseMapping(8100, 8108)
        self._addCaseMapping(8101, 8109)
        self._addCaseMapping(8102, 8110)
        self._addCaseMapping(8103, 8111)
        self._addCaseMapping(8112, 8120)
        self._addCaseMapping(8113, 8121)
        self._addCaseMapping(8144, 8152)
        self._addCaseMapping(8145, 8153)
        self._addCaseMapping(8160, 8168)
        self._addCaseMapping(8161, 8169)
        self._addCaseMapping(9424, 9398)
        self._addCaseMapping(9425, 9399)
        self._addCaseMapping(9426, 9400)
        self._addCaseMapping(9427, 9401)
        self._addCaseMapping(9428, 9402)
        self._addCaseMapping(9429, 9403)
        self._addCaseMapping(9430, 9404)
        self._addCaseMapping(9431, 9405)
        self._addCaseMapping(9432, 9406)
        self._addCaseMapping(9433, 9407)
        self._addCaseMapping(9434, 9408)
        self._addCaseMapping(9435, 9409)
        self._addCaseMapping(9436, 9410)
        self._addCaseMapping(9437, 9411)
        self._addCaseMapping(9438, 9412)
        self._addCaseMapping(9439, 9413)
        self._addCaseMapping(9440, 9414)
        self._addCaseMapping(9441, 9415)
        self._addCaseMapping(9442, 9416)
        self._addCaseMapping(9443, 9417)
        self._addCaseMapping(9444, 9418)
        self._addCaseMapping(9445, 9419)
        self._addCaseMapping(9446, 9420)
        self._addCaseMapping(9447, 9421)
        self._addCaseMapping(9448, 9422)
        self._addCaseMapping(9449, 9423)
        self._addCaseMapping(65345, 65313)
        self._addCaseMapping(65346, 65314)
        self._addCaseMapping(65347, 65315)
        self._addCaseMapping(65348, 65316)
        self._addCaseMapping(65349, 65317)
        self._addCaseMapping(65350, 65318)
        self._addCaseMapping(65351, 65319)
        self._addCaseMapping(65352, 65320)
        self._addCaseMapping(65353, 65321)
        self._addCaseMapping(65354, 65322)
        self._addCaseMapping(65355, 65323)
        self._addCaseMapping(65356, 65324)
        self._addCaseMapping(65357, 65325)
        self._addCaseMapping(65358, 65326)
        self._addCaseMapping(65359, 65327)
        self._addCaseMapping(65360, 65328)
        self._addCaseMapping(65361, 65329)
        self._addCaseMapping(65362, 65330)
        self._addCaseMapping(65363, 65331)
        self._addCaseMapping(65364, 65332)
        self._addCaseMapping(65365, 65333)
        self._addCaseMapping(65366, 65334)
        self._addCaseMapping(65367, 65335)
        self._addCaseMapping(65368, 65336)
        self._addCaseMapping(65369, 65337)
        self._addCaseMapping(65370, 65338)

    def _addCaseMapping(self, lowerChar, upperChar):
        if not upperChar in self.mapU2L.h:
            self.mapU2L.set(upperChar, lowerChar)
        if not lowerChar in self.mapL2U.h:
            self.mapL2U.set(lowerChar, upperChar)

    def isLowerCase(self, ch):
        return ch in self.mapL2U.h

    def isUpperCase(self, ch):
        return ch in self.mapU2L.h

    def toLowerCase(self, ch):
        lowerChar = self.mapU2L.h.get(ch, None)
        if lowerChar is None:
            return ch
        else:
            return lowerChar

    def toUpperCase(self, ch):
        upperChar = self.mapL2U.h.get(ch, None)
        if upperChar is None:
            return ch
        else:
            return upperChar

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.mapU2L = None
        _hx_o.mapL2U = None


class hx_strings__Char_Char_Impl_:
    _hx_class_name = 'hx.strings._Char.Char_Impl_'
    __slots__ = ()
    _hx_statics = ['CHAR_CASE_MAPPER', 'BACKSPACE', 'TAB', 'LF', 'CR',
        'ESC', 'SPACE', 'EXCLAMATION_MARK', 'DOUBLE_QUOTE', 'HASH',
        'DOLLAR', 'AMPERSAND', 'SINGLE_QUOTE', 'BRACKET_ROUND_LEFT',
        'BRACKET_ROUND_RIGHT', 'ASTERISK', 'PLUS', 'COMMA', 'MINUS', 'DOT',
        'SLASH', 'ZERO', 'ONE', 'TWO', 'TRHEE', 'FOUR', 'FIVE', 'SIX',
        'SEVEN', 'EIGHT', 'NINE', 'COLON', 'SEMICOLON', 'LOWER_THAN',
        'EQUALS', 'GREATER_THAN', 'QUESTION_MARK', 'BRACKET_SQUARE_LEFT',
        'BACKSLASH', 'BRACKET_SQUARE_RIGHT', 'CARET', 'UNDERSCORE',
        'BRACKET_CURLY_LEFT', 'PIPE', 'BRACKET_CURLY_RIGHT', 'fromString',
        'of', 'op_plus_string', 'op_plus_string2', 'op_plus', 'isAscii',
        'isAsciiAlpha', 'isAsciiAlphanumeric', 'isAsciiControl',
        'isAsciiPrintable', 'isDigit', 'isEOF', 'isSpace', 'isUTF8',
        'isWhitespace', 'isLowerCase', 'isUpperCase', 'toLowerCase',
        'toUpperCase', 'toInt', 'toString']

    @staticmethod
    def fromString(_hx_str):
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0 or 0 >= strLen:
            return -1
        else:
            return HxString.charCodeAt(_hx_str, 0)

    @staticmethod
    def of(ch):
        return ch

    @staticmethod
    def op_plus_string(ch, other):
        return HxOverrides.stringOrNull(''.join(map(chr, [ch]))) + ('null' if
            other is None else other)

    @staticmethod
    def op_plus_string2(_hx_str, ch):
        return ('null' if _hx_str is None else _hx_str
            ) + HxOverrides.stringOrNull(''.join(map(chr, [ch])))

    @staticmethod
    def op_plus(ch, other):
        return ch + other

    @staticmethod
    def isAscii(this1):
        if this1 > -1:
            return this1 < 128
        else:
            return False

    @staticmethod
    def isAsciiAlpha(this1):
        if not (this1 > 64 and this1 < 91):
            if this1 > 96:
                return this1 < 123
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiAlphanumeric(this1):
        if not (this1 > 64 and this1 < 91 or this1 > 96 and this1 < 123):
            if this1 > 47:
                return this1 < 58
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiControl(this1):
        if not (this1 > -1 and this1 < 32):
            return this1 == 127
        else:
            return True

    @staticmethod
    def isAsciiPrintable(this1):
        if this1 > 31:
            return this1 < 127
        else:
            return False

    @staticmethod
    def isDigit(this1):
        if this1 > 47:
            return this1 < 58
        else:
            return False

    @staticmethod
    def isEOF(this1):
        return this1 == -1

    @staticmethod
    def isSpace(this1):
        return this1 == 32

    @staticmethod
    def isUTF8(this1):
        if this1 > -1:
            return this1 < 1114112
        else:
            return False

    @staticmethod
    def isWhitespace(this1):
        if not (this1 > 8 and this1 < 14):
            return this1 == 32
        else:
            return True

    @staticmethod
    def isLowerCase(this1):
        return this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h

    @staticmethod
    def isUpperCase(this1):
        return this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h

    @staticmethod
    def toLowerCase(this1):
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(
            this1, None)
        if lowerChar is None:
            return this1
        else:
            return lowerChar

    @staticmethod
    def toUpperCase(this1):
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(
            this1, None)
        if upperChar is None:
            return this1
        else:
            return upperChar

    @staticmethod
    def toInt(this1):
        return this1

    @staticmethod
    def toString(this1):
        return ''.join(map(chr, [this1]))


class hx_strings_CharIterator:
    _hx_class_name = 'hx.strings.CharIterator'
    __slots__ = ('index', 'line', 'col', 'currChar', 'prevBuffer',
        'prevBufferPrevIdx', 'prevBufferNextIdx')
    _hx_fields = ['index', 'line', 'col', 'currChar', 'prevBuffer',
        'prevBufferPrevIdx', 'prevBufferNextIdx']
    _hx_methods = ['get_current', 'get_pos', 'hasPrev', 'prev', 'hasNext',
        'next', 'getChar', 'isEOF']
    _hx_statics = ['fromString', 'fromArray', 'fromInput', 'fromIterator']

    def __init__(self, prevBufferSize):
        self.prevBufferNextIdx = -1
        self.prevBufferPrevIdx = -1
        self.currChar = -1
        self.col = 0
        self.line = 0
        self.index = -1
        tmp = None
        if prevBufferSize > 0:
            this1 = hx_strings_internal__RingBuffer_RingBufferImpl(
                prevBufferSize + 1)
            tmp = this1
        else:
            tmp = None
        self.prevBuffer = tmp

    def get_current(self):
        if self.index > -1:
            return self.currChar
        else:
            return None

    def get_pos(self):
        return hx_strings_CharPos(self.index, self.line, self.col)

    def hasPrev(self):
        return self.prevBufferPrevIdx > -1

    def prev(self):
        if self.prevBufferPrevIdx <= -1:
            raise haxe_Exception.thrown(haxe_io_Eof())
        prevChar = self.prevBuffer.get(self.prevBufferPrevIdx)
        self.currChar = prevChar.char
        self.index = prevChar.index
        self.line = prevChar.line
        self.col = prevChar.col
        self.prevBufferNextIdx = (self.prevBufferPrevIdx + 1 if self.
            prevBufferPrevIdx + 1 < self.prevBuffer.length else -1)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.prevBufferPrevIdx
        _hx_local_0.prevBufferPrevIdx = _hx_local_1 - 1
        _hx_local_1
        return self.currChar

    def hasNext(self):
        if self.prevBufferNextIdx > -1:
            return True
        else:
            return not self.isEOF()

    def next(self):
        if self.prevBufferNextIdx > -1:
            prevChar = self.prevBuffer.get(self.prevBufferNextIdx)
            self.currChar = prevChar.char
            self.index = prevChar.index
            self.line = prevChar.line
            self.col = prevChar.col
            self.prevBufferPrevIdx = self.prevBufferNextIdx - 1
            self.prevBufferNextIdx = (self.prevBufferNextIdx + 1 if self.
                prevBufferNextIdx + 1 < self.prevBuffer.length else -1)
            return self.currChar
        if self.isEOF():
            raise haxe_Exception.thrown(haxe_io_Eof())
        if self.currChar == 10 or self.currChar < 0:
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.line
            _hx_local_0.line = _hx_local_1 + 1
            _hx_local_1
            self.col = 0
        _hx_local_2 = self
        _hx_local_3 = _hx_local_2.index
        _hx_local_2.index = _hx_local_3 + 1
        _hx_local_3
        _hx_local_4 = self
        _hx_local_5 = _hx_local_4.col
        _hx_local_4.col = _hx_local_5 + 1
        _hx_local_5
        self.currChar = self.getChar()
        if self.prevBuffer is not None:
            self.prevBuffer.add(hx_strings__CharIterator_CharWithPos(self.
                currChar, self.index, self.col, self.line))
            self.prevBufferPrevIdx = self.prevBuffer.length - 2
            self.prevBufferNextIdx = -1
        return self.currChar

    def getChar(self):
        raise haxe_Exception.thrown('Not implemented')

    def isEOF(self):
        raise haxe_Exception.thrown('Not implemented')

    @staticmethod
    def fromString(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_StringCharIterator(chars,
            prevBufferSize)

    @staticmethod
    def fromArray(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_ArrayCharIterator(chars, prevBufferSize
            )

    @staticmethod
    def fromInput(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_InputCharIterator(chars, prevBufferSize
            )

    @staticmethod
    def fromIterator(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_IteratorCharIterator(chars,
            prevBufferSize)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None
        _hx_o.currChar = None
        _hx_o.prevBuffer = None
        _hx_o.prevBufferPrevIdx = None
        _hx_o.prevBufferNextIdx = None


class hx_strings_CharPos:
    _hx_class_name = 'hx.strings.CharPos'
    __slots__ = 'index', 'line', 'col'
    _hx_fields = ['index', 'line', 'col']
    _hx_methods = ['toString']

    def __init__(self, index, line, col):
        self.index = index
        self.line = line
        self.col = col

    def toString(self):
        return 'CharPos[index=' + Std.string(self.index
            ) + ', line=' + Std.string(self.line) + ', col=' + Std.string(self
            .col) + ']'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None


class hx_strings__CharIterator_CharWithPos(hx_strings_CharPos):
    _hx_class_name = 'hx.strings._CharIterator.CharWithPos'
    __slots__ = 'char',
    _hx_fields = ['char']
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharPos

    def __init__(self, char, index, line, col):
        self.char = None
        super().__init__(index, line, col)
        self.char = char

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.char = None


class hx_strings_internal__RingBuffer_RingBufferImpl:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBufferImpl'
    __slots__ = ('buffer', 'bufferStartIdx', 'bufferEndIdx', 'bufferMaxIdx',
        'length', 'size')
    _hx_fields = ['buffer', 'bufferStartIdx', 'bufferEndIdx',
        'bufferMaxIdx', 'length', 'size']
    _hx_methods = ['add', 'get', 'iterator', 'toArray']

    def __init__(self, size):
        self.length = 0
        self.bufferEndIdx = -1
        self.bufferStartIdx = 0
        if size < 1:
            raise haxe_Exception.thrown('[size] must be > 0')
        this1 = [None] * size
        self.buffer = this1
        self.size = size
        self.bufferMaxIdx = size - 1

    def add(self, item):
        if self.length == self.size:
            self.bufferEndIdx = self.bufferStartIdx
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.bufferStartIdx
            _hx_local_0.bufferStartIdx = _hx_local_1 + 1
            _hx_local_1
            if self.bufferStartIdx > self.bufferMaxIdx:
                self.bufferStartIdx = 0
        else:
            _hx_local_2 = self
            _hx_local_3 = _hx_local_2.bufferEndIdx
            _hx_local_2.bufferEndIdx = _hx_local_3 + 1
            _hx_local_3
            _hx_local_4 = self
            _hx_local_5 = _hx_local_4.length
            _hx_local_4.length = _hx_local_5 + 1
            _hx_local_5
        self.buffer[self.bufferEndIdx] = item

    def get(self, index):
        if index < 0 or index > self.bufferMaxIdx:
            raise haxe_Exception.thrown('[index] ' + Std.string(index) +
                ' is out of bound')
        realIdx = self.bufferStartIdx + index
        if realIdx > self.bufferMaxIdx:
            realIdx = realIdx - self.length
        return self.buffer[realIdx]

    def iterator(self):
        return hx_strings_internal__RingBuffer_RingBufferIterator(self)

    def toArray(self):
        arr = list()
        i = self.iterator()
        while i.hasNext():
            i1 = i.next()
            arr.append(i1)
        return arr

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buffer = None
        _hx_o.bufferStartIdx = None
        _hx_o.bufferEndIdx = None
        _hx_o.bufferMaxIdx = None
        _hx_o.length = None
        _hx_o.size = None


class python_Boot:
    _hx_class_name = 'python.Boot'
    __slots__ = ()
    _hx_statics = ['keywords', 'toString1', 'fields', 'simpleField',
        'field', 'getInstanceFields', 'getSuperClass', 'getClassFields',
        'prefixLength', 'unhandleKeywords']

    @staticmethod
    def toString1(o, s):
        if o is None:
            return 'null'
        if isinstance(o, str):
            return o
        if s is None:
            s = ''
        if len(s) >= 5:
            return '<...>'
        if isinstance(o, bool):
            if o:
                return 'true'
            else:
                return 'false'
        if isinstance(o, int) and not isinstance(o, bool):
            return str(o)
        if isinstance(o, float):
            try:
                if o == int(o):
                    return str(Math.floor(o + 0.5))
                else:
                    return str(o)
            except BaseException as _g:
                return str(o)
        if isinstance(o, list):
            o1 = o
            l = len(o1)
            st = '['
            s = ('null' if s is None else s) + '\t'
            _g = 0
            _g1 = l
            while _g < _g1:
                i = _g
                _g = _g + 1
                prefix = ''
                if i > 0:
                    prefix = ','
                st = ('null' if st is None else st) + HxOverrides.stringOrNull(
                    ('null' if prefix is None else prefix) + HxOverrides.
                    stringOrNull(python_Boot.toString1(o1[i] if i >= 0 and 
                    i < len(o1) else None, s)))
            st = ('null' if st is None else st) + ']'
            return st
        try:
            if hasattr(o, 'toString'):
                return o.toString()
        except BaseException as _g:
            pass
        if hasattr(o, '__class__'):
            if isinstance(o, _hx_AnonObject):
                toStr = None
                try:
                    fields = python_Boot.fields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '{ ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' }'
                except BaseException as _g:
                    return '{ ... }'
                if toStr is None:
                    return '{ ... }'
                else:
                    return toStr
            if isinstance(o, Enum):
                o1 = o
                l = len(o1.params)
                hasParams = l > 0
                if hasParams:
                    paramsStr = ''
                    _g = 0
                    _g1 = l
                    while _g < _g1:
                        i = _g
                        _g = _g + 1
                        prefix = ''
                        if i > 0:
                            prefix = ','
                        paramsStr = ('null' if paramsStr is None else paramsStr
                            ) + HxOverrides.stringOrNull(('null' if prefix is
                            None else prefix) + HxOverrides.stringOrNull(
                            python_Boot.toString1(o1.params[i], s)))
                    return HxOverrides.stringOrNull(o1.tag) + '(' + ('null' if
                        paramsStr is None else paramsStr) + ')'
                else:
                    return o1.tag
            if hasattr(o, '_hx_class_name'):
                if o.__class__.__name__ != 'type':
                    fields = python_Boot.getInstanceFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
                else:
                    fields = python_Boot.getClassFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '#' + HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
            if o == str:
                return '#String'
            if o == list:
                return '#Array'
            if callable(o):
                return 'function'
            try:
                if hasattr(o, '__repr__'):
                    return o.__repr__()
            except BaseException as _g:
                pass
            if hasattr(o, '__str__'):
                return o.__str__([])
            if hasattr(o, '__name__'):
                return o.__name__
            return '???'
        else:
            return str(o)

    @staticmethod
    def fields(o):
        a = []
        if o is not None:
            if hasattr(o, '_hx_fields'):
                fields = o._hx_fields
                if fields is not None:
                    return list(fields)
            if isinstance(o, _hx_AnonObject):
                d = o.__dict__
                keys = d.keys()
                handler = python_Boot.unhandleKeywords
                for k in keys:
                    if k != '_hx_disable_getattr':
                        a.append(handler(k))
            elif hasattr(o, '__dict__'):
                d = o.__dict__
                keys1 = d.keys()
                for k in keys1:
                    a.append(k)
        return a

    @staticmethod
    def simpleField(o, field):
        if field is None:
            return None
        field1 = ('_hx_' + field if field in python_Boot.keywords else 
            '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
            ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
            field)
        if hasattr(o, field1):
            return getattr(o, field1)
        else:
            return None

    @staticmethod
    def field(o, field):
        if field is None:
            return None
        if isinstance(o, str):
            field1 = field
            _hx_local_0 = len(field1)
            if _hx_local_0 == 10:
                if field1 == 'charCodeAt':
                    return python_internal_MethodClosure(o, HxString.charCodeAt
                        )
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o, HxString.
                        lastIndexOf)
                elif field1 == 'toLowerCase':
                    return python_internal_MethodClosure(o, HxString.
                        toLowerCase)
                elif field1 == 'toUpperCase':
                    return python_internal_MethodClosure(o, HxString.
                        toUpperCase)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 9:
                if field1 == 'substring':
                    return python_internal_MethodClosure(o, HxString.substring)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 5:
                if field1 == 'split':
                    return python_internal_MethodClosure(o, HxString.split)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o, HxString.indexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 8:
                if field1 == 'toString':
                    return python_internal_MethodClosure(o, HxString.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 6:
                if field1 == 'charAt':
                    return python_internal_MethodClosure(o, HxString.charAt)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'substr':
                    return python_internal_MethodClosure(o, HxString.substr)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        elif isinstance(o, list):
            field1 = field
            _hx_local_1 = len(field1)
            if _hx_local_1 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.lastIndexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 4:
                if field1 == 'copy':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.copy)
                elif field1 == 'join':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.join)
                elif field1 == 'push':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.push)
                elif field1 == 'sort':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.sort)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 5:
                if field1 == 'shift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.shift)
                elif field1 == 'slice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.slice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.indexOf)
                elif field1 == 'reverse':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.reverse)
                elif field1 == 'unshift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.unshift)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 3:
                if field1 == 'map':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.map)
                elif field1 == 'pop':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.pop)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 8:
                if field1 == 'contains':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.contains)
                elif field1 == 'iterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.iterator)
                elif field1 == 'toString':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 16:
                if field1 == 'keyValueIterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.keyValueIterator)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 6:
                if field1 == 'concat':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.concat)
                elif field1 == 'filter':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.filter)
                elif field1 == 'insert':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.insert)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'remove':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.remove)
                elif field1 == 'splice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.splice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        else:
            field1 = ('_hx_' + field if field in python_Boot.keywords else 
                '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
                ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
                field)
            if hasattr(o, field1):
                return getattr(o, field1)
            else:
                return None

    @staticmethod
    def getInstanceFields(c):
        f = list(c._hx_fields) if hasattr(c, '_hx_fields') else []
        if hasattr(c, '_hx_methods'):
            f = f + c._hx_methods
        sc = python_Boot.getSuperClass(c)
        if sc is None:
            return f
        else:
            scArr = python_Boot.getInstanceFields(sc)
            scMap = set(scArr)
            _g = 0
            while _g < len(f):
                f1 = f[_g] if _g >= 0 and _g < len(f) else None
                _g = _g + 1
                if not f1 in scMap:
                    scArr.append(f1)
            return scArr

    @staticmethod
    def getSuperClass(c):
        if c is None:
            return None
        try:
            if hasattr(c, '_hx_super'):
                return c._hx_super
            return None
        except BaseException as _g:
            pass
        return None

    @staticmethod
    def getClassFields(c):
        if hasattr(c, '_hx_statics'):
            x = c._hx_statics
            return list(x)
        else:
            return []

    @staticmethod
    def unhandleKeywords(name):
        if HxString.substr(name, 0, python_Boot.prefixLength) == '_hx_':
            real = HxString.substr(name, python_Boot.prefixLength, None)
            if real in python_Boot.keywords:
                return real
        return name


class HxString:
    _hx_class_name = 'HxString'
    __slots__ = ()
    _hx_statics = ['split', 'charCodeAt', 'charAt', 'lastIndexOf',
        'toUpperCase', 'toLowerCase', 'indexOf', 'indexOfImpl', 'toString',
        'substring', 'substr']

    @staticmethod
    def split(s, d):
        if d == '':
            return list(s)
        else:
            return s.split(d)

    @staticmethod
    def charCodeAt(s, index):
        if ((s is None or len(s) == 0) or index < 0) or index >= len(s):
            return None
        else:
            return ord(s[index])

    @staticmethod
    def charAt(s, index):
        if index < 0 or index >= len(s):
            return ''
        else:
            return s[index]

    @staticmethod
    def lastIndexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.rfind(_hx_str, 0, len(s))
        elif _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        else:
            i = s.rfind(_hx_str, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(_hx_str)
                ) if i == -1 else i + 1
            check = s.find(_hx_str, startLeft, len(s))
            if check > i and check <= startIndex:
                return check
            else:
                return i

    @staticmethod
    def toUpperCase(s):
        return s.upper()

    @staticmethod
    def toLowerCase(s):
        return s.lower()

    @staticmethod
    def indexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.find(_hx_str)
        else:
            return HxString.indexOfImpl(s, _hx_str, startIndex)

    @staticmethod
    def indexOfImpl(s, _hx_str, startIndex):
        if _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        return s.find(_hx_str, startIndex)

    @staticmethod
    def toString(s):
        return s

    @staticmethod
    def substring(s, startIndex, endIndex=None):
        if startIndex < 0:
            startIndex = 0
        if endIndex is None:
            return s[startIndex:]
        else:
            if endIndex < 0:
                endIndex = 0
            if endIndex < startIndex:
                return s[endIndex:startIndex]
            else:
                return s[startIndex:endIndex]

    @staticmethod
    def substr(s, startIndex, _hx_len=None):
        if _hx_len is None:
            return s[startIndex:]
        else:
            if _hx_len == 0:
                return ''
            if startIndex < 0:
                startIndex = len(s) + startIndex
                if startIndex < 0:
                    startIndex = 0
            return s[startIndex:startIndex + _hx_len]


class hx_strings__CharIterator_NullCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.NullCharIterator'
    __slots__ = ()
    _hx_fields = []
    _hx_methods = ['isEOF']
    _hx_statics = ['INSTANCE']
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self):
        super().__init__(0)

    def isEOF(self):
        return True

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class hx_strings__CharIterator_ArrayCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.ArrayCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = len(chars) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return python_internal_ArrayImpl._get(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings__CharIterator_IteratorCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.IteratorCharIterator'
    __slots__ = 'chars',
    _hx_fields = ['chars']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars

    def isEOF(self):
        return not self.chars.hasNext()

    def getChar(self):
        return self.chars.next()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None


class hx_strings__CharIterator_InputCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.InputCharIterator'
    __slots__ = ('byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable')
    _hx_fields = ['byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable']
    _hx_methods = ['isEOF', 'getChar', 'readUtf8Char',
        'readUtf8MultiSequenceByte']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.nextChar = None
        self.input = None
        self.nextCharAvailable = None
        self.currCharIndex = -1
        self.byteIndex = 0
        super().__init__(prevBufferSize)
        self.input = chars

    def isEOF(self):
        if self.nextCharAvailable == None:
            try:
                byte1 = self.input.readByte()
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.byteIndex
                _hx_local_0.byteIndex = _hx_local_1 + 1
                _hx_local_1
                tmp = None
                if byte1 <= 127:
                    tmp = byte1
                else:
                    byte1 = byte1 & -129
                    byte1 = byte1 & -65
                    totalBytes = 2
                    isBit6Set = 1 == byte1 >> 5 & 1
                    isBit5Set = False
                    if isBit6Set:
                        byte1 = byte1 & -33
                        totalBytes = totalBytes + 1
                        isBit5Set = 1 == byte1 >> 4 & 1
                        if isBit5Set:
                            byte1 = byte1 & -17
                            totalBytes = totalBytes + 1
                            if 1 == byte1 >> 3 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 byte expected at position [' +
                                    Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte1) + ']!')
                    result = byte1 << 6 * (totalBytes - 1)
                    byte = self.input.readByte()
                    _hx_local_8 = self
                    _hx_local_9 = _hx_local_8.byteIndex
                    _hx_local_8.byteIndex = _hx_local_9 + 1
                    _hx_local_9
                    if 1 != byte >> 7 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    if 1 == byte >> 6 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    byte2 = byte & -129
                    result = result + (byte2 << 6 * (totalBytes - 2))
                    if isBit6Set:
                        byte = self.input.readByte()
                        _hx_local_11 = self
                        _hx_local_12 = _hx_local_11.byteIndex
                        _hx_local_11.byteIndex = _hx_local_12 + 1
                        _hx_local_12
                        if 1 != byte >> 7 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        if 1 == byte >> 6 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        byte3 = byte & -129
                        result = result + (byte3 << 6 * (totalBytes - 3))
                        if isBit5Set:
                            byte = self.input.readByte()
                            _hx_local_14 = self
                            _hx_local_15 = _hx_local_14.byteIndex
                            _hx_local_14.byteIndex = _hx_local_15 + 1
                            _hx_local_15
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte4 = byte & -129
                            result = result + (byte4 << 6 * (totalBytes - 4))
                    if self.index == 0 and result == 65279:
                        byte1 = self.input.readByte()
                        _hx_local_17 = self
                        _hx_local_18 = _hx_local_17.byteIndex
                        _hx_local_17.byteIndex = _hx_local_18 + 1
                        _hx_local_18
                        if byte1 <= 127:
                            tmp = byte1
                        else:
                            byte1 = byte1 & -129
                            byte1 = byte1 & -65
                            totalBytes = 2
                            isBit6Set = 1 == byte1 >> 5 & 1
                            isBit5Set = False
                            if isBit6Set:
                                byte1 = byte1 & -33
                                totalBytes = totalBytes + 1
                                isBit5Set = 1 == byte1 >> 4 & 1
                                if isBit5Set:
                                    byte1 = byte1 & -17
                                    totalBytes = totalBytes + 1
                                    if 1 == byte1 >> 3 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte1) + ']!')
                            result1 = byte1 << 6 * (totalBytes - 1)
                            byte = self.input.readByte()
                            _hx_local_25 = self
                            _hx_local_26 = _hx_local_25.byteIndex
                            _hx_local_25.byteIndex = _hx_local_26 + 1
                            _hx_local_26
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte2 = byte & -129
                            result1 = result1 + (byte2 << 6 * (totalBytes - 2))
                            if isBit6Set:
                                byte = self.input.readByte()
                                _hx_local_28 = self
                                _hx_local_29 = _hx_local_28.byteIndex
                                _hx_local_28.byteIndex = _hx_local_29 + 1
                                _hx_local_29
                                if 1 != byte >> 7 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                if 1 == byte >> 6 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                byte3 = byte & -129
                                result1 = result1 + (byte3 << 6 * (
                                    totalBytes - 3))
                                if isBit5Set:
                                    byte = self.input.readByte()
                                    _hx_local_31 = self
                                    _hx_local_32 = _hx_local_31.byteIndex
                                    _hx_local_31.byteIndex = _hx_local_32 + 1
                                    _hx_local_32
                                    if 1 != byte >> 7 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    if 1 == byte >> 6 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    byte4 = byte & -129
                                    result1 = result1 + (byte4 << 6 * (
                                        totalBytes - 4))
                            tmp = (self.readUtf8Char() if self.index == 0 and
                                result1 == 65279 else result1)
                    else:
                        tmp = result
                self.nextChar = tmp
                self.nextCharAvailable = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(), haxe_io_Eof
                    ):
                    self.nextCharAvailable = False
                else:
                    raise _g
        return self.nextCharAvailable != True

    def getChar(self):
        if self.index != self.currCharIndex:
            self.currCharIndex = self.index
            self.nextCharAvailable = None
            return self.nextChar
        return self.currChar

    def readUtf8Char(self):
        byte1 = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if byte1 <= 127:
            return byte1
        byte1 = byte1 & -129
        byte1 = byte1 & -65
        totalBytes = 2
        isBit6Set = 1 == byte1 >> 5 & 1
        isBit5Set = False
        if isBit6Set:
            byte1 = byte1 & -33
            totalBytes = totalBytes + 1
            isBit5Set = 1 == byte1 >> 4 & 1
            if isBit5Set:
                byte1 = byte1 & -17
                totalBytes = totalBytes + 1
                if 1 == byte1 >> 3 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 byte expected at position [' + Std.
                        string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte1) +
                        ']!')
        result = byte1 << 6 * (totalBytes - 1)
        byte = self.input.readByte()
        _hx_local_8 = self
        _hx_local_9 = _hx_local_8.byteIndex
        _hx_local_8.byteIndex = _hx_local_9 + 1
        _hx_local_9
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        byte2 = byte & -129
        result = result + (byte2 << 6 * (totalBytes - 2))
        if isBit6Set:
            byte = self.input.readByte()
            _hx_local_11 = self
            _hx_local_12 = _hx_local_11.byteIndex
            _hx_local_11.byteIndex = _hx_local_12 + 1
            _hx_local_12
            if 1 != byte >> 7 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            if 1 == byte >> 6 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            byte3 = byte & -129
            result = result + (byte3 << 6 * (totalBytes - 3))
            if isBit5Set:
                byte = self.input.readByte()
                _hx_local_14 = self
                _hx_local_15 = _hx_local_14.byteIndex
                _hx_local_14.byteIndex = _hx_local_15 + 1
                _hx_local_15
                if 1 != byte >> 7 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                if 1 == byte >> 6 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                byte4 = byte & -129
                result = result + (byte4 << 6 * (totalBytes - 4))
        if self.index == 0 and result == 65279:
            return self.readUtf8Char()
        return result

    def readUtf8MultiSequenceByte(self):
        byte = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        return byte & -129

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.byteIndex = None
        _hx_o.input = None
        _hx_o.currCharIndex = None
        _hx_o.nextChar = None
        _hx_o.nextCharAvailable = None


class hx_strings__CharIterator_StringCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.StringCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = (0 if chars is None else len(chars)) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return HxString.charCodeAt(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings_Pattern:
    _hx_class_name = 'hx.strings.Pattern'
    __slots__ = 'pattern', 'options', 'ereg'
    _hx_fields = ['pattern', 'options', 'ereg']
    _hx_methods = ['matcher', 'replace', 'remove', 'split']
    _hx_statics = ['__meta__', 'compile']

    def __init__(self, pattern, options):
        self.pattern = pattern
        self.options = options
        self.ereg = EReg(pattern, options)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.options
        _hx_local_0.options = ('null' if _hx_local_1 is None else _hx_local_1
            ) + 'u'
        _hx_local_0.options

    def matcher(self, _hx_str):
        return hx_strings__Pattern_MatcherImpl(self.ereg, self.pattern,
            self.options, _hx_str)

    def replace(self, _hx_str, replaceWith):
        return self.ereg.replace(_hx_str, replaceWith)

    def remove(self, _hx_str):
        return self.ereg.replace(_hx_str, '')

    def split(self, _hx_str):
        return self.ereg.split(_hx_str)

    @staticmethod
    def compile(pattern, options=None):
        if options is None:
            return hx_strings_Pattern(pattern, '')
        _g = options
        tmp = None
        tmp1 = _g.index
        if tmp1 == 0:
            _hx_str = _g.params[0]
            str1 = hx_strings_Strings.toLowerCase8(_hx_str)
            if str1 is None or len(str1) == 0:
                tmp = str1
            else:

                def _hx_local_0(ch):
                    return ''.join(map(chr, [ch]))

                def _hx_local_1(ch):
                    _this = None
                    strLen = len('i')
                    if ch != (-1 if strLen == 0 or 0 >= strLen else
                        HxString.charCodeAt('i', 0)):
                        strLen = len('m')
                        _this = ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('m', 0))
                    else:
                        _this = True
                    if not _this:
                        strLen = len('g')
                        return ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('g', 0))
                    else:
                        return True
                _this = list(map(_hx_local_0, list(filter(_hx_local_1,
                    hx_strings_Strings.toChars(str1)))))
                tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        elif tmp1 == 1:
            opt = _g.params[0]
            tmp = Std.string(opt)
        elif tmp1 == 2:
            arr = _g.params[0]

            def _hx_local_2(m):
                return m is not None
            _this = list(filter(_hx_local_2, arr))
            tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        else:
            pass
        return hx_strings_Pattern(pattern, tmp)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.options = None
        _hx_o.ereg = None


class hx_strings_Matcher:
    _hx_class_name = 'hx.strings.Matcher'
    __slots__ = ()
    _hx_methods = ['iterate', 'map', 'matched', 'matchedPos', 'matches',
        'matchesInRegion', 'reset', 'substringAfterMatch',
        'substringBeforeMatch']
    _hx_statics = ['__meta__']


class hx_strings__Pattern_MatcherImpl:
    _hx_class_name = 'hx.strings._Pattern.MatcherImpl'
    __slots__ = 'ereg', 'isMatch', 'str'
    _hx_fields = ['ereg', 'isMatch', 'str']
    _hx_methods = ['reset', 'iterate', 'map', 'matched', 'matches',
        'matchesInRegion', 'matchedPos', 'substringAfterMatch',
        'substringBeforeMatch', '_cloneEReg']
    _hx_interfaces = [hx_strings_Matcher]

    def __init__(self, ereg, pattern, options, _hx_str):
        self.str = None
        self.isMatch = None
        self.ereg = None
        self.ereg = self._cloneEReg(ereg, pattern, options)
        self.str = _hx_str
        self.isMatch = None

    def reset(self, _hx_str):
        self.str = _hx_str
        self.isMatch = None
        return self

    def iterate(self, onMatch):
        startAt = 0
        while self.ereg.matchSub(self.str, startAt):
            self.isMatch = True
            _this = self.ereg
            matchedPos_pos = _this.matchObj.start()
            matchedPos_len = _this.matchObj.end() - _this.matchObj.start()
            onMatch(self)
            startAt = matchedPos_pos + matchedPos_len
        self.isMatch = False

    def map(self, mapper):
        _gthis = self

        def _hx_local_1():

            def _hx_local_0(ereg):
                _gthis.isMatch = True
                return mapper(_gthis)
            return self.ereg.map(self.str, _hx_local_0)
        return _hx_local_1()

    def matched(self, n=None):
        if n is None:
            n = 0
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        result = self.ereg.matchObj.group(n)
        return result

    def matches(self):
        _this = self.ereg
        _this.matchObj = python_lib_Re.search(_this.pattern, self.str)

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = _this.matchObj is not None
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchesInRegion(self, pos, _hx_len=None):
        if _hx_len is None:
            _hx_len = -1

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = self.ereg.matchSub(self.str, pos, _hx_len)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchedPos(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        _this = self.ereg
        return _hx_AnonObject({'pos': _this.matchObj.start(), 'len': _this.
            matchObj.end() - _this.matchObj.start()})

    def substringAfterMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, _this.matchObj.end(),
            None)

    def substringBeforeMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, 0, _this.matchObj.start()
            )

    def _cloneEReg(self, _hx_from, pattern, options):
        clone = Type.createEmptyInstance(EReg)
        value = Reflect.field(_hx_from, 'pattern')
        setattr(clone, '_hx_' + 'pattern' if 'pattern' in python_Boot.
            keywords else '_hx_' + 'pattern' if ((len('pattern') > 2 and 
            ord('pattern'[0]) == 95) and ord('pattern'[1]) == 95) and ord(
            'pattern'[len('pattern') - 1]) != 95 else 'pattern', value)
        value = Reflect.field(_hx_from, 'global')
        setattr(clone, '_hx_' + 'global' if 'global' in python_Boot.
            keywords else '_hx_' + 'global' if ((len('global') > 2 and ord(
            'global'[0]) == 95) and ord('global'[1]) == 95) and ord(
            'global'[len('global') - 1]) != 95 else 'global', value)
        return clone

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.ereg = None
        _hx_o.isMatch = None
        _hx_o.str = None


class hx_strings_StringBuilder:
    _hx_class_name = 'hx.strings.StringBuilder'
    __slots__ = 'sb', 'pre', 'len', 'length'
    _hx_fields = ['sb', 'pre', 'len']
    _hx_methods = ['get_length', 'add', 'addChar', 'addAll', 'clear',
        'isEmpty', 'newLine', 'insert', 'insertChar', 'insertAll',
        'asOutput', 'toString']

    def __init__(self, initialContent=None):
        self.length = None
        self.len = 0
        self.pre = None
        self.sb = StringBuf()
        if initialContent is not None:
            self.add(initialContent)

    def get_length(self):
        return self.len

    def add(self, item):
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
        _hx_local_0.len
        return self

    def addChar(self, ch):
        _this = self.sb
        s = ''.join(map(chr, [ch]))
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def addAll(self, items):
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_1 = self
            _hx_local_2 = _hx_local_1.len
            _hx_local_1.len = _hx_local_2 + (0 if item is None else len(item))
            _hx_local_1.len
        return self

    def clear(self):
        self.pre = None
        self.sb = StringBuf()
        self.len = 0
        return self

    def isEmpty(self):
        return self.len == 0

    def newLine(self):
        self.sb.b.write('\n')
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def insert(self, pos, item):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.add(item)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            self.pre.insert(0, item)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
            _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    self.pre.insert(i + 1, item)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + (0 if item is None else
                        len(item))
                    _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, item)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + (0 if item is None else
                        len(item))
                    _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_6 = self
        _hx_local_7 = _hx_local_6.len
        _hx_local_6.len = _hx_local_7 + (0 if item is None else len(item))
        _hx_local_6.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertChar(self, pos, ch):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addChar(ch)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            _this = self.pre
            x = ''.join(map(chr, [ch]))
            _this.insert(0, x)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + 1
            _hx_local_1
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    _this = self.pre
                    x = ''.join(map(chr, [ch]))
                    _this.insert(i + 1, x)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + 1
                    _hx_local_3
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    _this1 = self.pre
                    x1 = ''.join(map(chr, [ch]))
                    _this1.insert(i + 1, x1)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + 1
                    _hx_local_5
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.addChar(ch)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        self.addChar(ch)
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertAll(self, pos, items):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addAll(items)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            i = len(items)
            while True:
                tmp = i
                i = i - 1
                if not tmp > 0:
                    break
                item = items[i] if i >= 0 and i < len(items) else None
                self.pre.insert(0, item)
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.len
                _hx_local_0.len = _hx_local_1 + (0 if item is None else len
                    (item))
                _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    j = len(items)
                    while True:
                        tmp = j
                        j = j - 1
                        if not tmp > 0:
                            break
                        item = items[j] if j >= 0 and j < len(items) else None
                        self.pre.insert(i + 1, item)
                        _hx_local_2 = self
                        _hx_local_3 = _hx_local_2.len
                        _hx_local_2.len = _hx_local_3 + (0 if item is None else
                            len(item))
                        _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    j1 = len(items)
                    while True:
                        tmp1 = j1
                        j1 = j1 - 1
                        if not tmp1 > 0:
                            break
                        item1 = items[j1] if j1 >= 0 and j1 < len(items
                            ) else None
                        self.pre.insert(i + 1, item1)
                        _hx_local_4 = self
                        _hx_local_5 = _hx_local_4.len
                        _hx_local_4.len = _hx_local_5 + (0 if item1 is None
                             else len(item1))
                        _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            _g = 0
            while _g < len(items):
                item = items[_g] if _g >= 0 and _g < len(items) else None
                _g = _g + 1
                self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_8 = self
            _hx_local_9 = _hx_local_8.len
            _hx_local_8.len = _hx_local_9 + (0 if item is None else len(item))
            _hx_local_8.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def asOutput(self):
        return hx_strings__StringBuilder_OutputWrapper(self)

    def toString(self):
        if self.pre is None:
            return self.sb.b.getvalue()
        _this = self.pre
        _hx_str = HxOverrides.stringOrNull(''.join([python_Boot.toString1(
            x1, '') for x1 in _this])) + HxOverrides.stringOrNull(self.sb.b
            .getvalue())
        self.clear()
        self.add(_hx_str)
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.pre = None
        _hx_o.len = None


class hx_strings__StringBuilder_OutputWrapper(haxe_io_Output):
    _hx_class_name = 'hx.strings._StringBuilder.OutputWrapper'
    __slots__ = 'sb', 'bo'
    _hx_fields = ['sb', 'bo']
    _hx_methods = ['flush', 'writeByte', 'writeString']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output

    def __init__(self, sb):
        self.bo = None
        self.sb = sb

    def flush(self):
        if self.bo is not None and len(self.bo.b.b) > 0:
            self.sb.add(self.bo.getBytes().toString())

    def writeByte(self, c):
        if self.bo is None:
            self.bo = haxe_io_BytesOutput()
        self.bo.writeByte(c)

    def writeString(self, _hx_str, encoding=None):
        self.flush()
        self.sb.add(_hx_str)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.bo = None


class hx_strings_internal_OS:
    _hx_class_name = 'hx.strings.internal.OS'
    __slots__ = ()
    _hx_statics = ['isWindows']


class hx_strings_internal__Either3__Either3(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either3._Either3'
    _hx_constructs = ['a', 'b', 'c']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either3__Either3('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either3__Either3('b', 1, (v,))

    @staticmethod
    def c(v):
        return hx_strings_internal__Either3__Either3('c', 2, (v,))


class hx_strings_Strings:
    _hx_class_name = 'hx.strings.Strings'
    __slots__ = ()
    _hx_statics = ['REGEX_ANSI_ESC', 'REGEX_HTML_UNESCAPE',
        'REGEX_SPLIT_LINES', 'REGEX_REMOVE_XML_TAGS', 'POS_NOT_FOUND',
        'NEW_LINE_NIX', 'NEW_LINE_WIN', 'NEW_LINE', '_getNotFoundDefault',
        '_charCodeAt8Unsafe', '_splitAsciiWordsUnsafe', 'ansiToHtml',
        'appendIfMissing', 'base64Encode', 'base64Decode', 'charAt8',
        'charCodeAt8', 'compact', 'contains', 'containsOnly', 'containsAll',
        'containsAllIgnoreCase', 'containsAny', 'containsAnyIgnoreCase',
        'containsNone', 'containsNoneIgnoreCase', 'containsWhitespaces',
        'countMatches', 'countMatchesIgnoreCase', 'compare',
        'compareIgnoreCase', 'diff', 'diffAt', 'ellipsizeLeft',
        'ellipsizeMiddle', 'ellipsizeRight', 'endsWith', 'endsWithAny',
        'endsWithAnyIgnoreCase', 'endsWithIgnoreCase', 'equals',
        'equalsIgnoreCase', 'filter', 'filterChars', 'getFuzzyDistance',
        'getLevenshteinDistance', 'getLongestCommonSubstring', 'hashCode',
        'htmlDecode', 'htmlEncode', 'insertAt', 'ifBlank', 'ifEmpty',
        'ifNull', 'indentLines', 'indexOf8', 'isBlank', 'isDigits',
        'isEmpty', 'isNotBlank', 'isNotEmpty', 'isLowerCase', 'isUpperCase',
        'iterate', 'iterateChars', 'lastIndexOf8', 'length8', 'left',
        'lpad', 'map', 'prependIfMissing', 'quoteDouble', 'quoteSingle',
        'removeAfter', 'removeAfterLast', 'removeAfterIgnoreCase',
        'removeAfterLastIgnoreCase', 'removeAt', 'removeBefore',
        'removeBeforeLast', 'removeBeforeIgnoreCase',
        'removeBeforeLastIgnoreCase', 'removeAll', 'removeFirst',
        'removeFirstIgnoreCase', 'removeAnsi', 'removeLeading',
        'removeTags', 'removeTrailing', 'repeat', 'replaceAll',
        'replaceFirst', 'replaceFirstIgnoreCase', 'reverse', 'right',
        'rpad', 'split8', 'splitAt', 'splitEvery', 'splitLines',
        'startsWith', 'startsWithAny', 'startsWithAnyIgnoreCase',
        'startsWithIgnoreCase', 'substr8', 'substring8', 'substringAfter',
        'substringAfterIgnoreCase', 'substringBetween',
        'substringBetweenIgnoreCase', 'substringAfterLast',
        'substringAfterLastIgnoreCase', 'substringBefore',
        'substringBeforeIgnoreCase', 'substringBeforeLast',
        'substringBeforeLastIgnoreCase', 'toBool', 'toBytes', 'toChar',
        'toCharIterator', 'toChars', 'toPattern', 'toEReg', 'toFloat',
        'toHex', 'toInt', 'toLowerCase8', 'toLowerCaseFirstChar',
        'toLowerCamel', 'toLowerHyphen', 'toLowerUnderscore', 'toTitle',
        'toUpperCamel', 'toUpperUnderscore', 'toString', 'toUpperCase8',
        'toUpperCaseFirstChar', 'trim', 'trimRight', 'trimLeft',
        'trimLines', 'trimToNull', 'trimToEmpty', 'truncate', 'urlDecode',
        'urlEncode', 'wrap']

    @staticmethod
    def _getNotFoundDefault(_hx_str, notFoundDefault):
        notFoundDefault1 = notFoundDefault
        if notFoundDefault1 == 1:
            return None
        elif notFoundDefault1 == 2:
            return ''
        elif notFoundDefault1 == 3:
            return _hx_str
        else:
            pass

    @staticmethod
    def _charCodeAt8Unsafe(_hx_str, pos):
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def _splitAsciiWordsUnsafe(_hx_str):
        words = list()
        currentWord = hx_strings_StringBuilder()
        chars = hx_strings_Strings.toChars(_hx_str)
        _hx_len = len(chars)
        lastIndex = _hx_len - 1
        _g = 0
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = chars[i] if i >= 0 and i < len(chars) else None
            if ch > 64 and ch < 91 or ch > 96 and ch < 123:
                chNext = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                currentWord.addChar(ch)
                if chNext > 47 and chNext < 58:
                    x = currentWord.toString()
                    words.append(x)
                    currentWord.clear()
                elif ch in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    if (chNext in hx_strings__Char_Char_Impl_.
                        CHAR_CASE_MAPPER.mapU2L.h and len(chars) > i + 2):
                        if (not python_internal_ArrayImpl._get(chars, i + 2
                            ) in hx_strings__Char_Char_Impl_.
                            CHAR_CASE_MAPPER.mapU2L.h):
                            x1 = currentWord.toString()
                            words.append(x1)
                            currentWord.clear()
                elif chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    x2 = currentWord.toString()
                    words.append(x2)
                    currentWord.clear()
            elif ch > 47 and ch < 58:
                currentWord.addChar(ch)
                chNext1 = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                if not (chNext1 > 47 and chNext1 < 58):
                    x3 = currentWord.toString()
                    words.append(x3)
                    currentWord.clear()
            elif currentWord.len > 0:
                x4 = currentWord.toString()
                words.append(x4)
                currentWord.clear()
        if currentWord.len > 0:
            x = currentWord.toString()
            words.append(x)
        return words

    @staticmethod
    def ansiToHtml(_hx_str, renderMethod=None, initialState=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if renderMethod is None:
            renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
        styleOrClassAttribute = None
        styleOrClassAttribute1 = renderMethod.index
        if styleOrClassAttribute1 == 0:
            styleOrClassAttribute = 'style'
        elif styleOrClassAttribute1 == 1:
            styleOrClassAttribute = 'class'
        elif styleOrClassAttribute1 == 2:
            cb = renderMethod.params[0]
            styleOrClassAttribute = 'class'
        else:
            pass
        sb = hx_strings_StringBuilder()
        if initialState is not None and ((((initialState.fgcolor is not
            None or initialState.bgcolor is not None) or initialState.bold) or
            initialState.underline) or initialState.blink):
            sb.add('<span ' + ('null' if styleOrClassAttribute is None else
                styleOrClassAttribute) + '="').add(initialState.toCSS(
                renderMethod)).add('">')
        effectiveState = hx_strings_AnsiState(initialState)
        strLenMinus1 = (0 if _hx_str is None else len(_hx_str)) - 1
        i = -1
        lookAhead = hx_strings_StringBuilder()
        while i < strLenMinus1:
            i = i + 1
            ch = HxString.charCodeAt(_hx_str, i)
            if (ch == 27 and i < strLenMinus1) and HxString.charCodeAt(_hx_str,
                i + 1) == 91:
                lookAhead.clear()
                currentState = hx_strings_AnsiState(effectiveState)
                currentGraphicModeParam = 0
                isValidEscapeSequence = False
                i = i + 1
                while i < strLenMinus1:
                    i = i + 1
                    ch2 = HxString.charCodeAt(_hx_str, i)
                    lookAhead.addChar(ch2)
                    ch21 = ch2
                    if ch21 == 48:
                        currentGraphicModeParam = currentGraphicModeParam * 10
                    elif ch21 == 49:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 1)
                    elif ch21 == 50:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 2)
                    elif ch21 == 51:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 3)
                    elif ch21 == 52:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 4)
                    elif ch21 == 53:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 5)
                    elif ch21 == 54:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 6)
                    elif ch21 == 55:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 7)
                    elif ch21 == 56:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 8)
                    elif ch21 == 57:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 9)
                    elif ch21 == 59:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        currentGraphicModeParam = 0
                    elif ch21 == 109:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        if (((effectiveState.fgcolor is not None or 
                            effectiveState.bgcolor is not None) or
                            effectiveState.bold) or effectiveState.underline
                            ) or effectiveState.blink:
                            sb.add('</span>')
                        if (((currentState.fgcolor is not None or 
                            currentState.bgcolor is not None) or
                            currentState.bold) or currentState.underline
                            ) or currentState.blink:
                            sb.add('<span ' + ('null' if 
                                styleOrClassAttribute is None else
                                styleOrClassAttribute) + '="').add(currentState
                                .toCSS(renderMethod)).add('">')
                        effectiveState = currentState
                        isValidEscapeSequence = True
                        break
                    else:
                        break
                if not isValidEscapeSequence:
                    sb.addChar(27).add('[').add(Std.string(lookAhead))
            else:
                sb.addChar(ch)
        if (((effectiveState.fgcolor is not None or effectiveState.bgcolor
             is not None) or effectiveState.bold) or effectiveState.underline
            ) or effectiveState.blink:
            sb.add('</span>')
        return sb.toString()

    @staticmethod
    def appendIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if _hx_str is None else _hx_str) + ('null' if 
                suffix is None else suffix)
        if hx_strings_Strings.endsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if _hx_str is None else _hx_str) + ('null' if suffix is
            None else suffix)

    @staticmethod
    def base64Encode(plain):
        if plain is None:
            return None
        return haxe_crypto_Base64.encode(None if plain is None else
            haxe_io_Bytes.ofString(plain))

    @staticmethod
    def base64Decode(encoded):
        if encoded is None:
            return None
        return haxe_crypto_Base64.decode(encoded).toString()

    @staticmethod
    def charAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = ''
        if ((_hx_str is None or len(_hx_str) == 0) or pos < 0) or pos >= (0 if
            _hx_str is None else len(_hx_str)):
            return resultIfOutOfBound
        if pos < 0 or pos >= len(_hx_str):
            return ''
        else:
            return _hx_str[pos]

    @staticmethod
    def charCodeAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        if (strLen == 0 or pos < 0) or pos >= strLen:
            return resultIfOutOfBound
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def compact(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        needWhiteSpace = False
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            char = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if char > 8 and char < 14 or char == 32:
                if sb.len != 0:
                    needWhiteSpace = True
                continue
            elif needWhiteSpace:
                sb.addChar(32)
                needWhiteSpace = False
            sb.addChar(char)
        return sb.toString()

    @staticmethod
    def contains(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor == '':
            return True
        startIndex = None
        return (searchIn.find(searchFor) if startIndex is None else
            HxString.indexOfImpl(searchIn, searchFor, startIndex)) > -1

    @staticmethod
    def containsOnly(searchIn, allowedChars):
        if searchIn is None or len(searchIn) == 0:
            return True
        if allowedChars is None:
            return False
        allowedCharsArray = None
        _g = allowedChars
        allowedCharsArray1 = _g.index
        if allowedCharsArray1 == 0:
            _hx_str = _g.params[0]
            allowedCharsArray = hx_strings_Strings.toChars(_hx_str)
        elif allowedCharsArray1 == 1:
            chars = _g.params[0]
            allowedCharsArray = chars
        else:
            pass
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if python_internal_ArrayImpl.indexOf(allowedCharsArray, ch, None
                ) < 0:
                return False
        return True

    @staticmethod
    def containsAll(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAllIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsNone(searchIn, searchFor):
        return not hx_strings_Strings.containsAny(searchIn, searchFor)

    @staticmethod
    def containsNoneIgnoreCase(searchIn, searchFor):
        return not hx_strings_Strings.containsAnyIgnoreCase(searchIn, searchFor
            )

    @staticmethod
    def containsWhitespaces(searchIn):
        if searchIn is None:
            return False
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                return True
        return False

    @staticmethod
    def countMatches(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def countMatchesIgnoreCase(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        searchIn = searchIn.lower()
        searchFor = searchFor.lower()
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def compare(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def compareIgnoreCase(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        _hx_str = hx_strings_Strings.toLowerCase8(_hx_str)
        other = hx_strings_Strings.toLowerCase8(other)
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def diff(left, right):
        diff = hx_strings_StringDiff()
        diff.at = hx_strings_Strings.diffAt(left, right)
        diff.left = hx_strings_Strings.substr8(left, diff.at)
        diff.right = hx_strings_Strings.substr8(right, diff.at)
        return diff

    @staticmethod
    def diffAt(_hx_str, other):
        if _hx_str == other:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        otherLen = 0 if other is None else len(other)
        if strLen == 0 or otherLen == 0:
            return 0
        checkLen = otherLen if strLen > otherLen else strLen
        _g = 0
        _g1 = checkLen
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxString.charCodeAt(_hx_str, i) != HxString.charCodeAt(other, i
                ):
                return i
        return checkLen

    @staticmethod
    def ellipsizeLeft(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        return ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str, 
            maxLength - ellipsisLen))

    @staticmethod
    def ellipsizeMiddle(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        maxStrLen = maxLength - ellipsisLen
        leftLen = Math.floor(maxStrLen / 2 + 0.5)
        rightLen = maxStrLen - leftLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= leftLen else hx_strings_Strings.substring8(
            _hx_str, 0, leftLen)) + ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,
            rightLen))

    @staticmethod
    def ellipsizeRight(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        _hx_len = maxLength - ellipsisLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= _hx_len else hx_strings_Strings.substring8(
            _hx_str, 0, _hx_len)) + ('null' if ellipsis is None else ellipsis)

    @staticmethod
    def endsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return searchIn.endswith(searchFor)

    @staticmethod
    def endsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                candidate):
                return True
        return False

    @staticmethod
    def endsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def endsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return hx_strings_Strings.endsWith(searchIn.lower(), searchFor.lower())

    @staticmethod
    def equals(_hx_str, other):
        return _hx_str == other

    @staticmethod
    def equalsIgnoreCase(_hx_str, other):
        return hx_strings_Strings.toLowerCase8(_hx_str
            ) == hx_strings_Strings.toLowerCase8(other)

    @staticmethod
    def filter(_hx_str, _hx_filter, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = list(filter(_hx_filter, hx_strings_Strings.split8(_hx_str,
            [separator])))
        return separator.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def filterChars(_hx_str, _hx_filter):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(ch):
            return ''.join(map(chr, [ch]))
        _this = list(map(_hx_local_0, list(filter(_hx_filter,
            hx_strings_Strings.toChars(_hx_str)))))
        return ''.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def getFuzzyDistance(left, right):
        if (left is None or len(left) == 0) or (right is None or len(right) ==
            0):
            return 0
        left = hx_strings_Strings.toLowerCase8(left)
        right = hx_strings_Strings.toLowerCase8(right)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftLastMatchAt = -100
        rightLastMatchAt = -100
        score = 0
        _g = 0
        _g1 = len(leftChars)
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            leftChar = leftChars[leftIdx] if leftIdx >= 0 and leftIdx < len(
                leftChars) else None
            _g2 = rightLastMatchAt + 1 if rightLastMatchAt > -1 else 0
            _g3 = len(rightChars)
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                rightChar = rightChars[rightIdx
                    ] if rightIdx >= 0 and rightIdx < len(rightChars) else None
                if leftChar == rightChar:
                    score = score + 1
                    if (leftLastMatchAt == leftIdx - 1 and rightLastMatchAt ==
                        rightIdx - 1):
                        score = score + 2
                    leftLastMatchAt = leftIdx
                    rightLastMatchAt = rightIdx
                    break
        return score

    @staticmethod
    def getLevenshteinDistance(left, right):
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0:
            return rightLen
        if rightLen == 0:
            return leftLen
        if leftLen > rightLen:
            tmp = left
            left = right
            right = tmp
            tmpLen = leftLen
            leftLen = rightLen
            rightLen = tmpLen
        prevCosts = list()
        costs = list()
        _g = 0
        _g1 = leftLen + 1
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            prevCosts.append(leftIdx)
            costs.append(0)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)

        def _hx_local_0(a, b):
            if a > b:
                return b
            else:
                return a
        _hx_min = _hx_local_0
        _g = 1
        _g1 = rightLen + 1
        while _g < _g1:
            rightIdx = _g
            _g = _g + 1
            rightChar = python_internal_ArrayImpl._get(rightChars, rightIdx - 1
                )
            python_internal_ArrayImpl._set(costs, 0, rightIdx)
            _g2 = 1
            _g3 = leftLen + 1
            while _g2 < _g3:
                leftIdx = _g2
                _g2 = _g2 + 1
                leftIdxMinus1 = leftIdx - 1
                cost = 0 if (leftChars[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(leftChars) else None
                    ) == rightChar else 1
                python_internal_ArrayImpl._set(costs, leftIdx, _hx_min(
                    _hx_min((costs[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(costs) else None) + 1, (prevCosts[
                    leftIdx] if leftIdx >= 0 and leftIdx < len(prevCosts) else
                    None) + 1), (prevCosts[leftIdxMinus1] if leftIdxMinus1 >=
                    0 and leftIdxMinus1 < len(prevCosts) else None) + cost))
            tmp = prevCosts
            prevCosts = costs
            costs = tmp
        return prevCosts[leftLen] if leftLen >= 0 and leftLen < len(prevCosts
            ) else None

    @staticmethod
    def getLongestCommonSubstring(left, right):
        if left is None or right is None:
            return None
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0 or rightLen == 0:
            return ''
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftSubStartAt = 0
        leftSubLen = 0
        _g = 0
        _g1 = leftLen
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            _g2 = 0
            _g3 = rightLen
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                currLen = 0
                while python_internal_ArrayImpl._get(leftChars, leftIdx +
                    currLen) == python_internal_ArrayImpl._get(rightChars, 
                    rightIdx + currLen):
                    currLen = currLen + 1
                    if (leftIdx + currLen >= leftLen or rightIdx + currLen >=
                        rightLen):
                        break
                if currLen > leftSubLen:
                    leftSubLen = currLen
                    leftSubStartAt = leftIdx
        return hx_strings_Strings.substr8(left, leftSubStartAt, leftSubLen)

    @staticmethod
    def hashCode(_hx_str, algo=None):
        if _hx_str is None or len(_hx_str) == 0:
            return 0
        if algo is None:
            algo = hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC
        if algo is None:
            return hash(_hx_str)
        else:
            tmp = algo.index
            if tmp == 1:
                return haxe_crypto_Adler32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 2:
                return haxe_crypto_Crc32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 3:
                hc = 5381
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 + hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 ^ ch) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 4:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = ((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 - hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 + ch + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 5:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 6) + 2 ** 31) % 2 ** 32 - 2 ** 31 + (((
                        hc << 16) + 2 ** 31) % 2 ** 32 - 2 ** 31) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31 - hc + 2 ** 31) % 2 ** 32 - 2 **
                        31 + ch + 2 ** 31) % 2 ** 32 - 2 ** 31
                return hc
            else:
                return hash(_hx_str)

    @staticmethod
    def htmlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = hx_strings_Strings.REGEX_HTML_UNESCAPE

        def _hx_local_2():

            def _hx_local_1(m):
                match = m.matched()
                match1 = match
                _hx_local_0 = len(match1)
                if _hx_local_0 == 5:
                    if match1 == '&amp;':
                        return '&'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 4:
                    if match1 == '&gt;':
                        return '>'
                    elif match1 == '&lt;':
                        return '<'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 6:
                    if match1 == '&apos;':
                        return "'"
                    elif match1 == '&nbsp;':
                        return ' '
                    elif match1 == '&quot;':
                        return '"'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                else:
                    this1 = Std.parseInt(hx_strings_Strings.substr8(match, 
                        2, (0 if match is None else len(match)) - 3))
                    return ''.join(map(chr, [this1]))
            return hx_strings__Pattern_MatcherImpl(_this.ereg, _this.
                pattern, _this.options, _hx_str).map(_hx_local_1)
        return _hx_local_2()

    @staticmethod
    def htmlEncode(_hx_str, escapeQuotes=None):
        if escapeQuotes is None:
            escapeQuotes = False
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        isFirstSpace = True
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = HxString.charCodeAt(_hx_str, i)
            ch1 = ch
            if ch1 == 32:
                if isFirstSpace:
                    sb.add(' ')
                    isFirstSpace = False
                else:
                    sb.add('&nbsp;')
            elif ch1 == 34:
                sb.add('&quot;' if escapeQuotes else '"')
            elif ch1 == 38:
                sb.add('&amp;')
            elif ch1 == 39:
                sb.add('&#039;' if escapeQuotes else "'")
            elif ch1 == 60:
                sb.add('&lt;')
            elif ch1 == 62:
                sb.add('&gt;')
            elif ch > 127:
                sb.add('&#').add(Std.string(ch)).add(';')
            else:
                sb.addChar(ch)
            if ch != 32:
                isFirstSpace = True
        return sb.toString()

    @staticmethod
    def insertAt(_hx_str, pos, insertion):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0 or pos > strLen:
            raise haxe_Exception.thrown(
                'Absolute value of [pos] must be <= str.length')
        if insertion is None or len(insertion) == 0:
            return _hx_str
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + Std.string(insertion
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, pos))

    @staticmethod
    def ifBlank(_hx_str, fallback):
        if True if _hx_str is None else len(StringTools.trim(_hx_str)) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifEmpty(_hx_str, fallback):
        if _hx_str is None or len(_hx_str) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifNull(_hx_str, fallback):
        if _hx_str is None:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def indentLines(_hx_str, indentWith):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0 or (indentWith is None or len(indentWith) == 0):
            return _hx_str
        isFirstLine = True
        sb = hx_strings_StringBuilder()
        _g = 0
        _g1 = hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)
        while _g < len(_g1):
            line = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if isFirstLine:
                isFirstLine = False
            else:
                sb.newLine()
            sb.add(indentWith)
            sb.add(line)
        return sb.toString()

    @staticmethod
    def indexOf8(_hx_str, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt < 0:
            startAt = 0
        if searchForLen == 0:
            if startAt == 0:
                return 0
            if startAt > 0 and startAt < strLen:
                return startAt
            return strLen
        if startAt >= strLen:
            return -1
        if startAt is None:
            return _hx_str.find(searchFor)
        else:
            return HxString.indexOfImpl(_hx_str, searchFor, startAt)

    @staticmethod
    def isBlank(_hx_str):
        if _hx_str is None:
            return True
        else:
            return len(StringTools.trim(_hx_str)) == 0

    @staticmethod
    def isDigits(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            this1 = HxString.charCodeAt(_hx_str, i)
            if not (this1 > 47 and this1 < 58):
                return False
        return True

    @staticmethod
    def isEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) == 0
        else:
            return True

    @staticmethod
    def isNotBlank(_hx_str):
        if _hx_str is not None:
            return len(StringTools.trim(_hx_str)) > 0
        else:
            return False

    @staticmethod
    def isNotEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) > 0
        else:
            return False

    @staticmethod
    def isLowerCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toLowerCase8(_hx_str)

    @staticmethod
    def isUpperCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toUpperCase8(_hx_str)

    @staticmethod
    def iterate(_hx_str, callback, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = hx_strings_Strings.split8(_hx_str, [separator])
        while _g < len(_g1):
            sub = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            callback(sub)

    @staticmethod
    def iterateChars(_hx_str, callback):
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            callback(HxString.charCodeAt(_hx_str, i))

    @staticmethod
    def lastIndexOf8(_hx_str, searchFor, startAt=None):
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt is None:
            startAt = strLen
        if searchForLen == 0:
            if startAt < 0:
                return 0
            if startAt > strLen:
                return strLen
            return startAt
        if startAt < 0:
            return -1
        elif startAt >= strLen:
            startAt = strLen - 1
        strNeedsUTF8Workaround = len(_hx_str) != strLen
        searchForNeedsUTF8Workaround = len(searchFor) != searchForLen
        if searchForNeedsUTF8Workaround and not strNeedsUTF8Workaround:
            return -1
        searchForChars = hx_strings_Strings.toChars(searchFor)
        startAt = startAt + (searchForLen - 1)
        searchForPosToCheck = searchForLen - 1
        strPos = strLen
        while True:
            tmp = strPos
            strPos = strPos - 1
            if not tmp > 0:
                break
            if strPos > startAt:
                continue
            strCh = HxString.charCodeAt(_hx_str, strPos)
            if strCh == (searchForChars[searchForPosToCheck] if 
                searchForPosToCheck >= 0 and searchForPosToCheck < len(
                searchForChars) else None):
                if searchForPosToCheck == 0:
                    return strPos
                searchForPosToCheck = searchForPosToCheck - 1
            else:
                searchForPosToCheck = searchForLen - 1
        return -1

    @staticmethod
    def length8(_hx_str):
        if _hx_str is None:
            return 0
        return len(_hx_str)

    @staticmethod
    def left(_hx_str, _hx_len):
        if (0 if _hx_str is None else len(_hx_str)) <= _hx_len:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, 0, _hx_len)

    @staticmethod
    def lpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        sb = [_hx_str]
        padLen = 0 if padStr is None else len(padStr)
        while strLen < targetLength:
            sb.insert(0, padStr)
            strLen = strLen + padLen
        if canOverflow:
            return ''.join([python_Boot.toString1(x1, '') for x1 in sb])
        return hx_strings_Strings.right(''.join([python_Boot.toString1(x1,
            '') for x1 in sb]), targetLength)

    @staticmethod
    def map(_hx_str, mapper, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if separator is None:
            raise haxe_Exception.thrown('[separator] must not be null')
        return list(map(mapper, hx_strings_Strings.split8(_hx_str, [
            separator])))

    @staticmethod
    def prependIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if suffix is None else suffix) + ('null' if 
                _hx_str is None else _hx_str)
        if hx_strings_Strings.startsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if suffix is None else suffix) + ('null' if _hx_str is
            None else _hx_str)

    @staticmethod
    def quoteDouble(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return '""'
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find('"') if startIndex is None else HxString.
                indexOfImpl(_hx_str, '"', startIndex)) > -1
        if not tmp:
            return '"' + ('null' if _hx_str is None else _hx_str) + '"'
        return '"' + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, '"', '\\"')) + '"'

    @staticmethod
    def quoteSingle(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return "''"
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find("'") if startIndex is None else HxString.
                indexOfImpl(_hx_str, "'", startIndex)) > -1
        if not tmp:
            return "'" + ('null' if _hx_str is None else _hx_str) + "'"
        return "'" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, "'", "\\'")) + "'"

    @staticmethod
    def removeAfter(_hx_str, searchFor):
        return hx_strings_Strings.substringBefore(_hx_str, searchFor)

    @staticmethod
    def removeAfterLast(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLast(_hx_str, searchFor)

    @staticmethod
    def removeAfterIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeAfterLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAt(_hx_str, pos, length):
        if (_hx_str is None or len(_hx_str) == 0) or length < 1:
            return _hx_str
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0:
            raise haxe_Exception.thrown(
                '[pos] must be smaller than -1 * str.length')
        if pos + length >= strLen:
            return hx_strings_Strings.substring8(_hx_str, 0, pos)
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + HxOverrides.stringOrNull(hx_strings_Strings
            .substring8(_hx_str, pos + length))

    @staticmethod
    def removeBefore(_hx_str, searchFor):
        return hx_strings_Strings.substringAfter(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLast(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLast(_hx_str, searchFor)

    @staticmethod
    def removeBeforeIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAll(searchIn, searchFor):
        return hx_strings_Strings.replaceAll(searchIn, searchFor, '')

    @staticmethod
    def removeFirst(searchIn, searchFor):
        return hx_strings_Strings.replaceFirst(searchIn, searchFor, '')

    @staticmethod
    def removeFirstIgnoreCase(searchIn, searchFor):
        return hx_strings_Strings.replaceFirstIgnoreCase(searchIn,
            searchFor, '')

    @staticmethod
    def removeAnsi(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.REGEX_ANSI_ESC.ereg.replace(_hx_str, '')

    @staticmethod
    def removeLeading(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.startsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, len(searchFor), len(
                searchIn))
        return searchIn

    @staticmethod
    def removeTags(xml):
        if xml is None or len(xml) == 0:
            return xml
        return hx_strings_Strings.REGEX_REMOVE_XML_TAGS.ereg.replace(xml, '')

    @staticmethod
    def removeTrailing(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.endsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, 0, len(searchIn) - len(
                searchFor))
        return searchIn

    @staticmethod
    def repeat(_hx_str, count, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if count < 1:
            return ''
        if count == 1:
            return _hx_str
        _g = []
        _g1 = 0
        _g2 = count
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            _g.append(_hx_str)
        return separator.join([python_Boot.toString1(x1, '') for x1 in _g])

    @staticmethod
    def replaceAll(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        return StringTools.replace(searchIn, searchFor, replaceWith)

    @staticmethod
    def replaceFirst(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn, searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def replaceFirstIgnoreCase(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        searchFor = searchFor.lower()
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn.lower(), searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def reverse(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        chars = hx_strings_Strings.split8(_hx_str, [''])
        chars.reverse()
        return ''.join([python_Boot.toString1(x1, '') for x1 in chars])

    @staticmethod
    def right(_hx_str, _hx_len):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, (0 if _hx_str is None
             else len(_hx_str)) - _hx_len)

    @staticmethod
    def rpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        padLen = 0 if padStr is None else len(padStr)
        sb = hx_strings_StringBuilder(_hx_str)
        while strLen < targetLength:
            sb.add(padStr)
            strLen = strLen + padLen
        if canOverflow:
            return sb.toString()
        _hx_str = sb.toString()
        if (0 if _hx_str is None else len(_hx_str)) <= targetLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, targetLength)

    @staticmethod
    def split8(_hx_str, separator, maxParts=None):
        if maxParts is None:
            maxParts = 0
        if _hx_str is None or separator is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []

        def _hx_local_0(s):
            return s is not None
        separators = list(filter(_hx_local_0, separator))
        if len(separators) == 0:
            return None
        if maxParts <= 0 and len(separators) == 1:
            delimiter = separators[0] if 0 < len(separators) else None
            if delimiter == '':
                return list(_hx_str)
            else:
                return _hx_str.split(delimiter)
        if python_internal_ArrayImpl.indexOf(separators, '', None) > -1:
            if maxParts <= 0:
                _g = []
                _g1 = 0
                _g2 = strLen
                while _g1 < _g2:
                    i = _g1
                    _g1 = _g1 + 1
                    x = HxString.substr(_hx_str, i, 1)
                    _g.append(x)
                return _g
            if maxParts > strLen:
                maxParts = strLen
            maxParts = maxParts - 1
            _g = []
            _g1 = 0
            _g2 = maxParts
            while _g1 < _g2:
                i = _g1
                _g1 = _g1 + 1
                x = HxString.substr(_hx_str, i, 1)
                _g.append(x)
            result = _g
            x = HxString.substr(_hx_str, maxParts, strLen - maxParts)
            result.append(x)
            return result
        _g = []
        _g1 = 0
        while _g1 < len(separators):
            sep = separators[_g1] if _g1 >= 0 and _g1 < len(separators
                ) else None
            _g1 = _g1 + 1
            x = 0 if sep is None else len(sep)
            _g.append(x)
        separatorsLengths = _g
        lastFoundAt = 0
        result = []
        resultCount = 0
        while True:
            separatorLen = 0
            foundAt = -1
            _g = 0
            _g1 = len(separators)
            while _g < _g1:
                i = _g
                _g = _g + 1
                sepFoundAt = hx_strings_Strings.indexOf8(_hx_str, 
                    separators[i] if i >= 0 and i < len(separators) else
                    None, lastFoundAt)
                if sepFoundAt != -1:
                    if foundAt == -1 or sepFoundAt < foundAt:
                        foundAt = sepFoundAt
                        separatorLen = separatorsLengths[i
                            ] if i >= 0 and i < len(separatorsLengths
                            ) else None
            resultCount = resultCount + 1
            if foundAt == -1 or resultCount == maxParts:
                x = HxString.substr(_hx_str, lastFoundAt, strLen - lastFoundAt)
                result.append(x)
                break
            x1 = HxString.substr(_hx_str, lastFoundAt, foundAt - lastFoundAt)
            result.append(x1)
            lastFoundAt = foundAt + separatorLen
        return result

    @staticmethod
    def splitAt(_hx_str, splitPos):
        if _hx_str is None:
            return None
        if splitPos is None or len(splitPos) == 0:
            return [_hx_str]
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return [_hx_str]
        pos = list()
        _g = 0
        _g1 = splitPos
        while _g < len(_g1):
            p = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if p < 0:
                p = strLen + p
            if p < 0 or p >= strLen:
                continue
            if python_internal_ArrayImpl.indexOf(pos, p, None) > -1:
                continue
            pos.append(p)

        def _hx_local_1(a, b):
            if a < b:
                return -1
            elif a > b:
                return 1
            else:
                return 0
        pos.sort(key=python_lib_Functools.cmp_to_key(_hx_local_1))
        result = list()
        lastPos = 0
        _g = 0
        while _g < len(pos):
            p = pos[_g] if _g >= 0 and _g < len(pos) else None
            _g = _g + 1
            chunk = hx_strings_Strings.substring8(_hx_str, lastPos, p)
            if chunk is not None and len(chunk) > 0:
                result.append(chunk)
            lastPos = p
        chunk = hx_strings_Strings.substring8(_hx_str, lastPos)
        if chunk is not None and len(chunk) > 0:
            result.append(chunk)
        return result

    @staticmethod
    def splitEvery(_hx_str, count):
        if _hx_str is None:
            return None
        if count < 1:
            raise haxe_Exception.thrown('[count] must be greater than 0')
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0 or count >= strLen:
            return [_hx_str]
        result = list()
        pos = 0
        while True:
            chunk = hx_strings_Strings.substr8(_hx_str, pos, count)
            pos = pos + count
            if chunk is None or len(chunk) == 0:
                break
            result.append(chunk)
        return result

    @staticmethod
    def splitLines(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return []
        else:
            return hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)

    @staticmethod
    def startsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if (searchFor is None or len(searchFor) == 0) or searchIn == searchFor:
            return True
        return searchIn.startswith(searchFor)

    @staticmethod
    def startsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , candidate):
                return True
        return False

    @staticmethod
    def startsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def startsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor is None or len(searchFor) == 0:
            return True
        return hx_strings_Strings.startsWith(searchIn.lower(), searchFor.
            lower())

    @staticmethod
    def substr8(_hx_str, startAt, _hx_len=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if _hx_len is None:
            _hx_len = 0 if _hx_str is None else len(_hx_str)
        if _hx_len <= 0:
            return ''
        if startAt < 0:
            startAt = startAt + (0 if _hx_str is None else len(_hx_str))
            if startAt < 0:
                startAt = 0
        return HxString.substr(_hx_str, startAt, _hx_len)

    @staticmethod
    def substring8(_hx_str, startAt, endAt=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if endAt is None:
            endAt = 0 if _hx_str is None else len(_hx_str)
        return HxString.substring(_hx_str, startAt, endAt)

    @staticmethod
    def substringAfter(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBetween(_hx_str, after, before=None, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAfterAt = _hx_str.find(after
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = _hx_str.find(before
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringBetweenIgnoreCase(_hx_str, after, before=None,
        notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        strLower = hx_strings_Strings.toLowerCase8(_hx_str)
        after = hx_strings_Strings.toLowerCase8(after)
        before = hx_strings_Strings.toLowerCase8(before)
        startIndex = None
        foundAfterAt = strLower.find(after
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = strLower.find(before
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringAfterLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBefore(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None
        ):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def toBool(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = _hx_str.lower()
        _hx_local_0 = len(_g)
        if _hx_local_0 == 1:
            if _g == '0':
                return False
            else:
                return True
        elif _hx_local_0 == 5:
            if _g == 'false':
                return False
            else:
                return True
        elif _hx_local_0 == 2:
            if _g == 'no':
                return False
            else:
                return True
        else:
            return True

    @staticmethod
    def toBytes(_hx_str):
        if _hx_str is None:
            return None
        return haxe_io_Bytes.ofString(_hx_str)

    @staticmethod
    def toChar(charCode):
        return charCode

    @staticmethod
    def toCharIterator(_hx_str):
        if _hx_str is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        else:
            return hx_strings__CharIterator_StringCharIterator(_hx_str, 0)

    @staticmethod
    def toChars(_hx_str):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []
        _g = []
        _g1 = 0
        _g2 = strLen
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            x = HxString.charCodeAt(_hx_str, i)
            _g.append(x)
        return _g

    @staticmethod
    def toPattern(_hx_str, options=None):
        if _hx_str is None:
            return None
        return hx_strings_Pattern.compile(_hx_str, options)

    @staticmethod
    def toEReg(_hx_str, opt=None):
        if opt is None:
            opt = ''
        if _hx_str is None:
            return None
        return EReg(_hx_str, opt)

    @staticmethod
    def toFloat(_hx_str, ifUnparseable=None):
        result = Std.parseFloat(_hx_str)
        if python_lib_Math.isnan(result):
            return ifUnparseable
        return result

    @staticmethod
    def toHex(num, minDigits=None, upperCase=None):
        if minDigits is None:
            minDigits = 0
        if upperCase is None:
            upperCase = True
        hexed = StringTools.hex(num, 0)
        if not upperCase:
            return hexed.lower()
        if len(hexed) >= minDigits:
            return hexed
        return hx_strings_Strings.lpad(hexed, minDigits, '0')

    @staticmethod
    def toInt(_hx_str, ifUnparseable=None):
        result = Std.parseInt(_hx_str)
        if result is None:
            return ifUnparseable
        return result

    @staticmethod
    def toLowerCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.lower()

    @staticmethod
    def toLowerCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(
            this1, None)
        firstChar = this1 if lowerChar is None else lowerChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def toLowerCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return hx_strings_Strings.toLowerCaseFirstChar(sb.toString())

    @staticmethod
    def toLowerHyphen(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '-'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toLowerUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toTitle(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if keepUppercasedWords:

            def _hx_local_0(s):
                if hx_strings_Strings.toUpperCase8(s) == s:
                    return s
                else:
                    return hx_strings_Strings.toUpperCaseFirstChar(
                        hx_strings_Strings.toLowerCase8(s))
            _this = list(map(_hx_local_0, hx_strings_Strings.
                _splitAsciiWordsUnsafe(_hx_str)))
            return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

        def _hx_local_1(s):
            return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings
                .toLowerCase8(s))
        _this = list(map(_hx_local_1, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toUpperCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return sb.toString()

    @staticmethod
    def toUpperUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toUpperCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toString(_hx_str):
        if _hx_str is None:
            return 'null'
        else:
            return _hx_str

    @staticmethod
    def toUpperCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.upper()

    @staticmethod
    def toUpperCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(
            this1, None)
        firstChar = this1 if upperChar is None else upperChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def trim(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.trim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        this1 = hx_strings_internal__Either2__Either2.b(removableChars)
        this2 = hx_strings_internal__Either2__Either2.b(removableChars)
        return hx_strings_Strings.trimLeft(hx_strings_Strings.trimRight(
            _hx_str, this1), this2)

    @staticmethod
    def trimRight(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.rtrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = _hx_len - 1
        while True:
            tmp = None
            if i > -1:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i - 1
        if i < _hx_len - 1:
            return hx_strings_Strings.substring8(_hx_str, 0, i + 1)
        return _hx_str

    @staticmethod
    def trimLeft(_hx_str, charsToRemove=None):
        if _hx_str is None:
            return _hx_str
        if charsToRemove is None:
            return StringTools.ltrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = 0
        while True:
            tmp = None
            if i < _hx_len:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i + 1
        if i > 0:
            return hx_strings_Strings.substring8(_hx_str, i, _hx_len)
        return _hx_str

    @staticmethod
    def trimLines(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(line):
            return hx_strings_Strings.trim(line, charsToRemove)
        _this = list(map(_hx_local_0, hx_strings_Strings.REGEX_SPLIT_LINES.
            ereg.split(_hx_str)))
        return '\n'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def trimToNull(_hx_str):
        if _hx_str is None:
            return None
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return None
        return trimmed

    @staticmethod
    def trimToEmpty(_hx_str):
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return ''
        return trimmed

    @staticmethod
    def truncate(_hx_str, maxLength):
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, maxLength)

    @staticmethod
    def urlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.unquote(_hx_str)

    @staticmethod
    def urlEncode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.quote(_hx_str, '')

    @staticmethod
    def wrap(_hx_str, maxLineLength, splitLongWords=None, newLineSeparator=None
        ):
        if splitLongWords is None:
            splitLongWords = True
        if newLineSeparator is None:
            newLineSeparator = '\n'
        if (0 if _hx_str is None else len(_hx_str)
            ) <= maxLineLength or maxLineLength < 1:
            return _hx_str
        sb = hx_strings_StringBuilder()
        wordChars = []
        currLineLength = 0
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                if len(wordChars) > 0:
                    _g2 = 0
                    while _g2 < len(wordChars):
                        wordCh = wordChars[_g2] if _g2 >= 0 and _g2 < len(
                            wordChars) else None
                        _g2 = _g2 + 1
                        if currLineLength == maxLineLength and splitLongWords:
                            sb.add(newLineSeparator)
                            currLineLength = 0
                        currLineLength = currLineLength + 1
                        sb.addChar(wordCh)
                    wordChars = []
                if currLineLength >= maxLineLength:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                sb.addChar(ch)
                currLineLength = currLineLength + 1
            else:
                wordChars.append(ch)
        if len(wordChars) > 0:
            _g = 0
            while _g < len(wordChars):
                wordCh = wordChars[_g] if _g >= 0 and _g < len(wordChars
                    ) else None
                _g = _g + 1
                if currLineLength == maxLineLength and splitLongWords:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                currLineLength = currLineLength + 1
                sb.addChar(wordCh)
        return sb.toString()


class hx_strings_StringDiff:
    _hx_class_name = 'hx.strings.StringDiff'
    __slots__ = 'at', 'left', 'right'
    _hx_fields = ['at', 'left', 'right']
    _hx_methods = ['toString']

    def __init__(self):
        self.right = None
        self.left = None
        self.at = None

    def toString(self):
        return 'StringDiff[at=' + Std.string(self.at
            ) + ', left=' + HxOverrides.stringOrNull(self.left
            ) + ', right=' + HxOverrides.stringOrNull(self.right) + ']'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.at = None
        _hx_o.left = None
        _hx_o.right = None


class hx_strings_HashCodeAlgorithm(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.HashCodeAlgorithm'
    _hx_constructs = ['PLATFORM_SPECIFIC', 'ADLER32', 'CRC32B', 'DJB2A',
        'JAVA', 'SDBM']


<mask token>


class hx_strings_AnsiToHtmlRenderMethod(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.AnsiToHtmlRenderMethod'
    _hx_constructs = ['StyleAttributes', 'CssClasses', 'CssClassesCallback']

    @staticmethod
    def CssClassesCallback(func):
        return hx_strings_AnsiToHtmlRenderMethod('CssClassesCallback', 2, (
            func,))


<mask token>


class hx_strings_AnsiState:
    _hx_class_name = 'hx.strings.AnsiState'
    __slots__ = 'bgcolor', 'blink', 'bold', 'fgcolor', 'underline'
    _hx_fields = ['bgcolor', 'blink', 'bold', 'fgcolor', 'underline']
    _hx_methods = ['isActive', 'reset', 'copyFrom',
        'setGraphicModeParameter', 'toCSS']
    _hx_statics = ['defaultCssClassesCallback']

    def __init__(self, copyFrom=None):
        self.underline = None
        self.fgcolor = None
        self.bold = None
        self.blink = None
        self.bgcolor = None
        if copyFrom is None:
            self.reset()
        else:
            self.copyFrom(copyFrom)

    def isActive(self):
        if not (((self.fgcolor is not None or self.bgcolor is not None) or
            self.bold) or self.underline):
            return self.blink
        else:
            return True

    def reset(self):
        self.fgcolor = None
        self.bgcolor = None
        self.bold = False
        self.underline = False
        self.blink = False

    def copyFrom(self, other):
        self.fgcolor = other.fgcolor
        self.bgcolor = other.bgcolor
        self.bold = other.bold
        self.underline = other.underline
        self.blink = other.blink

    def setGraphicModeParameter(self, param):
        param1 = param
        if param1 == 0:
            self.reset()
        elif param1 == 1:
            self.bold = True
        elif param1 == 4:
            self.underline = True
        elif param1 == 5:
            self.blink = True
        elif param1 == 30:
            self.fgcolor = 'black'
        elif param1 == 31:
            self.fgcolor = 'red'
        elif param1 == 32:
            self.fgcolor = 'green'
        elif param1 == 33:
            self.fgcolor = 'yellow'
        elif param1 == 34:
            self.fgcolor = 'blue'
        elif param1 == 35:
            self.fgcolor = 'magenta'
        elif param1 == 36:
            self.fgcolor = 'cyan'
        elif param1 == 37:
            self.fgcolor = 'white'
        elif param1 == 40:
            self.bgcolor = 'black'
        elif param1 == 41:
            self.bgcolor = 'red'
        elif param1 == 42:
            self.bgcolor = 'green'
        elif param1 == 43:
            self.bgcolor = 'yellow'
        elif param1 == 44:
            self.bgcolor = 'blue'
        elif param1 == 45:
            self.bgcolor = 'magenta'
        elif param1 == 46:
            self.bgcolor = 'cyan'
        elif param1 == 47:
            self.bgcolor = 'white'
        else:
            pass

    def toCSS(self, renderMethod):
        if (((self.fgcolor is not None or self.bgcolor is not None) or self
            .bold) or self.underline) or self.blink:
            sb = hx_strings_StringBuilder()
            if renderMethod is None:
                renderMethod = (hx_strings_AnsiToHtmlRenderMethod.
                    StyleAttributes)
            tmp = renderMethod.index
            if tmp == 0:
                if self.fgcolor is not None:
                    sb.add('color:').add(self.fgcolor).add(';')
                if self.bgcolor is not None:
                    sb.add('background-color:').add(self.bgcolor).add(';')
                if self.bold:
                    sb.add('font-weight:bold;')
                if self.underline:
                    sb.add('text-decoration:underline;')
                if self.blink:
                    sb.add('text-decoration:blink;')
            elif tmp == 1:
                sb.add(hx_strings_AnsiState.defaultCssClassesCallback(self))
            elif tmp == 2:
                func = renderMethod.params[0]
                sb.add(func(self))
            else:
                pass
            return sb.toString()
        return ''

    @staticmethod
    def defaultCssClassesCallback(state):
        classes = []
        if state.fgcolor is not None:
            x = 'ansi_fg_' + HxOverrides.stringOrNull(state.fgcolor)
            classes.append(x)
        if state.bgcolor is not None:
            x = 'ansi_bg_' + HxOverrides.stringOrNull(state.bgcolor)
            classes.append(x)
        if state.bold:
            classes.append('ansi_bold')
        if state.underline:
            classes.append('ansi_underline')
        if state.blink:
            classes.append('ansi_blink')
        return ' '.join([python_Boot.toString1(x1, '') for x1 in classes])

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bgcolor = None
        _hx_o.blink = None
        _hx_o.bold = None
        _hx_o.fgcolor = None
        _hx_o.underline = None


class hx_strings_internal_Bits:
    _hx_class_name = 'hx.strings.internal.Bits'
    __slots__ = ()
    _hx_statics = ['clearBit', 'setBit', 'toggleBit', 'getBit']

    @staticmethod
    def clearBit(num, bitPos):
        return num & ~(1 << bitPos - 1)

    @staticmethod
    def setBit(num, bitPos):
        return num | 1 << bitPos - 1

    @staticmethod
    def toggleBit(num, bitPos):
        return num ^ 1 << bitPos - 1

    @staticmethod
    def getBit(num, bitPos):
        return 1 == num >> bitPos - 1 & 1


class hx_strings_internal__Either2_Either2_Impl_:
    _hx_class_name = 'hx.strings.internal._Either2.Either2_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either2__Either2.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either2__Either2.b(value)
        return this1


class hx_strings_internal__Either2__Either2(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either2._Either2'
    _hx_constructs = ['a', 'b']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either2__Either2('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either2__Either2('b', 1, (v,))


class hx_strings_internal__Either3_Either3_Impl_:
    _hx_class_name = 'hx.strings.internal._Either3.Either3_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB', 'fromC']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either3__Either3.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either3__Either3.b(value)
        return this1

    @staticmethod
    def fromC(value):
        this1 = hx_strings_internal__Either3__Either3.c(value)
        return this1


class hx_strings_internal__OneOrMany_OneOrMany_Impl_:
    _hx_class_name = 'hx.strings.internal._OneOrMany.OneOrMany_Impl_'
    __slots__ = ()
    _hx_statics = ['fromSingle']

    @staticmethod
    def fromSingle(value):
        return [value]


class hx_strings_internal__RingBuffer_RingBuffer_Impl_:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBuffer_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get']

    @staticmethod
    def _new(size):
        this1 = hx_strings_internal__RingBuffer_RingBufferImpl(size)
        return this1

    @staticmethod
    def get(this1, index):
        return this1.get(index)


class hx_strings_internal__RingBuffer_RingBufferIterator:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBufferIterator'
    __slots__ = 'buff', 'idx'
    _hx_fields = ['buff', 'idx']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, buff):
        self.idx = -1
        self.buff = buff

    def hasNext(self):
        return self.idx + 1 < self.buff.length

    def next(self):
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.idx
        _hx_local_0.idx = _hx_local_1 + 1
        _hx_local_1
        return self.buff.get(self.idx)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buff = None
        _hx_o.idx = None


class python_HaxeIterator:
    _hx_class_name = 'python.HaxeIterator'
    __slots__ = 'it', 'x', 'has', 'checked'
    _hx_fields = ['it', 'x', 'has', 'checked']
    _hx_methods = ['next', 'hasNext']

    def __init__(self, it):
        self.checked = False
        self.has = False
        self.x = None
        self.it = it

    def next(self):
        if not self.checked:
            self.hasNext()
        self.checked = False
        return self.x

    def hasNext(self):
        if not self.checked:
            try:
                self.x = self.it.__next__()
                self.has = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),
                    StopIteration):
                    self.has = False
                    self.x = None
                else:
                    raise _g
            self.checked = True
        return self.has

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.it = None
        _hx_o.x = None
        _hx_o.has = None
        _hx_o.checked = None


class python_internal_ArrayImpl:
    _hx_class_name = 'python.internal.ArrayImpl'
    __slots__ = ()
    _hx_statics = ['concat', 'copy', 'iterator', 'keyValueIterator',
        'indexOf', 'lastIndexOf', 'join', 'toString', 'pop', 'push',
        'unshift', 'remove', 'contains', 'shift', 'slice', 'sort', 'splice',
        'map', 'filter', 'insert', 'reverse', '_get', '_set']

    @staticmethod
    def concat(a1, a2):
        return a1 + a2

    @staticmethod
    def copy(x):
        return list(x)

    @staticmethod
    def iterator(x):
        return python_HaxeIterator(x.__iter__())

    @staticmethod
    def keyValueIterator(x):
        return haxe_iterators_ArrayKeyValueIterator(x)

    @staticmethod
    def indexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (0 if fromIndex is None else _hx_len + fromIndex if fromIndex <
            0 else fromIndex)
        if l < 0:
            l = 0
        _g = l
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxOverrides.eq(a[i], x):
                return i
        return -1

    @staticmethod
    def lastIndexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (_hx_len if fromIndex is None else _hx_len + fromIndex + 1 if 
            fromIndex < 0 else fromIndex + 1)
        if l > _hx_len:
            l = _hx_len
        while True:
            l = l - 1
            tmp = l
            if not tmp > -1:
                break
            if HxOverrides.eq(a[l], x):
                return l
        return -1

    @staticmethod
    def join(x, sep):
        return sep.join([python_Boot.toString1(x1, '') for x1 in x])

    @staticmethod
    def toString(x):
        return '[' + HxOverrides.stringOrNull(','.join([python_Boot.
            toString1(x1, '') for x1 in x])) + ']'

    @staticmethod
    def pop(x):
        if len(x) == 0:
            return None
        else:
            return x.pop()

    @staticmethod
    def push(x, e):
        x.append(e)
        return len(x)

    @staticmethod
    def unshift(x, e):
        x.insert(0, e)

    @staticmethod
    def remove(x, e):
        try:
            x.remove(e)
            return True
        except BaseException as _g:
            return False

    @staticmethod
    def contains(x, e):
        return e in x

    @staticmethod
    def shift(x):
        if len(x) == 0:
            return None
        return x.pop(0)

    @staticmethod
    def slice(x, pos, end=None):
        return x[pos:end]

    @staticmethod
    def sort(x, f):
        x.sort(key=python_lib_Functools.cmp_to_key(f))

    @staticmethod
    def splice(x, pos, _hx_len):
        if pos < 0:
            pos = len(x) + pos
        if pos < 0:
            pos = 0
        res = x[pos:pos + _hx_len]
        del x[pos:pos + _hx_len]
        return res

    @staticmethod
    def map(x, f):
        return list(map(f, x))

    @staticmethod
    def filter(x, f):
        return list(filter(f, x))

    @staticmethod
    def insert(a, pos, x):
        a.insert(pos, x)

    @staticmethod
    def reverse(a):
        a.reverse()

    @staticmethod
    def _get(x, idx):
        if idx > -1 and idx < len(x):
            return x[idx]
        else:
            return None

    @staticmethod
    def _set(x, idx, v):
        l = len(x)
        while l < idx:
            x.append(None)
            l = l + 1
        if l == idx:
            x.append(v)
        else:
            x[idx] = v
        return v


class HxOverrides:
    _hx_class_name = 'HxOverrides'
    __slots__ = ()
    _hx_statics = ['eq', 'stringOrNull', 'rshift', 'modf', 'mod']

    @staticmethod
    def eq(a, b):
        if isinstance(a, list) or isinstance(b, list):
            return a is b
        return a == b

    @staticmethod
    def stringOrNull(s):
        if s is None:
            return 'null'
        else:
            return s

    @staticmethod
    def rshift(val, n):
        return val % 4294967296 >> n

    @staticmethod
    def modf(a, b):
        if b == 0.0:
            return float('nan')
        elif a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b

    @staticmethod
    def mod(a, b):
        if a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b


class python_internal_MethodClosure:
    _hx_class_name = 'python.internal.MethodClosure'
    __slots__ = 'obj', 'func'
    _hx_fields = ['obj', 'func']
    _hx_methods = ['__call__']

    def __init__(self, obj, func):
        self.obj = obj
        self.func = func

    def __call__(self, *args):
        return self.func(self.obj, *args)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.obj = None
        _hx_o.func = None


class sys_io_File:
    _hx_class_name = 'sys.io.File'
    __slots__ = ()
    _hx_statics = ['getContent']

    @staticmethod
    def getContent(path):
        f = python_lib_Builtins.open(path, 'r', -1, 'utf-8', None, '')
        content = f.read(-1)
        f.close()
        return content


<mask token>

<mask token>


class haxe_Exception(Exception):
    _hx_class_name = 'haxe.Exception'
    __slots__ = ('_hx___nativeStack', '_hx___skipStack',
        '_hx___nativeException', '_hx___previousException')
    _hx_fields = ['__nativeStack', '__skipStack', '__nativeException',
        '__previousException']
    _hx_methods = ['unwrap', 'toString', 'get_message', 'get_native']
    _hx_statics = ['caught', 'thrown']
    _hx_interfaces = []
    _hx_super = Exception

    def __init__(self, message, previous=None, native=None):
        self._hx___previousException = None
        self._hx___nativeException = None
        self._hx___nativeStack = None
        self._hx___skipStack = 0
        super().__init__(message)
        self._hx___previousException = previous
        if native is not None and Std.isOfType(native, BaseException):
            self._hx___nativeException = native
            self._hx___nativeStack = haxe_NativeStackTrace.exceptionStack()
        else:
            self._hx___nativeException = self
            infos = python_lib_Traceback.extract_stack()
            if len(infos) != 0:
                infos.pop()
            infos.reverse()
            self._hx___nativeStack = infos

    def unwrap(self):
        return self._hx___nativeException

    def toString(self):
        return self.get_message()

    def get_message(self):
        return str(self)

    def get_native(self):
        return self._hx___nativeException

    @staticmethod
    def caught(value):
        if Std.isOfType(value, haxe_Exception):
            return value
        elif Std.isOfType(value, BaseException):
            return haxe_Exception(str(value), None, value)
        else:
            return haxe_ValueException(value, None, value)

    @staticmethod
    def thrown(value):
        if Std.isOfType(value, haxe_Exception):
            return value.get_native()
        elif Std.isOfType(value, BaseException):
            return value
        else:
            e = haxe_ValueException(value)
            e._hx___skipStack = e._hx___skipStack + 1
            return e

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o._hx___nativeStack = None
        _hx_o._hx___skipStack = None
        _hx_o._hx___nativeException = None
        _hx_o._hx___previousException = None


class haxe_NativeStackTrace:
    _hx_class_name = 'haxe.NativeStackTrace'
    __slots__ = ()
    _hx_statics = ['saveStack', 'exceptionStack']

    @staticmethod
    def saveStack(exception):
        pass

    @staticmethod
    def exceptionStack():
        exc = python_lib_Sys.exc_info()
        if exc[2] is not None:
            infos = python_lib_Traceback.extract_tb(exc[2])
            infos.reverse()
            return infos
        else:
            return []


class haxe_ValueException(haxe_Exception):
    _hx_class_name = 'haxe.ValueException'
    __slots__ = 'value',
    _hx_fields = ['value']
    _hx_methods = ['unwrap']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception

    def __init__(self, value, previous=None, native=None):
        self.value = None
        super().__init__(Std.string(value), previous, native)
        self.value = value

    def unwrap(self):
        return self.value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class haxe_crypto_Adler32:
    _hx_class_name = 'haxe.crypto.Adler32'
    __slots__ = 'a1', 'a2'
    _hx_fields = ['a1', 'a2']
    _hx_methods = ['get', 'update']
    _hx_statics = ['make']

    def __init__(self):
        self.a1 = 1
        self.a2 = 0

    def get(self):
        return self.a2 << 16 | self.a1

    def update(self, b, pos, _hx_len):
        a1 = self.a1
        a2 = self.a2
        _g = pos
        _g1 = pos + _hx_len
        while _g < _g1:
            p = _g
            _g = _g + 1
            c = b.b[p]
            a1 = HxOverrides.mod(a1 + c, 65521)
            a2 = HxOverrides.mod(a2 + a1, 65521)
        self.a1 = a1
        self.a2 = a2

    @staticmethod
    def make(b):
        a = haxe_crypto_Adler32()
        a.update(b, 0, b.length)
        return a.get()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.a1 = None
        _hx_o.a2 = None


class haxe_io_Bytes:
    _hx_class_name = 'haxe.io.Bytes'
    __slots__ = 'length', 'b'
    _hx_fields = ['length', 'b']
    _hx_methods = ['getString', 'toString']
    _hx_statics = ['alloc', 'ofString']

    def __init__(self, length, b):
        self.length = length
        self.b = b

    def getString(self, pos, _hx_len, encoding=None):
        tmp = encoding is None
        if (pos < 0 or _hx_len < 0) or pos + _hx_len > self.length:
            raise haxe_Exception.thrown(haxe_io_Error.OutsideBounds)
        return self.b[pos:pos + _hx_len].decode('UTF-8', 'replace')

    def toString(self):
        return self.getString(0, self.length)

    @staticmethod
    def alloc(length):
        return haxe_io_Bytes(length, bytearray(length))

    @staticmethod
    def ofString(s, encoding=None):
        b = bytearray(s, 'UTF-8')
        return haxe_io_Bytes(len(b), b)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.length = None
        _hx_o.b = None


class haxe_crypto_Base64:
    _hx_class_name = 'haxe.crypto.Base64'
    __slots__ = ()
    _hx_statics = ['CHARS', 'BYTES', 'encode', 'decode']

    @staticmethod
    def encode(_hx_bytes, complement=None):
        if complement is None:
            complement = True
        _hx_str = haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).encodeBytes(
            _hx_bytes).toString()
        if complement:
            _g = HxOverrides.mod(_hx_bytes.length, 3)
            if _g == 1:
                _hx_str = ('null' if _hx_str is None else _hx_str) + '=='
            elif _g == 2:
                _hx_str = ('null' if _hx_str is None else _hx_str) + '='
            else:
                pass
        return _hx_str

    @staticmethod
    def decode(_hx_str, complement=None):
        if complement is None:
            complement = True
        if complement:
            while HxString.charCodeAt(_hx_str, len(_hx_str) - 1) == 61:
                _hx_str = HxString.substr(_hx_str, 0, -1)
        return haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).decodeBytes(
            haxe_io_Bytes.ofString(_hx_str))


class haxe_crypto_BaseCode:
    _hx_class_name = 'haxe.crypto.BaseCode'
    __slots__ = 'base', 'nbits', 'tbl'
    _hx_fields = ['base', 'nbits', 'tbl']
    _hx_methods = ['encodeBytes', 'initTable', 'decodeBytes']

    def __init__(self, base):
        self.tbl = None
        _hx_len = base.length
        nbits = 1
        while _hx_len > 1 << nbits:
            nbits = nbits + 1
        if nbits > 8 or _hx_len != 1 << nbits:
            raise haxe_Exception.thrown(
                'BaseCode : base length must be a power of two.')
        self.base = base
        self.nbits = nbits

    def encodeBytes(self, b):
        nbits = self.nbits
        base = self.base
        x = b.length * 8 / nbits
        size = None
        try:
            size = int(x)
        except BaseException as _g:
            size = None
        out = haxe_io_Bytes.alloc(size + (0 if HxOverrides.mod(b.length * 8,
            nbits) == 0 else 1))
        buf = 0
        curbits = 0
        mask = (1 << nbits) - 1
        pin = 0
        pout = 0
        while pout < size:
            while curbits < nbits:
                curbits = curbits + 8
                buf = buf << 8
                pos = pin
                pin = pin + 1
                buf = buf | b.b[pos]
            curbits = curbits - nbits
            pos1 = pout
            pout = pout + 1
            v = base.b[buf >> curbits & mask]
            out.b[pos1] = v & 255
        if curbits > 0:
            pos = pout
            pout = pout + 1
            v = base.b[buf << nbits - curbits & mask]
            out.b[pos] = v & 255
        return out

    def initTable(self):
        tbl = list()
        _g = 0
        while _g < 256:
            i = _g
            _g = _g + 1
            python_internal_ArrayImpl._set(tbl, i, -1)
        _g = 0
        _g1 = self.base.length
        while _g < _g1:
            i = _g
            _g = _g + 1
            python_internal_ArrayImpl._set(tbl, self.base.b[i], i)
        self.tbl = tbl

    def decodeBytes(self, b):
        nbits = self.nbits
        base = self.base
        if self.tbl is None:
            self.initTable()
        tbl = self.tbl
        size = b.length * nbits >> 3
        out = haxe_io_Bytes.alloc(size)
        buf = 0
        curbits = 0
        pin = 0
        pout = 0
        while pout < size:
            while curbits < 8:
                curbits = curbits + nbits
                buf = buf << nbits
                pos = pin
                pin = pin + 1
                i = python_internal_ArrayImpl._get(tbl, b.b[pos])
                if i == -1:
                    raise haxe_Exception.thrown(
                        'BaseCode : invalid encoded char')
                buf = buf | i
            curbits = curbits - 8
            pos1 = pout
            pout = pout + 1
            out.b[pos1] = buf >> curbits & 255 & 255
        return out

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.base = None
        _hx_o.nbits = None
        _hx_o.tbl = None


class haxe_crypto_Crc32:
    _hx_class_name = 'haxe.crypto.Crc32'
    __slots__ = ()
    _hx_statics = ['make']

    @staticmethod
    def make(data):
        c_crc = -1
        b = data.b
        _g = 0
        _g1 = data.length
        while _g < _g1:
            i = _g
            _g = _g + 1
            tmp = (c_crc ^ b[i]) & 255
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            c_crc = HxOverrides.rshift(c_crc, 8) ^ tmp
        return c_crc ^ -1


class haxe_ds_IntMap:
    _hx_class_name = 'haxe.ds.IntMap'
    __slots__ = 'h',
    _hx_fields = ['h']
    _hx_methods = ['set']
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        self.h = dict()

    def set(self, key, value):
        self.h[key] = value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_ds_StringMap:
    _hx_class_name = 'haxe.ds.StringMap'
    __slots__ = 'h',
    _hx_fields = ['h']
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        self.h = dict()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_exceptions_PosException(haxe_Exception):
    _hx_class_name = 'haxe.exceptions.PosException'
    __slots__ = 'posInfos',
    _hx_fields = ['posInfos']
    _hx_methods = ['toString']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception

    def __init__(self, message, previous=None, pos=None):
        self.posInfos = None
        super().__init__(message, previous)
        if pos is None:
            self.posInfos = _hx_AnonObject({'fileName': '(unknown)',
                'lineNumber': 0, 'className': '(unknown)', 'methodName':
                '(unknown)'})
        else:
            self.posInfos = pos

    def toString(self):
        return '' + HxOverrides.stringOrNull(super().toString()
            ) + ' in ' + HxOverrides.stringOrNull(self.posInfos.className
            ) + '.' + HxOverrides.stringOrNull(self.posInfos.methodName
            ) + ' at ' + HxOverrides.stringOrNull(self.posInfos.fileName
            ) + ':' + Std.string(self.posInfos.lineNumber)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.posInfos = None


class haxe_exceptions_NotImplementedException(haxe_exceptions_PosException):
    _hx_class_name = 'haxe.exceptions.NotImplementedException'
    __slots__ = ()
    _hx_fields = []
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_exceptions_PosException

    def __init__(self, message=None, previous=None, pos=None):
        if message is None:
            message = 'Not implemented'
        super().__init__(message, previous, pos)


class haxe_io_BytesBuffer:
    _hx_class_name = 'haxe.io.BytesBuffer'
    __slots__ = 'b',
    _hx_fields = ['b']
    _hx_methods = ['getBytes']

    def __init__(self):
        self.b = bytearray()

    def getBytes(self):
        _hx_bytes = haxe_io_Bytes(len(self.b), self.b)
        self.b = None
        return _hx_bytes

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class haxe_io_Output:
    _hx_class_name = 'haxe.io.Output'
    __slots__ = 'bigEndian',
    _hx_fields = ['bigEndian']
    _hx_methods = ['set_bigEndian']

    def set_bigEndian(self, b):
        self.bigEndian = b
        return b

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bigEndian = None


class haxe_io_BytesOutput(haxe_io_Output):
    _hx_class_name = 'haxe.io.BytesOutput'
    __slots__ = 'b',
    _hx_fields = ['b']
    _hx_methods = ['writeByte', 'getBytes']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output

    def __init__(self):
        self.b = haxe_io_BytesBuffer()
        self.set_bigEndian(False)

    def writeByte(self, c):
        self.b.b.append(c)

    def getBytes(self):
        return self.b.getBytes()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class haxe_io_Encoding(Enum):
    __slots__ = ()
    _hx_class_name = 'haxe.io.Encoding'
    _hx_constructs = ['UTF8', 'RawNative']


<mask token>


class haxe_io_Eof:
    _hx_class_name = 'haxe.io.Eof'
    __slots__ = ()
    _hx_methods = ['toString']

    def __init__(self):
        pass

    def toString(self):
        return 'Eof'

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class haxe_io_Error(Enum):
    __slots__ = ()
    _hx_class_name = 'haxe.io.Error'
    _hx_constructs = ['Blocked', 'Overflow', 'OutsideBounds', 'Custom']

    @staticmethod
    def Custom(e):
        return haxe_io_Error('Custom', 3, (e,))


<mask token>


class haxe_io_Input:
    _hx_class_name = 'haxe.io.Input'
    __slots__ = ()
    _hx_methods = ['readByte']

    def readByte(self):
        raise haxe_exceptions_NotImplementedException(None, None,
            _hx_AnonObject({'fileName': 'haxe/io/Input.hx', 'lineNumber': 
            53, 'className': 'haxe.io.Input', 'methodName': 'readByte'}))

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class haxe_iterators_ArrayIterator:
    _hx_class_name = 'haxe.iterators.ArrayIterator'
    __slots__ = 'array', 'current'
    _hx_fields = ['array', 'current']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, array):
        self.current = 0
        self.array = array

    def hasNext(self):
        return self.current < len(self.array)

    def next(self):

        def _hx_local_3():

            def _hx_local_2():
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = _hx_local_1 + 1
                return _hx_local_1
            return python_internal_ArrayImpl._get(self.array, _hx_local_2())
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.array = None
        _hx_o.current = None


class haxe_iterators_ArrayKeyValueIterator:
    _hx_class_name = 'haxe.iterators.ArrayKeyValueIterator'
    __slots__ = 'current', 'array'
    _hx_fields = ['current', 'array']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, array):
        self.current = 0
        self.array = array

    def hasNext(self):
        return self.current < len(self.array)

    def next(self):

        def _hx_local_3():

            def _hx_local_2():
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = _hx_local_1 + 1
                return _hx_local_1
            return _hx_AnonObject({'value': python_internal_ArrayImpl._get(
                self.array, self.current), 'key': _hx_local_2()})
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.current = None
        _hx_o.array = None


class hx_strings__AnyAsString_AnyAsString_Impl_:
    _hx_class_name = 'hx.strings._AnyAsString.AnyAsString_Impl_'
    __slots__ = ()
    _hx_statics = ['fromBool', 'fromAny']

    @staticmethod
    def fromBool(value):
        if value:
            return 'true'
        else:
            return 'false'

    @staticmethod
    def fromAny(value):
        return Std.string(value)


class hx_strings__Char_CharCaseMapper:
    _hx_class_name = 'hx.strings._Char.CharCaseMapper'
    __slots__ = 'mapU2L', 'mapL2U'
    _hx_fields = ['mapU2L', 'mapL2U']
    _hx_methods = ['_addCaseMapping', 'isLowerCase', 'isUpperCase',
        'toLowerCase', 'toUpperCase']

    def __init__(self):
        self.mapL2U = haxe_ds_IntMap()
        self.mapU2L = haxe_ds_IntMap()
        self._addCaseMapping(97, 65)
        self._addCaseMapping(98, 66)
        self._addCaseMapping(99, 67)
        self._addCaseMapping(100, 68)
        self._addCaseMapping(101, 69)
        self._addCaseMapping(102, 70)
        self._addCaseMapping(103, 71)
        self._addCaseMapping(104, 72)
        self._addCaseMapping(105, 73)
        self._addCaseMapping(106, 74)
        self._addCaseMapping(107, 75)
        self._addCaseMapping(108, 76)
        self._addCaseMapping(109, 77)
        self._addCaseMapping(110, 78)
        self._addCaseMapping(111, 79)
        self._addCaseMapping(112, 80)
        self._addCaseMapping(113, 81)
        self._addCaseMapping(114, 82)
        self._addCaseMapping(115, 83)
        self._addCaseMapping(116, 84)
        self._addCaseMapping(117, 85)
        self._addCaseMapping(118, 86)
        self._addCaseMapping(119, 87)
        self._addCaseMapping(120, 88)
        self._addCaseMapping(121, 89)
        self._addCaseMapping(122, 90)
        self._addCaseMapping(224, 192)
        self._addCaseMapping(225, 193)
        self._addCaseMapping(226, 194)
        self._addCaseMapping(227, 195)
        self._addCaseMapping(228, 196)
        self._addCaseMapping(229, 197)
        self._addCaseMapping(230, 198)
        self._addCaseMapping(231, 199)
        self._addCaseMapping(232, 200)
        self._addCaseMapping(233, 201)
        self._addCaseMapping(234, 202)
        self._addCaseMapping(235, 203)
        self._addCaseMapping(236, 204)
        self._addCaseMapping(237, 205)
        self._addCaseMapping(238, 206)
        self._addCaseMapping(239, 207)
        self._addCaseMapping(240, 208)
        self._addCaseMapping(241, 209)
        self._addCaseMapping(242, 210)
        self._addCaseMapping(243, 211)
        self._addCaseMapping(244, 212)
        self._addCaseMapping(245, 213)
        self._addCaseMapping(246, 214)
        self._addCaseMapping(248, 216)
        self._addCaseMapping(249, 217)
        self._addCaseMapping(250, 218)
        self._addCaseMapping(251, 219)
        self._addCaseMapping(252, 220)
        self._addCaseMapping(253, 221)
        self._addCaseMapping(254, 222)
        self._addCaseMapping(255, 376)
        self._addCaseMapping(257, 256)
        self._addCaseMapping(259, 258)
        self._addCaseMapping(261, 260)
        self._addCaseMapping(263, 262)
        self._addCaseMapping(265, 264)
        self._addCaseMapping(267, 266)
        self._addCaseMapping(269, 268)
        self._addCaseMapping(271, 270)
        self._addCaseMapping(273, 272)
        self._addCaseMapping(275, 274)
        self._addCaseMapping(277, 276)
        self._addCaseMapping(279, 278)
        self._addCaseMapping(281, 280)
        self._addCaseMapping(283, 282)
        self._addCaseMapping(285, 284)
        self._addCaseMapping(287, 286)
        self._addCaseMapping(289, 288)
        self._addCaseMapping(291, 290)
        self._addCaseMapping(293, 292)
        self._addCaseMapping(295, 294)
        self._addCaseMapping(297, 296)
        self._addCaseMapping(299, 298)
        self._addCaseMapping(301, 300)
        self._addCaseMapping(303, 302)
        self._addCaseMapping(305, 73)
        self._addCaseMapping(307, 306)
        self._addCaseMapping(309, 308)
        self._addCaseMapping(311, 310)
        self._addCaseMapping(314, 313)
        self._addCaseMapping(316, 315)
        self._addCaseMapping(318, 317)
        self._addCaseMapping(320, 319)
        self._addCaseMapping(322, 321)
        self._addCaseMapping(324, 323)
        self._addCaseMapping(326, 325)
        self._addCaseMapping(328, 327)
        self._addCaseMapping(331, 330)
        self._addCaseMapping(333, 332)
        self._addCaseMapping(335, 334)
        self._addCaseMapping(337, 336)
        self._addCaseMapping(339, 338)
        self._addCaseMapping(341, 340)
        self._addCaseMapping(343, 342)
        self._addCaseMapping(345, 344)
        self._addCaseMapping(347, 346)
        self._addCaseMapping(349, 348)
        self._addCaseMapping(351, 350)
        self._addCaseMapping(353, 352)
        self._addCaseMapping(355, 354)
        self._addCaseMapping(357, 356)
        self._addCaseMapping(359, 358)
        self._addCaseMapping(361, 360)
        self._addCaseMapping(363, 362)
        self._addCaseMapping(365, 364)
        self._addCaseMapping(367, 366)
        self._addCaseMapping(369, 368)
        self._addCaseMapping(371, 370)
        self._addCaseMapping(373, 372)
        self._addCaseMapping(375, 374)
        self._addCaseMapping(378, 377)
        self._addCaseMapping(380, 379)
        self._addCaseMapping(382, 381)
        self._addCaseMapping(387, 386)
        self._addCaseMapping(389, 388)
        self._addCaseMapping(392, 391)
        self._addCaseMapping(396, 395)
        self._addCaseMapping(402, 401)
        self._addCaseMapping(409, 408)
        self._addCaseMapping(417, 416)
        self._addCaseMapping(419, 418)
        self._addCaseMapping(421, 420)
        self._addCaseMapping(424, 423)
        self._addCaseMapping(429, 428)
        self._addCaseMapping(432, 431)
        self._addCaseMapping(436, 435)
        self._addCaseMapping(438, 437)
        self._addCaseMapping(441, 440)
        self._addCaseMapping(445, 444)
        self._addCaseMapping(454, 452)
        self._addCaseMapping(457, 455)
        self._addCaseMapping(460, 458)
        self._addCaseMapping(462, 461)
        self._addCaseMapping(464, 463)
        self._addCaseMapping(466, 465)
        self._addCaseMapping(468, 467)
        self._addCaseMapping(470, 469)
        self._addCaseMapping(472, 471)
        self._addCaseMapping(474, 473)
        self._addCaseMapping(476, 475)
        self._addCaseMapping(479, 478)
        self._addCaseMapping(481, 480)
        self._addCaseMapping(483, 482)
        self._addCaseMapping(485, 484)
        self._addCaseMapping(487, 486)
        self._addCaseMapping(489, 488)
        self._addCaseMapping(491, 490)
        self._addCaseMapping(493, 492)
        self._addCaseMapping(495, 494)
        self._addCaseMapping(499, 497)
        self._addCaseMapping(501, 500)
        self._addCaseMapping(507, 506)
        self._addCaseMapping(509, 508)
        self._addCaseMapping(511, 510)
        self._addCaseMapping(513, 512)
        self._addCaseMapping(515, 514)
        self._addCaseMapping(517, 516)
        self._addCaseMapping(519, 518)
        self._addCaseMapping(521, 520)
        self._addCaseMapping(523, 522)
        self._addCaseMapping(525, 524)
        self._addCaseMapping(527, 526)
        self._addCaseMapping(529, 528)
        self._addCaseMapping(531, 530)
        self._addCaseMapping(533, 532)
        self._addCaseMapping(535, 534)
        self._addCaseMapping(595, 385)
        self._addCaseMapping(596, 390)
        self._addCaseMapping(599, 394)
        self._addCaseMapping(600, 398)
        self._addCaseMapping(601, 399)
        self._addCaseMapping(603, 400)
        self._addCaseMapping(608, 403)
        self._addCaseMapping(611, 404)
        self._addCaseMapping(616, 407)
        self._addCaseMapping(617, 406)
        self._addCaseMapping(623, 412)
        self._addCaseMapping(626, 413)
        self._addCaseMapping(629, 415)
        self._addCaseMapping(643, 425)
        self._addCaseMapping(648, 430)
        self._addCaseMapping(650, 433)
        self._addCaseMapping(651, 434)
        self._addCaseMapping(658, 439)
        self._addCaseMapping(924, 181)
        self._addCaseMapping(940, 902)
        self._addCaseMapping(941, 904)
        self._addCaseMapping(942, 905)
        self._addCaseMapping(943, 906)
        self._addCaseMapping(945, 913)
        self._addCaseMapping(946, 914)
        self._addCaseMapping(947, 915)
        self._addCaseMapping(948, 916)
        self._addCaseMapping(949, 917)
        self._addCaseMapping(950, 918)
        self._addCaseMapping(951, 919)
        self._addCaseMapping(952, 920)
        self._addCaseMapping(953, 921)
        self._addCaseMapping(954, 922)
        self._addCaseMapping(955, 923)
        self._addCaseMapping(956, 924)
        self._addCaseMapping(957, 925)
        self._addCaseMapping(958, 926)
        self._addCaseMapping(959, 927)
        self._addCaseMapping(960, 928)
        self._addCaseMapping(961, 929)
        self._addCaseMapping(963, 931)
        self._addCaseMapping(964, 932)
        self._addCaseMapping(965, 933)
        self._addCaseMapping(966, 934)
        self._addCaseMapping(967, 935)
        self._addCaseMapping(968, 936)
        self._addCaseMapping(969, 937)
        self._addCaseMapping(970, 938)
        self._addCaseMapping(971, 939)
        self._addCaseMapping(972, 908)
        self._addCaseMapping(973, 910)
        self._addCaseMapping(974, 911)
        self._addCaseMapping(995, 994)
        self._addCaseMapping(997, 996)
        self._addCaseMapping(999, 998)
        self._addCaseMapping(1001, 1000)
        self._addCaseMapping(1003, 1002)
        self._addCaseMapping(1005, 1004)
        self._addCaseMapping(1007, 1006)
        self._addCaseMapping(1072, 1040)
        self._addCaseMapping(1073, 1041)
        self._addCaseMapping(1074, 1042)
        self._addCaseMapping(1075, 1043)
        self._addCaseMapping(1076, 1044)
        self._addCaseMapping(1077, 1045)
        self._addCaseMapping(1078, 1046)
        self._addCaseMapping(1079, 1047)
        self._addCaseMapping(1080, 1048)
        self._addCaseMapping(1081, 1049)
        self._addCaseMapping(1082, 1050)
        self._addCaseMapping(1083, 1051)
        self._addCaseMapping(1084, 1052)
        self._addCaseMapping(1085, 1053)
        self._addCaseMapping(1086, 1054)
        self._addCaseMapping(1087, 1055)
        self._addCaseMapping(1088, 1056)
        self._addCaseMapping(1089, 1057)
        self._addCaseMapping(1090, 1058)
        self._addCaseMapping(1091, 1059)
        self._addCaseMapping(1092, 1060)
        self._addCaseMapping(1093, 1061)
        self._addCaseMapping(1094, 1062)
        self._addCaseMapping(1095, 1063)
        self._addCaseMapping(1096, 1064)
        self._addCaseMapping(1097, 1065)
        self._addCaseMapping(1098, 1066)
        self._addCaseMapping(1099, 1067)
        self._addCaseMapping(1100, 1068)
        self._addCaseMapping(1101, 1069)
        self._addCaseMapping(1102, 1070)
        self._addCaseMapping(1103, 1071)
        self._addCaseMapping(1105, 1025)
        self._addCaseMapping(1106, 1026)
        self._addCaseMapping(1107, 1027)
        self._addCaseMapping(1108, 1028)
        self._addCaseMapping(1109, 1029)
        self._addCaseMapping(1110, 1030)
        self._addCaseMapping(1111, 1031)
        self._addCaseMapping(1112, 1032)
        self._addCaseMapping(1113, 1033)
        self._addCaseMapping(1114, 1034)
        self._addCaseMapping(1115, 1035)
        self._addCaseMapping(1116, 1036)
        self._addCaseMapping(1118, 1038)
        self._addCaseMapping(1119, 1039)
        self._addCaseMapping(1121, 1120)
        self._addCaseMapping(1123, 1122)
        self._addCaseMapping(1125, 1124)
        self._addCaseMapping(1127, 1126)
        self._addCaseMapping(1129, 1128)
        self._addCaseMapping(1131, 1130)
        self._addCaseMapping(1133, 1132)
        self._addCaseMapping(1135, 1134)
        self._addCaseMapping(1137, 1136)
        self._addCaseMapping(1139, 1138)
        self._addCaseMapping(1141, 1140)
        self._addCaseMapping(1143, 1142)
        self._addCaseMapping(1145, 1144)
        self._addCaseMapping(1147, 1146)
        self._addCaseMapping(1149, 1148)
        self._addCaseMapping(1151, 1150)
        self._addCaseMapping(1153, 1152)
        self._addCaseMapping(1169, 1168)
        self._addCaseMapping(1171, 1170)
        self._addCaseMapping(1173, 1172)
        self._addCaseMapping(1175, 1174)
        self._addCaseMapping(1177, 1176)
        self._addCaseMapping(1179, 1178)
        self._addCaseMapping(1181, 1180)
        self._addCaseMapping(1183, 1182)
        self._addCaseMapping(1185, 1184)
        self._addCaseMapping(1187, 1186)
        self._addCaseMapping(1189, 1188)
        self._addCaseMapping(1191, 1190)
        self._addCaseMapping(1193, 1192)
        self._addCaseMapping(1195, 1194)
        self._addCaseMapping(1197, 1196)
        self._addCaseMapping(1199, 1198)
        self._addCaseMapping(1201, 1200)
        self._addCaseMapping(1203, 1202)
        self._addCaseMapping(1205, 1204)
        self._addCaseMapping(1207, 1206)
        self._addCaseMapping(1209, 1208)
        self._addCaseMapping(1211, 1210)
        self._addCaseMapping(1213, 1212)
        self._addCaseMapping(1215, 1214)
        self._addCaseMapping(1218, 1217)
        self._addCaseMapping(1220, 1219)
        self._addCaseMapping(1224, 1223)
        self._addCaseMapping(1228, 1227)
        self._addCaseMapping(1233, 1232)
        self._addCaseMapping(1235, 1234)
        self._addCaseMapping(1237, 1236)
        self._addCaseMapping(1239, 1238)
        self._addCaseMapping(1241, 1240)
        self._addCaseMapping(1243, 1242)
        self._addCaseMapping(1245, 1244)
        self._addCaseMapping(1247, 1246)
        self._addCaseMapping(1249, 1248)
        self._addCaseMapping(1251, 1250)
        self._addCaseMapping(1253, 1252)
        self._addCaseMapping(1255, 1254)
        self._addCaseMapping(1257, 1256)
        self._addCaseMapping(1259, 1258)
        self._addCaseMapping(1263, 1262)
        self._addCaseMapping(1265, 1264)
        self._addCaseMapping(1267, 1266)
        self._addCaseMapping(1269, 1268)
        self._addCaseMapping(1273, 1272)
        self._addCaseMapping(1377, 1329)
        self._addCaseMapping(1378, 1330)
        self._addCaseMapping(1379, 1331)
        self._addCaseMapping(1380, 1332)
        self._addCaseMapping(1381, 1333)
        self._addCaseMapping(1382, 1334)
        self._addCaseMapping(1383, 1335)
        self._addCaseMapping(1384, 1336)
        self._addCaseMapping(1385, 1337)
        self._addCaseMapping(1386, 1338)
        self._addCaseMapping(1387, 1339)
        self._addCaseMapping(1388, 1340)
        self._addCaseMapping(1389, 1341)
        self._addCaseMapping(1390, 1342)
        self._addCaseMapping(1391, 1343)
        self._addCaseMapping(1392, 1344)
        self._addCaseMapping(1393, 1345)
        self._addCaseMapping(1394, 1346)
        self._addCaseMapping(1395, 1347)
        self._addCaseMapping(1396, 1348)
        self._addCaseMapping(1397, 1349)
        self._addCaseMapping(1398, 1350)
        self._addCaseMapping(1399, 1351)
        self._addCaseMapping(1400, 1352)
        self._addCaseMapping(1401, 1353)
        self._addCaseMapping(1402, 1354)
        self._addCaseMapping(1403, 1355)
        self._addCaseMapping(1404, 1356)
        self._addCaseMapping(1405, 1357)
        self._addCaseMapping(1406, 1358)
        self._addCaseMapping(1407, 1359)
        self._addCaseMapping(1408, 1360)
        self._addCaseMapping(1409, 1361)
        self._addCaseMapping(1410, 1362)
        self._addCaseMapping(1411, 1363)
        self._addCaseMapping(1412, 1364)
        self._addCaseMapping(1413, 1365)
        self._addCaseMapping(1414, 1366)
        self._addCaseMapping(4304, 4256)
        self._addCaseMapping(4305, 4257)
        self._addCaseMapping(4306, 4258)
        self._addCaseMapping(4307, 4259)
        self._addCaseMapping(4308, 4260)
        self._addCaseMapping(4309, 4261)
        self._addCaseMapping(4310, 4262)
        self._addCaseMapping(4311, 4263)
        self._addCaseMapping(4312, 4264)
        self._addCaseMapping(4313, 4265)
        self._addCaseMapping(4314, 4266)
        self._addCaseMapping(4315, 4267)
        self._addCaseMapping(4316, 4268)
        self._addCaseMapping(4317, 4269)
        self._addCaseMapping(4318, 4270)
        self._addCaseMapping(4319, 4271)
        self._addCaseMapping(4320, 4272)
        self._addCaseMapping(4321, 4273)
        self._addCaseMapping(4322, 4274)
        self._addCaseMapping(4323, 4275)
        self._addCaseMapping(4324, 4276)
        self._addCaseMapping(4325, 4277)
        self._addCaseMapping(4326, 4278)
        self._addCaseMapping(4327, 4279)
        self._addCaseMapping(4328, 4280)
        self._addCaseMapping(4329, 4281)
        self._addCaseMapping(4330, 4282)
        self._addCaseMapping(4331, 4283)
        self._addCaseMapping(4332, 4284)
        self._addCaseMapping(4333, 4285)
        self._addCaseMapping(4334, 4286)
        self._addCaseMapping(4335, 4287)
        self._addCaseMapping(4336, 4288)
        self._addCaseMapping(4337, 4289)
        self._addCaseMapping(4338, 4290)
        self._addCaseMapping(4339, 4291)
        self._addCaseMapping(4340, 4292)
        self._addCaseMapping(4341, 4293)
        self._addCaseMapping(7681, 7680)
        self._addCaseMapping(7683, 7682)
        self._addCaseMapping(7685, 7684)
        self._addCaseMapping(7687, 7686)
        self._addCaseMapping(7689, 7688)
        self._addCaseMapping(7691, 7690)
        self._addCaseMapping(7693, 7692)
        self._addCaseMapping(7695, 7694)
        self._addCaseMapping(7697, 7696)
        self._addCaseMapping(7699, 7698)
        self._addCaseMapping(7701, 7700)
        self._addCaseMapping(7703, 7702)
        self._addCaseMapping(7705, 7704)
        self._addCaseMapping(7707, 7706)
        self._addCaseMapping(7709, 7708)
        self._addCaseMapping(7711, 7710)
        self._addCaseMapping(7713, 7712)
        self._addCaseMapping(7715, 7714)
        self._addCaseMapping(7717, 7716)
        self._addCaseMapping(7719, 7718)
        self._addCaseMapping(7721, 7720)
        self._addCaseMapping(7723, 7722)
        self._addCaseMapping(7725, 7724)
        self._addCaseMapping(7727, 7726)
        self._addCaseMapping(7729, 7728)
        self._addCaseMapping(7731, 7730)
        self._addCaseMapping(7733, 7732)
        self._addCaseMapping(7735, 7734)
        self._addCaseMapping(7737, 7736)
        self._addCaseMapping(7739, 7738)
        self._addCaseMapping(7741, 7740)
        self._addCaseMapping(7743, 7742)
        self._addCaseMapping(7745, 7744)
        self._addCaseMapping(7747, 7746)
        self._addCaseMapping(7749, 7748)
        self._addCaseMapping(7751, 7750)
        self._addCaseMapping(7753, 7752)
        self._addCaseMapping(7755, 7754)
        self._addCaseMapping(7757, 7756)
        self._addCaseMapping(7759, 7758)
        self._addCaseMapping(7761, 7760)
        self._addCaseMapping(7763, 7762)
        self._addCaseMapping(7765, 7764)
        self._addCaseMapping(7767, 7766)
        self._addCaseMapping(7769, 7768)
        self._addCaseMapping(7771, 7770)
        self._addCaseMapping(7773, 7772)
        self._addCaseMapping(7775, 7774)
        self._addCaseMapping(7777, 7776)
        self._addCaseMapping(7779, 7778)
        self._addCaseMapping(7781, 7780)
        self._addCaseMapping(7783, 7782)
        self._addCaseMapping(7785, 7784)
        self._addCaseMapping(7787, 7786)
        self._addCaseMapping(7789, 7788)
        self._addCaseMapping(7791, 7790)
        self._addCaseMapping(7793, 7792)
        self._addCaseMapping(7795, 7794)
        self._addCaseMapping(7797, 7796)
        self._addCaseMapping(7799, 7798)
        self._addCaseMapping(7801, 7800)
        self._addCaseMapping(7803, 7802)
        self._addCaseMapping(7805, 7804)
        self._addCaseMapping(7807, 7806)
        self._addCaseMapping(7809, 7808)
        self._addCaseMapping(7811, 7810)
        self._addCaseMapping(7813, 7812)
        self._addCaseMapping(7815, 7814)
        self._addCaseMapping(7817, 7816)
        self._addCaseMapping(7819, 7818)
        self._addCaseMapping(7821, 7820)
        self._addCaseMapping(7823, 7822)
        self._addCaseMapping(7825, 7824)
        self._addCaseMapping(7827, 7826)
        self._addCaseMapping(7829, 7828)
        self._addCaseMapping(7841, 7840)
        self._addCaseMapping(7843, 7842)
        self._addCaseMapping(7845, 7844)
        self._addCaseMapping(7847, 7846)
        self._addCaseMapping(7849, 7848)
        self._addCaseMapping(7851, 7850)
        self._addCaseMapping(7853, 7852)
        self._addCaseMapping(7855, 7854)
        self._addCaseMapping(7857, 7856)
        self._addCaseMapping(7859, 7858)
        self._addCaseMapping(7861, 7860)
        self._addCaseMapping(7863, 7862)
        self._addCaseMapping(7865, 7864)
        self._addCaseMapping(7867, 7866)
        self._addCaseMapping(7869, 7868)
        self._addCaseMapping(7871, 7870)
        self._addCaseMapping(7873, 7872)
        self._addCaseMapping(7875, 7874)
        self._addCaseMapping(7877, 7876)
        self._addCaseMapping(7879, 7878)
        self._addCaseMapping(7881, 7880)
        self._addCaseMapping(7883, 7882)
        self._addCaseMapping(7885, 7884)
        self._addCaseMapping(7887, 7886)
        self._addCaseMapping(7889, 7888)
        self._addCaseMapping(7891, 7890)
        self._addCaseMapping(7893, 7892)
        self._addCaseMapping(7895, 7894)
        self._addCaseMapping(7897, 7896)
        self._addCaseMapping(7899, 7898)
        self._addCaseMapping(7901, 7900)
        self._addCaseMapping(7903, 7902)
        self._addCaseMapping(7905, 7904)
        self._addCaseMapping(7907, 7906)
        self._addCaseMapping(7909, 7908)
        self._addCaseMapping(7911, 7910)
        self._addCaseMapping(7913, 7912)
        self._addCaseMapping(7915, 7914)
        self._addCaseMapping(7917, 7916)
        self._addCaseMapping(7919, 7918)
        self._addCaseMapping(7921, 7920)
        self._addCaseMapping(7923, 7922)
        self._addCaseMapping(7925, 7924)
        self._addCaseMapping(7927, 7926)
        self._addCaseMapping(7929, 7928)
        self._addCaseMapping(7936, 7944)
        self._addCaseMapping(7937, 7945)
        self._addCaseMapping(7938, 7946)
        self._addCaseMapping(7939, 7947)
        self._addCaseMapping(7940, 7948)
        self._addCaseMapping(7941, 7949)
        self._addCaseMapping(7942, 7950)
        self._addCaseMapping(7943, 7951)
        self._addCaseMapping(7952, 7960)
        self._addCaseMapping(7953, 7961)
        self._addCaseMapping(7954, 7962)
        self._addCaseMapping(7955, 7963)
        self._addCaseMapping(7956, 7964)
        self._addCaseMapping(7957, 7965)
        self._addCaseMapping(7968, 7976)
        self._addCaseMapping(7969, 7977)
        self._addCaseMapping(7970, 7978)
        self._addCaseMapping(7971, 7979)
        self._addCaseMapping(7972, 7980)
        self._addCaseMapping(7973, 7981)
        self._addCaseMapping(7974, 7982)
        self._addCaseMapping(7975, 7983)
        self._addCaseMapping(7984, 7992)
        self._addCaseMapping(7985, 7993)
        self._addCaseMapping(7986, 7994)
        self._addCaseMapping(7987, 7995)
        self._addCaseMapping(7988, 7996)
        self._addCaseMapping(7989, 7997)
        self._addCaseMapping(7990, 7998)
        self._addCaseMapping(7991, 7999)
        self._addCaseMapping(8000, 8008)
        self._addCaseMapping(8001, 8009)
        self._addCaseMapping(8002, 8010)
        self._addCaseMapping(8003, 8011)
        self._addCaseMapping(8004, 8012)
        self._addCaseMapping(8005, 8013)
        self._addCaseMapping(8017, 8025)
        self._addCaseMapping(8019, 8027)
        self._addCaseMapping(8021, 8029)
        self._addCaseMapping(8023, 8031)
        self._addCaseMapping(8032, 8040)
        self._addCaseMapping(8033, 8041)
        self._addCaseMapping(8034, 8042)
        self._addCaseMapping(8035, 8043)
        self._addCaseMapping(8036, 8044)
        self._addCaseMapping(8037, 8045)
        self._addCaseMapping(8038, 8046)
        self._addCaseMapping(8039, 8047)
        self._addCaseMapping(8064, 8072)
        self._addCaseMapping(8065, 8073)
        self._addCaseMapping(8066, 8074)
        self._addCaseMapping(8067, 8075)
        self._addCaseMapping(8068, 8076)
        self._addCaseMapping(8069, 8077)
        self._addCaseMapping(8070, 8078)
        self._addCaseMapping(8071, 8079)
        self._addCaseMapping(8080, 8088)
        self._addCaseMapping(8081, 8089)
        self._addCaseMapping(8082, 8090)
        self._addCaseMapping(8083, 8091)
        self._addCaseMapping(8084, 8092)
        self._addCaseMapping(8085, 8093)
        self._addCaseMapping(8086, 8094)
        self._addCaseMapping(8087, 8095)
        self._addCaseMapping(8096, 8104)
        self._addCaseMapping(8097, 8105)
        self._addCaseMapping(8098, 8106)
        self._addCaseMapping(8099, 8107)
        self._addCaseMapping(8100, 8108)
        self._addCaseMapping(8101, 8109)
        self._addCaseMapping(8102, 8110)
        self._addCaseMapping(8103, 8111)
        self._addCaseMapping(8112, 8120)
        self._addCaseMapping(8113, 8121)
        self._addCaseMapping(8144, 8152)
        self._addCaseMapping(8145, 8153)
        self._addCaseMapping(8160, 8168)
        self._addCaseMapping(8161, 8169)
        self._addCaseMapping(9424, 9398)
        self._addCaseMapping(9425, 9399)
        self._addCaseMapping(9426, 9400)
        self._addCaseMapping(9427, 9401)
        self._addCaseMapping(9428, 9402)
        self._addCaseMapping(9429, 9403)
        self._addCaseMapping(9430, 9404)
        self._addCaseMapping(9431, 9405)
        self._addCaseMapping(9432, 9406)
        self._addCaseMapping(9433, 9407)
        self._addCaseMapping(9434, 9408)
        self._addCaseMapping(9435, 9409)
        self._addCaseMapping(9436, 9410)
        self._addCaseMapping(9437, 9411)
        self._addCaseMapping(9438, 9412)
        self._addCaseMapping(9439, 9413)
        self._addCaseMapping(9440, 9414)
        self._addCaseMapping(9441, 9415)
        self._addCaseMapping(9442, 9416)
        self._addCaseMapping(9443, 9417)
        self._addCaseMapping(9444, 9418)
        self._addCaseMapping(9445, 9419)
        self._addCaseMapping(9446, 9420)
        self._addCaseMapping(9447, 9421)
        self._addCaseMapping(9448, 9422)
        self._addCaseMapping(9449, 9423)
        self._addCaseMapping(65345, 65313)
        self._addCaseMapping(65346, 65314)
        self._addCaseMapping(65347, 65315)
        self._addCaseMapping(65348, 65316)
        self._addCaseMapping(65349, 65317)
        self._addCaseMapping(65350, 65318)
        self._addCaseMapping(65351, 65319)
        self._addCaseMapping(65352, 65320)
        self._addCaseMapping(65353, 65321)
        self._addCaseMapping(65354, 65322)
        self._addCaseMapping(65355, 65323)
        self._addCaseMapping(65356, 65324)
        self._addCaseMapping(65357, 65325)
        self._addCaseMapping(65358, 65326)
        self._addCaseMapping(65359, 65327)
        self._addCaseMapping(65360, 65328)
        self._addCaseMapping(65361, 65329)
        self._addCaseMapping(65362, 65330)
        self._addCaseMapping(65363, 65331)
        self._addCaseMapping(65364, 65332)
        self._addCaseMapping(65365, 65333)
        self._addCaseMapping(65366, 65334)
        self._addCaseMapping(65367, 65335)
        self._addCaseMapping(65368, 65336)
        self._addCaseMapping(65369, 65337)
        self._addCaseMapping(65370, 65338)

    def _addCaseMapping(self, lowerChar, upperChar):
        if not upperChar in self.mapU2L.h:
            self.mapU2L.set(upperChar, lowerChar)
        if not lowerChar in self.mapL2U.h:
            self.mapL2U.set(lowerChar, upperChar)

    def isLowerCase(self, ch):
        return ch in self.mapL2U.h

    def isUpperCase(self, ch):
        return ch in self.mapU2L.h

    def toLowerCase(self, ch):
        lowerChar = self.mapU2L.h.get(ch, None)
        if lowerChar is None:
            return ch
        else:
            return lowerChar

    def toUpperCase(self, ch):
        upperChar = self.mapL2U.h.get(ch, None)
        if upperChar is None:
            return ch
        else:
            return upperChar

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.mapU2L = None
        _hx_o.mapL2U = None


class hx_strings__Char_Char_Impl_:
    _hx_class_name = 'hx.strings._Char.Char_Impl_'
    __slots__ = ()
    _hx_statics = ['CHAR_CASE_MAPPER', 'BACKSPACE', 'TAB', 'LF', 'CR',
        'ESC', 'SPACE', 'EXCLAMATION_MARK', 'DOUBLE_QUOTE', 'HASH',
        'DOLLAR', 'AMPERSAND', 'SINGLE_QUOTE', 'BRACKET_ROUND_LEFT',
        'BRACKET_ROUND_RIGHT', 'ASTERISK', 'PLUS', 'COMMA', 'MINUS', 'DOT',
        'SLASH', 'ZERO', 'ONE', 'TWO', 'TRHEE', 'FOUR', 'FIVE', 'SIX',
        'SEVEN', 'EIGHT', 'NINE', 'COLON', 'SEMICOLON', 'LOWER_THAN',
        'EQUALS', 'GREATER_THAN', 'QUESTION_MARK', 'BRACKET_SQUARE_LEFT',
        'BACKSLASH', 'BRACKET_SQUARE_RIGHT', 'CARET', 'UNDERSCORE',
        'BRACKET_CURLY_LEFT', 'PIPE', 'BRACKET_CURLY_RIGHT', 'fromString',
        'of', 'op_plus_string', 'op_plus_string2', 'op_plus', 'isAscii',
        'isAsciiAlpha', 'isAsciiAlphanumeric', 'isAsciiControl',
        'isAsciiPrintable', 'isDigit', 'isEOF', 'isSpace', 'isUTF8',
        'isWhitespace', 'isLowerCase', 'isUpperCase', 'toLowerCase',
        'toUpperCase', 'toInt', 'toString']

    @staticmethod
    def fromString(_hx_str):
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0 or 0 >= strLen:
            return -1
        else:
            return HxString.charCodeAt(_hx_str, 0)

    @staticmethod
    def of(ch):
        return ch

    @staticmethod
    def op_plus_string(ch, other):
        return HxOverrides.stringOrNull(''.join(map(chr, [ch]))) + ('null' if
            other is None else other)

    @staticmethod
    def op_plus_string2(_hx_str, ch):
        return ('null' if _hx_str is None else _hx_str
            ) + HxOverrides.stringOrNull(''.join(map(chr, [ch])))

    @staticmethod
    def op_plus(ch, other):
        return ch + other

    @staticmethod
    def isAscii(this1):
        if this1 > -1:
            return this1 < 128
        else:
            return False

    @staticmethod
    def isAsciiAlpha(this1):
        if not (this1 > 64 and this1 < 91):
            if this1 > 96:
                return this1 < 123
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiAlphanumeric(this1):
        if not (this1 > 64 and this1 < 91 or this1 > 96 and this1 < 123):
            if this1 > 47:
                return this1 < 58
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiControl(this1):
        if not (this1 > -1 and this1 < 32):
            return this1 == 127
        else:
            return True

    @staticmethod
    def isAsciiPrintable(this1):
        if this1 > 31:
            return this1 < 127
        else:
            return False

    @staticmethod
    def isDigit(this1):
        if this1 > 47:
            return this1 < 58
        else:
            return False

    @staticmethod
    def isEOF(this1):
        return this1 == -1

    @staticmethod
    def isSpace(this1):
        return this1 == 32

    @staticmethod
    def isUTF8(this1):
        if this1 > -1:
            return this1 < 1114112
        else:
            return False

    @staticmethod
    def isWhitespace(this1):
        if not (this1 > 8 and this1 < 14):
            return this1 == 32
        else:
            return True

    @staticmethod
    def isLowerCase(this1):
        return this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h

    @staticmethod
    def isUpperCase(this1):
        return this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h

    @staticmethod
    def toLowerCase(this1):
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(
            this1, None)
        if lowerChar is None:
            return this1
        else:
            return lowerChar

    @staticmethod
    def toUpperCase(this1):
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(
            this1, None)
        if upperChar is None:
            return this1
        else:
            return upperChar

    @staticmethod
    def toInt(this1):
        return this1

    @staticmethod
    def toString(this1):
        return ''.join(map(chr, [this1]))


class hx_strings_CharIterator:
    _hx_class_name = 'hx.strings.CharIterator'
    __slots__ = ('index', 'line', 'col', 'currChar', 'prevBuffer',
        'prevBufferPrevIdx', 'prevBufferNextIdx')
    _hx_fields = ['index', 'line', 'col', 'currChar', 'prevBuffer',
        'prevBufferPrevIdx', 'prevBufferNextIdx']
    _hx_methods = ['get_current', 'get_pos', 'hasPrev', 'prev', 'hasNext',
        'next', 'getChar', 'isEOF']
    _hx_statics = ['fromString', 'fromArray', 'fromInput', 'fromIterator']

    def __init__(self, prevBufferSize):
        self.prevBufferNextIdx = -1
        self.prevBufferPrevIdx = -1
        self.currChar = -1
        self.col = 0
        self.line = 0
        self.index = -1
        tmp = None
        if prevBufferSize > 0:
            this1 = hx_strings_internal__RingBuffer_RingBufferImpl(
                prevBufferSize + 1)
            tmp = this1
        else:
            tmp = None
        self.prevBuffer = tmp

    def get_current(self):
        if self.index > -1:
            return self.currChar
        else:
            return None

    def get_pos(self):
        return hx_strings_CharPos(self.index, self.line, self.col)

    def hasPrev(self):
        return self.prevBufferPrevIdx > -1

    def prev(self):
        if self.prevBufferPrevIdx <= -1:
            raise haxe_Exception.thrown(haxe_io_Eof())
        prevChar = self.prevBuffer.get(self.prevBufferPrevIdx)
        self.currChar = prevChar.char
        self.index = prevChar.index
        self.line = prevChar.line
        self.col = prevChar.col
        self.prevBufferNextIdx = (self.prevBufferPrevIdx + 1 if self.
            prevBufferPrevIdx + 1 < self.prevBuffer.length else -1)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.prevBufferPrevIdx
        _hx_local_0.prevBufferPrevIdx = _hx_local_1 - 1
        _hx_local_1
        return self.currChar

    def hasNext(self):
        if self.prevBufferNextIdx > -1:
            return True
        else:
            return not self.isEOF()

    def next(self):
        if self.prevBufferNextIdx > -1:
            prevChar = self.prevBuffer.get(self.prevBufferNextIdx)
            self.currChar = prevChar.char
            self.index = prevChar.index
            self.line = prevChar.line
            self.col = prevChar.col
            self.prevBufferPrevIdx = self.prevBufferNextIdx - 1
            self.prevBufferNextIdx = (self.prevBufferNextIdx + 1 if self.
                prevBufferNextIdx + 1 < self.prevBuffer.length else -1)
            return self.currChar
        if self.isEOF():
            raise haxe_Exception.thrown(haxe_io_Eof())
        if self.currChar == 10 or self.currChar < 0:
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.line
            _hx_local_0.line = _hx_local_1 + 1
            _hx_local_1
            self.col = 0
        _hx_local_2 = self
        _hx_local_3 = _hx_local_2.index
        _hx_local_2.index = _hx_local_3 + 1
        _hx_local_3
        _hx_local_4 = self
        _hx_local_5 = _hx_local_4.col
        _hx_local_4.col = _hx_local_5 + 1
        _hx_local_5
        self.currChar = self.getChar()
        if self.prevBuffer is not None:
            self.prevBuffer.add(hx_strings__CharIterator_CharWithPos(self.
                currChar, self.index, self.col, self.line))
            self.prevBufferPrevIdx = self.prevBuffer.length - 2
            self.prevBufferNextIdx = -1
        return self.currChar

    def getChar(self):
        raise haxe_Exception.thrown('Not implemented')

    def isEOF(self):
        raise haxe_Exception.thrown('Not implemented')

    @staticmethod
    def fromString(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_StringCharIterator(chars,
            prevBufferSize)

    @staticmethod
    def fromArray(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_ArrayCharIterator(chars, prevBufferSize
            )

    @staticmethod
    def fromInput(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_InputCharIterator(chars, prevBufferSize
            )

    @staticmethod
    def fromIterator(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_IteratorCharIterator(chars,
            prevBufferSize)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None
        _hx_o.currChar = None
        _hx_o.prevBuffer = None
        _hx_o.prevBufferPrevIdx = None
        _hx_o.prevBufferNextIdx = None


class hx_strings_CharPos:
    _hx_class_name = 'hx.strings.CharPos'
    __slots__ = 'index', 'line', 'col'
    _hx_fields = ['index', 'line', 'col']
    _hx_methods = ['toString']

    def __init__(self, index, line, col):
        self.index = index
        self.line = line
        self.col = col

    def toString(self):
        return 'CharPos[index=' + Std.string(self.index
            ) + ', line=' + Std.string(self.line) + ', col=' + Std.string(self
            .col) + ']'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None


class hx_strings__CharIterator_CharWithPos(hx_strings_CharPos):
    _hx_class_name = 'hx.strings._CharIterator.CharWithPos'
    __slots__ = 'char',
    _hx_fields = ['char']
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharPos

    def __init__(self, char, index, line, col):
        self.char = None
        super().__init__(index, line, col)
        self.char = char

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.char = None


class hx_strings_internal__RingBuffer_RingBufferImpl:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBufferImpl'
    __slots__ = ('buffer', 'bufferStartIdx', 'bufferEndIdx', 'bufferMaxIdx',
        'length', 'size')
    _hx_fields = ['buffer', 'bufferStartIdx', 'bufferEndIdx',
        'bufferMaxIdx', 'length', 'size']
    _hx_methods = ['add', 'get', 'iterator', 'toArray']

    def __init__(self, size):
        self.length = 0
        self.bufferEndIdx = -1
        self.bufferStartIdx = 0
        if size < 1:
            raise haxe_Exception.thrown('[size] must be > 0')
        this1 = [None] * size
        self.buffer = this1
        self.size = size
        self.bufferMaxIdx = size - 1

    def add(self, item):
        if self.length == self.size:
            self.bufferEndIdx = self.bufferStartIdx
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.bufferStartIdx
            _hx_local_0.bufferStartIdx = _hx_local_1 + 1
            _hx_local_1
            if self.bufferStartIdx > self.bufferMaxIdx:
                self.bufferStartIdx = 0
        else:
            _hx_local_2 = self
            _hx_local_3 = _hx_local_2.bufferEndIdx
            _hx_local_2.bufferEndIdx = _hx_local_3 + 1
            _hx_local_3
            _hx_local_4 = self
            _hx_local_5 = _hx_local_4.length
            _hx_local_4.length = _hx_local_5 + 1
            _hx_local_5
        self.buffer[self.bufferEndIdx] = item

    def get(self, index):
        if index < 0 or index > self.bufferMaxIdx:
            raise haxe_Exception.thrown('[index] ' + Std.string(index) +
                ' is out of bound')
        realIdx = self.bufferStartIdx + index
        if realIdx > self.bufferMaxIdx:
            realIdx = realIdx - self.length
        return self.buffer[realIdx]

    def iterator(self):
        return hx_strings_internal__RingBuffer_RingBufferIterator(self)

    def toArray(self):
        arr = list()
        i = self.iterator()
        while i.hasNext():
            i1 = i.next()
            arr.append(i1)
        return arr

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buffer = None
        _hx_o.bufferStartIdx = None
        _hx_o.bufferEndIdx = None
        _hx_o.bufferMaxIdx = None
        _hx_o.length = None
        _hx_o.size = None


class python_Boot:
    _hx_class_name = 'python.Boot'
    __slots__ = ()
    _hx_statics = ['keywords', 'toString1', 'fields', 'simpleField',
        'field', 'getInstanceFields', 'getSuperClass', 'getClassFields',
        'prefixLength', 'unhandleKeywords']

    @staticmethod
    def toString1(o, s):
        if o is None:
            return 'null'
        if isinstance(o, str):
            return o
        if s is None:
            s = ''
        if len(s) >= 5:
            return '<...>'
        if isinstance(o, bool):
            if o:
                return 'true'
            else:
                return 'false'
        if isinstance(o, int) and not isinstance(o, bool):
            return str(o)
        if isinstance(o, float):
            try:
                if o == int(o):
                    return str(Math.floor(o + 0.5))
                else:
                    return str(o)
            except BaseException as _g:
                return str(o)
        if isinstance(o, list):
            o1 = o
            l = len(o1)
            st = '['
            s = ('null' if s is None else s) + '\t'
            _g = 0
            _g1 = l
            while _g < _g1:
                i = _g
                _g = _g + 1
                prefix = ''
                if i > 0:
                    prefix = ','
                st = ('null' if st is None else st) + HxOverrides.stringOrNull(
                    ('null' if prefix is None else prefix) + HxOverrides.
                    stringOrNull(python_Boot.toString1(o1[i] if i >= 0 and 
                    i < len(o1) else None, s)))
            st = ('null' if st is None else st) + ']'
            return st
        try:
            if hasattr(o, 'toString'):
                return o.toString()
        except BaseException as _g:
            pass
        if hasattr(o, '__class__'):
            if isinstance(o, _hx_AnonObject):
                toStr = None
                try:
                    fields = python_Boot.fields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '{ ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' }'
                except BaseException as _g:
                    return '{ ... }'
                if toStr is None:
                    return '{ ... }'
                else:
                    return toStr
            if isinstance(o, Enum):
                o1 = o
                l = len(o1.params)
                hasParams = l > 0
                if hasParams:
                    paramsStr = ''
                    _g = 0
                    _g1 = l
                    while _g < _g1:
                        i = _g
                        _g = _g + 1
                        prefix = ''
                        if i > 0:
                            prefix = ','
                        paramsStr = ('null' if paramsStr is None else paramsStr
                            ) + HxOverrides.stringOrNull(('null' if prefix is
                            None else prefix) + HxOverrides.stringOrNull(
                            python_Boot.toString1(o1.params[i], s)))
                    return HxOverrides.stringOrNull(o1.tag) + '(' + ('null' if
                        paramsStr is None else paramsStr) + ')'
                else:
                    return o1.tag
            if hasattr(o, '_hx_class_name'):
                if o.__class__.__name__ != 'type':
                    fields = python_Boot.getInstanceFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
                else:
                    fields = python_Boot.getClassFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '#' + HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
            if o == str:
                return '#String'
            if o == list:
                return '#Array'
            if callable(o):
                return 'function'
            try:
                if hasattr(o, '__repr__'):
                    return o.__repr__()
            except BaseException as _g:
                pass
            if hasattr(o, '__str__'):
                return o.__str__([])
            if hasattr(o, '__name__'):
                return o.__name__
            return '???'
        else:
            return str(o)

    @staticmethod
    def fields(o):
        a = []
        if o is not None:
            if hasattr(o, '_hx_fields'):
                fields = o._hx_fields
                if fields is not None:
                    return list(fields)
            if isinstance(o, _hx_AnonObject):
                d = o.__dict__
                keys = d.keys()
                handler = python_Boot.unhandleKeywords
                for k in keys:
                    if k != '_hx_disable_getattr':
                        a.append(handler(k))
            elif hasattr(o, '__dict__'):
                d = o.__dict__
                keys1 = d.keys()
                for k in keys1:
                    a.append(k)
        return a

    @staticmethod
    def simpleField(o, field):
        if field is None:
            return None
        field1 = ('_hx_' + field if field in python_Boot.keywords else 
            '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
            ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
            field)
        if hasattr(o, field1):
            return getattr(o, field1)
        else:
            return None

    @staticmethod
    def field(o, field):
        if field is None:
            return None
        if isinstance(o, str):
            field1 = field
            _hx_local_0 = len(field1)
            if _hx_local_0 == 10:
                if field1 == 'charCodeAt':
                    return python_internal_MethodClosure(o, HxString.charCodeAt
                        )
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o, HxString.
                        lastIndexOf)
                elif field1 == 'toLowerCase':
                    return python_internal_MethodClosure(o, HxString.
                        toLowerCase)
                elif field1 == 'toUpperCase':
                    return python_internal_MethodClosure(o, HxString.
                        toUpperCase)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 9:
                if field1 == 'substring':
                    return python_internal_MethodClosure(o, HxString.substring)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 5:
                if field1 == 'split':
                    return python_internal_MethodClosure(o, HxString.split)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o, HxString.indexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 8:
                if field1 == 'toString':
                    return python_internal_MethodClosure(o, HxString.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 6:
                if field1 == 'charAt':
                    return python_internal_MethodClosure(o, HxString.charAt)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'substr':
                    return python_internal_MethodClosure(o, HxString.substr)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        elif isinstance(o, list):
            field1 = field
            _hx_local_1 = len(field1)
            if _hx_local_1 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.lastIndexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 4:
                if field1 == 'copy':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.copy)
                elif field1 == 'join':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.join)
                elif field1 == 'push':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.push)
                elif field1 == 'sort':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.sort)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 5:
                if field1 == 'shift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.shift)
                elif field1 == 'slice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.slice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.indexOf)
                elif field1 == 'reverse':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.reverse)
                elif field1 == 'unshift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.unshift)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 3:
                if field1 == 'map':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.map)
                elif field1 == 'pop':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.pop)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 8:
                if field1 == 'contains':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.contains)
                elif field1 == 'iterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.iterator)
                elif field1 == 'toString':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 16:
                if field1 == 'keyValueIterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.keyValueIterator)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 6:
                if field1 == 'concat':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.concat)
                elif field1 == 'filter':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.filter)
                elif field1 == 'insert':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.insert)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'remove':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.remove)
                elif field1 == 'splice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.splice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        else:
            field1 = ('_hx_' + field if field in python_Boot.keywords else 
                '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
                ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
                field)
            if hasattr(o, field1):
                return getattr(o, field1)
            else:
                return None

    @staticmethod
    def getInstanceFields(c):
        f = list(c._hx_fields) if hasattr(c, '_hx_fields') else []
        if hasattr(c, '_hx_methods'):
            f = f + c._hx_methods
        sc = python_Boot.getSuperClass(c)
        if sc is None:
            return f
        else:
            scArr = python_Boot.getInstanceFields(sc)
            scMap = set(scArr)
            _g = 0
            while _g < len(f):
                f1 = f[_g] if _g >= 0 and _g < len(f) else None
                _g = _g + 1
                if not f1 in scMap:
                    scArr.append(f1)
            return scArr

    @staticmethod
    def getSuperClass(c):
        if c is None:
            return None
        try:
            if hasattr(c, '_hx_super'):
                return c._hx_super
            return None
        except BaseException as _g:
            pass
        return None

    @staticmethod
    def getClassFields(c):
        if hasattr(c, '_hx_statics'):
            x = c._hx_statics
            return list(x)
        else:
            return []

    @staticmethod
    def unhandleKeywords(name):
        if HxString.substr(name, 0, python_Boot.prefixLength) == '_hx_':
            real = HxString.substr(name, python_Boot.prefixLength, None)
            if real in python_Boot.keywords:
                return real
        return name


class HxString:
    _hx_class_name = 'HxString'
    __slots__ = ()
    _hx_statics = ['split', 'charCodeAt', 'charAt', 'lastIndexOf',
        'toUpperCase', 'toLowerCase', 'indexOf', 'indexOfImpl', 'toString',
        'substring', 'substr']

    @staticmethod
    def split(s, d):
        if d == '':
            return list(s)
        else:
            return s.split(d)

    @staticmethod
    def charCodeAt(s, index):
        if ((s is None or len(s) == 0) or index < 0) or index >= len(s):
            return None
        else:
            return ord(s[index])

    @staticmethod
    def charAt(s, index):
        if index < 0 or index >= len(s):
            return ''
        else:
            return s[index]

    @staticmethod
    def lastIndexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.rfind(_hx_str, 0, len(s))
        elif _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        else:
            i = s.rfind(_hx_str, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(_hx_str)
                ) if i == -1 else i + 1
            check = s.find(_hx_str, startLeft, len(s))
            if check > i and check <= startIndex:
                return check
            else:
                return i

    @staticmethod
    def toUpperCase(s):
        return s.upper()

    @staticmethod
    def toLowerCase(s):
        return s.lower()

    @staticmethod
    def indexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.find(_hx_str)
        else:
            return HxString.indexOfImpl(s, _hx_str, startIndex)

    @staticmethod
    def indexOfImpl(s, _hx_str, startIndex):
        if _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        return s.find(_hx_str, startIndex)

    @staticmethod
    def toString(s):
        return s

    @staticmethod
    def substring(s, startIndex, endIndex=None):
        if startIndex < 0:
            startIndex = 0
        if endIndex is None:
            return s[startIndex:]
        else:
            if endIndex < 0:
                endIndex = 0
            if endIndex < startIndex:
                return s[endIndex:startIndex]
            else:
                return s[startIndex:endIndex]

    @staticmethod
    def substr(s, startIndex, _hx_len=None):
        if _hx_len is None:
            return s[startIndex:]
        else:
            if _hx_len == 0:
                return ''
            if startIndex < 0:
                startIndex = len(s) + startIndex
                if startIndex < 0:
                    startIndex = 0
            return s[startIndex:startIndex + _hx_len]


class hx_strings__CharIterator_NullCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.NullCharIterator'
    __slots__ = ()
    _hx_fields = []
    _hx_methods = ['isEOF']
    _hx_statics = ['INSTANCE']
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self):
        super().__init__(0)

    def isEOF(self):
        return True

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class hx_strings__CharIterator_ArrayCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.ArrayCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = len(chars) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return python_internal_ArrayImpl._get(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings__CharIterator_IteratorCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.IteratorCharIterator'
    __slots__ = 'chars',
    _hx_fields = ['chars']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars

    def isEOF(self):
        return not self.chars.hasNext()

    def getChar(self):
        return self.chars.next()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None


class hx_strings__CharIterator_InputCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.InputCharIterator'
    __slots__ = ('byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable')
    _hx_fields = ['byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable']
    _hx_methods = ['isEOF', 'getChar', 'readUtf8Char',
        'readUtf8MultiSequenceByte']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.nextChar = None
        self.input = None
        self.nextCharAvailable = None
        self.currCharIndex = -1
        self.byteIndex = 0
        super().__init__(prevBufferSize)
        self.input = chars

    def isEOF(self):
        if self.nextCharAvailable == None:
            try:
                byte1 = self.input.readByte()
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.byteIndex
                _hx_local_0.byteIndex = _hx_local_1 + 1
                _hx_local_1
                tmp = None
                if byte1 <= 127:
                    tmp = byte1
                else:
                    byte1 = byte1 & -129
                    byte1 = byte1 & -65
                    totalBytes = 2
                    isBit6Set = 1 == byte1 >> 5 & 1
                    isBit5Set = False
                    if isBit6Set:
                        byte1 = byte1 & -33
                        totalBytes = totalBytes + 1
                        isBit5Set = 1 == byte1 >> 4 & 1
                        if isBit5Set:
                            byte1 = byte1 & -17
                            totalBytes = totalBytes + 1
                            if 1 == byte1 >> 3 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 byte expected at position [' +
                                    Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte1) + ']!')
                    result = byte1 << 6 * (totalBytes - 1)
                    byte = self.input.readByte()
                    _hx_local_8 = self
                    _hx_local_9 = _hx_local_8.byteIndex
                    _hx_local_8.byteIndex = _hx_local_9 + 1
                    _hx_local_9
                    if 1 != byte >> 7 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    if 1 == byte >> 6 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    byte2 = byte & -129
                    result = result + (byte2 << 6 * (totalBytes - 2))
                    if isBit6Set:
                        byte = self.input.readByte()
                        _hx_local_11 = self
                        _hx_local_12 = _hx_local_11.byteIndex
                        _hx_local_11.byteIndex = _hx_local_12 + 1
                        _hx_local_12
                        if 1 != byte >> 7 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        if 1 == byte >> 6 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        byte3 = byte & -129
                        result = result + (byte3 << 6 * (totalBytes - 3))
                        if isBit5Set:
                            byte = self.input.readByte()
                            _hx_local_14 = self
                            _hx_local_15 = _hx_local_14.byteIndex
                            _hx_local_14.byteIndex = _hx_local_15 + 1
                            _hx_local_15
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte4 = byte & -129
                            result = result + (byte4 << 6 * (totalBytes - 4))
                    if self.index == 0 and result == 65279:
                        byte1 = self.input.readByte()
                        _hx_local_17 = self
                        _hx_local_18 = _hx_local_17.byteIndex
                        _hx_local_17.byteIndex = _hx_local_18 + 1
                        _hx_local_18
                        if byte1 <= 127:
                            tmp = byte1
                        else:
                            byte1 = byte1 & -129
                            byte1 = byte1 & -65
                            totalBytes = 2
                            isBit6Set = 1 == byte1 >> 5 & 1
                            isBit5Set = False
                            if isBit6Set:
                                byte1 = byte1 & -33
                                totalBytes = totalBytes + 1
                                isBit5Set = 1 == byte1 >> 4 & 1
                                if isBit5Set:
                                    byte1 = byte1 & -17
                                    totalBytes = totalBytes + 1
                                    if 1 == byte1 >> 3 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte1) + ']!')
                            result1 = byte1 << 6 * (totalBytes - 1)
                            byte = self.input.readByte()
                            _hx_local_25 = self
                            _hx_local_26 = _hx_local_25.byteIndex
                            _hx_local_25.byteIndex = _hx_local_26 + 1
                            _hx_local_26
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte2 = byte & -129
                            result1 = result1 + (byte2 << 6 * (totalBytes - 2))
                            if isBit6Set:
                                byte = self.input.readByte()
                                _hx_local_28 = self
                                _hx_local_29 = _hx_local_28.byteIndex
                                _hx_local_28.byteIndex = _hx_local_29 + 1
                                _hx_local_29
                                if 1 != byte >> 7 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                if 1 == byte >> 6 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                byte3 = byte & -129
                                result1 = result1 + (byte3 << 6 * (
                                    totalBytes - 3))
                                if isBit5Set:
                                    byte = self.input.readByte()
                                    _hx_local_31 = self
                                    _hx_local_32 = _hx_local_31.byteIndex
                                    _hx_local_31.byteIndex = _hx_local_32 + 1
                                    _hx_local_32
                                    if 1 != byte >> 7 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    if 1 == byte >> 6 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    byte4 = byte & -129
                                    result1 = result1 + (byte4 << 6 * (
                                        totalBytes - 4))
                            tmp = (self.readUtf8Char() if self.index == 0 and
                                result1 == 65279 else result1)
                    else:
                        tmp = result
                self.nextChar = tmp
                self.nextCharAvailable = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(), haxe_io_Eof
                    ):
                    self.nextCharAvailable = False
                else:
                    raise _g
        return self.nextCharAvailable != True

    def getChar(self):
        if self.index != self.currCharIndex:
            self.currCharIndex = self.index
            self.nextCharAvailable = None
            return self.nextChar
        return self.currChar

    def readUtf8Char(self):
        byte1 = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if byte1 <= 127:
            return byte1
        byte1 = byte1 & -129
        byte1 = byte1 & -65
        totalBytes = 2
        isBit6Set = 1 == byte1 >> 5 & 1
        isBit5Set = False
        if isBit6Set:
            byte1 = byte1 & -33
            totalBytes = totalBytes + 1
            isBit5Set = 1 == byte1 >> 4 & 1
            if isBit5Set:
                byte1 = byte1 & -17
                totalBytes = totalBytes + 1
                if 1 == byte1 >> 3 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 byte expected at position [' + Std.
                        string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte1) +
                        ']!')
        result = byte1 << 6 * (totalBytes - 1)
        byte = self.input.readByte()
        _hx_local_8 = self
        _hx_local_9 = _hx_local_8.byteIndex
        _hx_local_8.byteIndex = _hx_local_9 + 1
        _hx_local_9
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        byte2 = byte & -129
        result = result + (byte2 << 6 * (totalBytes - 2))
        if isBit6Set:
            byte = self.input.readByte()
            _hx_local_11 = self
            _hx_local_12 = _hx_local_11.byteIndex
            _hx_local_11.byteIndex = _hx_local_12 + 1
            _hx_local_12
            if 1 != byte >> 7 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            if 1 == byte >> 6 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            byte3 = byte & -129
            result = result + (byte3 << 6 * (totalBytes - 3))
            if isBit5Set:
                byte = self.input.readByte()
                _hx_local_14 = self
                _hx_local_15 = _hx_local_14.byteIndex
                _hx_local_14.byteIndex = _hx_local_15 + 1
                _hx_local_15
                if 1 != byte >> 7 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                if 1 == byte >> 6 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                byte4 = byte & -129
                result = result + (byte4 << 6 * (totalBytes - 4))
        if self.index == 0 and result == 65279:
            return self.readUtf8Char()
        return result

    def readUtf8MultiSequenceByte(self):
        byte = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        return byte & -129

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.byteIndex = None
        _hx_o.input = None
        _hx_o.currCharIndex = None
        _hx_o.nextChar = None
        _hx_o.nextCharAvailable = None


class hx_strings__CharIterator_StringCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.StringCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = (0 if chars is None else len(chars)) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return HxString.charCodeAt(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings_Pattern:
    _hx_class_name = 'hx.strings.Pattern'
    __slots__ = 'pattern', 'options', 'ereg'
    _hx_fields = ['pattern', 'options', 'ereg']
    _hx_methods = ['matcher', 'replace', 'remove', 'split']
    _hx_statics = ['__meta__', 'compile']

    def __init__(self, pattern, options):
        self.pattern = pattern
        self.options = options
        self.ereg = EReg(pattern, options)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.options
        _hx_local_0.options = ('null' if _hx_local_1 is None else _hx_local_1
            ) + 'u'
        _hx_local_0.options

    def matcher(self, _hx_str):
        return hx_strings__Pattern_MatcherImpl(self.ereg, self.pattern,
            self.options, _hx_str)

    def replace(self, _hx_str, replaceWith):
        return self.ereg.replace(_hx_str, replaceWith)

    def remove(self, _hx_str):
        return self.ereg.replace(_hx_str, '')

    def split(self, _hx_str):
        return self.ereg.split(_hx_str)

    @staticmethod
    def compile(pattern, options=None):
        if options is None:
            return hx_strings_Pattern(pattern, '')
        _g = options
        tmp = None
        tmp1 = _g.index
        if tmp1 == 0:
            _hx_str = _g.params[0]
            str1 = hx_strings_Strings.toLowerCase8(_hx_str)
            if str1 is None or len(str1) == 0:
                tmp = str1
            else:

                def _hx_local_0(ch):
                    return ''.join(map(chr, [ch]))

                def _hx_local_1(ch):
                    _this = None
                    strLen = len('i')
                    if ch != (-1 if strLen == 0 or 0 >= strLen else
                        HxString.charCodeAt('i', 0)):
                        strLen = len('m')
                        _this = ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('m', 0))
                    else:
                        _this = True
                    if not _this:
                        strLen = len('g')
                        return ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('g', 0))
                    else:
                        return True
                _this = list(map(_hx_local_0, list(filter(_hx_local_1,
                    hx_strings_Strings.toChars(str1)))))
                tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        elif tmp1 == 1:
            opt = _g.params[0]
            tmp = Std.string(opt)
        elif tmp1 == 2:
            arr = _g.params[0]

            def _hx_local_2(m):
                return m is not None
            _this = list(filter(_hx_local_2, arr))
            tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        else:
            pass
        return hx_strings_Pattern(pattern, tmp)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.options = None
        _hx_o.ereg = None


class hx_strings_Matcher:
    _hx_class_name = 'hx.strings.Matcher'
    __slots__ = ()
    _hx_methods = ['iterate', 'map', 'matched', 'matchedPos', 'matches',
        'matchesInRegion', 'reset', 'substringAfterMatch',
        'substringBeforeMatch']
    _hx_statics = ['__meta__']


class hx_strings__Pattern_MatcherImpl:
    _hx_class_name = 'hx.strings._Pattern.MatcherImpl'
    __slots__ = 'ereg', 'isMatch', 'str'
    _hx_fields = ['ereg', 'isMatch', 'str']
    _hx_methods = ['reset', 'iterate', 'map', 'matched', 'matches',
        'matchesInRegion', 'matchedPos', 'substringAfterMatch',
        'substringBeforeMatch', '_cloneEReg']
    _hx_interfaces = [hx_strings_Matcher]

    def __init__(self, ereg, pattern, options, _hx_str):
        self.str = None
        self.isMatch = None
        self.ereg = None
        self.ereg = self._cloneEReg(ereg, pattern, options)
        self.str = _hx_str
        self.isMatch = None

    def reset(self, _hx_str):
        self.str = _hx_str
        self.isMatch = None
        return self

    def iterate(self, onMatch):
        startAt = 0
        while self.ereg.matchSub(self.str, startAt):
            self.isMatch = True
            _this = self.ereg
            matchedPos_pos = _this.matchObj.start()
            matchedPos_len = _this.matchObj.end() - _this.matchObj.start()
            onMatch(self)
            startAt = matchedPos_pos + matchedPos_len
        self.isMatch = False

    def map(self, mapper):
        _gthis = self

        def _hx_local_1():

            def _hx_local_0(ereg):
                _gthis.isMatch = True
                return mapper(_gthis)
            return self.ereg.map(self.str, _hx_local_0)
        return _hx_local_1()

    def matched(self, n=None):
        if n is None:
            n = 0
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        result = self.ereg.matchObj.group(n)
        return result

    def matches(self):
        _this = self.ereg
        _this.matchObj = python_lib_Re.search(_this.pattern, self.str)

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = _this.matchObj is not None
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchesInRegion(self, pos, _hx_len=None):
        if _hx_len is None:
            _hx_len = -1

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = self.ereg.matchSub(self.str, pos, _hx_len)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchedPos(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        _this = self.ereg
        return _hx_AnonObject({'pos': _this.matchObj.start(), 'len': _this.
            matchObj.end() - _this.matchObj.start()})

    def substringAfterMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, _this.matchObj.end(),
            None)

    def substringBeforeMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, 0, _this.matchObj.start()
            )

    def _cloneEReg(self, _hx_from, pattern, options):
        clone = Type.createEmptyInstance(EReg)
        value = Reflect.field(_hx_from, 'pattern')
        setattr(clone, '_hx_' + 'pattern' if 'pattern' in python_Boot.
            keywords else '_hx_' + 'pattern' if ((len('pattern') > 2 and 
            ord('pattern'[0]) == 95) and ord('pattern'[1]) == 95) and ord(
            'pattern'[len('pattern') - 1]) != 95 else 'pattern', value)
        value = Reflect.field(_hx_from, 'global')
        setattr(clone, '_hx_' + 'global' if 'global' in python_Boot.
            keywords else '_hx_' + 'global' if ((len('global') > 2 and ord(
            'global'[0]) == 95) and ord('global'[1]) == 95) and ord(
            'global'[len('global') - 1]) != 95 else 'global', value)
        return clone

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.ereg = None
        _hx_o.isMatch = None
        _hx_o.str = None


class hx_strings_StringBuilder:
    _hx_class_name = 'hx.strings.StringBuilder'
    __slots__ = 'sb', 'pre', 'len', 'length'
    _hx_fields = ['sb', 'pre', 'len']
    _hx_methods = ['get_length', 'add', 'addChar', 'addAll', 'clear',
        'isEmpty', 'newLine', 'insert', 'insertChar', 'insertAll',
        'asOutput', 'toString']

    def __init__(self, initialContent=None):
        self.length = None
        self.len = 0
        self.pre = None
        self.sb = StringBuf()
        if initialContent is not None:
            self.add(initialContent)

    def get_length(self):
        return self.len

    def add(self, item):
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
        _hx_local_0.len
        return self

    def addChar(self, ch):
        _this = self.sb
        s = ''.join(map(chr, [ch]))
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def addAll(self, items):
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_1 = self
            _hx_local_2 = _hx_local_1.len
            _hx_local_1.len = _hx_local_2 + (0 if item is None else len(item))
            _hx_local_1.len
        return self

    def clear(self):
        self.pre = None
        self.sb = StringBuf()
        self.len = 0
        return self

    def isEmpty(self):
        return self.len == 0

    def newLine(self):
        self.sb.b.write('\n')
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def insert(self, pos, item):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.add(item)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            self.pre.insert(0, item)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
            _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    self.pre.insert(i + 1, item)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + (0 if item is None else
                        len(item))
                    _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, item)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + (0 if item is None else
                        len(item))
                    _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_6 = self
        _hx_local_7 = _hx_local_6.len
        _hx_local_6.len = _hx_local_7 + (0 if item is None else len(item))
        _hx_local_6.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertChar(self, pos, ch):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addChar(ch)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            _this = self.pre
            x = ''.join(map(chr, [ch]))
            _this.insert(0, x)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + 1
            _hx_local_1
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    _this = self.pre
                    x = ''.join(map(chr, [ch]))
                    _this.insert(i + 1, x)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + 1
                    _hx_local_3
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    _this1 = self.pre
                    x1 = ''.join(map(chr, [ch]))
                    _this1.insert(i + 1, x1)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + 1
                    _hx_local_5
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.addChar(ch)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        self.addChar(ch)
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertAll(self, pos, items):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addAll(items)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            i = len(items)
            while True:
                tmp = i
                i = i - 1
                if not tmp > 0:
                    break
                item = items[i] if i >= 0 and i < len(items) else None
                self.pre.insert(0, item)
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.len
                _hx_local_0.len = _hx_local_1 + (0 if item is None else len
                    (item))
                _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    j = len(items)
                    while True:
                        tmp = j
                        j = j - 1
                        if not tmp > 0:
                            break
                        item = items[j] if j >= 0 and j < len(items) else None
                        self.pre.insert(i + 1, item)
                        _hx_local_2 = self
                        _hx_local_3 = _hx_local_2.len
                        _hx_local_2.len = _hx_local_3 + (0 if item is None else
                            len(item))
                        _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    j1 = len(items)
                    while True:
                        tmp1 = j1
                        j1 = j1 - 1
                        if not tmp1 > 0:
                            break
                        item1 = items[j1] if j1 >= 0 and j1 < len(items
                            ) else None
                        self.pre.insert(i + 1, item1)
                        _hx_local_4 = self
                        _hx_local_5 = _hx_local_4.len
                        _hx_local_4.len = _hx_local_5 + (0 if item1 is None
                             else len(item1))
                        _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            _g = 0
            while _g < len(items):
                item = items[_g] if _g >= 0 and _g < len(items) else None
                _g = _g + 1
                self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_8 = self
            _hx_local_9 = _hx_local_8.len
            _hx_local_8.len = _hx_local_9 + (0 if item is None else len(item))
            _hx_local_8.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def asOutput(self):
        return hx_strings__StringBuilder_OutputWrapper(self)

    def toString(self):
        if self.pre is None:
            return self.sb.b.getvalue()
        _this = self.pre
        _hx_str = HxOverrides.stringOrNull(''.join([python_Boot.toString1(
            x1, '') for x1 in _this])) + HxOverrides.stringOrNull(self.sb.b
            .getvalue())
        self.clear()
        self.add(_hx_str)
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.pre = None
        _hx_o.len = None


class hx_strings__StringBuilder_OutputWrapper(haxe_io_Output):
    _hx_class_name = 'hx.strings._StringBuilder.OutputWrapper'
    __slots__ = 'sb', 'bo'
    _hx_fields = ['sb', 'bo']
    _hx_methods = ['flush', 'writeByte', 'writeString']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output

    def __init__(self, sb):
        self.bo = None
        self.sb = sb

    def flush(self):
        if self.bo is not None and len(self.bo.b.b) > 0:
            self.sb.add(self.bo.getBytes().toString())

    def writeByte(self, c):
        if self.bo is None:
            self.bo = haxe_io_BytesOutput()
        self.bo.writeByte(c)

    def writeString(self, _hx_str, encoding=None):
        self.flush()
        self.sb.add(_hx_str)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.bo = None


class hx_strings_internal_OS:
    _hx_class_name = 'hx.strings.internal.OS'
    __slots__ = ()
    _hx_statics = ['isWindows']


class hx_strings_internal__Either3__Either3(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either3._Either3'
    _hx_constructs = ['a', 'b', 'c']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either3__Either3('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either3__Either3('b', 1, (v,))

    @staticmethod
    def c(v):
        return hx_strings_internal__Either3__Either3('c', 2, (v,))


class hx_strings_Strings:
    _hx_class_name = 'hx.strings.Strings'
    __slots__ = ()
    _hx_statics = ['REGEX_ANSI_ESC', 'REGEX_HTML_UNESCAPE',
        'REGEX_SPLIT_LINES', 'REGEX_REMOVE_XML_TAGS', 'POS_NOT_FOUND',
        'NEW_LINE_NIX', 'NEW_LINE_WIN', 'NEW_LINE', '_getNotFoundDefault',
        '_charCodeAt8Unsafe', '_splitAsciiWordsUnsafe', 'ansiToHtml',
        'appendIfMissing', 'base64Encode', 'base64Decode', 'charAt8',
        'charCodeAt8', 'compact', 'contains', 'containsOnly', 'containsAll',
        'containsAllIgnoreCase', 'containsAny', 'containsAnyIgnoreCase',
        'containsNone', 'containsNoneIgnoreCase', 'containsWhitespaces',
        'countMatches', 'countMatchesIgnoreCase', 'compare',
        'compareIgnoreCase', 'diff', 'diffAt', 'ellipsizeLeft',
        'ellipsizeMiddle', 'ellipsizeRight', 'endsWith', 'endsWithAny',
        'endsWithAnyIgnoreCase', 'endsWithIgnoreCase', 'equals',
        'equalsIgnoreCase', 'filter', 'filterChars', 'getFuzzyDistance',
        'getLevenshteinDistance', 'getLongestCommonSubstring', 'hashCode',
        'htmlDecode', 'htmlEncode', 'insertAt', 'ifBlank', 'ifEmpty',
        'ifNull', 'indentLines', 'indexOf8', 'isBlank', 'isDigits',
        'isEmpty', 'isNotBlank', 'isNotEmpty', 'isLowerCase', 'isUpperCase',
        'iterate', 'iterateChars', 'lastIndexOf8', 'length8', 'left',
        'lpad', 'map', 'prependIfMissing', 'quoteDouble', 'quoteSingle',
        'removeAfter', 'removeAfterLast', 'removeAfterIgnoreCase',
        'removeAfterLastIgnoreCase', 'removeAt', 'removeBefore',
        'removeBeforeLast', 'removeBeforeIgnoreCase',
        'removeBeforeLastIgnoreCase', 'removeAll', 'removeFirst',
        'removeFirstIgnoreCase', 'removeAnsi', 'removeLeading',
        'removeTags', 'removeTrailing', 'repeat', 'replaceAll',
        'replaceFirst', 'replaceFirstIgnoreCase', 'reverse', 'right',
        'rpad', 'split8', 'splitAt', 'splitEvery', 'splitLines',
        'startsWith', 'startsWithAny', 'startsWithAnyIgnoreCase',
        'startsWithIgnoreCase', 'substr8', 'substring8', 'substringAfter',
        'substringAfterIgnoreCase', 'substringBetween',
        'substringBetweenIgnoreCase', 'substringAfterLast',
        'substringAfterLastIgnoreCase', 'substringBefore',
        'substringBeforeIgnoreCase', 'substringBeforeLast',
        'substringBeforeLastIgnoreCase', 'toBool', 'toBytes', 'toChar',
        'toCharIterator', 'toChars', 'toPattern', 'toEReg', 'toFloat',
        'toHex', 'toInt', 'toLowerCase8', 'toLowerCaseFirstChar',
        'toLowerCamel', 'toLowerHyphen', 'toLowerUnderscore', 'toTitle',
        'toUpperCamel', 'toUpperUnderscore', 'toString', 'toUpperCase8',
        'toUpperCaseFirstChar', 'trim', 'trimRight', 'trimLeft',
        'trimLines', 'trimToNull', 'trimToEmpty', 'truncate', 'urlDecode',
        'urlEncode', 'wrap']

    @staticmethod
    def _getNotFoundDefault(_hx_str, notFoundDefault):
        notFoundDefault1 = notFoundDefault
        if notFoundDefault1 == 1:
            return None
        elif notFoundDefault1 == 2:
            return ''
        elif notFoundDefault1 == 3:
            return _hx_str
        else:
            pass

    @staticmethod
    def _charCodeAt8Unsafe(_hx_str, pos):
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def _splitAsciiWordsUnsafe(_hx_str):
        words = list()
        currentWord = hx_strings_StringBuilder()
        chars = hx_strings_Strings.toChars(_hx_str)
        _hx_len = len(chars)
        lastIndex = _hx_len - 1
        _g = 0
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = chars[i] if i >= 0 and i < len(chars) else None
            if ch > 64 and ch < 91 or ch > 96 and ch < 123:
                chNext = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                currentWord.addChar(ch)
                if chNext > 47 and chNext < 58:
                    x = currentWord.toString()
                    words.append(x)
                    currentWord.clear()
                elif ch in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    if (chNext in hx_strings__Char_Char_Impl_.
                        CHAR_CASE_MAPPER.mapU2L.h and len(chars) > i + 2):
                        if (not python_internal_ArrayImpl._get(chars, i + 2
                            ) in hx_strings__Char_Char_Impl_.
                            CHAR_CASE_MAPPER.mapU2L.h):
                            x1 = currentWord.toString()
                            words.append(x1)
                            currentWord.clear()
                elif chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    x2 = currentWord.toString()
                    words.append(x2)
                    currentWord.clear()
            elif ch > 47 and ch < 58:
                currentWord.addChar(ch)
                chNext1 = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                if not (chNext1 > 47 and chNext1 < 58):
                    x3 = currentWord.toString()
                    words.append(x3)
                    currentWord.clear()
            elif currentWord.len > 0:
                x4 = currentWord.toString()
                words.append(x4)
                currentWord.clear()
        if currentWord.len > 0:
            x = currentWord.toString()
            words.append(x)
        return words

    @staticmethod
    def ansiToHtml(_hx_str, renderMethod=None, initialState=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if renderMethod is None:
            renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
        styleOrClassAttribute = None
        styleOrClassAttribute1 = renderMethod.index
        if styleOrClassAttribute1 == 0:
            styleOrClassAttribute = 'style'
        elif styleOrClassAttribute1 == 1:
            styleOrClassAttribute = 'class'
        elif styleOrClassAttribute1 == 2:
            cb = renderMethod.params[0]
            styleOrClassAttribute = 'class'
        else:
            pass
        sb = hx_strings_StringBuilder()
        if initialState is not None and ((((initialState.fgcolor is not
            None or initialState.bgcolor is not None) or initialState.bold) or
            initialState.underline) or initialState.blink):
            sb.add('<span ' + ('null' if styleOrClassAttribute is None else
                styleOrClassAttribute) + '="').add(initialState.toCSS(
                renderMethod)).add('">')
        effectiveState = hx_strings_AnsiState(initialState)
        strLenMinus1 = (0 if _hx_str is None else len(_hx_str)) - 1
        i = -1
        lookAhead = hx_strings_StringBuilder()
        while i < strLenMinus1:
            i = i + 1
            ch = HxString.charCodeAt(_hx_str, i)
            if (ch == 27 and i < strLenMinus1) and HxString.charCodeAt(_hx_str,
                i + 1) == 91:
                lookAhead.clear()
                currentState = hx_strings_AnsiState(effectiveState)
                currentGraphicModeParam = 0
                isValidEscapeSequence = False
                i = i + 1
                while i < strLenMinus1:
                    i = i + 1
                    ch2 = HxString.charCodeAt(_hx_str, i)
                    lookAhead.addChar(ch2)
                    ch21 = ch2
                    if ch21 == 48:
                        currentGraphicModeParam = currentGraphicModeParam * 10
                    elif ch21 == 49:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 1)
                    elif ch21 == 50:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 2)
                    elif ch21 == 51:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 3)
                    elif ch21 == 52:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 4)
                    elif ch21 == 53:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 5)
                    elif ch21 == 54:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 6)
                    elif ch21 == 55:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 7)
                    elif ch21 == 56:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 8)
                    elif ch21 == 57:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 9)
                    elif ch21 == 59:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        currentGraphicModeParam = 0
                    elif ch21 == 109:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        if (((effectiveState.fgcolor is not None or 
                            effectiveState.bgcolor is not None) or
                            effectiveState.bold) or effectiveState.underline
                            ) or effectiveState.blink:
                            sb.add('</span>')
                        if (((currentState.fgcolor is not None or 
                            currentState.bgcolor is not None) or
                            currentState.bold) or currentState.underline
                            ) or currentState.blink:
                            sb.add('<span ' + ('null' if 
                                styleOrClassAttribute is None else
                                styleOrClassAttribute) + '="').add(currentState
                                .toCSS(renderMethod)).add('">')
                        effectiveState = currentState
                        isValidEscapeSequence = True
                        break
                    else:
                        break
                if not isValidEscapeSequence:
                    sb.addChar(27).add('[').add(Std.string(lookAhead))
            else:
                sb.addChar(ch)
        if (((effectiveState.fgcolor is not None or effectiveState.bgcolor
             is not None) or effectiveState.bold) or effectiveState.underline
            ) or effectiveState.blink:
            sb.add('</span>')
        return sb.toString()

    @staticmethod
    def appendIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if _hx_str is None else _hx_str) + ('null' if 
                suffix is None else suffix)
        if hx_strings_Strings.endsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if _hx_str is None else _hx_str) + ('null' if suffix is
            None else suffix)

    @staticmethod
    def base64Encode(plain):
        if plain is None:
            return None
        return haxe_crypto_Base64.encode(None if plain is None else
            haxe_io_Bytes.ofString(plain))

    @staticmethod
    def base64Decode(encoded):
        if encoded is None:
            return None
        return haxe_crypto_Base64.decode(encoded).toString()

    @staticmethod
    def charAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = ''
        if ((_hx_str is None or len(_hx_str) == 0) or pos < 0) or pos >= (0 if
            _hx_str is None else len(_hx_str)):
            return resultIfOutOfBound
        if pos < 0 or pos >= len(_hx_str):
            return ''
        else:
            return _hx_str[pos]

    @staticmethod
    def charCodeAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        if (strLen == 0 or pos < 0) or pos >= strLen:
            return resultIfOutOfBound
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def compact(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        needWhiteSpace = False
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            char = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if char > 8 and char < 14 or char == 32:
                if sb.len != 0:
                    needWhiteSpace = True
                continue
            elif needWhiteSpace:
                sb.addChar(32)
                needWhiteSpace = False
            sb.addChar(char)
        return sb.toString()

    @staticmethod
    def contains(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor == '':
            return True
        startIndex = None
        return (searchIn.find(searchFor) if startIndex is None else
            HxString.indexOfImpl(searchIn, searchFor, startIndex)) > -1

    @staticmethod
    def containsOnly(searchIn, allowedChars):
        if searchIn is None or len(searchIn) == 0:
            return True
        if allowedChars is None:
            return False
        allowedCharsArray = None
        _g = allowedChars
        allowedCharsArray1 = _g.index
        if allowedCharsArray1 == 0:
            _hx_str = _g.params[0]
            allowedCharsArray = hx_strings_Strings.toChars(_hx_str)
        elif allowedCharsArray1 == 1:
            chars = _g.params[0]
            allowedCharsArray = chars
        else:
            pass
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if python_internal_ArrayImpl.indexOf(allowedCharsArray, ch, None
                ) < 0:
                return False
        return True

    @staticmethod
    def containsAll(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAllIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsNone(searchIn, searchFor):
        return not hx_strings_Strings.containsAny(searchIn, searchFor)

    @staticmethod
    def containsNoneIgnoreCase(searchIn, searchFor):
        return not hx_strings_Strings.containsAnyIgnoreCase(searchIn, searchFor
            )

    @staticmethod
    def containsWhitespaces(searchIn):
        if searchIn is None:
            return False
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                return True
        return False

    @staticmethod
    def countMatches(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def countMatchesIgnoreCase(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        searchIn = searchIn.lower()
        searchFor = searchFor.lower()
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def compare(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def compareIgnoreCase(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        _hx_str = hx_strings_Strings.toLowerCase8(_hx_str)
        other = hx_strings_Strings.toLowerCase8(other)
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def diff(left, right):
        diff = hx_strings_StringDiff()
        diff.at = hx_strings_Strings.diffAt(left, right)
        diff.left = hx_strings_Strings.substr8(left, diff.at)
        diff.right = hx_strings_Strings.substr8(right, diff.at)
        return diff

    @staticmethod
    def diffAt(_hx_str, other):
        if _hx_str == other:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        otherLen = 0 if other is None else len(other)
        if strLen == 0 or otherLen == 0:
            return 0
        checkLen = otherLen if strLen > otherLen else strLen
        _g = 0
        _g1 = checkLen
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxString.charCodeAt(_hx_str, i) != HxString.charCodeAt(other, i
                ):
                return i
        return checkLen

    @staticmethod
    def ellipsizeLeft(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        return ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str, 
            maxLength - ellipsisLen))

    @staticmethod
    def ellipsizeMiddle(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        maxStrLen = maxLength - ellipsisLen
        leftLen = Math.floor(maxStrLen / 2 + 0.5)
        rightLen = maxStrLen - leftLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= leftLen else hx_strings_Strings.substring8(
            _hx_str, 0, leftLen)) + ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,
            rightLen))

    @staticmethod
    def ellipsizeRight(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        _hx_len = maxLength - ellipsisLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= _hx_len else hx_strings_Strings.substring8(
            _hx_str, 0, _hx_len)) + ('null' if ellipsis is None else ellipsis)

    @staticmethod
    def endsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return searchIn.endswith(searchFor)

    @staticmethod
    def endsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                candidate):
                return True
        return False

    @staticmethod
    def endsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def endsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return hx_strings_Strings.endsWith(searchIn.lower(), searchFor.lower())

    @staticmethod
    def equals(_hx_str, other):
        return _hx_str == other

    @staticmethod
    def equalsIgnoreCase(_hx_str, other):
        return hx_strings_Strings.toLowerCase8(_hx_str
            ) == hx_strings_Strings.toLowerCase8(other)

    @staticmethod
    def filter(_hx_str, _hx_filter, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = list(filter(_hx_filter, hx_strings_Strings.split8(_hx_str,
            [separator])))
        return separator.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def filterChars(_hx_str, _hx_filter):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(ch):
            return ''.join(map(chr, [ch]))
        _this = list(map(_hx_local_0, list(filter(_hx_filter,
            hx_strings_Strings.toChars(_hx_str)))))
        return ''.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def getFuzzyDistance(left, right):
        if (left is None or len(left) == 0) or (right is None or len(right) ==
            0):
            return 0
        left = hx_strings_Strings.toLowerCase8(left)
        right = hx_strings_Strings.toLowerCase8(right)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftLastMatchAt = -100
        rightLastMatchAt = -100
        score = 0
        _g = 0
        _g1 = len(leftChars)
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            leftChar = leftChars[leftIdx] if leftIdx >= 0 and leftIdx < len(
                leftChars) else None
            _g2 = rightLastMatchAt + 1 if rightLastMatchAt > -1 else 0
            _g3 = len(rightChars)
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                rightChar = rightChars[rightIdx
                    ] if rightIdx >= 0 and rightIdx < len(rightChars) else None
                if leftChar == rightChar:
                    score = score + 1
                    if (leftLastMatchAt == leftIdx - 1 and rightLastMatchAt ==
                        rightIdx - 1):
                        score = score + 2
                    leftLastMatchAt = leftIdx
                    rightLastMatchAt = rightIdx
                    break
        return score

    @staticmethod
    def getLevenshteinDistance(left, right):
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0:
            return rightLen
        if rightLen == 0:
            return leftLen
        if leftLen > rightLen:
            tmp = left
            left = right
            right = tmp
            tmpLen = leftLen
            leftLen = rightLen
            rightLen = tmpLen
        prevCosts = list()
        costs = list()
        _g = 0
        _g1 = leftLen + 1
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            prevCosts.append(leftIdx)
            costs.append(0)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)

        def _hx_local_0(a, b):
            if a > b:
                return b
            else:
                return a
        _hx_min = _hx_local_0
        _g = 1
        _g1 = rightLen + 1
        while _g < _g1:
            rightIdx = _g
            _g = _g + 1
            rightChar = python_internal_ArrayImpl._get(rightChars, rightIdx - 1
                )
            python_internal_ArrayImpl._set(costs, 0, rightIdx)
            _g2 = 1
            _g3 = leftLen + 1
            while _g2 < _g3:
                leftIdx = _g2
                _g2 = _g2 + 1
                leftIdxMinus1 = leftIdx - 1
                cost = 0 if (leftChars[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(leftChars) else None
                    ) == rightChar else 1
                python_internal_ArrayImpl._set(costs, leftIdx, _hx_min(
                    _hx_min((costs[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(costs) else None) + 1, (prevCosts[
                    leftIdx] if leftIdx >= 0 and leftIdx < len(prevCosts) else
                    None) + 1), (prevCosts[leftIdxMinus1] if leftIdxMinus1 >=
                    0 and leftIdxMinus1 < len(prevCosts) else None) + cost))
            tmp = prevCosts
            prevCosts = costs
            costs = tmp
        return prevCosts[leftLen] if leftLen >= 0 and leftLen < len(prevCosts
            ) else None

    @staticmethod
    def getLongestCommonSubstring(left, right):
        if left is None or right is None:
            return None
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0 or rightLen == 0:
            return ''
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftSubStartAt = 0
        leftSubLen = 0
        _g = 0
        _g1 = leftLen
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            _g2 = 0
            _g3 = rightLen
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                currLen = 0
                while python_internal_ArrayImpl._get(leftChars, leftIdx +
                    currLen) == python_internal_ArrayImpl._get(rightChars, 
                    rightIdx + currLen):
                    currLen = currLen + 1
                    if (leftIdx + currLen >= leftLen or rightIdx + currLen >=
                        rightLen):
                        break
                if currLen > leftSubLen:
                    leftSubLen = currLen
                    leftSubStartAt = leftIdx
        return hx_strings_Strings.substr8(left, leftSubStartAt, leftSubLen)

    @staticmethod
    def hashCode(_hx_str, algo=None):
        if _hx_str is None or len(_hx_str) == 0:
            return 0
        if algo is None:
            algo = hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC
        if algo is None:
            return hash(_hx_str)
        else:
            tmp = algo.index
            if tmp == 1:
                return haxe_crypto_Adler32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 2:
                return haxe_crypto_Crc32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 3:
                hc = 5381
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 + hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 ^ ch) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 4:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = ((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 - hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 + ch + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 5:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 6) + 2 ** 31) % 2 ** 32 - 2 ** 31 + (((
                        hc << 16) + 2 ** 31) % 2 ** 32 - 2 ** 31) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31 - hc + 2 ** 31) % 2 ** 32 - 2 **
                        31 + ch + 2 ** 31) % 2 ** 32 - 2 ** 31
                return hc
            else:
                return hash(_hx_str)

    @staticmethod
    def htmlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = hx_strings_Strings.REGEX_HTML_UNESCAPE

        def _hx_local_2():

            def _hx_local_1(m):
                match = m.matched()
                match1 = match
                _hx_local_0 = len(match1)
                if _hx_local_0 == 5:
                    if match1 == '&amp;':
                        return '&'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 4:
                    if match1 == '&gt;':
                        return '>'
                    elif match1 == '&lt;':
                        return '<'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 6:
                    if match1 == '&apos;':
                        return "'"
                    elif match1 == '&nbsp;':
                        return ' '
                    elif match1 == '&quot;':
                        return '"'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                else:
                    this1 = Std.parseInt(hx_strings_Strings.substr8(match, 
                        2, (0 if match is None else len(match)) - 3))
                    return ''.join(map(chr, [this1]))
            return hx_strings__Pattern_MatcherImpl(_this.ereg, _this.
                pattern, _this.options, _hx_str).map(_hx_local_1)
        return _hx_local_2()

    @staticmethod
    def htmlEncode(_hx_str, escapeQuotes=None):
        if escapeQuotes is None:
            escapeQuotes = False
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        isFirstSpace = True
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = HxString.charCodeAt(_hx_str, i)
            ch1 = ch
            if ch1 == 32:
                if isFirstSpace:
                    sb.add(' ')
                    isFirstSpace = False
                else:
                    sb.add('&nbsp;')
            elif ch1 == 34:
                sb.add('&quot;' if escapeQuotes else '"')
            elif ch1 == 38:
                sb.add('&amp;')
            elif ch1 == 39:
                sb.add('&#039;' if escapeQuotes else "'")
            elif ch1 == 60:
                sb.add('&lt;')
            elif ch1 == 62:
                sb.add('&gt;')
            elif ch > 127:
                sb.add('&#').add(Std.string(ch)).add(';')
            else:
                sb.addChar(ch)
            if ch != 32:
                isFirstSpace = True
        return sb.toString()

    @staticmethod
    def insertAt(_hx_str, pos, insertion):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0 or pos > strLen:
            raise haxe_Exception.thrown(
                'Absolute value of [pos] must be <= str.length')
        if insertion is None or len(insertion) == 0:
            return _hx_str
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + Std.string(insertion
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, pos))

    @staticmethod
    def ifBlank(_hx_str, fallback):
        if True if _hx_str is None else len(StringTools.trim(_hx_str)) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifEmpty(_hx_str, fallback):
        if _hx_str is None or len(_hx_str) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifNull(_hx_str, fallback):
        if _hx_str is None:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def indentLines(_hx_str, indentWith):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0 or (indentWith is None or len(indentWith) == 0):
            return _hx_str
        isFirstLine = True
        sb = hx_strings_StringBuilder()
        _g = 0
        _g1 = hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)
        while _g < len(_g1):
            line = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if isFirstLine:
                isFirstLine = False
            else:
                sb.newLine()
            sb.add(indentWith)
            sb.add(line)
        return sb.toString()

    @staticmethod
    def indexOf8(_hx_str, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt < 0:
            startAt = 0
        if searchForLen == 0:
            if startAt == 0:
                return 0
            if startAt > 0 and startAt < strLen:
                return startAt
            return strLen
        if startAt >= strLen:
            return -1
        if startAt is None:
            return _hx_str.find(searchFor)
        else:
            return HxString.indexOfImpl(_hx_str, searchFor, startAt)

    @staticmethod
    def isBlank(_hx_str):
        if _hx_str is None:
            return True
        else:
            return len(StringTools.trim(_hx_str)) == 0

    @staticmethod
    def isDigits(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            this1 = HxString.charCodeAt(_hx_str, i)
            if not (this1 > 47 and this1 < 58):
                return False
        return True

    @staticmethod
    def isEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) == 0
        else:
            return True

    @staticmethod
    def isNotBlank(_hx_str):
        if _hx_str is not None:
            return len(StringTools.trim(_hx_str)) > 0
        else:
            return False

    @staticmethod
    def isNotEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) > 0
        else:
            return False

    @staticmethod
    def isLowerCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toLowerCase8(_hx_str)

    @staticmethod
    def isUpperCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toUpperCase8(_hx_str)

    @staticmethod
    def iterate(_hx_str, callback, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = hx_strings_Strings.split8(_hx_str, [separator])
        while _g < len(_g1):
            sub = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            callback(sub)

    @staticmethod
    def iterateChars(_hx_str, callback):
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            callback(HxString.charCodeAt(_hx_str, i))

    @staticmethod
    def lastIndexOf8(_hx_str, searchFor, startAt=None):
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt is None:
            startAt = strLen
        if searchForLen == 0:
            if startAt < 0:
                return 0
            if startAt > strLen:
                return strLen
            return startAt
        if startAt < 0:
            return -1
        elif startAt >= strLen:
            startAt = strLen - 1
        strNeedsUTF8Workaround = len(_hx_str) != strLen
        searchForNeedsUTF8Workaround = len(searchFor) != searchForLen
        if searchForNeedsUTF8Workaround and not strNeedsUTF8Workaround:
            return -1
        searchForChars = hx_strings_Strings.toChars(searchFor)
        startAt = startAt + (searchForLen - 1)
        searchForPosToCheck = searchForLen - 1
        strPos = strLen
        while True:
            tmp = strPos
            strPos = strPos - 1
            if not tmp > 0:
                break
            if strPos > startAt:
                continue
            strCh = HxString.charCodeAt(_hx_str, strPos)
            if strCh == (searchForChars[searchForPosToCheck] if 
                searchForPosToCheck >= 0 and searchForPosToCheck < len(
                searchForChars) else None):
                if searchForPosToCheck == 0:
                    return strPos
                searchForPosToCheck = searchForPosToCheck - 1
            else:
                searchForPosToCheck = searchForLen - 1
        return -1

    @staticmethod
    def length8(_hx_str):
        if _hx_str is None:
            return 0
        return len(_hx_str)

    @staticmethod
    def left(_hx_str, _hx_len):
        if (0 if _hx_str is None else len(_hx_str)) <= _hx_len:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, 0, _hx_len)

    @staticmethod
    def lpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        sb = [_hx_str]
        padLen = 0 if padStr is None else len(padStr)
        while strLen < targetLength:
            sb.insert(0, padStr)
            strLen = strLen + padLen
        if canOverflow:
            return ''.join([python_Boot.toString1(x1, '') for x1 in sb])
        return hx_strings_Strings.right(''.join([python_Boot.toString1(x1,
            '') for x1 in sb]), targetLength)

    @staticmethod
    def map(_hx_str, mapper, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if separator is None:
            raise haxe_Exception.thrown('[separator] must not be null')
        return list(map(mapper, hx_strings_Strings.split8(_hx_str, [
            separator])))

    @staticmethod
    def prependIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if suffix is None else suffix) + ('null' if 
                _hx_str is None else _hx_str)
        if hx_strings_Strings.startsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if suffix is None else suffix) + ('null' if _hx_str is
            None else _hx_str)

    @staticmethod
    def quoteDouble(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return '""'
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find('"') if startIndex is None else HxString.
                indexOfImpl(_hx_str, '"', startIndex)) > -1
        if not tmp:
            return '"' + ('null' if _hx_str is None else _hx_str) + '"'
        return '"' + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, '"', '\\"')) + '"'

    @staticmethod
    def quoteSingle(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return "''"
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find("'") if startIndex is None else HxString.
                indexOfImpl(_hx_str, "'", startIndex)) > -1
        if not tmp:
            return "'" + ('null' if _hx_str is None else _hx_str) + "'"
        return "'" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, "'", "\\'")) + "'"

    @staticmethod
    def removeAfter(_hx_str, searchFor):
        return hx_strings_Strings.substringBefore(_hx_str, searchFor)

    @staticmethod
    def removeAfterLast(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLast(_hx_str, searchFor)

    @staticmethod
    def removeAfterIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeAfterLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAt(_hx_str, pos, length):
        if (_hx_str is None or len(_hx_str) == 0) or length < 1:
            return _hx_str
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0:
            raise haxe_Exception.thrown(
                '[pos] must be smaller than -1 * str.length')
        if pos + length >= strLen:
            return hx_strings_Strings.substring8(_hx_str, 0, pos)
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + HxOverrides.stringOrNull(hx_strings_Strings
            .substring8(_hx_str, pos + length))

    @staticmethod
    def removeBefore(_hx_str, searchFor):
        return hx_strings_Strings.substringAfter(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLast(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLast(_hx_str, searchFor)

    @staticmethod
    def removeBeforeIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAll(searchIn, searchFor):
        return hx_strings_Strings.replaceAll(searchIn, searchFor, '')

    @staticmethod
    def removeFirst(searchIn, searchFor):
        return hx_strings_Strings.replaceFirst(searchIn, searchFor, '')

    @staticmethod
    def removeFirstIgnoreCase(searchIn, searchFor):
        return hx_strings_Strings.replaceFirstIgnoreCase(searchIn,
            searchFor, '')

    @staticmethod
    def removeAnsi(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.REGEX_ANSI_ESC.ereg.replace(_hx_str, '')

    @staticmethod
    def removeLeading(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.startsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, len(searchFor), len(
                searchIn))
        return searchIn

    @staticmethod
    def removeTags(xml):
        if xml is None or len(xml) == 0:
            return xml
        return hx_strings_Strings.REGEX_REMOVE_XML_TAGS.ereg.replace(xml, '')

    @staticmethod
    def removeTrailing(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.endsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, 0, len(searchIn) - len(
                searchFor))
        return searchIn

    @staticmethod
    def repeat(_hx_str, count, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if count < 1:
            return ''
        if count == 1:
            return _hx_str
        _g = []
        _g1 = 0
        _g2 = count
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            _g.append(_hx_str)
        return separator.join([python_Boot.toString1(x1, '') for x1 in _g])

    @staticmethod
    def replaceAll(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        return StringTools.replace(searchIn, searchFor, replaceWith)

    @staticmethod
    def replaceFirst(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn, searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def replaceFirstIgnoreCase(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        searchFor = searchFor.lower()
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn.lower(), searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def reverse(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        chars = hx_strings_Strings.split8(_hx_str, [''])
        chars.reverse()
        return ''.join([python_Boot.toString1(x1, '') for x1 in chars])

    @staticmethod
    def right(_hx_str, _hx_len):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, (0 if _hx_str is None
             else len(_hx_str)) - _hx_len)

    @staticmethod
    def rpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        padLen = 0 if padStr is None else len(padStr)
        sb = hx_strings_StringBuilder(_hx_str)
        while strLen < targetLength:
            sb.add(padStr)
            strLen = strLen + padLen
        if canOverflow:
            return sb.toString()
        _hx_str = sb.toString()
        if (0 if _hx_str is None else len(_hx_str)) <= targetLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, targetLength)

    @staticmethod
    def split8(_hx_str, separator, maxParts=None):
        if maxParts is None:
            maxParts = 0
        if _hx_str is None or separator is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []

        def _hx_local_0(s):
            return s is not None
        separators = list(filter(_hx_local_0, separator))
        if len(separators) == 0:
            return None
        if maxParts <= 0 and len(separators) == 1:
            delimiter = separators[0] if 0 < len(separators) else None
            if delimiter == '':
                return list(_hx_str)
            else:
                return _hx_str.split(delimiter)
        if python_internal_ArrayImpl.indexOf(separators, '', None) > -1:
            if maxParts <= 0:
                _g = []
                _g1 = 0
                _g2 = strLen
                while _g1 < _g2:
                    i = _g1
                    _g1 = _g1 + 1
                    x = HxString.substr(_hx_str, i, 1)
                    _g.append(x)
                return _g
            if maxParts > strLen:
                maxParts = strLen
            maxParts = maxParts - 1
            _g = []
            _g1 = 0
            _g2 = maxParts
            while _g1 < _g2:
                i = _g1
                _g1 = _g1 + 1
                x = HxString.substr(_hx_str, i, 1)
                _g.append(x)
            result = _g
            x = HxString.substr(_hx_str, maxParts, strLen - maxParts)
            result.append(x)
            return result
        _g = []
        _g1 = 0
        while _g1 < len(separators):
            sep = separators[_g1] if _g1 >= 0 and _g1 < len(separators
                ) else None
            _g1 = _g1 + 1
            x = 0 if sep is None else len(sep)
            _g.append(x)
        separatorsLengths = _g
        lastFoundAt = 0
        result = []
        resultCount = 0
        while True:
            separatorLen = 0
            foundAt = -1
            _g = 0
            _g1 = len(separators)
            while _g < _g1:
                i = _g
                _g = _g + 1
                sepFoundAt = hx_strings_Strings.indexOf8(_hx_str, 
                    separators[i] if i >= 0 and i < len(separators) else
                    None, lastFoundAt)
                if sepFoundAt != -1:
                    if foundAt == -1 or sepFoundAt < foundAt:
                        foundAt = sepFoundAt
                        separatorLen = separatorsLengths[i
                            ] if i >= 0 and i < len(separatorsLengths
                            ) else None
            resultCount = resultCount + 1
            if foundAt == -1 or resultCount == maxParts:
                x = HxString.substr(_hx_str, lastFoundAt, strLen - lastFoundAt)
                result.append(x)
                break
            x1 = HxString.substr(_hx_str, lastFoundAt, foundAt - lastFoundAt)
            result.append(x1)
            lastFoundAt = foundAt + separatorLen
        return result

    @staticmethod
    def splitAt(_hx_str, splitPos):
        if _hx_str is None:
            return None
        if splitPos is None or len(splitPos) == 0:
            return [_hx_str]
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return [_hx_str]
        pos = list()
        _g = 0
        _g1 = splitPos
        while _g < len(_g1):
            p = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if p < 0:
                p = strLen + p
            if p < 0 or p >= strLen:
                continue
            if python_internal_ArrayImpl.indexOf(pos, p, None) > -1:
                continue
            pos.append(p)

        def _hx_local_1(a, b):
            if a < b:
                return -1
            elif a > b:
                return 1
            else:
                return 0
        pos.sort(key=python_lib_Functools.cmp_to_key(_hx_local_1))
        result = list()
        lastPos = 0
        _g = 0
        while _g < len(pos):
            p = pos[_g] if _g >= 0 and _g < len(pos) else None
            _g = _g + 1
            chunk = hx_strings_Strings.substring8(_hx_str, lastPos, p)
            if chunk is not None and len(chunk) > 0:
                result.append(chunk)
            lastPos = p
        chunk = hx_strings_Strings.substring8(_hx_str, lastPos)
        if chunk is not None and len(chunk) > 0:
            result.append(chunk)
        return result

    @staticmethod
    def splitEvery(_hx_str, count):
        if _hx_str is None:
            return None
        if count < 1:
            raise haxe_Exception.thrown('[count] must be greater than 0')
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0 or count >= strLen:
            return [_hx_str]
        result = list()
        pos = 0
        while True:
            chunk = hx_strings_Strings.substr8(_hx_str, pos, count)
            pos = pos + count
            if chunk is None or len(chunk) == 0:
                break
            result.append(chunk)
        return result

    @staticmethod
    def splitLines(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return []
        else:
            return hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)

    @staticmethod
    def startsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if (searchFor is None or len(searchFor) == 0) or searchIn == searchFor:
            return True
        return searchIn.startswith(searchFor)

    @staticmethod
    def startsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , candidate):
                return True
        return False

    @staticmethod
    def startsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def startsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor is None or len(searchFor) == 0:
            return True
        return hx_strings_Strings.startsWith(searchIn.lower(), searchFor.
            lower())

    @staticmethod
    def substr8(_hx_str, startAt, _hx_len=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if _hx_len is None:
            _hx_len = 0 if _hx_str is None else len(_hx_str)
        if _hx_len <= 0:
            return ''
        if startAt < 0:
            startAt = startAt + (0 if _hx_str is None else len(_hx_str))
            if startAt < 0:
                startAt = 0
        return HxString.substr(_hx_str, startAt, _hx_len)

    @staticmethod
    def substring8(_hx_str, startAt, endAt=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if endAt is None:
            endAt = 0 if _hx_str is None else len(_hx_str)
        return HxString.substring(_hx_str, startAt, endAt)

    @staticmethod
    def substringAfter(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBetween(_hx_str, after, before=None, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAfterAt = _hx_str.find(after
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = _hx_str.find(before
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringBetweenIgnoreCase(_hx_str, after, before=None,
        notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        strLower = hx_strings_Strings.toLowerCase8(_hx_str)
        after = hx_strings_Strings.toLowerCase8(after)
        before = hx_strings_Strings.toLowerCase8(before)
        startIndex = None
        foundAfterAt = strLower.find(after
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = strLower.find(before
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringAfterLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBefore(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None
        ):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def toBool(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = _hx_str.lower()
        _hx_local_0 = len(_g)
        if _hx_local_0 == 1:
            if _g == '0':
                return False
            else:
                return True
        elif _hx_local_0 == 5:
            if _g == 'false':
                return False
            else:
                return True
        elif _hx_local_0 == 2:
            if _g == 'no':
                return False
            else:
                return True
        else:
            return True

    @staticmethod
    def toBytes(_hx_str):
        if _hx_str is None:
            return None
        return haxe_io_Bytes.ofString(_hx_str)

    @staticmethod
    def toChar(charCode):
        return charCode

    @staticmethod
    def toCharIterator(_hx_str):
        if _hx_str is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        else:
            return hx_strings__CharIterator_StringCharIterator(_hx_str, 0)

    @staticmethod
    def toChars(_hx_str):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []
        _g = []
        _g1 = 0
        _g2 = strLen
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            x = HxString.charCodeAt(_hx_str, i)
            _g.append(x)
        return _g

    @staticmethod
    def toPattern(_hx_str, options=None):
        if _hx_str is None:
            return None
        return hx_strings_Pattern.compile(_hx_str, options)

    @staticmethod
    def toEReg(_hx_str, opt=None):
        if opt is None:
            opt = ''
        if _hx_str is None:
            return None
        return EReg(_hx_str, opt)

    @staticmethod
    def toFloat(_hx_str, ifUnparseable=None):
        result = Std.parseFloat(_hx_str)
        if python_lib_Math.isnan(result):
            return ifUnparseable
        return result

    @staticmethod
    def toHex(num, minDigits=None, upperCase=None):
        if minDigits is None:
            minDigits = 0
        if upperCase is None:
            upperCase = True
        hexed = StringTools.hex(num, 0)
        if not upperCase:
            return hexed.lower()
        if len(hexed) >= minDigits:
            return hexed
        return hx_strings_Strings.lpad(hexed, minDigits, '0')

    @staticmethod
    def toInt(_hx_str, ifUnparseable=None):
        result = Std.parseInt(_hx_str)
        if result is None:
            return ifUnparseable
        return result

    @staticmethod
    def toLowerCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.lower()

    @staticmethod
    def toLowerCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(
            this1, None)
        firstChar = this1 if lowerChar is None else lowerChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def toLowerCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return hx_strings_Strings.toLowerCaseFirstChar(sb.toString())

    @staticmethod
    def toLowerHyphen(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '-'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toLowerUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toTitle(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if keepUppercasedWords:

            def _hx_local_0(s):
                if hx_strings_Strings.toUpperCase8(s) == s:
                    return s
                else:
                    return hx_strings_Strings.toUpperCaseFirstChar(
                        hx_strings_Strings.toLowerCase8(s))
            _this = list(map(_hx_local_0, hx_strings_Strings.
                _splitAsciiWordsUnsafe(_hx_str)))
            return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

        def _hx_local_1(s):
            return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings
                .toLowerCase8(s))
        _this = list(map(_hx_local_1, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toUpperCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return sb.toString()

    @staticmethod
    def toUpperUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toUpperCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toString(_hx_str):
        if _hx_str is None:
            return 'null'
        else:
            return _hx_str

    @staticmethod
    def toUpperCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.upper()

    @staticmethod
    def toUpperCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(
            this1, None)
        firstChar = this1 if upperChar is None else upperChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def trim(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.trim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        this1 = hx_strings_internal__Either2__Either2.b(removableChars)
        this2 = hx_strings_internal__Either2__Either2.b(removableChars)
        return hx_strings_Strings.trimLeft(hx_strings_Strings.trimRight(
            _hx_str, this1), this2)

    @staticmethod
    def trimRight(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.rtrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = _hx_len - 1
        while True:
            tmp = None
            if i > -1:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i - 1
        if i < _hx_len - 1:
            return hx_strings_Strings.substring8(_hx_str, 0, i + 1)
        return _hx_str

    @staticmethod
    def trimLeft(_hx_str, charsToRemove=None):
        if _hx_str is None:
            return _hx_str
        if charsToRemove is None:
            return StringTools.ltrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = 0
        while True:
            tmp = None
            if i < _hx_len:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i + 1
        if i > 0:
            return hx_strings_Strings.substring8(_hx_str, i, _hx_len)
        return _hx_str

    @staticmethod
    def trimLines(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(line):
            return hx_strings_Strings.trim(line, charsToRemove)
        _this = list(map(_hx_local_0, hx_strings_Strings.REGEX_SPLIT_LINES.
            ereg.split(_hx_str)))
        return '\n'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def trimToNull(_hx_str):
        if _hx_str is None:
            return None
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return None
        return trimmed

    @staticmethod
    def trimToEmpty(_hx_str):
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return ''
        return trimmed

    @staticmethod
    def truncate(_hx_str, maxLength):
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, maxLength)

    @staticmethod
    def urlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.unquote(_hx_str)

    @staticmethod
    def urlEncode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.quote(_hx_str, '')

    @staticmethod
    def wrap(_hx_str, maxLineLength, splitLongWords=None, newLineSeparator=None
        ):
        if splitLongWords is None:
            splitLongWords = True
        if newLineSeparator is None:
            newLineSeparator = '\n'
        if (0 if _hx_str is None else len(_hx_str)
            ) <= maxLineLength or maxLineLength < 1:
            return _hx_str
        sb = hx_strings_StringBuilder()
        wordChars = []
        currLineLength = 0
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                if len(wordChars) > 0:
                    _g2 = 0
                    while _g2 < len(wordChars):
                        wordCh = wordChars[_g2] if _g2 >= 0 and _g2 < len(
                            wordChars) else None
                        _g2 = _g2 + 1
                        if currLineLength == maxLineLength and splitLongWords:
                            sb.add(newLineSeparator)
                            currLineLength = 0
                        currLineLength = currLineLength + 1
                        sb.addChar(wordCh)
                    wordChars = []
                if currLineLength >= maxLineLength:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                sb.addChar(ch)
                currLineLength = currLineLength + 1
            else:
                wordChars.append(ch)
        if len(wordChars) > 0:
            _g = 0
            while _g < len(wordChars):
                wordCh = wordChars[_g] if _g >= 0 and _g < len(wordChars
                    ) else None
                _g = _g + 1
                if currLineLength == maxLineLength and splitLongWords:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                currLineLength = currLineLength + 1
                sb.addChar(wordCh)
        return sb.toString()


class hx_strings_StringDiff:
    _hx_class_name = 'hx.strings.StringDiff'
    __slots__ = 'at', 'left', 'right'
    _hx_fields = ['at', 'left', 'right']
    _hx_methods = ['toString']

    def __init__(self):
        self.right = None
        self.left = None
        self.at = None

    def toString(self):
        return 'StringDiff[at=' + Std.string(self.at
            ) + ', left=' + HxOverrides.stringOrNull(self.left
            ) + ', right=' + HxOverrides.stringOrNull(self.right) + ']'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.at = None
        _hx_o.left = None
        _hx_o.right = None


class hx_strings_HashCodeAlgorithm(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.HashCodeAlgorithm'
    _hx_constructs = ['PLATFORM_SPECIFIC', 'ADLER32', 'CRC32B', 'DJB2A',
        'JAVA', 'SDBM']


<mask token>


class hx_strings_AnsiToHtmlRenderMethod(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.AnsiToHtmlRenderMethod'
    _hx_constructs = ['StyleAttributes', 'CssClasses', 'CssClassesCallback']

    @staticmethod
    def CssClassesCallback(func):
        return hx_strings_AnsiToHtmlRenderMethod('CssClassesCallback', 2, (
            func,))


<mask token>


class hx_strings_AnsiState:
    _hx_class_name = 'hx.strings.AnsiState'
    __slots__ = 'bgcolor', 'blink', 'bold', 'fgcolor', 'underline'
    _hx_fields = ['bgcolor', 'blink', 'bold', 'fgcolor', 'underline']
    _hx_methods = ['isActive', 'reset', 'copyFrom',
        'setGraphicModeParameter', 'toCSS']
    _hx_statics = ['defaultCssClassesCallback']

    def __init__(self, copyFrom=None):
        self.underline = None
        self.fgcolor = None
        self.bold = None
        self.blink = None
        self.bgcolor = None
        if copyFrom is None:
            self.reset()
        else:
            self.copyFrom(copyFrom)

    def isActive(self):
        if not (((self.fgcolor is not None or self.bgcolor is not None) or
            self.bold) or self.underline):
            return self.blink
        else:
            return True

    def reset(self):
        self.fgcolor = None
        self.bgcolor = None
        self.bold = False
        self.underline = False
        self.blink = False

    def copyFrom(self, other):
        self.fgcolor = other.fgcolor
        self.bgcolor = other.bgcolor
        self.bold = other.bold
        self.underline = other.underline
        self.blink = other.blink

    def setGraphicModeParameter(self, param):
        param1 = param
        if param1 == 0:
            self.reset()
        elif param1 == 1:
            self.bold = True
        elif param1 == 4:
            self.underline = True
        elif param1 == 5:
            self.blink = True
        elif param1 == 30:
            self.fgcolor = 'black'
        elif param1 == 31:
            self.fgcolor = 'red'
        elif param1 == 32:
            self.fgcolor = 'green'
        elif param1 == 33:
            self.fgcolor = 'yellow'
        elif param1 == 34:
            self.fgcolor = 'blue'
        elif param1 == 35:
            self.fgcolor = 'magenta'
        elif param1 == 36:
            self.fgcolor = 'cyan'
        elif param1 == 37:
            self.fgcolor = 'white'
        elif param1 == 40:
            self.bgcolor = 'black'
        elif param1 == 41:
            self.bgcolor = 'red'
        elif param1 == 42:
            self.bgcolor = 'green'
        elif param1 == 43:
            self.bgcolor = 'yellow'
        elif param1 == 44:
            self.bgcolor = 'blue'
        elif param1 == 45:
            self.bgcolor = 'magenta'
        elif param1 == 46:
            self.bgcolor = 'cyan'
        elif param1 == 47:
            self.bgcolor = 'white'
        else:
            pass

    def toCSS(self, renderMethod):
        if (((self.fgcolor is not None or self.bgcolor is not None) or self
            .bold) or self.underline) or self.blink:
            sb = hx_strings_StringBuilder()
            if renderMethod is None:
                renderMethod = (hx_strings_AnsiToHtmlRenderMethod.
                    StyleAttributes)
            tmp = renderMethod.index
            if tmp == 0:
                if self.fgcolor is not None:
                    sb.add('color:').add(self.fgcolor).add(';')
                if self.bgcolor is not None:
                    sb.add('background-color:').add(self.bgcolor).add(';')
                if self.bold:
                    sb.add('font-weight:bold;')
                if self.underline:
                    sb.add('text-decoration:underline;')
                if self.blink:
                    sb.add('text-decoration:blink;')
            elif tmp == 1:
                sb.add(hx_strings_AnsiState.defaultCssClassesCallback(self))
            elif tmp == 2:
                func = renderMethod.params[0]
                sb.add(func(self))
            else:
                pass
            return sb.toString()
        return ''

    @staticmethod
    def defaultCssClassesCallback(state):
        classes = []
        if state.fgcolor is not None:
            x = 'ansi_fg_' + HxOverrides.stringOrNull(state.fgcolor)
            classes.append(x)
        if state.bgcolor is not None:
            x = 'ansi_bg_' + HxOverrides.stringOrNull(state.bgcolor)
            classes.append(x)
        if state.bold:
            classes.append('ansi_bold')
        if state.underline:
            classes.append('ansi_underline')
        if state.blink:
            classes.append('ansi_blink')
        return ' '.join([python_Boot.toString1(x1, '') for x1 in classes])

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bgcolor = None
        _hx_o.blink = None
        _hx_o.bold = None
        _hx_o.fgcolor = None
        _hx_o.underline = None


class hx_strings_internal_Bits:
    _hx_class_name = 'hx.strings.internal.Bits'
    __slots__ = ()
    _hx_statics = ['clearBit', 'setBit', 'toggleBit', 'getBit']

    @staticmethod
    def clearBit(num, bitPos):
        return num & ~(1 << bitPos - 1)

    @staticmethod
    def setBit(num, bitPos):
        return num | 1 << bitPos - 1

    @staticmethod
    def toggleBit(num, bitPos):
        return num ^ 1 << bitPos - 1

    @staticmethod
    def getBit(num, bitPos):
        return 1 == num >> bitPos - 1 & 1


class hx_strings_internal__Either2_Either2_Impl_:
    _hx_class_name = 'hx.strings.internal._Either2.Either2_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either2__Either2.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either2__Either2.b(value)
        return this1


class hx_strings_internal__Either2__Either2(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either2._Either2'
    _hx_constructs = ['a', 'b']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either2__Either2('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either2__Either2('b', 1, (v,))


class hx_strings_internal__Either3_Either3_Impl_:
    _hx_class_name = 'hx.strings.internal._Either3.Either3_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB', 'fromC']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either3__Either3.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either3__Either3.b(value)
        return this1

    @staticmethod
    def fromC(value):
        this1 = hx_strings_internal__Either3__Either3.c(value)
        return this1


class hx_strings_internal__OneOrMany_OneOrMany_Impl_:
    _hx_class_name = 'hx.strings.internal._OneOrMany.OneOrMany_Impl_'
    __slots__ = ()
    _hx_statics = ['fromSingle']

    @staticmethod
    def fromSingle(value):
        return [value]


class hx_strings_internal__RingBuffer_RingBuffer_Impl_:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBuffer_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get']

    @staticmethod
    def _new(size):
        this1 = hx_strings_internal__RingBuffer_RingBufferImpl(size)
        return this1

    @staticmethod
    def get(this1, index):
        return this1.get(index)


class hx_strings_internal__RingBuffer_RingBufferIterator:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBufferIterator'
    __slots__ = 'buff', 'idx'
    _hx_fields = ['buff', 'idx']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, buff):
        self.idx = -1
        self.buff = buff

    def hasNext(self):
        return self.idx + 1 < self.buff.length

    def next(self):
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.idx
        _hx_local_0.idx = _hx_local_1 + 1
        _hx_local_1
        return self.buff.get(self.idx)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buff = None
        _hx_o.idx = None


class python_HaxeIterator:
    _hx_class_name = 'python.HaxeIterator'
    __slots__ = 'it', 'x', 'has', 'checked'
    _hx_fields = ['it', 'x', 'has', 'checked']
    _hx_methods = ['next', 'hasNext']

    def __init__(self, it):
        self.checked = False
        self.has = False
        self.x = None
        self.it = it

    def next(self):
        if not self.checked:
            self.hasNext()
        self.checked = False
        return self.x

    def hasNext(self):
        if not self.checked:
            try:
                self.x = self.it.__next__()
                self.has = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),
                    StopIteration):
                    self.has = False
                    self.x = None
                else:
                    raise _g
            self.checked = True
        return self.has

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.it = None
        _hx_o.x = None
        _hx_o.has = None
        _hx_o.checked = None


class python_internal_ArrayImpl:
    _hx_class_name = 'python.internal.ArrayImpl'
    __slots__ = ()
    _hx_statics = ['concat', 'copy', 'iterator', 'keyValueIterator',
        'indexOf', 'lastIndexOf', 'join', 'toString', 'pop', 'push',
        'unshift', 'remove', 'contains', 'shift', 'slice', 'sort', 'splice',
        'map', 'filter', 'insert', 'reverse', '_get', '_set']

    @staticmethod
    def concat(a1, a2):
        return a1 + a2

    @staticmethod
    def copy(x):
        return list(x)

    @staticmethod
    def iterator(x):
        return python_HaxeIterator(x.__iter__())

    @staticmethod
    def keyValueIterator(x):
        return haxe_iterators_ArrayKeyValueIterator(x)

    @staticmethod
    def indexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (0 if fromIndex is None else _hx_len + fromIndex if fromIndex <
            0 else fromIndex)
        if l < 0:
            l = 0
        _g = l
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxOverrides.eq(a[i], x):
                return i
        return -1

    @staticmethod
    def lastIndexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (_hx_len if fromIndex is None else _hx_len + fromIndex + 1 if 
            fromIndex < 0 else fromIndex + 1)
        if l > _hx_len:
            l = _hx_len
        while True:
            l = l - 1
            tmp = l
            if not tmp > -1:
                break
            if HxOverrides.eq(a[l], x):
                return l
        return -1

    @staticmethod
    def join(x, sep):
        return sep.join([python_Boot.toString1(x1, '') for x1 in x])

    @staticmethod
    def toString(x):
        return '[' + HxOverrides.stringOrNull(','.join([python_Boot.
            toString1(x1, '') for x1 in x])) + ']'

    @staticmethod
    def pop(x):
        if len(x) == 0:
            return None
        else:
            return x.pop()

    @staticmethod
    def push(x, e):
        x.append(e)
        return len(x)

    @staticmethod
    def unshift(x, e):
        x.insert(0, e)

    @staticmethod
    def remove(x, e):
        try:
            x.remove(e)
            return True
        except BaseException as _g:
            return False

    @staticmethod
    def contains(x, e):
        return e in x

    @staticmethod
    def shift(x):
        if len(x) == 0:
            return None
        return x.pop(0)

    @staticmethod
    def slice(x, pos, end=None):
        return x[pos:end]

    @staticmethod
    def sort(x, f):
        x.sort(key=python_lib_Functools.cmp_to_key(f))

    @staticmethod
    def splice(x, pos, _hx_len):
        if pos < 0:
            pos = len(x) + pos
        if pos < 0:
            pos = 0
        res = x[pos:pos + _hx_len]
        del x[pos:pos + _hx_len]
        return res

    @staticmethod
    def map(x, f):
        return list(map(f, x))

    @staticmethod
    def filter(x, f):
        return list(filter(f, x))

    @staticmethod
    def insert(a, pos, x):
        a.insert(pos, x)

    @staticmethod
    def reverse(a):
        a.reverse()

    @staticmethod
    def _get(x, idx):
        if idx > -1 and idx < len(x):
            return x[idx]
        else:
            return None

    @staticmethod
    def _set(x, idx, v):
        l = len(x)
        while l < idx:
            x.append(None)
            l = l + 1
        if l == idx:
            x.append(v)
        else:
            x[idx] = v
        return v


class HxOverrides:
    _hx_class_name = 'HxOverrides'
    __slots__ = ()
    _hx_statics = ['eq', 'stringOrNull', 'rshift', 'modf', 'mod']

    @staticmethod
    def eq(a, b):
        if isinstance(a, list) or isinstance(b, list):
            return a is b
        return a == b

    @staticmethod
    def stringOrNull(s):
        if s is None:
            return 'null'
        else:
            return s

    @staticmethod
    def rshift(val, n):
        return val % 4294967296 >> n

    @staticmethod
    def modf(a, b):
        if b == 0.0:
            return float('nan')
        elif a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b

    @staticmethod
    def mod(a, b):
        if a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b


class python_internal_MethodClosure:
    _hx_class_name = 'python.internal.MethodClosure'
    __slots__ = 'obj', 'func'
    _hx_fields = ['obj', 'func']
    _hx_methods = ['__call__']

    def __init__(self, obj, func):
        self.obj = obj
        self.func = func

    def __call__(self, *args):
        return self.func(self.obj, *args)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.obj = None
        _hx_o.func = None


class sys_io_File:
    _hx_class_name = 'sys.io.File'
    __slots__ = ()
    _hx_statics = ['getContent']

    @staticmethod
    def getContent(path):
        f = python_lib_Builtins.open(path, 'r', -1, 'utf-8', None, '')
        content = f.read(-1)
        f.close()
        return content


<mask token>

<mask token>


class Type:
    _hx_class_name = 'Type'
    __slots__ = ()
    _hx_statics = ['getSuperClass', 'createEmptyInstance']

    @staticmethod
    def getSuperClass(c):
        return python_Boot.getSuperClass(c)

    @staticmethod
    def createEmptyInstance(cl):
        i = cl.__new__(cl)
        callInit = None

        def _hx_local_0(cl):
            sc = Type.getSuperClass(cl)
            if sc is not None:
                callInit(sc)
            if hasattr(cl, '_hx_empty_init'):
                cl._hx_empty_init(i)
        callInit = _hx_local_0
        callInit(cl)
        return i


class haxe_IMap:
    _hx_class_name = 'haxe.IMap'
    __slots__ = ()


class haxe_Exception(Exception):
    _hx_class_name = 'haxe.Exception'
    __slots__ = ('_hx___nativeStack', '_hx___skipStack',
        '_hx___nativeException', '_hx___previousException')
    _hx_fields = ['__nativeStack', '__skipStack', '__nativeException',
        '__previousException']
    _hx_methods = ['unwrap', 'toString', 'get_message', 'get_native']
    _hx_statics = ['caught', 'thrown']
    _hx_interfaces = []
    _hx_super = Exception

    def __init__(self, message, previous=None, native=None):
        self._hx___previousException = None
        self._hx___nativeException = None
        self._hx___nativeStack = None
        self._hx___skipStack = 0
        super().__init__(message)
        self._hx___previousException = previous
        if native is not None and Std.isOfType(native, BaseException):
            self._hx___nativeException = native
            self._hx___nativeStack = haxe_NativeStackTrace.exceptionStack()
        else:
            self._hx___nativeException = self
            infos = python_lib_Traceback.extract_stack()
            if len(infos) != 0:
                infos.pop()
            infos.reverse()
            self._hx___nativeStack = infos

    def unwrap(self):
        return self._hx___nativeException

    def toString(self):
        return self.get_message()

    def get_message(self):
        return str(self)

    def get_native(self):
        return self._hx___nativeException

    @staticmethod
    def caught(value):
        if Std.isOfType(value, haxe_Exception):
            return value
        elif Std.isOfType(value, BaseException):
            return haxe_Exception(str(value), None, value)
        else:
            return haxe_ValueException(value, None, value)

    @staticmethod
    def thrown(value):
        if Std.isOfType(value, haxe_Exception):
            return value.get_native()
        elif Std.isOfType(value, BaseException):
            return value
        else:
            e = haxe_ValueException(value)
            e._hx___skipStack = e._hx___skipStack + 1
            return e

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o._hx___nativeStack = None
        _hx_o._hx___skipStack = None
        _hx_o._hx___nativeException = None
        _hx_o._hx___previousException = None


class haxe_NativeStackTrace:
    _hx_class_name = 'haxe.NativeStackTrace'
    __slots__ = ()
    _hx_statics = ['saveStack', 'exceptionStack']

    @staticmethod
    def saveStack(exception):
        pass

    @staticmethod
    def exceptionStack():
        exc = python_lib_Sys.exc_info()
        if exc[2] is not None:
            infos = python_lib_Traceback.extract_tb(exc[2])
            infos.reverse()
            return infos
        else:
            return []


class haxe_ValueException(haxe_Exception):
    _hx_class_name = 'haxe.ValueException'
    __slots__ = 'value',
    _hx_fields = ['value']
    _hx_methods = ['unwrap']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception

    def __init__(self, value, previous=None, native=None):
        self.value = None
        super().__init__(Std.string(value), previous, native)
        self.value = value

    def unwrap(self):
        return self.value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class haxe_crypto_Adler32:
    _hx_class_name = 'haxe.crypto.Adler32'
    __slots__ = 'a1', 'a2'
    _hx_fields = ['a1', 'a2']
    _hx_methods = ['get', 'update']
    _hx_statics = ['make']

    def __init__(self):
        self.a1 = 1
        self.a2 = 0

    def get(self):
        return self.a2 << 16 | self.a1

    def update(self, b, pos, _hx_len):
        a1 = self.a1
        a2 = self.a2
        _g = pos
        _g1 = pos + _hx_len
        while _g < _g1:
            p = _g
            _g = _g + 1
            c = b.b[p]
            a1 = HxOverrides.mod(a1 + c, 65521)
            a2 = HxOverrides.mod(a2 + a1, 65521)
        self.a1 = a1
        self.a2 = a2

    @staticmethod
    def make(b):
        a = haxe_crypto_Adler32()
        a.update(b, 0, b.length)
        return a.get()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.a1 = None
        _hx_o.a2 = None


class haxe_io_Bytes:
    _hx_class_name = 'haxe.io.Bytes'
    __slots__ = 'length', 'b'
    _hx_fields = ['length', 'b']
    _hx_methods = ['getString', 'toString']
    _hx_statics = ['alloc', 'ofString']

    def __init__(self, length, b):
        self.length = length
        self.b = b

    def getString(self, pos, _hx_len, encoding=None):
        tmp = encoding is None
        if (pos < 0 or _hx_len < 0) or pos + _hx_len > self.length:
            raise haxe_Exception.thrown(haxe_io_Error.OutsideBounds)
        return self.b[pos:pos + _hx_len].decode('UTF-8', 'replace')

    def toString(self):
        return self.getString(0, self.length)

    @staticmethod
    def alloc(length):
        return haxe_io_Bytes(length, bytearray(length))

    @staticmethod
    def ofString(s, encoding=None):
        b = bytearray(s, 'UTF-8')
        return haxe_io_Bytes(len(b), b)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.length = None
        _hx_o.b = None


class haxe_crypto_Base64:
    _hx_class_name = 'haxe.crypto.Base64'
    __slots__ = ()
    _hx_statics = ['CHARS', 'BYTES', 'encode', 'decode']

    @staticmethod
    def encode(_hx_bytes, complement=None):
        if complement is None:
            complement = True
        _hx_str = haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).encodeBytes(
            _hx_bytes).toString()
        if complement:
            _g = HxOverrides.mod(_hx_bytes.length, 3)
            if _g == 1:
                _hx_str = ('null' if _hx_str is None else _hx_str) + '=='
            elif _g == 2:
                _hx_str = ('null' if _hx_str is None else _hx_str) + '='
            else:
                pass
        return _hx_str

    @staticmethod
    def decode(_hx_str, complement=None):
        if complement is None:
            complement = True
        if complement:
            while HxString.charCodeAt(_hx_str, len(_hx_str) - 1) == 61:
                _hx_str = HxString.substr(_hx_str, 0, -1)
        return haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).decodeBytes(
            haxe_io_Bytes.ofString(_hx_str))


class haxe_crypto_BaseCode:
    _hx_class_name = 'haxe.crypto.BaseCode'
    __slots__ = 'base', 'nbits', 'tbl'
    _hx_fields = ['base', 'nbits', 'tbl']
    _hx_methods = ['encodeBytes', 'initTable', 'decodeBytes']

    def __init__(self, base):
        self.tbl = None
        _hx_len = base.length
        nbits = 1
        while _hx_len > 1 << nbits:
            nbits = nbits + 1
        if nbits > 8 or _hx_len != 1 << nbits:
            raise haxe_Exception.thrown(
                'BaseCode : base length must be a power of two.')
        self.base = base
        self.nbits = nbits

    def encodeBytes(self, b):
        nbits = self.nbits
        base = self.base
        x = b.length * 8 / nbits
        size = None
        try:
            size = int(x)
        except BaseException as _g:
            size = None
        out = haxe_io_Bytes.alloc(size + (0 if HxOverrides.mod(b.length * 8,
            nbits) == 0 else 1))
        buf = 0
        curbits = 0
        mask = (1 << nbits) - 1
        pin = 0
        pout = 0
        while pout < size:
            while curbits < nbits:
                curbits = curbits + 8
                buf = buf << 8
                pos = pin
                pin = pin + 1
                buf = buf | b.b[pos]
            curbits = curbits - nbits
            pos1 = pout
            pout = pout + 1
            v = base.b[buf >> curbits & mask]
            out.b[pos1] = v & 255
        if curbits > 0:
            pos = pout
            pout = pout + 1
            v = base.b[buf << nbits - curbits & mask]
            out.b[pos] = v & 255
        return out

    def initTable(self):
        tbl = list()
        _g = 0
        while _g < 256:
            i = _g
            _g = _g + 1
            python_internal_ArrayImpl._set(tbl, i, -1)
        _g = 0
        _g1 = self.base.length
        while _g < _g1:
            i = _g
            _g = _g + 1
            python_internal_ArrayImpl._set(tbl, self.base.b[i], i)
        self.tbl = tbl

    def decodeBytes(self, b):
        nbits = self.nbits
        base = self.base
        if self.tbl is None:
            self.initTable()
        tbl = self.tbl
        size = b.length * nbits >> 3
        out = haxe_io_Bytes.alloc(size)
        buf = 0
        curbits = 0
        pin = 0
        pout = 0
        while pout < size:
            while curbits < 8:
                curbits = curbits + nbits
                buf = buf << nbits
                pos = pin
                pin = pin + 1
                i = python_internal_ArrayImpl._get(tbl, b.b[pos])
                if i == -1:
                    raise haxe_Exception.thrown(
                        'BaseCode : invalid encoded char')
                buf = buf | i
            curbits = curbits - 8
            pos1 = pout
            pout = pout + 1
            out.b[pos1] = buf >> curbits & 255 & 255
        return out

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.base = None
        _hx_o.nbits = None
        _hx_o.tbl = None


class haxe_crypto_Crc32:
    _hx_class_name = 'haxe.crypto.Crc32'
    __slots__ = ()
    _hx_statics = ['make']

    @staticmethod
    def make(data):
        c_crc = -1
        b = data.b
        _g = 0
        _g1 = data.length
        while _g < _g1:
            i = _g
            _g = _g + 1
            tmp = (c_crc ^ b[i]) & 255
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            tmp = HxOverrides.rshift(tmp, 1) ^ -(tmp & 1) & -306674912
            c_crc = HxOverrides.rshift(c_crc, 8) ^ tmp
        return c_crc ^ -1


class haxe_ds_IntMap:
    _hx_class_name = 'haxe.ds.IntMap'
    __slots__ = 'h',
    _hx_fields = ['h']
    _hx_methods = ['set']
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        self.h = dict()

    def set(self, key, value):
        self.h[key] = value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_ds_StringMap:
    _hx_class_name = 'haxe.ds.StringMap'
    __slots__ = 'h',
    _hx_fields = ['h']
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        self.h = dict()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_exceptions_PosException(haxe_Exception):
    _hx_class_name = 'haxe.exceptions.PosException'
    __slots__ = 'posInfos',
    _hx_fields = ['posInfos']
    _hx_methods = ['toString']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception

    def __init__(self, message, previous=None, pos=None):
        self.posInfos = None
        super().__init__(message, previous)
        if pos is None:
            self.posInfos = _hx_AnonObject({'fileName': '(unknown)',
                'lineNumber': 0, 'className': '(unknown)', 'methodName':
                '(unknown)'})
        else:
            self.posInfos = pos

    def toString(self):
        return '' + HxOverrides.stringOrNull(super().toString()
            ) + ' in ' + HxOverrides.stringOrNull(self.posInfos.className
            ) + '.' + HxOverrides.stringOrNull(self.posInfos.methodName
            ) + ' at ' + HxOverrides.stringOrNull(self.posInfos.fileName
            ) + ':' + Std.string(self.posInfos.lineNumber)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.posInfos = None


class haxe_exceptions_NotImplementedException(haxe_exceptions_PosException):
    _hx_class_name = 'haxe.exceptions.NotImplementedException'
    __slots__ = ()
    _hx_fields = []
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_exceptions_PosException

    def __init__(self, message=None, previous=None, pos=None):
        if message is None:
            message = 'Not implemented'
        super().__init__(message, previous, pos)


class haxe_io_BytesBuffer:
    _hx_class_name = 'haxe.io.BytesBuffer'
    __slots__ = 'b',
    _hx_fields = ['b']
    _hx_methods = ['getBytes']

    def __init__(self):
        self.b = bytearray()

    def getBytes(self):
        _hx_bytes = haxe_io_Bytes(len(self.b), self.b)
        self.b = None
        return _hx_bytes

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class haxe_io_Output:
    _hx_class_name = 'haxe.io.Output'
    __slots__ = 'bigEndian',
    _hx_fields = ['bigEndian']
    _hx_methods = ['set_bigEndian']

    def set_bigEndian(self, b):
        self.bigEndian = b
        return b

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bigEndian = None


class haxe_io_BytesOutput(haxe_io_Output):
    _hx_class_name = 'haxe.io.BytesOutput'
    __slots__ = 'b',
    _hx_fields = ['b']
    _hx_methods = ['writeByte', 'getBytes']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output

    def __init__(self):
        self.b = haxe_io_BytesBuffer()
        self.set_bigEndian(False)

    def writeByte(self, c):
        self.b.b.append(c)

    def getBytes(self):
        return self.b.getBytes()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class haxe_io_Encoding(Enum):
    __slots__ = ()
    _hx_class_name = 'haxe.io.Encoding'
    _hx_constructs = ['UTF8', 'RawNative']


<mask token>


class haxe_io_Eof:
    _hx_class_name = 'haxe.io.Eof'
    __slots__ = ()
    _hx_methods = ['toString']

    def __init__(self):
        pass

    def toString(self):
        return 'Eof'

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class haxe_io_Error(Enum):
    __slots__ = ()
    _hx_class_name = 'haxe.io.Error'
    _hx_constructs = ['Blocked', 'Overflow', 'OutsideBounds', 'Custom']

    @staticmethod
    def Custom(e):
        return haxe_io_Error('Custom', 3, (e,))


<mask token>


class haxe_io_Input:
    _hx_class_name = 'haxe.io.Input'
    __slots__ = ()
    _hx_methods = ['readByte']

    def readByte(self):
        raise haxe_exceptions_NotImplementedException(None, None,
            _hx_AnonObject({'fileName': 'haxe/io/Input.hx', 'lineNumber': 
            53, 'className': 'haxe.io.Input', 'methodName': 'readByte'}))

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class haxe_iterators_ArrayIterator:
    _hx_class_name = 'haxe.iterators.ArrayIterator'
    __slots__ = 'array', 'current'
    _hx_fields = ['array', 'current']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, array):
        self.current = 0
        self.array = array

    def hasNext(self):
        return self.current < len(self.array)

    def next(self):

        def _hx_local_3():

            def _hx_local_2():
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = _hx_local_1 + 1
                return _hx_local_1
            return python_internal_ArrayImpl._get(self.array, _hx_local_2())
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.array = None
        _hx_o.current = None


class haxe_iterators_ArrayKeyValueIterator:
    _hx_class_name = 'haxe.iterators.ArrayKeyValueIterator'
    __slots__ = 'current', 'array'
    _hx_fields = ['current', 'array']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, array):
        self.current = 0
        self.array = array

    def hasNext(self):
        return self.current < len(self.array)

    def next(self):

        def _hx_local_3():

            def _hx_local_2():
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = _hx_local_1 + 1
                return _hx_local_1
            return _hx_AnonObject({'value': python_internal_ArrayImpl._get(
                self.array, self.current), 'key': _hx_local_2()})
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.current = None
        _hx_o.array = None


class hx_strings__AnyAsString_AnyAsString_Impl_:
    _hx_class_name = 'hx.strings._AnyAsString.AnyAsString_Impl_'
    __slots__ = ()
    _hx_statics = ['fromBool', 'fromAny']

    @staticmethod
    def fromBool(value):
        if value:
            return 'true'
        else:
            return 'false'

    @staticmethod
    def fromAny(value):
        return Std.string(value)


class hx_strings__Char_CharCaseMapper:
    _hx_class_name = 'hx.strings._Char.CharCaseMapper'
    __slots__ = 'mapU2L', 'mapL2U'
    _hx_fields = ['mapU2L', 'mapL2U']
    _hx_methods = ['_addCaseMapping', 'isLowerCase', 'isUpperCase',
        'toLowerCase', 'toUpperCase']

    def __init__(self):
        self.mapL2U = haxe_ds_IntMap()
        self.mapU2L = haxe_ds_IntMap()
        self._addCaseMapping(97, 65)
        self._addCaseMapping(98, 66)
        self._addCaseMapping(99, 67)
        self._addCaseMapping(100, 68)
        self._addCaseMapping(101, 69)
        self._addCaseMapping(102, 70)
        self._addCaseMapping(103, 71)
        self._addCaseMapping(104, 72)
        self._addCaseMapping(105, 73)
        self._addCaseMapping(106, 74)
        self._addCaseMapping(107, 75)
        self._addCaseMapping(108, 76)
        self._addCaseMapping(109, 77)
        self._addCaseMapping(110, 78)
        self._addCaseMapping(111, 79)
        self._addCaseMapping(112, 80)
        self._addCaseMapping(113, 81)
        self._addCaseMapping(114, 82)
        self._addCaseMapping(115, 83)
        self._addCaseMapping(116, 84)
        self._addCaseMapping(117, 85)
        self._addCaseMapping(118, 86)
        self._addCaseMapping(119, 87)
        self._addCaseMapping(120, 88)
        self._addCaseMapping(121, 89)
        self._addCaseMapping(122, 90)
        self._addCaseMapping(224, 192)
        self._addCaseMapping(225, 193)
        self._addCaseMapping(226, 194)
        self._addCaseMapping(227, 195)
        self._addCaseMapping(228, 196)
        self._addCaseMapping(229, 197)
        self._addCaseMapping(230, 198)
        self._addCaseMapping(231, 199)
        self._addCaseMapping(232, 200)
        self._addCaseMapping(233, 201)
        self._addCaseMapping(234, 202)
        self._addCaseMapping(235, 203)
        self._addCaseMapping(236, 204)
        self._addCaseMapping(237, 205)
        self._addCaseMapping(238, 206)
        self._addCaseMapping(239, 207)
        self._addCaseMapping(240, 208)
        self._addCaseMapping(241, 209)
        self._addCaseMapping(242, 210)
        self._addCaseMapping(243, 211)
        self._addCaseMapping(244, 212)
        self._addCaseMapping(245, 213)
        self._addCaseMapping(246, 214)
        self._addCaseMapping(248, 216)
        self._addCaseMapping(249, 217)
        self._addCaseMapping(250, 218)
        self._addCaseMapping(251, 219)
        self._addCaseMapping(252, 220)
        self._addCaseMapping(253, 221)
        self._addCaseMapping(254, 222)
        self._addCaseMapping(255, 376)
        self._addCaseMapping(257, 256)
        self._addCaseMapping(259, 258)
        self._addCaseMapping(261, 260)
        self._addCaseMapping(263, 262)
        self._addCaseMapping(265, 264)
        self._addCaseMapping(267, 266)
        self._addCaseMapping(269, 268)
        self._addCaseMapping(271, 270)
        self._addCaseMapping(273, 272)
        self._addCaseMapping(275, 274)
        self._addCaseMapping(277, 276)
        self._addCaseMapping(279, 278)
        self._addCaseMapping(281, 280)
        self._addCaseMapping(283, 282)
        self._addCaseMapping(285, 284)
        self._addCaseMapping(287, 286)
        self._addCaseMapping(289, 288)
        self._addCaseMapping(291, 290)
        self._addCaseMapping(293, 292)
        self._addCaseMapping(295, 294)
        self._addCaseMapping(297, 296)
        self._addCaseMapping(299, 298)
        self._addCaseMapping(301, 300)
        self._addCaseMapping(303, 302)
        self._addCaseMapping(305, 73)
        self._addCaseMapping(307, 306)
        self._addCaseMapping(309, 308)
        self._addCaseMapping(311, 310)
        self._addCaseMapping(314, 313)
        self._addCaseMapping(316, 315)
        self._addCaseMapping(318, 317)
        self._addCaseMapping(320, 319)
        self._addCaseMapping(322, 321)
        self._addCaseMapping(324, 323)
        self._addCaseMapping(326, 325)
        self._addCaseMapping(328, 327)
        self._addCaseMapping(331, 330)
        self._addCaseMapping(333, 332)
        self._addCaseMapping(335, 334)
        self._addCaseMapping(337, 336)
        self._addCaseMapping(339, 338)
        self._addCaseMapping(341, 340)
        self._addCaseMapping(343, 342)
        self._addCaseMapping(345, 344)
        self._addCaseMapping(347, 346)
        self._addCaseMapping(349, 348)
        self._addCaseMapping(351, 350)
        self._addCaseMapping(353, 352)
        self._addCaseMapping(355, 354)
        self._addCaseMapping(357, 356)
        self._addCaseMapping(359, 358)
        self._addCaseMapping(361, 360)
        self._addCaseMapping(363, 362)
        self._addCaseMapping(365, 364)
        self._addCaseMapping(367, 366)
        self._addCaseMapping(369, 368)
        self._addCaseMapping(371, 370)
        self._addCaseMapping(373, 372)
        self._addCaseMapping(375, 374)
        self._addCaseMapping(378, 377)
        self._addCaseMapping(380, 379)
        self._addCaseMapping(382, 381)
        self._addCaseMapping(387, 386)
        self._addCaseMapping(389, 388)
        self._addCaseMapping(392, 391)
        self._addCaseMapping(396, 395)
        self._addCaseMapping(402, 401)
        self._addCaseMapping(409, 408)
        self._addCaseMapping(417, 416)
        self._addCaseMapping(419, 418)
        self._addCaseMapping(421, 420)
        self._addCaseMapping(424, 423)
        self._addCaseMapping(429, 428)
        self._addCaseMapping(432, 431)
        self._addCaseMapping(436, 435)
        self._addCaseMapping(438, 437)
        self._addCaseMapping(441, 440)
        self._addCaseMapping(445, 444)
        self._addCaseMapping(454, 452)
        self._addCaseMapping(457, 455)
        self._addCaseMapping(460, 458)
        self._addCaseMapping(462, 461)
        self._addCaseMapping(464, 463)
        self._addCaseMapping(466, 465)
        self._addCaseMapping(468, 467)
        self._addCaseMapping(470, 469)
        self._addCaseMapping(472, 471)
        self._addCaseMapping(474, 473)
        self._addCaseMapping(476, 475)
        self._addCaseMapping(479, 478)
        self._addCaseMapping(481, 480)
        self._addCaseMapping(483, 482)
        self._addCaseMapping(485, 484)
        self._addCaseMapping(487, 486)
        self._addCaseMapping(489, 488)
        self._addCaseMapping(491, 490)
        self._addCaseMapping(493, 492)
        self._addCaseMapping(495, 494)
        self._addCaseMapping(499, 497)
        self._addCaseMapping(501, 500)
        self._addCaseMapping(507, 506)
        self._addCaseMapping(509, 508)
        self._addCaseMapping(511, 510)
        self._addCaseMapping(513, 512)
        self._addCaseMapping(515, 514)
        self._addCaseMapping(517, 516)
        self._addCaseMapping(519, 518)
        self._addCaseMapping(521, 520)
        self._addCaseMapping(523, 522)
        self._addCaseMapping(525, 524)
        self._addCaseMapping(527, 526)
        self._addCaseMapping(529, 528)
        self._addCaseMapping(531, 530)
        self._addCaseMapping(533, 532)
        self._addCaseMapping(535, 534)
        self._addCaseMapping(595, 385)
        self._addCaseMapping(596, 390)
        self._addCaseMapping(599, 394)
        self._addCaseMapping(600, 398)
        self._addCaseMapping(601, 399)
        self._addCaseMapping(603, 400)
        self._addCaseMapping(608, 403)
        self._addCaseMapping(611, 404)
        self._addCaseMapping(616, 407)
        self._addCaseMapping(617, 406)
        self._addCaseMapping(623, 412)
        self._addCaseMapping(626, 413)
        self._addCaseMapping(629, 415)
        self._addCaseMapping(643, 425)
        self._addCaseMapping(648, 430)
        self._addCaseMapping(650, 433)
        self._addCaseMapping(651, 434)
        self._addCaseMapping(658, 439)
        self._addCaseMapping(924, 181)
        self._addCaseMapping(940, 902)
        self._addCaseMapping(941, 904)
        self._addCaseMapping(942, 905)
        self._addCaseMapping(943, 906)
        self._addCaseMapping(945, 913)
        self._addCaseMapping(946, 914)
        self._addCaseMapping(947, 915)
        self._addCaseMapping(948, 916)
        self._addCaseMapping(949, 917)
        self._addCaseMapping(950, 918)
        self._addCaseMapping(951, 919)
        self._addCaseMapping(952, 920)
        self._addCaseMapping(953, 921)
        self._addCaseMapping(954, 922)
        self._addCaseMapping(955, 923)
        self._addCaseMapping(956, 924)
        self._addCaseMapping(957, 925)
        self._addCaseMapping(958, 926)
        self._addCaseMapping(959, 927)
        self._addCaseMapping(960, 928)
        self._addCaseMapping(961, 929)
        self._addCaseMapping(963, 931)
        self._addCaseMapping(964, 932)
        self._addCaseMapping(965, 933)
        self._addCaseMapping(966, 934)
        self._addCaseMapping(967, 935)
        self._addCaseMapping(968, 936)
        self._addCaseMapping(969, 937)
        self._addCaseMapping(970, 938)
        self._addCaseMapping(971, 939)
        self._addCaseMapping(972, 908)
        self._addCaseMapping(973, 910)
        self._addCaseMapping(974, 911)
        self._addCaseMapping(995, 994)
        self._addCaseMapping(997, 996)
        self._addCaseMapping(999, 998)
        self._addCaseMapping(1001, 1000)
        self._addCaseMapping(1003, 1002)
        self._addCaseMapping(1005, 1004)
        self._addCaseMapping(1007, 1006)
        self._addCaseMapping(1072, 1040)
        self._addCaseMapping(1073, 1041)
        self._addCaseMapping(1074, 1042)
        self._addCaseMapping(1075, 1043)
        self._addCaseMapping(1076, 1044)
        self._addCaseMapping(1077, 1045)
        self._addCaseMapping(1078, 1046)
        self._addCaseMapping(1079, 1047)
        self._addCaseMapping(1080, 1048)
        self._addCaseMapping(1081, 1049)
        self._addCaseMapping(1082, 1050)
        self._addCaseMapping(1083, 1051)
        self._addCaseMapping(1084, 1052)
        self._addCaseMapping(1085, 1053)
        self._addCaseMapping(1086, 1054)
        self._addCaseMapping(1087, 1055)
        self._addCaseMapping(1088, 1056)
        self._addCaseMapping(1089, 1057)
        self._addCaseMapping(1090, 1058)
        self._addCaseMapping(1091, 1059)
        self._addCaseMapping(1092, 1060)
        self._addCaseMapping(1093, 1061)
        self._addCaseMapping(1094, 1062)
        self._addCaseMapping(1095, 1063)
        self._addCaseMapping(1096, 1064)
        self._addCaseMapping(1097, 1065)
        self._addCaseMapping(1098, 1066)
        self._addCaseMapping(1099, 1067)
        self._addCaseMapping(1100, 1068)
        self._addCaseMapping(1101, 1069)
        self._addCaseMapping(1102, 1070)
        self._addCaseMapping(1103, 1071)
        self._addCaseMapping(1105, 1025)
        self._addCaseMapping(1106, 1026)
        self._addCaseMapping(1107, 1027)
        self._addCaseMapping(1108, 1028)
        self._addCaseMapping(1109, 1029)
        self._addCaseMapping(1110, 1030)
        self._addCaseMapping(1111, 1031)
        self._addCaseMapping(1112, 1032)
        self._addCaseMapping(1113, 1033)
        self._addCaseMapping(1114, 1034)
        self._addCaseMapping(1115, 1035)
        self._addCaseMapping(1116, 1036)
        self._addCaseMapping(1118, 1038)
        self._addCaseMapping(1119, 1039)
        self._addCaseMapping(1121, 1120)
        self._addCaseMapping(1123, 1122)
        self._addCaseMapping(1125, 1124)
        self._addCaseMapping(1127, 1126)
        self._addCaseMapping(1129, 1128)
        self._addCaseMapping(1131, 1130)
        self._addCaseMapping(1133, 1132)
        self._addCaseMapping(1135, 1134)
        self._addCaseMapping(1137, 1136)
        self._addCaseMapping(1139, 1138)
        self._addCaseMapping(1141, 1140)
        self._addCaseMapping(1143, 1142)
        self._addCaseMapping(1145, 1144)
        self._addCaseMapping(1147, 1146)
        self._addCaseMapping(1149, 1148)
        self._addCaseMapping(1151, 1150)
        self._addCaseMapping(1153, 1152)
        self._addCaseMapping(1169, 1168)
        self._addCaseMapping(1171, 1170)
        self._addCaseMapping(1173, 1172)
        self._addCaseMapping(1175, 1174)
        self._addCaseMapping(1177, 1176)
        self._addCaseMapping(1179, 1178)
        self._addCaseMapping(1181, 1180)
        self._addCaseMapping(1183, 1182)
        self._addCaseMapping(1185, 1184)
        self._addCaseMapping(1187, 1186)
        self._addCaseMapping(1189, 1188)
        self._addCaseMapping(1191, 1190)
        self._addCaseMapping(1193, 1192)
        self._addCaseMapping(1195, 1194)
        self._addCaseMapping(1197, 1196)
        self._addCaseMapping(1199, 1198)
        self._addCaseMapping(1201, 1200)
        self._addCaseMapping(1203, 1202)
        self._addCaseMapping(1205, 1204)
        self._addCaseMapping(1207, 1206)
        self._addCaseMapping(1209, 1208)
        self._addCaseMapping(1211, 1210)
        self._addCaseMapping(1213, 1212)
        self._addCaseMapping(1215, 1214)
        self._addCaseMapping(1218, 1217)
        self._addCaseMapping(1220, 1219)
        self._addCaseMapping(1224, 1223)
        self._addCaseMapping(1228, 1227)
        self._addCaseMapping(1233, 1232)
        self._addCaseMapping(1235, 1234)
        self._addCaseMapping(1237, 1236)
        self._addCaseMapping(1239, 1238)
        self._addCaseMapping(1241, 1240)
        self._addCaseMapping(1243, 1242)
        self._addCaseMapping(1245, 1244)
        self._addCaseMapping(1247, 1246)
        self._addCaseMapping(1249, 1248)
        self._addCaseMapping(1251, 1250)
        self._addCaseMapping(1253, 1252)
        self._addCaseMapping(1255, 1254)
        self._addCaseMapping(1257, 1256)
        self._addCaseMapping(1259, 1258)
        self._addCaseMapping(1263, 1262)
        self._addCaseMapping(1265, 1264)
        self._addCaseMapping(1267, 1266)
        self._addCaseMapping(1269, 1268)
        self._addCaseMapping(1273, 1272)
        self._addCaseMapping(1377, 1329)
        self._addCaseMapping(1378, 1330)
        self._addCaseMapping(1379, 1331)
        self._addCaseMapping(1380, 1332)
        self._addCaseMapping(1381, 1333)
        self._addCaseMapping(1382, 1334)
        self._addCaseMapping(1383, 1335)
        self._addCaseMapping(1384, 1336)
        self._addCaseMapping(1385, 1337)
        self._addCaseMapping(1386, 1338)
        self._addCaseMapping(1387, 1339)
        self._addCaseMapping(1388, 1340)
        self._addCaseMapping(1389, 1341)
        self._addCaseMapping(1390, 1342)
        self._addCaseMapping(1391, 1343)
        self._addCaseMapping(1392, 1344)
        self._addCaseMapping(1393, 1345)
        self._addCaseMapping(1394, 1346)
        self._addCaseMapping(1395, 1347)
        self._addCaseMapping(1396, 1348)
        self._addCaseMapping(1397, 1349)
        self._addCaseMapping(1398, 1350)
        self._addCaseMapping(1399, 1351)
        self._addCaseMapping(1400, 1352)
        self._addCaseMapping(1401, 1353)
        self._addCaseMapping(1402, 1354)
        self._addCaseMapping(1403, 1355)
        self._addCaseMapping(1404, 1356)
        self._addCaseMapping(1405, 1357)
        self._addCaseMapping(1406, 1358)
        self._addCaseMapping(1407, 1359)
        self._addCaseMapping(1408, 1360)
        self._addCaseMapping(1409, 1361)
        self._addCaseMapping(1410, 1362)
        self._addCaseMapping(1411, 1363)
        self._addCaseMapping(1412, 1364)
        self._addCaseMapping(1413, 1365)
        self._addCaseMapping(1414, 1366)
        self._addCaseMapping(4304, 4256)
        self._addCaseMapping(4305, 4257)
        self._addCaseMapping(4306, 4258)
        self._addCaseMapping(4307, 4259)
        self._addCaseMapping(4308, 4260)
        self._addCaseMapping(4309, 4261)
        self._addCaseMapping(4310, 4262)
        self._addCaseMapping(4311, 4263)
        self._addCaseMapping(4312, 4264)
        self._addCaseMapping(4313, 4265)
        self._addCaseMapping(4314, 4266)
        self._addCaseMapping(4315, 4267)
        self._addCaseMapping(4316, 4268)
        self._addCaseMapping(4317, 4269)
        self._addCaseMapping(4318, 4270)
        self._addCaseMapping(4319, 4271)
        self._addCaseMapping(4320, 4272)
        self._addCaseMapping(4321, 4273)
        self._addCaseMapping(4322, 4274)
        self._addCaseMapping(4323, 4275)
        self._addCaseMapping(4324, 4276)
        self._addCaseMapping(4325, 4277)
        self._addCaseMapping(4326, 4278)
        self._addCaseMapping(4327, 4279)
        self._addCaseMapping(4328, 4280)
        self._addCaseMapping(4329, 4281)
        self._addCaseMapping(4330, 4282)
        self._addCaseMapping(4331, 4283)
        self._addCaseMapping(4332, 4284)
        self._addCaseMapping(4333, 4285)
        self._addCaseMapping(4334, 4286)
        self._addCaseMapping(4335, 4287)
        self._addCaseMapping(4336, 4288)
        self._addCaseMapping(4337, 4289)
        self._addCaseMapping(4338, 4290)
        self._addCaseMapping(4339, 4291)
        self._addCaseMapping(4340, 4292)
        self._addCaseMapping(4341, 4293)
        self._addCaseMapping(7681, 7680)
        self._addCaseMapping(7683, 7682)
        self._addCaseMapping(7685, 7684)
        self._addCaseMapping(7687, 7686)
        self._addCaseMapping(7689, 7688)
        self._addCaseMapping(7691, 7690)
        self._addCaseMapping(7693, 7692)
        self._addCaseMapping(7695, 7694)
        self._addCaseMapping(7697, 7696)
        self._addCaseMapping(7699, 7698)
        self._addCaseMapping(7701, 7700)
        self._addCaseMapping(7703, 7702)
        self._addCaseMapping(7705, 7704)
        self._addCaseMapping(7707, 7706)
        self._addCaseMapping(7709, 7708)
        self._addCaseMapping(7711, 7710)
        self._addCaseMapping(7713, 7712)
        self._addCaseMapping(7715, 7714)
        self._addCaseMapping(7717, 7716)
        self._addCaseMapping(7719, 7718)
        self._addCaseMapping(7721, 7720)
        self._addCaseMapping(7723, 7722)
        self._addCaseMapping(7725, 7724)
        self._addCaseMapping(7727, 7726)
        self._addCaseMapping(7729, 7728)
        self._addCaseMapping(7731, 7730)
        self._addCaseMapping(7733, 7732)
        self._addCaseMapping(7735, 7734)
        self._addCaseMapping(7737, 7736)
        self._addCaseMapping(7739, 7738)
        self._addCaseMapping(7741, 7740)
        self._addCaseMapping(7743, 7742)
        self._addCaseMapping(7745, 7744)
        self._addCaseMapping(7747, 7746)
        self._addCaseMapping(7749, 7748)
        self._addCaseMapping(7751, 7750)
        self._addCaseMapping(7753, 7752)
        self._addCaseMapping(7755, 7754)
        self._addCaseMapping(7757, 7756)
        self._addCaseMapping(7759, 7758)
        self._addCaseMapping(7761, 7760)
        self._addCaseMapping(7763, 7762)
        self._addCaseMapping(7765, 7764)
        self._addCaseMapping(7767, 7766)
        self._addCaseMapping(7769, 7768)
        self._addCaseMapping(7771, 7770)
        self._addCaseMapping(7773, 7772)
        self._addCaseMapping(7775, 7774)
        self._addCaseMapping(7777, 7776)
        self._addCaseMapping(7779, 7778)
        self._addCaseMapping(7781, 7780)
        self._addCaseMapping(7783, 7782)
        self._addCaseMapping(7785, 7784)
        self._addCaseMapping(7787, 7786)
        self._addCaseMapping(7789, 7788)
        self._addCaseMapping(7791, 7790)
        self._addCaseMapping(7793, 7792)
        self._addCaseMapping(7795, 7794)
        self._addCaseMapping(7797, 7796)
        self._addCaseMapping(7799, 7798)
        self._addCaseMapping(7801, 7800)
        self._addCaseMapping(7803, 7802)
        self._addCaseMapping(7805, 7804)
        self._addCaseMapping(7807, 7806)
        self._addCaseMapping(7809, 7808)
        self._addCaseMapping(7811, 7810)
        self._addCaseMapping(7813, 7812)
        self._addCaseMapping(7815, 7814)
        self._addCaseMapping(7817, 7816)
        self._addCaseMapping(7819, 7818)
        self._addCaseMapping(7821, 7820)
        self._addCaseMapping(7823, 7822)
        self._addCaseMapping(7825, 7824)
        self._addCaseMapping(7827, 7826)
        self._addCaseMapping(7829, 7828)
        self._addCaseMapping(7841, 7840)
        self._addCaseMapping(7843, 7842)
        self._addCaseMapping(7845, 7844)
        self._addCaseMapping(7847, 7846)
        self._addCaseMapping(7849, 7848)
        self._addCaseMapping(7851, 7850)
        self._addCaseMapping(7853, 7852)
        self._addCaseMapping(7855, 7854)
        self._addCaseMapping(7857, 7856)
        self._addCaseMapping(7859, 7858)
        self._addCaseMapping(7861, 7860)
        self._addCaseMapping(7863, 7862)
        self._addCaseMapping(7865, 7864)
        self._addCaseMapping(7867, 7866)
        self._addCaseMapping(7869, 7868)
        self._addCaseMapping(7871, 7870)
        self._addCaseMapping(7873, 7872)
        self._addCaseMapping(7875, 7874)
        self._addCaseMapping(7877, 7876)
        self._addCaseMapping(7879, 7878)
        self._addCaseMapping(7881, 7880)
        self._addCaseMapping(7883, 7882)
        self._addCaseMapping(7885, 7884)
        self._addCaseMapping(7887, 7886)
        self._addCaseMapping(7889, 7888)
        self._addCaseMapping(7891, 7890)
        self._addCaseMapping(7893, 7892)
        self._addCaseMapping(7895, 7894)
        self._addCaseMapping(7897, 7896)
        self._addCaseMapping(7899, 7898)
        self._addCaseMapping(7901, 7900)
        self._addCaseMapping(7903, 7902)
        self._addCaseMapping(7905, 7904)
        self._addCaseMapping(7907, 7906)
        self._addCaseMapping(7909, 7908)
        self._addCaseMapping(7911, 7910)
        self._addCaseMapping(7913, 7912)
        self._addCaseMapping(7915, 7914)
        self._addCaseMapping(7917, 7916)
        self._addCaseMapping(7919, 7918)
        self._addCaseMapping(7921, 7920)
        self._addCaseMapping(7923, 7922)
        self._addCaseMapping(7925, 7924)
        self._addCaseMapping(7927, 7926)
        self._addCaseMapping(7929, 7928)
        self._addCaseMapping(7936, 7944)
        self._addCaseMapping(7937, 7945)
        self._addCaseMapping(7938, 7946)
        self._addCaseMapping(7939, 7947)
        self._addCaseMapping(7940, 7948)
        self._addCaseMapping(7941, 7949)
        self._addCaseMapping(7942, 7950)
        self._addCaseMapping(7943, 7951)
        self._addCaseMapping(7952, 7960)
        self._addCaseMapping(7953, 7961)
        self._addCaseMapping(7954, 7962)
        self._addCaseMapping(7955, 7963)
        self._addCaseMapping(7956, 7964)
        self._addCaseMapping(7957, 7965)
        self._addCaseMapping(7968, 7976)
        self._addCaseMapping(7969, 7977)
        self._addCaseMapping(7970, 7978)
        self._addCaseMapping(7971, 7979)
        self._addCaseMapping(7972, 7980)
        self._addCaseMapping(7973, 7981)
        self._addCaseMapping(7974, 7982)
        self._addCaseMapping(7975, 7983)
        self._addCaseMapping(7984, 7992)
        self._addCaseMapping(7985, 7993)
        self._addCaseMapping(7986, 7994)
        self._addCaseMapping(7987, 7995)
        self._addCaseMapping(7988, 7996)
        self._addCaseMapping(7989, 7997)
        self._addCaseMapping(7990, 7998)
        self._addCaseMapping(7991, 7999)
        self._addCaseMapping(8000, 8008)
        self._addCaseMapping(8001, 8009)
        self._addCaseMapping(8002, 8010)
        self._addCaseMapping(8003, 8011)
        self._addCaseMapping(8004, 8012)
        self._addCaseMapping(8005, 8013)
        self._addCaseMapping(8017, 8025)
        self._addCaseMapping(8019, 8027)
        self._addCaseMapping(8021, 8029)
        self._addCaseMapping(8023, 8031)
        self._addCaseMapping(8032, 8040)
        self._addCaseMapping(8033, 8041)
        self._addCaseMapping(8034, 8042)
        self._addCaseMapping(8035, 8043)
        self._addCaseMapping(8036, 8044)
        self._addCaseMapping(8037, 8045)
        self._addCaseMapping(8038, 8046)
        self._addCaseMapping(8039, 8047)
        self._addCaseMapping(8064, 8072)
        self._addCaseMapping(8065, 8073)
        self._addCaseMapping(8066, 8074)
        self._addCaseMapping(8067, 8075)
        self._addCaseMapping(8068, 8076)
        self._addCaseMapping(8069, 8077)
        self._addCaseMapping(8070, 8078)
        self._addCaseMapping(8071, 8079)
        self._addCaseMapping(8080, 8088)
        self._addCaseMapping(8081, 8089)
        self._addCaseMapping(8082, 8090)
        self._addCaseMapping(8083, 8091)
        self._addCaseMapping(8084, 8092)
        self._addCaseMapping(8085, 8093)
        self._addCaseMapping(8086, 8094)
        self._addCaseMapping(8087, 8095)
        self._addCaseMapping(8096, 8104)
        self._addCaseMapping(8097, 8105)
        self._addCaseMapping(8098, 8106)
        self._addCaseMapping(8099, 8107)
        self._addCaseMapping(8100, 8108)
        self._addCaseMapping(8101, 8109)
        self._addCaseMapping(8102, 8110)
        self._addCaseMapping(8103, 8111)
        self._addCaseMapping(8112, 8120)
        self._addCaseMapping(8113, 8121)
        self._addCaseMapping(8144, 8152)
        self._addCaseMapping(8145, 8153)
        self._addCaseMapping(8160, 8168)
        self._addCaseMapping(8161, 8169)
        self._addCaseMapping(9424, 9398)
        self._addCaseMapping(9425, 9399)
        self._addCaseMapping(9426, 9400)
        self._addCaseMapping(9427, 9401)
        self._addCaseMapping(9428, 9402)
        self._addCaseMapping(9429, 9403)
        self._addCaseMapping(9430, 9404)
        self._addCaseMapping(9431, 9405)
        self._addCaseMapping(9432, 9406)
        self._addCaseMapping(9433, 9407)
        self._addCaseMapping(9434, 9408)
        self._addCaseMapping(9435, 9409)
        self._addCaseMapping(9436, 9410)
        self._addCaseMapping(9437, 9411)
        self._addCaseMapping(9438, 9412)
        self._addCaseMapping(9439, 9413)
        self._addCaseMapping(9440, 9414)
        self._addCaseMapping(9441, 9415)
        self._addCaseMapping(9442, 9416)
        self._addCaseMapping(9443, 9417)
        self._addCaseMapping(9444, 9418)
        self._addCaseMapping(9445, 9419)
        self._addCaseMapping(9446, 9420)
        self._addCaseMapping(9447, 9421)
        self._addCaseMapping(9448, 9422)
        self._addCaseMapping(9449, 9423)
        self._addCaseMapping(65345, 65313)
        self._addCaseMapping(65346, 65314)
        self._addCaseMapping(65347, 65315)
        self._addCaseMapping(65348, 65316)
        self._addCaseMapping(65349, 65317)
        self._addCaseMapping(65350, 65318)
        self._addCaseMapping(65351, 65319)
        self._addCaseMapping(65352, 65320)
        self._addCaseMapping(65353, 65321)
        self._addCaseMapping(65354, 65322)
        self._addCaseMapping(65355, 65323)
        self._addCaseMapping(65356, 65324)
        self._addCaseMapping(65357, 65325)
        self._addCaseMapping(65358, 65326)
        self._addCaseMapping(65359, 65327)
        self._addCaseMapping(65360, 65328)
        self._addCaseMapping(65361, 65329)
        self._addCaseMapping(65362, 65330)
        self._addCaseMapping(65363, 65331)
        self._addCaseMapping(65364, 65332)
        self._addCaseMapping(65365, 65333)
        self._addCaseMapping(65366, 65334)
        self._addCaseMapping(65367, 65335)
        self._addCaseMapping(65368, 65336)
        self._addCaseMapping(65369, 65337)
        self._addCaseMapping(65370, 65338)

    def _addCaseMapping(self, lowerChar, upperChar):
        if not upperChar in self.mapU2L.h:
            self.mapU2L.set(upperChar, lowerChar)
        if not lowerChar in self.mapL2U.h:
            self.mapL2U.set(lowerChar, upperChar)

    def isLowerCase(self, ch):
        return ch in self.mapL2U.h

    def isUpperCase(self, ch):
        return ch in self.mapU2L.h

    def toLowerCase(self, ch):
        lowerChar = self.mapU2L.h.get(ch, None)
        if lowerChar is None:
            return ch
        else:
            return lowerChar

    def toUpperCase(self, ch):
        upperChar = self.mapL2U.h.get(ch, None)
        if upperChar is None:
            return ch
        else:
            return upperChar

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.mapU2L = None
        _hx_o.mapL2U = None


class hx_strings__Char_Char_Impl_:
    _hx_class_name = 'hx.strings._Char.Char_Impl_'
    __slots__ = ()
    _hx_statics = ['CHAR_CASE_MAPPER', 'BACKSPACE', 'TAB', 'LF', 'CR',
        'ESC', 'SPACE', 'EXCLAMATION_MARK', 'DOUBLE_QUOTE', 'HASH',
        'DOLLAR', 'AMPERSAND', 'SINGLE_QUOTE', 'BRACKET_ROUND_LEFT',
        'BRACKET_ROUND_RIGHT', 'ASTERISK', 'PLUS', 'COMMA', 'MINUS', 'DOT',
        'SLASH', 'ZERO', 'ONE', 'TWO', 'TRHEE', 'FOUR', 'FIVE', 'SIX',
        'SEVEN', 'EIGHT', 'NINE', 'COLON', 'SEMICOLON', 'LOWER_THAN',
        'EQUALS', 'GREATER_THAN', 'QUESTION_MARK', 'BRACKET_SQUARE_LEFT',
        'BACKSLASH', 'BRACKET_SQUARE_RIGHT', 'CARET', 'UNDERSCORE',
        'BRACKET_CURLY_LEFT', 'PIPE', 'BRACKET_CURLY_RIGHT', 'fromString',
        'of', 'op_plus_string', 'op_plus_string2', 'op_plus', 'isAscii',
        'isAsciiAlpha', 'isAsciiAlphanumeric', 'isAsciiControl',
        'isAsciiPrintable', 'isDigit', 'isEOF', 'isSpace', 'isUTF8',
        'isWhitespace', 'isLowerCase', 'isUpperCase', 'toLowerCase',
        'toUpperCase', 'toInt', 'toString']

    @staticmethod
    def fromString(_hx_str):
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0 or 0 >= strLen:
            return -1
        else:
            return HxString.charCodeAt(_hx_str, 0)

    @staticmethod
    def of(ch):
        return ch

    @staticmethod
    def op_plus_string(ch, other):
        return HxOverrides.stringOrNull(''.join(map(chr, [ch]))) + ('null' if
            other is None else other)

    @staticmethod
    def op_plus_string2(_hx_str, ch):
        return ('null' if _hx_str is None else _hx_str
            ) + HxOverrides.stringOrNull(''.join(map(chr, [ch])))

    @staticmethod
    def op_plus(ch, other):
        return ch + other

    @staticmethod
    def isAscii(this1):
        if this1 > -1:
            return this1 < 128
        else:
            return False

    @staticmethod
    def isAsciiAlpha(this1):
        if not (this1 > 64 and this1 < 91):
            if this1 > 96:
                return this1 < 123
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiAlphanumeric(this1):
        if not (this1 > 64 and this1 < 91 or this1 > 96 and this1 < 123):
            if this1 > 47:
                return this1 < 58
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiControl(this1):
        if not (this1 > -1 and this1 < 32):
            return this1 == 127
        else:
            return True

    @staticmethod
    def isAsciiPrintable(this1):
        if this1 > 31:
            return this1 < 127
        else:
            return False

    @staticmethod
    def isDigit(this1):
        if this1 > 47:
            return this1 < 58
        else:
            return False

    @staticmethod
    def isEOF(this1):
        return this1 == -1

    @staticmethod
    def isSpace(this1):
        return this1 == 32

    @staticmethod
    def isUTF8(this1):
        if this1 > -1:
            return this1 < 1114112
        else:
            return False

    @staticmethod
    def isWhitespace(this1):
        if not (this1 > 8 and this1 < 14):
            return this1 == 32
        else:
            return True

    @staticmethod
    def isLowerCase(this1):
        return this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h

    @staticmethod
    def isUpperCase(this1):
        return this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h

    @staticmethod
    def toLowerCase(this1):
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(
            this1, None)
        if lowerChar is None:
            return this1
        else:
            return lowerChar

    @staticmethod
    def toUpperCase(this1):
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(
            this1, None)
        if upperChar is None:
            return this1
        else:
            return upperChar

    @staticmethod
    def toInt(this1):
        return this1

    @staticmethod
    def toString(this1):
        return ''.join(map(chr, [this1]))


class hx_strings_CharIterator:
    _hx_class_name = 'hx.strings.CharIterator'
    __slots__ = ('index', 'line', 'col', 'currChar', 'prevBuffer',
        'prevBufferPrevIdx', 'prevBufferNextIdx')
    _hx_fields = ['index', 'line', 'col', 'currChar', 'prevBuffer',
        'prevBufferPrevIdx', 'prevBufferNextIdx']
    _hx_methods = ['get_current', 'get_pos', 'hasPrev', 'prev', 'hasNext',
        'next', 'getChar', 'isEOF']
    _hx_statics = ['fromString', 'fromArray', 'fromInput', 'fromIterator']

    def __init__(self, prevBufferSize):
        self.prevBufferNextIdx = -1
        self.prevBufferPrevIdx = -1
        self.currChar = -1
        self.col = 0
        self.line = 0
        self.index = -1
        tmp = None
        if prevBufferSize > 0:
            this1 = hx_strings_internal__RingBuffer_RingBufferImpl(
                prevBufferSize + 1)
            tmp = this1
        else:
            tmp = None
        self.prevBuffer = tmp

    def get_current(self):
        if self.index > -1:
            return self.currChar
        else:
            return None

    def get_pos(self):
        return hx_strings_CharPos(self.index, self.line, self.col)

    def hasPrev(self):
        return self.prevBufferPrevIdx > -1

    def prev(self):
        if self.prevBufferPrevIdx <= -1:
            raise haxe_Exception.thrown(haxe_io_Eof())
        prevChar = self.prevBuffer.get(self.prevBufferPrevIdx)
        self.currChar = prevChar.char
        self.index = prevChar.index
        self.line = prevChar.line
        self.col = prevChar.col
        self.prevBufferNextIdx = (self.prevBufferPrevIdx + 1 if self.
            prevBufferPrevIdx + 1 < self.prevBuffer.length else -1)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.prevBufferPrevIdx
        _hx_local_0.prevBufferPrevIdx = _hx_local_1 - 1
        _hx_local_1
        return self.currChar

    def hasNext(self):
        if self.prevBufferNextIdx > -1:
            return True
        else:
            return not self.isEOF()

    def next(self):
        if self.prevBufferNextIdx > -1:
            prevChar = self.prevBuffer.get(self.prevBufferNextIdx)
            self.currChar = prevChar.char
            self.index = prevChar.index
            self.line = prevChar.line
            self.col = prevChar.col
            self.prevBufferPrevIdx = self.prevBufferNextIdx - 1
            self.prevBufferNextIdx = (self.prevBufferNextIdx + 1 if self.
                prevBufferNextIdx + 1 < self.prevBuffer.length else -1)
            return self.currChar
        if self.isEOF():
            raise haxe_Exception.thrown(haxe_io_Eof())
        if self.currChar == 10 or self.currChar < 0:
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.line
            _hx_local_0.line = _hx_local_1 + 1
            _hx_local_1
            self.col = 0
        _hx_local_2 = self
        _hx_local_3 = _hx_local_2.index
        _hx_local_2.index = _hx_local_3 + 1
        _hx_local_3
        _hx_local_4 = self
        _hx_local_5 = _hx_local_4.col
        _hx_local_4.col = _hx_local_5 + 1
        _hx_local_5
        self.currChar = self.getChar()
        if self.prevBuffer is not None:
            self.prevBuffer.add(hx_strings__CharIterator_CharWithPos(self.
                currChar, self.index, self.col, self.line))
            self.prevBufferPrevIdx = self.prevBuffer.length - 2
            self.prevBufferNextIdx = -1
        return self.currChar

    def getChar(self):
        raise haxe_Exception.thrown('Not implemented')

    def isEOF(self):
        raise haxe_Exception.thrown('Not implemented')

    @staticmethod
    def fromString(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_StringCharIterator(chars,
            prevBufferSize)

    @staticmethod
    def fromArray(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_ArrayCharIterator(chars, prevBufferSize
            )

    @staticmethod
    def fromInput(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_InputCharIterator(chars, prevBufferSize
            )

    @staticmethod
    def fromIterator(chars, prevBufferSize=None):
        if prevBufferSize is None:
            prevBufferSize = 0
        if chars is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        return hx_strings__CharIterator_IteratorCharIterator(chars,
            prevBufferSize)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None
        _hx_o.currChar = None
        _hx_o.prevBuffer = None
        _hx_o.prevBufferPrevIdx = None
        _hx_o.prevBufferNextIdx = None


class hx_strings_CharPos:
    _hx_class_name = 'hx.strings.CharPos'
    __slots__ = 'index', 'line', 'col'
    _hx_fields = ['index', 'line', 'col']
    _hx_methods = ['toString']

    def __init__(self, index, line, col):
        self.index = index
        self.line = line
        self.col = col

    def toString(self):
        return 'CharPos[index=' + Std.string(self.index
            ) + ', line=' + Std.string(self.line) + ', col=' + Std.string(self
            .col) + ']'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None


class hx_strings__CharIterator_CharWithPos(hx_strings_CharPos):
    _hx_class_name = 'hx.strings._CharIterator.CharWithPos'
    __slots__ = 'char',
    _hx_fields = ['char']
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharPos

    def __init__(self, char, index, line, col):
        self.char = None
        super().__init__(index, line, col)
        self.char = char

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.char = None


class hx_strings_internal__RingBuffer_RingBufferImpl:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBufferImpl'
    __slots__ = ('buffer', 'bufferStartIdx', 'bufferEndIdx', 'bufferMaxIdx',
        'length', 'size')
    _hx_fields = ['buffer', 'bufferStartIdx', 'bufferEndIdx',
        'bufferMaxIdx', 'length', 'size']
    _hx_methods = ['add', 'get', 'iterator', 'toArray']

    def __init__(self, size):
        self.length = 0
        self.bufferEndIdx = -1
        self.bufferStartIdx = 0
        if size < 1:
            raise haxe_Exception.thrown('[size] must be > 0')
        this1 = [None] * size
        self.buffer = this1
        self.size = size
        self.bufferMaxIdx = size - 1

    def add(self, item):
        if self.length == self.size:
            self.bufferEndIdx = self.bufferStartIdx
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.bufferStartIdx
            _hx_local_0.bufferStartIdx = _hx_local_1 + 1
            _hx_local_1
            if self.bufferStartIdx > self.bufferMaxIdx:
                self.bufferStartIdx = 0
        else:
            _hx_local_2 = self
            _hx_local_3 = _hx_local_2.bufferEndIdx
            _hx_local_2.bufferEndIdx = _hx_local_3 + 1
            _hx_local_3
            _hx_local_4 = self
            _hx_local_5 = _hx_local_4.length
            _hx_local_4.length = _hx_local_5 + 1
            _hx_local_5
        self.buffer[self.bufferEndIdx] = item

    def get(self, index):
        if index < 0 or index > self.bufferMaxIdx:
            raise haxe_Exception.thrown('[index] ' + Std.string(index) +
                ' is out of bound')
        realIdx = self.bufferStartIdx + index
        if realIdx > self.bufferMaxIdx:
            realIdx = realIdx - self.length
        return self.buffer[realIdx]

    def iterator(self):
        return hx_strings_internal__RingBuffer_RingBufferIterator(self)

    def toArray(self):
        arr = list()
        i = self.iterator()
        while i.hasNext():
            i1 = i.next()
            arr.append(i1)
        return arr

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buffer = None
        _hx_o.bufferStartIdx = None
        _hx_o.bufferEndIdx = None
        _hx_o.bufferMaxIdx = None
        _hx_o.length = None
        _hx_o.size = None


class python_Boot:
    _hx_class_name = 'python.Boot'
    __slots__ = ()
    _hx_statics = ['keywords', 'toString1', 'fields', 'simpleField',
        'field', 'getInstanceFields', 'getSuperClass', 'getClassFields',
        'prefixLength', 'unhandleKeywords']

    @staticmethod
    def toString1(o, s):
        if o is None:
            return 'null'
        if isinstance(o, str):
            return o
        if s is None:
            s = ''
        if len(s) >= 5:
            return '<...>'
        if isinstance(o, bool):
            if o:
                return 'true'
            else:
                return 'false'
        if isinstance(o, int) and not isinstance(o, bool):
            return str(o)
        if isinstance(o, float):
            try:
                if o == int(o):
                    return str(Math.floor(o + 0.5))
                else:
                    return str(o)
            except BaseException as _g:
                return str(o)
        if isinstance(o, list):
            o1 = o
            l = len(o1)
            st = '['
            s = ('null' if s is None else s) + '\t'
            _g = 0
            _g1 = l
            while _g < _g1:
                i = _g
                _g = _g + 1
                prefix = ''
                if i > 0:
                    prefix = ','
                st = ('null' if st is None else st) + HxOverrides.stringOrNull(
                    ('null' if prefix is None else prefix) + HxOverrides.
                    stringOrNull(python_Boot.toString1(o1[i] if i >= 0 and 
                    i < len(o1) else None, s)))
            st = ('null' if st is None else st) + ']'
            return st
        try:
            if hasattr(o, 'toString'):
                return o.toString()
        except BaseException as _g:
            pass
        if hasattr(o, '__class__'):
            if isinstance(o, _hx_AnonObject):
                toStr = None
                try:
                    fields = python_Boot.fields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '{ ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' }'
                except BaseException as _g:
                    return '{ ... }'
                if toStr is None:
                    return '{ ... }'
                else:
                    return toStr
            if isinstance(o, Enum):
                o1 = o
                l = len(o1.params)
                hasParams = l > 0
                if hasParams:
                    paramsStr = ''
                    _g = 0
                    _g1 = l
                    while _g < _g1:
                        i = _g
                        _g = _g + 1
                        prefix = ''
                        if i > 0:
                            prefix = ','
                        paramsStr = ('null' if paramsStr is None else paramsStr
                            ) + HxOverrides.stringOrNull(('null' if prefix is
                            None else prefix) + HxOverrides.stringOrNull(
                            python_Boot.toString1(o1.params[i], s)))
                    return HxOverrides.stringOrNull(o1.tag) + '(' + ('null' if
                        paramsStr is None else paramsStr) + ')'
                else:
                    return o1.tag
            if hasattr(o, '_hx_class_name'):
                if o.__class__.__name__ != 'type':
                    fields = python_Boot.getInstanceFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
                else:
                    fields = python_Boot.getClassFields(o)
                    _g = []
                    _g1 = 0
                    while _g1 < len(fields):
                        f = fields[_g1] if _g1 >= 0 and _g1 < len(fields
                            ) else None
                        _g1 = _g1 + 1
                        x = '' + ('null' if f is None else f
                            ) + ' : ' + HxOverrides.stringOrNull(python_Boot
                            .toString1(python_Boot.simpleField(o, f), (
                            'null' if s is None else s) + '\t'))
                        _g.append(x)
                    fieldsStr = _g
                    toStr = '#' + HxOverrides.stringOrNull(o._hx_class_name
                        ) + '( ' + HxOverrides.stringOrNull(', '.join([x1 for
                        x1 in fieldsStr])) + ' )'
                    return toStr
            if o == str:
                return '#String'
            if o == list:
                return '#Array'
            if callable(o):
                return 'function'
            try:
                if hasattr(o, '__repr__'):
                    return o.__repr__()
            except BaseException as _g:
                pass
            if hasattr(o, '__str__'):
                return o.__str__([])
            if hasattr(o, '__name__'):
                return o.__name__
            return '???'
        else:
            return str(o)

    @staticmethod
    def fields(o):
        a = []
        if o is not None:
            if hasattr(o, '_hx_fields'):
                fields = o._hx_fields
                if fields is not None:
                    return list(fields)
            if isinstance(o, _hx_AnonObject):
                d = o.__dict__
                keys = d.keys()
                handler = python_Boot.unhandleKeywords
                for k in keys:
                    if k != '_hx_disable_getattr':
                        a.append(handler(k))
            elif hasattr(o, '__dict__'):
                d = o.__dict__
                keys1 = d.keys()
                for k in keys1:
                    a.append(k)
        return a

    @staticmethod
    def simpleField(o, field):
        if field is None:
            return None
        field1 = ('_hx_' + field if field in python_Boot.keywords else 
            '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
            ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
            field)
        if hasattr(o, field1):
            return getattr(o, field1)
        else:
            return None

    @staticmethod
    def field(o, field):
        if field is None:
            return None
        if isinstance(o, str):
            field1 = field
            _hx_local_0 = len(field1)
            if _hx_local_0 == 10:
                if field1 == 'charCodeAt':
                    return python_internal_MethodClosure(o, HxString.charCodeAt
                        )
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o, HxString.
                        lastIndexOf)
                elif field1 == 'toLowerCase':
                    return python_internal_MethodClosure(o, HxString.
                        toLowerCase)
                elif field1 == 'toUpperCase':
                    return python_internal_MethodClosure(o, HxString.
                        toUpperCase)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 9:
                if field1 == 'substring':
                    return python_internal_MethodClosure(o, HxString.substring)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 5:
                if field1 == 'split':
                    return python_internal_MethodClosure(o, HxString.split)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o, HxString.indexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 8:
                if field1 == 'toString':
                    return python_internal_MethodClosure(o, HxString.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_0 == 6:
                if field1 == 'charAt':
                    return python_internal_MethodClosure(o, HxString.charAt)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'substr':
                    return python_internal_MethodClosure(o, HxString.substr)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        elif isinstance(o, list):
            field1 = field
            _hx_local_1 = len(field1)
            if _hx_local_1 == 11:
                if field1 == 'lastIndexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.lastIndexOf)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 4:
                if field1 == 'copy':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.copy)
                elif field1 == 'join':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.join)
                elif field1 == 'push':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.push)
                elif field1 == 'sort':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.sort)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 5:
                if field1 == 'shift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.shift)
                elif field1 == 'slice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.slice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 7:
                if field1 == 'indexOf':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.indexOf)
                elif field1 == 'reverse':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.reverse)
                elif field1 == 'unshift':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.unshift)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 3:
                if field1 == 'map':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.map)
                elif field1 == 'pop':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.pop)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 8:
                if field1 == 'contains':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.contains)
                elif field1 == 'iterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.iterator)
                elif field1 == 'toString':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.toString)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 16:
                if field1 == 'keyValueIterator':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.keyValueIterator)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            elif _hx_local_1 == 6:
                if field1 == 'concat':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.concat)
                elif field1 == 'filter':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.filter)
                elif field1 == 'insert':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.insert)
                elif field1 == 'length':
                    return len(o)
                elif field1 == 'remove':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.remove)
                elif field1 == 'splice':
                    return python_internal_MethodClosure(o,
                        python_internal_ArrayImpl.splice)
                else:
                    field1 = ('_hx_' + field if field in python_Boot.
                        keywords else '_hx_' + field if ((len(field) > 2 and
                        ord(field[0]) == 95) and ord(field[1]) == 95) and 
                        ord(field[len(field) - 1]) != 95 else field)
                    if hasattr(o, field1):
                        return getattr(o, field1)
                    else:
                        return None
            else:
                field1 = ('_hx_' + field if field in python_Boot.keywords else
                    '_hx_' + field if ((len(field) > 2 and ord(field[0]) ==
                    95) and ord(field[1]) == 95) and ord(field[len(field) -
                    1]) != 95 else field)
                if hasattr(o, field1):
                    return getattr(o, field1)
                else:
                    return None
        else:
            field1 = ('_hx_' + field if field in python_Boot.keywords else 
                '_hx_' + field if ((len(field) > 2 and ord(field[0]) == 95) and
                ord(field[1]) == 95) and ord(field[len(field) - 1]) != 95 else
                field)
            if hasattr(o, field1):
                return getattr(o, field1)
            else:
                return None

    @staticmethod
    def getInstanceFields(c):
        f = list(c._hx_fields) if hasattr(c, '_hx_fields') else []
        if hasattr(c, '_hx_methods'):
            f = f + c._hx_methods
        sc = python_Boot.getSuperClass(c)
        if sc is None:
            return f
        else:
            scArr = python_Boot.getInstanceFields(sc)
            scMap = set(scArr)
            _g = 0
            while _g < len(f):
                f1 = f[_g] if _g >= 0 and _g < len(f) else None
                _g = _g + 1
                if not f1 in scMap:
                    scArr.append(f1)
            return scArr

    @staticmethod
    def getSuperClass(c):
        if c is None:
            return None
        try:
            if hasattr(c, '_hx_super'):
                return c._hx_super
            return None
        except BaseException as _g:
            pass
        return None

    @staticmethod
    def getClassFields(c):
        if hasattr(c, '_hx_statics'):
            x = c._hx_statics
            return list(x)
        else:
            return []

    @staticmethod
    def unhandleKeywords(name):
        if HxString.substr(name, 0, python_Boot.prefixLength) == '_hx_':
            real = HxString.substr(name, python_Boot.prefixLength, None)
            if real in python_Boot.keywords:
                return real
        return name


class HxString:
    _hx_class_name = 'HxString'
    __slots__ = ()
    _hx_statics = ['split', 'charCodeAt', 'charAt', 'lastIndexOf',
        'toUpperCase', 'toLowerCase', 'indexOf', 'indexOfImpl', 'toString',
        'substring', 'substr']

    @staticmethod
    def split(s, d):
        if d == '':
            return list(s)
        else:
            return s.split(d)

    @staticmethod
    def charCodeAt(s, index):
        if ((s is None or len(s) == 0) or index < 0) or index >= len(s):
            return None
        else:
            return ord(s[index])

    @staticmethod
    def charAt(s, index):
        if index < 0 or index >= len(s):
            return ''
        else:
            return s[index]

    @staticmethod
    def lastIndexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.rfind(_hx_str, 0, len(s))
        elif _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        else:
            i = s.rfind(_hx_str, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(_hx_str)
                ) if i == -1 else i + 1
            check = s.find(_hx_str, startLeft, len(s))
            if check > i and check <= startIndex:
                return check
            else:
                return i

    @staticmethod
    def toUpperCase(s):
        return s.upper()

    @staticmethod
    def toLowerCase(s):
        return s.lower()

    @staticmethod
    def indexOf(s, _hx_str, startIndex=None):
        if startIndex is None:
            return s.find(_hx_str)
        else:
            return HxString.indexOfImpl(s, _hx_str, startIndex)

    @staticmethod
    def indexOfImpl(s, _hx_str, startIndex):
        if _hx_str == '':
            length = len(s)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            if startIndex > length:
                return length
            else:
                return startIndex
        return s.find(_hx_str, startIndex)

    @staticmethod
    def toString(s):
        return s

    @staticmethod
    def substring(s, startIndex, endIndex=None):
        if startIndex < 0:
            startIndex = 0
        if endIndex is None:
            return s[startIndex:]
        else:
            if endIndex < 0:
                endIndex = 0
            if endIndex < startIndex:
                return s[endIndex:startIndex]
            else:
                return s[startIndex:endIndex]

    @staticmethod
    def substr(s, startIndex, _hx_len=None):
        if _hx_len is None:
            return s[startIndex:]
        else:
            if _hx_len == 0:
                return ''
            if startIndex < 0:
                startIndex = len(s) + startIndex
                if startIndex < 0:
                    startIndex = 0
            return s[startIndex:startIndex + _hx_len]


class hx_strings__CharIterator_NullCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.NullCharIterator'
    __slots__ = ()
    _hx_fields = []
    _hx_methods = ['isEOF']
    _hx_statics = ['INSTANCE']
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self):
        super().__init__(0)

    def isEOF(self):
        return True

    @staticmethod
    def _hx_empty_init(_hx_o):
        pass


class hx_strings__CharIterator_ArrayCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.ArrayCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = len(chars) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return python_internal_ArrayImpl._get(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings__CharIterator_IteratorCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.IteratorCharIterator'
    __slots__ = 'chars',
    _hx_fields = ['chars']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars

    def isEOF(self):
        return not self.chars.hasNext()

    def getChar(self):
        return self.chars.next()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None


class hx_strings__CharIterator_InputCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.InputCharIterator'
    __slots__ = ('byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable')
    _hx_fields = ['byteIndex', 'input', 'currCharIndex', 'nextChar',
        'nextCharAvailable']
    _hx_methods = ['isEOF', 'getChar', 'readUtf8Char',
        'readUtf8MultiSequenceByte']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.nextChar = None
        self.input = None
        self.nextCharAvailable = None
        self.currCharIndex = -1
        self.byteIndex = 0
        super().__init__(prevBufferSize)
        self.input = chars

    def isEOF(self):
        if self.nextCharAvailable == None:
            try:
                byte1 = self.input.readByte()
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.byteIndex
                _hx_local_0.byteIndex = _hx_local_1 + 1
                _hx_local_1
                tmp = None
                if byte1 <= 127:
                    tmp = byte1
                else:
                    byte1 = byte1 & -129
                    byte1 = byte1 & -65
                    totalBytes = 2
                    isBit6Set = 1 == byte1 >> 5 & 1
                    isBit5Set = False
                    if isBit6Set:
                        byte1 = byte1 & -33
                        totalBytes = totalBytes + 1
                        isBit5Set = 1 == byte1 >> 4 & 1
                        if isBit5Set:
                            byte1 = byte1 & -17
                            totalBytes = totalBytes + 1
                            if 1 == byte1 >> 3 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 byte expected at position [' +
                                    Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte1) + ']!')
                    result = byte1 << 6 * (totalBytes - 1)
                    byte = self.input.readByte()
                    _hx_local_8 = self
                    _hx_local_9 = _hx_local_8.byteIndex
                    _hx_local_8.byteIndex = _hx_local_9 + 1
                    _hx_local_9
                    if 1 != byte >> 7 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    if 1 == byte >> 6 & 1:
                        raise haxe_Exception.thrown(
                            'Valid UTF-8 multi-sequence byte expected at position ['
                             + Std.string(self.byteIndex) +
                            '] but found byte with value [' + Std.string(
                            byte) + ']!')
                    byte2 = byte & -129
                    result = result + (byte2 << 6 * (totalBytes - 2))
                    if isBit6Set:
                        byte = self.input.readByte()
                        _hx_local_11 = self
                        _hx_local_12 = _hx_local_11.byteIndex
                        _hx_local_11.byteIndex = _hx_local_12 + 1
                        _hx_local_12
                        if 1 != byte >> 7 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        if 1 == byte >> 6 & 1:
                            raise haxe_Exception.thrown(
                                'Valid UTF-8 multi-sequence byte expected at position ['
                                 + Std.string(self.byteIndex) +
                                '] but found byte with value [' + Std.
                                string(byte) + ']!')
                        byte3 = byte & -129
                        result = result + (byte3 << 6 * (totalBytes - 3))
                        if isBit5Set:
                            byte = self.input.readByte()
                            _hx_local_14 = self
                            _hx_local_15 = _hx_local_14.byteIndex
                            _hx_local_14.byteIndex = _hx_local_15 + 1
                            _hx_local_15
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte4 = byte & -129
                            result = result + (byte4 << 6 * (totalBytes - 4))
                    if self.index == 0 and result == 65279:
                        byte1 = self.input.readByte()
                        _hx_local_17 = self
                        _hx_local_18 = _hx_local_17.byteIndex
                        _hx_local_17.byteIndex = _hx_local_18 + 1
                        _hx_local_18
                        if byte1 <= 127:
                            tmp = byte1
                        else:
                            byte1 = byte1 & -129
                            byte1 = byte1 & -65
                            totalBytes = 2
                            isBit6Set = 1 == byte1 >> 5 & 1
                            isBit5Set = False
                            if isBit6Set:
                                byte1 = byte1 & -33
                                totalBytes = totalBytes + 1
                                isBit5Set = 1 == byte1 >> 4 & 1
                                if isBit5Set:
                                    byte1 = byte1 & -17
                                    totalBytes = totalBytes + 1
                                    if 1 == byte1 >> 3 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte1) + ']!')
                            result1 = byte1 << 6 * (totalBytes - 1)
                            byte = self.input.readByte()
                            _hx_local_25 = self
                            _hx_local_26 = _hx_local_25.byteIndex
                            _hx_local_25.byteIndex = _hx_local_26 + 1
                            _hx_local_26
                            if 1 != byte >> 7 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            if 1 == byte >> 6 & 1:
                                raise haxe_Exception.thrown(
                                    'Valid UTF-8 multi-sequence byte expected at position ['
                                     + Std.string(self.byteIndex) +
                                    '] but found byte with value [' + Std.
                                    string(byte) + ']!')
                            byte2 = byte & -129
                            result1 = result1 + (byte2 << 6 * (totalBytes - 2))
                            if isBit6Set:
                                byte = self.input.readByte()
                                _hx_local_28 = self
                                _hx_local_29 = _hx_local_28.byteIndex
                                _hx_local_28.byteIndex = _hx_local_29 + 1
                                _hx_local_29
                                if 1 != byte >> 7 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                if 1 == byte >> 6 & 1:
                                    raise haxe_Exception.thrown(
                                        'Valid UTF-8 multi-sequence byte expected at position ['
                                         + Std.string(self.byteIndex) +
                                        '] but found byte with value [' +
                                        Std.string(byte) + ']!')
                                byte3 = byte & -129
                                result1 = result1 + (byte3 << 6 * (
                                    totalBytes - 3))
                                if isBit5Set:
                                    byte = self.input.readByte()
                                    _hx_local_31 = self
                                    _hx_local_32 = _hx_local_31.byteIndex
                                    _hx_local_31.byteIndex = _hx_local_32 + 1
                                    _hx_local_32
                                    if 1 != byte >> 7 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    if 1 == byte >> 6 & 1:
                                        raise haxe_Exception.thrown(
                                            'Valid UTF-8 multi-sequence byte expected at position ['
                                             + Std.string(self.byteIndex) +
                                            '] but found byte with value [' +
                                            Std.string(byte) + ']!')
                                    byte4 = byte & -129
                                    result1 = result1 + (byte4 << 6 * (
                                        totalBytes - 4))
                            tmp = (self.readUtf8Char() if self.index == 0 and
                                result1 == 65279 else result1)
                    else:
                        tmp = result
                self.nextChar = tmp
                self.nextCharAvailable = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(), haxe_io_Eof
                    ):
                    self.nextCharAvailable = False
                else:
                    raise _g
        return self.nextCharAvailable != True

    def getChar(self):
        if self.index != self.currCharIndex:
            self.currCharIndex = self.index
            self.nextCharAvailable = None
            return self.nextChar
        return self.currChar

    def readUtf8Char(self):
        byte1 = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if byte1 <= 127:
            return byte1
        byte1 = byte1 & -129
        byte1 = byte1 & -65
        totalBytes = 2
        isBit6Set = 1 == byte1 >> 5 & 1
        isBit5Set = False
        if isBit6Set:
            byte1 = byte1 & -33
            totalBytes = totalBytes + 1
            isBit5Set = 1 == byte1 >> 4 & 1
            if isBit5Set:
                byte1 = byte1 & -17
                totalBytes = totalBytes + 1
                if 1 == byte1 >> 3 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 byte expected at position [' + Std.
                        string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte1) +
                        ']!')
        result = byte1 << 6 * (totalBytes - 1)
        byte = self.input.readByte()
        _hx_local_8 = self
        _hx_local_9 = _hx_local_8.byteIndex
        _hx_local_8.byteIndex = _hx_local_9 + 1
        _hx_local_9
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        byte2 = byte & -129
        result = result + (byte2 << 6 * (totalBytes - 2))
        if isBit6Set:
            byte = self.input.readByte()
            _hx_local_11 = self
            _hx_local_12 = _hx_local_11.byteIndex
            _hx_local_11.byteIndex = _hx_local_12 + 1
            _hx_local_12
            if 1 != byte >> 7 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            if 1 == byte >> 6 & 1:
                raise haxe_Exception.thrown(
                    'Valid UTF-8 multi-sequence byte expected at position [' +
                    Std.string(self.byteIndex) +
                    '] but found byte with value [' + Std.string(byte) + ']!')
            byte3 = byte & -129
            result = result + (byte3 << 6 * (totalBytes - 3))
            if isBit5Set:
                byte = self.input.readByte()
                _hx_local_14 = self
                _hx_local_15 = _hx_local_14.byteIndex
                _hx_local_14.byteIndex = _hx_local_15 + 1
                _hx_local_15
                if 1 != byte >> 7 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                if 1 == byte >> 6 & 1:
                    raise haxe_Exception.thrown(
                        'Valid UTF-8 multi-sequence byte expected at position ['
                         + Std.string(self.byteIndex) +
                        '] but found byte with value [' + Std.string(byte) +
                        ']!')
                byte4 = byte & -129
                result = result + (byte4 << 6 * (totalBytes - 4))
        if self.index == 0 and result == 65279:
            return self.readUtf8Char()
        return result

    def readUtf8MultiSequenceByte(self):
        byte = self.input.readByte()
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = _hx_local_1 + 1
        _hx_local_1
        if 1 != byte >> 7 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        if 1 == byte >> 6 & 1:
            raise haxe_Exception.thrown(
                'Valid UTF-8 multi-sequence byte expected at position [' +
                Std.string(self.byteIndex) +
                '] but found byte with value [' + Std.string(byte) + ']!')
        return byte & -129

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.byteIndex = None
        _hx_o.input = None
        _hx_o.currCharIndex = None
        _hx_o.nextChar = None
        _hx_o.nextCharAvailable = None


class hx_strings__CharIterator_StringCharIterator(hx_strings_CharIterator):
    _hx_class_name = 'hx.strings._CharIterator.StringCharIterator'
    __slots__ = 'chars', 'charsMaxIndex'
    _hx_fields = ['chars', 'charsMaxIndex']
    _hx_methods = ['isEOF', 'getChar']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator

    def __init__(self, chars, prevBufferSize):
        self.charsMaxIndex = None
        self.chars = None
        super().__init__(prevBufferSize)
        self.chars = chars
        self.charsMaxIndex = (0 if chars is None else len(chars)) - 1

    def isEOF(self):
        return self.index >= self.charsMaxIndex

    def getChar(self):
        return HxString.charCodeAt(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings_Pattern:
    _hx_class_name = 'hx.strings.Pattern'
    __slots__ = 'pattern', 'options', 'ereg'
    _hx_fields = ['pattern', 'options', 'ereg']
    _hx_methods = ['matcher', 'replace', 'remove', 'split']
    _hx_statics = ['__meta__', 'compile']

    def __init__(self, pattern, options):
        self.pattern = pattern
        self.options = options
        self.ereg = EReg(pattern, options)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.options
        _hx_local_0.options = ('null' if _hx_local_1 is None else _hx_local_1
            ) + 'u'
        _hx_local_0.options

    def matcher(self, _hx_str):
        return hx_strings__Pattern_MatcherImpl(self.ereg, self.pattern,
            self.options, _hx_str)

    def replace(self, _hx_str, replaceWith):
        return self.ereg.replace(_hx_str, replaceWith)

    def remove(self, _hx_str):
        return self.ereg.replace(_hx_str, '')

    def split(self, _hx_str):
        return self.ereg.split(_hx_str)

    @staticmethod
    def compile(pattern, options=None):
        if options is None:
            return hx_strings_Pattern(pattern, '')
        _g = options
        tmp = None
        tmp1 = _g.index
        if tmp1 == 0:
            _hx_str = _g.params[0]
            str1 = hx_strings_Strings.toLowerCase8(_hx_str)
            if str1 is None or len(str1) == 0:
                tmp = str1
            else:

                def _hx_local_0(ch):
                    return ''.join(map(chr, [ch]))

                def _hx_local_1(ch):
                    _this = None
                    strLen = len('i')
                    if ch != (-1 if strLen == 0 or 0 >= strLen else
                        HxString.charCodeAt('i', 0)):
                        strLen = len('m')
                        _this = ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('m', 0))
                    else:
                        _this = True
                    if not _this:
                        strLen = len('g')
                        return ch == (-1 if strLen == 0 or 0 >= strLen else
                            HxString.charCodeAt('g', 0))
                    else:
                        return True
                _this = list(map(_hx_local_0, list(filter(_hx_local_1,
                    hx_strings_Strings.toChars(str1)))))
                tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        elif tmp1 == 1:
            opt = _g.params[0]
            tmp = Std.string(opt)
        elif tmp1 == 2:
            arr = _g.params[0]

            def _hx_local_2(m):
                return m is not None
            _this = list(filter(_hx_local_2, arr))
            tmp = ''.join([python_Boot.toString1(x1, '') for x1 in _this])
        else:
            pass
        return hx_strings_Pattern(pattern, tmp)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.options = None
        _hx_o.ereg = None


class hx_strings_Matcher:
    _hx_class_name = 'hx.strings.Matcher'
    __slots__ = ()
    _hx_methods = ['iterate', 'map', 'matched', 'matchedPos', 'matches',
        'matchesInRegion', 'reset', 'substringAfterMatch',
        'substringBeforeMatch']
    _hx_statics = ['__meta__']


class hx_strings__Pattern_MatcherImpl:
    _hx_class_name = 'hx.strings._Pattern.MatcherImpl'
    __slots__ = 'ereg', 'isMatch', 'str'
    _hx_fields = ['ereg', 'isMatch', 'str']
    _hx_methods = ['reset', 'iterate', 'map', 'matched', 'matches',
        'matchesInRegion', 'matchedPos', 'substringAfterMatch',
        'substringBeforeMatch', '_cloneEReg']
    _hx_interfaces = [hx_strings_Matcher]

    def __init__(self, ereg, pattern, options, _hx_str):
        self.str = None
        self.isMatch = None
        self.ereg = None
        self.ereg = self._cloneEReg(ereg, pattern, options)
        self.str = _hx_str
        self.isMatch = None

    def reset(self, _hx_str):
        self.str = _hx_str
        self.isMatch = None
        return self

    def iterate(self, onMatch):
        startAt = 0
        while self.ereg.matchSub(self.str, startAt):
            self.isMatch = True
            _this = self.ereg
            matchedPos_pos = _this.matchObj.start()
            matchedPos_len = _this.matchObj.end() - _this.matchObj.start()
            onMatch(self)
            startAt = matchedPos_pos + matchedPos_len
        self.isMatch = False

    def map(self, mapper):
        _gthis = self

        def _hx_local_1():

            def _hx_local_0(ereg):
                _gthis.isMatch = True
                return mapper(_gthis)
            return self.ereg.map(self.str, _hx_local_0)
        return _hx_local_1()

    def matched(self, n=None):
        if n is None:
            n = 0
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        result = self.ereg.matchObj.group(n)
        return result

    def matches(self):
        _this = self.ereg
        _this.matchObj = python_lib_Re.search(_this.pattern, self.str)

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = _this.matchObj is not None
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchesInRegion(self, pos, _hx_len=None):
        if _hx_len is None:
            _hx_len = -1

        def _hx_local_1():

            def _hx_local_0():
                self.isMatch = self.ereg.matchSub(self.str, pos, _hx_len)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchedPos(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            raise haxe_Exception.thrown('No string matched')
        _this = self.ereg
        return _hx_AnonObject({'pos': _this.matchObj.start(), 'len': _this.
            matchObj.end() - _this.matchObj.start()})

    def substringAfterMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, _this.matchObj.end(),
            None)

    def substringBeforeMatch(self):
        if self.isMatch is None:
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern, self.str)
            self.isMatch = _this.matchObj is not None
        if not self.isMatch:
            return ''
        _this = self.ereg
        return HxString.substr(_this.matchObj.string, 0, _this.matchObj.start()
            )

    def _cloneEReg(self, _hx_from, pattern, options):
        clone = Type.createEmptyInstance(EReg)
        value = Reflect.field(_hx_from, 'pattern')
        setattr(clone, '_hx_' + 'pattern' if 'pattern' in python_Boot.
            keywords else '_hx_' + 'pattern' if ((len('pattern') > 2 and 
            ord('pattern'[0]) == 95) and ord('pattern'[1]) == 95) and ord(
            'pattern'[len('pattern') - 1]) != 95 else 'pattern', value)
        value = Reflect.field(_hx_from, 'global')
        setattr(clone, '_hx_' + 'global' if 'global' in python_Boot.
            keywords else '_hx_' + 'global' if ((len('global') > 2 and ord(
            'global'[0]) == 95) and ord('global'[1]) == 95) and ord(
            'global'[len('global') - 1]) != 95 else 'global', value)
        return clone

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.ereg = None
        _hx_o.isMatch = None
        _hx_o.str = None


class hx_strings_StringBuilder:
    _hx_class_name = 'hx.strings.StringBuilder'
    __slots__ = 'sb', 'pre', 'len', 'length'
    _hx_fields = ['sb', 'pre', 'len']
    _hx_methods = ['get_length', 'add', 'addChar', 'addAll', 'clear',
        'isEmpty', 'newLine', 'insert', 'insertChar', 'insertAll',
        'asOutput', 'toString']

    def __init__(self, initialContent=None):
        self.length = None
        self.len = 0
        self.pre = None
        self.sb = StringBuf()
        if initialContent is not None:
            self.add(initialContent)

    def get_length(self):
        return self.len

    def add(self, item):
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
        _hx_local_0.len
        return self

    def addChar(self, ch):
        _this = self.sb
        s = ''.join(map(chr, [ch]))
        _this.b.write(s)
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def addAll(self, items):
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_1 = self
            _hx_local_2 = _hx_local_1.len
            _hx_local_1.len = _hx_local_2 + (0 if item is None else len(item))
            _hx_local_1.len
        return self

    def clear(self):
        self.pre = None
        self.sb = StringBuf()
        self.len = 0
        return self

    def isEmpty(self):
        return self.len == 0

    def newLine(self):
        self.sb.b.write('\n')
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = _hx_local_1 + 1
        _hx_local_1
        return self

    def insert(self, pos, item):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.add(item)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            self.pre.insert(0, item)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + (0 if item is None else len(item))
            _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    self.pre.insert(i + 1, item)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + (0 if item is None else
                        len(item))
                    _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, item)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + (0 if item is None else
                        len(item))
                    _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        _hx_local_6 = self
        _hx_local_7 = _hx_local_6.len
        _hx_local_6.len = _hx_local_7 + (0 if item is None else len(item))
        _hx_local_6.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertChar(self, pos, ch):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addChar(ch)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            _this = self.pre
            x = ''.join(map(chr, [ch]))
            _this.insert(0, x)
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = _hx_local_1 + 1
            _hx_local_1
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    _this = self.pre
                    x = ''.join(map(chr, [ch]))
                    _this.insert(i + 1, x)
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = _hx_local_3 + 1
                    _hx_local_3
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    _this1 = self.pre
                    x1 = ''.join(map(chr, [ch]))
                    _this1.insert(i + 1, x1)
                    self.pre.insert(i + 2, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = _hx_local_5 + 1
                    _hx_local_5
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            self.addChar(ch)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        self.addChar(ch)
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def insertAll(self, pos, items):
        if pos < 0:
            raise haxe_Exception.thrown('[pos] must not be negative')
        if pos > self.len:
            raise haxe_Exception.thrown(
                '[pos] must not be greater than this.length')
        if pos == self.len:
            self.addAll(items)
            return self
        if pos == 0:
            if self.pre is None:
                self.pre = []
            i = len(items)
            while True:
                tmp = i
                i = i - 1
                if not tmp > 0:
                    break
                item = items[i] if i >= 0 and i < len(items) else None
                self.pre.insert(0, item)
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.len
                _hx_local_0.len = _hx_local_1 + (0 if item is None else len
                    (item))
                _hx_local_0.len
            return self
        pre_len = 0
        if self.pre is not None:
            i = len(self.pre)
            _g = 0
            _g1 = len(self.pre)
            while _g < _g1:
                i = _g
                _g = _g + 1
                _hx_str = self.pre[i] if i >= 0 and i < len(self.pre) else None
                next_pre_len = pre_len + (0 if _hx_str is None else len(
                    _hx_str))
                if next_pre_len == pos:
                    j = len(items)
                    while True:
                        tmp = j
                        j = j - 1
                        if not tmp > 0:
                            break
                        item = items[j] if j >= 0 and j < len(items) else None
                        self.pre.insert(i + 1, item)
                        _hx_local_2 = self
                        _hx_local_3 = _hx_local_2.len
                        _hx_local_2.len = _hx_local_3 + (0 if item is None else
                            len(item))
                        _hx_local_2.len
                    return self
                if next_pre_len > pos:
                    preSplitted = hx_strings_Strings.splitAt(self.pre[i] if
                        i >= 0 and i < len(self.pre) else None, [pos - pre_len]
                        )
                    python_internal_ArrayImpl._set(self.pre, i, preSplitted
                        [0] if 0 < len(preSplitted) else None)
                    self.pre.insert(i + 1, preSplitted[1] if 1 < len(
                        preSplitted) else None)
                    j1 = len(items)
                    while True:
                        tmp1 = j1
                        j1 = j1 - 1
                        if not tmp1 > 0:
                            break
                        item1 = items[j1] if j1 >= 0 and j1 < len(items
                            ) else None
                        self.pre.insert(i + 1, item1)
                        _hx_local_4 = self
                        _hx_local_5 = _hx_local_4.len
                        _hx_local_4.len = _hx_local_5 + (0 if item1 is None
                             else len(item1))
                        _hx_local_4.len
                    return self
                pre_len = next_pre_len
        if self.sb.get_length() == 0:
            _g = 0
            while _g < len(items):
                item = items[_g] if _g >= 0 and _g < len(items) else None
                _g = _g + 1
                self.add(item)
            return self
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(), [pos -
            pre_len])
        self.sb = StringBuf()
        _this = self.sb
        s = Std.string(sbSplitted[0] if 0 < len(sbSplitted) else None)
        _this.b.write(s)
        _g = 0
        while _g < len(items):
            item = items[_g] if _g >= 0 and _g < len(items) else None
            _g = _g + 1
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            _hx_local_8 = self
            _hx_local_9 = _hx_local_8.len
            _hx_local_8.len = _hx_local_9 + (0 if item is None else len(item))
            _hx_local_8.len
        _this = self.sb
        s = Std.string(sbSplitted[1] if 1 < len(sbSplitted) else None)
        _this.b.write(s)
        return self

    def asOutput(self):
        return hx_strings__StringBuilder_OutputWrapper(self)

    def toString(self):
        if self.pre is None:
            return self.sb.b.getvalue()
        _this = self.pre
        _hx_str = HxOverrides.stringOrNull(''.join([python_Boot.toString1(
            x1, '') for x1 in _this])) + HxOverrides.stringOrNull(self.sb.b
            .getvalue())
        self.clear()
        self.add(_hx_str)
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.pre = None
        _hx_o.len = None


class hx_strings__StringBuilder_OutputWrapper(haxe_io_Output):
    _hx_class_name = 'hx.strings._StringBuilder.OutputWrapper'
    __slots__ = 'sb', 'bo'
    _hx_fields = ['sb', 'bo']
    _hx_methods = ['flush', 'writeByte', 'writeString']
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output

    def __init__(self, sb):
        self.bo = None
        self.sb = sb

    def flush(self):
        if self.bo is not None and len(self.bo.b.b) > 0:
            self.sb.add(self.bo.getBytes().toString())

    def writeByte(self, c):
        if self.bo is None:
            self.bo = haxe_io_BytesOutput()
        self.bo.writeByte(c)

    def writeString(self, _hx_str, encoding=None):
        self.flush()
        self.sb.add(_hx_str)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.bo = None


class hx_strings_internal_OS:
    _hx_class_name = 'hx.strings.internal.OS'
    __slots__ = ()
    _hx_statics = ['isWindows']


class hx_strings_internal__Either3__Either3(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either3._Either3'
    _hx_constructs = ['a', 'b', 'c']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either3__Either3('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either3__Either3('b', 1, (v,))

    @staticmethod
    def c(v):
        return hx_strings_internal__Either3__Either3('c', 2, (v,))


class hx_strings_Strings:
    _hx_class_name = 'hx.strings.Strings'
    __slots__ = ()
    _hx_statics = ['REGEX_ANSI_ESC', 'REGEX_HTML_UNESCAPE',
        'REGEX_SPLIT_LINES', 'REGEX_REMOVE_XML_TAGS', 'POS_NOT_FOUND',
        'NEW_LINE_NIX', 'NEW_LINE_WIN', 'NEW_LINE', '_getNotFoundDefault',
        '_charCodeAt8Unsafe', '_splitAsciiWordsUnsafe', 'ansiToHtml',
        'appendIfMissing', 'base64Encode', 'base64Decode', 'charAt8',
        'charCodeAt8', 'compact', 'contains', 'containsOnly', 'containsAll',
        'containsAllIgnoreCase', 'containsAny', 'containsAnyIgnoreCase',
        'containsNone', 'containsNoneIgnoreCase', 'containsWhitespaces',
        'countMatches', 'countMatchesIgnoreCase', 'compare',
        'compareIgnoreCase', 'diff', 'diffAt', 'ellipsizeLeft',
        'ellipsizeMiddle', 'ellipsizeRight', 'endsWith', 'endsWithAny',
        'endsWithAnyIgnoreCase', 'endsWithIgnoreCase', 'equals',
        'equalsIgnoreCase', 'filter', 'filterChars', 'getFuzzyDistance',
        'getLevenshteinDistance', 'getLongestCommonSubstring', 'hashCode',
        'htmlDecode', 'htmlEncode', 'insertAt', 'ifBlank', 'ifEmpty',
        'ifNull', 'indentLines', 'indexOf8', 'isBlank', 'isDigits',
        'isEmpty', 'isNotBlank', 'isNotEmpty', 'isLowerCase', 'isUpperCase',
        'iterate', 'iterateChars', 'lastIndexOf8', 'length8', 'left',
        'lpad', 'map', 'prependIfMissing', 'quoteDouble', 'quoteSingle',
        'removeAfter', 'removeAfterLast', 'removeAfterIgnoreCase',
        'removeAfterLastIgnoreCase', 'removeAt', 'removeBefore',
        'removeBeforeLast', 'removeBeforeIgnoreCase',
        'removeBeforeLastIgnoreCase', 'removeAll', 'removeFirst',
        'removeFirstIgnoreCase', 'removeAnsi', 'removeLeading',
        'removeTags', 'removeTrailing', 'repeat', 'replaceAll',
        'replaceFirst', 'replaceFirstIgnoreCase', 'reverse', 'right',
        'rpad', 'split8', 'splitAt', 'splitEvery', 'splitLines',
        'startsWith', 'startsWithAny', 'startsWithAnyIgnoreCase',
        'startsWithIgnoreCase', 'substr8', 'substring8', 'substringAfter',
        'substringAfterIgnoreCase', 'substringBetween',
        'substringBetweenIgnoreCase', 'substringAfterLast',
        'substringAfterLastIgnoreCase', 'substringBefore',
        'substringBeforeIgnoreCase', 'substringBeforeLast',
        'substringBeforeLastIgnoreCase', 'toBool', 'toBytes', 'toChar',
        'toCharIterator', 'toChars', 'toPattern', 'toEReg', 'toFloat',
        'toHex', 'toInt', 'toLowerCase8', 'toLowerCaseFirstChar',
        'toLowerCamel', 'toLowerHyphen', 'toLowerUnderscore', 'toTitle',
        'toUpperCamel', 'toUpperUnderscore', 'toString', 'toUpperCase8',
        'toUpperCaseFirstChar', 'trim', 'trimRight', 'trimLeft',
        'trimLines', 'trimToNull', 'trimToEmpty', 'truncate', 'urlDecode',
        'urlEncode', 'wrap']

    @staticmethod
    def _getNotFoundDefault(_hx_str, notFoundDefault):
        notFoundDefault1 = notFoundDefault
        if notFoundDefault1 == 1:
            return None
        elif notFoundDefault1 == 2:
            return ''
        elif notFoundDefault1 == 3:
            return _hx_str
        else:
            pass

    @staticmethod
    def _charCodeAt8Unsafe(_hx_str, pos):
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def _splitAsciiWordsUnsafe(_hx_str):
        words = list()
        currentWord = hx_strings_StringBuilder()
        chars = hx_strings_Strings.toChars(_hx_str)
        _hx_len = len(chars)
        lastIndex = _hx_len - 1
        _g = 0
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = chars[i] if i >= 0 and i < len(chars) else None
            if ch > 64 and ch < 91 or ch > 96 and ch < 123:
                chNext = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                currentWord.addChar(ch)
                if chNext > 47 and chNext < 58:
                    x = currentWord.toString()
                    words.append(x)
                    currentWord.clear()
                elif ch in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    if (chNext in hx_strings__Char_Char_Impl_.
                        CHAR_CASE_MAPPER.mapU2L.h and len(chars) > i + 2):
                        if (not python_internal_ArrayImpl._get(chars, i + 2
                            ) in hx_strings__Char_Char_Impl_.
                            CHAR_CASE_MAPPER.mapU2L.h):
                            x1 = currentWord.toString()
                            words.append(x1)
                            currentWord.clear()
                elif chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h:
                    x2 = currentWord.toString()
                    words.append(x2)
                    currentWord.clear()
            elif ch > 47 and ch < 58:
                currentWord.addChar(ch)
                chNext1 = python_internal_ArrayImpl._get(chars, i + 1
                    ) if i < lastIndex else -1
                if not (chNext1 > 47 and chNext1 < 58):
                    x3 = currentWord.toString()
                    words.append(x3)
                    currentWord.clear()
            elif currentWord.len > 0:
                x4 = currentWord.toString()
                words.append(x4)
                currentWord.clear()
        if currentWord.len > 0:
            x = currentWord.toString()
            words.append(x)
        return words

    @staticmethod
    def ansiToHtml(_hx_str, renderMethod=None, initialState=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if renderMethod is None:
            renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
        styleOrClassAttribute = None
        styleOrClassAttribute1 = renderMethod.index
        if styleOrClassAttribute1 == 0:
            styleOrClassAttribute = 'style'
        elif styleOrClassAttribute1 == 1:
            styleOrClassAttribute = 'class'
        elif styleOrClassAttribute1 == 2:
            cb = renderMethod.params[0]
            styleOrClassAttribute = 'class'
        else:
            pass
        sb = hx_strings_StringBuilder()
        if initialState is not None and ((((initialState.fgcolor is not
            None or initialState.bgcolor is not None) or initialState.bold) or
            initialState.underline) or initialState.blink):
            sb.add('<span ' + ('null' if styleOrClassAttribute is None else
                styleOrClassAttribute) + '="').add(initialState.toCSS(
                renderMethod)).add('">')
        effectiveState = hx_strings_AnsiState(initialState)
        strLenMinus1 = (0 if _hx_str is None else len(_hx_str)) - 1
        i = -1
        lookAhead = hx_strings_StringBuilder()
        while i < strLenMinus1:
            i = i + 1
            ch = HxString.charCodeAt(_hx_str, i)
            if (ch == 27 and i < strLenMinus1) and HxString.charCodeAt(_hx_str,
                i + 1) == 91:
                lookAhead.clear()
                currentState = hx_strings_AnsiState(effectiveState)
                currentGraphicModeParam = 0
                isValidEscapeSequence = False
                i = i + 1
                while i < strLenMinus1:
                    i = i + 1
                    ch2 = HxString.charCodeAt(_hx_str, i)
                    lookAhead.addChar(ch2)
                    ch21 = ch2
                    if ch21 == 48:
                        currentGraphicModeParam = currentGraphicModeParam * 10
                    elif ch21 == 49:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 1)
                    elif ch21 == 50:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 2)
                    elif ch21 == 51:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 3)
                    elif ch21 == 52:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 4)
                    elif ch21 == 53:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 5)
                    elif ch21 == 54:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 6)
                    elif ch21 == 55:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 7)
                    elif ch21 == 56:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 8)
                    elif ch21 == 57:
                        currentGraphicModeParam = (currentGraphicModeParam *
                            10 + 9)
                    elif ch21 == 59:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        currentGraphicModeParam = 0
                    elif ch21 == 109:
                        currentState.setGraphicModeParameter(
                            currentGraphicModeParam)
                        if (((effectiveState.fgcolor is not None or 
                            effectiveState.bgcolor is not None) or
                            effectiveState.bold) or effectiveState.underline
                            ) or effectiveState.blink:
                            sb.add('</span>')
                        if (((currentState.fgcolor is not None or 
                            currentState.bgcolor is not None) or
                            currentState.bold) or currentState.underline
                            ) or currentState.blink:
                            sb.add('<span ' + ('null' if 
                                styleOrClassAttribute is None else
                                styleOrClassAttribute) + '="').add(currentState
                                .toCSS(renderMethod)).add('">')
                        effectiveState = currentState
                        isValidEscapeSequence = True
                        break
                    else:
                        break
                if not isValidEscapeSequence:
                    sb.addChar(27).add('[').add(Std.string(lookAhead))
            else:
                sb.addChar(ch)
        if (((effectiveState.fgcolor is not None or effectiveState.bgcolor
             is not None) or effectiveState.bold) or effectiveState.underline
            ) or effectiveState.blink:
            sb.add('</span>')
        return sb.toString()

    @staticmethod
    def appendIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if _hx_str is None else _hx_str) + ('null' if 
                suffix is None else suffix)
        if hx_strings_Strings.endsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if _hx_str is None else _hx_str) + ('null' if suffix is
            None else suffix)

    @staticmethod
    def base64Encode(plain):
        if plain is None:
            return None
        return haxe_crypto_Base64.encode(None if plain is None else
            haxe_io_Bytes.ofString(plain))

    @staticmethod
    def base64Decode(encoded):
        if encoded is None:
            return None
        return haxe_crypto_Base64.decode(encoded).toString()

    @staticmethod
    def charAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = ''
        if ((_hx_str is None or len(_hx_str) == 0) or pos < 0) or pos >= (0 if
            _hx_str is None else len(_hx_str)):
            return resultIfOutOfBound
        if pos < 0 or pos >= len(_hx_str):
            return ''
        else:
            return _hx_str[pos]

    @staticmethod
    def charCodeAt8(_hx_str, pos, resultIfOutOfBound=None):
        if resultIfOutOfBound is None:
            resultIfOutOfBound = -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        if (strLen == 0 or pos < 0) or pos >= strLen:
            return resultIfOutOfBound
        return HxString.charCodeAt(_hx_str, pos)

    @staticmethod
    def compact(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        needWhiteSpace = False
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            char = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if char > 8 and char < 14 or char == 32:
                if sb.len != 0:
                    needWhiteSpace = True
                continue
            elif needWhiteSpace:
                sb.addChar(32)
                needWhiteSpace = False
            sb.addChar(char)
        return sb.toString()

    @staticmethod
    def contains(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor == '':
            return True
        startIndex = None
        return (searchIn.find(searchFor) if startIndex is None else
            HxString.indexOfImpl(searchIn, searchFor, startIndex)) > -1

    @staticmethod
    def containsOnly(searchIn, allowedChars):
        if searchIn is None or len(searchIn) == 0:
            return True
        if allowedChars is None:
            return False
        allowedCharsArray = None
        _g = allowedChars
        allowedCharsArray1 = _g.index
        if allowedCharsArray1 == 0:
            _hx_str = _g.params[0]
            allowedCharsArray = hx_strings_Strings.toChars(_hx_str)
        elif allowedCharsArray1 == 1:
            chars = _g.params[0]
            allowedCharsArray = chars
        else:
            pass
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if python_internal_ArrayImpl.indexOf(allowedCharsArray, ch, None
                ) < 0:
                return False
        return True

    @staticmethod
    def containsAll(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAllIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if not tmp:
                return False
        return True

    @staticmethod
    def containsAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            tmp = None
            if searchIn is None or candidate is None:
                tmp = False
            elif candidate == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(candidate) if startIndex is None else
                    HxString.indexOfImpl(searchIn, candidate, startIndex)) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = searchIn.lower()
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            searchFor1 = candidate.lower()
            tmp = None
            if searchIn is None or searchFor1 is None:
                tmp = False
            elif searchFor1 == '':
                tmp = True
            else:
                startIndex = None
                tmp = (searchIn.find(searchFor1) if startIndex is None else
                    HxString.indexOfImpl(searchIn, searchFor1, startIndex)
                    ) > -1
            if tmp:
                return True
        return False

    @staticmethod
    def containsNone(searchIn, searchFor):
        return not hx_strings_Strings.containsAny(searchIn, searchFor)

    @staticmethod
    def containsNoneIgnoreCase(searchIn, searchFor):
        return not hx_strings_Strings.containsAnyIgnoreCase(searchIn, searchFor
            )

    @staticmethod
    def containsWhitespaces(searchIn):
        if searchIn is None:
            return False
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                return True
        return False

    @staticmethod
    def countMatches(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def countMatchesIgnoreCase(searchIn, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if ((searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0)) or startAt >= len(searchIn):
            return 0
        if startAt < 0:
            startAt = 0
        searchIn = searchIn.lower()
        searchFor = searchFor.lower()
        count = 0
        foundAt = startAt - 1 if startAt > -1 else 0
        while True:
            startIndex = foundAt + 1
            foundAt = searchIn.find(searchFor
                ) if startIndex is None else HxString.indexOfImpl(searchIn,
                searchFor, startIndex)
            if not foundAt > -1:
                break
            count = count + 1
        return count

    @staticmethod
    def compare(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def compareIgnoreCase(_hx_str, other):
        if _hx_str is None:
            if other is None:
                return 0
            else:
                return -1
        if other is None:
            if _hx_str is None:
                return 0
            else:
                return 1
        _hx_str = hx_strings_Strings.toLowerCase8(_hx_str)
        other = hx_strings_Strings.toLowerCase8(other)
        if _hx_str > other:
            return 1
        elif _hx_str == other:
            return 0
        else:
            return -1

    @staticmethod
    def diff(left, right):
        diff = hx_strings_StringDiff()
        diff.at = hx_strings_Strings.diffAt(left, right)
        diff.left = hx_strings_Strings.substr8(left, diff.at)
        diff.right = hx_strings_Strings.substr8(right, diff.at)
        return diff

    @staticmethod
    def diffAt(_hx_str, other):
        if _hx_str == other:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        otherLen = 0 if other is None else len(other)
        if strLen == 0 or otherLen == 0:
            return 0
        checkLen = otherLen if strLen > otherLen else strLen
        _g = 0
        _g1 = checkLen
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxString.charCodeAt(_hx_str, i) != HxString.charCodeAt(other, i
                ):
                return i
        return checkLen

    @staticmethod
    def ellipsizeLeft(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        return ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str, 
            maxLength - ellipsisLen))

    @staticmethod
    def ellipsizeMiddle(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        maxStrLen = maxLength - ellipsisLen
        leftLen = Math.floor(maxStrLen / 2 + 0.5)
        rightLen = maxStrLen - leftLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= leftLen else hx_strings_Strings.substring8(
            _hx_str, 0, leftLen)) + ('null' if ellipsis is None else ellipsis
            ) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,
            rightLen))

    @staticmethod
    def ellipsizeRight(_hx_str, maxLength, ellipsis=None):
        if ellipsis is None:
            ellipsis = '...'
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        ellipsisLen = 0 if ellipsis is None else len(ellipsis)
        if maxLength < ellipsisLen:
            raise haxe_Exception.thrown(
                '[maxLength] must not be smaller than ' + Std.string(
                ellipsisLen))
        _hx_len = maxLength - ellipsisLen
        return HxOverrides.stringOrNull(_hx_str if (0 if _hx_str is None else
            len(_hx_str)) <= _hx_len else hx_strings_Strings.substring8(
            _hx_str, 0, _hx_len)) + ('null' if ellipsis is None else ellipsis)

    @staticmethod
    def endsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return searchIn.endswith(searchFor)

    @staticmethod
    def endsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                candidate):
                return True
        return False

    @staticmethod
    def endsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.endsWith(searchIn,
                hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def endsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        return hx_strings_Strings.endsWith(searchIn.lower(), searchFor.lower())

    @staticmethod
    def equals(_hx_str, other):
        return _hx_str == other

    @staticmethod
    def equalsIgnoreCase(_hx_str, other):
        return hx_strings_Strings.toLowerCase8(_hx_str
            ) == hx_strings_Strings.toLowerCase8(other)

    @staticmethod
    def filter(_hx_str, _hx_filter, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = list(filter(_hx_filter, hx_strings_Strings.split8(_hx_str,
            [separator])))
        return separator.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def filterChars(_hx_str, _hx_filter):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(ch):
            return ''.join(map(chr, [ch]))
        _this = list(map(_hx_local_0, list(filter(_hx_filter,
            hx_strings_Strings.toChars(_hx_str)))))
        return ''.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def getFuzzyDistance(left, right):
        if (left is None or len(left) == 0) or (right is None or len(right) ==
            0):
            return 0
        left = hx_strings_Strings.toLowerCase8(left)
        right = hx_strings_Strings.toLowerCase8(right)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftLastMatchAt = -100
        rightLastMatchAt = -100
        score = 0
        _g = 0
        _g1 = len(leftChars)
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            leftChar = leftChars[leftIdx] if leftIdx >= 0 and leftIdx < len(
                leftChars) else None
            _g2 = rightLastMatchAt + 1 if rightLastMatchAt > -1 else 0
            _g3 = len(rightChars)
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                rightChar = rightChars[rightIdx
                    ] if rightIdx >= 0 and rightIdx < len(rightChars) else None
                if leftChar == rightChar:
                    score = score + 1
                    if (leftLastMatchAt == leftIdx - 1 and rightLastMatchAt ==
                        rightIdx - 1):
                        score = score + 2
                    leftLastMatchAt = leftIdx
                    rightLastMatchAt = rightIdx
                    break
        return score

    @staticmethod
    def getLevenshteinDistance(left, right):
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0:
            return rightLen
        if rightLen == 0:
            return leftLen
        if leftLen > rightLen:
            tmp = left
            left = right
            right = tmp
            tmpLen = leftLen
            leftLen = rightLen
            rightLen = tmpLen
        prevCosts = list()
        costs = list()
        _g = 0
        _g1 = leftLen + 1
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            prevCosts.append(leftIdx)
            costs.append(0)
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)

        def _hx_local_0(a, b):
            if a > b:
                return b
            else:
                return a
        _hx_min = _hx_local_0
        _g = 1
        _g1 = rightLen + 1
        while _g < _g1:
            rightIdx = _g
            _g = _g + 1
            rightChar = python_internal_ArrayImpl._get(rightChars, rightIdx - 1
                )
            python_internal_ArrayImpl._set(costs, 0, rightIdx)
            _g2 = 1
            _g3 = leftLen + 1
            while _g2 < _g3:
                leftIdx = _g2
                _g2 = _g2 + 1
                leftIdxMinus1 = leftIdx - 1
                cost = 0 if (leftChars[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(leftChars) else None
                    ) == rightChar else 1
                python_internal_ArrayImpl._set(costs, leftIdx, _hx_min(
                    _hx_min((costs[leftIdxMinus1] if leftIdxMinus1 >= 0 and
                    leftIdxMinus1 < len(costs) else None) + 1, (prevCosts[
                    leftIdx] if leftIdx >= 0 and leftIdx < len(prevCosts) else
                    None) + 1), (prevCosts[leftIdxMinus1] if leftIdxMinus1 >=
                    0 and leftIdxMinus1 < len(prevCosts) else None) + cost))
            tmp = prevCosts
            prevCosts = costs
            costs = tmp
        return prevCosts[leftLen] if leftLen >= 0 and leftLen < len(prevCosts
            ) else None

    @staticmethod
    def getLongestCommonSubstring(left, right):
        if left is None or right is None:
            return None
        leftLen = 0 if left is None else len(left)
        rightLen = 0 if right is None else len(right)
        if leftLen == 0 or rightLen == 0:
            return ''
        leftChars = hx_strings_Strings.toChars(left)
        rightChars = hx_strings_Strings.toChars(right)
        leftSubStartAt = 0
        leftSubLen = 0
        _g = 0
        _g1 = leftLen
        while _g < _g1:
            leftIdx = _g
            _g = _g + 1
            _g2 = 0
            _g3 = rightLen
            while _g2 < _g3:
                rightIdx = _g2
                _g2 = _g2 + 1
                currLen = 0
                while python_internal_ArrayImpl._get(leftChars, leftIdx +
                    currLen) == python_internal_ArrayImpl._get(rightChars, 
                    rightIdx + currLen):
                    currLen = currLen + 1
                    if (leftIdx + currLen >= leftLen or rightIdx + currLen >=
                        rightLen):
                        break
                if currLen > leftSubLen:
                    leftSubLen = currLen
                    leftSubStartAt = leftIdx
        return hx_strings_Strings.substr8(left, leftSubStartAt, leftSubLen)

    @staticmethod
    def hashCode(_hx_str, algo=None):
        if _hx_str is None or len(_hx_str) == 0:
            return 0
        if algo is None:
            algo = hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC
        if algo is None:
            return hash(_hx_str)
        else:
            tmp = algo.index
            if tmp == 1:
                return haxe_crypto_Adler32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 2:
                return haxe_crypto_Crc32.make(None if _hx_str is None else
                    haxe_io_Bytes.ofString(_hx_str))
            elif tmp == 3:
                hc = 5381
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 + hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 ^ ch) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 4:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = ((((hc << 5) + 2 ** 31) % 2 ** 32 - 2 ** 31 - hc +
                        2 ** 31) % 2 ** 32 - 2 ** 31 + ch + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31
                return hc
            elif tmp == 5:
                hc = 0
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while _g < len(_g1):
                    ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                    _g = _g + 1
                    hc = (((((hc << 6) + 2 ** 31) % 2 ** 32 - 2 ** 31 + (((
                        hc << 16) + 2 ** 31) % 2 ** 32 - 2 ** 31) + 2 ** 31
                        ) % 2 ** 32 - 2 ** 31 - hc + 2 ** 31) % 2 ** 32 - 2 **
                        31 + ch + 2 ** 31) % 2 ** 32 - 2 ** 31
                return hc
            else:
                return hash(_hx_str)

    @staticmethod
    def htmlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        _this = hx_strings_Strings.REGEX_HTML_UNESCAPE

        def _hx_local_2():

            def _hx_local_1(m):
                match = m.matched()
                match1 = match
                _hx_local_0 = len(match1)
                if _hx_local_0 == 5:
                    if match1 == '&amp;':
                        return '&'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 4:
                    if match1 == '&gt;':
                        return '>'
                    elif match1 == '&lt;':
                        return '<'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                elif _hx_local_0 == 6:
                    if match1 == '&apos;':
                        return "'"
                    elif match1 == '&nbsp;':
                        return ' '
                    elif match1 == '&quot;':
                        return '"'
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(
                            match, 2, (0 if match is None else len(match)) - 3)
                            )
                        return ''.join(map(chr, [this1]))
                else:
                    this1 = Std.parseInt(hx_strings_Strings.substr8(match, 
                        2, (0 if match is None else len(match)) - 3))
                    return ''.join(map(chr, [this1]))
            return hx_strings__Pattern_MatcherImpl(_this.ereg, _this.
                pattern, _this.options, _hx_str).map(_hx_local_1)
        return _hx_local_2()

    @staticmethod
    def htmlEncode(_hx_str, escapeQuotes=None):
        if escapeQuotes is None:
            escapeQuotes = False
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        isFirstSpace = True
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            ch = HxString.charCodeAt(_hx_str, i)
            ch1 = ch
            if ch1 == 32:
                if isFirstSpace:
                    sb.add(' ')
                    isFirstSpace = False
                else:
                    sb.add('&nbsp;')
            elif ch1 == 34:
                sb.add('&quot;' if escapeQuotes else '"')
            elif ch1 == 38:
                sb.add('&amp;')
            elif ch1 == 39:
                sb.add('&#039;' if escapeQuotes else "'")
            elif ch1 == 60:
                sb.add('&lt;')
            elif ch1 == 62:
                sb.add('&gt;')
            elif ch > 127:
                sb.add('&#').add(Std.string(ch)).add(';')
            else:
                sb.addChar(ch)
            if ch != 32:
                isFirstSpace = True
        return sb.toString()

    @staticmethod
    def insertAt(_hx_str, pos, insertion):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0 or pos > strLen:
            raise haxe_Exception.thrown(
                'Absolute value of [pos] must be <= str.length')
        if insertion is None or len(insertion) == 0:
            return _hx_str
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + Std.string(insertion
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, pos))

    @staticmethod
    def ifBlank(_hx_str, fallback):
        if True if _hx_str is None else len(StringTools.trim(_hx_str)) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifEmpty(_hx_str, fallback):
        if _hx_str is None or len(_hx_str) == 0:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifNull(_hx_str, fallback):
        if _hx_str is None:
            return fallback
        else:
            return _hx_str

    @staticmethod
    def indentLines(_hx_str, indentWith):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0 or (indentWith is None or len(indentWith) == 0):
            return _hx_str
        isFirstLine = True
        sb = hx_strings_StringBuilder()
        _g = 0
        _g1 = hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)
        while _g < len(_g1):
            line = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if isFirstLine:
                isFirstLine = False
            else:
                sb.newLine()
            sb.add(indentWith)
            sb.add(line)
        return sb.toString()

    @staticmethod
    def indexOf8(_hx_str, searchFor, startAt=None):
        if startAt is None:
            startAt = 0
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt < 0:
            startAt = 0
        if searchForLen == 0:
            if startAt == 0:
                return 0
            if startAt > 0 and startAt < strLen:
                return startAt
            return strLen
        if startAt >= strLen:
            return -1
        if startAt is None:
            return _hx_str.find(searchFor)
        else:
            return HxString.indexOfImpl(_hx_str, searchFor, startAt)

    @staticmethod
    def isBlank(_hx_str):
        if _hx_str is None:
            return True
        else:
            return len(StringTools.trim(_hx_str)) == 0

    @staticmethod
    def isDigits(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            this1 = HxString.charCodeAt(_hx_str, i)
            if not (this1 > 47 and this1 < 58):
                return False
        return True

    @staticmethod
    def isEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) == 0
        else:
            return True

    @staticmethod
    def isNotBlank(_hx_str):
        if _hx_str is not None:
            return len(StringTools.trim(_hx_str)) > 0
        else:
            return False

    @staticmethod
    def isNotEmpty(_hx_str):
        if _hx_str is not None:
            return len(_hx_str) > 0
        else:
            return False

    @staticmethod
    def isLowerCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toLowerCase8(_hx_str)

    @staticmethod
    def isUpperCase(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        return _hx_str == hx_strings_Strings.toUpperCase8(_hx_str)

    @staticmethod
    def iterate(_hx_str, callback, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = hx_strings_Strings.split8(_hx_str, [separator])
        while _g < len(_g1):
            sub = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            callback(sub)

    @staticmethod
    def iterateChars(_hx_str, callback):
        if _hx_str is None or len(_hx_str) == 0:
            return
        _g = 0
        _g1 = 0 if _hx_str is None else len(_hx_str)
        while _g < _g1:
            i = _g
            _g = _g + 1
            callback(HxString.charCodeAt(_hx_str, i))

    @staticmethod
    def lastIndexOf8(_hx_str, searchFor, startAt=None):
        if _hx_str is None or searchFor is None:
            return -1
        strLen = 0 if _hx_str is None else len(_hx_str)
        searchForLen = 0 if searchFor is None else len(searchFor)
        if startAt is None:
            startAt = strLen
        if searchForLen == 0:
            if startAt < 0:
                return 0
            if startAt > strLen:
                return strLen
            return startAt
        if startAt < 0:
            return -1
        elif startAt >= strLen:
            startAt = strLen - 1
        strNeedsUTF8Workaround = len(_hx_str) != strLen
        searchForNeedsUTF8Workaround = len(searchFor) != searchForLen
        if searchForNeedsUTF8Workaround and not strNeedsUTF8Workaround:
            return -1
        searchForChars = hx_strings_Strings.toChars(searchFor)
        startAt = startAt + (searchForLen - 1)
        searchForPosToCheck = searchForLen - 1
        strPos = strLen
        while True:
            tmp = strPos
            strPos = strPos - 1
            if not tmp > 0:
                break
            if strPos > startAt:
                continue
            strCh = HxString.charCodeAt(_hx_str, strPos)
            if strCh == (searchForChars[searchForPosToCheck] if 
                searchForPosToCheck >= 0 and searchForPosToCheck < len(
                searchForChars) else None):
                if searchForPosToCheck == 0:
                    return strPos
                searchForPosToCheck = searchForPosToCheck - 1
            else:
                searchForPosToCheck = searchForLen - 1
        return -1

    @staticmethod
    def length8(_hx_str):
        if _hx_str is None:
            return 0
        return len(_hx_str)

    @staticmethod
    def left(_hx_str, _hx_len):
        if (0 if _hx_str is None else len(_hx_str)) <= _hx_len:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, 0, _hx_len)

    @staticmethod
    def lpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        sb = [_hx_str]
        padLen = 0 if padStr is None else len(padStr)
        while strLen < targetLength:
            sb.insert(0, padStr)
            strLen = strLen + padLen
        if canOverflow:
            return ''.join([python_Boot.toString1(x1, '') for x1 in sb])
        return hx_strings_Strings.right(''.join([python_Boot.toString1(x1,
            '') for x1 in sb]), targetLength)

    @staticmethod
    def map(_hx_str, mapper, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if separator is None:
            raise haxe_Exception.thrown('[separator] must not be null')
        return list(map(mapper, hx_strings_Strings.split8(_hx_str, [
            separator])))

    @staticmethod
    def prependIfMissing(_hx_str, suffix):
        if _hx_str is None:
            return None
        if len(_hx_str) == 0:
            return ('null' if suffix is None else suffix) + ('null' if 
                _hx_str is None else _hx_str)
        if hx_strings_Strings.startsWith(_hx_str, suffix):
            return _hx_str
        return ('null' if suffix is None else suffix) + ('null' if _hx_str is
            None else _hx_str)

    @staticmethod
    def quoteDouble(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return '""'
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find('"') if startIndex is None else HxString.
                indexOfImpl(_hx_str, '"', startIndex)) > -1
        if not tmp:
            return '"' + ('null' if _hx_str is None else _hx_str) + '"'
        return '"' + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, '"', '\\"')) + '"'

    @staticmethod
    def quoteSingle(_hx_str):
        if _hx_str is None:
            return _hx_str
        if len(_hx_str) == 0:
            return "''"
        tmp = None
        if _hx_str is None:
            tmp = False
        else:
            startIndex = None
            tmp = (_hx_str.find("'") if startIndex is None else HxString.
                indexOfImpl(_hx_str, "'", startIndex)) > -1
        if not tmp:
            return "'" + ('null' if _hx_str is None else _hx_str) + "'"
        return "'" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll
            (_hx_str, "'", "\\'")) + "'"

    @staticmethod
    def removeAfter(_hx_str, searchFor):
        return hx_strings_Strings.substringBefore(_hx_str, searchFor)

    @staticmethod
    def removeAfterLast(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLast(_hx_str, searchFor)

    @staticmethod
    def removeAfterIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeAfterLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringBeforeLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAt(_hx_str, pos, length):
        if (_hx_str is None or len(_hx_str) == 0) or length < 1:
            return _hx_str
        strLen = 0 if _hx_str is None else len(_hx_str)
        if pos < 0:
            pos = strLen + pos
        if pos < 0:
            raise haxe_Exception.thrown(
                '[pos] must be smaller than -1 * str.length')
        if pos + length >= strLen:
            return hx_strings_Strings.substring8(_hx_str, 0, pos)
        return HxOverrides.stringOrNull(hx_strings_Strings.substring8(
            _hx_str, 0, pos)) + HxOverrides.stringOrNull(hx_strings_Strings
            .substring8(_hx_str, pos + length))

    @staticmethod
    def removeBefore(_hx_str, searchFor):
        return hx_strings_Strings.substringAfter(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLast(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLast(_hx_str, searchFor)

    @staticmethod
    def removeBeforeIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterIgnoreCase(_hx_str, searchFor)

    @staticmethod
    def removeBeforeLastIgnoreCase(_hx_str, searchFor):
        return hx_strings_Strings.substringAfterLastIgnoreCase(_hx_str,
            searchFor)

    @staticmethod
    def removeAll(searchIn, searchFor):
        return hx_strings_Strings.replaceAll(searchIn, searchFor, '')

    @staticmethod
    def removeFirst(searchIn, searchFor):
        return hx_strings_Strings.replaceFirst(searchIn, searchFor, '')

    @staticmethod
    def removeFirstIgnoreCase(searchIn, searchFor):
        return hx_strings_Strings.replaceFirstIgnoreCase(searchIn,
            searchFor, '')

    @staticmethod
    def removeAnsi(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.REGEX_ANSI_ESC.ereg.replace(_hx_str, '')

    @staticmethod
    def removeLeading(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.startsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, len(searchFor), len(
                searchIn))
        return searchIn

    @staticmethod
    def removeTags(xml):
        if xml is None or len(xml) == 0:
            return xml
        return hx_strings_Strings.REGEX_REMOVE_XML_TAGS.ereg.replace(xml, '')

    @staticmethod
    def removeTrailing(searchIn, searchFor):
        if (searchIn is None or len(searchIn) == 0) or (searchFor is None or
            len(searchFor) == 0):
            return searchIn
        while hx_strings_Strings.endsWith(searchIn, searchFor):
            searchIn = HxString.substring(searchIn, 0, len(searchIn) - len(
                searchFor))
        return searchIn

    @staticmethod
    def repeat(_hx_str, count, separator=None):
        if separator is None:
            separator = ''
        if _hx_str is None:
            return None
        if count < 1:
            return ''
        if count == 1:
            return _hx_str
        _g = []
        _g1 = 0
        _g2 = count
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            _g.append(_hx_str)
        return separator.join([python_Boot.toString1(x1, '') for x1 in _g])

    @staticmethod
    def replaceAll(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        return StringTools.replace(searchIn, searchFor, replaceWith)

    @staticmethod
    def replaceFirst(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn, searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def replaceFirstIgnoreCase(searchIn, searchFor, replaceWith):
        if (searchIn is None or (searchIn is None or len(searchIn) == 0)
            ) or searchFor is None:
            return searchIn
        if replaceWith is None:
            replaceWith = 'null'
        searchFor = searchFor.lower()
        foundAt = None
        if len(searchFor) == 0:
            if (0 if searchIn is None else len(searchIn)) > 1:
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn.lower(), searchFor)
        return HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,
            0, foundAt)) + ('null' if replaceWith is None else replaceWith
            ) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(
            searchIn, foundAt + (0 if searchFor is None else len(searchFor))))

    @staticmethod
    def reverse(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        chars = hx_strings_Strings.split8(_hx_str, [''])
        chars.reverse()
        return ''.join([python_Boot.toString1(x1, '') for x1 in chars])

    @staticmethod
    def right(_hx_str, _hx_len):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return hx_strings_Strings.substring8(_hx_str, (0 if _hx_str is None
             else len(_hx_str)) - _hx_len)

    @staticmethod
    def rpad(_hx_str, targetLength, padStr=None, canOverflow=None):
        if padStr is None:
            padStr = ' '
        if canOverflow is None:
            canOverflow = True
        strLen = 0 if _hx_str is None else len(_hx_str)
        if _hx_str is None or strLen > targetLength:
            return _hx_str
        if padStr is None or len(padStr) == 0:
            padStr = ' '
        padLen = 0 if padStr is None else len(padStr)
        sb = hx_strings_StringBuilder(_hx_str)
        while strLen < targetLength:
            sb.add(padStr)
            strLen = strLen + padLen
        if canOverflow:
            return sb.toString()
        _hx_str = sb.toString()
        if (0 if _hx_str is None else len(_hx_str)) <= targetLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, targetLength)

    @staticmethod
    def split8(_hx_str, separator, maxParts=None):
        if maxParts is None:
            maxParts = 0
        if _hx_str is None or separator is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []

        def _hx_local_0(s):
            return s is not None
        separators = list(filter(_hx_local_0, separator))
        if len(separators) == 0:
            return None
        if maxParts <= 0 and len(separators) == 1:
            delimiter = separators[0] if 0 < len(separators) else None
            if delimiter == '':
                return list(_hx_str)
            else:
                return _hx_str.split(delimiter)
        if python_internal_ArrayImpl.indexOf(separators, '', None) > -1:
            if maxParts <= 0:
                _g = []
                _g1 = 0
                _g2 = strLen
                while _g1 < _g2:
                    i = _g1
                    _g1 = _g1 + 1
                    x = HxString.substr(_hx_str, i, 1)
                    _g.append(x)
                return _g
            if maxParts > strLen:
                maxParts = strLen
            maxParts = maxParts - 1
            _g = []
            _g1 = 0
            _g2 = maxParts
            while _g1 < _g2:
                i = _g1
                _g1 = _g1 + 1
                x = HxString.substr(_hx_str, i, 1)
                _g.append(x)
            result = _g
            x = HxString.substr(_hx_str, maxParts, strLen - maxParts)
            result.append(x)
            return result
        _g = []
        _g1 = 0
        while _g1 < len(separators):
            sep = separators[_g1] if _g1 >= 0 and _g1 < len(separators
                ) else None
            _g1 = _g1 + 1
            x = 0 if sep is None else len(sep)
            _g.append(x)
        separatorsLengths = _g
        lastFoundAt = 0
        result = []
        resultCount = 0
        while True:
            separatorLen = 0
            foundAt = -1
            _g = 0
            _g1 = len(separators)
            while _g < _g1:
                i = _g
                _g = _g + 1
                sepFoundAt = hx_strings_Strings.indexOf8(_hx_str, 
                    separators[i] if i >= 0 and i < len(separators) else
                    None, lastFoundAt)
                if sepFoundAt != -1:
                    if foundAt == -1 or sepFoundAt < foundAt:
                        foundAt = sepFoundAt
                        separatorLen = separatorsLengths[i
                            ] if i >= 0 and i < len(separatorsLengths
                            ) else None
            resultCount = resultCount + 1
            if foundAt == -1 or resultCount == maxParts:
                x = HxString.substr(_hx_str, lastFoundAt, strLen - lastFoundAt)
                result.append(x)
                break
            x1 = HxString.substr(_hx_str, lastFoundAt, foundAt - lastFoundAt)
            result.append(x1)
            lastFoundAt = foundAt + separatorLen
        return result

    @staticmethod
    def splitAt(_hx_str, splitPos):
        if _hx_str is None:
            return None
        if splitPos is None or len(splitPos) == 0:
            return [_hx_str]
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return [_hx_str]
        pos = list()
        _g = 0
        _g1 = splitPos
        while _g < len(_g1):
            p = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if p < 0:
                p = strLen + p
            if p < 0 or p >= strLen:
                continue
            if python_internal_ArrayImpl.indexOf(pos, p, None) > -1:
                continue
            pos.append(p)

        def _hx_local_1(a, b):
            if a < b:
                return -1
            elif a > b:
                return 1
            else:
                return 0
        pos.sort(key=python_lib_Functools.cmp_to_key(_hx_local_1))
        result = list()
        lastPos = 0
        _g = 0
        while _g < len(pos):
            p = pos[_g] if _g >= 0 and _g < len(pos) else None
            _g = _g + 1
            chunk = hx_strings_Strings.substring8(_hx_str, lastPos, p)
            if chunk is not None and len(chunk) > 0:
                result.append(chunk)
            lastPos = p
        chunk = hx_strings_Strings.substring8(_hx_str, lastPos)
        if chunk is not None and len(chunk) > 0:
            result.append(chunk)
        return result

    @staticmethod
    def splitEvery(_hx_str, count):
        if _hx_str is None:
            return None
        if count < 1:
            raise haxe_Exception.thrown('[count] must be greater than 0')
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0 or count >= strLen:
            return [_hx_str]
        result = list()
        pos = 0
        while True:
            chunk = hx_strings_Strings.substr8(_hx_str, pos, count)
            pos = pos + count
            if chunk is None or len(chunk) == 0:
                break
            result.append(chunk)
        return result

    @staticmethod
    def splitLines(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return []
        else:
            return hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)

    @staticmethod
    def startsWith(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if (searchFor is None or len(searchFor) == 0) or searchIn == searchFor:
            return True
        return searchIn.startswith(searchFor)

    @staticmethod
    def startsWithAny(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , candidate):
                return True
        return False

    @staticmethod
    def startsWithAnyIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        _g = 0
        while _g < len(searchFor):
            candidate = searchFor[_g] if _g >= 0 and _g < len(searchFor
                ) else None
            _g = _g + 1
            if candidate is not None and hx_strings_Strings.startsWith(searchIn
                , hx_strings_Strings.toLowerCase8(candidate)):
                return True
        return False

    @staticmethod
    def startsWithIgnoreCase(searchIn, searchFor):
        if searchIn is None or searchFor is None:
            return False
        if searchFor is None or len(searchFor) == 0:
            return True
        return hx_strings_Strings.startsWith(searchIn.lower(), searchFor.
            lower())

    @staticmethod
    def substr8(_hx_str, startAt, _hx_len=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if _hx_len is None:
            _hx_len = 0 if _hx_str is None else len(_hx_str)
        if _hx_len <= 0:
            return ''
        if startAt < 0:
            startAt = startAt + (0 if _hx_str is None else len(_hx_str))
            if startAt < 0:
                startAt = 0
        return HxString.substr(_hx_str, startAt, _hx_len)

    @staticmethod
    def substring8(_hx_str, startAt, endAt=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if endAt is None:
            endAt = 0 if _hx_str is None else len(_hx_str)
        return HxString.substring(_hx_str, startAt, endAt)

    @staticmethod
    def substringAfter(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBetween(_hx_str, after, before=None, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAfterAt = _hx_str.find(after
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = _hx_str.find(before
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringBetweenIgnoreCase(_hx_str, after, before=None,
        notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if before is None:
            before = after
        if (_hx_str == '' or (after is None or len(after) == 0)) or (before is
            None or len(before) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        strLower = hx_strings_Strings.toLowerCase8(_hx_str)
        after = hx_strings_Strings.toLowerCase8(after)
        before = hx_strings_Strings.toLowerCase8(before)
        startIndex = None
        foundAfterAt = strLower.find(after
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            after, startIndex)
        if foundAfterAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = foundAfterAt + len(after)
        foundBeforeAt = strLower.find(before
            ) if startIndex is None else HxString.indexOfImpl(strLower,
            before, startIndex)
        if foundBeforeAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAfterAt + len(after),
            foundBeforeAt)

    @staticmethod
    def substringAfterLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringAfterLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, foundAt + len(searchFor), None)

    @staticmethod
    def substringBefore(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = _hx_str.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_hx_str,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeIgnoreCase(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = _this.find(searchFor
            ) if startIndex is None else HxString.indexOfImpl(_this,
            searchFor, startIndex)
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLast(_hx_str, searchFor, notFoundDefault=None):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif searchFor == '':
            length = len(_hx_str)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _hx_str.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def substringBeforeLastIgnoreCase(_hx_str, searchFor, notFoundDefault=None
        ):
        if notFoundDefault is None:
            notFoundDefault = 2
        if _hx_str is None:
            return None
        if _hx_str == '' or (searchFor is None or len(searchFor) == 0):
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        searchFor = searchFor.lower()
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if startIndex is None:
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif searchFor == '':
            length = len(_this)
            if startIndex < 0:
                startIndex = length + startIndex
                if startIndex < 0:
                    startIndex = 0
            foundAt = length if startIndex > length else startIndex
        else:
            i = _this.rfind(searchFor, 0, startIndex + 1)
            startLeft = max(0, startIndex + 1 - len(searchFor)
                ) if i == -1 else i + 1
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = check if check > i and check <= startIndex else i
        if foundAt == -1:
            notFoundDefault1 = notFoundDefault
            if notFoundDefault1 == 1:
                return None
            elif notFoundDefault1 == 2:
                return ''
            elif notFoundDefault1 == 3:
                return _hx_str
            else:
                pass
        return HxString.substring(_hx_str, 0, foundAt)

    @staticmethod
    def toBool(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return False
        _g = _hx_str.lower()
        _hx_local_0 = len(_g)
        if _hx_local_0 == 1:
            if _g == '0':
                return False
            else:
                return True
        elif _hx_local_0 == 5:
            if _g == 'false':
                return False
            else:
                return True
        elif _hx_local_0 == 2:
            if _g == 'no':
                return False
            else:
                return True
        else:
            return True

    @staticmethod
    def toBytes(_hx_str):
        if _hx_str is None:
            return None
        return haxe_io_Bytes.ofString(_hx_str)

    @staticmethod
    def toChar(charCode):
        return charCode

    @staticmethod
    def toCharIterator(_hx_str):
        if _hx_str is None:
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        else:
            return hx_strings__CharIterator_StringCharIterator(_hx_str, 0)

    @staticmethod
    def toChars(_hx_str):
        if _hx_str is None:
            return None
        strLen = 0 if _hx_str is None else len(_hx_str)
        if strLen == 0:
            return []
        _g = []
        _g1 = 0
        _g2 = strLen
        while _g1 < _g2:
            i = _g1
            _g1 = _g1 + 1
            x = HxString.charCodeAt(_hx_str, i)
            _g.append(x)
        return _g

    @staticmethod
    def toPattern(_hx_str, options=None):
        if _hx_str is None:
            return None
        return hx_strings_Pattern.compile(_hx_str, options)

    @staticmethod
    def toEReg(_hx_str, opt=None):
        if opt is None:
            opt = ''
        if _hx_str is None:
            return None
        return EReg(_hx_str, opt)

    @staticmethod
    def toFloat(_hx_str, ifUnparseable=None):
        result = Std.parseFloat(_hx_str)
        if python_lib_Math.isnan(result):
            return ifUnparseable
        return result

    @staticmethod
    def toHex(num, minDigits=None, upperCase=None):
        if minDigits is None:
            minDigits = 0
        if upperCase is None:
            upperCase = True
        hexed = StringTools.hex(num, 0)
        if not upperCase:
            return hexed.lower()
        if len(hexed) >= minDigits:
            return hexed
        return hx_strings_Strings.lpad(hexed, minDigits, '0')

    @staticmethod
    def toInt(_hx_str, ifUnparseable=None):
        result = Std.parseInt(_hx_str)
        if result is None:
            return ifUnparseable
        return result

    @staticmethod
    def toLowerCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.lower()

    @staticmethod
    def toLowerCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(
            this1, None)
        firstChar = this1 if lowerChar is None else lowerChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def toLowerCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return hx_strings_Strings.toLowerCaseFirstChar(sb.toString())

    @staticmethod
    def toLowerHyphen(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '-'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toLowerUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toTitle(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if keepUppercasedWords:

            def _hx_local_0(s):
                if hx_strings_Strings.toUpperCase8(s) == s:
                    return s
                else:
                    return hx_strings_Strings.toUpperCaseFirstChar(
                        hx_strings_Strings.toLowerCase8(s))
            _this = list(map(_hx_local_0, hx_strings_Strings.
                _splitAsciiWordsUnsafe(_hx_str)))
            return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

        def _hx_local_1(s):
            return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings
                .toLowerCase8(s))
        _this = list(map(_hx_local_1, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return ' '.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toUpperCamel(_hx_str, keepUppercasedWords=None):
        if keepUppercasedWords is None:
            keepUppercasedWords = True
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        sb = hx_strings_StringBuilder()
        if keepUppercasedWords:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while _g < len(_g1):
                word = _g1[_g] if _g >= 0 and _g < len(_g1) else None
                _g = _g + 1
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(
                    hx_strings_Strings.toLowerCase8(word)))
        return sb.toString()

    @staticmethod
    def toUpperUnderscore(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(s):
            return hx_strings_Strings.toUpperCase8(s)
        _this = list(map(_hx_local_0, hx_strings_Strings.
            _splitAsciiWordsUnsafe(_hx_str)))
        return '_'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def toString(_hx_str):
        if _hx_str is None:
            return 'null'
        else:
            return _hx_str

    @staticmethod
    def toUpperCase8(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return _hx_str.upper()

    @staticmethod
    def toUpperCaseFirstChar(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        this1 = HxString.charCodeAt(_hx_str, 0)
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(
            this1, None)
        firstChar = this1 if upperChar is None else upperChar
        if len(_hx_str) == 1:
            return ''.join(map(chr, [firstChar]))
        other = hx_strings_Strings.substr8(_hx_str, 1)
        return HxOverrides.stringOrNull(''.join(map(chr, [firstChar]))) + (
            'null' if other is None else other)

    @staticmethod
    def trim(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.trim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        this1 = hx_strings_internal__Either2__Either2.b(removableChars)
        this2 = hx_strings_internal__Either2__Either2.b(removableChars)
        return hx_strings_Strings.trimLeft(hx_strings_Strings.trimRight(
            _hx_str, this1), this2)

    @staticmethod
    def trimRight(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        if charsToRemove is None:
            return StringTools.rtrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = _hx_len - 1
        while True:
            tmp = None
            if i > -1:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i - 1
        if i < _hx_len - 1:
            return hx_strings_Strings.substring8(_hx_str, 0, i + 1)
        return _hx_str

    @staticmethod
    def trimLeft(_hx_str, charsToRemove=None):
        if _hx_str is None:
            return _hx_str
        if charsToRemove is None:
            return StringTools.ltrim(_hx_str)
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        if removableChars1 == 0:
            str1 = _g.params[0]
            removableChars = hx_strings_Strings.toChars(str1)
        elif removableChars1 == 1:
            chars = _g.params[0]
            removableChars = chars
        else:
            pass
        if len(removableChars) == 0:
            return _hx_str
        _hx_len = 0 if _hx_str is None else len(_hx_str)
        i = 0
        while True:
            tmp = None
            if i < _hx_len:
                str1 = hx_strings_Strings.charAt8(_hx_str, i)
                strLen = 0 if str1 is None else len(str1)
                tmp = python_internal_ArrayImpl.indexOf(removableChars, -1 if
                    strLen == 0 or 0 >= strLen else HxString.charCodeAt(
                    str1, 0), None) > -1
            else:
                tmp = False
            if not tmp:
                break
            i = i + 1
        if i > 0:
            return hx_strings_Strings.substring8(_hx_str, i, _hx_len)
        return _hx_str

    @staticmethod
    def trimLines(_hx_str, charsToRemove=None):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str

        def _hx_local_0(line):
            return hx_strings_Strings.trim(line, charsToRemove)
        _this = list(map(_hx_local_0, hx_strings_Strings.REGEX_SPLIT_LINES.
            ereg.split(_hx_str)))
        return '\n'.join([python_Boot.toString1(x1, '') for x1 in _this])

    @staticmethod
    def trimToNull(_hx_str):
        if _hx_str is None:
            return None
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return None
        return trimmed

    @staticmethod
    def trimToEmpty(_hx_str):
        trimmed = hx_strings_Strings.trim(_hx_str)
        if trimmed is None or len(trimmed) == 0:
            return ''
        return trimmed

    @staticmethod
    def truncate(_hx_str, maxLength):
        if (0 if _hx_str is None else len(_hx_str)) <= maxLength:
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str, 0, maxLength)

    @staticmethod
    def urlDecode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.unquote(_hx_str)

    @staticmethod
    def urlEncode(_hx_str):
        if _hx_str is None or len(_hx_str) == 0:
            return _hx_str
        return python_lib_urllib_Parse.quote(_hx_str, '')

    @staticmethod
    def wrap(_hx_str, maxLineLength, splitLongWords=None, newLineSeparator=None
        ):
        if splitLongWords is None:
            splitLongWords = True
        if newLineSeparator is None:
            newLineSeparator = '\n'
        if (0 if _hx_str is None else len(_hx_str)
            ) <= maxLineLength or maxLineLength < 1:
            return _hx_str
        sb = hx_strings_StringBuilder()
        wordChars = []
        currLineLength = 0
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while _g < len(_g1):
            ch = _g1[_g] if _g >= 0 and _g < len(_g1) else None
            _g = _g + 1
            if ch > 8 and ch < 14 or ch == 32:
                if len(wordChars) > 0:
                    _g2 = 0
                    while _g2 < len(wordChars):
                        wordCh = wordChars[_g2] if _g2 >= 0 and _g2 < len(
                            wordChars) else None
                        _g2 = _g2 + 1
                        if currLineLength == maxLineLength and splitLongWords:
                            sb.add(newLineSeparator)
                            currLineLength = 0
                        currLineLength = currLineLength + 1
                        sb.addChar(wordCh)
                    wordChars = []
                if currLineLength >= maxLineLength:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                sb.addChar(ch)
                currLineLength = currLineLength + 1
            else:
                wordChars.append(ch)
        if len(wordChars) > 0:
            _g = 0
            while _g < len(wordChars):
                wordCh = wordChars[_g] if _g >= 0 and _g < len(wordChars
                    ) else None
                _g = _g + 1
                if currLineLength == maxLineLength and splitLongWords:
                    sb.add(newLineSeparator)
                    currLineLength = 0
                currLineLength = currLineLength + 1
                sb.addChar(wordCh)
        return sb.toString()


class hx_strings_StringDiff:
    _hx_class_name = 'hx.strings.StringDiff'
    __slots__ = 'at', 'left', 'right'
    _hx_fields = ['at', 'left', 'right']
    _hx_methods = ['toString']

    def __init__(self):
        self.right = None
        self.left = None
        self.at = None

    def toString(self):
        return 'StringDiff[at=' + Std.string(self.at
            ) + ', left=' + HxOverrides.stringOrNull(self.left
            ) + ', right=' + HxOverrides.stringOrNull(self.right) + ']'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.at = None
        _hx_o.left = None
        _hx_o.right = None


class hx_strings_HashCodeAlgorithm(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.HashCodeAlgorithm'
    _hx_constructs = ['PLATFORM_SPECIFIC', 'ADLER32', 'CRC32B', 'DJB2A',
        'JAVA', 'SDBM']


<mask token>


class hx_strings_AnsiToHtmlRenderMethod(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.AnsiToHtmlRenderMethod'
    _hx_constructs = ['StyleAttributes', 'CssClasses', 'CssClassesCallback']

    @staticmethod
    def CssClassesCallback(func):
        return hx_strings_AnsiToHtmlRenderMethod('CssClassesCallback', 2, (
            func,))


<mask token>


class hx_strings_AnsiState:
    _hx_class_name = 'hx.strings.AnsiState'
    __slots__ = 'bgcolor', 'blink', 'bold', 'fgcolor', 'underline'
    _hx_fields = ['bgcolor', 'blink', 'bold', 'fgcolor', 'underline']
    _hx_methods = ['isActive', 'reset', 'copyFrom',
        'setGraphicModeParameter', 'toCSS']
    _hx_statics = ['defaultCssClassesCallback']

    def __init__(self, copyFrom=None):
        self.underline = None
        self.fgcolor = None
        self.bold = None
        self.blink = None
        self.bgcolor = None
        if copyFrom is None:
            self.reset()
        else:
            self.copyFrom(copyFrom)

    def isActive(self):
        if not (((self.fgcolor is not None or self.bgcolor is not None) or
            self.bold) or self.underline):
            return self.blink
        else:
            return True

    def reset(self):
        self.fgcolor = None
        self.bgcolor = None
        self.bold = False
        self.underline = False
        self.blink = False

    def copyFrom(self, other):
        self.fgcolor = other.fgcolor
        self.bgcolor = other.bgcolor
        self.bold = other.bold
        self.underline = other.underline
        self.blink = other.blink

    def setGraphicModeParameter(self, param):
        param1 = param
        if param1 == 0:
            self.reset()
        elif param1 == 1:
            self.bold = True
        elif param1 == 4:
            self.underline = True
        elif param1 == 5:
            self.blink = True
        elif param1 == 30:
            self.fgcolor = 'black'
        elif param1 == 31:
            self.fgcolor = 'red'
        elif param1 == 32:
            self.fgcolor = 'green'
        elif param1 == 33:
            self.fgcolor = 'yellow'
        elif param1 == 34:
            self.fgcolor = 'blue'
        elif param1 == 35:
            self.fgcolor = 'magenta'
        elif param1 == 36:
            self.fgcolor = 'cyan'
        elif param1 == 37:
            self.fgcolor = 'white'
        elif param1 == 40:
            self.bgcolor = 'black'
        elif param1 == 41:
            self.bgcolor = 'red'
        elif param1 == 42:
            self.bgcolor = 'green'
        elif param1 == 43:
            self.bgcolor = 'yellow'
        elif param1 == 44:
            self.bgcolor = 'blue'
        elif param1 == 45:
            self.bgcolor = 'magenta'
        elif param1 == 46:
            self.bgcolor = 'cyan'
        elif param1 == 47:
            self.bgcolor = 'white'
        else:
            pass

    def toCSS(self, renderMethod):
        if (((self.fgcolor is not None or self.bgcolor is not None) or self
            .bold) or self.underline) or self.blink:
            sb = hx_strings_StringBuilder()
            if renderMethod is None:
                renderMethod = (hx_strings_AnsiToHtmlRenderMethod.
                    StyleAttributes)
            tmp = renderMethod.index
            if tmp == 0:
                if self.fgcolor is not None:
                    sb.add('color:').add(self.fgcolor).add(';')
                if self.bgcolor is not None:
                    sb.add('background-color:').add(self.bgcolor).add(';')
                if self.bold:
                    sb.add('font-weight:bold;')
                if self.underline:
                    sb.add('text-decoration:underline;')
                if self.blink:
                    sb.add('text-decoration:blink;')
            elif tmp == 1:
                sb.add(hx_strings_AnsiState.defaultCssClassesCallback(self))
            elif tmp == 2:
                func = renderMethod.params[0]
                sb.add(func(self))
            else:
                pass
            return sb.toString()
        return ''

    @staticmethod
    def defaultCssClassesCallback(state):
        classes = []
        if state.fgcolor is not None:
            x = 'ansi_fg_' + HxOverrides.stringOrNull(state.fgcolor)
            classes.append(x)
        if state.bgcolor is not None:
            x = 'ansi_bg_' + HxOverrides.stringOrNull(state.bgcolor)
            classes.append(x)
        if state.bold:
            classes.append('ansi_bold')
        if state.underline:
            classes.append('ansi_underline')
        if state.blink:
            classes.append('ansi_blink')
        return ' '.join([python_Boot.toString1(x1, '') for x1 in classes])

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bgcolor = None
        _hx_o.blink = None
        _hx_o.bold = None
        _hx_o.fgcolor = None
        _hx_o.underline = None


class hx_strings_internal_Bits:
    _hx_class_name = 'hx.strings.internal.Bits'
    __slots__ = ()
    _hx_statics = ['clearBit', 'setBit', 'toggleBit', 'getBit']

    @staticmethod
    def clearBit(num, bitPos):
        return num & ~(1 << bitPos - 1)

    @staticmethod
    def setBit(num, bitPos):
        return num | 1 << bitPos - 1

    @staticmethod
    def toggleBit(num, bitPos):
        return num ^ 1 << bitPos - 1

    @staticmethod
    def getBit(num, bitPos):
        return 1 == num >> bitPos - 1 & 1


class hx_strings_internal__Either2_Either2_Impl_:
    _hx_class_name = 'hx.strings.internal._Either2.Either2_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either2__Either2.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either2__Either2.b(value)
        return this1


class hx_strings_internal__Either2__Either2(Enum):
    __slots__ = ()
    _hx_class_name = 'hx.strings.internal._Either2._Either2'
    _hx_constructs = ['a', 'b']

    @staticmethod
    def a(v):
        return hx_strings_internal__Either2__Either2('a', 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either2__Either2('b', 1, (v,))


class hx_strings_internal__Either3_Either3_Impl_:
    _hx_class_name = 'hx.strings.internal._Either3.Either3_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get_value', 'fromA', 'fromB', 'fromC']
    value = None

    @staticmethod
    def _new(value):
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        return this1

    @staticmethod
    def fromA(value):
        this1 = hx_strings_internal__Either3__Either3.a(value)
        return this1

    @staticmethod
    def fromB(value):
        this1 = hx_strings_internal__Either3__Either3.b(value)
        return this1

    @staticmethod
    def fromC(value):
        this1 = hx_strings_internal__Either3__Either3.c(value)
        return this1


class hx_strings_internal__OneOrMany_OneOrMany_Impl_:
    _hx_class_name = 'hx.strings.internal._OneOrMany.OneOrMany_Impl_'
    __slots__ = ()
    _hx_statics = ['fromSingle']

    @staticmethod
    def fromSingle(value):
        return [value]


class hx_strings_internal__RingBuffer_RingBuffer_Impl_:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBuffer_Impl_'
    __slots__ = ()
    _hx_statics = ['_new', 'get']

    @staticmethod
    def _new(size):
        this1 = hx_strings_internal__RingBuffer_RingBufferImpl(size)
        return this1

    @staticmethod
    def get(this1, index):
        return this1.get(index)


class hx_strings_internal__RingBuffer_RingBufferIterator:
    _hx_class_name = 'hx.strings.internal._RingBuffer.RingBufferIterator'
    __slots__ = 'buff', 'idx'
    _hx_fields = ['buff', 'idx']
    _hx_methods = ['hasNext', 'next']

    def __init__(self, buff):
        self.idx = -1
        self.buff = buff

    def hasNext(self):
        return self.idx + 1 < self.buff.length

    def next(self):
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.idx
        _hx_local_0.idx = _hx_local_1 + 1
        _hx_local_1
        return self.buff.get(self.idx)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buff = None
        _hx_o.idx = None


class python_HaxeIterator:
    _hx_class_name = 'python.HaxeIterator'
    __slots__ = 'it', 'x', 'has', 'checked'
    _hx_fields = ['it', 'x', 'has', 'checked']
    _hx_methods = ['next', 'hasNext']

    def __init__(self, it):
        self.checked = False
        self.has = False
        self.x = None
        self.it = it

    def next(self):
        if not self.checked:
            self.hasNext()
        self.checked = False
        return self.x

    def hasNext(self):
        if not self.checked:
            try:
                self.x = self.it.__next__()
                self.has = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),
                    StopIteration):
                    self.has = False
                    self.x = None
                else:
                    raise _g
            self.checked = True
        return self.has

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.it = None
        _hx_o.x = None
        _hx_o.has = None
        _hx_o.checked = None


class python_internal_ArrayImpl:
    _hx_class_name = 'python.internal.ArrayImpl'
    __slots__ = ()
    _hx_statics = ['concat', 'copy', 'iterator', 'keyValueIterator',
        'indexOf', 'lastIndexOf', 'join', 'toString', 'pop', 'push',
        'unshift', 'remove', 'contains', 'shift', 'slice', 'sort', 'splice',
        'map', 'filter', 'insert', 'reverse', '_get', '_set']

    @staticmethod
    def concat(a1, a2):
        return a1 + a2

    @staticmethod
    def copy(x):
        return list(x)

    @staticmethod
    def iterator(x):
        return python_HaxeIterator(x.__iter__())

    @staticmethod
    def keyValueIterator(x):
        return haxe_iterators_ArrayKeyValueIterator(x)

    @staticmethod
    def indexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (0 if fromIndex is None else _hx_len + fromIndex if fromIndex <
            0 else fromIndex)
        if l < 0:
            l = 0
        _g = l
        _g1 = _hx_len
        while _g < _g1:
            i = _g
            _g = _g + 1
            if HxOverrides.eq(a[i], x):
                return i
        return -1

    @staticmethod
    def lastIndexOf(a, x, fromIndex=None):
        _hx_len = len(a)
        l = (_hx_len if fromIndex is None else _hx_len + fromIndex + 1 if 
            fromIndex < 0 else fromIndex + 1)
        if l > _hx_len:
            l = _hx_len
        while True:
            l = l - 1
            tmp = l
            if not tmp > -1:
                break
            if HxOverrides.eq(a[l], x):
                return l
        return -1

    @staticmethod
    def join(x, sep):
        return sep.join([python_Boot.toString1(x1, '') for x1 in x])

    @staticmethod
    def toString(x):
        return '[' + HxOverrides.stringOrNull(','.join([python_Boot.
            toString1(x1, '') for x1 in x])) + ']'

    @staticmethod
    def pop(x):
        if len(x) == 0:
            return None
        else:
            return x.pop()

    @staticmethod
    def push(x, e):
        x.append(e)
        return len(x)

    @staticmethod
    def unshift(x, e):
        x.insert(0, e)

    @staticmethod
    def remove(x, e):
        try:
            x.remove(e)
            return True
        except BaseException as _g:
            return False

    @staticmethod
    def contains(x, e):
        return e in x

    @staticmethod
    def shift(x):
        if len(x) == 0:
            return None
        return x.pop(0)

    @staticmethod
    def slice(x, pos, end=None):
        return x[pos:end]

    @staticmethod
    def sort(x, f):
        x.sort(key=python_lib_Functools.cmp_to_key(f))

    @staticmethod
    def splice(x, pos, _hx_len):
        if pos < 0:
            pos = len(x) + pos
        if pos < 0:
            pos = 0
        res = x[pos:pos + _hx_len]
        del x[pos:pos + _hx_len]
        return res

    @staticmethod
    def map(x, f):
        return list(map(f, x))

    @staticmethod
    def filter(x, f):
        return list(filter(f, x))

    @staticmethod
    def insert(a, pos, x):
        a.insert(pos, x)

    @staticmethod
    def reverse(a):
        a.reverse()

    @staticmethod
    def _get(x, idx):
        if idx > -1 and idx < len(x):
            return x[idx]
        else:
            return None

    @staticmethod
    def _set(x, idx, v):
        l = len(x)
        while l < idx:
            x.append(None)
            l = l + 1
        if l == idx:
            x.append(v)
        else:
            x[idx] = v
        return v


class HxOverrides:
    _hx_class_name = 'HxOverrides'
    __slots__ = ()
    _hx_statics = ['eq', 'stringOrNull', 'rshift', 'modf', 'mod']

    @staticmethod
    def eq(a, b):
        if isinstance(a, list) or isinstance(b, list):
            return a is b
        return a == b

    @staticmethod
    def stringOrNull(s):
        if s is None:
            return 'null'
        else:
            return s

    @staticmethod
    def rshift(val, n):
        return val % 4294967296 >> n

    @staticmethod
    def modf(a, b):
        if b == 0.0:
            return float('nan')
        elif a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b

    @staticmethod
    def mod(a, b):
        if a < 0:
            if b < 0:
                return -(-a % -b)
            else:
                return -(-a % b)
        elif b < 0:
            return a % -b
        else:
            return a % b


class python_internal_MethodClosure:
    _hx_class_name = 'python.internal.MethodClosure'
    __slots__ = 'obj', 'func'
    _hx_fields = ['obj', 'func']
    _hx_methods = ['__call__']

    def __init__(self, obj, func):
        self.obj = obj
        self.func = func

    def __call__(self, *args):
        return self.func(self.obj, *args)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.obj = None
        _hx_o.func = None


class sys_io_File:
    _hx_class_name = 'sys.io.File'
    __slots__ = ()
    _hx_statics = ['getContent']

    @staticmethod
    def getContent(path):
        f = python_lib_Builtins.open(path, 'r', -1, 'utf-8', None, '')
        content = f.read(-1)
        f.close()
        return content


<mask token>

# Generated by Haxe 4.2.2
# coding: utf-8
import sys

import math as python_lib_Math
import math as Math
import inspect as python_lib_Inspect
import sys as python_lib_Sys
import traceback as python_lib_Traceback
import re as python_lib_Re
import builtins as python_lib_Builtins
import functools as python_lib_Functools
from io import StringIO as python_lib_io_StringIO
import urllib.parse as python_lib_urllib_Parse


class _hx_AnonObject:
    _hx_disable_getattr = False
    def __init__(self, fields):
        self.__dict__ = fields
    def __repr__(self):
        return repr(self.__dict__)
    def __contains__(self, item):
        return item in self.__dict__
    def __getitem__(self, item):
        return self.__dict__[item]
    def __getattr__(self, name):
        if (self._hx_disable_getattr):
            raise AttributeError('field does not exist')
        else:
            return None
    def _hx_hasattr(self,field):
        self._hx_disable_getattr = True
        try:
            getattr(self, field)
            self._hx_disable_getattr = False
            return True
        except AttributeError:
            self._hx_disable_getattr = False
            return False



class Enum:
    _hx_class_name = "Enum"
    __slots__ = ("tag", "index", "params")
    _hx_fields = ["tag", "index", "params"]
    _hx_methods = ["__str__"]

    def __init__(self,tag,index,params):
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:39
        self.tag = tag
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:40
        self.index = index
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:41
        self.params = params

    def __str__(self):
        # C:\HaxeToolkit\haxe\std/python/internal/EnumImpl.hx:46
        if (self.params is None):
            return self.tag
        else:
            return self.tag + '(' + (', '.join(str(v) for v in self.params)) + ')'

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.tag = None
        _hx_o.index = None
        _hx_o.params = None


class AstNode:
    _hx_class_name = "AstNode"
    __slots__ = ("isError",)
    _hx_fields = ["isError"]
    _hx_methods = ["getResultType", "getResult", "toString"]

    def __init__(self):
        # src/AstNode.hx:4
        self.isError = False

    def getResultType(self,context):
        # src/AstNode.hx:7
        return DataTypeInstance.fromData(self.getResult(context))

    def getResult(self,context):
        # src/AstNode.hx:11
        return Data.Nothing

    def toString(self):
        # src/AstNode.hx:15
        return "Default Node"

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.isError = None


class AstDataTypeNode(AstNode):
    _hx_class_name = "AstDataTypeNode"
    __slots__ = ("type", "dependencies")
    _hx_fields = ["type", "dependencies"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,_hx_type,dependencies = None):
        # src/AstNode.hx:20
        self.type = None
        # src/AstNode.hx:21
        self.dependencies = []
        # src/AstNode.hx:23
        super().__init__()
        # src/AstNode.hx:24
        self.type = _hx_type
        # src/AstNode.hx:25
        if (dependencies is not None):
            self.dependencies = dependencies

    def getResultType(self,context):
        # src/AstNode.hx:30
        instDependencies = []
        # src/AstNode.hx:31
        # src/AstNode.hx:31
        _g = 0
        _g1 = self.dependencies
        while (_g < len(_g1)):
            dependency = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # src/AstNode.hx:32
            # src/AstNode.hx:32
            _g2 = dependency.getResult(context)
            if (_g2.index == 0):
                # src/AstNode.hx:33
                dataType = _g2.params[0]
                # src/AstNode.hx:34
                instDependencies.append(dataType)
            else:
                # src/AstNode.hx:35
                exception = _g2
                # src/AstNode.hx:36
                raise haxe_Exception.thrown((("Cannot use " + Std.string(exception)) + " as a dependency"))
        # src/AstNode.hx:40
        return DataTypeInstance(self.type,instDependencies)

    def getResult(self,context):
        # src/AstNode.hx:44
        return Data.DType(self.getResultType(context))

    def toString(self):
        # src/AstNode.hx:48
        depString = ", DEPENDENCIES:"
        # src/AstNode.hx:49
        # src/AstNode.hx:49
        _g = 0
        _g1 = len(self.dependencies)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/AstNode.hx:50
            depString = (("null" if depString is None else depString) + HxOverrides.stringOrNull(((HxOverrides.stringOrNull((self.dependencies[i] if i >= 0 and i < len(self.dependencies) else None).toString()) + HxOverrides.stringOrNull(((", " if ((i < ((len(self.dependencies) - 1)))) else "")))))))
        # src/AstNode.hx:51
        return ((("(TYPE:" + HxOverrides.stringOrNull(self.type.identifier)) + HxOverrides.stringOrNull(((depString if ((len(self.dependencies) > 0)) else "")))) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.type = None
        _hx_o.dependencies = None


class AstNumbNode(AstNode):
    _hx_class_name = "AstNumbNode"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,value):
        # src/AstNode.hx:56
        self.value = None
        # src/AstNode.hx:58
        super().__init__()
        # src/AstNode.hx:59
        self.value = value

    def getResultType(self,context):
        # src/AstNode.hx:63
        return DataTypeInstance(DataTypes.TYPES.REAL)

    def getResult(self,context):
        # src/AstNode.hx:67
        return Data.Real(self.value)

    def toString(self):
        # src/AstNode.hx:71
        return ("NUMB:" + Std.string(self.value))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class AstStrNode(AstNode):
    _hx_class_name = "AstStrNode"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,value):
        # src/AstNode.hx:76
        self.value = None
        # src/AstNode.hx:78
        super().__init__()
        # src/AstNode.hx:79
        self.value = value

    def getResultType(self,context):
        # src/AstNode.hx:83
        return DataTypeInstance(DataTypes.TYPES.STRING)

    def getResult(self,context):
        # src/AstNode.hx:87
        return Data.Str(self.value)

    def toString(self):
        # src/AstNode.hx:91
        return ("STRING:" + HxOverrides.stringOrNull(self.value))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class AstBoolNode(AstNode):
    _hx_class_name = "AstBoolNode"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,value):
        # src/AstNode.hx:96
        self.value = None
        # src/AstNode.hx:98
        super().__init__()
        # src/AstNode.hx:99
        self.value = value

    def getResultType(self,context):
        # src/AstNode.hx:103
        return DataTypeInstance(DataTypes.TYPES.BOOL)

    def getResult(self,context):
        # src/AstNode.hx:107
        return Data.Boolean(self.value)

    def toString(self):
        # src/AstNode.hx:111
        return ("BOOL:" + Std.string(self.value))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None

class OpPair(Enum):
    __slots__ = ()
    _hx_class_name = "OpPair"
    _hx_constructs = ["Invalid", "RealReal", "StrStr", "StrReal", "RealStr", "BoolBool"]

    @staticmethod
    def RealReal(v1,v2):
        return OpPair("RealReal", 1, (v1,v2))

    @staticmethod
    def StrStr(v1,v2):
        return OpPair("StrStr", 2, (v1,v2))

    @staticmethod
    def StrReal(v1,v2):
        return OpPair("StrReal", 3, (v1,v2))

    @staticmethod
    def RealStr(v1,v2):
        return OpPair("RealStr", 4, (v1,v2))

    @staticmethod
    def BoolBool(v1,v2):
        return OpPair("BoolBool", 5, (v1,v2))
OpPair.Invalid = OpPair("Invalid", 0, ())


class AstBinOpNode(AstNode):
    _hx_class_name = "AstBinOpNode"
    __slots__ = ("left", "right", "operatorToken")
    _hx_fields = ["left", "right", "operatorToken"]
    _hx_methods = ["getResult", "getPair", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,left,right,operatorToken):
        # src/AstNode.hx:127
        self.operatorToken = None
        # src/AstNode.hx:126
        self.right = None
        # src/AstNode.hx:125
        self.left = None
        # src/AstNode.hx:129
        super().__init__()
        # src/AstNode.hx:130
        self.left = left
        # src/AstNode.hx:131
        self.right = right
        # src/AstNode.hx:132
        self.operatorToken = operatorToken

    def getResult(self,context):
        # src/AstNode.hx:136
        data1 = self.left.getResult(context)
        data2 = self.right.getResult(context)
        pair = None
        pair1 = data1.index
        if (pair1 == 2):
            float1 = data1.params[0]
            pair1 = data2.index
            if (pair1 == 2):
                float2 = data2.params[0]
                pair = OpPair.RealReal(float1,float2)
            elif (pair1 == 3):
                string = data2.params[0]
                pair = OpPair.RealStr(float1,string)
            else:
                pair = OpPair.Invalid
        elif (pair1 == 3):
            string1 = data1.params[0]
            pair1 = data2.index
            if (pair1 == 2):
                _hx_float = data2.params[0]
                pair = OpPair.StrReal(string1,_hx_float)
            elif (pair1 == 3):
                string2 = data2.params[0]
                pair = OpPair.StrStr(string1,string2)
            else:
                pair = OpPair.Invalid
        elif (pair1 == 4):
            bool1 = data1.params[0]
            if (data2.index == 4):
                bool2 = data2.params[0]
                pair = OpPair.BoolBool(bool1,bool2)
            else:
                pair = OpPair.Invalid
        else:
            pair = OpPair.Invalid
        # src/AstNode.hx:138
        # src/AstNode.hx:138
        tmp = self.operatorToken.index
        # src/AstNode.hx:140
        if (tmp == 6):
            if (pair.index == 1):
                # src/AstNode.hx:141
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:142
                return Data.Real(Math.pow(v1,v2))
        elif (tmp == 7):
            # src/AstNode.hx:146
            tmp = pair.index
            # src/AstNode.hx:147
            if (tmp == 1):
                # src/AstNode.hx:147
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:148
                return Data.Real((v1 + v2))
            elif (tmp == 2):
                # src/AstNode.hx:149
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:150
                return Data.Str((("null" if v1 is None else v1) + ("null" if v2 is None else v2)))
            elif (tmp == 3):
                # src/AstNode.hx:153
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:154
                return Data.Str((("" + ("null" if v1 is None else v1)) + Std.string(v2)))
            elif (tmp == 4):
                # src/AstNode.hx:151
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:152
                return Data.Str((("" + Std.string(v1)) + ("null" if v2 is None else v2)))
            else:
                pass
        elif (tmp == 8):
            if (pair.index == 1):
                # src/AstNode.hx:159
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:160
                return Data.Real((v1 - v2))
        elif (tmp == 9):
            if (pair.index == 1):
                # src/AstNode.hx:165
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:166
                return Data.Real((v1 * v2))
        elif (tmp == 10):
            if (pair.index == 1):
                # src/AstNode.hx:171
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:172
                return Data.Real((v1 / v2))
        elif (tmp == 11):
            if (pair.index == 1):
                # src/AstNode.hx:177
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:178
                return Data.Real(HxOverrides.modf(v1, v2))
        elif (tmp == 12):
            # src/AstNode.hx:182
            tmp = pair.index
            # src/AstNode.hx:183
            if (tmp == 1):
                # src/AstNode.hx:183
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:184
                return Data.Boolean((v1 == v2))
            elif (tmp == 2):
                # src/AstNode.hx:185
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:186
                return Data.Boolean((v1 == v2))
            elif (tmp == 5):
                # src/AstNode.hx:187
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:188
                return Data.Boolean((v1 == v2))
            else:
                pass
        elif (tmp == 13):
            # src/AstNode.hx:192
            tmp = pair.index
            # src/AstNode.hx:193
            if (tmp == 1):
                # src/AstNode.hx:193
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:194
                return Data.Boolean((v1 > v2))
            elif (tmp == 2):
                # src/AstNode.hx:195
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:196
                return Data.Boolean((v1 > v2))
            else:
                pass
        elif (tmp == 14):
            # src/AstNode.hx:208
            tmp = pair.index
            # src/AstNode.hx:209
            if (tmp == 1):
                # src/AstNode.hx:209
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:210
                return Data.Boolean((v1 < v2))
            elif (tmp == 2):
                # src/AstNode.hx:211
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:212
                return Data.Boolean((v1 < v2))
            else:
                pass
        elif (tmp == 15):
            # src/AstNode.hx:200
            tmp = pair.index
            # src/AstNode.hx:201
            if (tmp == 1):
                # src/AstNode.hx:201
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:202
                return Data.Boolean((v1 >= v2))
            elif (tmp == 2):
                # src/AstNode.hx:203
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:204
                return Data.Boolean((v1 >= v2))
            else:
                pass
        elif (tmp == 16):
            # src/AstNode.hx:216
            tmp = pair.index
            # src/AstNode.hx:217
            if (tmp == 1):
                # src/AstNode.hx:217
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:218
                return Data.Boolean((v1 <= v2))
            elif (tmp == 2):
                # src/AstNode.hx:219
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:220
                return Data.Boolean((v1 <= v2))
            else:
                pass
        elif (tmp == 17):
            if (pair.index == 5):
                # src/AstNode.hx:225
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:226
                return Data.Boolean((v1 and v2))
        elif (tmp == 18):
            if (pair.index == 5):
                # src/AstNode.hx:231
                v1 = pair.params[0]
                v2 = pair.params[1]
                # src/AstNode.hx:232
                return Data.Boolean((v1 or v2))
        else:
            pass
        # src/AstNode.hx:238
        return Data.Nothing

    def getPair(self,data1,data2):
        # src/AstNode.hx:242
        tmp = data1.index
        # src/AstNode.hx:243
        if (tmp == 2):
            # src/AstNode.hx:243
            float1 = data1.params[0]
            # src/AstNode.hx:244
            tmp = data2.index
            # src/AstNode.hx:245
            if (tmp == 2):
                # src/AstNode.hx:245
                float2 = data2.params[0]
                # src/AstNode.hx:246
                return OpPair.RealReal(float1,float2)
            elif (tmp == 3):
                # src/AstNode.hx:247
                string = data2.params[0]
                # src/AstNode.hx:248
                return OpPair.RealStr(float1,string)
            else:
                return OpPair.Invalid
        elif (tmp == 3):
            # src/AstNode.hx:252
            string1 = data1.params[0]
            # src/AstNode.hx:253
            tmp = data2.index
            # src/AstNode.hx:256
            if (tmp == 2):
                # src/AstNode.hx:256
                _hx_float = data2.params[0]
                # src/AstNode.hx:257
                return OpPair.StrReal(string1,_hx_float)
            elif (tmp == 3):
                # src/AstNode.hx:254
                string2 = data2.params[0]
                # src/AstNode.hx:255
                return OpPair.StrStr(string1,string2)
            else:
                return OpPair.Invalid
        elif (tmp == 4):
            # src/AstNode.hx:261
            bool1 = data1.params[0]
            # src/AstNode.hx:262
            if (data2.index == 4):
                # src/AstNode.hx:263
                bool2 = data2.params[0]
                # src/AstNode.hx:264
                return OpPair.BoolBool(bool1,bool2)
            else:
                return OpPair.Invalid
        else:
            return OpPair.Invalid

    def toString(self):
        # src/AstNode.hx:274
        tmp = (("(" + HxOverrides.stringOrNull(self.left.toString())) + " ")
        tokenType = self.operatorToken
        tmp1 = None
        tmp2 = tokenType.index
        if (tmp2 == 0):
            name = tokenType.params[0]
            tmp1 = ("IDENTIFIER:" + ("null" if name is None else name))
        elif (tmp2 == 1):
            _hx_type = tokenType.params[0]
            tmp1 = ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
        elif (tmp2 == 2):
            number = tokenType.params[0]
            tmp1 = ("REAL:" + Std.string(number))
        elif (tmp2 == 3):
            string = tokenType.params[0]
            tmp1 = ("TEXT:" + ("null" if string is None else string))
        elif (tmp2 == 4):
            _hx_bool = tokenType.params[0]
            tmp1 = ("BOOL:" + Std.string(_hx_bool))
        elif (tmp2 == 5):
            tmp1 = "="
        elif (tmp2 == 6):
            tmp1 = "^"
        elif (tmp2 == 7):
            tmp1 = "+"
        elif (tmp2 == 8):
            tmp1 = "-"
        elif (tmp2 == 9):
            tmp1 = "*"
        elif (tmp2 == 10):
            tmp1 = "/"
        elif (tmp2 == 11):
            tmp1 = "%"
        elif (tmp2 == 12):
            tmp1 = "=="
        elif (tmp2 == 13):
            tmp1 = ">"
        elif (tmp2 == 14):
            tmp1 = "<"
        elif (tmp2 == 15):
            tmp1 = ">="
        elif (tmp2 == 16):
            tmp1 = "<="
        elif (tmp2 == 17):
            tmp1 = "AND"
        elif (tmp2 == 18):
            tmp1 = "OR"
        elif (tmp2 == 19):
            tmp1 = "("
        elif (tmp2 == 20):
            tmp1 = ")"
        elif (tmp2 == 23):
            tmp1 = "["
        elif (tmp2 == 24):
            tmp1 = "]"
        elif (tmp2 == 25):
            tmp1 = ","
        elif (tmp2 == 26):
            tmp1 = "IF"
        elif (tmp2 == 27):
            tmp1 = "ELIF"
        elif (tmp2 == 28):
            tmp1 = "ELSE"
        elif (tmp2 == 29):
            tmp1 = ";"
        else:
            tmp1 = "Default Token"
        return ((((("null" if tmp is None else tmp) + ("null" if tmp1 is None else tmp1)) + " ") + HxOverrides.stringOrNull(self.right.toString())) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.left = None
        _hx_o.right = None
        _hx_o.operatorToken = None


class AstUnaryOpNode(AstNode):
    _hx_class_name = "AstUnaryOpNode"
    __slots__ = ("opToken", "node")
    _hx_fields = ["opToken", "node"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,opToken,node):
        # src/AstNode.hx:280
        self.node = None
        # src/AstNode.hx:279
        self.opToken = None
        # src/AstNode.hx:282
        super().__init__()
        # src/AstNode.hx:283
        self.opToken = opToken
        # src/AstNode.hx:284
        self.node = node

    def getResultType(self,context):
        # src/AstNode.hx:288
        return DataTypeInstance(DataTypes.TYPES.REAL)

    def getResult(self,context):
        # src/AstNode.hx:292
        r = self.node.getResult(context)
        # src/AstNode.hx:293
        number = None
        # src/AstNode.hx:295
        if (r.index == 2):
            # src/AstNode.hx:296
            _hx_float = r.params[0]
            # src/AstNode.hx:297
            number = _hx_float
        else:
            return Data.Nothing
        # src/AstNode.hx:302
        tmp = self.opToken.index
        # src/AstNode.hx:304
        if (tmp == 7):
            return Data.Real(number)
        elif (tmp == 8):
            return Data.Real(-number)
        else:
            return Data.Nothing

    def toString(self):
        # src/AstNode.hx:313
        tokenType = self.opToken
        tmp = None
        tmp1 = tokenType.index
        if (tmp1 == 0):
            name = tokenType.params[0]
            tmp = ("IDENTIFIER:" + ("null" if name is None else name))
        elif (tmp1 == 1):
            _hx_type = tokenType.params[0]
            tmp = ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
        elif (tmp1 == 2):
            number = tokenType.params[0]
            tmp = ("REAL:" + Std.string(number))
        elif (tmp1 == 3):
            string = tokenType.params[0]
            tmp = ("TEXT:" + ("null" if string is None else string))
        elif (tmp1 == 4):
            _hx_bool = tokenType.params[0]
            tmp = ("BOOL:" + Std.string(_hx_bool))
        elif (tmp1 == 5):
            tmp = "="
        elif (tmp1 == 6):
            tmp = "^"
        elif (tmp1 == 7):
            tmp = "+"
        elif (tmp1 == 8):
            tmp = "-"
        elif (tmp1 == 9):
            tmp = "*"
        elif (tmp1 == 10):
            tmp = "/"
        elif (tmp1 == 11):
            tmp = "%"
        elif (tmp1 == 12):
            tmp = "=="
        elif (tmp1 == 13):
            tmp = ">"
        elif (tmp1 == 14):
            tmp = "<"
        elif (tmp1 == 15):
            tmp = ">="
        elif (tmp1 == 16):
            tmp = "<="
        elif (tmp1 == 17):
            tmp = "AND"
        elif (tmp1 == 18):
            tmp = "OR"
        elif (tmp1 == 19):
            tmp = "("
        elif (tmp1 == 20):
            tmp = ")"
        elif (tmp1 == 23):
            tmp = "["
        elif (tmp1 == 24):
            tmp = "]"
        elif (tmp1 == 25):
            tmp = ","
        elif (tmp1 == 26):
            tmp = "IF"
        elif (tmp1 == 27):
            tmp = "ELIF"
        elif (tmp1 == 28):
            tmp = "ELSE"
        elif (tmp1 == 29):
            tmp = ";"
        else:
            tmp = "Default Token"
        return ((("(" + ("null" if tmp is None else tmp)) + HxOverrides.stringOrNull(self.node.toString())) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.opToken = None
        _hx_o.node = None


class AstVarAccessNode(AstNode):
    _hx_class_name = "AstVarAccessNode"
    __slots__ = ("variableName",)
    _hx_fields = ["variableName"]
    _hx_methods = ["getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,variableName):
        # src/AstNode.hx:318
        self.variableName = None
        # src/AstNode.hx:320
        super().__init__()
        # src/AstNode.hx:321
        self.variableName = variableName

    def getResult(self,context):
        # src/AstNode.hx:325
        variable = context.getVariable(self.variableName)
        # src/AstNode.hx:326
        if (variable is None):
            raise haxe_Exception.thrown("Trying to access variable that was never defined")
        # src/AstNode.hx:328
        return variable.value

    def toString(self):
        # src/AstNode.hx:332
        return ("VARIABLE:" + HxOverrides.stringOrNull(self.variableName))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.variableName = None


class AstAssignmentNode(AstNode):
    _hx_class_name = "AstAssignmentNode"
    __slots__ = ("variableName", "initType", "assignedTo")
    _hx_fields = ["variableName", "initType", "assignedTo"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,variableName,initType = None,assignedTo = None):
        # src/AstNode.hx:339
        self.assignedTo = None
        # src/AstNode.hx:338
        self.initType = None
        # src/AstNode.hx:337
        self.variableName = None
        # src/AstNode.hx:341
        super().__init__()
        # src/AstNode.hx:342
        self.variableName = variableName
        # src/AstNode.hx:343
        self.initType = initType
        # src/AstNode.hx:344
        self.assignedTo = assignedTo

    def getResultType(self,context):
        # src/AstNode.hx:348
        if (self.initType is not None):
            return self.initType.getResultType(context)
        # src/AstNode.hx:351
        variable = context.getVariable(self.variableName)
        # src/AstNode.hx:352
        if (variable is None):
            return DataTypeInstance(DataTypes.TYPES.DYNAMIC)
        # src/AstNode.hx:354
        return variable.typeInst

    def getResult(self,context):
        # src/AstNode.hx:358
        if (self.initType is not None):
            # src/AstNode.hx:359
            _g = self.initType.getResult(context)
            if (_g.index == 0):
                # src/AstNode.hx:360
                dataType = _g.params[0]
                # src/AstNode.hx:361
                value = (None if ((self.assignedTo is None)) else self.assignedTo.getResult(context))
                # src/AstNode.hx:362
                context.createVariable(self.variableName,dataType,value)
                # src/AstNode.hx:363
                if (value is None):
                    return Data.Nothing
                else:
                    return value
            else:
                return Data.Nothing
        else:
            # src/AstNode.hx:369
            variable = context.getVariable(self.variableName)
            # src/AstNode.hx:370
            if ((variable is None) or ((self.assignedTo is None))):
                return Data.Nothing
            # src/AstNode.hx:373
            value = self.assignedTo.getResult(context)
            # src/AstNode.hx:374
            context.setVariable(variable,value)
            # src/AstNode.hx:375
            return value

    def toString(self):
        # src/AstNode.hx:382
        return ((((("(ASSIGN:" + HxOverrides.stringOrNull(((("" + Std.string(self.initType)) if ((self.initType is not None)) else "")))) + " ") + HxOverrides.stringOrNull(self.variableName)) + HxOverrides.stringOrNull((((" = " + HxOverrides.stringOrNull(self.assignedTo.toString())) if ((self.assignedTo is not None)) else "")))) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.variableName = None
        _hx_o.initType = None
        _hx_o.assignedTo = None


class AstArrayAccessNode(AstNode):
    _hx_class_name = "AstArrayAccessNode"
    __slots__ = ("accessed", "index", "assign")
    _hx_fields = ["accessed", "index", "assign"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,accessed,index,assign = None):
        # src/AstNode.hx:389
        self.assign = None
        # src/AstNode.hx:388
        self.index = None
        # src/AstNode.hx:387
        self.accessed = None
        # src/AstNode.hx:391
        super().__init__()
        # src/AstNode.hx:392
        self.accessed = accessed
        # src/AstNode.hx:393
        self.index = index
        # src/AstNode.hx:394
        self.assign = assign

    def getResultType(self,context):
        # src/AstNode.hx:398
        t = self.accessed.getResultType(context)
        # src/AstNode.hx:399
        if (t.type.typeDependencies > 0):
            # src/AstNode.hx:399
            _this = self.accessed.getResultType(context)
            if (len(_this.dependencies) < 1):
                return None
            else:
                return (_this.dependencies[0] if 0 < len(_this.dependencies) else None)
        else:
            return DataTypeInstance(DataTypes.TYPES.DYNAMIC)

    def getResult(self,context):
        # src/AstNode.hx:403
        resultA = self.accessed.getResult(context)
        # src/AstNode.hx:404
        resultB = self.index.getResult(context)
        # src/AstNode.hx:406
        if (resultA.index == 5):
            # src/AstNode.hx:407
            _hx_type = resultA.params[0]
            _hx_list = resultA.params[1]
            # src/AstNode.hx:408
            if (resultB.index == 2):
                # src/AstNode.hx:409
                _hx_float = resultB.params[0]
                # src/AstNode.hx:410
                i = Math.floor(_hx_float)
                # src/AstNode.hx:411
                if (self.assign is None):
                    return (_hx_list[i] if i >= 0 and i < len(_hx_list) else None)
                else:
                    # src/AstNode.hx:414
                    if (not _hx_type.equals(self.assign.getResultType(context))):
                        raise haxe_Exception.thrown("Trying to set array value to invalid type")
                    # src/AstNode.hx:417
                    def _hx_local_1():
                        # src/AstNode.hx:417
                        def _hx_local_0():
                            # src/AstNode.hx:417
                            python_internal_ArrayImpl._set(_hx_list, i, self.assign.getResult(context))
                            return (_hx_list[i] if i >= 0 and i < len(_hx_list) else None)
                        return _hx_local_0()
                    return _hx_local_1()
        # src/AstNode.hx:424
        raise haxe_Exception.thrown("Invalid use of array access")

    def toString(self):
        # src/AstNode.hx:429
        return (((((("(" + HxOverrides.stringOrNull(self.accessed.toString())) + "[") + HxOverrides.stringOrNull(self.index.toString())) + "]") + HxOverrides.stringOrNull((((" = " + HxOverrides.stringOrNull(self.assign.toString())) if ((self.assign is not None)) else "")))) + ")")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.accessed = None
        _hx_o.index = None
        _hx_o.assign = None


class AstListNode(AstNode):
    _hx_class_name = "AstListNode"
    __slots__ = ("elementNodes",)
    _hx_fields = ["elementNodes"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,elementNodes):
        # src/AstNode.hx:434
        self.elementNodes = []
        # src/AstNode.hx:436
        super().__init__()
        # src/AstNode.hx:437
        self.elementNodes = elementNodes

    def getResultType(self,context):
        # src/AstNode.hx:442
        _hx_type = None
        # src/AstNode.hx:443
        if (len(self.elementNodes) > 0):
            # src/AstNode.hx:444
            _hx_type = (self.elementNodes[0] if 0 < len(self.elementNodes) else None).getResultType(context)
            # src/AstNode.hx:445
            # src/AstNode.hx:445
            _g = 0
            _g1 = self.elementNodes
            while (_g < len(_g1)):
                element = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # src/AstNode.hx:446
                if (not _hx_type.equals(element.getResultType(context))):
                    # src/AstNode.hx:447
                    _hx_type = None
                    # src/AstNode.hx:448
                    break
        # src/AstNode.hx:452
        if (_hx_type is None):
            _hx_type = DataTypeInstance(DataTypes.TYPES.DYNAMIC)
        # src/AstNode.hx:454
        return DataTypeInstance(DataTypes.TYPES.ARRAY_LIST,[_hx_type])

    def getResult(self,context):
        # src/AstNode.hx:458
        _this = self.getResultType(context)
        _hx_type = (None if ((len(_this.dependencies) < 1)) else (_this.dependencies[0] if 0 < len(_this.dependencies) else None))
        # src/AstNode.hx:459
        _g = []
        # src/AstNode.hx:460
        # src/AstNode.hx:460
        _g1 = 0
        _g2 = self.elementNodes
        while (_g1 < len(_g2)):
            element = (_g2[_g1] if _g1 >= 0 and _g1 < len(_g2) else None)
            _g1 = (_g1 + 1)
            # src/AstNode.hx:461
            # src/AstNode.hx:461
            x = element.getResult(context)
            _g.append(x)
        # src/AstNode.hx:459
        _hx_list = _g
        # src/AstNode.hx:463
        return Data.ArrayList(_hx_type,_hx_list)

    def toString(self):
        # src/AstNode.hx:467
        _hx_str = "["
        # src/AstNode.hx:468
        # src/AstNode.hx:468
        _g = 0
        _g1 = len(self.elementNodes)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/AstNode.hx:469
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull(((HxOverrides.stringOrNull((self.elementNodes[i] if i >= 0 and i < len(self.elementNodes) else None).toString()) + HxOverrides.stringOrNull(((", " if ((i < ((len(self.elementNodes) - 1)))) else "")))))))
        # src/AstNode.hx:471
        return (("null" if _hx_str is None else _hx_str) + "]")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.elementNodes = None


class AstIfChainNode(AstNode):
    _hx_class_name = "AstIfChainNode"
    __slots__ = ("cases", "elseCase")
    _hx_fields = ["cases", "elseCase"]
    _hx_methods = ["getResultType", "getResult", "toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = AstNode


    def __init__(self,cases,elseCase = None):
        # src/AstNode.hx:482
        self.elseCase = None
        # src/AstNode.hx:481
        self.cases = None
        # src/AstNode.hx:484
        super().__init__()
        # src/AstNode.hx:485
        self.cases = list(cases)
        # src/AstNode.hx:486
        self.elseCase = elseCase

    def getResultType(self,context):
        # src/AstNode.hx:490
        _hx_type = None
        # src/AstNode.hx:492
        allCases = list(self.cases)
        # src/AstNode.hx:493
        if (self.elseCase is not None):
            # src/AstNode.hx:494
            x = _hx_AnonObject({'condition': None, 'result': self.elseCase})
            allCases.append(x)
        # src/AstNode.hx:496
        if (len(allCases) > 0):
            # src/AstNode.hx:497
            _hx_type = (allCases[0] if 0 < len(allCases) else None).result.getResultType(context)
            # src/AstNode.hx:498
            # src/AstNode.hx:498
            _g = 0
            while (_g < len(allCases)):
                ifCase = (allCases[_g] if _g >= 0 and _g < len(allCases) else None)
                _g = (_g + 1)
                # src/AstNode.hx:499
                if (not _hx_type.equals(ifCase.result.getResultType(context))):
                    # src/AstNode.hx:500
                    _hx_type = None
                    # src/AstNode.hx:501
                    break
        # src/AstNode.hx:506
        if (_hx_type is None):
            _hx_type = DataTypeInstance(DataTypes.TYPES.DYNAMIC)
        # src/AstNode.hx:508
        return _hx_type

    def getResult(self,context):
        # src/AstNode.hx:512
        # src/AstNode.hx:512
        _g = 0
        _g1 = self.cases
        while (_g < len(_g1)):
            ifCase = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # src/AstNode.hx:513
            # src/AstNode.hx:513
            _g2 = ifCase.condition.getResult(context)
            if (_g2.index == 4):
                # src/AstNode.hx:514
                _hx_bool = _g2.params[0]
                # src/AstNode.hx:515
                if _hx_bool:
                    # src/AstNode.hx:516
                    context.addScope()
                    # src/AstNode.hx:517
                    result = ifCase.result.getResult(context)
                    # src/AstNode.hx:518
                    context.pop()
                    # src/AstNode.hx:519
                    return result
            else:
                raise haxe_Exception.thrown("Bool Expected")
        # src/AstNode.hx:526
        if (self.elseCase is not None):
            # src/AstNode.hx:527
            context.addScope()
            # src/AstNode.hx:528
            result = self.elseCase.getResult(context)
            # src/AstNode.hx:529
            context.pop()
            # src/AstNode.hx:530
            return result
        # src/AstNode.hx:533
        return Data.Nothing

    def toString(self):
        # src/AstNode.hx:537
        _hx_str = ""
        # src/AstNode.hx:539
        # src/AstNode.hx:539
        _g = 0
        _g1 = len(self.cases)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/AstNode.hx:540
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull(("IF: (" if ((i == 0)) else "ELIF: (")))
            # src/AstNode.hx:541
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull((((HxOverrides.stringOrNull((self.cases[i] if i >= 0 and i < len(self.cases) else None).condition.toString()) + "): ") + HxOverrides.stringOrNull((self.cases[i] if i >= 0 and i < len(self.cases) else None).result.toString())))))
            # src/AstNode.hx:542
            if (i < ((len(self.cases) - 1))):
                _hx_str = (("null" if _hx_str is None else _hx_str) + ", ")
        # src/AstNode.hx:546
        if (self.elseCase is not None):
            _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull((((", ELSE: (" + HxOverrides.stringOrNull(self.elseCase.toString())) + ")"))))
        # src/AstNode.hx:549
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.cases = None
        _hx_o.elseCase = None


class Class: pass


class Context:
    _hx_class_name = "Context"
    __slots__ = ("root", "current")
    _hx_fields = ["root", "current"]
    _hx_methods = ["addScope", "pop", "getVariable", "setVariable", "createVariable", "variableCanHave"]

    def __init__(self):
        # src/Context.hx:15
        self.current = None
        # src/Context.hx:18
        self.root = _hx_AnonObject({'variables': haxe_ds_StringMap()})
        # src/Context.hx:19
        self.current = self.root

    def addScope(self):
        # src/Context.hx:23
        newScope = _hx_AnonObject({'variables': haxe_ds_StringMap(), 'parent': self.current})
        # src/Context.hx:28
        def _hx_local_1():
            # src/Context.hx:28
            def _hx_local_0():
                # src/Context.hx:28
                self.current = newScope
                return self.current
            return _hx_local_0()
        return _hx_local_1()

    def pop(self):
        # src/Context.hx:32
        if (Reflect.field(self.current,"parent") is not None):
            self.current = Reflect.field(self.current,"parent")
        # src/Context.hx:35
        return self.current

    def getVariable(self,varName):
        # src/Context.hx:39
        variable = None
        # src/Context.hx:40
        scope = None
        # src/Context.hx:41
        while True:
            # src/Context.hx:42
            scope = (self.current if ((scope is None)) else Reflect.field(scope,"parent"))
            # src/Context.hx:43
            if (varName in scope.variables.h):
                variable = scope.variables.h.get(varName,None)
            # src/Context.hx:41
            if (not (((variable is None) and ((Reflect.field(scope,"parent") is not None))))):
                break
        # src/Context.hx:47
        return variable

    def setVariable(self,variable,value):
        # src/Context.hx:51
        if (not self.variableCanHave(variable,value)):
            return False
        # src/Context.hx:54
        variable.value = value
        # src/Context.hx:55
        return True

    def createVariable(self,varName,_hx_type,init = None):
        # src/Context.hx:59
        variable = _hx_AnonObject({'typeInst': _hx_type, 'value': Data.Nothing})
        # src/Context.hx:64
        if ((init is not None) and (not self.setVariable(variable,init))):
            raise haxe_Exception.thrown(((("Could not initialize variable " + ("null" if varName is None else varName)) + " with ") + Std.string(init)))
        # src/Context.hx:68
        self.current.variables.h[varName] = variable

    def variableCanHave(self,variable,value):
        # src/Context.hx:72
        if (variable.typeInst.type == DataTypes.TYPES.DYNAMIC):
            return True
        # src/Context.hx:75
        tmp = value.index
        # src/Context.hx:77
        if (tmp == 1):
            return True
        elif (tmp == 2):
            # src/Context.hx:78
            _hx_float = value.params[0]
            # src/Context.hx:79
            return (variable.typeInst.type == DataTypes.TYPES.REAL)
        elif (tmp == 3):
            # src/Context.hx:80
            string = value.params[0]
            # src/Context.hx:81
            return (variable.typeInst.type == DataTypes.TYPES.STRING)
        elif (tmp == 4):
            # src/Context.hx:82
            _hx_bool = value.params[0]
            # src/Context.hx:83
            return (variable.typeInst.type == DataTypes.TYPES.BOOL)
        elif (tmp == 5):
            # src/Context.hx:84
            _hx_type = value.params[0]
            _hx_list = value.params[1]
            # src/Context.hx:85
            if (variable.typeInst.type == DataTypes.TYPES.ARRAY_LIST):
                # src/Context.hx:86
                _this = variable.typeInst
                return ((None if ((len(_this.dependencies) < 1)) else (_this.dependencies[0] if 0 < len(_this.dependencies) else None))).equals(_hx_type)
            # src/Context.hx:88
            return False
        else:
            return False

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.root = None
        _hx_o.current = None


class DataTypeInstance:
    _hx_class_name = "DataTypeInstance"
    __slots__ = ("type", "dependencies")
    _hx_fields = ["type", "dependencies"]
    _hx_methods = ["getDependency", "equals"]
    _hx_statics = ["fromData"]

    def __init__(self,_hx_type,dependencies = None):
        # src/Data.hx:8
        self.dependencies = []
        # src/Data.hx:28
        self.type = _hx_type
        # src/Data.hx:29
        if (dependencies is not None):
            self.dependencies = dependencies
        # src/Data.hx:32
        if (_hx_type.typeDependencies != len(self.dependencies)):
            raise haxe_Exception.thrown("Incorrect number of dependencies")

    def getDependency(self,i = None):
        # src/Data.hx:36
        if (i is None):
            i = 0
        # src/Data.hx:37
        if (len(self.dependencies) < ((i + 1))):
            return None
        # src/Data.hx:40
        return (self.dependencies[i] if i >= 0 and i < len(self.dependencies) else None)

    def equals(self,d):
        # src/Data.hx:44
        if (((d is None) or ((self.type != d.type))) or ((len(self.dependencies) != len(d.dependencies)))):
            return False
        # src/Data.hx:47
        # src/Data.hx:47
        _g = 0
        _g1 = len(self.dependencies)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/Data.hx:48
            if (not (self.dependencies[i] if i >= 0 and i < len(self.dependencies) else None).equals((d.dependencies[i] if i >= 0 and i < len(d.dependencies) else None))):
                return False
        # src/Data.hx:52
        return True

    @staticmethod
    def fromData(data):
        # src/Data.hx:11
        tmp = data.index
        # src/Data.hx:12
        if (tmp == 0):
            # src/Data.hx:12
            dataType = data.params[0]
            # src/Data.hx:13
            return dataType
        elif (tmp == 1):
            return None
        elif (tmp == 2):
            # src/Data.hx:16
            _hx_float = data.params[0]
            # src/Data.hx:17
            return DataTypeInstance(DataTypes.TYPES.REAL)
        elif (tmp == 3):
            # src/Data.hx:18
            string = data.params[0]
            # src/Data.hx:19
            return DataTypeInstance(DataTypes.TYPES.STRING)
        elif (tmp == 4):
            # src/Data.hx:20
            _hx_bool = data.params[0]
            # src/Data.hx:21
            return DataTypeInstance(DataTypes.TYPES.BOOL)
        elif (tmp == 5):
            # src/Data.hx:22
            _hx_type = data.params[0]
            _hx_list = data.params[1]
            # src/Data.hx:23
            return DataTypeInstance(DataTypes.TYPES.ARRAY_LIST,[_hx_type])
        else:
            pass

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.type = None
        _hx_o.dependencies = None


class DataTypes:
    _hx_class_name = "DataTypes"
    __slots__ = ()
    _hx_statics = ["TYPES", "TYPES_ARRAY"]

class Data(Enum):
    __slots__ = ()
    _hx_class_name = "Data"
    _hx_constructs = ["DType", "Nothing", "Real", "Str", "Boolean", "ArrayList"]

    @staticmethod
    def DType(dataType):
        return Data("DType", 0, (dataType,))

    @staticmethod
    def Real(float):
        return Data("Real", 2, (float,))

    @staticmethod
    def Str(string):
        return Data("Str", 3, (string,))

    @staticmethod
    def Boolean(bool):
        return Data("Boolean", 4, (bool,))

    @staticmethod
    def ArrayList(type,list):
        return Data("ArrayList", 5, (type,list))
Data.Nothing = Data("Nothing", 1, ())


class EReg:
    _hx_class_name = "EReg"
    __slots__ = ("pattern", "matchObj", "_hx_global")
    _hx_fields = ["pattern", "matchObj", "global"]
    _hx_methods = ["matchSub", "split", "replace", "map"]

    def __init__(self,r,opt):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:31
        self.matchObj = None
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:35
        self._hx_global = False
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:36
        options = 0
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:37
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:37
        _g = 0
        _g1 = len(opt)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:38
            c = (-1 if ((i >= len(opt))) else ord(opt[i]))
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:39
            if (c == 109):
                options = (options | python_lib_Re.M)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:41
            if (c == 105):
                options = (options | python_lib_Re.I)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:43
            if (c == 115):
                options = (options | python_lib_Re.S)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:45
            if (c == 117):
                options = (options | python_lib_Re.U)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:47
            if (c == 103):
                self._hx_global = True
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:50
        self.pattern = python_lib_Re.compile(r,options)

    def matchSub(self,s,pos,_hx_len = None):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:74
        if (_hx_len is None):
            _hx_len = -1
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:75
        if (_hx_len != -1):
            self.matchObj = self.pattern.search(s,pos,(pos + _hx_len))
        else:
            self.matchObj = self.pattern.search(s,pos)
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:81
        return (self.matchObj is not None)

    def split(self,s):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:85
        if self._hx_global:
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:86
            ret = []
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:87
            lastEnd = 0
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:89
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:89
            x = python_HaxeIterator(python_lib_Re.finditer(self.pattern,s))
            while x.hasNext():
                x1 = x.next()
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:90
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:90
                x2 = HxString.substring(s,lastEnd,x1.start())
                ret.append(x2)
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:91
                lastEnd = x1.end()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:93
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:93
            x = HxString.substr(s,lastEnd,None)
            ret.append(x)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:94
            return ret
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:96
            self.matchObj = python_lib_Re.search(self.pattern,s)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:97
            if (self.matchObj is None):
                return [s]
            else:
                return [HxString.substring(s,0,self.matchObj.start()), HxString.substr(s,self.matchObj.end(),None)]

    def replace(self,s,by):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:106
        _this = by.split("$$")
        by = "_hx_#repl#__".join([python_Boot.toString1(x1,'') for x1 in _this])
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:107
        def _hx_local_0(x):
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:108
            res = by
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:109
            g = x.groups()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:110
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:110
            _g = 0
            _g1 = len(g)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:111
                gs = g[i]
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:112
                if (gs is None):
                    continue
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:114
                delimiter = ("$" + HxOverrides.stringOrNull(str((i + 1))))
                _this = (list(res) if ((delimiter == "")) else res.split(delimiter))
                res = gs.join([python_Boot.toString1(x1,'') for x1 in _this])
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:116
            _this = res.split("_hx_#repl#__")
            res = "$".join([python_Boot.toString1(x1,'') for x1 in _this])
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:117
            return res
        replace = _hx_local_0
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:119
        return python_lib_Re.sub(self.pattern,replace,s,(0 if (self._hx_global) else 1))

    def map(self,s,f):
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:123
        buf_b = python_lib_io_StringIO()
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:124
        pos = 0
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:125
        right = s
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:127
        cur = self
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:128
        while (pos < len(s)):
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:129
            if (self.matchObj is None):
                self.matchObj = python_lib_Re.search(self.pattern,s)
            else:
                self.matchObj = self.matchObj.re.search(s,pos)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:135
            if (self.matchObj is None):
                break
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:138
            pos1 = self.matchObj.end()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:140
            curPos_pos = cur.matchObj.start()
            curPos_len = (cur.matchObj.end() - cur.matchObj.start())
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:142
            buf_b.write(Std.string(HxString.substr(HxString.substr(cur.matchObj.string,0,cur.matchObj.start()),pos,None)))
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:143
            buf_b.write(Std.string(f(cur)))
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:145
            right = HxString.substr(cur.matchObj.string,cur.matchObj.end(),None)
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:147
            if (not self._hx_global):
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:148
                buf_b.write(Std.string(right))
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:149
                return buf_b.getvalue()
            # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:152
            if (curPos_len == 0):
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:153
                buf_b.write(Std.string(("" if (((pos1 < 0) or ((pos1 >= len(s))))) else s[pos1])))
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:154
                right = HxString.substr(right,1,None)
                # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:155
                pos = (pos1 + 1)
            else:
                pos = pos1
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:160
        buf_b.write(Std.string(right))
        # C:\HaxeToolkit\haxe\std/python/_std/EReg.hx:161
        return buf_b.getvalue()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.matchObj = None
        _hx_o._hx_global = None


class Main:
    _hx_class_name = "Main"
    __slots__ = ()
    _hx_statics = ["main", "dataText"]

    @staticmethod
    def main():
        # src/Main.hx:3
        code = sys_io_File.getContent("res/code.txt")
        tokens = []
        idleUntil = 0
        _g = 0
        _g1 = len(code)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            isLast = (i == ((len(code) - 1)))
            if (i < idleUntil):
                continue
            char = ("" if (((i < 0) or ((i >= len(code))))) else code[i])
            if (char == " "):
                continue
            tmp = None
            searchIn = Tokenizer.DIGITS
            tmp1 = None
            if ((searchIn is None) or ((char is None))):
                tmp1 = False
            elif (char == ""):
                tmp1 = True
            else:
                startIndex = None
                tmp1 = (((searchIn.find(char) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,char,startIndex))) > -1)
            if (not tmp1):
                if ((char == ".") and (not isLast)):
                    searchIn1 = Tokenizer.DIGITS
                    index = (i + 1)
                    searchFor = ("" if (((index < 0) or ((index >= len(code))))) else code[index])
                    if ((searchIn1 is None) or ((searchFor is None))):
                        tmp = False
                    elif (searchFor == ""):
                        tmp = True
                    else:
                        startIndex1 = None
                        tmp = (((searchIn1.find(searchFor) if ((startIndex1 is None)) else HxString.indexOfImpl(searchIn1,searchFor,startIndex1))) > -1)
                else:
                    tmp = False
            else:
                tmp = True
            if tmp:
                numb = char
                periods = (1 if ((char == ".")) else 0)
                _g2 = (i + 1)
                _g3 = len(code)
                while (_g2 < _g3):
                    j = _g2
                    _g2 = (_g2 + 1)
                    char1 = ("" if (((j < 0) or ((j >= len(code))))) else code[j])
                    searchIn2 = Tokenizer.DIGITS
                    tmp2 = None
                    if ((searchIn2 is None) or ((char1 is None))):
                        tmp2 = False
                    elif (char1 == ""):
                        tmp2 = True
                    else:
                        startIndex2 = None
                        tmp2 = (((searchIn2.find(char1) if ((startIndex2 is None)) else HxString.indexOfImpl(searchIn2,char1,startIndex2))) > -1)
                    if ((not tmp2) and ((char1 != "."))):
                        idleUntil = j
                        break
                    if (char1 == "."):
                        periods = (periods + 1)
                        if (periods > 1):
                            idleUntil = j
                            break
                    numb = (("null" if numb is None else numb) + ("null" if char1 is None else char1))
                    if (j == ((len(code) - 1))):
                        idleUntil = (j + 1)
                result = Std.parseFloat(numb)
                real = (None if (python_lib_Math.isnan(result)) else result)
                if (real is None):
                    raise haxe_Exception.thrown("Number is unparseable")
                tokens.append(_hx_AnonObject({'type': TokenType.Real(real), 'startPos': i, 'endPos': idleUntil}))
                continue
            searchIn3 = Tokenizer.LETTERS
            tmp3 = None
            if ((searchIn3 is None) or ((char is None))):
                tmp3 = False
            elif (char == ""):
                tmp3 = True
            else:
                startIndex3 = None
                tmp3 = (((searchIn3.find(char) if ((startIndex3 is None)) else HxString.indexOfImpl(searchIn3,char,startIndex3))) > -1)
            if tmp3:
                word = char
                _g4 = (i + 1)
                _g5 = len(code)
                while (_g4 < _g5):
                    j1 = _g4
                    _g4 = (_g4 + 1)
                    char2 = ("" if (((j1 < 0) or ((j1 >= len(code))))) else code[j1])
                    searchIn4 = Tokenizer.LETTERS_DIGITS
                    tmp4 = None
                    if ((searchIn4 is None) or ((char2 is None))):
                        tmp4 = False
                    elif (char2 == ""):
                        tmp4 = True
                    else:
                        startIndex4 = None
                        tmp4 = (((searchIn4.find(char2) if ((startIndex4 is None)) else HxString.indexOfImpl(searchIn4,char2,startIndex4))) > -1)
                    if tmp4:
                        word = (("null" if word is None else word) + ("null" if char2 is None else char2))
                    else:
                        idleUntil = j1
                        break
                    if (j1 == ((len(code) - 1))):
                        idleUntil = (j1 + 1)
                dataTypeFound = False
                _g6 = 0
                _g7 = DataTypes.TYPES_ARRAY
                while (_g6 < len(_g7)):
                    dataType = (_g7[_g6] if _g6 >= 0 and _g6 < len(_g7) else None)
                    _g6 = (_g6 + 1)
                    if (dataType.identifier == word):
                        tokens.append(_hx_AnonObject({'type': TokenType.DataType(dataType), 'startPos': i, 'endPos': idleUntil}))
                        dataTypeFound = True
                        break
                if (not dataTypeFound):
                    keywordFound = False
                    _g8 = 0
                    _g9 = Tokenizer.KEYWORDS
                    while (_g8 < len(_g9)):
                        keyword = (_g9[_g8] if _g8 >= 0 and _g8 < len(_g9) else None)
                        _g8 = (_g8 + 1)
                        if (keyword.identifier == word):
                            x = _hx_AnonObject({'type': keyword.tType, 'startPos': i, 'endPos': idleUntil})
                            tokens.append(x)
                            keywordFound = True
                            break
                    if (not keywordFound):
                        tokens.append(_hx_AnonObject({'type': TokenType.Identifier(word), 'startPos': i, 'endPos': idleUntil}))
            char3 = char
            if ((char3 == "'") or ((char3 == "\""))):
                _hx_str = ""
                _g10 = (i + 1)
                _g11 = len(code)
                while (_g10 < _g11):
                    j2 = _g10
                    _g10 = (_g10 + 1)
                    char4 = ("" if (((j2 < 0) or ((j2 >= len(code))))) else code[j2])
                    if ((char4 == "\"") or ((char4 == "'"))):
                        idleUntil = (j2 + 1)
                        break
                    _hx_str = (("null" if _hx_str is None else _hx_str) + ("null" if char4 is None else char4))
                    if (j2 == ((len(code) - 1))):
                        raise haxe_Exception.thrown("\" or ' Expected")
                tokens.append(_hx_AnonObject({'type': TokenType.Text(_hx_str), 'startPos': i, 'endPos': (idleUntil - 1)}))
            elif (char3 == "#"):
                _g12 = (i + 1)
                _g13 = len(code)
                while (_g12 < _g13):
                    j3 = _g12
                    _g12 = (_g12 + 1)
                    if (((("" if (((j3 < 0) or ((j3 >= len(code))))) else code[j3])) == "\n") or ((j3 == ((len(code) - 1))))):
                        idleUntil = (j3 + 1)
                        break
            elif (char3 == "%"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mod, 'startPos': i}))
            elif (char3 == "&"):
                tmp5 = None
                if (not isLast):
                    index1 = (i + 1)
                    tmp5 = ((("" if (((index1 < 0) or ((index1 >= len(code))))) else code[index1])) == "&")
                else:
                    tmp5 = False
                if tmp5:
                    tokens.append(_hx_AnonObject({'type': TokenType.And, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
            elif (char3 == "("):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenParen, 'startPos': i}))
            elif (char3 == ")"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseParen, 'startPos': i}))
            elif (char3 == "*"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mult, 'startPos': i}))
            elif (char3 == "+"):
                tokens.append(_hx_AnonObject({'type': TokenType.Add, 'startPos': i}))
            elif (char3 == ","):
                tokens.append(_hx_AnonObject({'type': TokenType.Comma, 'startPos': i}))
            elif (char3 == "-"):
                tokens.append(_hx_AnonObject({'type': TokenType.Sub, 'startPos': i}))
            elif (char3 == "/"):
                tokens.append(_hx_AnonObject({'type': TokenType.Div, 'startPos': i}))
            elif (char3 == ";"):
                tokens.append(_hx_AnonObject({'type': TokenType.NewLine, 'startPos': i}))
            elif (char3 == "<"):
                tmp6 = None
                if (not isLast):
                    index2 = (i + 1)
                    tmp6 = ((("" if (((index2 < 0) or ((index2 >= len(code))))) else code[index2])) == "=")
                else:
                    tmp6 = False
                if tmp6:
                    tokens.append(_hx_AnonObject({'type': TokenType.LesserEquals, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Lesser, 'startPos': i}))
            elif (char3 == "="):
                tmp7 = None
                if (not isLast):
                    index3 = (i + 1)
                    tmp7 = ((("" if (((index3 < 0) or ((index3 >= len(code))))) else code[index3])) == "=")
                else:
                    tmp7 = False
                if tmp7:
                    tokens.append(_hx_AnonObject({'type': TokenType.Equals, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Assign, 'startPos': i}))
            elif (char3 == ">"):
                tmp8 = None
                if (not isLast):
                    index4 = (i + 1)
                    tmp8 = ((("" if (((index4 < 0) or ((index4 >= len(code))))) else code[index4])) == "=")
                else:
                    tmp8 = False
                if tmp8:
                    tokens.append(_hx_AnonObject({'type': TokenType.GreaterEquals, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Greater, 'startPos': i}))
            elif (char3 == "["):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenBracket, 'startPos': i}))
            elif (char3 == "]"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseBracket, 'startPos': i}))
            elif (char3 == "^"):
                tokens.append(_hx_AnonObject({'type': TokenType.Pow, 'startPos': i}))
            elif (char3 == "{"):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenCurly, 'startPos': i}))
            elif (char3 == "|"):
                tmp9 = None
                if (not isLast):
                    index5 = (i + 1)
                    tmp9 = ((("" if (((index5 < 0) or ((index5 >= len(code))))) else code[index5])) == "|")
                else:
                    tmp9 = False
                if tmp9:
                    tokens.append(_hx_AnonObject({'type': TokenType.Or, 'startPos': i, 'endPos': (i + 1)}))
                    idleUntil = (i + 2)
            elif (char3 == "}"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseCurly, 'startPos': i}))
            else:
                pass
        tokens1 = tokens
        # src/Main.hx:4
        tokenString = "\n----------------"
        # src/Main.hx:5
        # src/Main.hx:5
        _g = 0
        while (_g < len(tokens1)):
            token = (tokens1[_g] if _g >= 0 and _g < len(tokens1) else None)
            _g = (_g + 1)
            # src/Main.hx:6
            tokenType = token.type
            tokenString1 = None
            tokenString2 = tokenType.index
            if (tokenString2 == 0):
                name = tokenType.params[0]
                tokenString1 = ("IDENTIFIER:" + ("null" if name is None else name))
            elif (tokenString2 == 1):
                _hx_type = tokenType.params[0]
                tokenString1 = ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
            elif (tokenString2 == 2):
                number = tokenType.params[0]
                tokenString1 = ("REAL:" + Std.string(number))
            elif (tokenString2 == 3):
                string = tokenType.params[0]
                tokenString1 = ("TEXT:" + ("null" if string is None else string))
            elif (tokenString2 == 4):
                _hx_bool = tokenType.params[0]
                tokenString1 = ("BOOL:" + Std.string(_hx_bool))
            elif (tokenString2 == 5):
                tokenString1 = "="
            elif (tokenString2 == 6):
                tokenString1 = "^"
            elif (tokenString2 == 7):
                tokenString1 = "+"
            elif (tokenString2 == 8):
                tokenString1 = "-"
            elif (tokenString2 == 9):
                tokenString1 = "*"
            elif (tokenString2 == 10):
                tokenString1 = "/"
            elif (tokenString2 == 11):
                tokenString1 = "%"
            elif (tokenString2 == 12):
                tokenString1 = "=="
            elif (tokenString2 == 13):
                tokenString1 = ">"
            elif (tokenString2 == 14):
                tokenString1 = "<"
            elif (tokenString2 == 15):
                tokenString1 = ">="
            elif (tokenString2 == 16):
                tokenString1 = "<="
            elif (tokenString2 == 17):
                tokenString1 = "AND"
            elif (tokenString2 == 18):
                tokenString1 = "OR"
            elif (tokenString2 == 19):
                tokenString1 = "("
            elif (tokenString2 == 20):
                tokenString1 = ")"
            elif (tokenString2 == 23):
                tokenString1 = "["
            elif (tokenString2 == 24):
                tokenString1 = "]"
            elif (tokenString2 == 25):
                tokenString1 = ","
            elif (tokenString2 == 26):
                tokenString1 = "IF"
            elif (tokenString2 == 27):
                tokenString1 = "ELIF"
            elif (tokenString2 == 28):
                tokenString1 = "ELSE"
            elif (tokenString2 == 29):
                tokenString1 = ";"
            else:
                tokenString1 = "Default Token"
            tokenString = (("null" if tokenString is None else tokenString) + HxOverrides.stringOrNull((("\n" + ("null" if tokenString1 is None else tokenString1)))))
        # src/Main.hx:7
        tokenString = (("null" if tokenString is None else tokenString) + "\n----------------")
        # src/Main.hx:9
        print(str(tokenString))
        # src/Main.hx:11
        parser = Parser(tokens1)
        # src/Main.hx:13
        tree = parser.parse()
        # src/Main.hx:14
        print(str(tree.toString()))
        # src/Main.hx:16
        context = Context()
        # src/Main.hx:17
        r = tree.getResult(context)
        # src/Main.hx:18
        if (r.index == 5):
            # src/Main.hx:19
            _hx_type = r.params[0]
            _hx_list = r.params[1]
            # src/Main.hx:20
            _hx_str = "\n----------------"
            # src/Main.hx:21
            # src/Main.hx:21
            _g = 0
            while (_g < len(_hx_list)):
                item = (_hx_list[_g] if _g >= 0 and _g < len(_hx_list) else None)
                _g = (_g + 1)
                # src/Main.hx:22
                str1 = None
                str2 = item.index
                if (str2 == 0):
                    dataType = item.params[0]
                    str1 = dataType.type.identifier
                elif (str2 == 1):
                    str1 = "null"
                elif (str2 == 2):
                    _hx_float = item.params[0]
                    str1 = Std.string(_hx_float)
                elif (str2 == 3):
                    string = item.params[0]
                    str1 = (("\"" + ("null" if string is None else string)) + "\"")
                elif (str2 == 4):
                    _hx_bool = item.params[0]
                    str1 = Std.string(_hx_bool)
                elif (str2 == 5):
                    _hx_type = item.params[0]
                    list1 = item.params[1]
                    lString = "["
                    _g1 = 0
                    _g2 = len(list1)
                    while (_g1 < _g2):
                        i = _g1
                        _g1 = (_g1 + 1)
                        data = (list1[i] if i >= 0 and i < len(list1) else None)
                        lString1 = None
                        lString2 = data.index
                        if (lString2 == 0):
                            dataType1 = data.params[0]
                            lString1 = dataType1.type.identifier
                        elif (lString2 == 1):
                            lString1 = "null"
                        elif (lString2 == 2):
                            float1 = data.params[0]
                            lString1 = Std.string(float1)
                        elif (lString2 == 3):
                            string1 = data.params[0]
                            lString1 = (("\"" + ("null" if string1 is None else string1)) + "\"")
                        elif (lString2 == 4):
                            bool1 = data.params[0]
                            lString1 = Std.string(bool1)
                        elif (lString2 == 5):
                            type1 = data.params[0]
                            list2 = data.params[1]
                            lString3 = "["
                            _g3 = 0
                            _g4 = len(list2)
                            while (_g3 < _g4):
                                i1 = _g3
                                _g3 = (_g3 + 1)
                                lString3 = (("null" if lString3 is None else lString3) + HxOverrides.stringOrNull(Main.dataText((list2[i1] if i1 >= 0 and i1 < len(list2) else None))))
                                if (i1 < ((len(list2) - 1))):
                                    lString3 = (("null" if lString3 is None else lString3) + ", ")
                            lString3 = (("null" if lString3 is None else lString3) + "]")
                            lString1 = ((("List<" + HxOverrides.stringOrNull(type1.type.identifier)) + "> ") + ("null" if lString3 is None else lString3))
                        else:
                            pass
                        lString = (("null" if lString is None else lString) + ("null" if lString1 is None else lString1))
                        if (i < ((len(list1) - 1))):
                            lString = (("null" if lString is None else lString) + ", ")
                    lString = (("null" if lString is None else lString) + "]")
                    str1 = ((("List<" + HxOverrides.stringOrNull(_hx_type.type.identifier)) + "> ") + ("null" if lString is None else lString))
                else:
                    pass
                _hx_str = (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull((("\n" + ("null" if str1 is None else str1)))))
            # src/Main.hx:23
            _hx_str = (("null" if _hx_str is None else _hx_str) + "\n----------------")
            # src/Main.hx:24
            print(str(_hx_str))

    @staticmethod
    def dataText(data):
        # src/Main.hx:30
        tmp = data.index
        # src/Main.hx:31
        if (tmp == 0):
            # src/Main.hx:31
            dataType = data.params[0]
            # src/Main.hx:32
            return dataType.type.identifier
        elif (tmp == 1):
            return "null"
        elif (tmp == 2):
            # src/Main.hx:35
            _hx_float = data.params[0]
            # src/Main.hx:36
            return Std.string(_hx_float)
        elif (tmp == 3):
            # src/Main.hx:37
            string = data.params[0]
            # src/Main.hx:38
            return (("\"" + ("null" if string is None else string)) + "\"")
        elif (tmp == 4):
            # src/Main.hx:39
            _hx_bool = data.params[0]
            # src/Main.hx:40
            return Std.string(_hx_bool)
        elif (tmp == 5):
            # src/Main.hx:41
            _hx_type = data.params[0]
            _hx_list = data.params[1]
            # src/Main.hx:42
            lString = "["
            # src/Main.hx:43
            # src/Main.hx:43
            _g = 0
            _g1 = len(_hx_list)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # src/Main.hx:44
                lString = (("null" if lString is None else lString) + HxOverrides.stringOrNull(Main.dataText((_hx_list[i] if i >= 0 and i < len(_hx_list) else None))))
                # src/Main.hx:45
                if (i < ((len(_hx_list) - 1))):
                    lString = (("null" if lString is None else lString) + ", ")
            # src/Main.hx:48
            lString = (("null" if lString is None else lString) + "]")
            # src/Main.hx:49
            return ((("List<" + HxOverrides.stringOrNull(_hx_type.type.identifier)) + "> ") + ("null" if lString is None else lString))
        else:
            pass


class Parser:
    _hx_class_name = "Parser"
    __slots__ = ("tokens", "tokenIndex", "currentToken", "peekToken", "errors")
    _hx_fields = ["tokens", "tokenIndex", "currentToken", "peekToken", "errors"]
    _hx_methods = ["nextToken", "peek", "parse", "factor", "accesssor", "power", "term", "arithmatic", "compare", "expression", "statement", "binOperation", "listExpr", "ifExpr", "curlyStatement"]

    def __init__(self,tokens):
        # src/Parser.hx:14
        self.errors = None
        # src/Parser.hx:12
        self.peekToken = None
        # src/Parser.hx:11
        self.currentToken = None
        # src/Parser.hx:10
        self.tokenIndex = None
        # src/Parser.hx:17
        self.tokens = tokens

    def nextToken(self,i = None):
        # src/Parser.hx:20
        if (i is None):
            i = 1
        # src/Parser.hx:21
        # src/Parser.hx:21
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.tokenIndex
        _hx_local_0.tokenIndex = (_hx_local_1 + i)
        _hx_local_0.tokenIndex
        # src/Parser.hx:22
        self.currentToken = (python_internal_ArrayImpl._get(self.tokens, self.tokenIndex) if ((self.tokenIndex < len(self.tokens))) else None)
        # src/Parser.hx:23
        return (self.currentToken is not None)

    def peek(self,i = None):
        # src/Parser.hx:26
        if (i is None):
            i = 1
        # src/Parser.hx:27
        peekIndex = (self.tokenIndex + i)
        # src/Parser.hx:28
        def _hx_local_1():
            # src/Parser.hx:28
            def _hx_local_0():
                # src/Parser.hx:28
                self.peekToken = ((self.tokens[peekIndex] if peekIndex >= 0 and peekIndex < len(self.tokens) else None) if ((peekIndex < len(self.tokens))) else None)
                return self.peekToken
            return _hx_local_0()
        return _hx_local_1()

    def parse(self):
        # src/Parser.hx:32
        self.errors = []
        # src/Parser.hx:33
        self.tokenIndex = -1
        # src/Parser.hx:34
        self.currentToken = None
        # src/Parser.hx:35
        self.peekToken = None
        # src/Parser.hx:36
        self.nextToken()
        # src/Parser.hx:37
        return self.statement()

    def factor(self):
        # src/Parser.hx:41
        token = self.currentToken
        # src/Parser.hx:42
        if (token is None):
            return None
        # src/Parser.hx:45
        _g = token.type
        tmp = _g.index
        # src/Parser.hx:58
        if (tmp == 0):
            # src/Parser.hx:58
            name = _g.params[0]
            # src/Parser.hx:59
            self.nextToken()
            # src/Parser.hx:60
            return AstVarAccessNode(name)
        elif (tmp == 1):
            # src/Parser.hx:46
            _hx_type = _g.params[0]
            # src/Parser.hx:47
            dependencies = []
            # src/Parser.hx:48
            if (self.nextToken() and ((self.currentToken.type == TokenType.Lesser))):
                # src/Parser.hx:49
                self.nextToken()
                # src/Parser.hx:50
                dependentType = self.factor()
                # src/Parser.hx:51
                dependencies.append(dependentType)
                # src/Parser.hx:52
                if ((self.currentToken is not None) and ((self.currentToken.type == TokenType.Greater))):
                    self.nextToken()
                else:
                    raise haxe_Exception.thrown("> expected")
            # src/Parser.hx:57
            return AstDataTypeNode(_hx_type,dependencies)
        elif (tmp == 2):
            # src/Parser.hx:61
            number = _g.params[0]
            # src/Parser.hx:62
            self.nextToken()
            # src/Parser.hx:63
            return AstNumbNode(number)
        elif (tmp == 3):
            # src/Parser.hx:64
            string = _g.params[0]
            # src/Parser.hx:65
            self.nextToken()
            # src/Parser.hx:66
            return AstStrNode(string)
        elif (tmp == 4):
            # src/Parser.hx:67
            _hx_bool = _g.params[0]
            # src/Parser.hx:68
            self.nextToken()
            # src/Parser.hx:69
            return AstBoolNode(_hx_bool)
        elif ((tmp == 8) or ((tmp == 7))):
            # src/Parser.hx:71
            self.nextToken()
            # src/Parser.hx:72
            fact = self.factor()
            # src/Parser.hx:73
            return AstUnaryOpNode(token.type,fact)
        elif (tmp == 19):
            # src/Parser.hx:75
            self.nextToken()
            # src/Parser.hx:76
            expr = self.expression()
            # src/Parser.hx:77
            if ((self.currentToken is not None) and ((self.currentToken.type == TokenType.CloseParen))):
                # src/Parser.hx:78
                self.nextToken()
                # src/Parser.hx:79
                return expr
            # src/Parser.hx:81
            return None
        elif (tmp == 26):
            return self.ifExpr()
        else:
            return None

    def accesssor(self):
        # src/Parser.hx:90
        left = self.factor()
        # src/Parser.hx:92
        gotAccessor = False
        # src/Parser.hx:93
        while ((self.currentToken is not None) and ((self.currentToken.type == TokenType.OpenBracket))):
            # src/Parser.hx:94
            self.nextToken()
            # src/Parser.hx:95
            index = self.expression()
            # src/Parser.hx:96
            if ((self.currentToken is None) or ((self.currentToken.type != TokenType.CloseBracket))):
                raise haxe_Exception.thrown("] Expected")
            # src/Parser.hx:98
            self.nextToken()
            # src/Parser.hx:99
            left = AstArrayAccessNode(left,index)
            # src/Parser.hx:100
            gotAccessor = True
        # src/Parser.hx:103
        if ((gotAccessor and ((self.currentToken is not None))) and ((self.currentToken.type == TokenType.Assign))):
            # src/Parser.hx:104
            accessNode = left
            # src/Parser.hx:105
            self.nextToken()
            # src/Parser.hx:106
            accessNode.assign = self.expression()
        # src/Parser.hx:109
        return left

    def power(self):
        # src/Parser.hx:113
        return self.binOperation(self.accesssor,[TokenType.Pow])

    def term(self):
        # src/Parser.hx:117
        return self.binOperation(self.power,[TokenType.Mult, TokenType.Div, TokenType.Mod])

    def arithmatic(self):
        # src/Parser.hx:121
        return self.binOperation(self.term,[TokenType.Add, TokenType.Sub])

    def compare(self):
        # src/Parser.hx:125
        return self.binOperation(self.arithmatic,[TokenType.Equals, TokenType.Greater, TokenType.Lesser, TokenType.GreaterEquals, TokenType.LesserEquals])

    def expression(self):
        # src/Parser.hx:129
        token = self.currentToken
        # src/Parser.hx:130
        # src/Parser.hx:130
        _g = token.type
        tmp = _g.index
        # src/Parser.hx:144
        if (tmp == 0):
            # src/Parser.hx:144
            name = _g.params[0]
            # src/Parser.hx:145
            self.peek()
            # src/Parser.hx:146
            if (self.peekToken.type.index == 5):
                # src/Parser.hx:148
                self.nextToken(2)
                # src/Parser.hx:149
                value = self.expression()
                # src/Parser.hx:150
                return AstAssignmentNode(name,None,value)
        elif (tmp == 1):
            # src/Parser.hx:131
            _hx_type = _g.params[0]
            # src/Parser.hx:132
            _hx_type = self.factor()
            # src/Parser.hx:133
            # src/Parser.hx:133
            _g = self.currentToken.type
            if (_g.index == 0):
                # src/Parser.hx:134
                name = _g.params[0]
                # src/Parser.hx:135
                init = None
                # src/Parser.hx:136
                if (self.nextToken() and ((self.currentToken.type == TokenType.Assign))):
                    # src/Parser.hx:137
                    self.nextToken()
                    # src/Parser.hx:138
                    init = self.expression()
                # src/Parser.hx:140
                return AstAssignmentNode(name,_hx_type,init)
        elif (tmp == 23):
            return self.listExpr()
        else:
            pass
        # src/Parser.hx:158
        return self.binOperation(self.compare,[TokenType.And, TokenType.Or])

    def statement(self):
        # src/Parser.hx:162
        statements = [self.expression()]
        # src/Parser.hx:163
        afterCurly = False
        # src/Parser.hx:164
        while True:
            # src/Parser.hx:165
            tmp = None
            if (self.currentToken is not None):
                if (self.currentToken.type != TokenType.NewLine):
                    # src/Parser.hx:168
                    afterCurly = ((self.peek(-1) is not None) and ((self.peekToken.type == TokenType.CloseCurly)))
                    # src/Parser.hx:165
                    tmp = afterCurly
                else:
                    tmp = True
            else:
                tmp = False
            # src/Parser.hx:164
            if (not tmp):
                break
            # src/Parser.hx:172
            if (afterCurly or self.nextToken()):
                # src/Parser.hx:173
                afterCurly = False
                # src/Parser.hx:174
                if (self.currentToken.type == TokenType.CloseCurly):
                    break
                # src/Parser.hx:177
                # src/Parser.hx:177
                x = self.expression()
                statements.append(x)
        # src/Parser.hx:181
        return AstListNode(statements)

    def binOperation(self,func,operators):
        # src/Parser.hx:185
        left = func()
        # src/Parser.hx:187
        while ((self.currentToken is not None) and (self.currentToken.type in operators)):
            # src/Parser.hx:188
            opToken = self.currentToken.type
            # src/Parser.hx:189
            self.nextToken()
            # src/Parser.hx:190
            right = func()
            # src/Parser.hx:191
            left = AstBinOpNode(left,right,opToken)
        # src/Parser.hx:194
        return left

    def listExpr(self):
        # src/Parser.hx:198
        if (self.nextToken() and ((self.currentToken.type == TokenType.CloseBracket))):
            # src/Parser.hx:199
            self.nextToken()
            # src/Parser.hx:200
            return AstListNode([])
        # src/Parser.hx:202
        elements = [self.expression()]
        # src/Parser.hx:204
        while (self.currentToken.type == TokenType.Comma):
            if self.nextToken():
                # src/Parser.hx:206
                x = self.expression()
                elements.append(x)
            else:
                raise haxe_Exception.thrown("] Expected")
        # src/Parser.hx:211
        if ((self.currentToken is None) or ((self.currentToken.type != TokenType.CloseBracket))):
            raise haxe_Exception.thrown(", or ] Expected")
        # src/Parser.hx:214
        self.nextToken()
        # src/Parser.hx:215
        return AstListNode(elements)

    def ifExpr(self):
        # src/Parser.hx:219
        cases = []
        # src/Parser.hx:221
        self.nextToken()
        # src/Parser.hx:222
        condition = self.expression()
        # src/Parser.hx:223
        # src/Parser.hx:223
        x = _hx_AnonObject({'condition': condition, 'result': self.curlyStatement()})
        cases.append(x)
        # src/Parser.hx:225
        if ((((self.currentToken is not None) and ((self.currentToken.type == TokenType.NewLine))) and ((self.peek(1) is not None))) and (((self.peekToken.type == TokenType.Elif) or ((self.peekToken.type == TokenType.Else))))):
            self.nextToken()
        # src/Parser.hx:234
        while ((self.currentToken is not None) and ((self.currentToken.type == TokenType.Elif))):
            # src/Parser.hx:235
            self.nextToken()
            # src/Parser.hx:236
            condition = self.expression()
            # src/Parser.hx:237
            # src/Parser.hx:237
            x = _hx_AnonObject({'condition': condition, 'result': self.curlyStatement()})
            cases.append(x)
            # src/Parser.hx:239
            if ((((self.currentToken is not None) and ((self.currentToken.type == TokenType.NewLine))) and ((self.peek(1) is not None))) and (((self.peekToken.type == TokenType.Elif) or ((self.peekToken.type == TokenType.Else))))):
                self.nextToken()
        # src/Parser.hx:249
        elseCase = None
        # src/Parser.hx:250
        if ((self.currentToken is not None) and ((self.currentToken.type == TokenType.Else))):
            # src/Parser.hx:251
            self.nextToken()
            # src/Parser.hx:252
            elseCase = self.curlyStatement()
        # src/Parser.hx:255
        return AstIfChainNode(cases,elseCase)

    def curlyStatement(self):
        # src/Parser.hx:259
        if (self.currentToken is None):
            raise haxe_Exception.thrown("{ or Expression Expected")
        # src/Parser.hx:262
        caseResult = None
        # src/Parser.hx:263
        if (self.currentToken.type == TokenType.OpenCurly):
            # src/Parser.hx:264
            if (self.nextToken() and ((self.currentToken.type == TokenType.CloseCurly))):
                # src/Parser.hx:265
                self.nextToken()
                # src/Parser.hx:266
                return AstListNode([])
            # src/Parser.hx:269
            caseResult = self.statement()
            # src/Parser.hx:270
            if ((self.currentToken is None) or ((self.currentToken.type != TokenType.CloseCurly))):
                raise haxe_Exception.thrown("} Expected")
            # src/Parser.hx:272
            self.nextToken()
        else:
            caseResult = self.expression()
        # src/Parser.hx:277
        return caseResult

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.tokens = None
        _hx_o.tokenIndex = None
        _hx_o.currentToken = None
        _hx_o.peekToken = None
        _hx_o.errors = None


class Reflect:
    _hx_class_name = "Reflect"
    __slots__ = ()
    _hx_statics = ["field"]

    @staticmethod
    def field(o,field):
        # C:\HaxeToolkit\haxe\std/python/_std/Reflect.hx:43
        return python_Boot.field(o,field)


class Std:
    _hx_class_name = "Std"
    __slots__ = ()
    _hx_statics = ["isOfType", "string", "parseInt", "shortenPossibleNumber", "parseFloat"]

    @staticmethod
    def isOfType(v,t):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:61
        if ((v is None) and ((t is None))):
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:64
        if (t is None):
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:67
        if (t == Dynamic):
            return (v is not None)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:70
        isBool = isinstance(v,bool)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:72
        if ((t == Bool) and isBool):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:75
        if ((((not isBool) and (not (t == Bool))) and (t == Int)) and isinstance(v,int)):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:78
        vIsFloat = isinstance(v,float)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:80
        tmp = None
        tmp1 = None
        if (((not isBool) and vIsFloat) and (t == Int)):
            f = v
            tmp1 = (((f != Math.POSITIVE_INFINITY) and ((f != Math.NEGATIVE_INFINITY))) and (not python_lib_Math.isnan(f)))
        else:
            tmp1 = False
        if tmp1:
            tmp1 = None
            try:
                tmp1 = int(v)
            except BaseException as _g:
                tmp1 = None
            tmp = (v == tmp1)
        else:
            tmp = False
        if ((tmp and ((v <= 2147483647))) and ((v >= -2147483648))):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:84
        if (((not isBool) and (t == Float)) and isinstance(v,(float, int))):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:88
        if (t == str):
            return isinstance(v,str)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:91
        isEnumType = (t == Enum)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:92
        if ((isEnumType and python_lib_Inspect.isclass(v)) and hasattr(v,"_hx_constructs")):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:95
        if isEnumType:
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:98
        isClassType = (t == Class)
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:99
        if ((((isClassType and (not isinstance(v,Enum))) and python_lib_Inspect.isclass(v)) and hasattr(v,"_hx_class_name")) and (not hasattr(v,"_hx_constructs"))):
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:106
        if isClassType:
            return False
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:109
        tmp = None
        try:
            tmp = isinstance(v,t)
        except BaseException as _g:
            tmp = False
        if tmp:
            return True
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:113
        if python_lib_Inspect.isclass(t):
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:114
            cls = t
            loop = None
            def _hx_local_1(intf):
                f = (intf._hx_interfaces if (hasattr(intf,"_hx_interfaces")) else [])
                if (f is not None):
                    _g = 0
                    while (_g < len(f)):
                        i = (f[_g] if _g >= 0 and _g < len(f) else None)
                        _g = (_g + 1)
                        if (i == cls):
                            return True
                        else:
                            l = loop(i)
                            if l:
                                return True
                    return False
                else:
                    return False
            loop = _hx_local_1
            currentClass = v.__class__
            result = False
            while (currentClass is not None):
                if loop(currentClass):
                    result = True
                    break
                currentClass = python_Boot.getSuperClass(currentClass)
            return result
        else:
            return False

    @staticmethod
    def string(s):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:122
        return python_Boot.toString1(s,"")

    @staticmethod
    def parseInt(x):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:134
        if (x is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:136
        try:
            return int(x)
        except BaseException as _g:
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:139
            base = 10
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:140
            _hx_len = len(x)
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:141
            foundCount = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:142
            sign = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:143
            firstDigitIndex = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:144
            lastDigitIndex = -1
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:145
            previous = 0
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:147
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:147
            _g = 0
            _g1 = _hx_len
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:148
                c = (-1 if ((i >= len(x))) else ord(x[i]))
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:149
                if (((c > 8) and ((c < 14))) or ((c == 32))):
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:151
                    if (foundCount > 0):
                        return None
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:154
                    continue
                else:
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:149
                    c1 = c
                    # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:157
                    if (c1 == 43):
                        if (foundCount == 0):
                            sign = 1
                        elif (not (((48 <= c) and ((c <= 57))))):
                            if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                break
                    elif (c1 == 45):
                        if (foundCount == 0):
                            sign = -1
                        elif (not (((48 <= c) and ((c <= 57))))):
                            if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                break
                    elif (c1 == 48):
                        if (not (((foundCount == 0) or (((foundCount == 1) and ((sign != 0))))))):
                            if (not (((48 <= c) and ((c <= 57))))):
                                if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                    break
                    elif ((c1 == 120) or ((c1 == 88))):
                        if ((previous == 48) and ((((foundCount == 1) and ((sign == 0))) or (((foundCount == 2) and ((sign != 0))))))):
                            base = 16
                        elif (not (((48 <= c) and ((c <= 57))))):
                            if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                                break
                    elif (not (((48 <= c) and ((c <= 57))))):
                        if (not (((base == 16) and ((((97 <= c) and ((c <= 122))) or (((65 <= c) and ((c <= 90))))))))):
                            break
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:167
                if (((foundCount == 0) and ((sign == 0))) or (((foundCount == 1) and ((sign != 0))))):
                    firstDigitIndex = i
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:170
                foundCount = (foundCount + 1)
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:171
                lastDigitIndex = i
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:172
                previous = c
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:174
            if (firstDigitIndex <= lastDigitIndex):
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:175
                digits = HxString.substring(x,firstDigitIndex,(lastDigitIndex + 1))
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:176
                try:
                    return (((-1 if ((sign == -1)) else 1)) * int(digits,base))
                except BaseException as _g:
                    return None
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:182
            return None

    @staticmethod
    def shortenPossibleNumber(x):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:187
        r = ""
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:188
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:188
        _g = 0
        _g1 = len(x)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:189
            c = ("" if (((i < 0) or ((i >= len(x))))) else x[i])
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:190
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:190
            _g2 = HxString.charCodeAt(c,0)
            if (_g2 is None):
                break
            else:
                _g3 = _g2
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:192
                if (((((((((((_g3 == 57) or ((_g3 == 56))) or ((_g3 == 55))) or ((_g3 == 54))) or ((_g3 == 53))) or ((_g3 == 52))) or ((_g3 == 51))) or ((_g3 == 50))) or ((_g3 == 49))) or ((_g3 == 48))) or ((_g3 == 46))):
                    r = (("null" if r is None else r) + ("null" if c is None else c))
                else:
                    break
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:197
        return r

    @staticmethod
    def parseFloat(x):
        # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:201
        try:
            return float(x)
        except BaseException as _g:
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:204
            if (x is not None):
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:205
                r1 = Std.shortenPossibleNumber(x)
                # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:206
                if (r1 != x):
                    return Std.parseFloat(r1)
            # C:\HaxeToolkit\haxe\std/python/_std/Std.hx:210
            return Math.NaN


class Float: pass


class Int: pass


class Bool: pass


class Dynamic: pass


class StringBuf:
    _hx_class_name = "StringBuf"
    __slots__ = ("b",)
    _hx_fields = ["b"]
    _hx_methods = ["get_length"]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:31
        self.b = python_lib_io_StringIO()

    def get_length(self):
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:37
        pos = self.b.tell()
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:38
        self.b.seek(0,2)
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:39
        _hx_len = self.b.tell()
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:40
        self.b.seek(pos,0)
        # C:\HaxeToolkit\haxe\std/python/_std/StringBuf.hx:41
        return _hx_len

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class StringTools:
    _hx_class_name = "StringTools"
    __slots__ = ()
    _hx_statics = ["isSpace", "ltrim", "rtrim", "trim", "replace", "hex"]

    @staticmethod
    def isSpace(s,pos):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:280
        if (((len(s) == 0) or ((pos < 0))) or ((pos >= len(s)))):
            return False
        # C:\HaxeToolkit\haxe\std/StringTools.hx:283
        c = HxString.charCodeAt(s,pos)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:284
        if (not (((c > 8) and ((c < 14))))):
            return (c == 32)
        else:
            return True

    @staticmethod
    def ltrim(s):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:300
        l = len(s)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:301
        r = 0
        # C:\HaxeToolkit\haxe\std/StringTools.hx:302
        while ((r < l) and StringTools.isSpace(s,r)):
            r = (r + 1)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:305
        if (r > 0):
            return HxString.substr(s,r,(l - r))
        else:
            return s

    @staticmethod
    def rtrim(s):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:325
        l = len(s)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:326
        r = 0
        # C:\HaxeToolkit\haxe\std/StringTools.hx:327
        while ((r < l) and StringTools.isSpace(s,((l - r) - 1))):
            r = (r + 1)
        # C:\HaxeToolkit\haxe\std/StringTools.hx:330
        if (r > 0):
            return HxString.substr(s,0,(l - r))
        else:
            return s

    @staticmethod
    def trim(s):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:349
        return StringTools.ltrim(StringTools.rtrim(s))

    @staticmethod
    def replace(s,sub,by):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:424
        _this = (list(s) if ((sub == "")) else s.split(sub))
        return by.join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def hex(n,digits = None):
        # C:\HaxeToolkit\haxe\std/StringTools.hx:440
        s = ""
        # C:\HaxeToolkit\haxe\std/StringTools.hx:441
        hexChars = "0123456789ABCDEF"
        # C:\HaxeToolkit\haxe\std/StringTools.hx:442
        while True:
            # C:\HaxeToolkit\haxe\std/StringTools.hx:443
            index = (n & 15)
            s = (HxOverrides.stringOrNull((("" if (((index < 0) or ((index >= len(hexChars))))) else hexChars[index]))) + ("null" if s is None else s))
            # C:\HaxeToolkit\haxe\std/StringTools.hx:444
            n = HxOverrides.rshift(n, 4)
            # C:\HaxeToolkit\haxe\std/StringTools.hx:442
            if (not ((n > 0))):
                break
        # C:\HaxeToolkit\haxe\std/StringTools.hx:448
        if ((digits is not None) and ((len(s) < digits))):
            # C:\HaxeToolkit\haxe\std/StringTools.hx:449
            diff = (digits - len(s))
            # C:\HaxeToolkit\haxe\std/StringTools.hx:450
            # C:\HaxeToolkit\haxe\std/StringTools.hx:450
            _g = 0
            _g1 = diff
            while (_g < _g1):
                _ = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/StringTools.hx:451
                s = ("0" + ("null" if s is None else s))
        # C:\HaxeToolkit\haxe\std/StringTools.hx:459
        return s


class Sys:
    _hx_class_name = "Sys"
    __slots__ = ()
    _hx_statics = ["systemName"]

    @staticmethod
    def systemName():
        # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:96
        _g = python_lib_Sys.platform
        # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:97
        x = _g
        # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:96
        if x.startswith("linux"):
            return "Linux"
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:96
            _g1 = _g
            _hx_local_0 = len(_g1)
            # C:\HaxeToolkit\haxe\std/python/_std/Sys.hx:100
            if (_hx_local_0 == 5):
                if (_g1 == "win32"):
                    return "Windows"
                else:
                    raise haxe_Exception.thrown("not supported platform")
            elif (_hx_local_0 == 6):
                if (_g1 == "cygwin"):
                    return "Windows"
                elif (_g1 == "darwin"):
                    return "Mac"
                else:
                    raise haxe_Exception.thrown("not supported platform")
            else:
                raise haxe_Exception.thrown("not supported platform")

class TokenType(Enum):
    __slots__ = ()
    _hx_class_name = "TokenType"
    _hx_constructs = ["Identifier", "DataType", "Real", "Text", "BoolConst", "Assign", "Pow", "Add", "Sub", "Mult", "Div", "Mod", "Equals", "Greater", "Lesser", "GreaterEquals", "LesserEquals", "And", "Or", "OpenParen", "CloseParen", "OpenCurly", "CloseCurly", "OpenBracket", "CloseBracket", "Comma", "If", "Elif", "Else", "NewLine"]

    @staticmethod
    def Identifier(name):
        return TokenType("Identifier", 0, (name,))

    @staticmethod
    def DataType(type):
        return TokenType("DataType", 1, (type,))

    @staticmethod
    def Real(number):
        return TokenType("Real", 2, (number,))

    @staticmethod
    def Text(string):
        return TokenType("Text", 3, (string,))

    @staticmethod
    def BoolConst(bool):
        return TokenType("BoolConst", 4, (bool,))
TokenType.Assign = TokenType("Assign", 5, ())
TokenType.Pow = TokenType("Pow", 6, ())
TokenType.Add = TokenType("Add", 7, ())
TokenType.Sub = TokenType("Sub", 8, ())
TokenType.Mult = TokenType("Mult", 9, ())
TokenType.Div = TokenType("Div", 10, ())
TokenType.Mod = TokenType("Mod", 11, ())
TokenType.Equals = TokenType("Equals", 12, ())
TokenType.Greater = TokenType("Greater", 13, ())
TokenType.Lesser = TokenType("Lesser", 14, ())
TokenType.GreaterEquals = TokenType("GreaterEquals", 15, ())
TokenType.LesserEquals = TokenType("LesserEquals", 16, ())
TokenType.And = TokenType("And", 17, ())
TokenType.Or = TokenType("Or", 18, ())
TokenType.OpenParen = TokenType("OpenParen", 19, ())
TokenType.CloseParen = TokenType("CloseParen", 20, ())
TokenType.OpenCurly = TokenType("OpenCurly", 21, ())
TokenType.CloseCurly = TokenType("CloseCurly", 22, ())
TokenType.OpenBracket = TokenType("OpenBracket", 23, ())
TokenType.CloseBracket = TokenType("CloseBracket", 24, ())
TokenType.Comma = TokenType("Comma", 25, ())
TokenType.If = TokenType("If", 26, ())
TokenType.Elif = TokenType("Elif", 27, ())
TokenType.Else = TokenType("Else", 28, ())
TokenType.NewLine = TokenType("NewLine", 29, ())


class Tokenizer:
    _hx_class_name = "Tokenizer"
    __slots__ = ()
    _hx_statics = ["DIGITS", "LETTERS", "LETTERS_DIGITS", "KEYWORDS", "getTokens", "toString"]

    @staticmethod
    def getTokens(code):
        # src/Tokenizer.hx:85
        tokens = []
        # src/Tokenizer.hx:87
        idleUntil = 0
        # src/Tokenizer.hx:88
        # src/Tokenizer.hx:88
        _g = 0
        _g1 = len(code)
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # src/Tokenizer.hx:89
            isLast = (i == ((len(code) - 1)))
            # src/Tokenizer.hx:90
            if (i < idleUntil):
                continue
            # src/Tokenizer.hx:93
            char = ("" if (((i < 0) or ((i >= len(code))))) else code[i])
            # src/Tokenizer.hx:94
            if (char == " "):
                continue
            # src/Tokenizer.hx:98
            tmp = None
            searchIn = Tokenizer.DIGITS
            tmp1 = None
            if ((searchIn is None) or ((char is None))):
                tmp1 = False
            elif (char == ""):
                tmp1 = True
            else:
                startIndex = None
                tmp1 = (((searchIn.find(char) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,char,startIndex))) > -1)
            if (not tmp1):
                if ((char == ".") and (not isLast)):
                    searchIn1 = Tokenizer.DIGITS
                    index = (i + 1)
                    searchFor = ("" if (((index < 0) or ((index >= len(code))))) else code[index])
                    if ((searchIn1 is None) or ((searchFor is None))):
                        tmp = False
                    elif (searchFor == ""):
                        tmp = True
                    else:
                        startIndex1 = None
                        tmp = (((searchIn1.find(searchFor) if ((startIndex1 is None)) else HxString.indexOfImpl(searchIn1,searchFor,startIndex1))) > -1)
                else:
                    tmp = False
            else:
                tmp = True
            if tmp:
                # src/Tokenizer.hx:99
                numb = char
                # src/Tokenizer.hx:101
                periods = (1 if ((char == ".")) else 0)
                # src/Tokenizer.hx:103
                # src/Tokenizer.hx:103
                _g2 = (i + 1)
                _g3 = len(code)
                while (_g2 < _g3):
                    j = _g2
                    _g2 = (_g2 + 1)
                    # src/Tokenizer.hx:104
                    char1 = ("" if (((j < 0) or ((j >= len(code))))) else code[j])
                    # src/Tokenizer.hx:107
                    searchIn2 = Tokenizer.DIGITS
                    tmp2 = None
                    if ((searchIn2 is None) or ((char1 is None))):
                        tmp2 = False
                    elif (char1 == ""):
                        tmp2 = True
                    else:
                        startIndex2 = None
                        tmp2 = (((searchIn2.find(char1) if ((startIndex2 is None)) else HxString.indexOfImpl(searchIn2,char1,startIndex2))) > -1)
                    if ((not tmp2) and ((char1 != "."))):
                        # src/Tokenizer.hx:108
                        idleUntil = j
                        # src/Tokenizer.hx:109
                        break
                    # src/Tokenizer.hx:113
                    if (char1 == "."):
                        # src/Tokenizer.hx:114
                        periods = (periods + 1)
                        # src/Tokenizer.hx:116
                        if (periods > 1):
                            # src/Tokenizer.hx:117
                            idleUntil = j
                            # src/Tokenizer.hx:118
                            break
                    # src/Tokenizer.hx:122
                    numb = (("null" if numb is None else numb) + ("null" if char1 is None else char1))
                    # src/Tokenizer.hx:123
                    if (j == ((len(code) - 1))):
                        idleUntil = (j + 1)
                # src/Tokenizer.hx:128
                result = Std.parseFloat(numb)
                real = (None if (python_lib_Math.isnan(result)) else result)
                # src/Tokenizer.hx:129
                if (real is None):
                    raise haxe_Exception.thrown("Number is unparseable")
                # src/Tokenizer.hx:132
                tokens.append(_hx_AnonObject({'type': TokenType.Real(real), 'startPos': i, 'endPos': idleUntil}))
                # src/Tokenizer.hx:133
                continue
            # src/Tokenizer.hx:137
            searchIn3 = Tokenizer.LETTERS
            tmp3 = None
            if ((searchIn3 is None) or ((char is None))):
                tmp3 = False
            elif (char == ""):
                tmp3 = True
            else:
                startIndex3 = None
                tmp3 = (((searchIn3.find(char) if ((startIndex3 is None)) else HxString.indexOfImpl(searchIn3,char,startIndex3))) > -1)
            if tmp3:
                # src/Tokenizer.hx:138
                word = char
                # src/Tokenizer.hx:141
                # src/Tokenizer.hx:141
                _g4 = (i + 1)
                _g5 = len(code)
                while (_g4 < _g5):
                    j1 = _g4
                    _g4 = (_g4 + 1)
                    # src/Tokenizer.hx:142
                    char2 = ("" if (((j1 < 0) or ((j1 >= len(code))))) else code[j1])
                    # src/Tokenizer.hx:144
                    searchIn4 = Tokenizer.LETTERS_DIGITS
                    tmp4 = None
                    if ((searchIn4 is None) or ((char2 is None))):
                        tmp4 = False
                    elif (char2 == ""):
                        tmp4 = True
                    else:
                        startIndex4 = None
                        tmp4 = (((searchIn4.find(char2) if ((startIndex4 is None)) else HxString.indexOfImpl(searchIn4,char2,startIndex4))) > -1)
                    if tmp4:
                        word = (("null" if word is None else word) + ("null" if char2 is None else char2))
                    else:
                        # src/Tokenizer.hx:147
                        idleUntil = j1
                        # src/Tokenizer.hx:148
                        break
                    # src/Tokenizer.hx:151
                    if (j1 == ((len(code) - 1))):
                        idleUntil = (j1 + 1)
                # src/Tokenizer.hx:156
                dataTypeFound = False
                # src/Tokenizer.hx:157
                # src/Tokenizer.hx:157
                _g6 = 0
                _g7 = DataTypes.TYPES_ARRAY
                while (_g6 < len(_g7)):
                    dataType = (_g7[_g6] if _g6 >= 0 and _g6 < len(_g7) else None)
                    _g6 = (_g6 + 1)
                    # src/Tokenizer.hx:158
                    if (dataType.identifier == word):
                        # src/Tokenizer.hx:159
                        tokens.append(_hx_AnonObject({'type': TokenType.DataType(dataType), 'startPos': i, 'endPos': idleUntil}))
                        # src/Tokenizer.hx:160
                        dataTypeFound = True
                        # src/Tokenizer.hx:161
                        break
                # src/Tokenizer.hx:167
                if (not dataTypeFound):
                    # src/Tokenizer.hx:168
                    keywordFound = False
                    # src/Tokenizer.hx:169
                    # src/Tokenizer.hx:169
                    _g8 = 0
                    _g9 = Tokenizer.KEYWORDS
                    while (_g8 < len(_g9)):
                        keyword = (_g9[_g8] if _g8 >= 0 and _g8 < len(_g9) else None)
                        _g8 = (_g8 + 1)
                        # src/Tokenizer.hx:170
                        if (keyword.identifier == word):
                            # src/Tokenizer.hx:171
                            # src/Tokenizer.hx:171
                            x = _hx_AnonObject({'type': keyword.tType, 'startPos': i, 'endPos': idleUntil})
                            tokens.append(x)
                            # src/Tokenizer.hx:172
                            keywordFound = True
                            # src/Tokenizer.hx:173
                            break
                    # src/Tokenizer.hx:177
                    if (not keywordFound):
                        tokens.append(_hx_AnonObject({'type': TokenType.Identifier(word), 'startPos': i, 'endPos': idleUntil}))
            # src/Tokenizer.hx:182
            char3 = char
            # src/Tokenizer.hx:190
            if ((char3 == "'") or ((char3 == "\""))):
                # src/Tokenizer.hx:191
                _hx_str = ""
                # src/Tokenizer.hx:192
                # src/Tokenizer.hx:192
                _g10 = (i + 1)
                _g11 = len(code)
                while (_g10 < _g11):
                    j2 = _g10
                    _g10 = (_g10 + 1)
                    # src/Tokenizer.hx:193
                    char4 = ("" if (((j2 < 0) or ((j2 >= len(code))))) else code[j2])
                    # src/Tokenizer.hx:194
                    if ((char4 == "\"") or ((char4 == "'"))):
                        # src/Tokenizer.hx:195
                        idleUntil = (j2 + 1)
                        # src/Tokenizer.hx:196
                        break
                    # src/Tokenizer.hx:199
                    _hx_str = (("null" if _hx_str is None else _hx_str) + ("null" if char4 is None else char4))
                    # src/Tokenizer.hx:200
                    if (j2 == ((len(code) - 1))):
                        raise haxe_Exception.thrown("\" or ' Expected")
                # src/Tokenizer.hx:203
                tokens.append(_hx_AnonObject({'type': TokenType.Text(_hx_str), 'startPos': i, 'endPos': (idleUntil - 1)}))
            elif (char3 == "#"):
                # src/Tokenizer.hx:184
                _g12 = (i + 1)
                _g13 = len(code)
                while (_g12 < _g13):
                    j3 = _g12
                    _g12 = (_g12 + 1)
                    # src/Tokenizer.hx:185
                    if (((("" if (((j3 < 0) or ((j3 >= len(code))))) else code[j3])) == "\n") or ((j3 == ((len(code) - 1))))):
                        # src/Tokenizer.hx:186
                        idleUntil = (j3 + 1)
                        # src/Tokenizer.hx:187
                        break
            elif (char3 == "%"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mod, 'startPos': i}))
            elif (char3 == "&"):
                # src/Tokenizer.hx:238
                tmp5 = None
                if (not isLast):
                    index1 = (i + 1)
                    tmp5 = ((("" if (((index1 < 0) or ((index1 >= len(code))))) else code[index1])) == "&")
                else:
                    tmp5 = False
                if tmp5:
                    # src/Tokenizer.hx:239
                    tokens.append(_hx_AnonObject({'type': TokenType.And, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:240
                    idleUntil = (i + 2)
            elif (char3 == "("):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenParen, 'startPos': i}))
            elif (char3 == ")"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseParen, 'startPos': i}))
            elif (char3 == "*"):
                tokens.append(_hx_AnonObject({'type': TokenType.Mult, 'startPos': i}))
            elif (char3 == "+"):
                tokens.append(_hx_AnonObject({'type': TokenType.Add, 'startPos': i}))
            elif (char3 == ","):
                tokens.append(_hx_AnonObject({'type': TokenType.Comma, 'startPos': i}))
            elif (char3 == "-"):
                tokens.append(_hx_AnonObject({'type': TokenType.Sub, 'startPos': i}))
            elif (char3 == "/"):
                tokens.append(_hx_AnonObject({'type': TokenType.Div, 'startPos': i}))
            elif (char3 == ";"):
                tokens.append(_hx_AnonObject({'type': TokenType.NewLine, 'startPos': i}))
            elif (char3 == "<"):
                # src/Tokenizer.hx:231
                tmp6 = None
                if (not isLast):
                    index2 = (i + 1)
                    tmp6 = ((("" if (((index2 < 0) or ((index2 >= len(code))))) else code[index2])) == "=")
                else:
                    tmp6 = False
                if tmp6:
                    # src/Tokenizer.hx:232
                    tokens.append(_hx_AnonObject({'type': TokenType.LesserEquals, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:233
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Lesser, 'startPos': i}))
            elif (char3 == "="):
                # src/Tokenizer.hx:205
                tmp7 = None
                if (not isLast):
                    index3 = (i + 1)
                    tmp7 = ((("" if (((index3 < 0) or ((index3 >= len(code))))) else code[index3])) == "=")
                else:
                    tmp7 = False
                if tmp7:
                    # src/Tokenizer.hx:206
                    tokens.append(_hx_AnonObject({'type': TokenType.Equals, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:207
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Assign, 'startPos': i}))
            elif (char3 == ">"):
                # src/Tokenizer.hx:224
                tmp8 = None
                if (not isLast):
                    index4 = (i + 1)
                    tmp8 = ((("" if (((index4 < 0) or ((index4 >= len(code))))) else code[index4])) == "=")
                else:
                    tmp8 = False
                if tmp8:
                    # src/Tokenizer.hx:225
                    tokens.append(_hx_AnonObject({'type': TokenType.GreaterEquals, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:226
                    idleUntil = (i + 2)
                else:
                    tokens.append(_hx_AnonObject({'type': TokenType.Greater, 'startPos': i}))
            elif (char3 == "["):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenBracket, 'startPos': i}))
            elif (char3 == "]"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseBracket, 'startPos': i}))
            elif (char3 == "^"):
                tokens.append(_hx_AnonObject({'type': TokenType.Pow, 'startPos': i}))
            elif (char3 == "{"):
                tokens.append(_hx_AnonObject({'type': TokenType.OpenCurly, 'startPos': i}))
            elif (char3 == "|"):
                # src/Tokenizer.hx:243
                tmp9 = None
                if (not isLast):
                    index5 = (i + 1)
                    tmp9 = ((("" if (((index5 < 0) or ((index5 >= len(code))))) else code[index5])) == "|")
                else:
                    tmp9 = False
                if tmp9:
                    # src/Tokenizer.hx:244
                    tokens.append(_hx_AnonObject({'type': TokenType.Or, 'startPos': i, 'endPos': (i + 1)}))
                    # src/Tokenizer.hx:245
                    idleUntil = (i + 2)
            elif (char3 == "}"):
                tokens.append(_hx_AnonObject({'type': TokenType.CloseCurly, 'startPos': i}))
            else:
                pass
        # src/Tokenizer.hx:266
        return tokens

    @staticmethod
    def toString(tokenType):
        # src/Tokenizer.hx:270
        tmp = tokenType.index
        # src/Tokenizer.hx:273
        if (tmp == 0):
            # src/Tokenizer.hx:273
            name = tokenType.params[0]
            # src/Tokenizer.hx:274
            return ("IDENTIFIER:" + ("null" if name is None else name))
        elif (tmp == 1):
            # src/Tokenizer.hx:271
            _hx_type = tokenType.params[0]
            # src/Tokenizer.hx:272
            return ("TYPE:" + HxOverrides.stringOrNull(_hx_type.identifier))
        elif (tmp == 2):
            # src/Tokenizer.hx:275
            number = tokenType.params[0]
            # src/Tokenizer.hx:276
            return ("REAL:" + Std.string(number))
        elif (tmp == 3):
            # src/Tokenizer.hx:277
            string = tokenType.params[0]
            # src/Tokenizer.hx:278
            return ("TEXT:" + ("null" if string is None else string))
        elif (tmp == 4):
            # src/Tokenizer.hx:279
            _hx_bool = tokenType.params[0]
            # src/Tokenizer.hx:280
            return ("BOOL:" + Std.string(_hx_bool))
        elif (tmp == 5):
            return "="
        elif (tmp == 6):
            return "^"
        elif (tmp == 7):
            return "+"
        elif (tmp == 8):
            return "-"
        elif (tmp == 9):
            return "*"
        elif (tmp == 10):
            return "/"
        elif (tmp == 11):
            return "%"
        elif (tmp == 12):
            return "=="
        elif (tmp == 13):
            return ">"
        elif (tmp == 14):
            return "<"
        elif (tmp == 15):
            return ">="
        elif (tmp == 16):
            return "<="
        elif (tmp == 17):
            return "AND"
        elif (tmp == 18):
            return "OR"
        elif (tmp == 19):
            return "("
        elif (tmp == 20):
            return ")"
        elif (tmp == 23):
            return "["
        elif (tmp == 24):
            return "]"
        elif (tmp == 25):
            return ","
        elif (tmp == 26):
            return "IF"
        elif (tmp == 27):
            return "ELIF"
        elif (tmp == 28):
            return "ELSE"
        elif (tmp == 29):
            return ";"
        else:
            return "Default Token"


class Type:
    _hx_class_name = "Type"
    __slots__ = ()
    _hx_statics = ["getSuperClass", "createEmptyInstance"]

    @staticmethod
    def getSuperClass(c):
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:70
        return python_Boot.getSuperClass(c)

    @staticmethod
    def createEmptyInstance(cl):
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:124
        i = cl.__new__(cl)
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:126
        callInit = None
        def _hx_local_0(cl):
            # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:127
            sc = Type.getSuperClass(cl)
            # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:128
            if (sc is not None):
                callInit(sc)
            # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:131
            if hasattr(cl,"_hx_empty_init"):
                cl._hx_empty_init(i)
        callInit = _hx_local_0
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:135
        callInit(cl)
        # C:\HaxeToolkit\haxe\std/python/_std/Type.hx:137
        return i


class haxe_IMap:
    _hx_class_name = "haxe.IMap"
    __slots__ = ()


class haxe_Exception(Exception):
    _hx_class_name = "haxe.Exception"
    __slots__ = ("_hx___nativeStack", "_hx___skipStack", "_hx___nativeException", "_hx___previousException")
    _hx_fields = ["__nativeStack", "__skipStack", "__nativeException", "__previousException"]
    _hx_methods = ["unwrap", "toString", "get_message", "get_native"]
    _hx_statics = ["caught", "thrown"]
    _hx_interfaces = []
    _hx_super = Exception


    def __init__(self,message,previous = None,native = None):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:21
        self._hx___previousException = None
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:20
        self._hx___nativeException = None
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:18
        self._hx___nativeStack = None
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:19
        self._hx___skipStack = 0
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:46
        super().__init__(message)
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:47
        self._hx___previousException = previous
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:48
        if ((native is not None) and Std.isOfType(native,BaseException)):
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:49
            self._hx___nativeException = native
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:50
            self._hx___nativeStack = haxe_NativeStackTrace.exceptionStack()
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:52
            self._hx___nativeException = self
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:53
            infos = python_lib_Traceback.extract_stack()
            if (len(infos) != 0):
                infos.pop()
            infos.reverse()
            self._hx___nativeStack = infos

    def unwrap(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:58
        return self._hx___nativeException

    def toString(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:62
        return self.get_message()

    def get_message(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:76
        return str(self)

    def get_native(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:84
        return self._hx___nativeException

    @staticmethod
    def caught(value):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:24
        if Std.isOfType(value,haxe_Exception):
            return value
        elif Std.isOfType(value,BaseException):
            return haxe_Exception(str(value),None,value)
        else:
            return haxe_ValueException(value,None,value)

    @staticmethod
    def thrown(value):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:34
        if Std.isOfType(value,haxe_Exception):
            return value.get_native()
        elif Std.isOfType(value,BaseException):
            return value
        else:
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:39
            e = haxe_ValueException(value)
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:40
            e._hx___skipStack = (e._hx___skipStack + 1)
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/Exception.hx:41
            return e

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o._hx___nativeStack = None
        _hx_o._hx___skipStack = None
        _hx_o._hx___nativeException = None
        _hx_o._hx___previousException = None


class haxe_NativeStackTrace:
    _hx_class_name = "haxe.NativeStackTrace"
    __slots__ = ()
    _hx_statics = ["saveStack", "exceptionStack"]

    @staticmethod
    def saveStack(exception):
        pass

    @staticmethod
    def exceptionStack():
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:25
        exc = python_lib_Sys.exc_info()
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:26
        if (exc[2] is not None):
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:27
            infos = python_lib_Traceback.extract_tb(exc[2])
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:28
            infos.reverse()
            # C:\HaxeToolkit\haxe\std/python/_std/haxe/NativeStackTrace.hx:29
            return infos
        else:
            return []


class haxe_ValueException(haxe_Exception):
    _hx_class_name = "haxe.ValueException"
    __slots__ = ("value",)
    _hx_fields = ["value"]
    _hx_methods = ["unwrap"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception


    def __init__(self,value,previous = None,native = None):
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:21
        self.value = None
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:24
        super().__init__(Std.string(value),previous,native)
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:25
        self.value = value

    def unwrap(self):
        # C:\HaxeToolkit\haxe\std/haxe/ValueException.hx:36
        return self.value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.value = None


class haxe_crypto_Adler32:
    _hx_class_name = "haxe.crypto.Adler32"
    __slots__ = ("a1", "a2")
    _hx_fields = ["a1", "a2"]
    _hx_methods = ["get", "update"]
    _hx_statics = ["make"]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:33
        self.a1 = 1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:34
        self.a2 = 0

    def get(self):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:38
        return ((self.a2 << 16) | self.a1)

    def update(self,b,pos,_hx_len):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:42
        a1 = self.a1
        a2 = self.a2
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:43
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:43
        _g = pos
        _g1 = (pos + _hx_len)
        while (_g < _g1):
            p = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:44
            c = b.b[p]
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:45
            a1 = HxOverrides.mod(((a1 + c)), 65521)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:46
            a2 = HxOverrides.mod(((a2 + a1)), 65521)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:48
        self.a1 = a1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:49
        self.a2 = a2

    @staticmethod
    def make(b):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:72
        a = haxe_crypto_Adler32()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:73
        a.update(b,0,b.length)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Adler32.hx:74
        return a.get()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.a1 = None
        _hx_o.a2 = None


class haxe_io_Bytes:
    _hx_class_name = "haxe.io.Bytes"
    __slots__ = ("length", "b")
    _hx_fields = ["length", "b"]
    _hx_methods = ["getString", "toString"]
    _hx_statics = ["alloc", "ofString"]

    def __init__(self,length,b):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:35
        self.length = length
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:36
        self.b = b

    def getString(self,pos,_hx_len,encoding = None):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:416
        tmp = (encoding is None)
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:419
        if (((pos < 0) or ((_hx_len < 0))) or (((pos + _hx_len) > self.length))):
            raise haxe_Exception.thrown(haxe_io_Error.OutsideBounds)
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:450
        return self.b[pos:pos+_hx_len].decode('UTF-8','replace')

    def toString(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:516
        return self.getString(0,self.length)

    @staticmethod
    def alloc(length):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:566
        return haxe_io_Bytes(length,bytearray(length))

    @staticmethod
    def ofString(s,encoding = None):
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:615
        b = bytearray(s,"UTF-8")
        # C:\HaxeToolkit\haxe\std/haxe/io/Bytes.hx:616
        return haxe_io_Bytes(len(b),b)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.length = None
        _hx_o.b = None


class haxe_crypto_Base64:
    _hx_class_name = "haxe.crypto.Base64"
    __slots__ = ()
    _hx_statics = ["CHARS", "BYTES", "encode", "decode"]

    @staticmethod
    def encode(_hx_bytes,complement = None):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:35
        if (complement is None):
            complement = True
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:36
        _hx_str = haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).encodeBytes(_hx_bytes).toString()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:37
        if complement:
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:38
            _g = HxOverrides.mod(_hx_bytes.length, 3)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:40
            if (_g == 1):
                _hx_str = (("null" if _hx_str is None else _hx_str) + "==")
            elif (_g == 2):
                _hx_str = (("null" if _hx_str is None else _hx_str) + "=")
            else:
                pass
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:45
        return _hx_str

    @staticmethod
    def decode(_hx_str,complement = None):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:48
        if (complement is None):
            complement = True
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:49
        if complement:
            while (HxString.charCodeAt(_hx_str,(len(_hx_str) - 1)) == 61):
                _hx_str = HxString.substr(_hx_str,0,-1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Base64.hx:52
        return haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).decodeBytes(haxe_io_Bytes.ofString(_hx_str))


class haxe_crypto_BaseCode:
    _hx_class_name = "haxe.crypto.BaseCode"
    __slots__ = ("base", "nbits", "tbl")
    _hx_fields = ["base", "nbits", "tbl"]
    _hx_methods = ["encodeBytes", "initTable", "decodeBytes"]

    def __init__(self,base):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:31
        self.tbl = None
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:34
        _hx_len = base.length
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:35
        nbits = 1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:36
        while (_hx_len > ((1 << nbits))):
            nbits = (nbits + 1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:38
        if ((nbits > 8) or ((_hx_len != ((1 << nbits))))):
            raise haxe_Exception.thrown("BaseCode : base length must be a power of two.")
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:40
        self.base = base
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:41
        self.nbits = nbits

    def encodeBytes(self,b):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:48
        nbits = self.nbits
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:49
        base = self.base
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:50
        x = ((b.length * 8) / nbits)
        size = None
        try:
            size = int(x)
        except BaseException as _g:
            size = None
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:51
        out = haxe_io_Bytes.alloc((size + ((0 if ((HxOverrides.mod((b.length * 8), nbits) == 0)) else 1))))
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:52
        buf = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:53
        curbits = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:54
        mask = (((1 << nbits)) - 1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:55
        pin = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:56
        pout = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:57
        while (pout < size):
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:58
            while (curbits < nbits):
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:59
                curbits = (curbits + 8)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:60
                buf = (buf << 8)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:61
                pos = pin
                pin = (pin + 1)
                buf = (buf | b.b[pos])
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:63
            curbits = (curbits - nbits)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:64
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:64
            pos1 = pout
            pout = (pout + 1)
            v = base.b[((buf >> curbits) & mask)]
            out.b[pos1] = (v & 255)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:66
        if (curbits > 0):
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:67
            pos = pout
            pout = (pout + 1)
            v = base.b[((buf << ((nbits - curbits))) & mask)]
            out.b[pos] = (v & 255)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:68
        return out

    def initTable(self):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:73
        tbl = list()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:74
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:74
        _g = 0
        while (_g < 256):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:75
            python_internal_ArrayImpl._set(tbl, i, -1)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:76
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:76
        _g = 0
        _g1 = self.base.length
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:77
            python_internal_ArrayImpl._set(tbl, self.base.b[i], i)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:78
        self.tbl = tbl

    def decodeBytes(self,b):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:85
        nbits = self.nbits
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:86
        base = self.base
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:87
        if (self.tbl is None):
            self.initTable()
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:89
        tbl = self.tbl
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:90
        size = ((b.length * nbits) >> 3)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:91
        out = haxe_io_Bytes.alloc(size)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:92
        buf = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:93
        curbits = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:94
        pin = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:95
        pout = 0
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:96
        while (pout < size):
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:97
            while (curbits < 8):
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:98
                curbits = (curbits + nbits)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:99
                buf = (buf << nbits)
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:100
                pos = pin
                pin = (pin + 1)
                i = python_internal_ArrayImpl._get(tbl, b.b[pos])
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:101
                if (i == -1):
                    raise haxe_Exception.thrown("BaseCode : invalid encoded char")
                # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:103
                buf = (buf | i)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:105
            curbits = (curbits - 8)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:106
            # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:106
            pos1 = pout
            pout = (pout + 1)
            out.b[pos1] = (((buf >> curbits) & 255) & 255)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/BaseCode.hx:108
        return out

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.base = None
        _hx_o.nbits = None
        _hx_o.tbl = None


class haxe_crypto_Crc32:
    _hx_class_name = "haxe.crypto.Crc32"
    __slots__ = ()
    _hx_statics = ["make"]

    @staticmethod
    def make(data):
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:60
        c_crc = -1
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:61
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:61
        b = data.b
        _g = 0
        _g1 = data.length
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            tmp = (((c_crc ^ b[i])) & 255)
            # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:47
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            tmp = (HxOverrides.rshift(tmp, 1) ^ ((-((tmp & 1)) & -306674912)))
            c_crc = (HxOverrides.rshift(c_crc, 8) ^ tmp)
        # C:\HaxeToolkit\haxe\std/haxe/crypto/Crc32.hx:62
        return (c_crc ^ -1)


class haxe_ds_IntMap:
    _hx_class_name = "haxe.ds.IntMap"
    __slots__ = ("h",)
    _hx_fields = ["h"]
    _hx_methods = ["set"]
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/ds/IntMap.hx:32
        self.h = dict()

    def set(self,key,value):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/ds/IntMap.hx:36
        self.h[key] = value

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_ds_StringMap:
    _hx_class_name = "haxe.ds.StringMap"
    __slots__ = ("h",)
    _hx_fields = ["h"]
    _hx_interfaces = [haxe_IMap]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/python/_std/haxe/ds/StringMap.hx:32
        self.h = dict()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.h = None


class haxe_exceptions_PosException(haxe_Exception):
    _hx_class_name = "haxe.exceptions.PosException"
    __slots__ = ("posInfos",)
    _hx_fields = ["posInfos"]
    _hx_methods = ["toString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_Exception


    def __init__(self,message,previous = None,pos = None):
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:10
        self.posInfos = None
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:13
        super().__init__(message,previous)
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:14
        if (pos is None):
            self.posInfos = _hx_AnonObject({'fileName': "(unknown)", 'lineNumber': 0, 'className': "(unknown)", 'methodName': "(unknown)"})
        else:
            self.posInfos = pos

    def toString(self):
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/PosException.hx:25
        return ((((((((("" + HxOverrides.stringOrNull(super().toString())) + " in ") + HxOverrides.stringOrNull(self.posInfos.className)) + ".") + HxOverrides.stringOrNull(self.posInfos.methodName)) + " at ") + HxOverrides.stringOrNull(self.posInfos.fileName)) + ":") + Std.string(self.posInfos.lineNumber))

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.posInfos = None


class haxe_exceptions_NotImplementedException(haxe_exceptions_PosException):
    _hx_class_name = "haxe.exceptions.NotImplementedException"
    __slots__ = ()
    _hx_fields = []
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_exceptions_PosException


    def __init__(self,message = None,previous = None,pos = None):
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/NotImplementedException.hx:7
        if (message is None):
            message = "Not implemented"
        # C:\HaxeToolkit\haxe\std/haxe/exceptions/NotImplementedException.hx:8
        super().__init__(message,previous,pos)


class haxe_io_BytesBuffer:
    _hx_class_name = "haxe.io.BytesBuffer"
    __slots__ = ("b",)
    _hx_fields = ["b"]
    _hx_methods = ["getBytes"]

    def __init__(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:58
        self.b = bytearray()

    def getBytes(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:216
        _hx_bytes = haxe_io_Bytes(len(self.b),self.b)
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:222
        self.b = None
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesBuffer.hx:223
        return _hx_bytes

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None


class haxe_io_Output:
    _hx_class_name = "haxe.io.Output"
    __slots__ = ("bigEndian",)
    _hx_fields = ["bigEndian"]
    _hx_methods = ["set_bigEndian"]

    def set_bigEndian(self,b):
        # C:\HaxeToolkit\haxe\std/haxe/io/Output.hx:95
        self.bigEndian = b
        # C:\HaxeToolkit\haxe\std/haxe/io/Output.hx:96
        return b

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bigEndian = None


class haxe_io_BytesOutput(haxe_io_Output):
    _hx_class_name = "haxe.io.BytesOutput"
    __slots__ = ("b",)
    _hx_fields = ["b"]
    _hx_methods = ["writeByte", "getBytes"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output


    def __init__(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:40
        self.b = haxe_io_BytesBuffer()
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:43
        self.set_bigEndian(False)

    def writeByte(self,c):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:55
        self.b.b.append(c)

    def getBytes(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/BytesOutput.hx:143
        return self.b.getBytes()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.b = None

class haxe_io_Encoding(Enum):
    __slots__ = ()
    _hx_class_name = "haxe.io.Encoding"
    _hx_constructs = ["UTF8", "RawNative"]
haxe_io_Encoding.UTF8 = haxe_io_Encoding("UTF8", 0, ())
haxe_io_Encoding.RawNative = haxe_io_Encoding("RawNative", 1, ())


class haxe_io_Eof:
    _hx_class_name = "haxe.io.Eof"
    __slots__ = ()
    _hx_methods = ["toString"]

    def __init__(self):
        pass

    def toString(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/Eof.hx:33
        return "Eof"

    @staticmethod
    def _hx_empty_init(_hx_o):        pass

class haxe_io_Error(Enum):
    __slots__ = ()
    _hx_class_name = "haxe.io.Error"
    _hx_constructs = ["Blocked", "Overflow", "OutsideBounds", "Custom"]

    @staticmethod
    def Custom(e):
        return haxe_io_Error("Custom", 3, (e,))
haxe_io_Error.Blocked = haxe_io_Error("Blocked", 0, ())
haxe_io_Error.Overflow = haxe_io_Error("Overflow", 1, ())
haxe_io_Error.OutsideBounds = haxe_io_Error("OutsideBounds", 2, ())


class haxe_io_Input:
    _hx_class_name = "haxe.io.Input"
    __slots__ = ()
    _hx_methods = ["readByte"]

    def readByte(self):
        # C:\HaxeToolkit\haxe\std/haxe/io/Input.hx:53
        raise haxe_exceptions_NotImplementedException(None,None,_hx_AnonObject({'fileName': "haxe/io/Input.hx", 'lineNumber': 53, 'className': "haxe.io.Input", 'methodName': "readByte"}))

    @staticmethod
    def _hx_empty_init(_hx_o):        pass


class haxe_iterators_ArrayIterator:
    _hx_class_name = "haxe.iterators.ArrayIterator"
    __slots__ = ("array", "current")
    _hx_fields = ["array", "current"]
    _hx_methods = ["hasNext", "next"]

    def __init__(self,array):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:30
        self.current = 0
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:37
        self.array = array

    def hasNext(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:45
        return (self.current < len(self.array))

    def next(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:53
        def _hx_local_3():
            # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:53
            def _hx_local_2():
                # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayIterator.hx:53
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = (_hx_local_1 + 1)
                return _hx_local_1
            return python_internal_ArrayImpl._get(self.array, _hx_local_2())
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.array = None
        _hx_o.current = None


class haxe_iterators_ArrayKeyValueIterator:
    _hx_class_name = "haxe.iterators.ArrayKeyValueIterator"
    __slots__ = ("current", "array")
    _hx_fields = ["current", "array"]
    _hx_methods = ["hasNext", "next"]

    def __init__(self,array):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:27
        self.current = 0
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:32
        self.array = array

    def hasNext(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:37
        return (self.current < len(self.array))

    def next(self):
        # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:42
        def _hx_local_3():
            # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:42
            def _hx_local_2():
                # C:\HaxeToolkit\haxe\std/haxe/iterators/ArrayKeyValueIterator.hx:42
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.current
                _hx_local_0.current = (_hx_local_1 + 1)
                return _hx_local_1
            return _hx_AnonObject({'value': python_internal_ArrayImpl._get(self.array, self.current), 'key': _hx_local_2()})
        return _hx_local_3()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.current = None
        _hx_o.array = None


class hx_strings__AnyAsString_AnyAsString_Impl_:
    _hx_class_name = "hx.strings._AnyAsString.AnyAsString_Impl_"
    __slots__ = ()
    _hx_statics = ["fromBool", "fromAny"]

    @staticmethod
    def fromBool(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/AnyAsString.hx:24
        if value:
            return "true"
        else:
            return "false"

    @staticmethod
    def fromAny(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/AnyAsString.hx:29
        return Std.string(value)


class hx_strings__Char_CharCaseMapper:
    _hx_class_name = "hx.strings._Char.CharCaseMapper"
    __slots__ = ("mapU2L", "mapL2U")
    _hx_fields = ["mapU2L", "mapL2U"]
    _hx_methods = ["_addCaseMapping", "isLowerCase", "isUpperCase", "toLowerCase", "toUpperCase"]

    def __init__(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:646
        self.mapL2U = haxe_ds_IntMap()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:645
        self.mapU2L = haxe_ds_IntMap()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:684
        self._addCaseMapping(97,65)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:685
        self._addCaseMapping(98,66)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:686
        self._addCaseMapping(99,67)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:687
        self._addCaseMapping(100,68)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:688
        self._addCaseMapping(101,69)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:689
        self._addCaseMapping(102,70)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:690
        self._addCaseMapping(103,71)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:691
        self._addCaseMapping(104,72)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:692
        self._addCaseMapping(105,73)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:693
        self._addCaseMapping(106,74)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:694
        self._addCaseMapping(107,75)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:695
        self._addCaseMapping(108,76)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:696
        self._addCaseMapping(109,77)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:697
        self._addCaseMapping(110,78)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:698
        self._addCaseMapping(111,79)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:699
        self._addCaseMapping(112,80)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:700
        self._addCaseMapping(113,81)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:701
        self._addCaseMapping(114,82)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:702
        self._addCaseMapping(115,83)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:703
        self._addCaseMapping(116,84)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:704
        self._addCaseMapping(117,85)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:705
        self._addCaseMapping(118,86)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:706
        self._addCaseMapping(119,87)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:707
        self._addCaseMapping(120,88)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:708
        self._addCaseMapping(121,89)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:709
        self._addCaseMapping(122,90)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:710
        self._addCaseMapping(224,192)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:711
        self._addCaseMapping(225,193)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:712
        self._addCaseMapping(226,194)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:713
        self._addCaseMapping(227,195)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:714
        self._addCaseMapping(228,196)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:715
        self._addCaseMapping(229,197)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:716
        self._addCaseMapping(230,198)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:717
        self._addCaseMapping(231,199)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:718
        self._addCaseMapping(232,200)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:719
        self._addCaseMapping(233,201)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:720
        self._addCaseMapping(234,202)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:721
        self._addCaseMapping(235,203)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:722
        self._addCaseMapping(236,204)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:723
        self._addCaseMapping(237,205)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:724
        self._addCaseMapping(238,206)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:725
        self._addCaseMapping(239,207)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:726
        self._addCaseMapping(240,208)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:727
        self._addCaseMapping(241,209)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:728
        self._addCaseMapping(242,210)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:729
        self._addCaseMapping(243,211)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:730
        self._addCaseMapping(244,212)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:731
        self._addCaseMapping(245,213)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:732
        self._addCaseMapping(246,214)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:733
        self._addCaseMapping(248,216)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:734
        self._addCaseMapping(249,217)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:735
        self._addCaseMapping(250,218)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:736
        self._addCaseMapping(251,219)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:737
        self._addCaseMapping(252,220)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:738
        self._addCaseMapping(253,221)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:739
        self._addCaseMapping(254,222)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:740
        self._addCaseMapping(255,376)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:741
        self._addCaseMapping(257,256)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:742
        self._addCaseMapping(259,258)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:743
        self._addCaseMapping(261,260)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:744
        self._addCaseMapping(263,262)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:745
        self._addCaseMapping(265,264)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:746
        self._addCaseMapping(267,266)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:747
        self._addCaseMapping(269,268)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:748
        self._addCaseMapping(271,270)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:749
        self._addCaseMapping(273,272)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:750
        self._addCaseMapping(275,274)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:751
        self._addCaseMapping(277,276)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:752
        self._addCaseMapping(279,278)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:753
        self._addCaseMapping(281,280)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:754
        self._addCaseMapping(283,282)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:755
        self._addCaseMapping(285,284)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:756
        self._addCaseMapping(287,286)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:757
        self._addCaseMapping(289,288)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:758
        self._addCaseMapping(291,290)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:759
        self._addCaseMapping(293,292)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:760
        self._addCaseMapping(295,294)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:761
        self._addCaseMapping(297,296)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:762
        self._addCaseMapping(299,298)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:763
        self._addCaseMapping(301,300)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:764
        self._addCaseMapping(303,302)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:765
        self._addCaseMapping(305,73)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:766
        self._addCaseMapping(307,306)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:767
        self._addCaseMapping(309,308)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:768
        self._addCaseMapping(311,310)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:769
        self._addCaseMapping(314,313)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:770
        self._addCaseMapping(316,315)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:771
        self._addCaseMapping(318,317)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:772
        self._addCaseMapping(320,319)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:773
        self._addCaseMapping(322,321)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:774
        self._addCaseMapping(324,323)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:775
        self._addCaseMapping(326,325)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:776
        self._addCaseMapping(328,327)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:777
        self._addCaseMapping(331,330)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:778
        self._addCaseMapping(333,332)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:779
        self._addCaseMapping(335,334)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:780
        self._addCaseMapping(337,336)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:781
        self._addCaseMapping(339,338)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:782
        self._addCaseMapping(341,340)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:783
        self._addCaseMapping(343,342)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:784
        self._addCaseMapping(345,344)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:785
        self._addCaseMapping(347,346)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:786
        self._addCaseMapping(349,348)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:787
        self._addCaseMapping(351,350)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:788
        self._addCaseMapping(353,352)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:789
        self._addCaseMapping(355,354)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:790
        self._addCaseMapping(357,356)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:791
        self._addCaseMapping(359,358)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:792
        self._addCaseMapping(361,360)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:793
        self._addCaseMapping(363,362)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:794
        self._addCaseMapping(365,364)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:795
        self._addCaseMapping(367,366)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:796
        self._addCaseMapping(369,368)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:797
        self._addCaseMapping(371,370)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:798
        self._addCaseMapping(373,372)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:799
        self._addCaseMapping(375,374)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:800
        self._addCaseMapping(378,377)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:801
        self._addCaseMapping(380,379)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:802
        self._addCaseMapping(382,381)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:803
        self._addCaseMapping(387,386)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:804
        self._addCaseMapping(389,388)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:805
        self._addCaseMapping(392,391)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:806
        self._addCaseMapping(396,395)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:807
        self._addCaseMapping(402,401)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:808
        self._addCaseMapping(409,408)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:809
        self._addCaseMapping(417,416)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:810
        self._addCaseMapping(419,418)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:811
        self._addCaseMapping(421,420)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:812
        self._addCaseMapping(424,423)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:813
        self._addCaseMapping(429,428)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:814
        self._addCaseMapping(432,431)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:815
        self._addCaseMapping(436,435)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:816
        self._addCaseMapping(438,437)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:817
        self._addCaseMapping(441,440)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:818
        self._addCaseMapping(445,444)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:819
        self._addCaseMapping(454,452)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:820
        self._addCaseMapping(457,455)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:821
        self._addCaseMapping(460,458)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:822
        self._addCaseMapping(462,461)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:823
        self._addCaseMapping(464,463)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:824
        self._addCaseMapping(466,465)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:825
        self._addCaseMapping(468,467)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:826
        self._addCaseMapping(470,469)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:827
        self._addCaseMapping(472,471)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:828
        self._addCaseMapping(474,473)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:829
        self._addCaseMapping(476,475)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:830
        self._addCaseMapping(479,478)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:831
        self._addCaseMapping(481,480)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:832
        self._addCaseMapping(483,482)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:833
        self._addCaseMapping(485,484)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:834
        self._addCaseMapping(487,486)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:835
        self._addCaseMapping(489,488)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:836
        self._addCaseMapping(491,490)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:837
        self._addCaseMapping(493,492)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:838
        self._addCaseMapping(495,494)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:839
        self._addCaseMapping(499,497)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:840
        self._addCaseMapping(501,500)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:841
        self._addCaseMapping(507,506)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:842
        self._addCaseMapping(509,508)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:843
        self._addCaseMapping(511,510)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:844
        self._addCaseMapping(513,512)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:845
        self._addCaseMapping(515,514)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:846
        self._addCaseMapping(517,516)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:847
        self._addCaseMapping(519,518)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:848
        self._addCaseMapping(521,520)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:849
        self._addCaseMapping(523,522)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:850
        self._addCaseMapping(525,524)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:851
        self._addCaseMapping(527,526)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:852
        self._addCaseMapping(529,528)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:853
        self._addCaseMapping(531,530)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:854
        self._addCaseMapping(533,532)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:855
        self._addCaseMapping(535,534)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:856
        self._addCaseMapping(595,385)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:857
        self._addCaseMapping(596,390)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:858
        self._addCaseMapping(599,394)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:859
        self._addCaseMapping(600,398)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:860
        self._addCaseMapping(601,399)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:861
        self._addCaseMapping(603,400)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:862
        self._addCaseMapping(608,403)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:863
        self._addCaseMapping(611,404)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:864
        self._addCaseMapping(616,407)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:865
        self._addCaseMapping(617,406)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:866
        self._addCaseMapping(623,412)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:867
        self._addCaseMapping(626,413)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:868
        self._addCaseMapping(629,415)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:869
        self._addCaseMapping(643,425)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:870
        self._addCaseMapping(648,430)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:871
        self._addCaseMapping(650,433)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:872
        self._addCaseMapping(651,434)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:873
        self._addCaseMapping(658,439)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:874
        self._addCaseMapping(924,181)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:875
        self._addCaseMapping(940,902)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:876
        self._addCaseMapping(941,904)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:877
        self._addCaseMapping(942,905)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:878
        self._addCaseMapping(943,906)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:879
        self._addCaseMapping(945,913)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:880
        self._addCaseMapping(946,914)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:881
        self._addCaseMapping(947,915)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:882
        self._addCaseMapping(948,916)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:883
        self._addCaseMapping(949,917)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:884
        self._addCaseMapping(950,918)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:885
        self._addCaseMapping(951,919)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:886
        self._addCaseMapping(952,920)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:887
        self._addCaseMapping(953,921)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:888
        self._addCaseMapping(954,922)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:889
        self._addCaseMapping(955,923)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:890
        self._addCaseMapping(956,924)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:891
        self._addCaseMapping(957,925)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:892
        self._addCaseMapping(958,926)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:893
        self._addCaseMapping(959,927)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:894
        self._addCaseMapping(960,928)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:895
        self._addCaseMapping(961,929)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:896
        self._addCaseMapping(963,931)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:897
        self._addCaseMapping(964,932)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:898
        self._addCaseMapping(965,933)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:899
        self._addCaseMapping(966,934)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:900
        self._addCaseMapping(967,935)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:901
        self._addCaseMapping(968,936)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:902
        self._addCaseMapping(969,937)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:903
        self._addCaseMapping(970,938)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:904
        self._addCaseMapping(971,939)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:905
        self._addCaseMapping(972,908)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:906
        self._addCaseMapping(973,910)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:907
        self._addCaseMapping(974,911)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:908
        self._addCaseMapping(995,994)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:909
        self._addCaseMapping(997,996)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:910
        self._addCaseMapping(999,998)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:911
        self._addCaseMapping(1001,1000)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:912
        self._addCaseMapping(1003,1002)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:913
        self._addCaseMapping(1005,1004)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:914
        self._addCaseMapping(1007,1006)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:915
        self._addCaseMapping(1072,1040)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:916
        self._addCaseMapping(1073,1041)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:917
        self._addCaseMapping(1074,1042)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:918
        self._addCaseMapping(1075,1043)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:919
        self._addCaseMapping(1076,1044)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:920
        self._addCaseMapping(1077,1045)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:921
        self._addCaseMapping(1078,1046)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:922
        self._addCaseMapping(1079,1047)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:923
        self._addCaseMapping(1080,1048)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:924
        self._addCaseMapping(1081,1049)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:925
        self._addCaseMapping(1082,1050)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:926
        self._addCaseMapping(1083,1051)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:927
        self._addCaseMapping(1084,1052)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:928
        self._addCaseMapping(1085,1053)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:929
        self._addCaseMapping(1086,1054)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:930
        self._addCaseMapping(1087,1055)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:931
        self._addCaseMapping(1088,1056)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:932
        self._addCaseMapping(1089,1057)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:933
        self._addCaseMapping(1090,1058)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:934
        self._addCaseMapping(1091,1059)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:935
        self._addCaseMapping(1092,1060)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:936
        self._addCaseMapping(1093,1061)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:937
        self._addCaseMapping(1094,1062)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:938
        self._addCaseMapping(1095,1063)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:939
        self._addCaseMapping(1096,1064)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:940
        self._addCaseMapping(1097,1065)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:941
        self._addCaseMapping(1098,1066)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:942
        self._addCaseMapping(1099,1067)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:943
        self._addCaseMapping(1100,1068)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:944
        self._addCaseMapping(1101,1069)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:945
        self._addCaseMapping(1102,1070)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:946
        self._addCaseMapping(1103,1071)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:947
        self._addCaseMapping(1105,1025)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:948
        self._addCaseMapping(1106,1026)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:949
        self._addCaseMapping(1107,1027)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:950
        self._addCaseMapping(1108,1028)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:951
        self._addCaseMapping(1109,1029)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:952
        self._addCaseMapping(1110,1030)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:953
        self._addCaseMapping(1111,1031)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:954
        self._addCaseMapping(1112,1032)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:955
        self._addCaseMapping(1113,1033)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:956
        self._addCaseMapping(1114,1034)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:957
        self._addCaseMapping(1115,1035)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:958
        self._addCaseMapping(1116,1036)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:959
        self._addCaseMapping(1118,1038)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:960
        self._addCaseMapping(1119,1039)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:961
        self._addCaseMapping(1121,1120)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:962
        self._addCaseMapping(1123,1122)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:963
        self._addCaseMapping(1125,1124)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:964
        self._addCaseMapping(1127,1126)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:965
        self._addCaseMapping(1129,1128)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:966
        self._addCaseMapping(1131,1130)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:967
        self._addCaseMapping(1133,1132)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:968
        self._addCaseMapping(1135,1134)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:969
        self._addCaseMapping(1137,1136)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:970
        self._addCaseMapping(1139,1138)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:971
        self._addCaseMapping(1141,1140)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:972
        self._addCaseMapping(1143,1142)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:973
        self._addCaseMapping(1145,1144)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:974
        self._addCaseMapping(1147,1146)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:975
        self._addCaseMapping(1149,1148)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:976
        self._addCaseMapping(1151,1150)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:977
        self._addCaseMapping(1153,1152)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:978
        self._addCaseMapping(1169,1168)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:979
        self._addCaseMapping(1171,1170)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:980
        self._addCaseMapping(1173,1172)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:981
        self._addCaseMapping(1175,1174)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:982
        self._addCaseMapping(1177,1176)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:983
        self._addCaseMapping(1179,1178)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:984
        self._addCaseMapping(1181,1180)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:985
        self._addCaseMapping(1183,1182)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:986
        self._addCaseMapping(1185,1184)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:987
        self._addCaseMapping(1187,1186)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:988
        self._addCaseMapping(1189,1188)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:989
        self._addCaseMapping(1191,1190)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:990
        self._addCaseMapping(1193,1192)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:991
        self._addCaseMapping(1195,1194)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:992
        self._addCaseMapping(1197,1196)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:993
        self._addCaseMapping(1199,1198)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:994
        self._addCaseMapping(1201,1200)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:995
        self._addCaseMapping(1203,1202)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:996
        self._addCaseMapping(1205,1204)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:997
        self._addCaseMapping(1207,1206)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:998
        self._addCaseMapping(1209,1208)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:999
        self._addCaseMapping(1211,1210)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1000
        self._addCaseMapping(1213,1212)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1001
        self._addCaseMapping(1215,1214)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1002
        self._addCaseMapping(1218,1217)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1003
        self._addCaseMapping(1220,1219)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1004
        self._addCaseMapping(1224,1223)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1005
        self._addCaseMapping(1228,1227)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1006
        self._addCaseMapping(1233,1232)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1007
        self._addCaseMapping(1235,1234)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1008
        self._addCaseMapping(1237,1236)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1009
        self._addCaseMapping(1239,1238)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1010
        self._addCaseMapping(1241,1240)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1011
        self._addCaseMapping(1243,1242)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1012
        self._addCaseMapping(1245,1244)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1013
        self._addCaseMapping(1247,1246)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1014
        self._addCaseMapping(1249,1248)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1015
        self._addCaseMapping(1251,1250)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1016
        self._addCaseMapping(1253,1252)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1017
        self._addCaseMapping(1255,1254)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1018
        self._addCaseMapping(1257,1256)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1019
        self._addCaseMapping(1259,1258)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1020
        self._addCaseMapping(1263,1262)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1021
        self._addCaseMapping(1265,1264)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1022
        self._addCaseMapping(1267,1266)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1023
        self._addCaseMapping(1269,1268)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1024
        self._addCaseMapping(1273,1272)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1025
        self._addCaseMapping(1377,1329)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1026
        self._addCaseMapping(1378,1330)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1027
        self._addCaseMapping(1379,1331)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1028
        self._addCaseMapping(1380,1332)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1029
        self._addCaseMapping(1381,1333)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1030
        self._addCaseMapping(1382,1334)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1031
        self._addCaseMapping(1383,1335)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1032
        self._addCaseMapping(1384,1336)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1033
        self._addCaseMapping(1385,1337)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1034
        self._addCaseMapping(1386,1338)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1035
        self._addCaseMapping(1387,1339)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1036
        self._addCaseMapping(1388,1340)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1037
        self._addCaseMapping(1389,1341)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1038
        self._addCaseMapping(1390,1342)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1039
        self._addCaseMapping(1391,1343)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1040
        self._addCaseMapping(1392,1344)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1041
        self._addCaseMapping(1393,1345)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1042
        self._addCaseMapping(1394,1346)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1043
        self._addCaseMapping(1395,1347)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1044
        self._addCaseMapping(1396,1348)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1045
        self._addCaseMapping(1397,1349)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1046
        self._addCaseMapping(1398,1350)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1047
        self._addCaseMapping(1399,1351)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1048
        self._addCaseMapping(1400,1352)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1049
        self._addCaseMapping(1401,1353)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1050
        self._addCaseMapping(1402,1354)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1051
        self._addCaseMapping(1403,1355)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1052
        self._addCaseMapping(1404,1356)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1053
        self._addCaseMapping(1405,1357)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1054
        self._addCaseMapping(1406,1358)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1055
        self._addCaseMapping(1407,1359)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1056
        self._addCaseMapping(1408,1360)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1057
        self._addCaseMapping(1409,1361)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1058
        self._addCaseMapping(1410,1362)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1059
        self._addCaseMapping(1411,1363)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1060
        self._addCaseMapping(1412,1364)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1061
        self._addCaseMapping(1413,1365)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1062
        self._addCaseMapping(1414,1366)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1063
        self._addCaseMapping(4304,4256)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1064
        self._addCaseMapping(4305,4257)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1065
        self._addCaseMapping(4306,4258)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1066
        self._addCaseMapping(4307,4259)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1067
        self._addCaseMapping(4308,4260)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1068
        self._addCaseMapping(4309,4261)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1069
        self._addCaseMapping(4310,4262)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1070
        self._addCaseMapping(4311,4263)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1071
        self._addCaseMapping(4312,4264)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1072
        self._addCaseMapping(4313,4265)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1073
        self._addCaseMapping(4314,4266)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1074
        self._addCaseMapping(4315,4267)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1075
        self._addCaseMapping(4316,4268)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1076
        self._addCaseMapping(4317,4269)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1077
        self._addCaseMapping(4318,4270)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1078
        self._addCaseMapping(4319,4271)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1079
        self._addCaseMapping(4320,4272)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1080
        self._addCaseMapping(4321,4273)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1081
        self._addCaseMapping(4322,4274)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1082
        self._addCaseMapping(4323,4275)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1083
        self._addCaseMapping(4324,4276)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1084
        self._addCaseMapping(4325,4277)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1085
        self._addCaseMapping(4326,4278)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1086
        self._addCaseMapping(4327,4279)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1087
        self._addCaseMapping(4328,4280)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1088
        self._addCaseMapping(4329,4281)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1089
        self._addCaseMapping(4330,4282)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1090
        self._addCaseMapping(4331,4283)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1091
        self._addCaseMapping(4332,4284)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1092
        self._addCaseMapping(4333,4285)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1093
        self._addCaseMapping(4334,4286)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1094
        self._addCaseMapping(4335,4287)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1095
        self._addCaseMapping(4336,4288)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1096
        self._addCaseMapping(4337,4289)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1097
        self._addCaseMapping(4338,4290)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1098
        self._addCaseMapping(4339,4291)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1099
        self._addCaseMapping(4340,4292)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1100
        self._addCaseMapping(4341,4293)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1101
        self._addCaseMapping(7681,7680)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1102
        self._addCaseMapping(7683,7682)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1103
        self._addCaseMapping(7685,7684)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1104
        self._addCaseMapping(7687,7686)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1105
        self._addCaseMapping(7689,7688)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1106
        self._addCaseMapping(7691,7690)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1107
        self._addCaseMapping(7693,7692)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1108
        self._addCaseMapping(7695,7694)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1109
        self._addCaseMapping(7697,7696)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1110
        self._addCaseMapping(7699,7698)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1111
        self._addCaseMapping(7701,7700)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1112
        self._addCaseMapping(7703,7702)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1113
        self._addCaseMapping(7705,7704)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1114
        self._addCaseMapping(7707,7706)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1115
        self._addCaseMapping(7709,7708)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1116
        self._addCaseMapping(7711,7710)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1117
        self._addCaseMapping(7713,7712)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1118
        self._addCaseMapping(7715,7714)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1119
        self._addCaseMapping(7717,7716)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1120
        self._addCaseMapping(7719,7718)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1121
        self._addCaseMapping(7721,7720)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1122
        self._addCaseMapping(7723,7722)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1123
        self._addCaseMapping(7725,7724)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1124
        self._addCaseMapping(7727,7726)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1125
        self._addCaseMapping(7729,7728)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1126
        self._addCaseMapping(7731,7730)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1127
        self._addCaseMapping(7733,7732)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1128
        self._addCaseMapping(7735,7734)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1129
        self._addCaseMapping(7737,7736)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1130
        self._addCaseMapping(7739,7738)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1131
        self._addCaseMapping(7741,7740)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1132
        self._addCaseMapping(7743,7742)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1133
        self._addCaseMapping(7745,7744)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1134
        self._addCaseMapping(7747,7746)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1135
        self._addCaseMapping(7749,7748)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1136
        self._addCaseMapping(7751,7750)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1137
        self._addCaseMapping(7753,7752)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1138
        self._addCaseMapping(7755,7754)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1139
        self._addCaseMapping(7757,7756)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1140
        self._addCaseMapping(7759,7758)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1141
        self._addCaseMapping(7761,7760)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1142
        self._addCaseMapping(7763,7762)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1143
        self._addCaseMapping(7765,7764)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1144
        self._addCaseMapping(7767,7766)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1145
        self._addCaseMapping(7769,7768)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1146
        self._addCaseMapping(7771,7770)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1147
        self._addCaseMapping(7773,7772)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1148
        self._addCaseMapping(7775,7774)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1149
        self._addCaseMapping(7777,7776)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1150
        self._addCaseMapping(7779,7778)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1151
        self._addCaseMapping(7781,7780)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1152
        self._addCaseMapping(7783,7782)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1153
        self._addCaseMapping(7785,7784)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1154
        self._addCaseMapping(7787,7786)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1155
        self._addCaseMapping(7789,7788)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1156
        self._addCaseMapping(7791,7790)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1157
        self._addCaseMapping(7793,7792)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1158
        self._addCaseMapping(7795,7794)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1159
        self._addCaseMapping(7797,7796)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1160
        self._addCaseMapping(7799,7798)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1161
        self._addCaseMapping(7801,7800)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1162
        self._addCaseMapping(7803,7802)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1163
        self._addCaseMapping(7805,7804)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1164
        self._addCaseMapping(7807,7806)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1165
        self._addCaseMapping(7809,7808)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1166
        self._addCaseMapping(7811,7810)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1167
        self._addCaseMapping(7813,7812)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1168
        self._addCaseMapping(7815,7814)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1169
        self._addCaseMapping(7817,7816)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1170
        self._addCaseMapping(7819,7818)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1171
        self._addCaseMapping(7821,7820)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1172
        self._addCaseMapping(7823,7822)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1173
        self._addCaseMapping(7825,7824)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1174
        self._addCaseMapping(7827,7826)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1175
        self._addCaseMapping(7829,7828)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1176
        self._addCaseMapping(7841,7840)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1177
        self._addCaseMapping(7843,7842)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1178
        self._addCaseMapping(7845,7844)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1179
        self._addCaseMapping(7847,7846)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1180
        self._addCaseMapping(7849,7848)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1181
        self._addCaseMapping(7851,7850)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1182
        self._addCaseMapping(7853,7852)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1183
        self._addCaseMapping(7855,7854)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1184
        self._addCaseMapping(7857,7856)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1185
        self._addCaseMapping(7859,7858)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1186
        self._addCaseMapping(7861,7860)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1187
        self._addCaseMapping(7863,7862)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1188
        self._addCaseMapping(7865,7864)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1189
        self._addCaseMapping(7867,7866)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1190
        self._addCaseMapping(7869,7868)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1191
        self._addCaseMapping(7871,7870)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1192
        self._addCaseMapping(7873,7872)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1193
        self._addCaseMapping(7875,7874)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1194
        self._addCaseMapping(7877,7876)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1195
        self._addCaseMapping(7879,7878)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1196
        self._addCaseMapping(7881,7880)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1197
        self._addCaseMapping(7883,7882)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1198
        self._addCaseMapping(7885,7884)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1199
        self._addCaseMapping(7887,7886)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1200
        self._addCaseMapping(7889,7888)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1201
        self._addCaseMapping(7891,7890)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1202
        self._addCaseMapping(7893,7892)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1203
        self._addCaseMapping(7895,7894)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1204
        self._addCaseMapping(7897,7896)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1205
        self._addCaseMapping(7899,7898)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1206
        self._addCaseMapping(7901,7900)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1207
        self._addCaseMapping(7903,7902)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1208
        self._addCaseMapping(7905,7904)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1209
        self._addCaseMapping(7907,7906)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1210
        self._addCaseMapping(7909,7908)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1211
        self._addCaseMapping(7911,7910)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1212
        self._addCaseMapping(7913,7912)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1213
        self._addCaseMapping(7915,7914)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1214
        self._addCaseMapping(7917,7916)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1215
        self._addCaseMapping(7919,7918)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1216
        self._addCaseMapping(7921,7920)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1217
        self._addCaseMapping(7923,7922)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1218
        self._addCaseMapping(7925,7924)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1219
        self._addCaseMapping(7927,7926)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1220
        self._addCaseMapping(7929,7928)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1221
        self._addCaseMapping(7936,7944)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1222
        self._addCaseMapping(7937,7945)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1223
        self._addCaseMapping(7938,7946)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1224
        self._addCaseMapping(7939,7947)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1225
        self._addCaseMapping(7940,7948)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1226
        self._addCaseMapping(7941,7949)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1227
        self._addCaseMapping(7942,7950)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1228
        self._addCaseMapping(7943,7951)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1229
        self._addCaseMapping(7952,7960)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1230
        self._addCaseMapping(7953,7961)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1231
        self._addCaseMapping(7954,7962)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1232
        self._addCaseMapping(7955,7963)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1233
        self._addCaseMapping(7956,7964)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1234
        self._addCaseMapping(7957,7965)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1235
        self._addCaseMapping(7968,7976)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1236
        self._addCaseMapping(7969,7977)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1237
        self._addCaseMapping(7970,7978)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1238
        self._addCaseMapping(7971,7979)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1239
        self._addCaseMapping(7972,7980)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1240
        self._addCaseMapping(7973,7981)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1241
        self._addCaseMapping(7974,7982)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1242
        self._addCaseMapping(7975,7983)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1243
        self._addCaseMapping(7984,7992)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1244
        self._addCaseMapping(7985,7993)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1245
        self._addCaseMapping(7986,7994)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1246
        self._addCaseMapping(7987,7995)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1247
        self._addCaseMapping(7988,7996)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1248
        self._addCaseMapping(7989,7997)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1249
        self._addCaseMapping(7990,7998)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1250
        self._addCaseMapping(7991,7999)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1251
        self._addCaseMapping(8000,8008)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1252
        self._addCaseMapping(8001,8009)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1253
        self._addCaseMapping(8002,8010)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1254
        self._addCaseMapping(8003,8011)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1255
        self._addCaseMapping(8004,8012)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1256
        self._addCaseMapping(8005,8013)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1257
        self._addCaseMapping(8017,8025)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1258
        self._addCaseMapping(8019,8027)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1259
        self._addCaseMapping(8021,8029)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1260
        self._addCaseMapping(8023,8031)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1261
        self._addCaseMapping(8032,8040)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1262
        self._addCaseMapping(8033,8041)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1263
        self._addCaseMapping(8034,8042)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1264
        self._addCaseMapping(8035,8043)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1265
        self._addCaseMapping(8036,8044)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1266
        self._addCaseMapping(8037,8045)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1267
        self._addCaseMapping(8038,8046)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1268
        self._addCaseMapping(8039,8047)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1269
        self._addCaseMapping(8064,8072)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1270
        self._addCaseMapping(8065,8073)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1271
        self._addCaseMapping(8066,8074)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1272
        self._addCaseMapping(8067,8075)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1273
        self._addCaseMapping(8068,8076)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1274
        self._addCaseMapping(8069,8077)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1275
        self._addCaseMapping(8070,8078)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1276
        self._addCaseMapping(8071,8079)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1277
        self._addCaseMapping(8080,8088)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1278
        self._addCaseMapping(8081,8089)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1279
        self._addCaseMapping(8082,8090)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1280
        self._addCaseMapping(8083,8091)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1281
        self._addCaseMapping(8084,8092)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1282
        self._addCaseMapping(8085,8093)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1283
        self._addCaseMapping(8086,8094)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1284
        self._addCaseMapping(8087,8095)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1285
        self._addCaseMapping(8096,8104)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1286
        self._addCaseMapping(8097,8105)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1287
        self._addCaseMapping(8098,8106)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1288
        self._addCaseMapping(8099,8107)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1289
        self._addCaseMapping(8100,8108)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1290
        self._addCaseMapping(8101,8109)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1291
        self._addCaseMapping(8102,8110)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1292
        self._addCaseMapping(8103,8111)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1293
        self._addCaseMapping(8112,8120)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1294
        self._addCaseMapping(8113,8121)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1295
        self._addCaseMapping(8144,8152)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1296
        self._addCaseMapping(8145,8153)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1297
        self._addCaseMapping(8160,8168)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1298
        self._addCaseMapping(8161,8169)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1299
        self._addCaseMapping(9424,9398)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1300
        self._addCaseMapping(9425,9399)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1301
        self._addCaseMapping(9426,9400)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1302
        self._addCaseMapping(9427,9401)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1303
        self._addCaseMapping(9428,9402)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1304
        self._addCaseMapping(9429,9403)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1305
        self._addCaseMapping(9430,9404)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1306
        self._addCaseMapping(9431,9405)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1307
        self._addCaseMapping(9432,9406)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1308
        self._addCaseMapping(9433,9407)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1309
        self._addCaseMapping(9434,9408)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1310
        self._addCaseMapping(9435,9409)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1311
        self._addCaseMapping(9436,9410)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1312
        self._addCaseMapping(9437,9411)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1313
        self._addCaseMapping(9438,9412)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1314
        self._addCaseMapping(9439,9413)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1315
        self._addCaseMapping(9440,9414)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1316
        self._addCaseMapping(9441,9415)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1317
        self._addCaseMapping(9442,9416)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1318
        self._addCaseMapping(9443,9417)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1319
        self._addCaseMapping(9444,9418)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1320
        self._addCaseMapping(9445,9419)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1321
        self._addCaseMapping(9446,9420)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1322
        self._addCaseMapping(9447,9421)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1323
        self._addCaseMapping(9448,9422)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1324
        self._addCaseMapping(9449,9423)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1325
        self._addCaseMapping(65345,65313)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1326
        self._addCaseMapping(65346,65314)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1327
        self._addCaseMapping(65347,65315)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1328
        self._addCaseMapping(65348,65316)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1329
        self._addCaseMapping(65349,65317)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1330
        self._addCaseMapping(65350,65318)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1331
        self._addCaseMapping(65351,65319)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1332
        self._addCaseMapping(65352,65320)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1333
        self._addCaseMapping(65353,65321)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1334
        self._addCaseMapping(65354,65322)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1335
        self._addCaseMapping(65355,65323)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1336
        self._addCaseMapping(65356,65324)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1337
        self._addCaseMapping(65357,65325)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1338
        self._addCaseMapping(65358,65326)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1339
        self._addCaseMapping(65359,65327)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1340
        self._addCaseMapping(65360,65328)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1341
        self._addCaseMapping(65361,65329)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1342
        self._addCaseMapping(65362,65330)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1343
        self._addCaseMapping(65363,65331)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1344
        self._addCaseMapping(65364,65332)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1345
        self._addCaseMapping(65365,65333)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1346
        self._addCaseMapping(65366,65334)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1347
        self._addCaseMapping(65367,65335)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1348
        self._addCaseMapping(65368,65336)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1349
        self._addCaseMapping(65369,65337)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:1350
        self._addCaseMapping(65370,65338)

    def _addCaseMapping(self,lowerChar,upperChar):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:653
        if (not (upperChar in self.mapU2L.h)):
            self.mapU2L.set(upperChar,lowerChar)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:654
        if (not (lowerChar in self.mapL2U.h)):
            self.mapL2U.set(lowerChar,upperChar)

    def isLowerCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:659
        return (ch in self.mapL2U.h)

    def isUpperCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:664
        return (ch in self.mapU2L.h)

    def toLowerCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:669
        lowerChar = self.mapU2L.h.get(ch,None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:670
        if (lowerChar is None):
            return ch
        else:
            return lowerChar

    def toUpperCase(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:676
        upperChar = self.mapL2U.h.get(ch,None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:677
        if (upperChar is None):
            return ch
        else:
            return upperChar

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.mapU2L = None
        _hx_o.mapL2U = None


class hx_strings__Char_Char_Impl_:
    _hx_class_name = "hx.strings._Char.Char_Impl_"
    __slots__ = ()
    _hx_statics = ["CHAR_CASE_MAPPER", "BACKSPACE", "TAB", "LF", "CR", "ESC", "SPACE", "EXCLAMATION_MARK", "DOUBLE_QUOTE", "HASH", "DOLLAR", "AMPERSAND", "SINGLE_QUOTE", "BRACKET_ROUND_LEFT", "BRACKET_ROUND_RIGHT", "ASTERISK", "PLUS", "COMMA", "MINUS", "DOT", "SLASH", "ZERO", "ONE", "TWO", "TRHEE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "COLON", "SEMICOLON", "LOWER_THAN", "EQUALS", "GREATER_THAN", "QUESTION_MARK", "BRACKET_SQUARE_LEFT", "BACKSLASH", "BRACKET_SQUARE_RIGHT", "CARET", "UNDERSCORE", "BRACKET_CURLY_LEFT", "PIPE", "BRACKET_CURLY_RIGHT", "fromString", "of", "op_plus_string", "op_plus_string2", "op_plus", "isAscii", "isAsciiAlpha", "isAsciiAlphanumeric", "isAsciiControl", "isAsciiPrintable", "isDigit", "isEOF", "isSpace", "isUTF8", "isWhitespace", "isLowerCase", "isUpperCase", "toLowerCase", "toUpperCase", "toInt", "toString"]

    @staticmethod
    def fromString(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:261
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        if ((strLen == 0) or ((0 >= strLen))):
            return -1
        else:
            return HxString.charCodeAt(_hx_str,0)

    @staticmethod
    def of(ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:266
        return ch

    @staticmethod
    def op_plus_string(ch,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:272
        return (HxOverrides.stringOrNull("".join(map(chr,[ch]))) + ("null" if other is None else other))

    @staticmethod
    def op_plus_string2(_hx_str,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:278
        return (("null" if _hx_str is None else _hx_str) + HxOverrides.stringOrNull("".join(map(chr,[ch]))))

    @staticmethod
    def op_plus(ch,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:284
        return (ch + other)

    @staticmethod
    def isAscii(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:338
        if (this1 > -1):
            return (this1 < 128)
        else:
            return False

    @staticmethod
    def isAsciiAlpha(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:364
        if (not (((this1 > 64) and ((this1 < 91))))):
            if (this1 > 96):
                return (this1 < 123)
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiAlphanumeric(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:390
        if (not ((((this1 > 64) and ((this1 < 91))) or (((this1 > 96) and ((this1 < 123))))))):
            if (this1 > 47):
                return (this1 < 58)
            else:
                return False
        else:
            return True

    @staticmethod
    def isAsciiControl(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:414
        if (not (((this1 > -1) and ((this1 < 32))))):
            return (this1 == 127)
        else:
            return True

    @staticmethod
    def isAsciiPrintable(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:439
        if (this1 > 31):
            return (this1 < 127)
        else:
            return False

    @staticmethod
    def isDigit(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:474
        if (this1 > 47):
            return (this1 < 58)
        else:
            return False

    @staticmethod
    def isEOF(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:486
        return (this1 == -1)

    @staticmethod
    def isSpace(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:507
        return (this1 == 32)

    @staticmethod
    def isUTF8(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:533
        if (this1 > -1):
            return (this1 < 1114112)
        else:
            return False

    @staticmethod
    def isWhitespace(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:554
        if (not (((this1 > 8) and ((this1 < 14))))):
            return (this1 == 32)
        else:
            return True

    @staticmethod
    def isLowerCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:566
        return (this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h)

    @staticmethod
    def isUpperCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:578
        return (this1 in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h)

    @staticmethod
    def toLowerCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:590
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(this1,None)
        if (lowerChar is None):
            return this1
        else:
            return lowerChar

    @staticmethod
    def toUpperCase(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:602
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(this1,None)
        if (upperChar is None):
            return this1
        else:
            return upperChar

    @staticmethod
    def toInt(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:614
        return this1

    @staticmethod
    def toString(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Char.hx:630
        return "".join(map(chr,[this1]))


class hx_strings_CharIterator:
    _hx_class_name = "hx.strings.CharIterator"
    __slots__ = ("index", "line", "col", "currChar", "prevBuffer", "prevBufferPrevIdx", "prevBufferNextIdx")
    _hx_fields = ["index", "line", "col", "currChar", "prevBuffer", "prevBufferPrevIdx", "prevBufferNextIdx"]
    _hx_methods = ["get_current", "get_pos", "hasPrev", "prev", "hasNext", "next", "getChar", "isEOF"]
    _hx_statics = ["fromString", "fromArray", "fromInput", "fromIterator"]

    def __init__(self,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:103
        self.prevBufferNextIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:102
        self.prevBufferPrevIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:99
        self.currChar = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:98
        self.col = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:97
        self.line = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:96
        self.index = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:117
        tmp = None
        if (prevBufferSize > 0):
            this1 = hx_strings_internal__RingBuffer_RingBufferImpl((prevBufferSize + 1))
            tmp = this1
        else:
            tmp = None
        self.prevBuffer = tmp

    def get_current(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:108
        if (self.index > -1):
            return self.currChar
        else:
            return None

    def get_pos(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:113
        return hx_strings_CharPos(self.index,self.line,self.col)

    def hasPrev(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:122
        return (self.prevBufferPrevIdx > -1)

    def prev(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:131
        if (self.prevBufferPrevIdx <= -1):
            raise haxe_Exception.thrown(haxe_io_Eof())
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:134
        prevChar = self.prevBuffer.get(self.prevBufferPrevIdx)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:135
        self.currChar = prevChar.char
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:136
        self.index = prevChar.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:137
        self.line = prevChar.line
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:138
        self.col = prevChar.col
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:140
        self.prevBufferNextIdx = ((self.prevBufferPrevIdx + 1) if (((self.prevBufferPrevIdx + 1) < self.prevBuffer.length)) else -1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:141
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:141
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.prevBufferPrevIdx
        _hx_local_0.prevBufferPrevIdx = (_hx_local_1 - 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:142
        return self.currChar

    def hasNext(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:148
        if (self.prevBufferNextIdx > -1):
            return True
        else:
            return (not self.isEOF())

    def next(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:158
        if (self.prevBufferNextIdx > -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:159
            prevChar = self.prevBuffer.get(self.prevBufferNextIdx)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:160
            self.currChar = prevChar.char
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:161
            self.index = prevChar.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:162
            self.line = prevChar.line
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:163
            self.col = prevChar.col
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:164
            self.prevBufferPrevIdx = (self.prevBufferNextIdx - 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:165
            self.prevBufferNextIdx = ((self.prevBufferNextIdx + 1) if (((self.prevBufferNextIdx + 1) < self.prevBuffer.length)) else -1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:166
            return self.currChar
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:169
        if self.isEOF():
            raise haxe_Exception.thrown(haxe_io_Eof())
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:172
        if ((self.currChar == 10) or ((self.currChar < 0))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:173
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:173
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.line
            _hx_local_0.line = (_hx_local_1 + 1)
            _hx_local_1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:174
            self.col = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:177
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:177
        _hx_local_2 = self
        _hx_local_3 = _hx_local_2.index
        _hx_local_2.index = (_hx_local_3 + 1)
        _hx_local_3
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:178
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:178
        _hx_local_4 = self
        _hx_local_5 = _hx_local_4.col
        _hx_local_4.col = (_hx_local_5 + 1)
        _hx_local_5
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:179
        self.currChar = self.getChar()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:181
        if (self.prevBuffer is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:182
            self.prevBuffer.add(hx_strings__CharIterator_CharWithPos(self.currChar,self.index,self.col,self.line))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:183
            self.prevBufferPrevIdx = (self.prevBuffer.length - 2)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:184
            self.prevBufferNextIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:187
        return self.currChar

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:194
        raise haxe_Exception.thrown("Not implemented")

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:196
        raise haxe_Exception.thrown("Not implemented")

    @staticmethod
    def fromString(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:34
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:35
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:36
        return hx_strings__CharIterator_StringCharIterator(chars,prevBufferSize)

    @staticmethod
    def fromArray(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:52
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:53
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:54
        return hx_strings__CharIterator_ArrayCharIterator(chars,prevBufferSize)

    @staticmethod
    def fromInput(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:72
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:73
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:74
        return hx_strings__CharIterator_InputCharIterator(chars,prevBufferSize)

    @staticmethod
    def fromIterator(chars,prevBufferSize = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:90
        if (prevBufferSize is None):
            prevBufferSize = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:91
        if (chars is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:92
        return hx_strings__CharIterator_IteratorCharIterator(chars,prevBufferSize)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None
        _hx_o.currChar = None
        _hx_o.prevBuffer = None
        _hx_o.prevBufferPrevIdx = None
        _hx_o.prevBufferNextIdx = None


class hx_strings_CharPos:
    _hx_class_name = "hx.strings.CharPos"
    __slots__ = ("index", "line", "col")
    _hx_fields = ["index", "line", "col"]
    _hx_methods = ["toString"]

    def __init__(self,index,line,col):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4124
        self.index = index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4125
        self.line = line
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4126
        self.col = col

    def toString(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4151
        return (((((("CharPos[index=" + Std.string(self.index)) + ", line=") + Std.string(self.line)) + ", col=") + Std.string(self.col)) + "]")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.index = None
        _hx_o.line = None
        _hx_o.col = None


class hx_strings__CharIterator_CharWithPos(hx_strings_CharPos):
    _hx_class_name = "hx.strings._CharIterator.CharWithPos"
    __slots__ = ("char",)
    _hx_fields = ["char"]
    _hx_methods = []
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharPos


    def __init__(self,char,index,line,col):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:202
        self.char = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:205
        super().__init__(index,line,col)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:206
        self.char = char

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.char = None


class hx_strings_internal__RingBuffer_RingBufferImpl:
    _hx_class_name = "hx.strings.internal._RingBuffer.RingBufferImpl"
    __slots__ = ("buffer", "bufferStartIdx", "bufferEndIdx", "bufferMaxIdx", "length", "size")
    _hx_fields = ["buffer", "bufferStartIdx", "bufferEndIdx", "bufferMaxIdx", "length", "size"]
    _hx_methods = ["add", "get", "iterator", "toArray"]

    def __init__(self,size):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:46
        self.length = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:42
        self.bufferEndIdx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:41
        self.bufferStartIdx = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:51
        if (size < 1):
            raise haxe_Exception.thrown("[size] must be > 0")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:57
        this1 = [None]*size
        self.buffer = this1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:59
        self.size = size
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:60
        self.bufferMaxIdx = (size - 1)

    def add(self,item):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:65
        if (self.length == self.size):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:66
            self.bufferEndIdx = self.bufferStartIdx
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:67
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:67
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.bufferStartIdx
            _hx_local_0.bufferStartIdx = (_hx_local_1 + 1)
            _hx_local_1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:68
            if (self.bufferStartIdx > self.bufferMaxIdx):
                self.bufferStartIdx = 0
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:71
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:71
            _hx_local_2 = self
            _hx_local_3 = _hx_local_2.bufferEndIdx
            _hx_local_2.bufferEndIdx = (_hx_local_3 + 1)
            _hx_local_3
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:72
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:72
            _hx_local_4 = self
            _hx_local_5 = _hx_local_4.length
            _hx_local_4.length = (_hx_local_5 + 1)
            _hx_local_5
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:74
        self.buffer[self.bufferEndIdx] = item

    def get(self,index):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:79
        if ((index < 0) or ((index > self.bufferMaxIdx))):
            raise haxe_Exception.thrown((("[index] " + Std.string(index)) + " is out of bound"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:82
        realIdx = (self.bufferStartIdx + index)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:83
        if (realIdx > self.bufferMaxIdx):
            realIdx = (realIdx - self.length)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:85
        return self.buffer[realIdx]

    def iterator(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:90
        return hx_strings_internal__RingBuffer_RingBufferIterator(self)

    def toArray(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:94
        arr = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:95
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:95
        i = self.iterator()
        while i.hasNext():
            i1 = i.next()
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:96
            arr.append(i1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:97
        return arr

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buffer = None
        _hx_o.bufferStartIdx = None
        _hx_o.bufferEndIdx = None
        _hx_o.bufferMaxIdx = None
        _hx_o.length = None
        _hx_o.size = None


class python_Boot:
    _hx_class_name = "python.Boot"
    __slots__ = ()
    _hx_statics = ["keywords", "toString1", "fields", "simpleField", "field", "getInstanceFields", "getSuperClass", "getClassFields", "prefixLength", "unhandleKeywords"]

    @staticmethod
    def toString1(o,s):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:87
        if (o is None):
            return "null"
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:90
        if isinstance(o,str):
            return o
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:93
        if (s is None):
            s = ""
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:95
        if (len(s) >= 5):
            return "<...>"
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:98
        if isinstance(o,bool):
            if o:
                return "true"
            else:
                return "false"
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:104
        if (isinstance(o,int) and (not isinstance(o,bool))):
            return str(o)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:108
        if isinstance(o,float):
            try:
                if (o == int(o)):
                    return str(Math.floor((o + 0.5)))
                else:
                    return str(o)
            except BaseException as _g:
                return str(o)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:120
        if isinstance(o,list):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:121
            o1 = o
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:123
            l = len(o1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:125
            st = "["
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:126
            s = (("null" if s is None else s) + "\t")
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:127
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:127
            _g = 0
            _g1 = l
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:128
                prefix = ""
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:129
                if (i > 0):
                    prefix = ","
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:132
                st = (("null" if st is None else st) + HxOverrides.stringOrNull(((("null" if prefix is None else prefix) + HxOverrides.stringOrNull(python_Boot.toString1((o1[i] if i >= 0 and i < len(o1) else None),s))))))
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:134
            st = (("null" if st is None else st) + "]")
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:135
            return st
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:138
        try:
            if hasattr(o,"toString"):
                return o.toString()
        except BaseException as _g:
            pass
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:143
        if hasattr(o,"__class__"):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:144
            if isinstance(o,_hx_AnonObject):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:145
                toStr = None
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:146
                try:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:147
                    fields = python_Boot.fields(o)
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:148
                    _g = []
                    _g1 = 0
                    while (_g1 < len(fields)):
                        f = (fields[_g1] if _g1 >= 0 and _g1 < len(fields) else None)
                        _g1 = (_g1 + 1)
                        x = ((("" + ("null" if f is None else f)) + " : ") + HxOverrides.stringOrNull(python_Boot.toString1(python_Boot.simpleField(o,f),(("null" if s is None else s) + "\t"))))
                        _g.append(x)
                    fieldsStr = _g
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:149
                    toStr = (("{ " + HxOverrides.stringOrNull(", ".join([x1 for x1 in fieldsStr]))) + " }")
                except BaseException as _g:
                    return "{ ... }"
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:154
                if (toStr is None):
                    return "{ ... }"
                else:
                    return toStr
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:160
            if isinstance(o,Enum):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:161
                o1 = o
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:163
                l = len(o1.params)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:164
                hasParams = (l > 0)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:165
                if hasParams:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:166
                    paramsStr = ""
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:167
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:167
                    _g = 0
                    _g1 = l
                    while (_g < _g1):
                        i = _g
                        _g = (_g + 1)
                        # C:\HaxeToolkit\haxe\std/python/Boot.hx:168
                        prefix = ""
                        # C:\HaxeToolkit\haxe\std/python/Boot.hx:169
                        if (i > 0):
                            prefix = ","
                        # C:\HaxeToolkit\haxe\std/python/Boot.hx:172
                        paramsStr = (("null" if paramsStr is None else paramsStr) + HxOverrides.stringOrNull(((("null" if prefix is None else prefix) + HxOverrides.stringOrNull(python_Boot.toString1(o1.params[i],s))))))
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:174
                    return (((HxOverrides.stringOrNull(o1.tag) + "(") + ("null" if paramsStr is None else paramsStr)) + ")")
                else:
                    return o1.tag
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:180
            if hasattr(o,"_hx_class_name"):
                if (o.__class__.__name__ != "type"):
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:182
                    fields = python_Boot.getInstanceFields(o)
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:183
                    _g = []
                    _g1 = 0
                    while (_g1 < len(fields)):
                        f = (fields[_g1] if _g1 >= 0 and _g1 < len(fields) else None)
                        _g1 = (_g1 + 1)
                        x = ((("" + ("null" if f is None else f)) + " : ") + HxOverrides.stringOrNull(python_Boot.toString1(python_Boot.simpleField(o,f),(("null" if s is None else s) + "\t"))))
                        _g.append(x)
                    fieldsStr = _g
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:185
                    toStr = (((HxOverrides.stringOrNull(o._hx_class_name) + "( ") + HxOverrides.stringOrNull(", ".join([x1 for x1 in fieldsStr]))) + " )")
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:186
                    return toStr
                else:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:188
                    fields = python_Boot.getClassFields(o)
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:189
                    _g = []
                    _g1 = 0
                    while (_g1 < len(fields)):
                        f = (fields[_g1] if _g1 >= 0 and _g1 < len(fields) else None)
                        _g1 = (_g1 + 1)
                        x = ((("" + ("null" if f is None else f)) + " : ") + HxOverrides.stringOrNull(python_Boot.toString1(python_Boot.simpleField(o,f),(("null" if s is None else s) + "\t"))))
                        _g.append(x)
                    fieldsStr = _g
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:190
                    toStr = (((("#" + HxOverrides.stringOrNull(o._hx_class_name)) + "( ") + HxOverrides.stringOrNull(", ".join([x1 for x1 in fieldsStr]))) + " )")
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:191
                    return toStr
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:195
            if (o == str):
                return "#String"
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:199
            if (o == list):
                return "#Array"
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:203
            if callable(o):
                return "function"
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:206
            try:
                if hasattr(o,"__repr__"):
                    return o.__repr__()
            except BaseException as _g:
                pass
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:212
            if hasattr(o,"__str__"):
                return o.__str__([])
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:216
            if hasattr(o,"__name__"):
                return o.__name__
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:219
            return "???"
        else:
            return str(o)

    @staticmethod
    def fields(o):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:231
        a = []
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:232
        if (o is not None):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:233
            if hasattr(o,"_hx_fields"):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:234
                fields = o._hx_fields
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:235
                if (fields is not None):
                    return list(fields)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:239
            if isinstance(o,_hx_AnonObject):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:240
                d = o.__dict__
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:241
                keys = d.keys()
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:242
                handler = python_Boot.unhandleKeywords
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:244
                for k in keys:
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:245
                    if (k != '_hx_disable_getattr'):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:246
                        a.append(handler(k))
            elif hasattr(o,"__dict__"):
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:249
                d = o.__dict__
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:250
                keys1 = d.keys()
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:251
                for k in keys1:
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:252
                    a.append(k)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:255
        return a

    @staticmethod
    def simpleField(o,field):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:267
        if (field is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:270
        field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:271
        if hasattr(o,field1):
            return getattr(o,field1)
        else:
            return None

    @staticmethod
    def field(o,field):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:287
        if (field is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:295
        if isinstance(o,str):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:296
            field1 = field
            _hx_local_0 = len(field1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:306
            if (_hx_local_0 == 10):
                if (field1 == "charCodeAt"):
                    return python_internal_MethodClosure(o,HxString.charCodeAt)
                else:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:320
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 11):
                if (field1 == "lastIndexOf"):
                    return python_internal_MethodClosure(o,HxString.lastIndexOf)
                elif (field1 == "toLowerCase"):
                    return python_internal_MethodClosure(o,HxString.toLowerCase)
                elif (field1 == "toUpperCase"):
                    return python_internal_MethodClosure(o,HxString.toUpperCase)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 9):
                if (field1 == "substring"):
                    return python_internal_MethodClosure(o,HxString.substring)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 5):
                if (field1 == "split"):
                    return python_internal_MethodClosure(o,HxString.split)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 7):
                if (field1 == "indexOf"):
                    return python_internal_MethodClosure(o,HxString.indexOf)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 8):
                if (field1 == "toString"):
                    return python_internal_MethodClosure(o,HxString.toString)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_0 == 6):
                if (field1 == "charAt"):
                    return python_internal_MethodClosure(o,HxString.charAt)
                elif (field1 == "length"):
                    return len(o)
                elif (field1 == "substr"):
                    return python_internal_MethodClosure(o,HxString.substr)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            else:
                field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                if hasattr(o,field1):
                    return getattr(o,field1)
                else:
                    return None
        elif isinstance(o,list):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:323
            field1 = field
            _hx_local_1 = len(field1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:353
            if (_hx_local_1 == 11):
                if (field1 == "lastIndexOf"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.lastIndexOf)
                else:
                    # C:\HaxeToolkit\haxe\std/python/Boot.hx:369
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 4):
                if (field1 == "copy"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.copy)
                elif (field1 == "join"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.join)
                elif (field1 == "push"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.push)
                elif (field1 == "sort"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.sort)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 5):
                if (field1 == "shift"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.shift)
                elif (field1 == "slice"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.slice)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 7):
                if (field1 == "indexOf"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.indexOf)
                elif (field1 == "reverse"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.reverse)
                elif (field1 == "unshift"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.unshift)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 3):
                if (field1 == "map"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.map)
                elif (field1 == "pop"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.pop)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 8):
                if (field1 == "contains"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.contains)
                elif (field1 == "iterator"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.iterator)
                elif (field1 == "toString"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.toString)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 16):
                if (field1 == "keyValueIterator"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.keyValueIterator)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            elif (_hx_local_1 == 6):
                if (field1 == "concat"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.concat)
                elif (field1 == "filter"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.filter)
                elif (field1 == "insert"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.insert)
                elif (field1 == "length"):
                    return len(o)
                elif (field1 == "remove"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.remove)
                elif (field1 == "splice"):
                    return python_internal_MethodClosure(o,python_internal_ArrayImpl.splice)
                else:
                    field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                    if hasattr(o,field1):
                        return getattr(o,field1)
                    else:
                        return None
            else:
                field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
                if hasattr(o,field1):
                    return getattr(o,field1)
                else:
                    return None
        else:
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:372
            field1 = (("_hx_" + field) if ((field in python_Boot.keywords)) else (("_hx_" + field) if (((((len(field) > 2) and ((ord(field[0]) == 95))) and ((ord(field[1]) == 95))) and ((ord(field[(len(field) - 1)]) != 95)))) else field))
            if hasattr(o,field1):
                return getattr(o,field1)
            else:
                return None

    @staticmethod
    def getInstanceFields(c):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:377
        f = (list(c._hx_fields) if (hasattr(c,"_hx_fields")) else [])
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:378
        if hasattr(c,"_hx_methods"):
            f = (f + c._hx_methods)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:381
        sc = python_Boot.getSuperClass(c)
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:383
        if (sc is None):
            return f
        else:
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:386
            scArr = python_Boot.getInstanceFields(sc)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:387
            scMap = set(scArr)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:388
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:388
            _g = 0
            while (_g < len(f)):
                f1 = (f[_g] if _g >= 0 and _g < len(f) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe\std/python/Boot.hx:389
                if (not (f1 in scMap)):
                    scArr.append(f1)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:394
            return scArr

    @staticmethod
    def getSuperClass(c):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:399
        if (c is None):
            return None
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:402
        try:
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:403
            if hasattr(c,"_hx_super"):
                return c._hx_super
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:406
            return None
        except BaseException as _g:
            pass
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:408
        return None

    @staticmethod
    def getClassFields(c):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:412
        if hasattr(c,"_hx_statics"):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:413
            x = c._hx_statics
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:414
            return list(x)
        else:
            return []

    @staticmethod
    def unhandleKeywords(name):
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:439
        if (HxString.substr(name,0,python_Boot.prefixLength) == "_hx_"):
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:440
            real = HxString.substr(name,python_Boot.prefixLength,None)
            # C:\HaxeToolkit\haxe\std/python/Boot.hx:441
            if (real in python_Boot.keywords):
                return real
        # C:\HaxeToolkit\haxe\std/python/Boot.hx:444
        return name


class HxString:
    _hx_class_name = "HxString"
    __slots__ = ()
    _hx_statics = ["split", "charCodeAt", "charAt", "lastIndexOf", "toUpperCase", "toLowerCase", "indexOf", "indexOfImpl", "toString", "substring", "substr"]

    @staticmethod
    def split(s,d):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:31
        if (d == ""):
            return list(s)
        else:
            return s.split(d)

    @staticmethod
    def charCodeAt(s,index):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:36
        if ((((s is None) or ((len(s) == 0))) or ((index < 0))) or ((index >= len(s)))):
            return None
        else:
            return ord(s[index])

    @staticmethod
    def charAt(s,index):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:41
        if ((index < 0) or ((index >= len(s)))):
            return ""
        else:
            return s[index]

    @staticmethod
    def lastIndexOf(s,_hx_str,startIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:46
        if (startIndex is None):
            return s.rfind(_hx_str, 0, len(s))
        elif (_hx_str == ""):
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:49
            length = len(s)
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:50
            if (startIndex < 0):
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:51
                startIndex = (length + startIndex)
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:52
                if (startIndex < 0):
                    startIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:54
            if (startIndex > length):
                return length
            else:
                return startIndex
        else:
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:56
            i = s.rfind(_hx_str, 0, (startIndex + 1))
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:57
            startLeft = (max(0,((startIndex + 1) - len(_hx_str))) if ((i == -1)) else (i + 1))
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:58
            check = s.find(_hx_str, startLeft, len(s))
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:59
            if ((check > i) and ((check <= startIndex))):
                return check
            else:
                return i

    @staticmethod
    def toUpperCase(s):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:69
        return s.upper()

    @staticmethod
    def toLowerCase(s):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:74
        return s.lower()

    @staticmethod
    def indexOf(s,_hx_str,startIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:79
        if (startIndex is None):
            return s.find(_hx_str)
        else:
            return HxString.indexOfImpl(s,_hx_str,startIndex)

    @staticmethod
    def indexOfImpl(s,_hx_str,startIndex):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:86
        if (_hx_str == ""):
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:87
            length = len(s)
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:88
            if (startIndex < 0):
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:89
                startIndex = (length + startIndex)
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:90
                if (startIndex < 0):
                    startIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:92
            if (startIndex > length):
                return length
            else:
                return startIndex
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:94
        return s.find(_hx_str, startIndex)

    @staticmethod
    def toString(s):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:99
        return s

    @staticmethod
    def substring(s,startIndex,endIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:118
        if (startIndex < 0):
            startIndex = 0
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:120
        if (endIndex is None):
            return s[startIndex:]
        else:
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:123
            if (endIndex < 0):
                endIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:125
            if (endIndex < startIndex):
                return s[endIndex:startIndex]
            else:
                return s[startIndex:endIndex]

    @staticmethod
    def substr(s,startIndex,_hx_len = None):
        # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:135
        if (_hx_len is None):
            return s[startIndex:]
        else:
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:138
            if (_hx_len == 0):
                return ""
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:140
            if (startIndex < 0):
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:141
                startIndex = (len(s) + startIndex)
                # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:142
                if (startIndex < 0):
                    startIndex = 0
            # C:\HaxeToolkit\haxe\std/python/internal/StringImpl.hx:145
            return s[startIndex:(startIndex + _hx_len)]


class hx_strings__CharIterator_NullCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.NullCharIterator"
    __slots__ = ()
    _hx_fields = []
    _hx_methods = ["isEOF"]
    _hx_statics = ["INSTANCE"]
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:218
        super().__init__(0)

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:223
        return True

    @staticmethod
    def _hx_empty_init(_hx_o):        pass


class hx_strings__CharIterator_ArrayCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.ArrayCharIterator"
    __slots__ = ("chars", "charsMaxIndex")
    _hx_fields = ["chars", "charsMaxIndex"]
    _hx_methods = ["isEOF", "getChar"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:230
        self.charsMaxIndex = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:229
        self.chars = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:234
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:235
        self.chars = chars
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:236
        self.charsMaxIndex = (len(chars) - 1)

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:242
        return (self.index >= self.charsMaxIndex)

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:247
        return python_internal_ArrayImpl._get(self.chars, self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings__CharIterator_IteratorCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.IteratorCharIterator"
    __slots__ = ("chars",)
    _hx_fields = ["chars"]
    _hx_methods = ["isEOF", "getChar"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:253
        self.chars = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:257
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:258
        self.chars = chars

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:263
        return (not self.chars.hasNext())

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:268
        return self.chars.next()

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None


class hx_strings__CharIterator_InputCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.InputCharIterator"
    __slots__ = ("byteIndex", "input", "currCharIndex", "nextChar", "nextCharAvailable")
    _hx_fields = ["byteIndex", "input", "currCharIndex", "nextChar", "nextCharAvailable"]
    _hx_methods = ["isEOF", "getChar", "readUtf8Char", "readUtf8MultiSequenceByte"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:277
        self.nextChar = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:275
        self.input = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:278
        self.nextCharAvailable = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:276
        self.currCharIndex = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:274
        self.byteIndex = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:281
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:282
        self.input = chars

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:288
        if (self.nextCharAvailable == None):
            try:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:290
                byte1 = self.input.readByte()
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.byteIndex
                _hx_local_0.byteIndex = (_hx_local_1 + 1)
                _hx_local_1
                tmp = None
                if (byte1 <= 127):
                    tmp = byte1
                else:
                    byte1 = (byte1 & -129)
                    byte1 = (byte1 & -65)
                    totalBytes = 2
                    isBit6Set = (1 == (((byte1 >> 5) & 1)))
                    isBit5Set = False
                    if isBit6Set:
                        byte1 = (byte1 & -33)
                        totalBytes = (totalBytes + 1)
                        isBit5Set = (1 == (((byte1 >> 4) & 1)))
                        if isBit5Set:
                            byte1 = (byte1 & -17)
                            totalBytes = (totalBytes + 1)
                            if (1 == (((byte1 >> 3) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte1)) + "]!"))
                    result = (byte1 << ((6 * ((totalBytes - 1)))))
                    byte = self.input.readByte()
                    _hx_local_8 = self
                    _hx_local_9 = _hx_local_8.byteIndex
                    _hx_local_8.byteIndex = (_hx_local_9 + 1)
                    _hx_local_9
                    if (1 != (((byte >> 7) & 1))):
                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                    if (1 == (((byte >> 6) & 1))):
                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                    byte2 = (byte & -129)
                    result = (result + ((byte2 << ((6 * ((totalBytes - 2)))))))
                    if isBit6Set:
                        byte = self.input.readByte()
                        _hx_local_11 = self
                        _hx_local_12 = _hx_local_11.byteIndex
                        _hx_local_11.byteIndex = (_hx_local_12 + 1)
                        _hx_local_12
                        if (1 != (((byte >> 7) & 1))):
                            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                        if (1 == (((byte >> 6) & 1))):
                            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                        byte3 = (byte & -129)
                        result = (result + ((byte3 << ((6 * ((totalBytes - 3)))))))
                        if isBit5Set:
                            byte = self.input.readByte()
                            _hx_local_14 = self
                            _hx_local_15 = _hx_local_14.byteIndex
                            _hx_local_14.byteIndex = (_hx_local_15 + 1)
                            _hx_local_15
                            if (1 != (((byte >> 7) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            if (1 == (((byte >> 6) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            byte4 = (byte & -129)
                            result = (result + ((byte4 << ((6 * ((totalBytes - 4)))))))
                    if ((self.index == 0) and ((result == 65279))):
                        byte1 = self.input.readByte()
                        _hx_local_17 = self
                        _hx_local_18 = _hx_local_17.byteIndex
                        _hx_local_17.byteIndex = (_hx_local_18 + 1)
                        _hx_local_18
                        if (byte1 <= 127):
                            tmp = byte1
                        else:
                            byte1 = (byte1 & -129)
                            byte1 = (byte1 & -65)
                            totalBytes = 2
                            isBit6Set = (1 == (((byte1 >> 5) & 1)))
                            isBit5Set = False
                            if isBit6Set:
                                byte1 = (byte1 & -33)
                                totalBytes = (totalBytes + 1)
                                isBit5Set = (1 == (((byte1 >> 4) & 1)))
                                if isBit5Set:
                                    byte1 = (byte1 & -17)
                                    totalBytes = (totalBytes + 1)
                                    if (1 == (((byte1 >> 3) & 1))):
                                        raise haxe_Exception.thrown((((("Valid UTF-8 byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte1)) + "]!"))
                            result1 = (byte1 << ((6 * ((totalBytes - 1)))))
                            byte = self.input.readByte()
                            _hx_local_25 = self
                            _hx_local_26 = _hx_local_25.byteIndex
                            _hx_local_25.byteIndex = (_hx_local_26 + 1)
                            _hx_local_26
                            if (1 != (((byte >> 7) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            if (1 == (((byte >> 6) & 1))):
                                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                            byte2 = (byte & -129)
                            result1 = (result1 + ((byte2 << ((6 * ((totalBytes - 2)))))))
                            if isBit6Set:
                                byte = self.input.readByte()
                                _hx_local_28 = self
                                _hx_local_29 = _hx_local_28.byteIndex
                                _hx_local_28.byteIndex = (_hx_local_29 + 1)
                                _hx_local_29
                                if (1 != (((byte >> 7) & 1))):
                                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                if (1 == (((byte >> 6) & 1))):
                                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                byte3 = (byte & -129)
                                result1 = (result1 + ((byte3 << ((6 * ((totalBytes - 3)))))))
                                if isBit5Set:
                                    byte = self.input.readByte()
                                    _hx_local_31 = self
                                    _hx_local_32 = _hx_local_31.byteIndex
                                    _hx_local_31.byteIndex = (_hx_local_32 + 1)
                                    _hx_local_32
                                    if (1 != (((byte >> 7) & 1))):
                                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                    if (1 == (((byte >> 6) & 1))):
                                        raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                                    byte4 = (byte & -129)
                                    result1 = (result1 + ((byte4 << ((6 * ((totalBytes - 4)))))))
                            tmp = (self.readUtf8Char() if (((self.index == 0) and ((result1 == 65279)))) else result1)
                    else:
                        tmp = result
                self.nextChar = tmp
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:291
                self.nextCharAvailable = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),haxe_io_Eof):
                    self.nextCharAvailable = False
                else:
                    raise _g
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:296
        return (self.nextCharAvailable != True)

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:302
        if (self.index != self.currCharIndex):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:303
            self.currCharIndex = self.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:304
            self.nextCharAvailable = None
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:305
            return self.nextChar
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:307
        return self.currChar

    def readUtf8Char(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:316
        byte1 = self.input.readByte()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:317
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:317
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:318
        if (byte1 <= 127):
            return byte1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:325
        byte1 = (byte1 & -129)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:326
        byte1 = (byte1 & -65)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:327
        totalBytes = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:329
        isBit6Set = (1 == (((byte1 >> 5) & 1)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:330
        isBit5Set = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:331
        if isBit6Set:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:332
            byte1 = (byte1 & -33)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:333
            totalBytes = (totalBytes + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:335
            isBit5Set = (1 == (((byte1 >> 4) & 1)))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:336
            if isBit5Set:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:337
                byte1 = (byte1 & -17)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:338
                totalBytes = (totalBytes + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:340
                if (1 == (((byte1 >> 3) & 1))):
                    raise haxe_Exception.thrown((((("Valid UTF-8 byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte1)) + "]!"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:345
        result = (byte1 << ((6 * ((totalBytes - 1)))))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:350
        byte = self.input.readByte()
        _hx_local_8 = self
        _hx_local_9 = _hx_local_8.byteIndex
        _hx_local_8.byteIndex = (_hx_local_9 + 1)
        _hx_local_9
        if (1 != (((byte >> 7) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        if (1 == (((byte >> 6) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        byte2 = (byte & -129)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:351
        result = (result + ((byte2 << ((6 * ((totalBytes - 2)))))))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:356
        if isBit6Set:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:357
            byte = self.input.readByte()
            _hx_local_11 = self
            _hx_local_12 = _hx_local_11.byteIndex
            _hx_local_11.byteIndex = (_hx_local_12 + 1)
            _hx_local_12
            if (1 != (((byte >> 7) & 1))):
                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
            if (1 == (((byte >> 6) & 1))):
                raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
            byte3 = (byte & -129)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:358
            result = (result + ((byte3 << ((6 * ((totalBytes - 3)))))))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:363
            if isBit5Set:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:364
                byte = self.input.readByte()
                _hx_local_14 = self
                _hx_local_15 = _hx_local_14.byteIndex
                _hx_local_14.byteIndex = (_hx_local_15 + 1)
                _hx_local_15
                if (1 != (((byte >> 7) & 1))):
                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                if (1 == (((byte >> 6) & 1))):
                    raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
                byte4 = (byte & -129)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:365
                result = (result + ((byte4 << ((6 * ((totalBytes - 4)))))))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:370
        if ((self.index == 0) and ((result == 65279))):
            return self.readUtf8Char()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:373
        return result

    def readUtf8MultiSequenceByte(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:379
        byte = self.input.readByte()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:380
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:380
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.byteIndex
        _hx_local_0.byteIndex = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:382
        if (1 != (((byte >> 7) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:385
        if (1 == (((byte >> 6) & 1))):
            raise haxe_Exception.thrown((((("Valid UTF-8 multi-sequence byte expected at position [" + Std.string(self.byteIndex)) + "] but found byte with value [") + Std.string(byte)) + "]!"))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:388
        return (byte & -129)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.byteIndex = None
        _hx_o.input = None
        _hx_o.currCharIndex = None
        _hx_o.nextChar = None
        _hx_o.nextCharAvailable = None


class hx_strings__CharIterator_StringCharIterator(hx_strings_CharIterator):
    _hx_class_name = "hx.strings._CharIterator.StringCharIterator"
    __slots__ = ("chars", "charsMaxIndex")
    _hx_fields = ["chars", "charsMaxIndex"]
    _hx_methods = ["isEOF", "getChar"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = hx_strings_CharIterator


    def __init__(self,chars,prevBufferSize):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:396
        self.charsMaxIndex = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:395
        self.chars = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:400
        super().__init__(prevBufferSize)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:401
        self.chars = chars
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:402
        self.charsMaxIndex = (((0 if ((chars is None)) else len(chars))) - 1)

    def isEOF(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:408
        return (self.index >= self.charsMaxIndex)

    def getChar(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/CharIterator.hx:413
        return HxString.charCodeAt(self.chars,self.index)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.chars = None
        _hx_o.charsMaxIndex = None


class hx_strings_Pattern:
    _hx_class_name = "hx.strings.Pattern"
    __slots__ = ("pattern", "options", "ereg")
    _hx_fields = ["pattern", "options", "ereg"]
    _hx_methods = ["matcher", "replace", "remove", "split"]
    _hx_statics = ["__meta__", "compile"]

    def __init__(self,pattern,options):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:52
        self.pattern = pattern
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:53
        self.options = options
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:54
        self.ereg = EReg(pattern,options)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:57
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:57
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.options
        _hx_local_0.options = (("null" if _hx_local_1 is None else _hx_local_1) + "u")
        _hx_local_0.options

    def matcher(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:70
        return hx_strings__Pattern_MatcherImpl(self.ereg,self.pattern,self.options,_hx_str)

    def replace(self,_hx_str,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:84
        return self.ereg.replace(_hx_str,replaceWith)

    def remove(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:98
        return self.ereg.replace(_hx_str,"")

    def split(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:111
        return self.ereg.split(_hx_str)

    @staticmethod
    def compile(pattern,options = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:34
        if (options is None):
            return hx_strings_Pattern(pattern,"")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
        _g = options
        tmp = None
        tmp1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:38
        if (tmp1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:38
            _hx_str = _g.params[0]
            str1 = hx_strings_Strings.toLowerCase8(_hx_str)
            if ((str1 is None) or ((len(str1) == 0))):
                tmp = str1
            else:
                def _hx_local_0(ch):
                    return "".join(map(chr,[ch]))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:40
                def _hx_local_1(ch):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:40
                    _this = None
                    strLen = len("i")
                    if (ch != ((-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt("i",0)))):
                        strLen = len("m")
                        _this = (ch == ((-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt("m",0))))
                    else:
                        _this = True
                    if (not _this):
                        strLen = len("g")
                        return (ch == ((-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt("g",0))))
                    else:
                        return True
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:38
                _this = list(map(_hx_local_0,list(filter(_hx_local_1,hx_strings_Strings.toChars(str1)))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
                tmp = "".join([python_Boot.toString1(x1,'') for x1 in _this])
        elif (tmp1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:45
            opt = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
            tmp = Std.string(opt)
        elif (tmp1 == 2):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:46
            arr = _g.params[0]
            def _hx_local_2(m):
                return (m is not None)
            _this = list(filter(_hx_local_2,arr))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
            tmp = "".join([python_Boot.toString1(x1,'') for x1 in _this])
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:37
        return hx_strings_Pattern(pattern,tmp)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.pattern = None
        _hx_o.options = None
        _hx_o.ereg = None


class hx_strings_Matcher:
    _hx_class_name = "hx.strings.Matcher"
    __slots__ = ()
    _hx_methods = ["iterate", "map", "matched", "matchedPos", "matches", "matchesInRegion", "reset", "substringAfterMatch", "substringBeforeMatch"]
    _hx_statics = ["__meta__"]


class hx_strings__Pattern_MatcherImpl:
    _hx_class_name = "hx.strings._Pattern.MatcherImpl"
    __slots__ = ("ereg", "isMatch", "str")
    _hx_fields = ["ereg", "isMatch", "str"]
    _hx_methods = ["reset", "iterate", "map", "matched", "matches", "matchesInRegion", "matchedPos", "substringAfterMatch", "substringBeforeMatch", "_cloneEReg"]
    _hx_interfaces = [hx_strings_Matcher]

    def __init__(self,ereg,pattern,options,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:260
        self.str = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:259
        self.isMatch = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:258
        self.ereg = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:264
        self.ereg = self._cloneEReg(ereg,pattern,options)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:265
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:265
        self.str = _hx_str
        self.isMatch = None

    def reset(self,_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:271
        self.str = _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:272
        self.isMatch = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:273
        return self

    def iterate(self,onMatch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:278
        startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:279
        while self.ereg.matchSub(self.str,startAt):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:280
            self.isMatch = True
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:281
            _this = self.ereg
            matchedPos_pos = _this.matchObj.start()
            matchedPos_len = (_this.matchObj.end() - _this.matchObj.start())
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:282
            onMatch(self)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:283
            startAt = (matchedPos_pos + matchedPos_len)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:285
        self.isMatch = False

    def map(self,mapper):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:289
        _gthis = self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:290
        def _hx_local_1():
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:290
            def _hx_local_0(ereg):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:291
                _gthis.isMatch = True
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:292
                return mapper(_gthis)
            return self.ereg.map(self.str,_hx_local_0)
        return _hx_local_1()

    def matched(self,n = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:297
        if (n is None):
            n = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:298
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:298
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:299
        if (not self.isMatch):
            raise haxe_Exception.thrown("No string matched")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:301
        result = self.ereg.matchObj.group(n)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:307
        return result

    def matches(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:313
        _this = self.ereg
        _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
        def _hx_local_1():
            def _hx_local_0():
                self.isMatch = (_this.matchObj is not None)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchesInRegion(self,pos,_hx_len = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:323
        if (_hx_len is None):
            _hx_len = -1
        def _hx_local_1():
            def _hx_local_0():
                self.isMatch = self.ereg.matchSub(self.str,pos,_hx_len)
                return self.isMatch
            return _hx_local_0()
        return _hx_local_1()

    def matchedPos(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:328
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:328
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:329
        if (not self.isMatch):
            raise haxe_Exception.thrown("No string matched")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:330
        _this = self.ereg
        return _hx_AnonObject({'pos': _this.matchObj.start(), 'len': (_this.matchObj.end() - _this.matchObj.start())})

    def substringAfterMatch(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:335
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:335
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:336
        if (not self.isMatch):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:337
        _this = self.ereg
        return HxString.substr(_this.matchObj.string,_this.matchObj.end(),None)

    def substringBeforeMatch(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:342
        if (self.isMatch is None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:342
            _this = self.ereg
            _this.matchObj = python_lib_Re.search(_this.pattern,self.str)
            self.isMatch = (_this.matchObj is not None)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:343
        if (not self.isMatch):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:344
        _this = self.ereg
        return HxString.substr(_this.matchObj.string,0,_this.matchObj.start())

    def _cloneEReg(self,_hx_from,pattern,options):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:371
        clone = Type.createEmptyInstance(EReg)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:372
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:372
        value = Reflect.field(_hx_from,"pattern")
        setattr(clone,(("_hx_" + "pattern") if (("pattern" in python_Boot.keywords)) else (("_hx_" + "pattern") if (((((len("pattern") > 2) and ((ord("pattern"[0]) == 95))) and ((ord("pattern"[1]) == 95))) and ((ord("pattern"[(len("pattern") - 1)]) != 95)))) else "pattern")),value)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:373
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:373
        value = Reflect.field(_hx_from,"global")
        setattr(clone,(("_hx_" + "global") if (("global" in python_Boot.keywords)) else (("_hx_" + "global") if (((((len("global") > 2) and ((ord("global"[0]) == 95))) and ((ord("global"[1]) == 95))) and ((ord("global"[(len("global") - 1)]) != 95)))) else "global")),value)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Pattern.hx:381
        return clone

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.ereg = None
        _hx_o.isMatch = None
        _hx_o.str = None


class hx_strings_StringBuilder:
    _hx_class_name = "hx.strings.StringBuilder"
    __slots__ = ("sb", "pre", "len", "length")
    _hx_fields = ["sb", "pre", "len"]
    _hx_methods = ["get_length", "add", "addChar", "addAll", "clear", "isEmpty", "newLine", "insert", "insertChar", "insertAll", "asOutput", "toString"]

    def __init__(self,initialContent = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:48
        self.length = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:26
        self.len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:25
        self.pre = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:22
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:32
        if (initialContent is not None):
            self.add(initialContent)

    def get_length(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:54
        return self.len

    def add(self,item):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:72
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:72
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:74
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:74
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = (_hx_local_1 + (0 if ((item is None)) else len(item)))
        _hx_local_0.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:76
        return self

    def addChar(self,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:90
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:90
        _this = self.sb
        s = "".join(map(chr,[ch]))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:99
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:99
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:101
        return self

    def addAll(self,items):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:113
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:113
        _g = 0
        while (_g < len(items)):
            item = (items[_g] if _g >= 0 and _g < len(items) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:114
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:114
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:116
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:116
            _hx_local_1 = self
            _hx_local_2 = _hx_local_1.len
            _hx_local_1.len = (_hx_local_2 + (0 if ((item is None)) else len(item)))
            _hx_local_1.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:119
        return self

    def clear(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:138
        self.pre = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:139
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:140
        self.len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:142
        return self

    def isEmpty(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:156
        return (self.len == 0)

    def newLine(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:165
        self.sb.b.write("\n")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:168
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:168
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.len
        _hx_local_0.len = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:170
        return self

    def insert(self,pos,item):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:192
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must not be negative")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:193
        if (pos > self.len):
            raise haxe_Exception.thrown("[pos] must not be greater than this.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:195
        if (pos == self.len):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:196
            self.add(item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:197
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:205
        if (pos == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:206
            if (self.pre is None):
                self.pre = []
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:207
            self.pre.insert(0, item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:208
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:208
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = (_hx_local_1 + (0 if ((item is None)) else len(item)))
            _hx_local_0.len
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:209
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:213
        pre_len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:214
        if (self.pre is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:215
            i = len(self.pre)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:216
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:216
            _g = 0
            _g1 = len(self.pre)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:217
                _hx_str = (self.pre[i] if i >= 0 and i < len(self.pre) else None)
                next_pre_len = (pre_len + ((0 if ((_hx_str is None)) else len(_hx_str))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:218
                if (next_pre_len == pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:219
                    self.pre.insert((i + 1), item)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:220
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:220
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = (_hx_local_3 + (0 if ((item is None)) else len(item)))
                    _hx_local_2.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:221
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:223
                if (next_pre_len > pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:224
                    preSplitted = hx_strings_Strings.splitAt((self.pre[i] if i >= 0 and i < len(self.pre) else None),[(pos - pre_len)])
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:225
                    python_internal_ArrayImpl._set(self.pre, i, (preSplitted[0] if 0 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:226
                    self.pre.insert((i + 1), item)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:227
                    self.pre.insert((i + 2), (preSplitted[1] if 1 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:228
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:228
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = (_hx_local_5 + (0 if ((item is None)) else len(item)))
                    _hx_local_4.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:229
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:231
                pre_len = next_pre_len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:235
        if (self.sb.get_length() == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:236
            self.add(item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:237
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:240
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(),[(pos - pre_len)])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:241
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:242
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:242
        _this = self.sb
        s = Std.string((sbSplitted[0] if 0 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:243
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:243
        _this = self.sb
        s = Std.string(item)
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:244
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:244
        _hx_local_6 = self
        _hx_local_7 = _hx_local_6.len
        _hx_local_6.len = (_hx_local_7 + (0 if ((item is None)) else len(item)))
        _hx_local_6.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:245
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:245
        _this = self.sb
        s = Std.string((sbSplitted[1] if 1 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:247
        return self

    def insertChar(self,pos,ch):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:269
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must not be negative")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:270
        if (pos > self.len):
            raise haxe_Exception.thrown("[pos] must not be greater than this.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:272
        if (pos == self.len):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:273
            self.addChar(ch)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:274
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:282
        if (pos == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:283
            if (self.pre is None):
                self.pre = []
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:284
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:284
            _this = self.pre
            x = "".join(map(chr,[ch]))
            _this.insert(0, x)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:285
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:285
            _hx_local_0 = self
            _hx_local_1 = _hx_local_0.len
            _hx_local_0.len = (_hx_local_1 + 1)
            _hx_local_1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:286
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:290
        pre_len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:291
        if (self.pre is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:292
            i = len(self.pre)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:293
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:293
            _g = 0
            _g1 = len(self.pre)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:294
                _hx_str = (self.pre[i] if i >= 0 and i < len(self.pre) else None)
                next_pre_len = (pre_len + ((0 if ((_hx_str is None)) else len(_hx_str))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:295
                if (next_pre_len == pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:296
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:296
                    _this = self.pre
                    x = "".join(map(chr,[ch]))
                    _this.insert((i + 1), x)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:297
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:297
                    _hx_local_2 = self
                    _hx_local_3 = _hx_local_2.len
                    _hx_local_2.len = (_hx_local_3 + 1)
                    _hx_local_3
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:298
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:300
                if (next_pre_len > pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:301
                    preSplitted = hx_strings_Strings.splitAt((self.pre[i] if i >= 0 and i < len(self.pre) else None),[(pos - pre_len)])
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:302
                    python_internal_ArrayImpl._set(self.pre, i, (preSplitted[0] if 0 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:303
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:303
                    _this1 = self.pre
                    x1 = "".join(map(chr,[ch]))
                    _this1.insert((i + 1), x1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:304
                    self.pre.insert((i + 2), (preSplitted[1] if 1 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:305
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:305
                    _hx_local_4 = self
                    _hx_local_5 = _hx_local_4.len
                    _hx_local_4.len = (_hx_local_5 + 1)
                    _hx_local_5
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:306
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:308
                pre_len = next_pre_len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:312
        if (self.sb.get_length() == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:313
            self.addChar(ch)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:314
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:317
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(),[(pos - pre_len)])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:318
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:319
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:319
        _this = self.sb
        s = Std.string((sbSplitted[0] if 0 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:320
        self.addChar(ch)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:321
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:321
        _this = self.sb
        s = Std.string((sbSplitted[1] if 1 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:323
        return self

    def insertAll(self,pos,items):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:337
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must not be negative")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:338
        if (pos > self.len):
            raise haxe_Exception.thrown("[pos] must not be greater than this.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:340
        if (pos == self.len):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:341
            self.addAll(items)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:342
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:356
        if (pos == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:357
            if (self.pre is None):
                self.pre = []
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:358
            i = len(items)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:359
            while True:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:359
                tmp = i
                i = (i - 1)
                if (not ((tmp > 0))):
                    break
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:360
                item = (items[i] if i >= 0 and i < len(items) else None)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:361
                self.pre.insert(0, item)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:362
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:362
                _hx_local_0 = self
                _hx_local_1 = _hx_local_0.len
                _hx_local_0.len = (_hx_local_1 + (0 if ((item is None)) else len(item)))
                _hx_local_0.len
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:364
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:368
        pre_len = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:369
        if (self.pre is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:370
            i = len(self.pre)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:371
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:371
            _g = 0
            _g1 = len(self.pre)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:372
                _hx_str = (self.pre[i] if i >= 0 and i < len(self.pre) else None)
                next_pre_len = (pre_len + ((0 if ((_hx_str is None)) else len(_hx_str))))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:373
                if (next_pre_len == pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:374
                    j = len(items)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:375
                    while True:
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:375
                        tmp = j
                        j = (j - 1)
                        if (not ((tmp > 0))):
                            break
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:376
                        item = (items[j] if j >= 0 and j < len(items) else None)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:377
                        self.pre.insert((i + 1), item)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:378
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:378
                        _hx_local_2 = self
                        _hx_local_3 = _hx_local_2.len
                        _hx_local_2.len = (_hx_local_3 + (0 if ((item is None)) else len(item)))
                        _hx_local_2.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:380
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:382
                if (next_pre_len > pos):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:383
                    preSplitted = hx_strings_Strings.splitAt((self.pre[i] if i >= 0 and i < len(self.pre) else None),[(pos - pre_len)])
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:384
                    python_internal_ArrayImpl._set(self.pre, i, (preSplitted[0] if 0 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:385
                    self.pre.insert((i + 1), (preSplitted[1] if 1 < len(preSplitted) else None))
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:386
                    j1 = len(items)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:387
                    while True:
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:387
                        tmp1 = j1
                        j1 = (j1 - 1)
                        if (not ((tmp1 > 0))):
                            break
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:388
                        item1 = (items[j1] if j1 >= 0 and j1 < len(items) else None)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:389
                        self.pre.insert((i + 1), item1)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:390
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:390
                        _hx_local_4 = self
                        _hx_local_5 = _hx_local_4.len
                        _hx_local_4.len = (_hx_local_5 + (0 if ((item1 is None)) else len(item1)))
                        _hx_local_4.len
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:392
                    return self
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:394
                pre_len = next_pre_len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:398
        if (self.sb.get_length() == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:399
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:399
            _g = 0
            while (_g < len(items)):
                item = (items[_g] if _g >= 0 and _g < len(items) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:400
                self.add(item)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:401
            return self
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:404
        sbSplitted = hx_strings_Strings.splitAt(self.sb.b.getvalue(),[(pos - pre_len)])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:405
        self.sb = StringBuf()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:406
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:406
        _this = self.sb
        s = Std.string((sbSplitted[0] if 0 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:407
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:407
        _g = 0
        while (_g < len(items)):
            item = (items[_g] if _g >= 0 and _g < len(items) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:408
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:408
            _this = self.sb
            s = Std.string(item)
            _this.b.write(s)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:409
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:409
            _hx_local_8 = self
            _hx_local_9 = _hx_local_8.len
            _hx_local_8.len = (_hx_local_9 + (0 if ((item is None)) else len(item)))
            _hx_local_8.len
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:411
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:411
        _this = self.sb
        s = Std.string((sbSplitted[1] if 1 < len(sbSplitted) else None))
        _this.b.write(s)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:413
        return self

    def asOutput(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:425
        return hx_strings__StringBuilder_OutputWrapper(self)

    def toString(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:443
        if (self.pre is None):
            return self.sb.b.getvalue()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:445
        _this = self.pre
        _hx_str = (HxOverrides.stringOrNull("".join([python_Boot.toString1(x1,'') for x1 in _this])) + HxOverrides.stringOrNull(self.sb.b.getvalue()))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:446
        self.clear()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:447
        self.add(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:448
        return _hx_str

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.pre = None
        _hx_o.len = None


class hx_strings__StringBuilder_OutputWrapper(haxe_io_Output):
    _hx_class_name = "hx.strings._StringBuilder.OutputWrapper"
    __slots__ = ("sb", "bo")
    _hx_fields = ["sb", "bo"]
    _hx_methods = ["flush", "writeByte", "writeString"]
    _hx_statics = []
    _hx_interfaces = []
    _hx_super = haxe_io_Output


    def __init__(self,sb):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:457
        self.bo = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:461
        self.sb = sb

    def flush(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:466
        if ((self.bo is not None) and ((len(self.bo.b.b) > 0))):
            self.sb.add(self.bo.getBytes().toString())

    def writeByte(self,c):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:475
        if (self.bo is None):
            self.bo = haxe_io_BytesOutput()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:476
        self.bo.writeByte(c)

    def writeString(self,_hx_str,encoding = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:483
        self.flush()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/StringBuilder.hx:484
        self.sb.add(_hx_str)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.sb = None
        _hx_o.bo = None


class hx_strings_internal_OS:
    _hx_class_name = "hx.strings.internal.OS"
    __slots__ = ()
    _hx_statics = ["isWindows"]

class hx_strings_internal__Either3__Either3(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.internal._Either3._Either3"
    _hx_constructs = ["a", "b", "c"]

    @staticmethod
    def a(v):
        return hx_strings_internal__Either3__Either3("a", 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either3__Either3("b", 1, (v,))

    @staticmethod
    def c(v):
        return hx_strings_internal__Either3__Either3("c", 2, (v,))


class hx_strings_Strings:
    _hx_class_name = "hx.strings.Strings"
    __slots__ = ()
    _hx_statics = ["REGEX_ANSI_ESC", "REGEX_HTML_UNESCAPE", "REGEX_SPLIT_LINES", "REGEX_REMOVE_XML_TAGS", "POS_NOT_FOUND", "NEW_LINE_NIX", "NEW_LINE_WIN", "NEW_LINE", "_getNotFoundDefault", "_charCodeAt8Unsafe", "_splitAsciiWordsUnsafe", "ansiToHtml", "appendIfMissing", "base64Encode", "base64Decode", "charAt8", "charCodeAt8", "compact", "contains", "containsOnly", "containsAll", "containsAllIgnoreCase", "containsAny", "containsAnyIgnoreCase", "containsNone", "containsNoneIgnoreCase", "containsWhitespaces", "countMatches", "countMatchesIgnoreCase", "compare", "compareIgnoreCase", "diff", "diffAt", "ellipsizeLeft", "ellipsizeMiddle", "ellipsizeRight", "endsWith", "endsWithAny", "endsWithAnyIgnoreCase", "endsWithIgnoreCase", "equals", "equalsIgnoreCase", "filter", "filterChars", "getFuzzyDistance", "getLevenshteinDistance", "getLongestCommonSubstring", "hashCode", "htmlDecode", "htmlEncode", "insertAt", "ifBlank", "ifEmpty", "ifNull", "indentLines", "indexOf8", "isBlank", "isDigits", "isEmpty", "isNotBlank", "isNotEmpty", "isLowerCase", "isUpperCase", "iterate", "iterateChars", "lastIndexOf8", "length8", "left", "lpad", "map", "prependIfMissing", "quoteDouble", "quoteSingle", "removeAfter", "removeAfterLast", "removeAfterIgnoreCase", "removeAfterLastIgnoreCase", "removeAt", "removeBefore", "removeBeforeLast", "removeBeforeIgnoreCase", "removeBeforeLastIgnoreCase", "removeAll", "removeFirst", "removeFirstIgnoreCase", "removeAnsi", "removeLeading", "removeTags", "removeTrailing", "repeat", "replaceAll", "replaceFirst", "replaceFirstIgnoreCase", "reverse", "right", "rpad", "split8", "splitAt", "splitEvery", "splitLines", "startsWith", "startsWithAny", "startsWithAnyIgnoreCase", "startsWithIgnoreCase", "substr8", "substring8", "substringAfter", "substringAfterIgnoreCase", "substringBetween", "substringBetweenIgnoreCase", "substringAfterLast", "substringAfterLastIgnoreCase", "substringBefore", "substringBeforeIgnoreCase", "substringBeforeLast", "substringBeforeLastIgnoreCase", "toBool", "toBytes", "toChar", "toCharIterator", "toChars", "toPattern", "toEReg", "toFloat", "toHex", "toInt", "toLowerCase8", "toLowerCaseFirstChar", "toLowerCamel", "toLowerHyphen", "toLowerUnderscore", "toTitle", "toUpperCamel", "toUpperUnderscore", "toString", "toUpperCase8", "toUpperCaseFirstChar", "trim", "trimRight", "trimLeft", "trimLines", "trimToNull", "trimToEmpty", "truncate", "urlDecode", "urlEncode", "wrap"]

    @staticmethod
    def _getNotFoundDefault(_hx_str,notFoundDefault):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:63
        notFoundDefault1 = notFoundDefault
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:64
        if (notFoundDefault1 == 1):
            return None
        elif (notFoundDefault1 == 2):
            return ""
        elif (notFoundDefault1 == 3):
            return _hx_str
        else:
            pass

    @staticmethod
    def _charCodeAt8Unsafe(_hx_str,pos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:79
        return HxString.charCodeAt(_hx_str,pos)

    @staticmethod
    def _splitAsciiWordsUnsafe(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:90
        words = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:91
        currentWord = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:93
        chars = hx_strings_Strings.toChars(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:95
        _hx_len = len(chars)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:96
        lastIndex = (_hx_len - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:97
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:97
        _g = 0
        _g1 = _hx_len
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:98
            ch = (chars[i] if i >= 0 and i < len(chars) else None)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:99
            if (((ch > 64) and ((ch < 91))) or (((ch > 96) and ((ch < 123))))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:100
                chNext = (python_internal_ArrayImpl._get(chars, (i + 1)) if ((i < lastIndex)) else -1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:101
                currentWord.addChar(ch)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:102
                if ((chNext > 47) and ((chNext < 58))):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:103
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:103
                    x = currentWord.toString()
                    words.append(x)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:104
                    currentWord.clear()
                elif (ch in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h):
                    if ((chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h) and ((len(chars) > ((i + 2))))):
                        if (not (python_internal_ArrayImpl._get(chars, (i + 2)) in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h)):
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:108
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:108
                            x1 = currentWord.toString()
                            words.append(x1)
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:109
                            currentWord.clear()
                elif (chNext in hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:114
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:114
                    x2 = currentWord.toString()
                    words.append(x2)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:115
                    currentWord.clear()
            elif ((ch > 47) and ((ch < 58))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:119
                currentWord.addChar(ch)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:120
                chNext1 = (python_internal_ArrayImpl._get(chars, (i + 1)) if ((i < lastIndex)) else -1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:121
                if (not (((chNext1 > 47) and ((chNext1 < 58))))):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:122
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:122
                    x3 = currentWord.toString()
                    words.append(x3)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:123
                    currentWord.clear()
            elif (currentWord.len > 0):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:126
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:126
                x4 = currentWord.toString()
                words.append(x4)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:127
                currentWord.clear()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:131
        if (currentWord.len > 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:132
            x = currentWord.toString()
            words.append(x)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:133
        return words

    @staticmethod
    def ansiToHtml(_hx_str,renderMethod = None,initialState = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:167
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:170
        if (renderMethod is None):
            renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:171
        styleOrClassAttribute = None
        styleOrClassAttribute1 = renderMethod.index
        if (styleOrClassAttribute1 == 0):
            styleOrClassAttribute = "style"
        elif (styleOrClassAttribute1 == 1):
            styleOrClassAttribute = "class"
        elif (styleOrClassAttribute1 == 2):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:174
            cb = renderMethod.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:171
            styleOrClassAttribute = "class"
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:177
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:179
        if ((initialState is not None) and ((((((initialState.fgcolor is not None) or ((initialState.bgcolor is not None))) or initialState.bold) or initialState.underline) or initialState.blink))):
            sb.add((("<span " + ("null" if styleOrClassAttribute is None else styleOrClassAttribute)) + "=\"")).add(initialState.toCSS(renderMethod)).add("\">")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:182
        effectiveState = hx_strings_AnsiState(initialState)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:183
        strLenMinus1 = (((0 if ((_hx_str is None)) else len(_hx_str))) - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:184
        i = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:185
        lookAhead = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:186
        while (i < strLenMinus1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:187
            i = (i + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:188
            ch = HxString.charCodeAt(_hx_str,i)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:189
            if (((ch == 27) and ((i < strLenMinus1))) and ((HxString.charCodeAt(_hx_str,(i + 1)) == 91))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:190
                lookAhead.clear()
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:191
                currentState = hx_strings_AnsiState(effectiveState)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:192
                currentGraphicModeParam = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:193
                isValidEscapeSequence = False
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:194
                i = (i + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:195
                while (i < strLenMinus1):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:196
                    i = (i + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:197
                    ch2 = HxString.charCodeAt(_hx_str,i)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:198
                    lookAhead.addChar(ch2)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:199
                    ch21 = ch2
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:200
                    if (ch21 == 48):
                        currentGraphicModeParam = (currentGraphicModeParam * 10)
                    elif (ch21 == 49):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 1)
                    elif (ch21 == 50):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 2)
                    elif (ch21 == 51):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 3)
                    elif (ch21 == 52):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 4)
                    elif (ch21 == 53):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 5)
                    elif (ch21 == 54):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 6)
                    elif (ch21 == 55):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 7)
                    elif (ch21 == 56):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 8)
                    elif (ch21 == 57):
                        currentGraphicModeParam = ((currentGraphicModeParam * 10) + 9)
                    elif (ch21 == 59):
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:211
                        currentState.setGraphicModeParameter(currentGraphicModeParam)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:212
                        currentGraphicModeParam = 0
                    elif (ch21 == 109):
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:214
                        currentState.setGraphicModeParameter(currentGraphicModeParam)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:215
                        if (((((effectiveState.fgcolor is not None) or ((effectiveState.bgcolor is not None))) or effectiveState.bold) or effectiveState.underline) or effectiveState.blink):
                            sb.add("</span>")
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:217
                        if (((((currentState.fgcolor is not None) or ((currentState.bgcolor is not None))) or currentState.bold) or currentState.underline) or currentState.blink):
                            sb.add((("<span " + ("null" if styleOrClassAttribute is None else styleOrClassAttribute)) + "=\"")).add(currentState.toCSS(renderMethod)).add("\">")
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:219
                        effectiveState = currentState
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:220
                        isValidEscapeSequence = True
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:221
                        break
                    else:
                        break
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:227
                if (not isValidEscapeSequence):
                    sb.addChar(27).add("[").add(Std.string(lookAhead))
            else:
                sb.addChar(ch)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:235
        if (((((effectiveState.fgcolor is not None) or ((effectiveState.bgcolor is not None))) or effectiveState.bold) or effectiveState.underline) or effectiveState.blink):
            sb.add("</span>")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:238
        return sb.toString()

    @staticmethod
    def appendIfMissing(_hx_str,suffix):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:256
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:259
        if (len(_hx_str) == 0):
            return (("null" if _hx_str is None else _hx_str) + ("null" if suffix is None else suffix))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:262
        if hx_strings_Strings.endsWith(_hx_str,suffix):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:265
        return (("null" if _hx_str is None else _hx_str) + ("null" if suffix is None else suffix))

    @staticmethod
    def base64Encode(plain):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:279
        if (plain is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:285
        return haxe_crypto_Base64.encode((None if ((plain is None)) else haxe_io_Bytes.ofString(plain)))

    @staticmethod
    def base64Decode(encoded):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:300
        if (encoded is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:306
        return haxe_crypto_Base64.decode(encoded).toString()

    @staticmethod
    def charAt8(_hx_str,pos,resultIfOutOfBound = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:331
        if (resultIfOutOfBound is None):
            resultIfOutOfBound = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:332
        if ((((_hx_str is None) or ((len(_hx_str) == 0))) or ((pos < 0))) or ((pos >= ((0 if ((_hx_str is None)) else len(_hx_str)))))):
            return resultIfOutOfBound
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:335
        if ((pos < 0) or ((pos >= len(_hx_str)))):
            return ""
        else:
            return _hx_str[pos]

    @staticmethod
    def charCodeAt8(_hx_str,pos,resultIfOutOfBound = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:368
        if (resultIfOutOfBound is None):
            resultIfOutOfBound = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:369
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:370
        if (((strLen == 0) or ((pos < 0))) or ((pos >= strLen))):
            return resultIfOutOfBound
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:373
        return HxString.charCodeAt(_hx_str,pos)

    @staticmethod
    def compact(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:389
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:392
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:393
        needWhiteSpace = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:394
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:394
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while (_g < len(_g1)):
            char = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:395
            if (((char > 8) and ((char < 14))) or ((char == 32))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:396
                if (sb.len != 0):
                    needWhiteSpace = True
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:398
                continue
            elif needWhiteSpace:
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:400
                sb.addChar(32)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:401
                needWhiteSpace = False
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:403
            sb.addChar(char)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:405
        return sb.toString()

    @staticmethod
    def contains(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:426
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:428
        if (searchFor == ""):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:431
        startIndex = None
        return (((searchIn.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor,startIndex))) > -1)

    @staticmethod
    def containsOnly(searchIn,allowedChars):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:450
        if ((searchIn is None) or ((len(searchIn) == 0))):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:453
        if (allowedChars is None):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:456
        allowedCharsArray = None
        _g = allowedChars
        allowedCharsArray1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:457
        if (allowedCharsArray1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:457
            _hx_str = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:456
            allowedCharsArray = hx_strings_Strings.toChars(_hx_str)
        elif (allowedCharsArray1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:458
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:456
            allowedCharsArray = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:461
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:461
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while (_g < len(_g1)):
            ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:462
            if (python_internal_ArrayImpl.indexOf(allowedCharsArray,ch,None) < 0):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:465
        return True

    @staticmethod
    def containsAll(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:487
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:490
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:490
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:491
            tmp = None
            if ((searchIn is None) or ((candidate is None))):
                tmp = False
            elif (candidate == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(candidate) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,candidate,startIndex))) > -1)
            if (not tmp):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:494
        return True

    @staticmethod
    def containsAllIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:516
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:519
        searchIn = searchIn.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:521
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:521
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:522
            searchFor1 = candidate.lower()
            tmp = None
            if ((searchIn is None) or ((searchFor1 is None))):
                tmp = False
            elif (searchFor1 == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(searchFor1) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor1,startIndex))) > -1)
            if (not tmp):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:525
        return True

    @staticmethod
    def containsAny(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:548
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:551
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:551
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:552
            tmp = None
            if ((searchIn is None) or ((candidate is None))):
                tmp = False
            elif (candidate == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(candidate) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,candidate,startIndex))) > -1)
            if tmp:
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:555
        return False

    @staticmethod
    def containsAnyIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:577
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:580
        searchIn = searchIn.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:582
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:582
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:583
            searchFor1 = candidate.lower()
            tmp = None
            if ((searchIn is None) or ((searchFor1 is None))):
                tmp = False
            elif (searchFor1 == ""):
                tmp = True
            else:
                startIndex = None
                tmp = (((searchIn.find(searchFor1) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor1,startIndex))) > -1)
            if tmp:
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:586
        return False

    @staticmethod
    def containsNone(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:609
        return (not hx_strings_Strings.containsAny(searchIn,searchFor))

    @staticmethod
    def containsNoneIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:631
        return (not hx_strings_Strings.containsAnyIgnoreCase(searchIn,searchFor))

    @staticmethod
    def containsWhitespaces(searchIn):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:648
        if (searchIn is None):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:651
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:651
        _g = 0
        _g1 = hx_strings_Strings.toChars(searchIn)
        while (_g < len(_g1)):
            ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:652
            if (((ch > 8) and ((ch < 14))) or ((ch == 32))):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:656
        return False

    @staticmethod
    def countMatches(searchIn,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:676
        if (startAt is None):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:677
        if ((((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))) or ((startAt >= len(searchIn)))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:680
        if (startAt < 0):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:683
        count = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:684
        foundAt = ((startAt - 1) if ((startAt > -1)) else 0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:685
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:685
            startIndex = (foundAt + 1)
            foundAt = (searchIn.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor,startIndex))
            if (not ((foundAt > -1))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:686
            count = (count + 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:687
        return count

    @staticmethod
    def countMatchesIgnoreCase(searchIn,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:707
        if (startAt is None):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:708
        if ((((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))) or ((startAt >= len(searchIn)))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:711
        if (startAt < 0):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:714
        searchIn = searchIn.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:715
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:717
        count = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:718
        foundAt = ((startAt - 1) if ((startAt > -1)) else 0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:719
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:719
            startIndex = (foundAt + 1)
            foundAt = (searchIn.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(searchIn,searchFor,startIndex))
            if (not ((foundAt > -1))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:720
            count = (count + 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:721
        return count

    @staticmethod
    def compare(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:744
        if (_hx_str is None):
            if (other is None):
                return 0
            else:
                return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:747
        if (other is None):
            if (_hx_str is None):
                return 0
            else:
                return 1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:751
        if (_hx_str > other):
            return 1
        elif (_hx_str == other):
            return 0
        else:
            return -1

    @staticmethod
    def compareIgnoreCase(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:777
        if (_hx_str is None):
            if (other is None):
                return 0
            else:
                return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:780
        if (other is None):
            if (_hx_str is None):
                return 0
            else:
                return 1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:783
        _hx_str = hx_strings_Strings.toLowerCase8(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:784
        other = hx_strings_Strings.toLowerCase8(other)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:787
        if (_hx_str > other):
            return 1
        elif (_hx_str == other):
            return 0
        else:
            return -1

    @staticmethod
    def diff(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:807
        diff = hx_strings_StringDiff()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:808
        diff.at = hx_strings_Strings.diffAt(left,right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:809
        diff.left = hx_strings_Strings.substr8(left,diff.at)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:810
        diff.right = hx_strings_Strings.substr8(right,diff.at)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:811
        return diff

    @staticmethod
    def diffAt(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:833
        if (_hx_str == other):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:836
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:837
        otherLen = (0 if ((other is None)) else len(other))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:839
        if ((strLen == 0) or ((otherLen == 0))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:842
        checkLen = (otherLen if ((strLen > otherLen)) else strLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:844
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:844
        _g = 0
        _g1 = checkLen
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:845
            if (HxString.charCodeAt(_hx_str,i) != HxString.charCodeAt(other,i)):
                return i
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:847
        return checkLen

    @staticmethod
    def ellipsizeLeft(_hx_str,maxLength,ellipsis = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:865
        if (ellipsis is None):
            ellipsis = "..."
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:866
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLength):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:869
        ellipsisLen = (0 if ((ellipsis is None)) else len(ellipsis))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:870
        if (maxLength < ellipsisLen):
            raise haxe_Exception.thrown(("[maxLength] must not be smaller than " + Std.string(ellipsisLen)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:872
        return (("null" if ellipsis is None else ellipsis) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,(maxLength - ellipsisLen))))

    @staticmethod
    def ellipsizeMiddle(_hx_str,maxLength,ellipsis = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:890
        if (ellipsis is None):
            ellipsis = "..."
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:891
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:892
        if (strLen <= maxLength):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:895
        ellipsisLen = (0 if ((ellipsis is None)) else len(ellipsis))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:896
        if (maxLength < ellipsisLen):
            raise haxe_Exception.thrown(("[maxLength] must not be smaller than " + Std.string(ellipsisLen)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:898
        maxStrLen = (maxLength - ellipsisLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:899
        leftLen = Math.floor(((maxStrLen / 2) + 0.5))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:900
        rightLen = (maxStrLen - leftLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:902
        return ((HxOverrides.stringOrNull(((_hx_str if ((((0 if ((_hx_str is None)) else len(_hx_str))) <= leftLen)) else hx_strings_Strings.substring8(_hx_str,0,leftLen)))) + ("null" if ellipsis is None else ellipsis)) + HxOverrides.stringOrNull(hx_strings_Strings.right(_hx_str,rightLen)))

    @staticmethod
    def ellipsizeRight(_hx_str,maxLength,ellipsis = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:920
        if (ellipsis is None):
            ellipsis = "..."
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:921
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLength):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:924
        ellipsisLen = (0 if ((ellipsis is None)) else len(ellipsis))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:925
        if (maxLength < ellipsisLen):
            raise haxe_Exception.thrown(("[maxLength] must not be smaller than " + Std.string(ellipsisLen)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:927
        _hx_len = (maxLength - ellipsisLen)
        return (HxOverrides.stringOrNull(((_hx_str if ((((0 if ((_hx_str is None)) else len(_hx_str))) <= _hx_len)) else hx_strings_Strings.substring8(_hx_str,0,_hx_len)))) + ("null" if ellipsis is None else ellipsis))

    @staticmethod
    def endsWith(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:944
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:953
        return searchIn.endswith(searchFor)

    @staticmethod
    def endsWithAny(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:972
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:975
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:975
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:976
            if ((candidate is not None) and hx_strings_Strings.endsWith(searchIn,candidate)):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:978
        return False

    @staticmethod
    def endsWithAnyIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:997
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1000
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1001
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1001
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1002
            if ((candidate is not None) and hx_strings_Strings.endsWith(searchIn,hx_strings_Strings.toLowerCase8(candidate))):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1004
        return False

    @staticmethod
    def endsWithIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1022
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1025
        return hx_strings_Strings.endsWith(searchIn.lower(),searchFor.lower())

    @staticmethod
    def equals(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1046
        return (_hx_str == other)

    @staticmethod
    def equalsIgnoreCase(_hx_str,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1066
        return (hx_strings_Strings.toLowerCase8(_hx_str) == hx_strings_Strings.toLowerCase8(other))

    @staticmethod
    def filter(_hx_str,_hx_filter,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1081
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1082
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1085
        _this = list(filter(_hx_filter,hx_strings_Strings.split8(_hx_str,[separator])))
        return separator.join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def filterChars(_hx_str,_hx_filter):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1101
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1104
        def _hx_local_0(ch):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1104
            return "".join(map(chr,[ch]))
        _this = list(map(_hx_local_0,list(filter(_hx_filter,hx_strings_Strings.toChars(_hx_str)))))
        return "".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def getFuzzyDistance(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1130
        if (((left is None) or ((len(left) == 0))) or (((right is None) or ((len(right) == 0))))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1133
        left = hx_strings_Strings.toLowerCase8(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1134
        right = hx_strings_Strings.toLowerCase8(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1136
        leftChars = hx_strings_Strings.toChars(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1137
        rightChars = hx_strings_Strings.toChars(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1138
        leftLastMatchAt = -100
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1139
        rightLastMatchAt = -100
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1141
        score = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1143
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1143
        _g = 0
        _g1 = len(leftChars)
        while (_g < _g1):
            leftIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1144
            leftChar = (leftChars[leftIdx] if leftIdx >= 0 and leftIdx < len(leftChars) else None)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1145
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1145
            _g2 = ((rightLastMatchAt + 1) if ((rightLastMatchAt > -1)) else 0)
            _g3 = len(rightChars)
            while (_g2 < _g3):
                rightIdx = _g2
                _g2 = (_g2 + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1146
                rightChar = (rightChars[rightIdx] if rightIdx >= 0 and rightIdx < len(rightChars) else None)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1147
                if (leftChar == rightChar):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1148
                    score = (score + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1149
                    if ((leftLastMatchAt == ((leftIdx - 1))) and ((rightLastMatchAt == ((rightIdx - 1))))):
                        score = (score + 2)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1151
                    leftLastMatchAt = leftIdx
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1152
                    rightLastMatchAt = rightIdx
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1153
                    break
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1158
        return score

    @staticmethod
    def getLevenshteinDistance(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1185
        leftLen = (0 if ((left is None)) else len(left))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1186
        rightLen = (0 if ((right is None)) else len(right))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1188
        if (leftLen == 0):
            return rightLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1189
        if (rightLen == 0):
            return leftLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1191
        if (leftLen > rightLen):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1193
            tmp = left
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1194
            left = right
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1195
            right = tmp
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1196
            tmpLen = leftLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1197
            leftLen = rightLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1198
            rightLen = tmpLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1201
        prevCosts = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1202
        costs = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1204
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1204
        _g = 0
        _g1 = (leftLen + 1)
        while (_g < _g1):
            leftIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1205
            prevCosts.append(leftIdx)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1206
            costs.append(0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1209
        leftChars = hx_strings_Strings.toChars(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1210
        rightChars = hx_strings_Strings.toChars(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1212
        def _hx_local_0(a,b):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1212
            if (a > b):
                return b
            else:
                return a
        _hx_min = _hx_local_0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1214
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1214
        _g = 1
        _g1 = (rightLen + 1)
        while (_g < _g1):
            rightIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1215
            rightChar = python_internal_ArrayImpl._get(rightChars, (rightIdx - 1))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1216
            python_internal_ArrayImpl._set(costs, 0, rightIdx)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1218
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1218
            _g2 = 1
            _g3 = (leftLen + 1)
            while (_g2 < _g3):
                leftIdx = _g2
                _g2 = (_g2 + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1219
                leftIdxMinus1 = (leftIdx - 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1220
                cost = (0 if (((leftChars[leftIdxMinus1] if leftIdxMinus1 >= 0 and leftIdxMinus1 < len(leftChars) else None) == rightChar)) else 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1221
                python_internal_ArrayImpl._set(costs, leftIdx, _hx_min(_hx_min(((costs[leftIdxMinus1] if leftIdxMinus1 >= 0 and leftIdxMinus1 < len(costs) else None) + 1),((prevCosts[leftIdx] if leftIdx >= 0 and leftIdx < len(prevCosts) else None) + 1)),((prevCosts[leftIdxMinus1] if leftIdxMinus1 >= 0 and leftIdxMinus1 < len(prevCosts) else None) + cost)))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1224
            tmp = prevCosts
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1225
            prevCosts = costs
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1226
            costs = tmp
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1229
        return (prevCosts[leftLen] if leftLen >= 0 and leftLen < len(prevCosts) else None)

    @staticmethod
    def getLongestCommonSubstring(left,right):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1249
        if ((left is None) or ((right is None))):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1252
        leftLen = (0 if ((left is None)) else len(left))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1253
        rightLen = (0 if ((right is None)) else len(right))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1255
        if ((leftLen == 0) or ((rightLen == 0))):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1258
        leftChars = hx_strings_Strings.toChars(left)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1259
        rightChars = hx_strings_Strings.toChars(right)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1261
        leftSubStartAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1262
        leftSubLen = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1264
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1264
        _g = 0
        _g1 = leftLen
        while (_g < _g1):
            leftIdx = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1265
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1265
            _g2 = 0
            _g3 = rightLen
            while (_g2 < _g3):
                rightIdx = _g2
                _g2 = (_g2 + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1266
                currLen = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1267
                while (python_internal_ArrayImpl._get(leftChars, (leftIdx + currLen)) == python_internal_ArrayImpl._get(rightChars, (rightIdx + currLen))):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1268
                    currLen = (currLen + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1269
                    if (((leftIdx + currLen) >= leftLen) or (((rightIdx + currLen) >= rightLen))):
                        break
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1272
                if (currLen > leftSubLen):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1273
                    leftSubLen = currLen
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1274
                    leftSubStartAt = leftIdx
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1278
        return hx_strings_Strings.substr8(left,leftSubStartAt,leftSubLen)

    @staticmethod
    def hashCode(_hx_str,algo = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1297
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1300
        if (algo is None):
            algo = hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1302
        if (algo is None):
            return hash(_hx_str)
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1302
            tmp = algo.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1304
            if (tmp == 1):
                return haxe_crypto_Adler32.make((None if ((_hx_str is None)) else haxe_io_Bytes.ofString(_hx_str)))
            elif (tmp == 2):
                return haxe_crypto_Crc32.make((None if ((_hx_str is None)) else haxe_io_Bytes.ofString(_hx_str)))
            elif (tmp == 3):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1310
                hc = 5381
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1311
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1311
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while (_g < len(_g1)):
                    ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                    _g = (_g + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1312
                    hc = (((((((((((hc << 5)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + hc) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) ^ ch)) + (2 ** 31)) % (2 ** 32) - (2 ** 31))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1313
                return hc
            elif (tmp == 4):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1316
                hc = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1317
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1317
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while (_g < len(_g1)):
                    ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                    _g = (_g + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1318
                    hc = ((((((((((hc << 5)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) - hc) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + ch) + (2 ** 31)) % (2 ** 32) - (2 ** 31))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1319
                return hc
            elif (tmp == 5):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1322
                hc = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1323
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1323
                _g = 0
                _g1 = hx_strings_Strings.toChars(_hx_str)
                while (_g < len(_g1)):
                    ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                    _g = (_g + 1)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1324
                    hc = (((((((((((((hc << 6)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + (((((hc << 16)) + (2 ** 31)) % (2 ** 32) - (2 ** 31)))) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) - hc) + (2 ** 31)) % (2 ** 32) - (2 ** 31)) + ch) + (2 ** 31)) % (2 ** 32) - (2 ** 31))
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1325
                return hc
            else:
                return hash(_hx_str)

    @staticmethod
    def htmlDecode(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1365
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1368
        _this = hx_strings_Strings.REGEX_HTML_UNESCAPE
        def _hx_local_2():
            def _hx_local_1(m):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1369
                match = m.matched()
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1370
                match1 = match
                _hx_local_0 = len(match1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1371
                if (_hx_local_0 == 5):
                    if (match1 == "&amp;"):
                        return "&"
                    else:
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1378
                        this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                        return "".join(map(chr,[this1]))
                elif (_hx_local_0 == 4):
                    if (match1 == "&gt;"):
                        return ">"
                    elif (match1 == "&lt;"):
                        return "<"
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                        return "".join(map(chr,[this1]))
                elif (_hx_local_0 == 6):
                    if (match1 == "&apos;"):
                        return "'"
                    elif (match1 == "&nbsp;"):
                        return " "
                    elif (match1 == "&quot;"):
                        return "\""
                    else:
                        this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                        return "".join(map(chr,[this1]))
                else:
                    this1 = Std.parseInt(hx_strings_Strings.substr8(match,2,(((0 if ((match is None)) else len(match))) - 3)))
                    return "".join(map(chr,[this1]))
            return hx_strings__Pattern_MatcherImpl(_this.ereg,_this.pattern,_this.options,_hx_str).map(_hx_local_1)
        return _hx_local_2()

    @staticmethod
    def htmlEncode(_hx_str,escapeQuotes = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1401
        if (escapeQuotes is None):
            escapeQuotes = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1402
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1405
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1406
        isFirstSpace = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1407
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1407
        _g = 0
        _g1 = (0 if ((_hx_str is None)) else len(_hx_str))
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1408
            ch = HxString.charCodeAt(_hx_str,i)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1409
            ch1 = ch
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1411
            if (ch1 == 32):
                if isFirstSpace:
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1412
                    sb.add(" ")
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1413
                    isFirstSpace = False
                else:
                    sb.add("&nbsp;")
            elif (ch1 == 34):
                sb.add(("&quot;" if escapeQuotes else "\""))
            elif (ch1 == 38):
                sb.add("&amp;")
            elif (ch1 == 39):
                sb.add(("&#039;" if escapeQuotes else "'"))
            elif (ch1 == 60):
                sb.add("&lt;")
            elif (ch1 == 62):
                sb.add("&gt;")
            elif (ch > 127):
                sb.add("&#").add(Std.string(ch)).add(";")
            else:
                sb.addChar(ch)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1440
            if (ch != 32):
                isFirstSpace = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1444
        return sb.toString()

    @staticmethod
    def insertAt(_hx_str,pos,insertion):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1467
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1470
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1471
        if (pos < 0):
            pos = (strLen + pos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1473
        if ((pos < 0) or ((pos > strLen))):
            raise haxe_Exception.thrown("Absolute value of [pos] must be <= str.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1476
        if ((insertion is None) or ((len(insertion) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1479
        return ((HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,0,pos)) + Std.string(insertion)) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,pos)))

    @staticmethod
    def ifBlank(_hx_str,fallback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1501
        if (True if ((_hx_str is None)) else (len(StringTools.trim(_hx_str)) == 0)):
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifEmpty(_hx_str,fallback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1522
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return fallback
        else:
            return _hx_str

    @staticmethod
    def ifNull(_hx_str,fallback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1540
        if (_hx_str is None):
            return fallback
        else:
            return _hx_str

    @staticmethod
    def indentLines(_hx_str,indentWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1558
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1561
        if ((len(_hx_str) == 0) or (((indentWith is None) or ((len(indentWith) == 0))))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1564
        isFirstLine = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1565
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1566
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1566
        _g = 0
        _g1 = hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)
        while (_g < len(_g1)):
            line = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1567
            if isFirstLine:
                isFirstLine = False
            else:
                sb.newLine()
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1571
            sb.add(indentWith)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1572
            sb.add(line)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1574
        return sb.toString()

    @staticmethod
    def indexOf8(_hx_str,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1623
        if (startAt is None):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1624
        if ((_hx_str is None) or ((searchFor is None))):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1627
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1628
        searchForLen = (0 if ((searchFor is None)) else len(searchFor))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1631
        if (startAt < 0):
            startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1635
        if (searchForLen == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1636
            if (startAt == 0):
                return 0
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1638
            if ((startAt > 0) and ((startAt < strLen))):
                return startAt
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1641
            return strLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1645
        if (startAt >= strLen):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1649
        if (startAt is None):
            return _hx_str.find(searchFor)
        else:
            return HxString.indexOfImpl(_hx_str,searchFor,startAt)

    @staticmethod
    def isBlank(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1695
        if (_hx_str is None):
            return True
        else:
            return (len(StringTools.trim(_hx_str)) == 0)

    @staticmethod
    def isDigits(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1716
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1719
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1719
        _g = 0
        _g1 = (0 if ((_hx_str is None)) else len(_hx_str))
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1720
            this1 = HxString.charCodeAt(_hx_str,i)
            if (not (((this1 > 47) and ((this1 < 58))))):
                return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1723
        return True

    @staticmethod
    def isEmpty(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1742
        if (_hx_str is not None):
            return (len(_hx_str) == 0)
        else:
            return True

    @staticmethod
    def isNotBlank(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1759
        if (_hx_str is not None):
            return (len(StringTools.trim(_hx_str)) > 0)
        else:
            return False

    @staticmethod
    def isNotEmpty(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1776
        if (_hx_str is not None):
            return (len(_hx_str) > 0)
        else:
            return False

    @staticmethod
    def isLowerCase(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1790
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1793
        return (_hx_str == hx_strings_Strings.toLowerCase8(_hx_str))

    @staticmethod
    def isUpperCase(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1808
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1811
        return (_hx_str == hx_strings_Strings.toUpperCase8(_hx_str))

    @staticmethod
    def iterate(_hx_str,callback,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1818
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1819
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1822
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1822
        _g = 0
        _g1 = hx_strings_Strings.split8(_hx_str,[separator])
        while (_g < len(_g1)):
            sub = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1823
            callback(sub)

    @staticmethod
    def iterateChars(_hx_str,callback):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1831
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1834
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1834
        _g = 0
        _g1 = (0 if ((_hx_str is None)) else len(_hx_str))
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1835
            callback(HxString.charCodeAt(_hx_str,i))

    @staticmethod
    def lastIndexOf8(_hx_str,searchFor,startAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1888
        if ((_hx_str is None) or ((searchFor is None))):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1891
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1892
        searchForLen = (0 if ((searchFor is None)) else len(searchFor))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1894
        if (startAt is None):
            startAt = strLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1898
        if (searchForLen == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1899
            if (startAt < 0):
                return 0
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1901
            if (startAt > strLen):
                return strLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1903
            return startAt
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1907
        if (startAt < 0):
            return -1
        elif (startAt >= strLen):
            startAt = (strLen - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1917
        strNeedsUTF8Workaround = (len(_hx_str) != strLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1918
        searchForNeedsUTF8Workaround = (len(searchFor) != searchForLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1926
        if (searchForNeedsUTF8Workaround and (not strNeedsUTF8Workaround)):
            return -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1930
        searchForChars = hx_strings_Strings.toChars(searchFor)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1931
        startAt = (startAt + ((searchForLen - 1)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1933
        searchForPosToCheck = (searchForLen - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1934
        strPos = strLen
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1935
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1935
            tmp = strPos
            strPos = (strPos - 1)
            if (not ((tmp > 0))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1936
            if (strPos > startAt):
                continue
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1937
            strCh = HxString.charCodeAt(_hx_str,strPos)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1939
            if (strCh == (searchForChars[searchForPosToCheck] if searchForPosToCheck >= 0 and searchForPosToCheck < len(searchForChars) else None)):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1940
                if (searchForPosToCheck == 0):
                    return strPos
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1942
                searchForPosToCheck = (searchForPosToCheck - 1)
            else:
                searchForPosToCheck = (searchForLen - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1946
        return -1

    @staticmethod
    def length8(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1963
        if (_hx_str is None):
            return 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1967
        return len(_hx_str)

    @staticmethod
    def left(_hx_str,_hx_len):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1990
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= _hx_len):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:1993
        return hx_strings_Strings.substring8(_hx_str,0,_hx_len)

    @staticmethod
    def lpad(_hx_str,targetLength,padStr = None,canOverflow = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2016
        if (padStr is None):
            padStr = " "
        if (canOverflow is None):
            canOverflow = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2017
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2018
        if ((_hx_str is None) or ((strLen > targetLength))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2021
        if ((padStr is None) or ((len(padStr) == 0))):
            padStr = " "
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2024
        sb = [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2025
        padLen = (0 if ((padStr is None)) else len(padStr))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2026
        while (strLen < targetLength):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2027
            sb.insert(0, padStr)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2028
            strLen = (strLen + padLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2031
        if canOverflow:
            return "".join([python_Boot.toString1(x1,'') for x1 in sb])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2034
        return hx_strings_Strings.right("".join([python_Boot.toString1(x1,'') for x1 in sb]),targetLength)

    @staticmethod
    def map(_hx_str,mapper,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2050
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2051
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2054
        if (separator is None):
            raise haxe_Exception.thrown("[separator] must not be null")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2057
        return list(map(mapper,hx_strings_Strings.split8(_hx_str,[separator])))

    @staticmethod
    def prependIfMissing(_hx_str,suffix):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2074
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2077
        if (len(_hx_str) == 0):
            return (("null" if suffix is None else suffix) + ("null" if _hx_str is None else _hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2080
        if hx_strings_Strings.startsWith(_hx_str,suffix):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2083
        return (("null" if suffix is None else suffix) + ("null" if _hx_str is None else _hx_str))

    @staticmethod
    def quoteDouble(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2100
        if (_hx_str is None):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2103
        if (len(_hx_str) == 0):
            return "\"\""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2106
        tmp = None
        if (_hx_str is None):
            tmp = False
        else:
            startIndex = None
            tmp = (((_hx_str.find("\"") if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,"\"",startIndex))) > -1)
        if (not tmp):
            return (("\"" + ("null" if _hx_str is None else _hx_str)) + "\"")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2109
        return (("\"" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll(_hx_str,"\"","\\\""))) + "\"")

    @staticmethod
    def quoteSingle(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2126
        if (_hx_str is None):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2129
        if (len(_hx_str) == 0):
            return "''"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2132
        tmp = None
        if (_hx_str is None):
            tmp = False
        else:
            startIndex = None
            tmp = (((_hx_str.find("'") if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,"'",startIndex))) > -1)
        if (not tmp):
            return (("'" + ("null" if _hx_str is None else _hx_str)) + "'")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2135
        return (("'" + HxOverrides.stringOrNull(hx_strings_Strings.replaceAll(_hx_str,"'","\\'"))) + "'")

    @staticmethod
    def removeAfter(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2144
        return hx_strings_Strings.substringBefore(_hx_str,searchFor)

    @staticmethod
    def removeAfterLast(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2152
        return hx_strings_Strings.substringBeforeLast(_hx_str,searchFor)

    @staticmethod
    def removeAfterIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2160
        return hx_strings_Strings.substringBeforeIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeAfterLastIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2168
        return hx_strings_Strings.substringBeforeLastIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeAt(_hx_str,pos,length):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2192
        if (((_hx_str is None) or ((len(_hx_str) == 0))) or ((length < 1))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2195
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2196
        if (pos < 0):
            pos = (strLen + pos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2198
        if (pos < 0):
            raise haxe_Exception.thrown("[pos] must be smaller than -1 * str.length")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2201
        if ((pos + length) >= strLen):
            return hx_strings_Strings.substring8(_hx_str,0,pos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2204
        return (HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,0,pos)) + HxOverrides.stringOrNull(hx_strings_Strings.substring8(_hx_str,(pos + length))))

    @staticmethod
    def removeBefore(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2213
        return hx_strings_Strings.substringAfter(_hx_str,searchFor)

    @staticmethod
    def removeBeforeLast(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2221
        return hx_strings_Strings.substringAfterLast(_hx_str,searchFor)

    @staticmethod
    def removeBeforeIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2229
        return hx_strings_Strings.substringAfterIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeBeforeLastIgnoreCase(_hx_str,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2237
        return hx_strings_Strings.substringAfterLastIgnoreCase(_hx_str,searchFor)

    @staticmethod
    def removeAll(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2254
        return hx_strings_Strings.replaceAll(searchIn,searchFor,"")

    @staticmethod
    def removeFirst(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2272
        return hx_strings_Strings.replaceFirst(searchIn,searchFor,"")

    @staticmethod
    def removeFirstIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2290
        return hx_strings_Strings.replaceFirstIgnoreCase(searchIn,searchFor,"")

    @staticmethod
    def removeAnsi(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2303
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2306
        return hx_strings_Strings.REGEX_ANSI_ESC.ereg.replace(_hx_str,"")

    @staticmethod
    def removeLeading(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2327
        if (((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2330
        while hx_strings_Strings.startsWith(searchIn,searchFor):
            searchIn = HxString.substring(searchIn,len(searchFor),len(searchIn))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2333
        return searchIn

    @staticmethod
    def removeTags(xml):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2353
        if ((xml is None) or ((len(xml) == 0))):
            return xml
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2359
        return hx_strings_Strings.REGEX_REMOVE_XML_TAGS.ereg.replace(xml,"")

    @staticmethod
    def removeTrailing(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2381
        if (((searchIn is None) or ((len(searchIn) == 0))) or (((searchFor is None) or ((len(searchFor) == 0))))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2384
        while hx_strings_Strings.endsWith(searchIn,searchFor):
            searchIn = HxString.substring(searchIn,0,(len(searchIn) - len(searchFor)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2387
        return searchIn

    @staticmethod
    def repeat(_hx_str,count,separator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2407
        if (separator is None):
            separator = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2408
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2411
        if (count < 1):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2414
        if (count == 1):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2417
        _g = []
        _g1 = 0
        _g2 = count
        while (_g1 < _g2):
            i = _g1
            _g1 = (_g1 + 1)
            _g.append(_hx_str)
        return separator.join([python_Boot.toString1(x1,'') for x1 in _g])

    @staticmethod
    def replaceAll(searchIn,searchFor,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2436
        if (((searchIn is None) or (((searchIn is None) or ((len(searchIn) == 0))))) or ((searchFor is None))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2439
        if (replaceWith is None):
            replaceWith = "null"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2441
        return StringTools.replace(searchIn,searchFor,replaceWith)

    @staticmethod
    def replaceFirst(searchIn,searchFor,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2460
        if (((searchIn is None) or (((searchIn is None) or ((len(searchIn) == 0))))) or ((searchFor is None))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2463
        if (replaceWith is None):
            replaceWith = "null"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2465
        foundAt = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2466
        if (len(searchFor) == 0):
            if (((0 if ((searchIn is None)) else len(searchIn))) > 1):
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn,searchFor)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2474
        return ((HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,0,foundAt)) + ("null" if replaceWith is None else replaceWith)) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,(foundAt + ((0 if ((searchFor is None)) else len(searchFor)))))))

    @staticmethod
    def replaceFirstIgnoreCase(searchIn,searchFor,replaceWith):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2493
        if (((searchIn is None) or (((searchIn is None) or ((len(searchIn) == 0))))) or ((searchFor is None))):
            return searchIn
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2496
        if (replaceWith is None):
            replaceWith = "null"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2498
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2500
        foundAt = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2501
        if (len(searchFor) == 0):
            if (((0 if ((searchIn is None)) else len(searchIn))) > 1):
                foundAt = 1
            else:
                return searchIn
        else:
            foundAt = hx_strings_Strings.indexOf8(searchIn.lower(),searchFor)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2509
        return ((HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,0,foundAt)) + ("null" if replaceWith is None else replaceWith)) + HxOverrides.stringOrNull(hx_strings_Strings.substr8(searchIn,(foundAt + ((0 if ((searchFor is None)) else len(searchFor)))))))

    @staticmethod
    def reverse(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2523
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2526
        chars = hx_strings_Strings.split8(_hx_str,[""])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2527
        chars.reverse()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2528
        return "".join([python_Boot.toString1(x1,'') for x1 in chars])

    @staticmethod
    def right(_hx_str,_hx_len):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2546
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2549
        return hx_strings_Strings.substring8(_hx_str,(((0 if ((_hx_str is None)) else len(_hx_str))) - _hx_len))

    @staticmethod
    def rpad(_hx_str,targetLength,padStr = None,canOverflow = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2572
        if (padStr is None):
            padStr = " "
        if (canOverflow is None):
            canOverflow = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2573
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2574
        if ((_hx_str is None) or ((strLen > targetLength))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2577
        if ((padStr is None) or ((len(padStr) == 0))):
            padStr = " "
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2580
        padLen = (0 if ((padStr is None)) else len(padStr))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2581
        sb = hx_strings_StringBuilder(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2582
        while (strLen < targetLength):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2583
            sb.add(padStr)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2584
            strLen = (strLen + padLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2587
        if canOverflow:
            return sb.toString()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2590
        _hx_str = sb.toString()
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= targetLength):
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str,0,targetLength)

    @staticmethod
    def split8(_hx_str,separator,maxParts = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2619
        if (maxParts is None):
            maxParts = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2620
        if ((_hx_str is None) or ((separator is None))):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2623
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2625
        if (strLen == 0):
            return []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2628
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2628
            return (s is not None)
        separators = list(filter(_hx_local_0,separator))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2629
        if (len(separators) == 0):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2633
        if ((maxParts <= 0) and ((len(separators) == 1))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2634
            delimiter = (separators[0] if 0 < len(separators) else None)
            if (delimiter == ""):
                return list(_hx_str)
            else:
                return _hx_str.split(delimiter)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2646
        if (python_internal_ArrayImpl.indexOf(separators,"",None) > -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2647
            if (maxParts <= 0):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2648
                _g = []
                _g1 = 0
                _g2 = strLen
                while (_g1 < _g2):
                    i = _g1
                    _g1 = (_g1 + 1)
                    x = HxString.substr(_hx_str,i,1)
                    _g.append(x)
                return _g
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2650
            if (maxParts > strLen):
                maxParts = strLen
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2652
            maxParts = (maxParts - 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2653
            _g = []
            _g1 = 0
            _g2 = maxParts
            while (_g1 < _g2):
                i = _g1
                _g1 = (_g1 + 1)
                x = HxString.substr(_hx_str,i,1)
                _g.append(x)
            result = _g
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2654
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2654
            x = HxString.substr(_hx_str,maxParts,(strLen - maxParts))
            result.append(x)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2655
            return result
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2658
        _g = []
        _g1 = 0
        while (_g1 < len(separators)):
            sep = (separators[_g1] if _g1 >= 0 and _g1 < len(separators) else None)
            _g1 = (_g1 + 1)
            x = (0 if ((sep is None)) else len(sep))
            _g.append(x)
        separatorsLengths = _g
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2659
        lastFoundAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2660
        result = []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2661
        resultCount = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2662
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2663
            separatorLen = 0
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2664
            foundAt = -1
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2665
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2665
            _g = 0
            _g1 = len(separators)
            while (_g < _g1):
                i = _g
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2666
                sepFoundAt = hx_strings_Strings.indexOf8(_hx_str,(separators[i] if i >= 0 and i < len(separators) else None),lastFoundAt)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2667
                if (sepFoundAt != -1):
                    if ((foundAt == -1) or ((sepFoundAt < foundAt))):
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2669
                        foundAt = sepFoundAt
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2670
                        separatorLen = (separatorsLengths[i] if i >= 0 and i < len(separatorsLengths) else None)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2674
            resultCount = (resultCount + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2675
            if ((foundAt == -1) or ((resultCount == maxParts))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2676
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2676
                x = HxString.substr(_hx_str,lastFoundAt,(strLen - lastFoundAt))
                result.append(x)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2677
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2679
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2679
            x1 = HxString.substr(_hx_str,lastFoundAt,(foundAt - lastFoundAt))
            result.append(x1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2680
            lastFoundAt = (foundAt + separatorLen)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2682
        return result

    @staticmethod
    def splitAt(_hx_str,splitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2703
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2706
        if ((splitPos is None) or ((len(splitPos) == 0))):
            return [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2709
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2710
        if (strLen == 0):
            return [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2714
        pos = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2715
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2715
        _g = 0
        _g1 = splitPos
        while (_g < len(_g1)):
            p = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2716
            if (p < 0):
                p = (strLen + p)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2718
            if ((p < 0) or ((p >= strLen))):
                continue
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2720
            if (python_internal_ArrayImpl.indexOf(pos,p,None) > -1):
                continue
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2722
            pos.append(p)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2725
        def _hx_local_1(a,b):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2725
            if (a < b):
                return -1
            elif (a > b):
                return 1
            else:
                return 0
        pos.sort(key= python_lib_Functools.cmp_to_key(_hx_local_1))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2727
        result = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2729
        lastPos = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2730
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2730
        _g = 0
        while (_g < len(pos)):
            p = (pos[_g] if _g >= 0 and _g < len(pos) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2731
            chunk = hx_strings_Strings.substring8(_hx_str,lastPos,p)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2732
            if ((chunk is not None) and ((len(chunk) > 0))):
                result.append(chunk)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2734
            lastPos = p
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2736
        chunk = hx_strings_Strings.substring8(_hx_str,lastPos)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2737
        if ((chunk is not None) and ((len(chunk) > 0))):
            result.append(chunk)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2739
        return result

    @staticmethod
    def splitEvery(_hx_str,count):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2756
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2759
        if (count < 1):
            raise haxe_Exception.thrown("[count] must be greater than 0")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2762
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2763
        if ((strLen == 0) or ((count >= strLen))):
            return [_hx_str]
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2766
        result = list()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2767
        pos = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2768
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2769
            chunk = hx_strings_Strings.substr8(_hx_str,pos,count)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2770
            pos = (pos + count)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2771
            if ((chunk is None) or ((len(chunk) == 0))):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2773
            result.append(chunk)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2775
        return result

    @staticmethod
    def splitLines(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2792
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return []
        else:
            return hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)

    @staticmethod
    def startsWith(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2806
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2809
        if (((searchFor is None) or ((len(searchFor) == 0))) or ((searchIn == searchFor))):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2817
        return searchIn.startswith(searchFor)

    @staticmethod
    def startsWithAny(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2836
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2839
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2839
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2840
            if ((candidate is not None) and hx_strings_Strings.startsWith(searchIn,candidate)):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2842
        return False

    @staticmethod
    def startsWithAnyIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2861
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2864
        searchIn = hx_strings_Strings.toLowerCase8(searchIn)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2865
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2865
        _g = 0
        while (_g < len(searchFor)):
            candidate = (searchFor[_g] if _g >= 0 and _g < len(searchFor) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2866
            if ((candidate is not None) and hx_strings_Strings.startsWith(searchIn,hx_strings_Strings.toLowerCase8(candidate))):
                return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2869
        return False

    @staticmethod
    def startsWithIgnoreCase(searchIn,searchFor):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2884
        if ((searchIn is None) or ((searchFor is None))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2887
        if ((searchFor is None) or ((len(searchFor) == 0))):
            return True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2890
        return hx_strings_Strings.startsWith(searchIn.lower(),searchFor.lower())

    @staticmethod
    def substr8(_hx_str,startAt,_hx_len = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2916
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2919
        if (_hx_len is None):
            _hx_len = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2922
        if (_hx_len <= 0):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2925
        if (startAt < 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2926
            startAt = (startAt + (0 if ((_hx_str is None)) else len(_hx_str)))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2927
            if (startAt < 0):
                startAt = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2931
        return HxString.substr(_hx_str,startAt,_hx_len)

    @staticmethod
    def substring8(_hx_str,startAt,endAt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2973
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2976
        if (endAt is None):
            endAt = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:2980
        return HxString.substring(_hx_str,startAt,endAt)

    @staticmethod
    def substringAfter(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3007
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3008
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3011
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3012
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3014
        startIndex = None
        foundAt = (_hx_str.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3015
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3016
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3018
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringAfterIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3035
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3036
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3039
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3040
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3042
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3044
        _this = _hx_str.lower()
        startIndex = None
        foundAt = (_this.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_this,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3045
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3046
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3048
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringBetween(_hx_str,after,before = None,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3068
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3069
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3072
        if (before is None):
            before = after
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3074
        if (((_hx_str == "") or (((after is None) or ((len(after) == 0))))) or (((before is None) or ((len(before) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3075
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3077
        startIndex = None
        foundAfterAt = (_hx_str.find(after) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,after,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3078
        if (foundAfterAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3079
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3081
        startIndex = (foundAfterAt + len(after))
        foundBeforeAt = (_hx_str.find(before) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,before,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3082
        if (foundBeforeAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3083
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3085
        return HxString.substring(_hx_str,(foundAfterAt + len(after)),foundBeforeAt)

    @staticmethod
    def substringBetweenIgnoreCase(_hx_str,after,before = None,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3105
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3106
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3109
        if (before is None):
            before = after
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3111
        if (((_hx_str == "") or (((after is None) or ((len(after) == 0))))) or (((before is None) or ((len(before) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3112
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3114
        strLower = hx_strings_Strings.toLowerCase8(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3115
        after = hx_strings_Strings.toLowerCase8(after)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3116
        before = hx_strings_Strings.toLowerCase8(before)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3118
        startIndex = None
        foundAfterAt = (strLower.find(after) if ((startIndex is None)) else HxString.indexOfImpl(strLower,after,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3119
        if (foundAfterAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3120
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3122
        startIndex = (foundAfterAt + len(after))
        foundBeforeAt = (strLower.find(before) if ((startIndex is None)) else HxString.indexOfImpl(strLower,before,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3123
        if (foundBeforeAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3124
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3126
        return HxString.substring(_hx_str,(foundAfterAt + len(after)),foundBeforeAt)

    @staticmethod
    def substringAfterLast(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3143
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3144
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3147
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3148
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3150
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif (searchFor == ""):
            length = len(_hx_str)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _hx_str.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3151
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3152
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3154
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringAfterLastIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3172
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3173
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3176
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3177
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3179
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3181
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif (searchFor == ""):
            length = len(_this)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _this.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3182
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3183
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3185
        return HxString.substring(_hx_str,(foundAt + len(searchFor)),None)

    @staticmethod
    def substringBefore(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3202
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3203
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3206
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3207
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3209
        startIndex = None
        foundAt = (_hx_str.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_hx_str,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3210
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3211
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3213
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def substringBeforeIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3231
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3232
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3235
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3236
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3238
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3240
        _this = _hx_str.lower()
        startIndex = None
        foundAt = (_this.find(searchFor) if ((startIndex is None)) else HxString.indexOfImpl(_this,searchFor,startIndex))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3241
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3242
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3244
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def substringBeforeLast(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3263
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3264
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3267
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3268
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3270
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _hx_str.rfind(searchFor, 0, len(_hx_str))
        elif (searchFor == ""):
            length = len(_hx_str)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _hx_str.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _hx_str.find(searchFor, startLeft, len(_hx_str))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3271
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3272
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3274
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def substringBeforeLastIgnoreCase(_hx_str,searchFor,notFoundDefault = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3292
        if (notFoundDefault is None):
            notFoundDefault = 2
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3293
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3296
        if ((_hx_str == "") or (((searchFor is None) or ((len(searchFor) == 0))))):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3297
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3299
        searchFor = searchFor.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3301
        _this = _hx_str.lower()
        startIndex = None
        foundAt = None
        if (startIndex is None):
            foundAt = _this.rfind(searchFor, 0, len(_this))
        elif (searchFor == ""):
            length = len(_this)
            if (startIndex < 0):
                startIndex = (length + startIndex)
                if (startIndex < 0):
                    startIndex = 0
            foundAt = (length if ((startIndex > length)) else startIndex)
        else:
            i = _this.rfind(searchFor, 0, (startIndex + 1))
            startLeft = (max(0,((startIndex + 1) - len(searchFor))) if ((i == -1)) else (i + 1))
            check = _this.find(searchFor, startLeft, len(_this))
            foundAt = (check if (((check > i) and ((check <= startIndex)))) else i)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3302
        if (foundAt == -1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3303
            notFoundDefault1 = notFoundDefault
            if (notFoundDefault1 == 1):
                return None
            elif (notFoundDefault1 == 2):
                return ""
            elif (notFoundDefault1 == 3):
                return _hx_str
            else:
                pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3305
        return HxString.substring(_hx_str,0,foundAt)

    @staticmethod
    def toBool(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3325
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3328
        _g = _hx_str.lower()
        _hx_local_0 = len(_g)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3329
        if (_hx_local_0 == 1):
            if (_g == "0"):
                return False
            else:
                return True
        elif (_hx_local_0 == 5):
            if (_g == "false"):
                return False
            else:
                return True
        elif (_hx_local_0 == 2):
            if (_g == "no"):
                return False
            else:
                return True
        else:
            return True

    @staticmethod
    def toBytes(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3348
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3351
        return haxe_io_Bytes.ofString(_hx_str)

    @staticmethod
    def toChar(charCode):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3367
        return charCode

    @staticmethod
    def toCharIterator(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3381
        if (_hx_str is None):
            return hx_strings__CharIterator_NullCharIterator.INSTANCE
        else:
            return hx_strings__CharIterator_StringCharIterator(_hx_str,0)

    @staticmethod
    def toChars(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3395
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3398
        strLen = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3400
        if (strLen == 0):
            return []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3403
        _g = []
        _g1 = 0
        _g2 = strLen
        while (_g1 < _g2):
            i = _g1
            _g1 = (_g1 + 1)
            x = HxString.charCodeAt(_hx_str,i)
            _g.append(x)
        return _g

    @staticmethod
    def toPattern(_hx_str,options = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3417
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3419
        return hx_strings_Pattern.compile(_hx_str,options)

    @staticmethod
    def toEReg(_hx_str,opt = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3432
        if (opt is None):
            opt = ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3433
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3435
        return EReg(_hx_str,opt)

    @staticmethod
    def toFloat(_hx_str,ifUnparseable = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3456
        result = Std.parseFloat(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3457
        if python_lib_Math.isnan(result):
            return ifUnparseable
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3459
        return result

    @staticmethod
    def toHex(num,minDigits = None,upperCase = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3481
        if (minDigits is None):
            minDigits = 0
        if (upperCase is None):
            upperCase = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3482
        hexed = StringTools.hex(num,0)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3483
        if (not upperCase):
            return hexed.lower()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3485
        if (len(hexed) >= minDigits):
            return hexed
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3487
        return hx_strings_Strings.lpad(hexed,minDigits,"0")

    @staticmethod
    def toInt(_hx_str,ifUnparseable = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3508
        result = Std.parseInt(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3509
        if (result is None):
            return ifUnparseable
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3511
        return result

    @staticmethod
    def toLowerCase8(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3531
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3537
        return _hx_str.lower()

    @staticmethod
    def toLowerCaseFirstChar(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3561
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3564
        this1 = HxString.charCodeAt(_hx_str,0)
        lowerChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapU2L.h.get(this1,None)
        firstChar = (this1 if ((lowerChar is None)) else lowerChar)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3566
        if (len(_hx_str) == 1):
            return "".join(map(chr,[firstChar]))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3569
        other = hx_strings_Strings.substr8(_hx_str,1)
        return (HxOverrides.stringOrNull("".join(map(chr,[firstChar]))) + ("null" if other is None else other))

    @staticmethod
    def toLowerCamel(_hx_str,keepUppercasedWords = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3592
        if (keepUppercasedWords is None):
            keepUppercasedWords = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3593
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3596
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3597
        if keepUppercasedWords:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3598
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3599
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3601
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3602
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(word)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3603
        return hx_strings_Strings.toLowerCaseFirstChar(sb.toString())

    @staticmethod
    def toLowerHyphen(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3626
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3629
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3629
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return "-".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toLowerUnderscore(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3652
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3655
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3655
            return hx_strings_Strings.toLowerCase8(s)
        _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return "_".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toTitle(_hx_str,keepUppercasedWords = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3675
        if (keepUppercasedWords is None):
            keepUppercasedWords = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3676
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3679
        if keepUppercasedWords:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3681
            def _hx_local_0(s):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3681
                if (hx_strings_Strings.toUpperCase8(s) == s):
                    return s
                else:
                    return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(s))
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3680
            _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
            return " ".join([python_Boot.toString1(x1,'') for x1 in _this])
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3685
        def _hx_local_1(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3685
            return hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(s))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3684
        _this = list(map(_hx_local_1,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return " ".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toUpperCamel(_hx_str,keepUppercasedWords = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3705
        if (keepUppercasedWords is None):
            keepUppercasedWords = True
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3706
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3709
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3710
        if keepUppercasedWords:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3711
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3712
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(word))
        else:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3714
            _g = 0
            _g1 = hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)
            while (_g < len(_g1)):
                word = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3715
                sb.add(hx_strings_Strings.toUpperCaseFirstChar(hx_strings_Strings.toLowerCase8(word)))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3716
        return sb.toString()

    @staticmethod
    def toUpperUnderscore(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3735
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3738
        def _hx_local_0(s):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3738
            return hx_strings_Strings.toUpperCase8(s)
        _this = list(map(_hx_local_0,hx_strings_Strings._splitAsciiWordsUnsafe(_hx_str)))
        return "_".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def toString(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3754
        if (_hx_str is None):
            return "null"
        else:
            return _hx_str

    @staticmethod
    def toUpperCase8(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3773
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3779
        return _hx_str.upper()

    @staticmethod
    def toUpperCaseFirstChar(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3804
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3807
        this1 = HxString.charCodeAt(_hx_str,0)
        upperChar = hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER.mapL2U.h.get(this1,None)
        firstChar = (this1 if ((upperChar is None)) else upperChar)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3809
        if (len(_hx_str) == 1):
            return "".join(map(chr,[firstChar]))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3811
        other = hx_strings_Strings.substr8(_hx_str,1)
        return (HxOverrides.stringOrNull("".join(map(chr,[firstChar]))) + ("null" if other is None else other))

    @staticmethod
    def trim(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3831
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3834
        if (charsToRemove is None):
            return StringTools.trim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3837
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3838
        if (removableChars1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3838
            str1 = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3837
            removableChars = hx_strings_Strings.toChars(str1)
        elif (removableChars1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3839
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3837
            removableChars = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3842
        this1 = hx_strings_internal__Either2__Either2.b(removableChars)
        this2 = hx_strings_internal__Either2__Either2.b(removableChars)
        return hx_strings_Strings.trimLeft(hx_strings_Strings.trimRight(_hx_str,this1),this2)

    @staticmethod
    def trimRight(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3864
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3867
        if (charsToRemove is None):
            return StringTools.rtrim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3870
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3871
        if (removableChars1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3871
            str1 = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3870
            removableChars = hx_strings_Strings.toChars(str1)
        elif (removableChars1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3872
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3870
            removableChars = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3875
        if (len(removableChars) == 0):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3878
        _hx_len = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3879
        i = (_hx_len - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3880
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3880
            tmp = None
            if (i > -1):
                str1 = hx_strings_Strings.charAt8(_hx_str,i)
                strLen = (0 if ((str1 is None)) else len(str1))
                tmp = (python_internal_ArrayImpl.indexOf(removableChars,(-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt(str1,0)),None) > -1)
            else:
                tmp = False
            if (not tmp):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3881
            i = (i - 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3882
        if (i < ((_hx_len - 1))):
            return hx_strings_Strings.substring8(_hx_str,0,(i + 1))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3884
        return _hx_str

    @staticmethod
    def trimLeft(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3906
        if (_hx_str is None):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3909
        if (charsToRemove is None):
            return StringTools.ltrim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3912
        removableChars = None
        _g = charsToRemove
        removableChars1 = _g.index
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3913
        if (removableChars1 == 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3913
            str1 = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3912
            removableChars = hx_strings_Strings.toChars(str1)
        elif (removableChars1 == 1):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3914
            chars = _g.params[0]
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3912
            removableChars = chars
        else:
            pass
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3917
        if (len(removableChars) == 0):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3920
        _hx_len = (0 if ((_hx_str is None)) else len(_hx_str))
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3921
        i = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3922
        while True:
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3922
            tmp = None
            if (i < _hx_len):
                str1 = hx_strings_Strings.charAt8(_hx_str,i)
                strLen = (0 if ((str1 is None)) else len(str1))
                tmp = (python_internal_ArrayImpl.indexOf(removableChars,(-1 if (((strLen == 0) or ((0 >= strLen)))) else HxString.charCodeAt(str1,0)),None) > -1)
            else:
                tmp = False
            if (not tmp):
                break
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3923
            i = (i + 1)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3925
        if (i > 0):
            return hx_strings_Strings.substring8(_hx_str,i,_hx_len)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3927
        return _hx_str

    @staticmethod
    def trimLines(_hx_str,charsToRemove = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3945
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3948
        def _hx_local_0(line):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3948
            return hx_strings_Strings.trim(line,charsToRemove)
        _this = list(map(_hx_local_0,hx_strings_Strings.REGEX_SPLIT_LINES.ereg.split(_hx_str)))
        return "\n".join([python_Boot.toString1(x1,'') for x1 in _this])

    @staticmethod
    def trimToNull(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3963
        if (_hx_str is None):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3966
        trimmed = hx_strings_Strings.trim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3968
        if ((trimmed is None) or ((len(trimmed) == 0))):
            return None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3971
        return trimmed

    @staticmethod
    def trimToEmpty(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3986
        trimmed = hx_strings_Strings.trim(_hx_str)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3988
        if ((trimmed is None) or ((len(trimmed) == 0))):
            return ""
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:3991
        return trimmed

    @staticmethod
    def truncate(_hx_str,maxLength):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4008
        if (((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLength):
            return _hx_str
        else:
            return hx_strings_Strings.substring8(_hx_str,0,maxLength)

    @staticmethod
    def urlDecode(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4020
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4026
        return python_lib_urllib_Parse.unquote(_hx_str)

    @staticmethod
    def urlEncode(_hx_str):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4042
        if ((_hx_str is None) or ((len(_hx_str) == 0))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4048
        return python_lib_urllib_Parse.quote(_hx_str,"")

    @staticmethod
    def wrap(_hx_str,maxLineLength,splitLongWords = None,newLineSeparator = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4065
        if (splitLongWords is None):
            splitLongWords = True
        if (newLineSeparator is None):
            newLineSeparator = "\n"
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4066
        if ((((0 if ((_hx_str is None)) else len(_hx_str))) <= maxLineLength) or ((maxLineLength < 1))):
            return _hx_str
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4069
        sb = hx_strings_StringBuilder()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4070
        wordChars = []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4071
        currLineLength = 0
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4072
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4072
        _g = 0
        _g1 = hx_strings_Strings.toChars(_hx_str)
        while (_g < len(_g1)):
            ch = (_g1[_g] if _g >= 0 and _g < len(_g1) else None)
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4073
            if (((ch > 8) and ((ch < 14))) or ((ch == 32))):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4074
                if (len(wordChars) > 0):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4075
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4075
                    _g2 = 0
                    while (_g2 < len(wordChars)):
                        wordCh = (wordChars[_g2] if _g2 >= 0 and _g2 < len(wordChars) else None)
                        _g2 = (_g2 + 1)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4076
                        if ((currLineLength == maxLineLength) and splitLongWords):
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4077
                            sb.add(newLineSeparator)
                            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4078
                            currLineLength = 0
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4080
                        currLineLength = (currLineLength + 1)
                        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4081
                        sb.addChar(wordCh)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4083
                    wordChars = []
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4085
                if (currLineLength >= maxLineLength):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4086
                    sb.add(newLineSeparator)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4087
                    currLineLength = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4089
                sb.addChar(ch)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4090
                currLineLength = (currLineLength + 1)
            else:
                wordChars.append(ch)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4094
        if (len(wordChars) > 0):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4095
            _g = 0
            while (_g < len(wordChars)):
                wordCh = (wordChars[_g] if _g >= 0 and _g < len(wordChars) else None)
                _g = (_g + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4096
                if ((currLineLength == maxLineLength) and splitLongWords):
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4097
                    sb.add(newLineSeparator)
                    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4098
                    currLineLength = 0
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4100
                currLineLength = (currLineLength + 1)
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4101
                sb.addChar(wordCh)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4104
        return sb.toString()


class hx_strings_StringDiff:
    _hx_class_name = "hx.strings.StringDiff"
    __slots__ = ("at", "left", "right")
    _hx_fields = ["at", "left", "right"]
    _hx_methods = ["toString"]

    def __init__(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4177
        self.right = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4172
        self.left = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4167
        self.at = None

    def toString(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4180
        return (((((("StringDiff[at=" + Std.string(self.at)) + ", left=") + HxOverrides.stringOrNull(self.left)) + ", right=") + HxOverrides.stringOrNull(self.right)) + "]")

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.at = None
        _hx_o.left = None
        _hx_o.right = None

class hx_strings_HashCodeAlgorithm(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.HashCodeAlgorithm"
    _hx_constructs = ["PLATFORM_SPECIFIC", "ADLER32", "CRC32B", "DJB2A", "JAVA", "SDBM"]
hx_strings_HashCodeAlgorithm.PLATFORM_SPECIFIC = hx_strings_HashCodeAlgorithm("PLATFORM_SPECIFIC", 0, ())
hx_strings_HashCodeAlgorithm.ADLER32 = hx_strings_HashCodeAlgorithm("ADLER32", 1, ())
hx_strings_HashCodeAlgorithm.CRC32B = hx_strings_HashCodeAlgorithm("CRC32B", 2, ())
hx_strings_HashCodeAlgorithm.DJB2A = hx_strings_HashCodeAlgorithm("DJB2A", 3, ())
hx_strings_HashCodeAlgorithm.JAVA = hx_strings_HashCodeAlgorithm("JAVA", 4, ())
hx_strings_HashCodeAlgorithm.SDBM = hx_strings_HashCodeAlgorithm("SDBM", 5, ())

class hx_strings_AnsiToHtmlRenderMethod(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.AnsiToHtmlRenderMethod"
    _hx_constructs = ["StyleAttributes", "CssClasses", "CssClassesCallback"]

    @staticmethod
    def CssClassesCallback(func):
        return hx_strings_AnsiToHtmlRenderMethod("CssClassesCallback", 2, (func,))
hx_strings_AnsiToHtmlRenderMethod.StyleAttributes = hx_strings_AnsiToHtmlRenderMethod("StyleAttributes", 0, ())
hx_strings_AnsiToHtmlRenderMethod.CssClasses = hx_strings_AnsiToHtmlRenderMethod("CssClasses", 1, ())


class hx_strings_AnsiState:
    _hx_class_name = "hx.strings.AnsiState"
    __slots__ = ("bgcolor", "blink", "bold", "fgcolor", "underline")
    _hx_fields = ["bgcolor", "blink", "bold", "fgcolor", "underline"]
    _hx_methods = ["isActive", "reset", "copyFrom", "setGraphicModeParameter", "toCSS"]
    _hx_statics = ["defaultCssClassesCallback"]

    def __init__(self,copyFrom = None):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4255
        self.underline = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4254
        self.fgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4253
        self.bold = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4252
        self.blink = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4251
        self.bgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4260
        if (copyFrom is None):
            self.reset()
        else:
            self.copyFrom(copyFrom)

    def isActive(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4268
        if (not (((((self.fgcolor is not None) or ((self.bgcolor is not None))) or self.bold) or self.underline))):
            return self.blink
        else:
            return True

    def reset(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4272
        self.fgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4273
        self.bgcolor = None
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4274
        self.bold = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4275
        self.underline = False
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4276
        self.blink = False

    def copyFrom(self,other):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4281
        self.fgcolor = other.fgcolor
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4282
        self.bgcolor = other.bgcolor
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4283
        self.bold = other.bold
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4284
        self.underline = other.underline
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4285
        self.blink = other.blink

    def setGraphicModeParameter(self,param):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4290
        param1 = param
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4291
        if (param1 == 0):
            self.reset()
        elif (param1 == 1):
            self.bold = True
        elif (param1 == 4):
            self.underline = True
        elif (param1 == 5):
            self.blink = True
        elif (param1 == 30):
            self.fgcolor = "black"
        elif (param1 == 31):
            self.fgcolor = "red"
        elif (param1 == 32):
            self.fgcolor = "green"
        elif (param1 == 33):
            self.fgcolor = "yellow"
        elif (param1 == 34):
            self.fgcolor = "blue"
        elif (param1 == 35):
            self.fgcolor = "magenta"
        elif (param1 == 36):
            self.fgcolor = "cyan"
        elif (param1 == 37):
            self.fgcolor = "white"
        elif (param1 == 40):
            self.bgcolor = "black"
        elif (param1 == 41):
            self.bgcolor = "red"
        elif (param1 == 42):
            self.bgcolor = "green"
        elif (param1 == 43):
            self.bgcolor = "yellow"
        elif (param1 == 44):
            self.bgcolor = "blue"
        elif (param1 == 45):
            self.bgcolor = "magenta"
        elif (param1 == 46):
            self.bgcolor = "cyan"
        elif (param1 == 47):
            self.bgcolor = "white"
        else:
            pass

    def toCSS(self,renderMethod):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4316
        if (((((self.fgcolor is not None) or ((self.bgcolor is not None))) or self.bold) or self.underline) or self.blink):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4317
            sb = hx_strings_StringBuilder()
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4318
            if (renderMethod is None):
                renderMethod = hx_strings_AnsiToHtmlRenderMethod.StyleAttributes
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4319
            tmp = renderMethod.index
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4320
            if (tmp == 0):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4321
                if (self.fgcolor is not None):
                    sb.add("color:").add(self.fgcolor).add(";")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4323
                if (self.bgcolor is not None):
                    sb.add("background-color:").add(self.bgcolor).add(";")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4325
                if self.bold:
                    sb.add("font-weight:bold;")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4327
                if self.underline:
                    sb.add("text-decoration:underline;")
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4329
                if self.blink:
                    sb.add("text-decoration:blink;")
            elif (tmp == 1):
                sb.add(hx_strings_AnsiState.defaultCssClassesCallback(self))
            elif (tmp == 2):
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4335
                func = renderMethod.params[0]
                # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4336
                sb.add(func(self))
            else:
                pass
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4338
            return sb.toString()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4340
        return ""

    @staticmethod
    def defaultCssClassesCallback(state):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4362
        classes = []
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4363
        if (state.fgcolor is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4363
            x = ("ansi_fg_" + HxOverrides.stringOrNull(state.fgcolor))
            classes.append(x)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4364
        if (state.bgcolor is not None):
            # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4364
            x = ("ansi_bg_" + HxOverrides.stringOrNull(state.bgcolor))
            classes.append(x)
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4365
        if state.bold:
            classes.append("ansi_bold")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4366
        if state.underline:
            classes.append("ansi_underline")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4367
        if state.blink:
            classes.append("ansi_blink")
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:4368
        return " ".join([python_Boot.toString1(x1,'') for x1 in classes])

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.bgcolor = None
        _hx_o.blink = None
        _hx_o.bold = None
        _hx_o.fgcolor = None
        _hx_o.underline = None


class hx_strings_internal_Bits:
    _hx_class_name = "hx.strings.internal.Bits"
    __slots__ = ()
    _hx_statics = ["clearBit", "setBit", "toggleBit", "getBit"]

    @staticmethod
    def clearBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:22
        return (num & ~((1 << ((bitPos - 1)))))

    @staticmethod
    def setBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:33
        return (num | ((1 << ((bitPos - 1)))))

    @staticmethod
    def toggleBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:44
        return (num ^ ((1 << ((bitPos - 1)))))

    @staticmethod
    def getBit(num,bitPos):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Bits.hx:57
        return (1 == (((num >> ((bitPos - 1))) & 1)))


class hx_strings_internal__Either2_Either2_Impl_:
    _hx_class_name = "hx.strings.internal._Either2.Either2_Impl_"
    __slots__ = ()
    _hx_statics = ["_new", "get_value", "fromA", "fromB"]
    value = None

    @staticmethod
    def _new(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:16
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:24
        return this1

    @staticmethod
    def fromA(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:30
        this1 = hx_strings_internal__Either2__Either2.a(value)
        return this1

    @staticmethod
    def fromB(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either2.hx:36
        this1 = hx_strings_internal__Either2__Either2.b(value)
        return this1

class hx_strings_internal__Either2__Either2(Enum):
    __slots__ = ()
    _hx_class_name = "hx.strings.internal._Either2._Either2"
    _hx_constructs = ["a", "b"]

    @staticmethod
    def a(v):
        return hx_strings_internal__Either2__Either2("a", 0, (v,))

    @staticmethod
    def b(v):
        return hx_strings_internal__Either2__Either2("b", 1, (v,))


class hx_strings_internal__Either3_Either3_Impl_:
    _hx_class_name = "hx.strings.internal._Either3.Either3_Impl_"
    __slots__ = ()
    _hx_statics = ["_new", "get_value", "fromA", "fromB", "fromC"]
    value = None

    @staticmethod
    def _new(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:16
        this1 = value
        return this1

    @staticmethod
    def get_value(this1):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:24
        return this1

    @staticmethod
    def fromA(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:30
        this1 = hx_strings_internal__Either3__Either3.a(value)
        return this1

    @staticmethod
    def fromB(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:36
        this1 = hx_strings_internal__Either3__Either3.b(value)
        return this1

    @staticmethod
    def fromC(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/Either3.hx:42
        this1 = hx_strings_internal__Either3__Either3.c(value)
        return this1


class hx_strings_internal__OneOrMany_OneOrMany_Impl_:
    _hx_class_name = "hx.strings.internal._OneOrMany.OneOrMany_Impl_"
    __slots__ = ()
    _hx_statics = ["fromSingle"]

    @staticmethod
    def fromSingle(value):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OneOrMany.hx:20
        return [value]


class hx_strings_internal__RingBuffer_RingBuffer_Impl_:
    _hx_class_name = "hx.strings.internal._RingBuffer.RingBuffer_Impl_"
    __slots__ = ()
    _hx_statics = ["_new", "get"]

    @staticmethod
    def _new(size):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:19
        this1 = hx_strings_internal__RingBuffer_RingBufferImpl(size)
        return this1

    @staticmethod
    def get(this1,index):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:27
        return this1.get(index)


class hx_strings_internal__RingBuffer_RingBufferIterator:
    _hx_class_name = "hx.strings.internal._RingBuffer.RingBufferIterator"
    __slots__ = ("buff", "idx")
    _hx_fields = ["buff", "idx"]
    _hx_methods = ["hasNext", "next"]

    def __init__(self,buff):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:107
        self.idx = -1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:112
        self.buff = buff

    def hasNext(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:117
        return ((self.idx + 1) < self.buff.length)

    def next(self):
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:122
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:122
        _hx_local_0 = self
        _hx_local_1 = _hx_local_0.idx
        _hx_local_0.idx = (_hx_local_1 + 1)
        _hx_local_1
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/RingBuffer.hx:123
        return self.buff.get(self.idx)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.buff = None
        _hx_o.idx = None


class python_HaxeIterator:
    _hx_class_name = "python.HaxeIterator"
    __slots__ = ("it", "x", "has", "checked")
    _hx_fields = ["it", "x", "has", "checked"]
    _hx_methods = ["next", "hasNext"]

    def __init__(self,it):
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:32
        self.checked = False
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:31
        self.has = False
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:30
        self.x = None
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:35
        self.it = it

    def next(self):
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:39
        if (not self.checked):
            self.hasNext()
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:41
        self.checked = False
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:42
        return self.x

    def hasNext(self):
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:46
        if (not self.checked):
            # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:47
            try:
                # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:48
                self.x = self.it.__next__()
                # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:49
                self.has = True
            except BaseException as _g:
                if Std.isOfType(haxe_Exception.caught(_g).unwrap(),StopIteration):
                    # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:51
                    self.has = False
                    # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:52
                    self.x = None
                else:
                    raise _g
            # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:54
            self.checked = True
        # C:\HaxeToolkit\haxe\std/python/HaxeIterator.hx:56
        return self.has

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.it = None
        _hx_o.x = None
        _hx_o.has = None
        _hx_o.checked = None


class python_internal_ArrayImpl:
    _hx_class_name = "python.internal.ArrayImpl"
    __slots__ = ()
    _hx_statics = ["concat", "copy", "iterator", "keyValueIterator", "indexOf", "lastIndexOf", "join", "toString", "pop", "push", "unshift", "remove", "contains", "shift", "slice", "sort", "splice", "map", "filter", "insert", "reverse", "_get", "_set"]

    @staticmethod
    def concat(a1,a2):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:35
        return (a1 + a2)

    @staticmethod
    def copy(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:40
        return list(x)

    @staticmethod
    def iterator(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:45
        return python_HaxeIterator(x.__iter__())

    @staticmethod
    def keyValueIterator(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:50
        return haxe_iterators_ArrayKeyValueIterator(x)

    @staticmethod
    def indexOf(a,x,fromIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:55
        _hx_len = len(a)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:56
        l = (0 if ((fromIndex is None)) else ((_hx_len + fromIndex) if ((fromIndex < 0)) else fromIndex))
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:57
        if (l < 0):
            l = 0
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:59
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:59
        _g = l
        _g1 = _hx_len
        while (_g < _g1):
            i = _g
            _g = (_g + 1)
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:60
            if HxOverrides.eq(a[i],x):
                return i
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:63
        return -1

    @staticmethod
    def lastIndexOf(a,x,fromIndex = None):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:68
        _hx_len = len(a)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:69
        l = (_hx_len if ((fromIndex is None)) else (((_hx_len + fromIndex) + 1) if ((fromIndex < 0)) else (fromIndex + 1)))
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:70
        if (l > _hx_len):
            l = _hx_len
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:72
        while True:
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:72
            l = (l - 1)
            tmp = l
            if (not ((tmp > -1))):
                break
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:73
            if HxOverrides.eq(a[l],x):
                return l
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:76
        return -1

    @staticmethod
    def join(x,sep):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:82
        return sep.join([python_Boot.toString1(x1,'') for x1 in x])

    @staticmethod
    def toString(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:87
        return (("[" + HxOverrides.stringOrNull(",".join([python_Boot.toString1(x1,'') for x1 in x]))) + "]")

    @staticmethod
    def pop(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:92
        if (len(x) == 0):
            return None
        else:
            return x.pop()

    @staticmethod
    def push(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:97
        x.append(e)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:98
        return len(x)

    @staticmethod
    def unshift(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:103
        x.insert(0, e)

    @staticmethod
    def remove(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:108
        try:
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:109
            x.remove(e)
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:110
            return True
        except BaseException as _g:
            return False

    @staticmethod
    def contains(x,e):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:118
        return (e in x)

    @staticmethod
    def shift(x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:123
        if (len(x) == 0):
            return None
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:125
        return x.pop(0)

    @staticmethod
    def slice(x,pos,end = None):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:130
        return x[pos:end]

    @staticmethod
    def sort(x,f):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:135
        x.sort(key= python_lib_Functools.cmp_to_key(f))

    @staticmethod
    def splice(x,pos,_hx_len):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:140
        if (pos < 0):
            pos = (len(x) + pos)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:142
        if (pos < 0):
            pos = 0
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:144
        res = x[pos:(pos + _hx_len)]
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:145
        del x[pos:(pos + _hx_len)]
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:146
        return res

    @staticmethod
    def map(x,f):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:151
        return list(map(f,x))

    @staticmethod
    def filter(x,f):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:156
        return list(filter(f,x))

    @staticmethod
    def insert(a,pos,x):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:161
        a.insert(pos, x)

    @staticmethod
    def reverse(a):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:166
        a.reverse()

    @staticmethod
    def _get(x,idx):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:171
        if ((idx > -1) and ((idx < len(x)))):
            return x[idx]
        else:
            return None

    @staticmethod
    def _set(x,idx,v):
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:176
        l = len(x)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:177
        while (l < idx):
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:178
            x.append(None)
            # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:179
            l = (l + 1)
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:181
        if (l == idx):
            x.append(v)
        else:
            x[idx] = v
        # C:\HaxeToolkit\haxe\std/python/internal/ArrayImpl.hx:186
        return v


class HxOverrides:
    _hx_class_name = "HxOverrides"
    __slots__ = ()
    _hx_statics = ["eq", "stringOrNull", "rshift", "modf", "mod"]

    @staticmethod
    def eq(a,b):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:53
        if (isinstance(a,list) or isinstance(b,list)):
            return a is b
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:56
        return (a == b)

    @staticmethod
    def stringOrNull(s):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:61
        if (s is None):
            return "null"
        else:
            return s

    @staticmethod
    def rshift(val,n):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:148
        return ((val % 0x100000000) >> n)

    @staticmethod
    def modf(a,b):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:153
        if (b == 0.0):
            return float('nan')
        elif (a < 0):
            if (b < 0):
                return -(-a % (-b))
            else:
                return -(-a % b)
        elif (b < 0):
            return a % (-b)
        else:
            return a % b

    @staticmethod
    def mod(a,b):
        # C:\HaxeToolkit\haxe\std/python/internal/HxOverrides.hx:170
        if (a < 0):
            if (b < 0):
                return -(-a % (-b))
            else:
                return -(-a % b)
        elif (b < 0):
            return a % (-b)
        else:
            return a % b


class python_internal_MethodClosure:
    _hx_class_name = "python.internal.MethodClosure"
    __slots__ = ("obj", "func")
    _hx_fields = ["obj", "func"]
    _hx_methods = ["__call__"]

    def __init__(self,obj,func):
        # C:\HaxeToolkit\haxe\std/python/internal/MethodClosure.hx:30
        self.obj = obj
        # C:\HaxeToolkit\haxe\std/python/internal/MethodClosure.hx:31
        self.func = func

    def __call__(self,*args):
        # C:\HaxeToolkit\haxe\std/python/internal/MethodClosure.hx:35
        return self.func(self.obj,*args)

    @staticmethod
    def _hx_empty_init(_hx_o):
        _hx_o.obj = None
        _hx_o.func = None


class sys_io_File:
    _hx_class_name = "sys.io.File"
    __slots__ = ()
    _hx_statics = ["getContent"]

    @staticmethod
    def getContent(path):
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:31
        f = python_lib_Builtins.open(path,"r",-1,"utf-8",None,"")
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:32
        content = f.read(-1)
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:33
        f.close()
        # C:\HaxeToolkit\haxe\std/python/_std/sys/io/File.hx:34
        return content

# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:126
Math.NEGATIVE_INFINITY = float("-inf")
# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:127
Math.POSITIVE_INFINITY = float("inf")
# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:128
Math.NaN = float("nan")
# C:\HaxeToolkit\haxe\std/python/_std/Math.hx:129
Math.PI = python_lib_Math.pi

DataTypes.TYPES = _hx_AnonObject({'DYNAMIC': _hx_AnonObject({'identifier': "Dynamic", 'typeDependencies': 0}), 'STRING': _hx_AnonObject({'identifier': "String", 'typeDependencies': 0}), 'REAL': _hx_AnonObject({'identifier': "Real", 'typeDependencies': 0}), 'BOOL': _hx_AnonObject({'identifier': "Bool", 'typeDependencies': 0}), 'ARRAY_LIST': _hx_AnonObject({'identifier': "List", 'typeDependencies': 1})})
DataTypes.TYPES_ARRAY = [DataTypes.TYPES.DYNAMIC, DataTypes.TYPES.STRING, DataTypes.TYPES.REAL, DataTypes.TYPES.BOOL, DataTypes.TYPES.ARRAY_LIST]
Tokenizer.DIGITS = "1234567890"
Tokenizer.LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"
Tokenizer.LETTERS_DIGITS = (HxOverrides.stringOrNull(Tokenizer.DIGITS) + HxOverrides.stringOrNull(Tokenizer.LETTERS))
Tokenizer.KEYWORDS = [_hx_AnonObject({'identifier': "true", 'tType': TokenType.BoolConst(True)}), _hx_AnonObject({'identifier': "false", 'tType': TokenType.BoolConst(False)}), _hx_AnonObject({'identifier': "and", 'tType': TokenType.And}), _hx_AnonObject({'identifier': "or", 'tType': TokenType.Or}), _hx_AnonObject({'identifier': "if", 'tType': TokenType.If}), _hx_AnonObject({'identifier': "elif", 'tType': TokenType.Elif}), _hx_AnonObject({'identifier': "else", 'tType': TokenType.Else})]
haxe_crypto_Base64.CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
haxe_crypto_Base64.BYTES = haxe_io_Bytes.ofString(haxe_crypto_Base64.CHARS)
hx_strings__Char_Char_Impl_.CHAR_CASE_MAPPER = hx_strings__Char_CharCaseMapper()
hx_strings__Char_Char_Impl_.BACKSPACE = 8
hx_strings__Char_Char_Impl_.TAB = 9
hx_strings__Char_Char_Impl_.LF = 10
hx_strings__Char_Char_Impl_.CR = 13
hx_strings__Char_Char_Impl_.ESC = 27
hx_strings__Char_Char_Impl_.SPACE = 32
hx_strings__Char_Char_Impl_.EXCLAMATION_MARK = 33
hx_strings__Char_Char_Impl_.DOUBLE_QUOTE = 34
hx_strings__Char_Char_Impl_.HASH = 35
hx_strings__Char_Char_Impl_.DOLLAR = 36
hx_strings__Char_Char_Impl_.AMPERSAND = 38
hx_strings__Char_Char_Impl_.SINGLE_QUOTE = 39
hx_strings__Char_Char_Impl_.BRACKET_ROUND_LEFT = 40
hx_strings__Char_Char_Impl_.BRACKET_ROUND_RIGHT = 41
hx_strings__Char_Char_Impl_.ASTERISK = 42
hx_strings__Char_Char_Impl_.PLUS = 43
hx_strings__Char_Char_Impl_.COMMA = 44
hx_strings__Char_Char_Impl_.MINUS = 45
hx_strings__Char_Char_Impl_.DOT = 46
hx_strings__Char_Char_Impl_.SLASH = 47
hx_strings__Char_Char_Impl_.ZERO = 48
hx_strings__Char_Char_Impl_.ONE = 49
hx_strings__Char_Char_Impl_.TWO = 50
hx_strings__Char_Char_Impl_.TRHEE = 51
hx_strings__Char_Char_Impl_.FOUR = 52
hx_strings__Char_Char_Impl_.FIVE = 53
hx_strings__Char_Char_Impl_.SIX = 54
hx_strings__Char_Char_Impl_.SEVEN = 55
hx_strings__Char_Char_Impl_.EIGHT = 56
hx_strings__Char_Char_Impl_.NINE = 57
hx_strings__Char_Char_Impl_.COLON = 58
hx_strings__Char_Char_Impl_.SEMICOLON = 59
hx_strings__Char_Char_Impl_.LOWER_THAN = 60
hx_strings__Char_Char_Impl_.EQUALS = 61
hx_strings__Char_Char_Impl_.GREATER_THAN = 62
hx_strings__Char_Char_Impl_.QUESTION_MARK = 63
hx_strings__Char_Char_Impl_.BRACKET_SQUARE_LEFT = 91
hx_strings__Char_Char_Impl_.BACKSLASH = 92
hx_strings__Char_Char_Impl_.BRACKET_SQUARE_RIGHT = 93
hx_strings__Char_Char_Impl_.CARET = 94
hx_strings__Char_Char_Impl_.UNDERSCORE = 95
hx_strings__Char_Char_Impl_.BRACKET_CURLY_LEFT = 123
hx_strings__Char_Char_Impl_.PIPE = 124
hx_strings__Char_Char_Impl_.BRACKET_CURLY_RIGHT = 125
python_Boot.keywords = set(["and", "del", "from", "not", "with", "as", "elif", "global", "or", "yield", "assert", "else", "if", "pass", "None", "break", "except", "import", "raise", "True", "class", "exec", "in", "return", "False", "continue", "finally", "is", "try", "def", "for", "lambda", "while"])
python_Boot.prefixLength = len("_hx_")
hx_strings__CharIterator_NullCharIterator.INSTANCE = hx_strings__CharIterator_NullCharIterator()
hx_strings_Pattern.__meta__ = _hx_AnonObject({'obj': _hx_AnonObject({'immutable': None, 'threadSafe': None})})
hx_strings_Matcher.__meta__ = _hx_AnonObject({'obj': _hx_AnonObject({'notThreadSafe': None})})
def _hx_init_hx_strings_internal_OS_isWindows():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OS.hx:20
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OS.hx:26
        os = Sys.systemName()
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/internal/OS.hx:28
        _this = EReg("win","i")
        _this.matchObj = python_lib_Re.search(_this.pattern,os)
        return (_this.matchObj is not None)
    return _hx_local_0()
hx_strings_internal_OS.isWindows = _hx_init_hx_strings_internal_OS_isWindows()
def _hx_init_hx_strings_Strings_REGEX_ANSI_ESC():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:35
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:35
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile((HxOverrides.stringOrNull("".join(map(chr,[27]))) + "\\[[;\\d]*m"),this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_ANSI_ESC = _hx_init_hx_strings_Strings_REGEX_ANSI_ESC()
def _hx_init_hx_strings_Strings_REGEX_HTML_UNESCAPE():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:36
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:36
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile("&(#\\d+|amp|nbsp|apos|lt|gt|quot);",this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_HTML_UNESCAPE = _hx_init_hx_strings_Strings_REGEX_HTML_UNESCAPE()
def _hx_init_hx_strings_Strings_REGEX_SPLIT_LINES():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:37
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:37
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile("\\r?\\n",this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_SPLIT_LINES = _hx_init_hx_strings_Strings_REGEX_SPLIT_LINES()
def _hx_init_hx_strings_Strings_REGEX_REMOVE_XML_TAGS():
    # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:40
    def _hx_local_0():
        # C:\HaxeToolkit\haxe-strings/6,0,4/src/hx/strings/Strings.hx:40
        this1 = hx_strings_internal__Either3__Either3.b("g")
        return hx_strings_Pattern.compile("<[!a-zA-Z\\/][^>]*>",this1)
    return _hx_local_0()
hx_strings_Strings.REGEX_REMOVE_XML_TAGS = _hx_init_hx_strings_Strings_REGEX_REMOVE_XML_TAGS()
hx_strings_Strings.POS_NOT_FOUND = -1
hx_strings_Strings.NEW_LINE_NIX = "\n"
hx_strings_Strings.NEW_LINE_WIN = "\r\n"
hx_strings_Strings.NEW_LINE = ("\r\n" if (hx_strings_internal_OS.isWindows) else "\n")

Main.main()
