jaclang 0.5.10__py3-none-any.whl → 0.5.15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of jaclang might be problematic. Click here for more details.
- jaclang/cli/cli.py +20 -0
- jaclang/compiler/__init__.py +35 -19
- jaclang/compiler/absyntree.py +103 -95
- jaclang/compiler/generated/jac_parser.py +4069 -0
- jaclang/compiler/jac.lark +655 -0
- jaclang/compiler/parser.py +44 -31
- jaclang/compiler/passes/main/fuse_typeinfo_pass.py +92 -37
- jaclang/compiler/passes/main/import_pass.py +9 -5
- jaclang/compiler/passes/main/pyast_gen_pass.py +512 -352
- jaclang/compiler/passes/main/pyast_load_pass.py +271 -64
- jaclang/compiler/passes/main/registry_pass.py +3 -7
- jaclang/compiler/passes/main/tests/test_pyast_gen_pass.py +2 -0
- jaclang/compiler/passes/main/type_check_pass.py +4 -1
- jaclang/compiler/passes/tool/jac_formatter_pass.py +7 -0
- jaclang/compiler/passes/tool/tests/test_unparse_validate.py +16 -0
- jaclang/compiler/passes/utils/mypy_ast_build.py +93 -0
- jaclang/compiler/tests/test_importer.py +15 -0
- jaclang/core/aott.py +4 -3
- jaclang/core/construct.py +1 -1
- jaclang/core/importer.py +109 -51
- jaclang/core/llms.py +29 -0
- jaclang/core/registry.py +22 -0
- jaclang/core/utils.py +72 -0
- jaclang/plugin/default.py +118 -6
- jaclang/plugin/feature.py +29 -2
- jaclang/plugin/spec.py +25 -2
- jaclang/utils/helpers.py +7 -9
- jaclang/utils/lang_tools.py +37 -13
- jaclang/utils/test.py +1 -3
- jaclang/utils/tests/test_lang_tools.py +6 -0
- jaclang/vendor/lark/grammars/common.lark +59 -0
- jaclang/vendor/lark/grammars/lark.lark +62 -0
- jaclang/vendor/lark/grammars/python.lark +302 -0
- jaclang/vendor/lark/grammars/unicode.lark +7 -0
- {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/METADATA +1 -1
- {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/RECORD +40 -34
- jaclang/compiler/__jac_gen__/jac_parser.py +0 -4069
- /jaclang/compiler/{__jac_gen__ → generated}/__init__.py +0 -0
- {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/WHEEL +0 -0
- {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/entry_points.txt +0 -0
- {jaclang-0.5.10.dist-info → jaclang-0.5.15.dist-info}/top_level.txt +0 -0
|
@@ -1,4069 +0,0 @@
|
|
|
1
|
-
# The file was automatically generated by Lark v1.1.9
|
|
2
|
-
__version__ = "1.1.9"
|
|
3
|
-
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# Lark Stand-alone Generator Tool
|
|
7
|
-
# ----------------------------------
|
|
8
|
-
# Generates a stand-alone LALR(1) parser
|
|
9
|
-
#
|
|
10
|
-
# Git: https://github.com/erezsh/lark
|
|
11
|
-
# Author: Erez Shinan (erezshin@gmail.com)
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
# >>> LICENSE
|
|
15
|
-
#
|
|
16
|
-
# This tool and its generated code use a separate license from Lark,
|
|
17
|
-
# and are subject to the terms of the Mozilla Public License, v. 2.0.
|
|
18
|
-
# If a copy of the MPL was not distributed with this
|
|
19
|
-
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
20
|
-
#
|
|
21
|
-
# If you wish to purchase a commercial license for this tool and its
|
|
22
|
-
# generated code, you may contact me via email or otherwise.
|
|
23
|
-
#
|
|
24
|
-
# If MPL2 is incompatible with your free or open-source project,
|
|
25
|
-
# contact me and we'll work it out.
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
from copy import deepcopy
|
|
30
|
-
from abc import ABC, abstractmethod
|
|
31
|
-
from types import ModuleType
|
|
32
|
-
from typing import (
|
|
33
|
-
TypeVar,
|
|
34
|
-
Generic,
|
|
35
|
-
Type,
|
|
36
|
-
Tuple,
|
|
37
|
-
List,
|
|
38
|
-
Dict,
|
|
39
|
-
Iterator,
|
|
40
|
-
Collection,
|
|
41
|
-
Callable,
|
|
42
|
-
Optional,
|
|
43
|
-
FrozenSet,
|
|
44
|
-
Any,
|
|
45
|
-
Union,
|
|
46
|
-
Iterable,
|
|
47
|
-
IO,
|
|
48
|
-
TYPE_CHECKING,
|
|
49
|
-
overload,
|
|
50
|
-
Sequence,
|
|
51
|
-
Pattern as REPattern,
|
|
52
|
-
ClassVar,
|
|
53
|
-
Set,
|
|
54
|
-
Mapping,
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class LarkError(Exception):
|
|
61
|
-
pass
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class ConfigurationError(LarkError, ValueError):
|
|
65
|
-
pass
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def assert_config(value, options: Collection, msg="Got %r, expected one of %s"):
|
|
69
|
-
if value not in options:
|
|
70
|
-
raise ConfigurationError(msg % (value, options))
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
class GrammarError(LarkError):
|
|
74
|
-
pass
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class ParseError(LarkError):
|
|
78
|
-
pass
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class LexError(LarkError):
|
|
82
|
-
pass
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
T = TypeVar("T")
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class UnexpectedInput(LarkError):
|
|
89
|
-
#--
|
|
90
|
-
|
|
91
|
-
line: int
|
|
92
|
-
column: int
|
|
93
|
-
pos_in_stream = None
|
|
94
|
-
state: Any
|
|
95
|
-
_terminals_by_name = None
|
|
96
|
-
interactive_parser: "InteractiveParser"
|
|
97
|
-
|
|
98
|
-
def get_context(self, text: str, span: int = 40) -> str:
|
|
99
|
-
#--
|
|
100
|
-
assert self.pos_in_stream is not None, self
|
|
101
|
-
pos = self.pos_in_stream
|
|
102
|
-
start = max(pos - span, 0)
|
|
103
|
-
end = pos + span
|
|
104
|
-
if not isinstance(text, bytes):
|
|
105
|
-
before = text[start:pos].rsplit("\n", 1)[-1]
|
|
106
|
-
after = text[pos:end].split("\n", 1)[0]
|
|
107
|
-
return before + after + "\n" + " " * len(before.expandtabs()) + "^\n"
|
|
108
|
-
else:
|
|
109
|
-
before = text[start:pos].rsplit(b"\n", 1)[-1]
|
|
110
|
-
after = text[pos:end].split(b"\n", 1)[0]
|
|
111
|
-
return (
|
|
112
|
-
before + after + b"\n" + b" " * len(before.expandtabs()) + b"^\n"
|
|
113
|
-
).decode("ascii", "backslashreplace")
|
|
114
|
-
|
|
115
|
-
def match_examples(
|
|
116
|
-
self,
|
|
117
|
-
parse_fn: "Callable[[str], Tree]",
|
|
118
|
-
examples: Union[Mapping[T, Iterable[str]], Iterable[Tuple[T, Iterable[str]]]],
|
|
119
|
-
token_type_match_fallback: bool = False,
|
|
120
|
-
use_accepts: bool = True,
|
|
121
|
-
) -> Optional[T]:
|
|
122
|
-
#--
|
|
123
|
-
assert self.state is not None, "Not supported for this exception"
|
|
124
|
-
|
|
125
|
-
if isinstance(examples, Mapping):
|
|
126
|
-
examples = examples.items()
|
|
127
|
-
|
|
128
|
-
candidate = (None, False)
|
|
129
|
-
for i, (label, example) in enumerate(examples):
|
|
130
|
-
assert not isinstance(example, str), "Expecting a list"
|
|
131
|
-
|
|
132
|
-
for j, malformed in enumerate(example):
|
|
133
|
-
try:
|
|
134
|
-
parse_fn(malformed)
|
|
135
|
-
except UnexpectedInput as ut:
|
|
136
|
-
if ut.state == self.state:
|
|
137
|
-
if (
|
|
138
|
-
use_accepts
|
|
139
|
-
and isinstance(self, UnexpectedToken)
|
|
140
|
-
and isinstance(ut, UnexpectedToken)
|
|
141
|
-
and ut.accepts != self.accepts
|
|
142
|
-
):
|
|
143
|
-
logger.debug(
|
|
144
|
-
"Different accepts with same state[%d]: %s != %s at example [%s][%s]"
|
|
145
|
-
% (self.state, self.accepts, ut.accepts, i, j)
|
|
146
|
-
)
|
|
147
|
-
continue
|
|
148
|
-
if isinstance(
|
|
149
|
-
self, (UnexpectedToken, UnexpectedEOF)
|
|
150
|
-
) and isinstance(ut, (UnexpectedToken, UnexpectedEOF)):
|
|
151
|
-
if ut.token == self.token: ##
|
|
152
|
-
|
|
153
|
-
logger.debug("Exact Match at example [%s][%s]" % (i, j))
|
|
154
|
-
return label
|
|
155
|
-
|
|
156
|
-
if token_type_match_fallback:
|
|
157
|
-
##
|
|
158
|
-
|
|
159
|
-
if (ut.token.type == self.token.type) and not candidate[
|
|
160
|
-
-1
|
|
161
|
-
]:
|
|
162
|
-
logger.debug(
|
|
163
|
-
"Token Type Fallback at example [%s][%s]"
|
|
164
|
-
% (i, j)
|
|
165
|
-
)
|
|
166
|
-
candidate = label, True
|
|
167
|
-
|
|
168
|
-
if candidate[0] is None:
|
|
169
|
-
logger.debug(
|
|
170
|
-
"Same State match at example [%s][%s]" % (i, j)
|
|
171
|
-
)
|
|
172
|
-
candidate = label, False
|
|
173
|
-
|
|
174
|
-
return candidate[0]
|
|
175
|
-
|
|
176
|
-
def _format_expected(self, expected):
|
|
177
|
-
if self._terminals_by_name:
|
|
178
|
-
d = self._terminals_by_name
|
|
179
|
-
expected = [
|
|
180
|
-
d[t_name].user_repr() if t_name in d else t_name for t_name in expected
|
|
181
|
-
]
|
|
182
|
-
return "Expected one of: \n\t* %s\n" % "\n\t* ".join(expected)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
class UnexpectedEOF(ParseError, UnexpectedInput):
|
|
186
|
-
#--
|
|
187
|
-
|
|
188
|
-
expected: "List[Token]"
|
|
189
|
-
|
|
190
|
-
def __init__(self, expected, state=None, terminals_by_name=None):
|
|
191
|
-
super(UnexpectedEOF, self).__init__()
|
|
192
|
-
|
|
193
|
-
self.expected = expected
|
|
194
|
-
self.state = state
|
|
195
|
-
from .lexer import Token
|
|
196
|
-
|
|
197
|
-
self.token = Token("<EOF>", "") ##
|
|
198
|
-
|
|
199
|
-
self.pos_in_stream = -1
|
|
200
|
-
self.line = -1
|
|
201
|
-
self.column = -1
|
|
202
|
-
self._terminals_by_name = terminals_by_name
|
|
203
|
-
|
|
204
|
-
def __str__(self):
|
|
205
|
-
message = "Unexpected end-of-input. "
|
|
206
|
-
message += self._format_expected(self.expected)
|
|
207
|
-
return message
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
class UnexpectedCharacters(LexError, UnexpectedInput):
|
|
211
|
-
#--
|
|
212
|
-
|
|
213
|
-
allowed: Set[str]
|
|
214
|
-
considered_tokens: Set[Any]
|
|
215
|
-
|
|
216
|
-
def __init__(
|
|
217
|
-
self,
|
|
218
|
-
seq,
|
|
219
|
-
lex_pos,
|
|
220
|
-
line,
|
|
221
|
-
column,
|
|
222
|
-
allowed=None,
|
|
223
|
-
considered_tokens=None,
|
|
224
|
-
state=None,
|
|
225
|
-
token_history=None,
|
|
226
|
-
terminals_by_name=None,
|
|
227
|
-
considered_rules=None,
|
|
228
|
-
):
|
|
229
|
-
super(UnexpectedCharacters, self).__init__()
|
|
230
|
-
|
|
231
|
-
##
|
|
232
|
-
|
|
233
|
-
self.line = line
|
|
234
|
-
self.column = column
|
|
235
|
-
self.pos_in_stream = lex_pos
|
|
236
|
-
self.state = state
|
|
237
|
-
self._terminals_by_name = terminals_by_name
|
|
238
|
-
|
|
239
|
-
self.allowed = allowed
|
|
240
|
-
self.considered_tokens = considered_tokens
|
|
241
|
-
self.considered_rules = considered_rules
|
|
242
|
-
self.token_history = token_history
|
|
243
|
-
|
|
244
|
-
if isinstance(seq, bytes):
|
|
245
|
-
self.char = seq[lex_pos : lex_pos + 1].decode("ascii", "backslashreplace")
|
|
246
|
-
else:
|
|
247
|
-
self.char = seq[lex_pos]
|
|
248
|
-
self._context = self.get_context(seq)
|
|
249
|
-
|
|
250
|
-
def __str__(self):
|
|
251
|
-
message = (
|
|
252
|
-
"No terminal matches '%s' in the current parser context, at line %d col %d"
|
|
253
|
-
% (self.char, self.line, self.column)
|
|
254
|
-
)
|
|
255
|
-
message += "\n\n" + self._context
|
|
256
|
-
if self.allowed:
|
|
257
|
-
message += self._format_expected(self.allowed)
|
|
258
|
-
if self.token_history:
|
|
259
|
-
message += "\nPrevious tokens: %s\n" % ", ".join(
|
|
260
|
-
repr(t) for t in self.token_history
|
|
261
|
-
)
|
|
262
|
-
return message
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
class UnexpectedToken(ParseError, UnexpectedInput):
|
|
266
|
-
#--
|
|
267
|
-
|
|
268
|
-
expected: Set[str]
|
|
269
|
-
considered_rules: Set[str]
|
|
270
|
-
|
|
271
|
-
def __init__(
|
|
272
|
-
self,
|
|
273
|
-
token,
|
|
274
|
-
expected,
|
|
275
|
-
considered_rules=None,
|
|
276
|
-
state=None,
|
|
277
|
-
interactive_parser=None,
|
|
278
|
-
terminals_by_name=None,
|
|
279
|
-
token_history=None,
|
|
280
|
-
):
|
|
281
|
-
super(UnexpectedToken, self).__init__()
|
|
282
|
-
|
|
283
|
-
##
|
|
284
|
-
|
|
285
|
-
self.line = getattr(token, "line", "?")
|
|
286
|
-
self.column = getattr(token, "column", "?")
|
|
287
|
-
self.pos_in_stream = getattr(token, "start_pos", None)
|
|
288
|
-
self.state = state
|
|
289
|
-
|
|
290
|
-
self.token = token
|
|
291
|
-
self.expected = expected ##
|
|
292
|
-
|
|
293
|
-
self._accepts = NO_VALUE
|
|
294
|
-
self.considered_rules = considered_rules
|
|
295
|
-
self.interactive_parser = interactive_parser
|
|
296
|
-
self._terminals_by_name = terminals_by_name
|
|
297
|
-
self.token_history = token_history
|
|
298
|
-
|
|
299
|
-
@property
|
|
300
|
-
def accepts(self) -> Set[str]:
|
|
301
|
-
if self._accepts is NO_VALUE:
|
|
302
|
-
self._accepts = (
|
|
303
|
-
self.interactive_parser and self.interactive_parser.accepts()
|
|
304
|
-
)
|
|
305
|
-
return self._accepts
|
|
306
|
-
|
|
307
|
-
def __str__(self):
|
|
308
|
-
message = "Unexpected token %r at line %s, column %s.\n%s" % (
|
|
309
|
-
self.token,
|
|
310
|
-
self.line,
|
|
311
|
-
self.column,
|
|
312
|
-
self._format_expected(self.accepts or self.expected),
|
|
313
|
-
)
|
|
314
|
-
if self.token_history:
|
|
315
|
-
message += "Previous tokens: %r\n" % self.token_history
|
|
316
|
-
|
|
317
|
-
return message
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
class VisitError(LarkError):
|
|
321
|
-
#--
|
|
322
|
-
|
|
323
|
-
obj: "Union[Tree, Token]"
|
|
324
|
-
orig_exc: Exception
|
|
325
|
-
|
|
326
|
-
def __init__(self, rule, obj, orig_exc):
|
|
327
|
-
message = 'Error trying to process rule "%s":\n\n%s' % (rule, orig_exc)
|
|
328
|
-
super(VisitError, self).__init__(message)
|
|
329
|
-
|
|
330
|
-
self.rule = rule
|
|
331
|
-
self.obj = obj
|
|
332
|
-
self.orig_exc = orig_exc
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
class MissingVariableError(LarkError):
|
|
336
|
-
pass
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
import sys, re
|
|
341
|
-
import logging
|
|
342
|
-
|
|
343
|
-
logger: logging.Logger = logging.getLogger("lark")
|
|
344
|
-
logger.addHandler(logging.StreamHandler())
|
|
345
|
-
##
|
|
346
|
-
|
|
347
|
-
##
|
|
348
|
-
|
|
349
|
-
logger.setLevel(logging.CRITICAL)
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
NO_VALUE = object()
|
|
353
|
-
|
|
354
|
-
T = TypeVar("T")
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
def classify(
|
|
358
|
-
seq: Iterable, key: Optional[Callable] = None, value: Optional[Callable] = None
|
|
359
|
-
) -> Dict:
|
|
360
|
-
d: Dict[Any, Any] = {}
|
|
361
|
-
for item in seq:
|
|
362
|
-
k = key(item) if (key is not None) else item
|
|
363
|
-
v = value(item) if (value is not None) else item
|
|
364
|
-
try:
|
|
365
|
-
d[k].append(v)
|
|
366
|
-
except KeyError:
|
|
367
|
-
d[k] = [v]
|
|
368
|
-
return d
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
def _deserialize(data: Any, namespace: Dict[str, Any], memo: Dict) -> Any:
|
|
372
|
-
if isinstance(data, dict):
|
|
373
|
-
if "__type__" in data: ##
|
|
374
|
-
|
|
375
|
-
class_ = namespace[data["__type__"]]
|
|
376
|
-
return class_.deserialize(data, memo)
|
|
377
|
-
elif "@" in data:
|
|
378
|
-
return memo[data["@"]]
|
|
379
|
-
return {
|
|
380
|
-
key: _deserialize(value, namespace, memo) for key, value in data.items()
|
|
381
|
-
}
|
|
382
|
-
elif isinstance(data, list):
|
|
383
|
-
return [_deserialize(value, namespace, memo) for value in data]
|
|
384
|
-
return data
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
_T = TypeVar("_T", bound="Serialize")
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
class Serialize:
|
|
391
|
-
#--
|
|
392
|
-
|
|
393
|
-
def memo_serialize(self, types_to_memoize: List) -> Any:
|
|
394
|
-
memo = SerializeMemoizer(types_to_memoize)
|
|
395
|
-
return self.serialize(memo), memo.serialize()
|
|
396
|
-
|
|
397
|
-
def serialize(self, memo=None) -> Dict[str, Any]:
|
|
398
|
-
if memo and memo.in_types(self):
|
|
399
|
-
return {"@": memo.memoized.get(self)}
|
|
400
|
-
|
|
401
|
-
fields = getattr(self, "__serialize_fields__")
|
|
402
|
-
res = {f: _serialize(getattr(self, f), memo) for f in fields}
|
|
403
|
-
res["__type__"] = type(self).__name__
|
|
404
|
-
if hasattr(self, "_serialize"):
|
|
405
|
-
self._serialize(res, memo) ##
|
|
406
|
-
|
|
407
|
-
return res
|
|
408
|
-
|
|
409
|
-
@classmethod
|
|
410
|
-
def deserialize(cls: Type[_T], data: Dict[str, Any], memo: Dict[int, Any]) -> _T:
|
|
411
|
-
namespace = getattr(cls, "__serialize_namespace__", [])
|
|
412
|
-
namespace = {c.__name__: c for c in namespace}
|
|
413
|
-
|
|
414
|
-
fields = getattr(cls, "__serialize_fields__")
|
|
415
|
-
|
|
416
|
-
if "@" in data:
|
|
417
|
-
return memo[data["@"]]
|
|
418
|
-
|
|
419
|
-
inst = cls.__new__(cls)
|
|
420
|
-
for f in fields:
|
|
421
|
-
try:
|
|
422
|
-
setattr(inst, f, _deserialize(data[f], namespace, memo))
|
|
423
|
-
except KeyError as e:
|
|
424
|
-
raise KeyError("Cannot find key for class", cls, e)
|
|
425
|
-
|
|
426
|
-
if hasattr(inst, "_deserialize"):
|
|
427
|
-
inst._deserialize() ##
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
return inst
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
class SerializeMemoizer(Serialize):
|
|
434
|
-
#--
|
|
435
|
-
|
|
436
|
-
__serialize_fields__ = ("memoized",)
|
|
437
|
-
|
|
438
|
-
def __init__(self, types_to_memoize: List) -> None:
|
|
439
|
-
self.types_to_memoize = tuple(types_to_memoize)
|
|
440
|
-
self.memoized = Enumerator()
|
|
441
|
-
|
|
442
|
-
def in_types(self, value: Serialize) -> bool:
|
|
443
|
-
return isinstance(value, self.types_to_memoize)
|
|
444
|
-
|
|
445
|
-
def serialize(self) -> Dict[int, Any]: ##
|
|
446
|
-
|
|
447
|
-
return _serialize(self.memoized.reversed(), None)
|
|
448
|
-
|
|
449
|
-
@classmethod
|
|
450
|
-
def deserialize(cls, data: Dict[int, Any], namespace: Dict[str, Any], memo: Dict[Any, Any]) -> Dict[int, Any]: ##
|
|
451
|
-
|
|
452
|
-
return _deserialize(data, namespace, memo)
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
try:
|
|
456
|
-
import regex
|
|
457
|
-
|
|
458
|
-
_has_regex = True
|
|
459
|
-
except ImportError:
|
|
460
|
-
_has_regex = False
|
|
461
|
-
|
|
462
|
-
if sys.version_info >= (3, 11):
|
|
463
|
-
import re._parser as sre_parse
|
|
464
|
-
import re._constants as sre_constants
|
|
465
|
-
else:
|
|
466
|
-
import sre_parse
|
|
467
|
-
import sre_constants
|
|
468
|
-
|
|
469
|
-
categ_pattern = re.compile(r"\\p{[A-Za-z_]+}")
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
def get_regexp_width(expr: str) -> Union[Tuple[int, int], List[int]]:
|
|
473
|
-
if _has_regex:
|
|
474
|
-
##
|
|
475
|
-
|
|
476
|
-
##
|
|
477
|
-
|
|
478
|
-
##
|
|
479
|
-
|
|
480
|
-
regexp_final = re.sub(categ_pattern, "A", expr)
|
|
481
|
-
else:
|
|
482
|
-
if re.search(categ_pattern, expr):
|
|
483
|
-
raise ImportError(
|
|
484
|
-
"`regex` module must be installed in order to use Unicode categories.",
|
|
485
|
-
expr,
|
|
486
|
-
)
|
|
487
|
-
regexp_final = expr
|
|
488
|
-
try:
|
|
489
|
-
##
|
|
490
|
-
|
|
491
|
-
return [int(x) for x in sre_parse.parse(regexp_final).getwidth()] ##
|
|
492
|
-
|
|
493
|
-
except sre_constants.error:
|
|
494
|
-
if not _has_regex:
|
|
495
|
-
raise ValueError(expr)
|
|
496
|
-
else:
|
|
497
|
-
##
|
|
498
|
-
|
|
499
|
-
##
|
|
500
|
-
|
|
501
|
-
c = regex.compile(regexp_final)
|
|
502
|
-
##
|
|
503
|
-
|
|
504
|
-
##
|
|
505
|
-
|
|
506
|
-
MAXWIDTH = getattr(sre_parse, "MAXWIDTH", sre_constants.MAXREPEAT)
|
|
507
|
-
if c.match("") is None:
|
|
508
|
-
##
|
|
509
|
-
|
|
510
|
-
return 1, int(MAXWIDTH)
|
|
511
|
-
else:
|
|
512
|
-
return 0, int(MAXWIDTH)
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
from collections import OrderedDict
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
class Meta:
|
|
520
|
-
|
|
521
|
-
empty: bool
|
|
522
|
-
line: int
|
|
523
|
-
column: int
|
|
524
|
-
start_pos: int
|
|
525
|
-
end_line: int
|
|
526
|
-
end_column: int
|
|
527
|
-
end_pos: int
|
|
528
|
-
orig_expansion: "List[TerminalDef]"
|
|
529
|
-
match_tree: bool
|
|
530
|
-
|
|
531
|
-
def __init__(self):
|
|
532
|
-
self.empty = True
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
_Leaf_T = TypeVar("_Leaf_T")
|
|
536
|
-
Branch = Union[_Leaf_T, "Tree[_Leaf_T]"]
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
class Tree(Generic[_Leaf_T]):
|
|
540
|
-
#--
|
|
541
|
-
|
|
542
|
-
data: str
|
|
543
|
-
children: "List[Branch[_Leaf_T]]"
|
|
544
|
-
|
|
545
|
-
def __init__(
|
|
546
|
-
self, data: str, children: "List[Branch[_Leaf_T]]", meta: Optional[Meta] = None
|
|
547
|
-
) -> None:
|
|
548
|
-
self.data = data
|
|
549
|
-
self.children = children
|
|
550
|
-
self._meta = meta
|
|
551
|
-
|
|
552
|
-
@property
|
|
553
|
-
def meta(self) -> Meta:
|
|
554
|
-
if self._meta is None:
|
|
555
|
-
self._meta = Meta()
|
|
556
|
-
return self._meta
|
|
557
|
-
|
|
558
|
-
def __repr__(self):
|
|
559
|
-
return "Tree(%r, %r)" % (self.data, self.children)
|
|
560
|
-
|
|
561
|
-
def _pretty_label(self):
|
|
562
|
-
return self.data
|
|
563
|
-
|
|
564
|
-
def _pretty(self, level, indent_str):
|
|
565
|
-
yield f"{indent_str*level}{self._pretty_label()}"
|
|
566
|
-
if len(self.children) == 1 and not isinstance(self.children[0], Tree):
|
|
567
|
-
yield f"\t{self.children[0]}\n"
|
|
568
|
-
else:
|
|
569
|
-
yield "\n"
|
|
570
|
-
for n in self.children:
|
|
571
|
-
if isinstance(n, Tree):
|
|
572
|
-
yield from n._pretty(level + 1, indent_str)
|
|
573
|
-
else:
|
|
574
|
-
yield f"{indent_str*(level+1)}{n}\n"
|
|
575
|
-
|
|
576
|
-
def pretty(self, indent_str: str = " ") -> str:
|
|
577
|
-
#--
|
|
578
|
-
return "".join(self._pretty(0, indent_str))
|
|
579
|
-
|
|
580
|
-
def __rich__(self, parent: Optional["rich.tree.Tree"] = None) -> "rich.tree.Tree":
|
|
581
|
-
#--
|
|
582
|
-
return self._rich(parent)
|
|
583
|
-
|
|
584
|
-
def _rich(self, parent):
|
|
585
|
-
if parent:
|
|
586
|
-
tree = parent.add(f"[bold]{self.data}[/bold]")
|
|
587
|
-
else:
|
|
588
|
-
import rich.tree
|
|
589
|
-
|
|
590
|
-
tree = rich.tree.Tree(self.data)
|
|
591
|
-
|
|
592
|
-
for c in self.children:
|
|
593
|
-
if isinstance(c, Tree):
|
|
594
|
-
c._rich(tree)
|
|
595
|
-
else:
|
|
596
|
-
tree.add(f"[green]{c}[/green]")
|
|
597
|
-
|
|
598
|
-
return tree
|
|
599
|
-
|
|
600
|
-
def __eq__(self, other):
|
|
601
|
-
try:
|
|
602
|
-
return self.data == other.data and self.children == other.children
|
|
603
|
-
except AttributeError:
|
|
604
|
-
return False
|
|
605
|
-
|
|
606
|
-
def __ne__(self, other):
|
|
607
|
-
return not (self == other)
|
|
608
|
-
|
|
609
|
-
def __hash__(self) -> int:
|
|
610
|
-
return hash((self.data, tuple(self.children)))
|
|
611
|
-
|
|
612
|
-
def iter_subtrees(self) -> "Iterator[Tree[_Leaf_T]]":
|
|
613
|
-
#--
|
|
614
|
-
queue = [self]
|
|
615
|
-
subtrees = OrderedDict()
|
|
616
|
-
for subtree in queue:
|
|
617
|
-
subtrees[id(subtree)] = subtree
|
|
618
|
-
##
|
|
619
|
-
|
|
620
|
-
queue += [
|
|
621
|
-
c
|
|
622
|
-
for c in reversed(subtree.children) ##
|
|
623
|
-
|
|
624
|
-
if isinstance(c, Tree) and id(c) not in subtrees
|
|
625
|
-
]
|
|
626
|
-
|
|
627
|
-
del queue
|
|
628
|
-
return reversed(list(subtrees.values()))
|
|
629
|
-
|
|
630
|
-
def iter_subtrees_topdown(self):
|
|
631
|
-
#--
|
|
632
|
-
stack = [self]
|
|
633
|
-
stack_append = stack.append
|
|
634
|
-
stack_pop = stack.pop
|
|
635
|
-
while stack:
|
|
636
|
-
node = stack_pop()
|
|
637
|
-
if not isinstance(node, Tree):
|
|
638
|
-
continue
|
|
639
|
-
yield node
|
|
640
|
-
for child in reversed(node.children):
|
|
641
|
-
stack_append(child)
|
|
642
|
-
|
|
643
|
-
def find_pred(
|
|
644
|
-
self, pred: "Callable[[Tree[_Leaf_T]], bool]"
|
|
645
|
-
) -> "Iterator[Tree[_Leaf_T]]":
|
|
646
|
-
#--
|
|
647
|
-
return filter(pred, self.iter_subtrees())
|
|
648
|
-
|
|
649
|
-
def find_data(self, data: str) -> "Iterator[Tree[_Leaf_T]]":
|
|
650
|
-
#--
|
|
651
|
-
return self.find_pred(lambda t: t.data == data)
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
from functools import wraps, update_wrapper
|
|
655
|
-
from inspect import getmembers, getmro
|
|
656
|
-
|
|
657
|
-
_Return_T = TypeVar("_Return_T")
|
|
658
|
-
_Return_V = TypeVar("_Return_V")
|
|
659
|
-
_Leaf_T = TypeVar("_Leaf_T")
|
|
660
|
-
_Leaf_U = TypeVar("_Leaf_U")
|
|
661
|
-
_R = TypeVar("_R")
|
|
662
|
-
_FUNC = Callable[..., _Return_T]
|
|
663
|
-
_DECORATED = Union[_FUNC, type]
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
class _DiscardType:
|
|
667
|
-
#--
|
|
668
|
-
|
|
669
|
-
def __repr__(self):
|
|
670
|
-
return "lark.visitors.Discard"
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
Discard = _DiscardType()
|
|
674
|
-
|
|
675
|
-
##
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
class _Decoratable:
|
|
680
|
-
#--
|
|
681
|
-
|
|
682
|
-
@classmethod
|
|
683
|
-
def _apply_v_args(cls, visit_wrapper):
|
|
684
|
-
mro = getmro(cls)
|
|
685
|
-
assert mro[0] is cls
|
|
686
|
-
libmembers = {name for _cls in mro[1:] for name, _ in getmembers(_cls)}
|
|
687
|
-
for name, value in getmembers(cls):
|
|
688
|
-
|
|
689
|
-
##
|
|
690
|
-
|
|
691
|
-
if name.startswith("_") or (
|
|
692
|
-
name in libmembers and name not in cls.__dict__
|
|
693
|
-
):
|
|
694
|
-
continue
|
|
695
|
-
if not callable(value):
|
|
696
|
-
continue
|
|
697
|
-
|
|
698
|
-
##
|
|
699
|
-
|
|
700
|
-
if isinstance(cls.__dict__[name], _VArgsWrapper):
|
|
701
|
-
continue
|
|
702
|
-
|
|
703
|
-
setattr(cls, name, _VArgsWrapper(cls.__dict__[name], visit_wrapper))
|
|
704
|
-
return cls
|
|
705
|
-
|
|
706
|
-
def __class_getitem__(cls, _):
|
|
707
|
-
return cls
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
class Transformer(_Decoratable, ABC, Generic[_Leaf_T, _Return_T]):
|
|
711
|
-
#--
|
|
712
|
-
|
|
713
|
-
__visit_tokens__ = True ##
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
def __init__(self, visit_tokens: bool = True) -> None:
|
|
717
|
-
self.__visit_tokens__ = visit_tokens
|
|
718
|
-
|
|
719
|
-
def _call_userfunc(self, tree, new_children=None):
|
|
720
|
-
##
|
|
721
|
-
|
|
722
|
-
children = new_children if new_children is not None else tree.children
|
|
723
|
-
try:
|
|
724
|
-
f = getattr(self, tree.data)
|
|
725
|
-
except AttributeError:
|
|
726
|
-
return self.__default__(tree.data, children, tree.meta)
|
|
727
|
-
else:
|
|
728
|
-
try:
|
|
729
|
-
wrapper = getattr(f, "visit_wrapper", None)
|
|
730
|
-
if wrapper is not None:
|
|
731
|
-
return f.visit_wrapper(f, tree.data, children, tree.meta)
|
|
732
|
-
else:
|
|
733
|
-
return f(children)
|
|
734
|
-
except GrammarError:
|
|
735
|
-
raise
|
|
736
|
-
except Exception as e:
|
|
737
|
-
raise VisitError(tree.data, tree, e)
|
|
738
|
-
|
|
739
|
-
def _call_userfunc_token(self, token):
|
|
740
|
-
try:
|
|
741
|
-
f = getattr(self, token.type)
|
|
742
|
-
except AttributeError:
|
|
743
|
-
return self.__default_token__(token)
|
|
744
|
-
else:
|
|
745
|
-
try:
|
|
746
|
-
return f(token)
|
|
747
|
-
except GrammarError:
|
|
748
|
-
raise
|
|
749
|
-
except Exception as e:
|
|
750
|
-
raise VisitError(token.type, token, e)
|
|
751
|
-
|
|
752
|
-
def _transform_children(self, children):
|
|
753
|
-
for c in children:
|
|
754
|
-
if isinstance(c, Tree):
|
|
755
|
-
res = self._transform_tree(c)
|
|
756
|
-
elif self.__visit_tokens__ and isinstance(c, Token):
|
|
757
|
-
res = self._call_userfunc_token(c)
|
|
758
|
-
else:
|
|
759
|
-
res = c
|
|
760
|
-
|
|
761
|
-
if res is not Discard:
|
|
762
|
-
yield res
|
|
763
|
-
|
|
764
|
-
def _transform_tree(self, tree):
|
|
765
|
-
children = list(self._transform_children(tree.children))
|
|
766
|
-
return self._call_userfunc(tree, children)
|
|
767
|
-
|
|
768
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
769
|
-
#--
|
|
770
|
-
return self._transform_tree(tree)
|
|
771
|
-
|
|
772
|
-
def __mul__(
|
|
773
|
-
self: "Transformer[_Leaf_T, Tree[_Leaf_U]]",
|
|
774
|
-
other: "Union[Transformer[_Leaf_U, _Return_V], TransformerChain[_Leaf_U, _Return_V,]]",
|
|
775
|
-
) -> "TransformerChain[_Leaf_T, _Return_V]":
|
|
776
|
-
#--
|
|
777
|
-
return TransformerChain(self, other)
|
|
778
|
-
|
|
779
|
-
def __default__(self, data, children, meta):
|
|
780
|
-
#--
|
|
781
|
-
return Tree(data, children, meta)
|
|
782
|
-
|
|
783
|
-
def __default_token__(self, token):
|
|
784
|
-
#--
|
|
785
|
-
return token
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
def merge_transformers(base_transformer=None, **transformers_to_merge):
|
|
789
|
-
#--
|
|
790
|
-
if base_transformer is None:
|
|
791
|
-
base_transformer = Transformer()
|
|
792
|
-
for prefix, transformer in transformers_to_merge.items():
|
|
793
|
-
for method_name in dir(transformer):
|
|
794
|
-
method = getattr(transformer, method_name)
|
|
795
|
-
if not callable(method):
|
|
796
|
-
continue
|
|
797
|
-
if method_name.startswith("_") or method_name == "transform":
|
|
798
|
-
continue
|
|
799
|
-
prefixed_method = prefix + "__" + method_name
|
|
800
|
-
if hasattr(base_transformer, prefixed_method):
|
|
801
|
-
raise AttributeError(
|
|
802
|
-
"Cannot merge: method '%s' appears more than once" % prefixed_method
|
|
803
|
-
)
|
|
804
|
-
|
|
805
|
-
setattr(base_transformer, prefixed_method, method)
|
|
806
|
-
|
|
807
|
-
return base_transformer
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
class InlineTransformer(Transformer): ##
|
|
811
|
-
|
|
812
|
-
def _call_userfunc(self, tree, new_children=None):
|
|
813
|
-
##
|
|
814
|
-
|
|
815
|
-
children = new_children if new_children is not None else tree.children
|
|
816
|
-
try:
|
|
817
|
-
f = getattr(self, tree.data)
|
|
818
|
-
except AttributeError:
|
|
819
|
-
return self.__default__(tree.data, children, tree.meta)
|
|
820
|
-
else:
|
|
821
|
-
return f(*children)
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
class TransformerChain(Generic[_Leaf_T, _Return_T]):
|
|
825
|
-
|
|
826
|
-
transformers: "Tuple[Union[Transformer, TransformerChain], ...]"
|
|
827
|
-
|
|
828
|
-
def __init__(self, *transformers: "Union[Transformer, TransformerChain]") -> None:
|
|
829
|
-
self.transformers = transformers
|
|
830
|
-
|
|
831
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
832
|
-
for t in self.transformers:
|
|
833
|
-
tree = t.transform(tree)
|
|
834
|
-
return cast(_Return_T, tree)
|
|
835
|
-
|
|
836
|
-
def __mul__(
|
|
837
|
-
self: "TransformerChain[_Leaf_T, Tree[_Leaf_U]]",
|
|
838
|
-
other: "Union[Transformer[_Leaf_U, _Return_V], TransformerChain[_Leaf_U, _Return_V]]",
|
|
839
|
-
) -> "TransformerChain[_Leaf_T, _Return_V]":
|
|
840
|
-
return TransformerChain(*self.transformers + (other,))
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
class Transformer_InPlace(Transformer[_Leaf_T, _Return_T]):
|
|
844
|
-
#--
|
|
845
|
-
|
|
846
|
-
def _transform_tree(self, tree): ##
|
|
847
|
-
|
|
848
|
-
return self._call_userfunc(tree)
|
|
849
|
-
|
|
850
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
851
|
-
for subtree in tree.iter_subtrees():
|
|
852
|
-
subtree.children = list(self._transform_children(subtree.children))
|
|
853
|
-
|
|
854
|
-
return self._transform_tree(tree)
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
class Transformer_NonRecursive(Transformer[_Leaf_T, _Return_T]):
|
|
858
|
-
#--
|
|
859
|
-
|
|
860
|
-
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
861
|
-
##
|
|
862
|
-
|
|
863
|
-
rev_postfix = []
|
|
864
|
-
q: List[Branch[_Leaf_T]] = [tree]
|
|
865
|
-
while q:
|
|
866
|
-
t = q.pop()
|
|
867
|
-
rev_postfix.append(t)
|
|
868
|
-
if isinstance(t, Tree):
|
|
869
|
-
q += t.children
|
|
870
|
-
|
|
871
|
-
##
|
|
872
|
-
|
|
873
|
-
stack: List = []
|
|
874
|
-
for x in reversed(rev_postfix):
|
|
875
|
-
if isinstance(x, Tree):
|
|
876
|
-
size = len(x.children)
|
|
877
|
-
if size:
|
|
878
|
-
args = stack[-size:]
|
|
879
|
-
del stack[-size:]
|
|
880
|
-
else:
|
|
881
|
-
args = []
|
|
882
|
-
|
|
883
|
-
res = self._call_userfunc(x, args)
|
|
884
|
-
if res is not Discard:
|
|
885
|
-
stack.append(res)
|
|
886
|
-
|
|
887
|
-
elif self.__visit_tokens__ and isinstance(x, Token):
|
|
888
|
-
res = self._call_userfunc_token(x)
|
|
889
|
-
if res is not Discard:
|
|
890
|
-
stack.append(res)
|
|
891
|
-
else:
|
|
892
|
-
stack.append(x)
|
|
893
|
-
|
|
894
|
-
(result,) = stack ##
|
|
895
|
-
|
|
896
|
-
##
|
|
897
|
-
|
|
898
|
-
##
|
|
899
|
-
|
|
900
|
-
##
|
|
901
|
-
|
|
902
|
-
return cast(_Return_T, result)
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
class Transformer_InPlaceRecursive(Transformer):
|
|
906
|
-
#--
|
|
907
|
-
|
|
908
|
-
def _transform_tree(self, tree):
|
|
909
|
-
tree.children = list(self._transform_children(tree.children))
|
|
910
|
-
return self._call_userfunc(tree)
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
##
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
class VisitorBase:
|
|
918
|
-
def _call_userfunc(self, tree):
|
|
919
|
-
return getattr(self, tree.data, self.__default__)(tree)
|
|
920
|
-
|
|
921
|
-
def __default__(self, tree):
|
|
922
|
-
#--
|
|
923
|
-
return tree
|
|
924
|
-
|
|
925
|
-
def __class_getitem__(cls, _):
|
|
926
|
-
return cls
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
class Visitor(VisitorBase, ABC, Generic[_Leaf_T]):
|
|
930
|
-
#--
|
|
931
|
-
|
|
932
|
-
def visit(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
933
|
-
#--
|
|
934
|
-
for subtree in tree.iter_subtrees():
|
|
935
|
-
self._call_userfunc(subtree)
|
|
936
|
-
return tree
|
|
937
|
-
|
|
938
|
-
def visit_topdown(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
939
|
-
#--
|
|
940
|
-
for subtree in tree.iter_subtrees_topdown():
|
|
941
|
-
self._call_userfunc(subtree)
|
|
942
|
-
return tree
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
class Visitor_Recursive(VisitorBase, Generic[_Leaf_T]):
|
|
946
|
-
#--
|
|
947
|
-
|
|
948
|
-
def visit(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
949
|
-
#--
|
|
950
|
-
for child in tree.children:
|
|
951
|
-
if isinstance(child, Tree):
|
|
952
|
-
self.visit(child)
|
|
953
|
-
|
|
954
|
-
self._call_userfunc(tree)
|
|
955
|
-
return tree
|
|
956
|
-
|
|
957
|
-
def visit_topdown(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
958
|
-
#--
|
|
959
|
-
self._call_userfunc(tree)
|
|
960
|
-
|
|
961
|
-
for child in tree.children:
|
|
962
|
-
if isinstance(child, Tree):
|
|
963
|
-
self.visit_topdown(child)
|
|
964
|
-
|
|
965
|
-
return tree
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
class Interpreter(_Decoratable, ABC, Generic[_Leaf_T, _Return_T]):
|
|
969
|
-
#--
|
|
970
|
-
|
|
971
|
-
def visit(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
972
|
-
##
|
|
973
|
-
|
|
974
|
-
##
|
|
975
|
-
|
|
976
|
-
##
|
|
977
|
-
|
|
978
|
-
return self._visit_tree(tree)
|
|
979
|
-
|
|
980
|
-
def _visit_tree(self, tree: Tree[_Leaf_T]):
|
|
981
|
-
f = getattr(self, tree.data)
|
|
982
|
-
wrapper = getattr(f, "visit_wrapper", None)
|
|
983
|
-
if wrapper is not None:
|
|
984
|
-
return f.visit_wrapper(f, tree.data, tree.children, tree.meta)
|
|
985
|
-
else:
|
|
986
|
-
return f(tree)
|
|
987
|
-
|
|
988
|
-
def visit_children(self, tree: Tree[_Leaf_T]) -> List:
|
|
989
|
-
return [
|
|
990
|
-
self._visit_tree(child) if isinstance(child, Tree) else child
|
|
991
|
-
for child in tree.children
|
|
992
|
-
]
|
|
993
|
-
|
|
994
|
-
def __getattr__(self, name):
|
|
995
|
-
return self.__default__
|
|
996
|
-
|
|
997
|
-
def __default__(self, tree):
|
|
998
|
-
return self.visit_children(tree)
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
_InterMethod = Callable[[Type[Interpreter], _Return_T], _R]
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
def visit_children_decor(func: _InterMethod) -> _InterMethod:
|
|
1005
|
-
#--
|
|
1006
|
-
|
|
1007
|
-
@wraps(func)
|
|
1008
|
-
def inner(cls, tree):
|
|
1009
|
-
values = cls.visit_children(tree)
|
|
1010
|
-
return func(cls, values)
|
|
1011
|
-
|
|
1012
|
-
return inner
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
##
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
def _apply_v_args(obj, visit_wrapper):
|
|
1020
|
-
try:
|
|
1021
|
-
_apply = obj._apply_v_args
|
|
1022
|
-
except AttributeError:
|
|
1023
|
-
return _VArgsWrapper(obj, visit_wrapper)
|
|
1024
|
-
else:
|
|
1025
|
-
return _apply(visit_wrapper)
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
class _VArgsWrapper:
|
|
1029
|
-
#--
|
|
1030
|
-
|
|
1031
|
-
base_func: Callable
|
|
1032
|
-
|
|
1033
|
-
def __init__(
|
|
1034
|
-
self, func: Callable, visit_wrapper: Callable[[Callable, str, list, Any], Any]
|
|
1035
|
-
):
|
|
1036
|
-
if isinstance(func, _VArgsWrapper):
|
|
1037
|
-
func = func.base_func
|
|
1038
|
-
##
|
|
1039
|
-
|
|
1040
|
-
self.base_func = func ##
|
|
1041
|
-
|
|
1042
|
-
self.visit_wrapper = visit_wrapper
|
|
1043
|
-
update_wrapper(self, func)
|
|
1044
|
-
|
|
1045
|
-
def __call__(self, *args, **kwargs):
|
|
1046
|
-
return self.base_func(*args, **kwargs)
|
|
1047
|
-
|
|
1048
|
-
def __get__(self, instance, owner=None):
|
|
1049
|
-
try:
|
|
1050
|
-
##
|
|
1051
|
-
|
|
1052
|
-
##
|
|
1053
|
-
|
|
1054
|
-
g = type(self.base_func).__get__
|
|
1055
|
-
except AttributeError:
|
|
1056
|
-
return self
|
|
1057
|
-
else:
|
|
1058
|
-
return _VArgsWrapper(g(self.base_func, instance, owner), self.visit_wrapper)
|
|
1059
|
-
|
|
1060
|
-
def __set_name__(self, owner, name):
|
|
1061
|
-
try:
|
|
1062
|
-
f = type(self.base_func).__set_name__
|
|
1063
|
-
except AttributeError:
|
|
1064
|
-
return
|
|
1065
|
-
else:
|
|
1066
|
-
f(self.base_func, owner, name)
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
def _vargs_inline(f, _data, children, _meta):
|
|
1070
|
-
return f(*children)
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
def _vargs_meta_inline(f, _data, children, meta):
|
|
1074
|
-
return f(meta, *children)
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
def _vargs_meta(f, _data, children, meta):
|
|
1078
|
-
return f(meta, children)
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
def _vargs_tree(f, data, children, meta):
|
|
1082
|
-
return f(Tree(data, children, meta))
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
def v_args(
|
|
1086
|
-
inline: bool = False,
|
|
1087
|
-
meta: bool = False,
|
|
1088
|
-
tree: bool = False,
|
|
1089
|
-
wrapper: Optional[Callable] = None,
|
|
1090
|
-
) -> Callable[[_DECORATED], _DECORATED]:
|
|
1091
|
-
#--
|
|
1092
|
-
if tree and (meta or inline):
|
|
1093
|
-
raise ValueError(
|
|
1094
|
-
"Visitor functions cannot combine 'tree' with 'meta' or 'inline'."
|
|
1095
|
-
)
|
|
1096
|
-
|
|
1097
|
-
func = None
|
|
1098
|
-
if meta:
|
|
1099
|
-
if inline:
|
|
1100
|
-
func = _vargs_meta_inline
|
|
1101
|
-
else:
|
|
1102
|
-
func = _vargs_meta
|
|
1103
|
-
elif inline:
|
|
1104
|
-
func = _vargs_inline
|
|
1105
|
-
elif tree:
|
|
1106
|
-
func = _vargs_tree
|
|
1107
|
-
|
|
1108
|
-
if wrapper is not None:
|
|
1109
|
-
if func is not None:
|
|
1110
|
-
raise ValueError(
|
|
1111
|
-
"Cannot use 'wrapper' along with 'tree', 'meta' or 'inline'."
|
|
1112
|
-
)
|
|
1113
|
-
func = wrapper
|
|
1114
|
-
|
|
1115
|
-
def _visitor_args_dec(obj):
|
|
1116
|
-
return _apply_v_args(obj, func)
|
|
1117
|
-
|
|
1118
|
-
return _visitor_args_dec
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
TOKEN_DEFAULT_PRIORITY = 0
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
class Symbol(Serialize):
|
|
1126
|
-
__slots__ = ("name",)
|
|
1127
|
-
|
|
1128
|
-
name: str
|
|
1129
|
-
is_term: ClassVar[bool] = NotImplemented
|
|
1130
|
-
|
|
1131
|
-
def __init__(self, name: str) -> None:
|
|
1132
|
-
self.name = name
|
|
1133
|
-
|
|
1134
|
-
def __eq__(self, other):
|
|
1135
|
-
assert isinstance(other, Symbol), other
|
|
1136
|
-
return self.is_term == other.is_term and self.name == other.name
|
|
1137
|
-
|
|
1138
|
-
def __ne__(self, other):
|
|
1139
|
-
return not (self == other)
|
|
1140
|
-
|
|
1141
|
-
def __hash__(self):
|
|
1142
|
-
return hash(self.name)
|
|
1143
|
-
|
|
1144
|
-
def __repr__(self):
|
|
1145
|
-
return "%s(%r)" % (type(self).__name__, self.name)
|
|
1146
|
-
|
|
1147
|
-
fullrepr = property(__repr__)
|
|
1148
|
-
|
|
1149
|
-
def renamed(self, f):
|
|
1150
|
-
return type(self)(f(self.name))
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
class Terminal(Symbol):
|
|
1154
|
-
__serialize_fields__ = "name", "filter_out"
|
|
1155
|
-
|
|
1156
|
-
is_term: ClassVar[bool] = True
|
|
1157
|
-
|
|
1158
|
-
def __init__(self, name, filter_out=False):
|
|
1159
|
-
self.name = name
|
|
1160
|
-
self.filter_out = filter_out
|
|
1161
|
-
|
|
1162
|
-
@property
|
|
1163
|
-
def fullrepr(self):
|
|
1164
|
-
return "%s(%r, %r)" % (type(self).__name__, self.name, self.filter_out)
|
|
1165
|
-
|
|
1166
|
-
def renamed(self, f):
|
|
1167
|
-
return type(self)(f(self.name), self.filter_out)
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
class NonTerminal(Symbol):
|
|
1171
|
-
__serialize_fields__ = ("name",)
|
|
1172
|
-
|
|
1173
|
-
is_term: ClassVar[bool] = False
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
class RuleOptions(Serialize):
|
|
1177
|
-
__serialize_fields__ = (
|
|
1178
|
-
"keep_all_tokens",
|
|
1179
|
-
"expand1",
|
|
1180
|
-
"priority",
|
|
1181
|
-
"template_source",
|
|
1182
|
-
"empty_indices",
|
|
1183
|
-
)
|
|
1184
|
-
|
|
1185
|
-
keep_all_tokens: bool
|
|
1186
|
-
expand1: bool
|
|
1187
|
-
priority: Optional[int]
|
|
1188
|
-
template_source: Optional[str]
|
|
1189
|
-
empty_indices: Tuple[bool, ...]
|
|
1190
|
-
|
|
1191
|
-
def __init__(
|
|
1192
|
-
self,
|
|
1193
|
-
keep_all_tokens: bool = False,
|
|
1194
|
-
expand1: bool = False,
|
|
1195
|
-
priority: Optional[int] = None,
|
|
1196
|
-
template_source: Optional[str] = None,
|
|
1197
|
-
empty_indices: Tuple[bool, ...] = (),
|
|
1198
|
-
) -> None:
|
|
1199
|
-
self.keep_all_tokens = keep_all_tokens
|
|
1200
|
-
self.expand1 = expand1
|
|
1201
|
-
self.priority = priority
|
|
1202
|
-
self.template_source = template_source
|
|
1203
|
-
self.empty_indices = empty_indices
|
|
1204
|
-
|
|
1205
|
-
def __repr__(self):
|
|
1206
|
-
return "RuleOptions(%r, %r, %r, %r)" % (
|
|
1207
|
-
self.keep_all_tokens,
|
|
1208
|
-
self.expand1,
|
|
1209
|
-
self.priority,
|
|
1210
|
-
self.template_source,
|
|
1211
|
-
)
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
class Rule(Serialize):
|
|
1215
|
-
#--
|
|
1216
|
-
|
|
1217
|
-
__slots__ = ("origin", "expansion", "alias", "options", "order", "_hash")
|
|
1218
|
-
|
|
1219
|
-
__serialize_fields__ = "origin", "expansion", "order", "alias", "options"
|
|
1220
|
-
__serialize_namespace__ = Terminal, NonTerminal, RuleOptions
|
|
1221
|
-
|
|
1222
|
-
origin: NonTerminal
|
|
1223
|
-
expansion: Sequence[Symbol]
|
|
1224
|
-
order: int
|
|
1225
|
-
alias: Optional[str]
|
|
1226
|
-
options: RuleOptions
|
|
1227
|
-
_hash: int
|
|
1228
|
-
|
|
1229
|
-
def __init__(
|
|
1230
|
-
self,
|
|
1231
|
-
origin: NonTerminal,
|
|
1232
|
-
expansion: Sequence[Symbol],
|
|
1233
|
-
order: int = 0,
|
|
1234
|
-
alias: Optional[str] = None,
|
|
1235
|
-
options: Optional[RuleOptions] = None,
|
|
1236
|
-
):
|
|
1237
|
-
self.origin = origin
|
|
1238
|
-
self.expansion = expansion
|
|
1239
|
-
self.alias = alias
|
|
1240
|
-
self.order = order
|
|
1241
|
-
self.options = options or RuleOptions()
|
|
1242
|
-
self._hash = hash((self.origin, tuple(self.expansion)))
|
|
1243
|
-
|
|
1244
|
-
def _deserialize(self):
|
|
1245
|
-
self._hash = hash((self.origin, tuple(self.expansion)))
|
|
1246
|
-
|
|
1247
|
-
def __str__(self):
|
|
1248
|
-
return "<%s : %s>" % (
|
|
1249
|
-
self.origin.name,
|
|
1250
|
-
" ".join(x.name for x in self.expansion),
|
|
1251
|
-
)
|
|
1252
|
-
|
|
1253
|
-
def __repr__(self):
|
|
1254
|
-
return "Rule(%r, %r, %r, %r)" % (
|
|
1255
|
-
self.origin,
|
|
1256
|
-
self.expansion,
|
|
1257
|
-
self.alias,
|
|
1258
|
-
self.options,
|
|
1259
|
-
)
|
|
1260
|
-
|
|
1261
|
-
def __hash__(self):
|
|
1262
|
-
return self._hash
|
|
1263
|
-
|
|
1264
|
-
def __eq__(self, other):
|
|
1265
|
-
if not isinstance(other, Rule):
|
|
1266
|
-
return False
|
|
1267
|
-
return self.origin == other.origin and self.expansion == other.expansion
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
from copy import copy
|
|
1272
|
-
|
|
1273
|
-
try: ##
|
|
1274
|
-
|
|
1275
|
-
has_interegular = bool(interegular)
|
|
1276
|
-
except NameError:
|
|
1277
|
-
has_interegular = False
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
class Pattern(Serialize, ABC):
|
|
1281
|
-
#--
|
|
1282
|
-
|
|
1283
|
-
value: str
|
|
1284
|
-
flags: Collection[str]
|
|
1285
|
-
raw: Optional[str]
|
|
1286
|
-
type: ClassVar[str]
|
|
1287
|
-
|
|
1288
|
-
def __init__(
|
|
1289
|
-
self, value: str, flags: Collection[str] = (), raw: Optional[str] = None
|
|
1290
|
-
) -> None:
|
|
1291
|
-
self.value = value
|
|
1292
|
-
self.flags = frozenset(flags)
|
|
1293
|
-
self.raw = raw
|
|
1294
|
-
|
|
1295
|
-
def __repr__(self):
|
|
1296
|
-
return repr(self.to_regexp())
|
|
1297
|
-
|
|
1298
|
-
##
|
|
1299
|
-
|
|
1300
|
-
def __hash__(self):
|
|
1301
|
-
return hash((type(self), self.value, self.flags))
|
|
1302
|
-
|
|
1303
|
-
def __eq__(self, other):
|
|
1304
|
-
return (
|
|
1305
|
-
type(self) == type(other)
|
|
1306
|
-
and self.value == other.value
|
|
1307
|
-
and self.flags == other.flags
|
|
1308
|
-
)
|
|
1309
|
-
|
|
1310
|
-
@abstractmethod
|
|
1311
|
-
def to_regexp(self) -> str:
|
|
1312
|
-
raise NotImplementedError()
|
|
1313
|
-
|
|
1314
|
-
@property
|
|
1315
|
-
@abstractmethod
|
|
1316
|
-
def min_width(self) -> int:
|
|
1317
|
-
raise NotImplementedError()
|
|
1318
|
-
|
|
1319
|
-
@property
|
|
1320
|
-
@abstractmethod
|
|
1321
|
-
def max_width(self) -> int:
|
|
1322
|
-
raise NotImplementedError()
|
|
1323
|
-
|
|
1324
|
-
def _get_flags(self, value):
|
|
1325
|
-
for f in self.flags:
|
|
1326
|
-
value = "(?%s:%s)" % (f, value)
|
|
1327
|
-
return value
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
class PatternStr(Pattern):
|
|
1331
|
-
__serialize_fields__ = "value", "flags", "raw"
|
|
1332
|
-
|
|
1333
|
-
type: ClassVar[str] = "str"
|
|
1334
|
-
|
|
1335
|
-
def to_regexp(self) -> str:
|
|
1336
|
-
return self._get_flags(re.escape(self.value))
|
|
1337
|
-
|
|
1338
|
-
@property
|
|
1339
|
-
def min_width(self) -> int:
|
|
1340
|
-
return len(self.value)
|
|
1341
|
-
|
|
1342
|
-
@property
|
|
1343
|
-
def max_width(self) -> int:
|
|
1344
|
-
return len(self.value)
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
class PatternRE(Pattern):
|
|
1348
|
-
__serialize_fields__ = "value", "flags", "raw", "_width"
|
|
1349
|
-
|
|
1350
|
-
type: ClassVar[str] = "re"
|
|
1351
|
-
|
|
1352
|
-
def to_regexp(self) -> str:
|
|
1353
|
-
return self._get_flags(self.value)
|
|
1354
|
-
|
|
1355
|
-
_width = None
|
|
1356
|
-
|
|
1357
|
-
def _get_width(self):
|
|
1358
|
-
if self._width is None:
|
|
1359
|
-
self._width = get_regexp_width(self.to_regexp())
|
|
1360
|
-
return self._width
|
|
1361
|
-
|
|
1362
|
-
@property
|
|
1363
|
-
def min_width(self) -> int:
|
|
1364
|
-
return self._get_width()[0]
|
|
1365
|
-
|
|
1366
|
-
@property
|
|
1367
|
-
def max_width(self) -> int:
|
|
1368
|
-
return self._get_width()[1]
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
class TerminalDef(Serialize):
|
|
1372
|
-
#--
|
|
1373
|
-
__serialize_fields__ = "name", "pattern", "priority"
|
|
1374
|
-
__serialize_namespace__ = PatternStr, PatternRE
|
|
1375
|
-
|
|
1376
|
-
name: str
|
|
1377
|
-
pattern: Pattern
|
|
1378
|
-
priority: int
|
|
1379
|
-
|
|
1380
|
-
def __init__(
|
|
1381
|
-
self, name: str, pattern: Pattern, priority: int = TOKEN_DEFAULT_PRIORITY
|
|
1382
|
-
) -> None:
|
|
1383
|
-
assert isinstance(pattern, Pattern), pattern
|
|
1384
|
-
self.name = name
|
|
1385
|
-
self.pattern = pattern
|
|
1386
|
-
self.priority = priority
|
|
1387
|
-
|
|
1388
|
-
def __repr__(self):
|
|
1389
|
-
return "%s(%r, %r)" % (type(self).__name__, self.name, self.pattern)
|
|
1390
|
-
|
|
1391
|
-
def user_repr(self) -> str:
|
|
1392
|
-
if self.name.startswith("__"): ##
|
|
1393
|
-
|
|
1394
|
-
return self.pattern.raw or self.name
|
|
1395
|
-
else:
|
|
1396
|
-
return self.name
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
_T = TypeVar("_T", bound="Token")
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
class Token(str):
|
|
1403
|
-
#--
|
|
1404
|
-
|
|
1405
|
-
__slots__ = (
|
|
1406
|
-
"type",
|
|
1407
|
-
"start_pos",
|
|
1408
|
-
"value",
|
|
1409
|
-
"line",
|
|
1410
|
-
"column",
|
|
1411
|
-
"end_line",
|
|
1412
|
-
"end_column",
|
|
1413
|
-
"end_pos",
|
|
1414
|
-
)
|
|
1415
|
-
|
|
1416
|
-
__match_args__ = ("type", "value")
|
|
1417
|
-
|
|
1418
|
-
type: str
|
|
1419
|
-
start_pos: Optional[int]
|
|
1420
|
-
value: Any
|
|
1421
|
-
line: Optional[int]
|
|
1422
|
-
column: Optional[int]
|
|
1423
|
-
end_line: Optional[int]
|
|
1424
|
-
end_column: Optional[int]
|
|
1425
|
-
end_pos: Optional[int]
|
|
1426
|
-
|
|
1427
|
-
@overload
|
|
1428
|
-
def __new__(
|
|
1429
|
-
cls,
|
|
1430
|
-
type: str,
|
|
1431
|
-
value: Any,
|
|
1432
|
-
start_pos: Optional[int] = None,
|
|
1433
|
-
line: Optional[int] = None,
|
|
1434
|
-
column: Optional[int] = None,
|
|
1435
|
-
end_line: Optional[int] = None,
|
|
1436
|
-
end_column: Optional[int] = None,
|
|
1437
|
-
end_pos: Optional[int] = None,
|
|
1438
|
-
) -> "Token": ...
|
|
1439
|
-
|
|
1440
|
-
@overload
|
|
1441
|
-
def __new__(
|
|
1442
|
-
cls,
|
|
1443
|
-
type_: str,
|
|
1444
|
-
value: Any,
|
|
1445
|
-
start_pos: Optional[int] = None,
|
|
1446
|
-
line: Optional[int] = None,
|
|
1447
|
-
column: Optional[int] = None,
|
|
1448
|
-
end_line: Optional[int] = None,
|
|
1449
|
-
end_column: Optional[int] = None,
|
|
1450
|
-
end_pos: Optional[int] = None,
|
|
1451
|
-
) -> "Token": ...
|
|
1452
|
-
|
|
1453
|
-
def __new__(cls, *args, **kwargs):
|
|
1454
|
-
if "type_" in kwargs:
|
|
1455
|
-
warnings.warn(
|
|
1456
|
-
"`type_` is deprecated use `type` instead", DeprecationWarning
|
|
1457
|
-
)
|
|
1458
|
-
|
|
1459
|
-
if "type" in kwargs:
|
|
1460
|
-
raise TypeError(
|
|
1461
|
-
"Error: using both 'type' and the deprecated 'type_' as arguments."
|
|
1462
|
-
)
|
|
1463
|
-
kwargs["type"] = kwargs.pop("type_")
|
|
1464
|
-
|
|
1465
|
-
return cls._future_new(*args, **kwargs)
|
|
1466
|
-
|
|
1467
|
-
@classmethod
|
|
1468
|
-
def _future_new(
|
|
1469
|
-
cls,
|
|
1470
|
-
type,
|
|
1471
|
-
value,
|
|
1472
|
-
start_pos=None,
|
|
1473
|
-
line=None,
|
|
1474
|
-
column=None,
|
|
1475
|
-
end_line=None,
|
|
1476
|
-
end_column=None,
|
|
1477
|
-
end_pos=None,
|
|
1478
|
-
):
|
|
1479
|
-
inst = super(Token, cls).__new__(cls, value)
|
|
1480
|
-
|
|
1481
|
-
inst.type = type
|
|
1482
|
-
inst.start_pos = start_pos
|
|
1483
|
-
inst.value = value
|
|
1484
|
-
inst.line = line
|
|
1485
|
-
inst.column = column
|
|
1486
|
-
inst.end_line = end_line
|
|
1487
|
-
inst.end_column = end_column
|
|
1488
|
-
inst.end_pos = end_pos
|
|
1489
|
-
return inst
|
|
1490
|
-
|
|
1491
|
-
@overload
|
|
1492
|
-
def update(
|
|
1493
|
-
self, type: Optional[str] = None, value: Optional[Any] = None
|
|
1494
|
-
) -> "Token": ...
|
|
1495
|
-
|
|
1496
|
-
@overload
|
|
1497
|
-
def update(
|
|
1498
|
-
self, type_: Optional[str] = None, value: Optional[Any] = None
|
|
1499
|
-
) -> "Token": ...
|
|
1500
|
-
|
|
1501
|
-
def update(self, *args, **kwargs):
|
|
1502
|
-
if "type_" in kwargs:
|
|
1503
|
-
warnings.warn(
|
|
1504
|
-
"`type_` is deprecated use `type` instead", DeprecationWarning
|
|
1505
|
-
)
|
|
1506
|
-
|
|
1507
|
-
if "type" in kwargs:
|
|
1508
|
-
raise TypeError(
|
|
1509
|
-
"Error: using both 'type' and the deprecated 'type_' as arguments."
|
|
1510
|
-
)
|
|
1511
|
-
kwargs["type"] = kwargs.pop("type_")
|
|
1512
|
-
|
|
1513
|
-
return self._future_update(*args, **kwargs)
|
|
1514
|
-
|
|
1515
|
-
def _future_update(
|
|
1516
|
-
self, type: Optional[str] = None, value: Optional[Any] = None
|
|
1517
|
-
) -> "Token":
|
|
1518
|
-
return Token.new_borrow_pos(
|
|
1519
|
-
type if type is not None else self.type,
|
|
1520
|
-
value if value is not None else self.value,
|
|
1521
|
-
self,
|
|
1522
|
-
)
|
|
1523
|
-
|
|
1524
|
-
@classmethod
|
|
1525
|
-
def new_borrow_pos(cls: Type[_T], type_: str, value: Any, borrow_t: "Token") -> _T:
|
|
1526
|
-
return cls(
|
|
1527
|
-
type_,
|
|
1528
|
-
value,
|
|
1529
|
-
borrow_t.start_pos,
|
|
1530
|
-
borrow_t.line,
|
|
1531
|
-
borrow_t.column,
|
|
1532
|
-
borrow_t.end_line,
|
|
1533
|
-
borrow_t.end_column,
|
|
1534
|
-
borrow_t.end_pos,
|
|
1535
|
-
)
|
|
1536
|
-
|
|
1537
|
-
def __reduce__(self):
|
|
1538
|
-
return (
|
|
1539
|
-
self.__class__,
|
|
1540
|
-
(self.type, self.value, self.start_pos, self.line, self.column),
|
|
1541
|
-
)
|
|
1542
|
-
|
|
1543
|
-
def __repr__(self):
|
|
1544
|
-
return "Token(%r, %r)" % (self.type, self.value)
|
|
1545
|
-
|
|
1546
|
-
def __deepcopy__(self, memo):
|
|
1547
|
-
return Token(self.type, self.value, self.start_pos, self.line, self.column)
|
|
1548
|
-
|
|
1549
|
-
def __eq__(self, other):
|
|
1550
|
-
if isinstance(other, Token) and self.type != other.type:
|
|
1551
|
-
return False
|
|
1552
|
-
|
|
1553
|
-
return str.__eq__(self, other)
|
|
1554
|
-
|
|
1555
|
-
__hash__ = str.__hash__
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
class LineCounter:
|
|
1559
|
-
#--
|
|
1560
|
-
|
|
1561
|
-
__slots__ = "char_pos", "line", "column", "line_start_pos", "newline_char"
|
|
1562
|
-
|
|
1563
|
-
def __init__(self, newline_char):
|
|
1564
|
-
self.newline_char = newline_char
|
|
1565
|
-
self.char_pos = 0
|
|
1566
|
-
self.line = 1
|
|
1567
|
-
self.column = 1
|
|
1568
|
-
self.line_start_pos = 0
|
|
1569
|
-
|
|
1570
|
-
def __eq__(self, other):
|
|
1571
|
-
if not isinstance(other, LineCounter):
|
|
1572
|
-
return NotImplemented
|
|
1573
|
-
|
|
1574
|
-
return (
|
|
1575
|
-
self.char_pos == other.char_pos and self.newline_char == other.newline_char
|
|
1576
|
-
)
|
|
1577
|
-
|
|
1578
|
-
def feed(self, token: Token, test_newline=True):
|
|
1579
|
-
#--
|
|
1580
|
-
if test_newline:
|
|
1581
|
-
newlines = token.count(self.newline_char)
|
|
1582
|
-
if newlines:
|
|
1583
|
-
self.line += newlines
|
|
1584
|
-
self.line_start_pos = (
|
|
1585
|
-
self.char_pos + token.rindex(self.newline_char) + 1
|
|
1586
|
-
)
|
|
1587
|
-
|
|
1588
|
-
self.char_pos += len(token)
|
|
1589
|
-
self.column = self.char_pos - self.line_start_pos + 1
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
class UnlessCallback:
|
|
1593
|
-
def __init__(self, scanner):
|
|
1594
|
-
self.scanner = scanner
|
|
1595
|
-
|
|
1596
|
-
def __call__(self, t):
|
|
1597
|
-
res = self.scanner.match(t.value, 0)
|
|
1598
|
-
if res:
|
|
1599
|
-
_value, t.type = res
|
|
1600
|
-
return t
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
class CallChain:
|
|
1604
|
-
def __init__(self, callback1, callback2, cond):
|
|
1605
|
-
self.callback1 = callback1
|
|
1606
|
-
self.callback2 = callback2
|
|
1607
|
-
self.cond = cond
|
|
1608
|
-
|
|
1609
|
-
def __call__(self, t):
|
|
1610
|
-
t2 = self.callback1(t)
|
|
1611
|
-
return self.callback2(t) if self.cond(t2) else t2
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
def _get_match(re_, regexp, s, flags):
|
|
1615
|
-
m = re_.match(regexp, s, flags)
|
|
1616
|
-
if m:
|
|
1617
|
-
return m.group(0)
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
def _create_unless(terminals, g_regex_flags, re_, use_bytes):
|
|
1621
|
-
tokens_by_type = classify(terminals, lambda t: type(t.pattern))
|
|
1622
|
-
assert len(tokens_by_type) <= 2, tokens_by_type.keys()
|
|
1623
|
-
embedded_strs = set()
|
|
1624
|
-
callback = {}
|
|
1625
|
-
for retok in tokens_by_type.get(PatternRE, []):
|
|
1626
|
-
unless = []
|
|
1627
|
-
for strtok in tokens_by_type.get(PatternStr, []):
|
|
1628
|
-
if strtok.priority != retok.priority:
|
|
1629
|
-
continue
|
|
1630
|
-
s = strtok.pattern.value
|
|
1631
|
-
if s == _get_match(re_, retok.pattern.to_regexp(), s, g_regex_flags):
|
|
1632
|
-
unless.append(strtok)
|
|
1633
|
-
if strtok.pattern.flags <= retok.pattern.flags:
|
|
1634
|
-
embedded_strs.add(strtok)
|
|
1635
|
-
if unless:
|
|
1636
|
-
callback[retok.name] = UnlessCallback(
|
|
1637
|
-
Scanner(
|
|
1638
|
-
unless, g_regex_flags, re_, match_whole=True, use_bytes=use_bytes
|
|
1639
|
-
)
|
|
1640
|
-
)
|
|
1641
|
-
|
|
1642
|
-
new_terminals = [t for t in terminals if t not in embedded_strs]
|
|
1643
|
-
return new_terminals, callback
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
class Scanner:
|
|
1647
|
-
def __init__(self, terminals, g_regex_flags, re_, use_bytes, match_whole=False):
|
|
1648
|
-
self.terminals = terminals
|
|
1649
|
-
self.g_regex_flags = g_regex_flags
|
|
1650
|
-
self.re_ = re_
|
|
1651
|
-
self.use_bytes = use_bytes
|
|
1652
|
-
self.match_whole = match_whole
|
|
1653
|
-
|
|
1654
|
-
self.allowed_types = {t.name for t in self.terminals}
|
|
1655
|
-
|
|
1656
|
-
self._mres = self._build_mres(terminals, len(terminals))
|
|
1657
|
-
|
|
1658
|
-
def _build_mres(self, terminals, max_size):
|
|
1659
|
-
##
|
|
1660
|
-
|
|
1661
|
-
##
|
|
1662
|
-
|
|
1663
|
-
##
|
|
1664
|
-
|
|
1665
|
-
postfix = "$" if self.match_whole else ""
|
|
1666
|
-
mres = []
|
|
1667
|
-
while terminals:
|
|
1668
|
-
pattern = "|".join(
|
|
1669
|
-
"(?P<%s>%s)" % (t.name, t.pattern.to_regexp() + postfix)
|
|
1670
|
-
for t in terminals[:max_size]
|
|
1671
|
-
)
|
|
1672
|
-
if self.use_bytes:
|
|
1673
|
-
pattern = pattern.encode("latin-1")
|
|
1674
|
-
try:
|
|
1675
|
-
mre = self.re_.compile(pattern, self.g_regex_flags)
|
|
1676
|
-
except AssertionError: ##
|
|
1677
|
-
|
|
1678
|
-
return self._build_mres(terminals, max_size // 2)
|
|
1679
|
-
|
|
1680
|
-
mres.append(mre)
|
|
1681
|
-
terminals = terminals[max_size:]
|
|
1682
|
-
return mres
|
|
1683
|
-
|
|
1684
|
-
def match(self, text, pos):
|
|
1685
|
-
for mre in self._mres:
|
|
1686
|
-
m = mre.match(text, pos)
|
|
1687
|
-
if m:
|
|
1688
|
-
return m.group(0), m.lastgroup
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
def _regexp_has_newline(r: str):
|
|
1692
|
-
#--
|
|
1693
|
-
return (
|
|
1694
|
-
"\n" in r or "\\n" in r or "\\s" in r or "[^" in r or ("(?s" in r and "." in r)
|
|
1695
|
-
)
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
class LexerState:
|
|
1699
|
-
#--
|
|
1700
|
-
|
|
1701
|
-
__slots__ = "text", "line_ctr", "last_token"
|
|
1702
|
-
|
|
1703
|
-
text: str
|
|
1704
|
-
line_ctr: LineCounter
|
|
1705
|
-
last_token: Optional[Token]
|
|
1706
|
-
|
|
1707
|
-
def __init__(
|
|
1708
|
-
self,
|
|
1709
|
-
text: str,
|
|
1710
|
-
line_ctr: Optional[LineCounter] = None,
|
|
1711
|
-
last_token: Optional[Token] = None,
|
|
1712
|
-
):
|
|
1713
|
-
self.text = text
|
|
1714
|
-
self.line_ctr = line_ctr or LineCounter(
|
|
1715
|
-
b"\n" if isinstance(text, bytes) else "\n"
|
|
1716
|
-
)
|
|
1717
|
-
self.last_token = last_token
|
|
1718
|
-
|
|
1719
|
-
def __eq__(self, other):
|
|
1720
|
-
if not isinstance(other, LexerState):
|
|
1721
|
-
return NotImplemented
|
|
1722
|
-
|
|
1723
|
-
return (
|
|
1724
|
-
self.text is other.text
|
|
1725
|
-
and self.line_ctr == other.line_ctr
|
|
1726
|
-
and self.last_token == other.last_token
|
|
1727
|
-
)
|
|
1728
|
-
|
|
1729
|
-
def __copy__(self):
|
|
1730
|
-
return type(self)(self.text, copy(self.line_ctr), self.last_token)
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
class LexerThread:
|
|
1734
|
-
#--
|
|
1735
|
-
|
|
1736
|
-
def __init__(self, lexer: "Lexer", lexer_state: LexerState):
|
|
1737
|
-
self.lexer = lexer
|
|
1738
|
-
self.state = lexer_state
|
|
1739
|
-
|
|
1740
|
-
@classmethod
|
|
1741
|
-
def from_text(cls, lexer: "Lexer", text: str) -> "LexerThread":
|
|
1742
|
-
return cls(lexer, LexerState(text))
|
|
1743
|
-
|
|
1744
|
-
def lex(self, parser_state):
|
|
1745
|
-
return self.lexer.lex(self.state, parser_state)
|
|
1746
|
-
|
|
1747
|
-
def __copy__(self):
|
|
1748
|
-
return type(self)(self.lexer, copy(self.state))
|
|
1749
|
-
|
|
1750
|
-
_Token = Token
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
_Callback = Callable[[Token], Token]
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
class Lexer(ABC):
|
|
1757
|
-
#--
|
|
1758
|
-
|
|
1759
|
-
@abstractmethod
|
|
1760
|
-
def lex(self, lexer_state: LexerState, parser_state: Any) -> Iterator[Token]:
|
|
1761
|
-
return NotImplemented
|
|
1762
|
-
|
|
1763
|
-
def make_lexer_state(self, text):
|
|
1764
|
-
#--
|
|
1765
|
-
return LexerState(text)
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
def _check_regex_collisions(
|
|
1769
|
-
terminal_to_regexp: Dict[TerminalDef, str],
|
|
1770
|
-
comparator,
|
|
1771
|
-
strict_mode,
|
|
1772
|
-
max_collisions_to_show=8,
|
|
1773
|
-
):
|
|
1774
|
-
if not comparator:
|
|
1775
|
-
comparator = interegular.Comparator.from_regexes(terminal_to_regexp)
|
|
1776
|
-
|
|
1777
|
-
##
|
|
1778
|
-
|
|
1779
|
-
##
|
|
1780
|
-
|
|
1781
|
-
max_time = 2 if strict_mode else 0.2
|
|
1782
|
-
|
|
1783
|
-
##
|
|
1784
|
-
|
|
1785
|
-
if comparator.count_marked_pairs() >= max_collisions_to_show:
|
|
1786
|
-
return
|
|
1787
|
-
for group in classify(terminal_to_regexp, lambda t: t.priority).values():
|
|
1788
|
-
for a, b in comparator.check(group, skip_marked=True):
|
|
1789
|
-
assert a.priority == b.priority
|
|
1790
|
-
##
|
|
1791
|
-
|
|
1792
|
-
comparator.mark(a, b)
|
|
1793
|
-
|
|
1794
|
-
##
|
|
1795
|
-
|
|
1796
|
-
message = f"Collision between Terminals {a.name} and {b.name}. "
|
|
1797
|
-
try:
|
|
1798
|
-
example = comparator.get_example_overlap(
|
|
1799
|
-
a, b, max_time
|
|
1800
|
-
).format_multiline()
|
|
1801
|
-
except ValueError:
|
|
1802
|
-
##
|
|
1803
|
-
|
|
1804
|
-
example = "No example could be found fast enough. However, the collision does still exists"
|
|
1805
|
-
if strict_mode:
|
|
1806
|
-
raise LexError(f"{message}\n{example}")
|
|
1807
|
-
logger.warning(
|
|
1808
|
-
"%s The lexer will choose between them arbitrarily.\n%s",
|
|
1809
|
-
message,
|
|
1810
|
-
example,
|
|
1811
|
-
)
|
|
1812
|
-
if comparator.count_marked_pairs() >= max_collisions_to_show:
|
|
1813
|
-
logger.warning("Found 8 regex collisions, will not check for more.")
|
|
1814
|
-
return
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
class AbstractBasicLexer(Lexer):
|
|
1818
|
-
terminals_by_name: Dict[str, TerminalDef]
|
|
1819
|
-
|
|
1820
|
-
@abstractmethod
|
|
1821
|
-
def __init__(self, conf: "LexerConf", comparator=None) -> None: ...
|
|
1822
|
-
|
|
1823
|
-
@abstractmethod
|
|
1824
|
-
def next_token(self, lex_state: LexerState, parser_state: Any = None) -> Token: ...
|
|
1825
|
-
|
|
1826
|
-
def lex(self, state: LexerState, parser_state: Any) -> Iterator[Token]:
|
|
1827
|
-
with suppress(EOFError):
|
|
1828
|
-
while True:
|
|
1829
|
-
yield self.next_token(state, parser_state)
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
class BasicLexer(AbstractBasicLexer):
|
|
1833
|
-
terminals: Collection[TerminalDef]
|
|
1834
|
-
ignore_types: FrozenSet[str]
|
|
1835
|
-
newline_types: FrozenSet[str]
|
|
1836
|
-
user_callbacks: Dict[str, _Callback]
|
|
1837
|
-
callback: Dict[str, _Callback]
|
|
1838
|
-
re: ModuleType
|
|
1839
|
-
|
|
1840
|
-
def __init__(self, conf: "LexerConf", comparator=None) -> None:
|
|
1841
|
-
terminals = list(conf.terminals)
|
|
1842
|
-
assert all(isinstance(t, TerminalDef) for t in terminals), terminals
|
|
1843
|
-
|
|
1844
|
-
self.re = conf.re_module
|
|
1845
|
-
|
|
1846
|
-
if not conf.skip_validation:
|
|
1847
|
-
##
|
|
1848
|
-
|
|
1849
|
-
terminal_to_regexp = {}
|
|
1850
|
-
for t in terminals:
|
|
1851
|
-
regexp = t.pattern.to_regexp()
|
|
1852
|
-
try:
|
|
1853
|
-
self.re.compile(regexp, conf.g_regex_flags)
|
|
1854
|
-
except self.re.error:
|
|
1855
|
-
raise LexError("Cannot compile token %s: %s" % (t.name, t.pattern))
|
|
1856
|
-
|
|
1857
|
-
if t.pattern.min_width == 0:
|
|
1858
|
-
raise LexError(
|
|
1859
|
-
"Lexer does not allow zero-width terminals. (%s: %s)"
|
|
1860
|
-
% (t.name, t.pattern)
|
|
1861
|
-
)
|
|
1862
|
-
if t.pattern.type == "re":
|
|
1863
|
-
terminal_to_regexp[t] = regexp
|
|
1864
|
-
|
|
1865
|
-
if not (set(conf.ignore) <= {t.name for t in terminals}):
|
|
1866
|
-
raise LexError(
|
|
1867
|
-
"Ignore terminals are not defined: %s"
|
|
1868
|
-
% (set(conf.ignore) - {t.name for t in terminals})
|
|
1869
|
-
)
|
|
1870
|
-
|
|
1871
|
-
if has_interegular:
|
|
1872
|
-
_check_regex_collisions(terminal_to_regexp, comparator, conf.strict)
|
|
1873
|
-
elif conf.strict:
|
|
1874
|
-
raise LexError(
|
|
1875
|
-
"interegular must be installed for strict mode. Use `pip install 'lark[interegular]'`."
|
|
1876
|
-
)
|
|
1877
|
-
|
|
1878
|
-
##
|
|
1879
|
-
|
|
1880
|
-
self.newline_types = frozenset(
|
|
1881
|
-
t.name for t in terminals if _regexp_has_newline(t.pattern.to_regexp())
|
|
1882
|
-
)
|
|
1883
|
-
self.ignore_types = frozenset(conf.ignore)
|
|
1884
|
-
|
|
1885
|
-
terminals.sort(
|
|
1886
|
-
key=lambda x: (
|
|
1887
|
-
-x.priority,
|
|
1888
|
-
-x.pattern.max_width,
|
|
1889
|
-
-len(x.pattern.value),
|
|
1890
|
-
x.name,
|
|
1891
|
-
)
|
|
1892
|
-
)
|
|
1893
|
-
self.terminals = terminals
|
|
1894
|
-
self.user_callbacks = conf.callbacks
|
|
1895
|
-
self.g_regex_flags = conf.g_regex_flags
|
|
1896
|
-
self.use_bytes = conf.use_bytes
|
|
1897
|
-
self.terminals_by_name = conf.terminals_by_name
|
|
1898
|
-
|
|
1899
|
-
self._scanner = None
|
|
1900
|
-
|
|
1901
|
-
def _build_scanner(self):
|
|
1902
|
-
terminals, self.callback = _create_unless(
|
|
1903
|
-
self.terminals, self.g_regex_flags, self.re, self.use_bytes
|
|
1904
|
-
)
|
|
1905
|
-
assert all(self.callback.values())
|
|
1906
|
-
|
|
1907
|
-
for type_, f in self.user_callbacks.items():
|
|
1908
|
-
if type_ in self.callback:
|
|
1909
|
-
##
|
|
1910
|
-
|
|
1911
|
-
self.callback[type_] = CallChain(
|
|
1912
|
-
self.callback[type_], f, lambda t: t.type == type_
|
|
1913
|
-
)
|
|
1914
|
-
else:
|
|
1915
|
-
self.callback[type_] = f
|
|
1916
|
-
|
|
1917
|
-
self._scanner = Scanner(terminals, self.g_regex_flags, self.re, self.use_bytes)
|
|
1918
|
-
|
|
1919
|
-
@property
|
|
1920
|
-
def scanner(self):
|
|
1921
|
-
if self._scanner is None:
|
|
1922
|
-
self._build_scanner()
|
|
1923
|
-
return self._scanner
|
|
1924
|
-
|
|
1925
|
-
def match(self, text, pos):
|
|
1926
|
-
return self.scanner.match(text, pos)
|
|
1927
|
-
|
|
1928
|
-
def next_token(self, lex_state: LexerState, parser_state: Any = None) -> Token:
|
|
1929
|
-
line_ctr = lex_state.line_ctr
|
|
1930
|
-
while line_ctr.char_pos < len(lex_state.text):
|
|
1931
|
-
res = self.match(lex_state.text, line_ctr.char_pos)
|
|
1932
|
-
if not res:
|
|
1933
|
-
allowed = self.scanner.allowed_types - self.ignore_types
|
|
1934
|
-
if not allowed:
|
|
1935
|
-
allowed = {"<END-OF-FILE>"}
|
|
1936
|
-
raise UnexpectedCharacters(
|
|
1937
|
-
lex_state.text,
|
|
1938
|
-
line_ctr.char_pos,
|
|
1939
|
-
line_ctr.line,
|
|
1940
|
-
line_ctr.column,
|
|
1941
|
-
allowed=allowed,
|
|
1942
|
-
token_history=lex_state.last_token and [lex_state.last_token],
|
|
1943
|
-
state=parser_state,
|
|
1944
|
-
terminals_by_name=self.terminals_by_name,
|
|
1945
|
-
)
|
|
1946
|
-
|
|
1947
|
-
value, type_ = res
|
|
1948
|
-
|
|
1949
|
-
ignored = type_ in self.ignore_types
|
|
1950
|
-
t = None
|
|
1951
|
-
if not ignored or type_ in self.callback:
|
|
1952
|
-
t = Token(
|
|
1953
|
-
type_, value, line_ctr.char_pos, line_ctr.line, line_ctr.column
|
|
1954
|
-
)
|
|
1955
|
-
line_ctr.feed(value, type_ in self.newline_types)
|
|
1956
|
-
if t is not None:
|
|
1957
|
-
t.end_line = line_ctr.line
|
|
1958
|
-
t.end_column = line_ctr.column
|
|
1959
|
-
t.end_pos = line_ctr.char_pos
|
|
1960
|
-
if t.type in self.callback:
|
|
1961
|
-
t = self.callback[t.type](t)
|
|
1962
|
-
if not ignored:
|
|
1963
|
-
if not isinstance(t, Token):
|
|
1964
|
-
raise LexError(
|
|
1965
|
-
"Callbacks must return a token (returned %r)" % t
|
|
1966
|
-
)
|
|
1967
|
-
lex_state.last_token = t
|
|
1968
|
-
return t
|
|
1969
|
-
|
|
1970
|
-
##
|
|
1971
|
-
|
|
1972
|
-
raise EOFError(self)
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
class ContextualLexer(Lexer):
|
|
1976
|
-
lexers: Dict[int, AbstractBasicLexer]
|
|
1977
|
-
root_lexer: AbstractBasicLexer
|
|
1978
|
-
|
|
1979
|
-
BasicLexer: Type[AbstractBasicLexer] = BasicLexer
|
|
1980
|
-
|
|
1981
|
-
def __init__(
|
|
1982
|
-
self,
|
|
1983
|
-
conf: "LexerConf",
|
|
1984
|
-
states: Dict[int, Collection[str]],
|
|
1985
|
-
always_accept: Collection[str] = (),
|
|
1986
|
-
) -> None:
|
|
1987
|
-
terminals = list(conf.terminals)
|
|
1988
|
-
terminals_by_name = conf.terminals_by_name
|
|
1989
|
-
|
|
1990
|
-
trad_conf = copy(conf)
|
|
1991
|
-
trad_conf.terminals = terminals
|
|
1992
|
-
|
|
1993
|
-
if has_interegular and not conf.skip_validation:
|
|
1994
|
-
comparator = interegular.Comparator.from_regexes(
|
|
1995
|
-
{t: t.pattern.to_regexp() for t in terminals}
|
|
1996
|
-
)
|
|
1997
|
-
else:
|
|
1998
|
-
comparator = None
|
|
1999
|
-
lexer_by_tokens: Dict[FrozenSet[str], AbstractBasicLexer] = {}
|
|
2000
|
-
self.lexers = {}
|
|
2001
|
-
for state, accepts in states.items():
|
|
2002
|
-
key = frozenset(accepts)
|
|
2003
|
-
try:
|
|
2004
|
-
lexer = lexer_by_tokens[key]
|
|
2005
|
-
except KeyError:
|
|
2006
|
-
accepts = set(accepts) | set(conf.ignore) | set(always_accept)
|
|
2007
|
-
lexer_conf = copy(trad_conf)
|
|
2008
|
-
lexer_conf.terminals = [
|
|
2009
|
-
terminals_by_name[n] for n in accepts if n in terminals_by_name
|
|
2010
|
-
]
|
|
2011
|
-
lexer = self.BasicLexer(lexer_conf, comparator)
|
|
2012
|
-
lexer_by_tokens[key] = lexer
|
|
2013
|
-
|
|
2014
|
-
self.lexers[state] = lexer
|
|
2015
|
-
|
|
2016
|
-
assert trad_conf.terminals is terminals
|
|
2017
|
-
trad_conf.skip_validation = True ##
|
|
2018
|
-
|
|
2019
|
-
self.root_lexer = self.BasicLexer(trad_conf, comparator)
|
|
2020
|
-
|
|
2021
|
-
def lex(
|
|
2022
|
-
self, lexer_state: LexerState, parser_state: "ParserState"
|
|
2023
|
-
) -> Iterator[Token]:
|
|
2024
|
-
try:
|
|
2025
|
-
while True:
|
|
2026
|
-
lexer = self.lexers[parser_state.position]
|
|
2027
|
-
yield lexer.next_token(lexer_state, parser_state)
|
|
2028
|
-
except EOFError:
|
|
2029
|
-
pass
|
|
2030
|
-
except UnexpectedCharacters as e:
|
|
2031
|
-
##
|
|
2032
|
-
|
|
2033
|
-
##
|
|
2034
|
-
|
|
2035
|
-
try:
|
|
2036
|
-
last_token = (
|
|
2037
|
-
lexer_state.last_token
|
|
2038
|
-
) ##
|
|
2039
|
-
|
|
2040
|
-
token = self.root_lexer.next_token(lexer_state, parser_state)
|
|
2041
|
-
raise UnexpectedToken(
|
|
2042
|
-
token,
|
|
2043
|
-
e.allowed,
|
|
2044
|
-
state=parser_state,
|
|
2045
|
-
token_history=[last_token],
|
|
2046
|
-
terminals_by_name=self.root_lexer.terminals_by_name,
|
|
2047
|
-
)
|
|
2048
|
-
except UnexpectedCharacters:
|
|
2049
|
-
raise e ##
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
_ParserArgType: "TypeAlias" = 'Literal["earley", "lalr", "cyk", "auto"]'
|
|
2056
|
-
_LexerArgType: "TypeAlias" = (
|
|
2057
|
-
'Union[Literal["auto", "basic", "contextual", "dynamic", "dynamic_complete"], Type[Lexer]]'
|
|
2058
|
-
)
|
|
2059
|
-
_LexerCallback = Callable[[Token], Token]
|
|
2060
|
-
ParserCallbacks = Dict[str, Callable]
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
class LexerConf(Serialize):
|
|
2064
|
-
__serialize_fields__ = (
|
|
2065
|
-
"terminals",
|
|
2066
|
-
"ignore",
|
|
2067
|
-
"g_regex_flags",
|
|
2068
|
-
"use_bytes",
|
|
2069
|
-
"lexer_type",
|
|
2070
|
-
)
|
|
2071
|
-
__serialize_namespace__ = (TerminalDef,)
|
|
2072
|
-
|
|
2073
|
-
terminals: Collection[TerminalDef]
|
|
2074
|
-
re_module: ModuleType
|
|
2075
|
-
ignore: Collection[str]
|
|
2076
|
-
postlex: "Optional[PostLex]"
|
|
2077
|
-
callbacks: Dict[str, _LexerCallback]
|
|
2078
|
-
g_regex_flags: int
|
|
2079
|
-
skip_validation: bool
|
|
2080
|
-
use_bytes: bool
|
|
2081
|
-
lexer_type: Optional[_LexerArgType]
|
|
2082
|
-
strict: bool
|
|
2083
|
-
|
|
2084
|
-
def __init__(
|
|
2085
|
-
self,
|
|
2086
|
-
terminals: Collection[TerminalDef],
|
|
2087
|
-
re_module: ModuleType,
|
|
2088
|
-
ignore: Collection[str] = (),
|
|
2089
|
-
postlex: "Optional[PostLex]" = None,
|
|
2090
|
-
callbacks: Optional[Dict[str, _LexerCallback]] = None,
|
|
2091
|
-
g_regex_flags: int = 0,
|
|
2092
|
-
skip_validation: bool = False,
|
|
2093
|
-
use_bytes: bool = False,
|
|
2094
|
-
strict: bool = False,
|
|
2095
|
-
):
|
|
2096
|
-
self.terminals = terminals
|
|
2097
|
-
self.terminals_by_name = {t.name: t for t in self.terminals}
|
|
2098
|
-
assert len(self.terminals) == len(self.terminals_by_name)
|
|
2099
|
-
self.ignore = ignore
|
|
2100
|
-
self.postlex = postlex
|
|
2101
|
-
self.callbacks = callbacks or {}
|
|
2102
|
-
self.g_regex_flags = g_regex_flags
|
|
2103
|
-
self.re_module = re_module
|
|
2104
|
-
self.skip_validation = skip_validation
|
|
2105
|
-
self.use_bytes = use_bytes
|
|
2106
|
-
self.strict = strict
|
|
2107
|
-
self.lexer_type = None
|
|
2108
|
-
|
|
2109
|
-
def _deserialize(self):
|
|
2110
|
-
self.terminals_by_name = {t.name: t for t in self.terminals}
|
|
2111
|
-
|
|
2112
|
-
def __deepcopy__(self, memo=None):
|
|
2113
|
-
return type(self)(
|
|
2114
|
-
deepcopy(self.terminals, memo),
|
|
2115
|
-
self.re_module,
|
|
2116
|
-
deepcopy(self.ignore, memo),
|
|
2117
|
-
deepcopy(self.postlex, memo),
|
|
2118
|
-
deepcopy(self.callbacks, memo),
|
|
2119
|
-
deepcopy(self.g_regex_flags, memo),
|
|
2120
|
-
deepcopy(self.skip_validation, memo),
|
|
2121
|
-
deepcopy(self.use_bytes, memo),
|
|
2122
|
-
)
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
class ParserConf(Serialize):
|
|
2126
|
-
__serialize_fields__ = "rules", "start", "parser_type"
|
|
2127
|
-
|
|
2128
|
-
rules: List["Rule"]
|
|
2129
|
-
callbacks: ParserCallbacks
|
|
2130
|
-
start: List[str]
|
|
2131
|
-
parser_type: _ParserArgType
|
|
2132
|
-
|
|
2133
|
-
def __init__(
|
|
2134
|
-
self, rules: List["Rule"], callbacks: ParserCallbacks, start: List[str]
|
|
2135
|
-
):
|
|
2136
|
-
assert isinstance(start, list)
|
|
2137
|
-
self.rules = rules
|
|
2138
|
-
self.callbacks = callbacks
|
|
2139
|
-
self.start = start
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
from functools import partial, wraps
|
|
2144
|
-
from itertools import product
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
class ExpandSingleChild:
|
|
2148
|
-
def __init__(self, node_builder):
|
|
2149
|
-
self.node_builder = node_builder
|
|
2150
|
-
|
|
2151
|
-
def __call__(self, children):
|
|
2152
|
-
if len(children) == 1:
|
|
2153
|
-
return children[0]
|
|
2154
|
-
else:
|
|
2155
|
-
return self.node_builder(children)
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
class PropagatePositions:
|
|
2159
|
-
def __init__(self, node_builder, node_filter=None):
|
|
2160
|
-
self.node_builder = node_builder
|
|
2161
|
-
self.node_filter = node_filter
|
|
2162
|
-
|
|
2163
|
-
def __call__(self, children):
|
|
2164
|
-
res = self.node_builder(children)
|
|
2165
|
-
|
|
2166
|
-
if isinstance(res, Tree):
|
|
2167
|
-
##
|
|
2168
|
-
|
|
2169
|
-
##
|
|
2170
|
-
|
|
2171
|
-
##
|
|
2172
|
-
|
|
2173
|
-
##
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
res_meta = res.meta
|
|
2177
|
-
|
|
2178
|
-
first_meta = self._pp_get_meta(children)
|
|
2179
|
-
if first_meta is not None:
|
|
2180
|
-
if not hasattr(res_meta, "line"):
|
|
2181
|
-
##
|
|
2182
|
-
|
|
2183
|
-
res_meta.line = getattr(
|
|
2184
|
-
first_meta, "container_line", first_meta.line
|
|
2185
|
-
)
|
|
2186
|
-
res_meta.column = getattr(
|
|
2187
|
-
first_meta, "container_column", first_meta.column
|
|
2188
|
-
)
|
|
2189
|
-
res_meta.start_pos = getattr(
|
|
2190
|
-
first_meta, "container_start_pos", first_meta.start_pos
|
|
2191
|
-
)
|
|
2192
|
-
res_meta.empty = False
|
|
2193
|
-
|
|
2194
|
-
res_meta.container_line = getattr(
|
|
2195
|
-
first_meta, "container_line", first_meta.line
|
|
2196
|
-
)
|
|
2197
|
-
res_meta.container_column = getattr(
|
|
2198
|
-
first_meta, "container_column", first_meta.column
|
|
2199
|
-
)
|
|
2200
|
-
res_meta.container_start_pos = getattr(
|
|
2201
|
-
first_meta, "container_start_pos", first_meta.start_pos
|
|
2202
|
-
)
|
|
2203
|
-
|
|
2204
|
-
last_meta = self._pp_get_meta(reversed(children))
|
|
2205
|
-
if last_meta is not None:
|
|
2206
|
-
if not hasattr(res_meta, "end_line"):
|
|
2207
|
-
res_meta.end_line = getattr(
|
|
2208
|
-
last_meta, "container_end_line", last_meta.end_line
|
|
2209
|
-
)
|
|
2210
|
-
res_meta.end_column = getattr(
|
|
2211
|
-
last_meta, "container_end_column", last_meta.end_column
|
|
2212
|
-
)
|
|
2213
|
-
res_meta.end_pos = getattr(
|
|
2214
|
-
last_meta, "container_end_pos", last_meta.end_pos
|
|
2215
|
-
)
|
|
2216
|
-
res_meta.empty = False
|
|
2217
|
-
|
|
2218
|
-
res_meta.container_end_line = getattr(
|
|
2219
|
-
last_meta, "container_end_line", last_meta.end_line
|
|
2220
|
-
)
|
|
2221
|
-
res_meta.container_end_column = getattr(
|
|
2222
|
-
last_meta, "container_end_column", last_meta.end_column
|
|
2223
|
-
)
|
|
2224
|
-
res_meta.container_end_pos = getattr(
|
|
2225
|
-
last_meta, "container_end_pos", last_meta.end_pos
|
|
2226
|
-
)
|
|
2227
|
-
|
|
2228
|
-
return res
|
|
2229
|
-
|
|
2230
|
-
def _pp_get_meta(self, children):
|
|
2231
|
-
for c in children:
|
|
2232
|
-
if self.node_filter is not None and not self.node_filter(c):
|
|
2233
|
-
continue
|
|
2234
|
-
if isinstance(c, Tree):
|
|
2235
|
-
if not c.meta.empty:
|
|
2236
|
-
return c.meta
|
|
2237
|
-
elif isinstance(c, Token):
|
|
2238
|
-
return c
|
|
2239
|
-
elif hasattr(c, "__lark_meta__"):
|
|
2240
|
-
return c.__lark_meta__()
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
def make_propagate_positions(option):
|
|
2244
|
-
if callable(option):
|
|
2245
|
-
return partial(PropagatePositions, node_filter=option)
|
|
2246
|
-
elif option is True:
|
|
2247
|
-
return PropagatePositions
|
|
2248
|
-
elif option is False:
|
|
2249
|
-
return None
|
|
2250
|
-
|
|
2251
|
-
raise ConfigurationError("Invalid option for propagate_positions: %r" % option)
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
class ChildFilter:
|
|
2255
|
-
def __init__(self, to_include, append_none, node_builder):
|
|
2256
|
-
self.node_builder = node_builder
|
|
2257
|
-
self.to_include = to_include
|
|
2258
|
-
self.append_none = append_none
|
|
2259
|
-
|
|
2260
|
-
def __call__(self, children):
|
|
2261
|
-
filtered = []
|
|
2262
|
-
|
|
2263
|
-
for i, to_expand, add_none in self.to_include:
|
|
2264
|
-
if add_none:
|
|
2265
|
-
filtered += [None] * add_none
|
|
2266
|
-
if to_expand:
|
|
2267
|
-
filtered += children[i].children
|
|
2268
|
-
else:
|
|
2269
|
-
filtered.append(children[i])
|
|
2270
|
-
|
|
2271
|
-
if self.append_none:
|
|
2272
|
-
filtered += [None] * self.append_none
|
|
2273
|
-
|
|
2274
|
-
return self.node_builder(filtered)
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
class ChildFilterLALR(ChildFilter):
|
|
2278
|
-
#--
|
|
2279
|
-
|
|
2280
|
-
def __call__(self, children):
|
|
2281
|
-
filtered = []
|
|
2282
|
-
for i, to_expand, add_none in self.to_include:
|
|
2283
|
-
if add_none:
|
|
2284
|
-
filtered += [None] * add_none
|
|
2285
|
-
if to_expand:
|
|
2286
|
-
if filtered:
|
|
2287
|
-
filtered += children[i].children
|
|
2288
|
-
else: ##
|
|
2289
|
-
|
|
2290
|
-
filtered = children[i].children
|
|
2291
|
-
else:
|
|
2292
|
-
filtered.append(children[i])
|
|
2293
|
-
|
|
2294
|
-
if self.append_none:
|
|
2295
|
-
filtered += [None] * self.append_none
|
|
2296
|
-
|
|
2297
|
-
return self.node_builder(filtered)
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
class ChildFilterLALR_NoPlaceholders(ChildFilter):
|
|
2301
|
-
#--
|
|
2302
|
-
|
|
2303
|
-
def __init__(self, to_include, node_builder):
|
|
2304
|
-
self.node_builder = node_builder
|
|
2305
|
-
self.to_include = to_include
|
|
2306
|
-
|
|
2307
|
-
def __call__(self, children):
|
|
2308
|
-
filtered = []
|
|
2309
|
-
for i, to_expand in self.to_include:
|
|
2310
|
-
if to_expand:
|
|
2311
|
-
if filtered:
|
|
2312
|
-
filtered += children[i].children
|
|
2313
|
-
else: ##
|
|
2314
|
-
|
|
2315
|
-
filtered = children[i].children
|
|
2316
|
-
else:
|
|
2317
|
-
filtered.append(children[i])
|
|
2318
|
-
return self.node_builder(filtered)
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
def _should_expand(sym):
|
|
2322
|
-
return not sym.is_term and sym.name.startswith("_")
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
def maybe_create_child_filter(
|
|
2326
|
-
expansion, keep_all_tokens, ambiguous, _empty_indices: List[bool]
|
|
2327
|
-
):
|
|
2328
|
-
##
|
|
2329
|
-
|
|
2330
|
-
if _empty_indices:
|
|
2331
|
-
assert _empty_indices.count(False) == len(expansion)
|
|
2332
|
-
s = "".join(str(int(b)) for b in _empty_indices)
|
|
2333
|
-
empty_indices = [len(ones) for ones in s.split("0")]
|
|
2334
|
-
assert len(empty_indices) == len(expansion) + 1, (empty_indices, len(expansion))
|
|
2335
|
-
else:
|
|
2336
|
-
empty_indices = [0] * (len(expansion) + 1)
|
|
2337
|
-
|
|
2338
|
-
to_include = []
|
|
2339
|
-
nones_to_add = 0
|
|
2340
|
-
for i, sym in enumerate(expansion):
|
|
2341
|
-
nones_to_add += empty_indices[i]
|
|
2342
|
-
if keep_all_tokens or not (sym.is_term and sym.filter_out):
|
|
2343
|
-
to_include.append((i, _should_expand(sym), nones_to_add))
|
|
2344
|
-
nones_to_add = 0
|
|
2345
|
-
|
|
2346
|
-
nones_to_add += empty_indices[len(expansion)]
|
|
2347
|
-
|
|
2348
|
-
if (
|
|
2349
|
-
_empty_indices
|
|
2350
|
-
or len(to_include) < len(expansion)
|
|
2351
|
-
or any(to_expand for i, to_expand, _ in to_include)
|
|
2352
|
-
):
|
|
2353
|
-
if _empty_indices or ambiguous:
|
|
2354
|
-
return partial(
|
|
2355
|
-
ChildFilter if ambiguous else ChildFilterLALR, to_include, nones_to_add
|
|
2356
|
-
)
|
|
2357
|
-
else:
|
|
2358
|
-
##
|
|
2359
|
-
|
|
2360
|
-
return partial(
|
|
2361
|
-
ChildFilterLALR_NoPlaceholders, [(i, x) for i, x, _ in to_include]
|
|
2362
|
-
)
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
class AmbiguousExpander:
|
|
2366
|
-
#--
|
|
2367
|
-
|
|
2368
|
-
def __init__(self, to_expand, tree_class, node_builder):
|
|
2369
|
-
self.node_builder = node_builder
|
|
2370
|
-
self.tree_class = tree_class
|
|
2371
|
-
self.to_expand = to_expand
|
|
2372
|
-
|
|
2373
|
-
def __call__(self, children):
|
|
2374
|
-
def _is_ambig_tree(t):
|
|
2375
|
-
return hasattr(t, "data") and t.data == "_ambig"
|
|
2376
|
-
|
|
2377
|
-
##
|
|
2378
|
-
|
|
2379
|
-
##
|
|
2380
|
-
|
|
2381
|
-
##
|
|
2382
|
-
|
|
2383
|
-
##
|
|
2384
|
-
|
|
2385
|
-
ambiguous = []
|
|
2386
|
-
for i, child in enumerate(children):
|
|
2387
|
-
if _is_ambig_tree(child):
|
|
2388
|
-
if i in self.to_expand:
|
|
2389
|
-
ambiguous.append(i)
|
|
2390
|
-
|
|
2391
|
-
child.expand_kids_by_data("_ambig")
|
|
2392
|
-
|
|
2393
|
-
if not ambiguous:
|
|
2394
|
-
return self.node_builder(children)
|
|
2395
|
-
|
|
2396
|
-
expand = [
|
|
2397
|
-
child.children if i in ambiguous else (child,)
|
|
2398
|
-
for i, child in enumerate(children)
|
|
2399
|
-
]
|
|
2400
|
-
return self.tree_class(
|
|
2401
|
-
"_ambig", [self.node_builder(list(f)) for f in product(*expand)]
|
|
2402
|
-
)
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
def maybe_create_ambiguous_expander(tree_class, expansion, keep_all_tokens):
|
|
2406
|
-
to_expand = [
|
|
2407
|
-
i
|
|
2408
|
-
for i, sym in enumerate(expansion)
|
|
2409
|
-
if keep_all_tokens
|
|
2410
|
-
or ((not (sym.is_term and sym.filter_out)) and _should_expand(sym))
|
|
2411
|
-
]
|
|
2412
|
-
if to_expand:
|
|
2413
|
-
return partial(AmbiguousExpander, to_expand, tree_class)
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
class AmbiguousIntermediateExpander:
|
|
2417
|
-
#--
|
|
2418
|
-
|
|
2419
|
-
def __init__(self, tree_class, node_builder):
|
|
2420
|
-
self.node_builder = node_builder
|
|
2421
|
-
self.tree_class = tree_class
|
|
2422
|
-
|
|
2423
|
-
def __call__(self, children):
|
|
2424
|
-
def _is_iambig_tree(child):
|
|
2425
|
-
return hasattr(child, "data") and child.data == "_iambig"
|
|
2426
|
-
|
|
2427
|
-
def _collapse_iambig(children):
|
|
2428
|
-
#--
|
|
2429
|
-
|
|
2430
|
-
##
|
|
2431
|
-
|
|
2432
|
-
##
|
|
2433
|
-
|
|
2434
|
-
if children and _is_iambig_tree(children[0]):
|
|
2435
|
-
iambig_node = children[0]
|
|
2436
|
-
result = []
|
|
2437
|
-
for grandchild in iambig_node.children:
|
|
2438
|
-
collapsed = _collapse_iambig(grandchild.children)
|
|
2439
|
-
if collapsed:
|
|
2440
|
-
for child in collapsed:
|
|
2441
|
-
child.children += children[1:]
|
|
2442
|
-
result += collapsed
|
|
2443
|
-
else:
|
|
2444
|
-
new_tree = self.tree_class(
|
|
2445
|
-
"_inter", grandchild.children + children[1:]
|
|
2446
|
-
)
|
|
2447
|
-
result.append(new_tree)
|
|
2448
|
-
return result
|
|
2449
|
-
|
|
2450
|
-
collapsed = _collapse_iambig(children)
|
|
2451
|
-
if collapsed:
|
|
2452
|
-
processed_nodes = [self.node_builder(c.children) for c in collapsed]
|
|
2453
|
-
return self.tree_class("_ambig", processed_nodes)
|
|
2454
|
-
|
|
2455
|
-
return self.node_builder(children)
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
def inplace_transformer(func):
|
|
2459
|
-
@wraps(func)
|
|
2460
|
-
def f(children):
|
|
2461
|
-
##
|
|
2462
|
-
|
|
2463
|
-
tree = Tree(func.__name__, children)
|
|
2464
|
-
return func(tree)
|
|
2465
|
-
|
|
2466
|
-
return f
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
def apply_visit_wrapper(func, name, wrapper):
|
|
2470
|
-
if wrapper is _vargs_meta or wrapper is _vargs_meta_inline:
|
|
2471
|
-
raise NotImplementedError("Meta args not supported for internal transformer")
|
|
2472
|
-
|
|
2473
|
-
@wraps(func)
|
|
2474
|
-
def f(children):
|
|
2475
|
-
return wrapper(func, name, children, None)
|
|
2476
|
-
|
|
2477
|
-
return f
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
class ParseTreeBuilder:
|
|
2481
|
-
def __init__(
|
|
2482
|
-
self,
|
|
2483
|
-
rules,
|
|
2484
|
-
tree_class,
|
|
2485
|
-
propagate_positions=False,
|
|
2486
|
-
ambiguous=False,
|
|
2487
|
-
maybe_placeholders=False,
|
|
2488
|
-
):
|
|
2489
|
-
self.tree_class = tree_class
|
|
2490
|
-
self.propagate_positions = propagate_positions
|
|
2491
|
-
self.ambiguous = ambiguous
|
|
2492
|
-
self.maybe_placeholders = maybe_placeholders
|
|
2493
|
-
|
|
2494
|
-
self.rule_builders = list(self._init_builders(rules))
|
|
2495
|
-
|
|
2496
|
-
def _init_builders(self, rules):
|
|
2497
|
-
propagate_positions = make_propagate_positions(self.propagate_positions)
|
|
2498
|
-
|
|
2499
|
-
for rule in rules:
|
|
2500
|
-
options = rule.options
|
|
2501
|
-
keep_all_tokens = options.keep_all_tokens
|
|
2502
|
-
expand_single_child = options.expand1
|
|
2503
|
-
|
|
2504
|
-
wrapper_chain = list(
|
|
2505
|
-
filter(
|
|
2506
|
-
None,
|
|
2507
|
-
[
|
|
2508
|
-
(expand_single_child and not rule.alias) and ExpandSingleChild,
|
|
2509
|
-
maybe_create_child_filter(
|
|
2510
|
-
rule.expansion,
|
|
2511
|
-
keep_all_tokens,
|
|
2512
|
-
self.ambiguous,
|
|
2513
|
-
options.empty_indices if self.maybe_placeholders else None,
|
|
2514
|
-
),
|
|
2515
|
-
propagate_positions,
|
|
2516
|
-
self.ambiguous
|
|
2517
|
-
and maybe_create_ambiguous_expander(
|
|
2518
|
-
self.tree_class, rule.expansion, keep_all_tokens
|
|
2519
|
-
),
|
|
2520
|
-
self.ambiguous
|
|
2521
|
-
and partial(AmbiguousIntermediateExpander, self.tree_class),
|
|
2522
|
-
],
|
|
2523
|
-
)
|
|
2524
|
-
)
|
|
2525
|
-
|
|
2526
|
-
yield rule, wrapper_chain
|
|
2527
|
-
|
|
2528
|
-
def create_callback(self, transformer=None):
|
|
2529
|
-
callbacks = {}
|
|
2530
|
-
|
|
2531
|
-
default_handler = getattr(transformer, "__default__", None)
|
|
2532
|
-
if default_handler:
|
|
2533
|
-
|
|
2534
|
-
def default_callback(data, children):
|
|
2535
|
-
return default_handler(data, children, None)
|
|
2536
|
-
|
|
2537
|
-
else:
|
|
2538
|
-
default_callback = self.tree_class
|
|
2539
|
-
|
|
2540
|
-
for rule, wrapper_chain in self.rule_builders:
|
|
2541
|
-
|
|
2542
|
-
user_callback_name = (
|
|
2543
|
-
rule.alias or rule.options.template_source or rule.origin.name
|
|
2544
|
-
)
|
|
2545
|
-
try:
|
|
2546
|
-
f = getattr(transformer, user_callback_name)
|
|
2547
|
-
wrapper = getattr(f, "visit_wrapper", None)
|
|
2548
|
-
if wrapper is not None:
|
|
2549
|
-
f = apply_visit_wrapper(f, user_callback_name, wrapper)
|
|
2550
|
-
elif isinstance(transformer, Transformer_InPlace):
|
|
2551
|
-
f = inplace_transformer(f)
|
|
2552
|
-
except AttributeError:
|
|
2553
|
-
f = partial(default_callback, user_callback_name)
|
|
2554
|
-
|
|
2555
|
-
for w in wrapper_chain:
|
|
2556
|
-
f = w(f)
|
|
2557
|
-
|
|
2558
|
-
if rule in callbacks:
|
|
2559
|
-
raise GrammarError("Rule '%s' already exists" % (rule,))
|
|
2560
|
-
|
|
2561
|
-
callbacks[rule] = f
|
|
2562
|
-
|
|
2563
|
-
return callbacks
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
class Action:
|
|
2570
|
-
def __init__(self, name):
|
|
2571
|
-
self.name = name
|
|
2572
|
-
|
|
2573
|
-
def __str__(self):
|
|
2574
|
-
return self.name
|
|
2575
|
-
|
|
2576
|
-
def __repr__(self):
|
|
2577
|
-
return str(self)
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
Shift = Action("Shift")
|
|
2581
|
-
Reduce = Action("Reduce")
|
|
2582
|
-
|
|
2583
|
-
StateT = TypeVar("StateT")
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
class ParseTableBase(Generic[StateT]):
|
|
2587
|
-
states: Dict[StateT, Dict[str, Tuple]]
|
|
2588
|
-
start_states: Dict[str, StateT]
|
|
2589
|
-
end_states: Dict[str, StateT]
|
|
2590
|
-
|
|
2591
|
-
def __init__(self, states, start_states, end_states):
|
|
2592
|
-
self.states = states
|
|
2593
|
-
self.start_states = start_states
|
|
2594
|
-
self.end_states = end_states
|
|
2595
|
-
|
|
2596
|
-
def serialize(self, memo):
|
|
2597
|
-
tokens = Enumerator()
|
|
2598
|
-
|
|
2599
|
-
states = {
|
|
2600
|
-
state: {
|
|
2601
|
-
tokens.get(token): (
|
|
2602
|
-
(1, arg.serialize(memo)) if action is Reduce else (0, arg)
|
|
2603
|
-
)
|
|
2604
|
-
for token, (action, arg) in actions.items()
|
|
2605
|
-
}
|
|
2606
|
-
for state, actions in self.states.items()
|
|
2607
|
-
}
|
|
2608
|
-
|
|
2609
|
-
return {
|
|
2610
|
-
"tokens": tokens.reversed(),
|
|
2611
|
-
"states": states,
|
|
2612
|
-
"start_states": self.start_states,
|
|
2613
|
-
"end_states": self.end_states,
|
|
2614
|
-
}
|
|
2615
|
-
|
|
2616
|
-
@classmethod
|
|
2617
|
-
def deserialize(cls, data, memo):
|
|
2618
|
-
tokens = data["tokens"]
|
|
2619
|
-
states = {
|
|
2620
|
-
state: {
|
|
2621
|
-
tokens[token]: (
|
|
2622
|
-
(Reduce, Rule.deserialize(arg, memo))
|
|
2623
|
-
if action == 1
|
|
2624
|
-
else (Shift, arg)
|
|
2625
|
-
)
|
|
2626
|
-
for token, (action, arg) in actions.items()
|
|
2627
|
-
}
|
|
2628
|
-
for state, actions in data["states"].items()
|
|
2629
|
-
}
|
|
2630
|
-
return cls(states, data["start_states"], data["end_states"])
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
class ParseTable(ParseTableBase["State"]):
|
|
2634
|
-
#--
|
|
2635
|
-
|
|
2636
|
-
pass
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
class IntParseTable(ParseTableBase[int]):
|
|
2640
|
-
#--
|
|
2641
|
-
|
|
2642
|
-
@classmethod
|
|
2643
|
-
def from_ParseTable(cls, parse_table: ParseTable):
|
|
2644
|
-
enum = list(parse_table.states)
|
|
2645
|
-
state_to_idx: Dict["State", int] = {s: i for i, s in enumerate(enum)}
|
|
2646
|
-
int_states = {}
|
|
2647
|
-
|
|
2648
|
-
for s, la in parse_table.states.items():
|
|
2649
|
-
la = {
|
|
2650
|
-
k: (v[0], state_to_idx[v[1]]) if v[0] is Shift else v
|
|
2651
|
-
for k, v in la.items()
|
|
2652
|
-
}
|
|
2653
|
-
int_states[state_to_idx[s]] = la
|
|
2654
|
-
|
|
2655
|
-
start_states = {
|
|
2656
|
-
start: state_to_idx[s] for start, s in parse_table.start_states.items()
|
|
2657
|
-
}
|
|
2658
|
-
end_states = {
|
|
2659
|
-
start: state_to_idx[s] for start, s in parse_table.end_states.items()
|
|
2660
|
-
}
|
|
2661
|
-
return cls(int_states, start_states, end_states)
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
class ParseConf(Generic[StateT]):
|
|
2668
|
-
__slots__ = (
|
|
2669
|
-
"parse_table",
|
|
2670
|
-
"callbacks",
|
|
2671
|
-
"start",
|
|
2672
|
-
"start_state",
|
|
2673
|
-
"end_state",
|
|
2674
|
-
"states",
|
|
2675
|
-
)
|
|
2676
|
-
|
|
2677
|
-
parse_table: ParseTableBase[StateT]
|
|
2678
|
-
callbacks: ParserCallbacks
|
|
2679
|
-
start: str
|
|
2680
|
-
|
|
2681
|
-
start_state: StateT
|
|
2682
|
-
end_state: StateT
|
|
2683
|
-
states: Dict[StateT, Dict[str, tuple]]
|
|
2684
|
-
|
|
2685
|
-
def __init__(
|
|
2686
|
-
self,
|
|
2687
|
-
parse_table: ParseTableBase[StateT],
|
|
2688
|
-
callbacks: ParserCallbacks,
|
|
2689
|
-
start: str,
|
|
2690
|
-
):
|
|
2691
|
-
self.parse_table = parse_table
|
|
2692
|
-
|
|
2693
|
-
self.start_state = self.parse_table.start_states[start]
|
|
2694
|
-
self.end_state = self.parse_table.end_states[start]
|
|
2695
|
-
self.states = self.parse_table.states
|
|
2696
|
-
|
|
2697
|
-
self.callbacks = callbacks
|
|
2698
|
-
self.start = start
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
class ParserState(Generic[StateT]):
|
|
2702
|
-
__slots__ = "parse_conf", "lexer", "state_stack", "value_stack"
|
|
2703
|
-
|
|
2704
|
-
parse_conf: ParseConf[StateT]
|
|
2705
|
-
lexer: LexerThread
|
|
2706
|
-
state_stack: List[StateT]
|
|
2707
|
-
value_stack: list
|
|
2708
|
-
|
|
2709
|
-
def __init__(
|
|
2710
|
-
self,
|
|
2711
|
-
parse_conf: ParseConf[StateT],
|
|
2712
|
-
lexer: LexerThread,
|
|
2713
|
-
state_stack=None,
|
|
2714
|
-
value_stack=None,
|
|
2715
|
-
):
|
|
2716
|
-
self.parse_conf = parse_conf
|
|
2717
|
-
self.lexer = lexer
|
|
2718
|
-
self.state_stack = state_stack or [self.parse_conf.start_state]
|
|
2719
|
-
self.value_stack = value_stack or []
|
|
2720
|
-
|
|
2721
|
-
@property
|
|
2722
|
-
def position(self) -> StateT:
|
|
2723
|
-
return self.state_stack[-1]
|
|
2724
|
-
|
|
2725
|
-
##
|
|
2726
|
-
|
|
2727
|
-
def __eq__(self, other) -> bool:
|
|
2728
|
-
if not isinstance(other, ParserState):
|
|
2729
|
-
return NotImplemented
|
|
2730
|
-
return (
|
|
2731
|
-
len(self.state_stack) == len(other.state_stack)
|
|
2732
|
-
and self.position == other.position
|
|
2733
|
-
)
|
|
2734
|
-
|
|
2735
|
-
def __copy__(self):
|
|
2736
|
-
return type(self)(
|
|
2737
|
-
self.parse_conf,
|
|
2738
|
-
self.lexer, ##
|
|
2739
|
-
|
|
2740
|
-
copy(self.state_stack),
|
|
2741
|
-
deepcopy(self.value_stack),
|
|
2742
|
-
)
|
|
2743
|
-
|
|
2744
|
-
def copy(self) -> "ParserState[StateT]":
|
|
2745
|
-
return copy(self)
|
|
2746
|
-
|
|
2747
|
-
def feed_token(self, token: Token, is_end=False) -> Any:
|
|
2748
|
-
state_stack = self.state_stack
|
|
2749
|
-
value_stack = self.value_stack
|
|
2750
|
-
states = self.parse_conf.states
|
|
2751
|
-
end_state = self.parse_conf.end_state
|
|
2752
|
-
callbacks = self.parse_conf.callbacks
|
|
2753
|
-
|
|
2754
|
-
while True:
|
|
2755
|
-
state = state_stack[-1]
|
|
2756
|
-
try:
|
|
2757
|
-
action, arg = states[state][token.type]
|
|
2758
|
-
except KeyError:
|
|
2759
|
-
expected = {s for s in states[state].keys() if s.isupper()}
|
|
2760
|
-
raise UnexpectedToken(
|
|
2761
|
-
token, expected, state=self, interactive_parser=None
|
|
2762
|
-
)
|
|
2763
|
-
|
|
2764
|
-
assert arg != end_state
|
|
2765
|
-
|
|
2766
|
-
if action is Shift:
|
|
2767
|
-
##
|
|
2768
|
-
|
|
2769
|
-
assert not is_end
|
|
2770
|
-
state_stack.append(arg)
|
|
2771
|
-
value_stack.append(
|
|
2772
|
-
token
|
|
2773
|
-
if token.type not in callbacks
|
|
2774
|
-
else callbacks[token.type](token)
|
|
2775
|
-
)
|
|
2776
|
-
return
|
|
2777
|
-
else:
|
|
2778
|
-
##
|
|
2779
|
-
|
|
2780
|
-
rule = arg
|
|
2781
|
-
size = len(rule.expansion)
|
|
2782
|
-
if size:
|
|
2783
|
-
s = value_stack[-size:]
|
|
2784
|
-
del state_stack[-size:]
|
|
2785
|
-
del value_stack[-size:]
|
|
2786
|
-
else:
|
|
2787
|
-
s = []
|
|
2788
|
-
|
|
2789
|
-
value = callbacks[rule](s) if callbacks else s
|
|
2790
|
-
|
|
2791
|
-
_action, new_state = states[state_stack[-1]][rule.origin.name]
|
|
2792
|
-
assert _action is Shift
|
|
2793
|
-
state_stack.append(new_state)
|
|
2794
|
-
value_stack.append(value)
|
|
2795
|
-
|
|
2796
|
-
if is_end and state_stack[-1] == end_state:
|
|
2797
|
-
return value_stack[-1]
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
class LALR_Parser(Serialize):
|
|
2804
|
-
def __init__(
|
|
2805
|
-
self, parser_conf: ParserConf, debug: bool = False, strict: bool = False
|
|
2806
|
-
):
|
|
2807
|
-
analysis = LALR_Analyzer(parser_conf, debug=debug, strict=strict)
|
|
2808
|
-
analysis.compute_lalr()
|
|
2809
|
-
callbacks = parser_conf.callbacks
|
|
2810
|
-
|
|
2811
|
-
self._parse_table = analysis.parse_table
|
|
2812
|
-
self.parser_conf = parser_conf
|
|
2813
|
-
self.parser = _Parser(analysis.parse_table, callbacks, debug)
|
|
2814
|
-
|
|
2815
|
-
@classmethod
|
|
2816
|
-
def deserialize(cls, data, memo, callbacks, debug=False):
|
|
2817
|
-
inst = cls.__new__(cls)
|
|
2818
|
-
inst._parse_table = IntParseTable.deserialize(data, memo)
|
|
2819
|
-
inst.parser = _Parser(inst._parse_table, callbacks, debug)
|
|
2820
|
-
return inst
|
|
2821
|
-
|
|
2822
|
-
def serialize(self, memo: Any = None) -> Dict[str, Any]:
|
|
2823
|
-
return self._parse_table.serialize(memo)
|
|
2824
|
-
|
|
2825
|
-
def parse_interactive(self, lexer: LexerThread, start: str):
|
|
2826
|
-
return self.parser.parse(lexer, start, start_interactive=True)
|
|
2827
|
-
|
|
2828
|
-
def parse(self, lexer, start, on_error=None):
|
|
2829
|
-
try:
|
|
2830
|
-
return self.parser.parse(lexer, start)
|
|
2831
|
-
except UnexpectedInput as e:
|
|
2832
|
-
if on_error is None:
|
|
2833
|
-
raise
|
|
2834
|
-
|
|
2835
|
-
while True:
|
|
2836
|
-
if isinstance(e, UnexpectedCharacters):
|
|
2837
|
-
s = e.interactive_parser.lexer_thread.state
|
|
2838
|
-
p = s.line_ctr.char_pos
|
|
2839
|
-
|
|
2840
|
-
if not on_error(e):
|
|
2841
|
-
raise e
|
|
2842
|
-
|
|
2843
|
-
if isinstance(e, UnexpectedCharacters):
|
|
2844
|
-
##
|
|
2845
|
-
|
|
2846
|
-
if p == s.line_ctr.char_pos:
|
|
2847
|
-
s.line_ctr.feed(s.text[p : p + 1])
|
|
2848
|
-
|
|
2849
|
-
try:
|
|
2850
|
-
return e.interactive_parser.resume_parse()
|
|
2851
|
-
except UnexpectedToken as e2:
|
|
2852
|
-
if (
|
|
2853
|
-
isinstance(e, UnexpectedToken)
|
|
2854
|
-
and e.token.type == e2.token.type == "$END"
|
|
2855
|
-
and e.interactive_parser == e2.interactive_parser
|
|
2856
|
-
):
|
|
2857
|
-
##
|
|
2858
|
-
|
|
2859
|
-
raise e2
|
|
2860
|
-
e = e2
|
|
2861
|
-
except UnexpectedCharacters as e2:
|
|
2862
|
-
e = e2
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
class _Parser:
|
|
2866
|
-
parse_table: ParseTableBase
|
|
2867
|
-
callbacks: ParserCallbacks
|
|
2868
|
-
debug: bool
|
|
2869
|
-
|
|
2870
|
-
def __init__(
|
|
2871
|
-
self,
|
|
2872
|
-
parse_table: ParseTableBase,
|
|
2873
|
-
callbacks: ParserCallbacks,
|
|
2874
|
-
debug: bool = False,
|
|
2875
|
-
):
|
|
2876
|
-
self.parse_table = parse_table
|
|
2877
|
-
self.callbacks = callbacks
|
|
2878
|
-
self.debug = debug
|
|
2879
|
-
|
|
2880
|
-
def parse(
|
|
2881
|
-
self,
|
|
2882
|
-
lexer: LexerThread,
|
|
2883
|
-
start: str,
|
|
2884
|
-
value_stack=None,
|
|
2885
|
-
state_stack=None,
|
|
2886
|
-
start_interactive=False,
|
|
2887
|
-
):
|
|
2888
|
-
parse_conf = ParseConf(self.parse_table, self.callbacks, start)
|
|
2889
|
-
parser_state = ParserState(parse_conf, lexer, state_stack, value_stack)
|
|
2890
|
-
if start_interactive:
|
|
2891
|
-
return InteractiveParser(self, parser_state, parser_state.lexer)
|
|
2892
|
-
return self.parse_from_state(parser_state)
|
|
2893
|
-
|
|
2894
|
-
def parse_from_state(self, state: ParserState, last_token: Optional[Token] = None):
|
|
2895
|
-
#--
|
|
2896
|
-
try:
|
|
2897
|
-
token = last_token
|
|
2898
|
-
for token in state.lexer.lex(state):
|
|
2899
|
-
assert token is not None
|
|
2900
|
-
state.feed_token(token)
|
|
2901
|
-
|
|
2902
|
-
end_token = (
|
|
2903
|
-
Token.new_borrow_pos("$END", "", token)
|
|
2904
|
-
if token
|
|
2905
|
-
else Token("$END", "", 0, 1, 1)
|
|
2906
|
-
)
|
|
2907
|
-
return state.feed_token(end_token, True)
|
|
2908
|
-
except UnexpectedInput as e:
|
|
2909
|
-
try:
|
|
2910
|
-
e.interactive_parser = InteractiveParser(self, state, state.lexer)
|
|
2911
|
-
except NameError:
|
|
2912
|
-
pass
|
|
2913
|
-
raise e
|
|
2914
|
-
except Exception as e:
|
|
2915
|
-
if self.debug:
|
|
2916
|
-
print("")
|
|
2917
|
-
print("STATE STACK DUMP")
|
|
2918
|
-
print("----------------")
|
|
2919
|
-
for i, s in enumerate(state.state_stack):
|
|
2920
|
-
print("%d)" % i, s)
|
|
2921
|
-
print("")
|
|
2922
|
-
|
|
2923
|
-
raise
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
class InteractiveParser:
|
|
2930
|
-
#--
|
|
2931
|
-
|
|
2932
|
-
def __init__(self, parser, parser_state, lexer_thread: LexerThread):
|
|
2933
|
-
self.parser = parser
|
|
2934
|
-
self.parser_state = parser_state
|
|
2935
|
-
self.lexer_thread = lexer_thread
|
|
2936
|
-
self.result = None
|
|
2937
|
-
|
|
2938
|
-
@property
|
|
2939
|
-
def lexer_state(self) -> LexerThread:
|
|
2940
|
-
warnings.warn(
|
|
2941
|
-
"lexer_state will be removed in subsequent releases. Use lexer_thread instead.",
|
|
2942
|
-
DeprecationWarning,
|
|
2943
|
-
)
|
|
2944
|
-
return self.lexer_thread
|
|
2945
|
-
|
|
2946
|
-
def feed_token(self, token: Token):
|
|
2947
|
-
#--
|
|
2948
|
-
return self.parser_state.feed_token(token, token.type == "$END")
|
|
2949
|
-
|
|
2950
|
-
def iter_parse(self) -> Iterator[Token]:
|
|
2951
|
-
#--
|
|
2952
|
-
for token in self.lexer_thread.lex(self.parser_state):
|
|
2953
|
-
yield token
|
|
2954
|
-
self.result = self.feed_token(token)
|
|
2955
|
-
|
|
2956
|
-
def exhaust_lexer(self) -> List[Token]:
|
|
2957
|
-
#--
|
|
2958
|
-
return list(self.iter_parse())
|
|
2959
|
-
|
|
2960
|
-
def feed_eof(self, last_token=None):
|
|
2961
|
-
#--
|
|
2962
|
-
eof = (
|
|
2963
|
-
Token.new_borrow_pos("$END", "", last_token)
|
|
2964
|
-
if last_token is not None
|
|
2965
|
-
else self.lexer_thread._Token("$END", "", 0, 1, 1)
|
|
2966
|
-
)
|
|
2967
|
-
return self.feed_token(eof)
|
|
2968
|
-
|
|
2969
|
-
def __copy__(self):
|
|
2970
|
-
#--
|
|
2971
|
-
return type(self)(
|
|
2972
|
-
self.parser,
|
|
2973
|
-
copy(self.parser_state),
|
|
2974
|
-
copy(self.lexer_thread),
|
|
2975
|
-
)
|
|
2976
|
-
|
|
2977
|
-
def copy(self):
|
|
2978
|
-
return copy(self)
|
|
2979
|
-
|
|
2980
|
-
def __eq__(self, other):
|
|
2981
|
-
if not isinstance(other, InteractiveParser):
|
|
2982
|
-
return False
|
|
2983
|
-
|
|
2984
|
-
return (
|
|
2985
|
-
self.parser_state == other.parser_state
|
|
2986
|
-
and self.lexer_thread == other.lexer_thread
|
|
2987
|
-
)
|
|
2988
|
-
|
|
2989
|
-
def as_immutable(self):
|
|
2990
|
-
#--
|
|
2991
|
-
p = copy(self)
|
|
2992
|
-
return ImmutableInteractiveParser(p.parser, p.parser_state, p.lexer_thread)
|
|
2993
|
-
|
|
2994
|
-
def pretty(self):
|
|
2995
|
-
#--
|
|
2996
|
-
out = ["Parser choices:"]
|
|
2997
|
-
for k, v in self.choices().items():
|
|
2998
|
-
out.append("\t- %s -> %r" % (k, v))
|
|
2999
|
-
out.append("stack size: %s" % len(self.parser_state.state_stack))
|
|
3000
|
-
return "\n".join(out)
|
|
3001
|
-
|
|
3002
|
-
def choices(self):
|
|
3003
|
-
#--
|
|
3004
|
-
return self.parser_state.parse_conf.parse_table.states[
|
|
3005
|
-
self.parser_state.position
|
|
3006
|
-
]
|
|
3007
|
-
|
|
3008
|
-
def accepts(self):
|
|
3009
|
-
#--
|
|
3010
|
-
accepts = set()
|
|
3011
|
-
conf_no_callbacks = copy(self.parser_state.parse_conf)
|
|
3012
|
-
##
|
|
3013
|
-
|
|
3014
|
-
##
|
|
3015
|
-
|
|
3016
|
-
conf_no_callbacks.callbacks = {}
|
|
3017
|
-
for t in self.choices():
|
|
3018
|
-
if t.isupper(): ##
|
|
3019
|
-
|
|
3020
|
-
new_cursor = copy(self)
|
|
3021
|
-
new_cursor.parser_state.parse_conf = conf_no_callbacks
|
|
3022
|
-
try:
|
|
3023
|
-
new_cursor.feed_token(self.lexer_thread._Token(t, ""))
|
|
3024
|
-
except UnexpectedToken:
|
|
3025
|
-
pass
|
|
3026
|
-
else:
|
|
3027
|
-
accepts.add(t)
|
|
3028
|
-
return accepts
|
|
3029
|
-
|
|
3030
|
-
def resume_parse(self):
|
|
3031
|
-
#--
|
|
3032
|
-
return self.parser.parse_from_state(
|
|
3033
|
-
self.parser_state, last_token=self.lexer_thread.state.last_token
|
|
3034
|
-
)
|
|
3035
|
-
|
|
3036
|
-
|
|
3037
|
-
class ImmutableInteractiveParser(InteractiveParser):
|
|
3038
|
-
#--
|
|
3039
|
-
|
|
3040
|
-
result = None
|
|
3041
|
-
|
|
3042
|
-
def __hash__(self):
|
|
3043
|
-
return hash((self.parser_state, self.lexer_thread))
|
|
3044
|
-
|
|
3045
|
-
def feed_token(self, token):
|
|
3046
|
-
c = copy(self)
|
|
3047
|
-
c.result = InteractiveParser.feed_token(c, token)
|
|
3048
|
-
return c
|
|
3049
|
-
|
|
3050
|
-
def exhaust_lexer(self):
|
|
3051
|
-
#--
|
|
3052
|
-
cursor = self.as_mutable()
|
|
3053
|
-
cursor.exhaust_lexer()
|
|
3054
|
-
return cursor.as_immutable()
|
|
3055
|
-
|
|
3056
|
-
def as_mutable(self):
|
|
3057
|
-
#--
|
|
3058
|
-
p = copy(self)
|
|
3059
|
-
return InteractiveParser(p.parser, p.parser_state, p.lexer_thread)
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
def _wrap_lexer(lexer_class):
|
|
3066
|
-
future_interface = getattr(lexer_class, "__future_interface__", False)
|
|
3067
|
-
if future_interface:
|
|
3068
|
-
return lexer_class
|
|
3069
|
-
else:
|
|
3070
|
-
|
|
3071
|
-
class CustomLexerWrapper(Lexer):
|
|
3072
|
-
def __init__(self, lexer_conf):
|
|
3073
|
-
self.lexer = lexer_class(lexer_conf)
|
|
3074
|
-
|
|
3075
|
-
def lex(self, lexer_state, parser_state):
|
|
3076
|
-
return self.lexer.lex(lexer_state.text)
|
|
3077
|
-
|
|
3078
|
-
return CustomLexerWrapper
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
def _deserialize_parsing_frontend(data, memo, lexer_conf, callbacks, options):
|
|
3082
|
-
parser_conf = ParserConf.deserialize(data["parser_conf"], memo)
|
|
3083
|
-
cls = (options and options._plugins.get("LALR_Parser")) or LALR_Parser
|
|
3084
|
-
parser = cls.deserialize(data["parser"], memo, callbacks, options.debug)
|
|
3085
|
-
parser_conf.callbacks = callbacks
|
|
3086
|
-
return ParsingFrontend(lexer_conf, parser_conf, options, parser=parser)
|
|
3087
|
-
|
|
3088
|
-
|
|
3089
|
-
_parser_creators: "Dict[str, Callable[[LexerConf, Any, Any], Any]]" = {}
|
|
3090
|
-
|
|
3091
|
-
|
|
3092
|
-
class ParsingFrontend(Serialize):
|
|
3093
|
-
__serialize_fields__ = "lexer_conf", "parser_conf", "parser"
|
|
3094
|
-
|
|
3095
|
-
lexer_conf: LexerConf
|
|
3096
|
-
parser_conf: ParserConf
|
|
3097
|
-
options: Any
|
|
3098
|
-
|
|
3099
|
-
def __init__(
|
|
3100
|
-
self, lexer_conf: LexerConf, parser_conf: ParserConf, options, parser=None
|
|
3101
|
-
):
|
|
3102
|
-
self.parser_conf = parser_conf
|
|
3103
|
-
self.lexer_conf = lexer_conf
|
|
3104
|
-
self.options = options
|
|
3105
|
-
|
|
3106
|
-
##
|
|
3107
|
-
|
|
3108
|
-
if parser: ##
|
|
3109
|
-
|
|
3110
|
-
self.parser = parser
|
|
3111
|
-
else:
|
|
3112
|
-
create_parser = _parser_creators.get(parser_conf.parser_type)
|
|
3113
|
-
assert (
|
|
3114
|
-
create_parser is not None
|
|
3115
|
-
), "{} is not supported in standalone mode".format(parser_conf.parser_type)
|
|
3116
|
-
self.parser = create_parser(lexer_conf, parser_conf, options)
|
|
3117
|
-
|
|
3118
|
-
##
|
|
3119
|
-
|
|
3120
|
-
lexer_type = lexer_conf.lexer_type
|
|
3121
|
-
self.skip_lexer = False
|
|
3122
|
-
if lexer_type in ("dynamic", "dynamic_complete"):
|
|
3123
|
-
assert lexer_conf.postlex is None
|
|
3124
|
-
self.skip_lexer = True
|
|
3125
|
-
return
|
|
3126
|
-
|
|
3127
|
-
if isinstance(lexer_type, type):
|
|
3128
|
-
assert issubclass(lexer_type, Lexer)
|
|
3129
|
-
self.lexer = _wrap_lexer(lexer_type)(lexer_conf)
|
|
3130
|
-
elif isinstance(lexer_type, str):
|
|
3131
|
-
create_lexer = {
|
|
3132
|
-
"basic": create_basic_lexer,
|
|
3133
|
-
"contextual": create_contextual_lexer,
|
|
3134
|
-
}[lexer_type]
|
|
3135
|
-
self.lexer = create_lexer(
|
|
3136
|
-
lexer_conf, self.parser, lexer_conf.postlex, options
|
|
3137
|
-
)
|
|
3138
|
-
else:
|
|
3139
|
-
raise TypeError("Bad value for lexer_type: {lexer_type}")
|
|
3140
|
-
|
|
3141
|
-
if lexer_conf.postlex:
|
|
3142
|
-
self.lexer = PostLexConnector(self.lexer, lexer_conf.postlex)
|
|
3143
|
-
|
|
3144
|
-
def _verify_start(self, start=None):
|
|
3145
|
-
if start is None:
|
|
3146
|
-
start_decls = self.parser_conf.start
|
|
3147
|
-
if len(start_decls) > 1:
|
|
3148
|
-
raise ConfigurationError(
|
|
3149
|
-
"Lark initialized with more than 1 possible start rule. Must specify which start rule to parse",
|
|
3150
|
-
start_decls,
|
|
3151
|
-
)
|
|
3152
|
-
(start,) = start_decls
|
|
3153
|
-
elif start not in self.parser_conf.start:
|
|
3154
|
-
raise ConfigurationError(
|
|
3155
|
-
"Unknown start rule %s. Must be one of %r"
|
|
3156
|
-
% (start, self.parser_conf.start)
|
|
3157
|
-
)
|
|
3158
|
-
return start
|
|
3159
|
-
|
|
3160
|
-
def _make_lexer_thread(self, text: str) -> Union[str, LexerThread]:
|
|
3161
|
-
cls = (self.options and self.options._plugins.get("LexerThread")) or LexerThread
|
|
3162
|
-
return text if self.skip_lexer else cls.from_text(self.lexer, text)
|
|
3163
|
-
|
|
3164
|
-
def parse(self, text: str, start=None, on_error=None):
|
|
3165
|
-
chosen_start = self._verify_start(start)
|
|
3166
|
-
kw = {} if on_error is None else {"on_error": on_error}
|
|
3167
|
-
stream = self._make_lexer_thread(text)
|
|
3168
|
-
return self.parser.parse(stream, chosen_start, **kw)
|
|
3169
|
-
|
|
3170
|
-
def parse_interactive(self, text: Optional[str] = None, start=None):
|
|
3171
|
-
##
|
|
3172
|
-
|
|
3173
|
-
##
|
|
3174
|
-
|
|
3175
|
-
chosen_start = self._verify_start(start)
|
|
3176
|
-
if self.parser_conf.parser_type != "lalr":
|
|
3177
|
-
raise ConfigurationError(
|
|
3178
|
-
"parse_interactive() currently only works with parser='lalr' "
|
|
3179
|
-
)
|
|
3180
|
-
stream = self._make_lexer_thread(text) ##
|
|
3181
|
-
|
|
3182
|
-
return self.parser.parse_interactive(stream, chosen_start)
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
def _validate_frontend_args(parser, lexer) -> None:
|
|
3186
|
-
assert_config(parser, ("lalr", "earley", "cyk"))
|
|
3187
|
-
if not isinstance(lexer, type): ##
|
|
3188
|
-
|
|
3189
|
-
expected = {
|
|
3190
|
-
"lalr": ("basic", "contextual"),
|
|
3191
|
-
"earley": ("basic", "dynamic", "dynamic_complete"),
|
|
3192
|
-
"cyk": ("basic",),
|
|
3193
|
-
}[parser]
|
|
3194
|
-
assert_config(
|
|
3195
|
-
lexer,
|
|
3196
|
-
expected,
|
|
3197
|
-
"Parser %r does not support lexer %%r, expected one of %%s" % parser,
|
|
3198
|
-
)
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
def _get_lexer_callbacks(transformer, terminals):
|
|
3202
|
-
result = {}
|
|
3203
|
-
for terminal in terminals:
|
|
3204
|
-
callback = getattr(transformer, terminal.name, None)
|
|
3205
|
-
if callback is not None:
|
|
3206
|
-
result[terminal.name] = callback
|
|
3207
|
-
return result
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
class PostLexConnector:
|
|
3211
|
-
def __init__(self, lexer, postlexer):
|
|
3212
|
-
self.lexer = lexer
|
|
3213
|
-
self.postlexer = postlexer
|
|
3214
|
-
|
|
3215
|
-
def lex(self, lexer_state, parser_state):
|
|
3216
|
-
i = self.lexer.lex(lexer_state, parser_state)
|
|
3217
|
-
return self.postlexer.process(i)
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
def create_basic_lexer(lexer_conf, parser, postlex, options) -> BasicLexer:
|
|
3221
|
-
cls = (options and options._plugins.get("BasicLexer")) or BasicLexer
|
|
3222
|
-
return cls(lexer_conf)
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
def create_contextual_lexer(
|
|
3226
|
-
lexer_conf: LexerConf, parser, postlex, options
|
|
3227
|
-
) -> ContextualLexer:
|
|
3228
|
-
cls = (options and options._plugins.get("ContextualLexer")) or ContextualLexer
|
|
3229
|
-
parse_table: ParseTableBase[int] = parser._parse_table
|
|
3230
|
-
states: Dict[int, Collection[str]] = {
|
|
3231
|
-
idx: list(t.keys()) for idx, t in parse_table.states.items()
|
|
3232
|
-
}
|
|
3233
|
-
always_accept: Collection[str] = postlex.always_accept if postlex else ()
|
|
3234
|
-
return cls(lexer_conf, states, always_accept=always_accept)
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
def create_lalr_parser(
|
|
3238
|
-
lexer_conf: LexerConf, parser_conf: ParserConf, options=None
|
|
3239
|
-
) -> LALR_Parser:
|
|
3240
|
-
debug = options.debug if options else False
|
|
3241
|
-
strict = options.strict if options else False
|
|
3242
|
-
cls = (options and options._plugins.get("LALR_Parser")) or LALR_Parser
|
|
3243
|
-
return cls(parser_conf, debug=debug, strict=strict)
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
_parser_creators["lalr"] = create_lalr_parser
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
class PostLex(ABC):
|
|
3252
|
-
@abstractmethod
|
|
3253
|
-
def process(self, stream: Iterator[Token]) -> Iterator[Token]:
|
|
3254
|
-
return stream
|
|
3255
|
-
|
|
3256
|
-
always_accept: Iterable[str] = ()
|
|
3257
|
-
|
|
3258
|
-
|
|
3259
|
-
class LarkOptions(Serialize):
|
|
3260
|
-
#--
|
|
3261
|
-
|
|
3262
|
-
start: List[str]
|
|
3263
|
-
debug: bool
|
|
3264
|
-
strict: bool
|
|
3265
|
-
transformer: "Optional[Transformer]"
|
|
3266
|
-
propagate_positions: Union[bool, str]
|
|
3267
|
-
maybe_placeholders: bool
|
|
3268
|
-
cache: Union[bool, str]
|
|
3269
|
-
regex: bool
|
|
3270
|
-
g_regex_flags: int
|
|
3271
|
-
keep_all_tokens: bool
|
|
3272
|
-
tree_class: Optional[Callable[[str, List], Any]]
|
|
3273
|
-
parser: _ParserArgType
|
|
3274
|
-
lexer: _LexerArgType
|
|
3275
|
-
ambiguity: 'Literal["auto", "resolve", "explicit", "forest"]'
|
|
3276
|
-
postlex: Optional[PostLex]
|
|
3277
|
-
priority: 'Optional[Literal["auto", "normal", "invert"]]'
|
|
3278
|
-
lexer_callbacks: Dict[str, Callable[[Token], Token]]
|
|
3279
|
-
use_bytes: bool
|
|
3280
|
-
ordered_sets: bool
|
|
3281
|
-
edit_terminals: Optional[Callable[[TerminalDef], TerminalDef]]
|
|
3282
|
-
import_paths: "List[Union[str, Callable[[Union[None, str, PackageResource], str], Tuple[str, str]]]]"
|
|
3283
|
-
source_path: Optional[str]
|
|
3284
|
-
|
|
3285
|
-
OPTIONS_DOC = r"""
|
|
3286
|
-
**=== General Options ===**
|
|
3287
|
-
|
|
3288
|
-
start
|
|
3289
|
-
The start symbol. Either a string, or a list of strings for multiple possible starts (Default: "start")
|
|
3290
|
-
debug
|
|
3291
|
-
Display debug information and extra warnings. Use only when debugging (Default: ``False``)
|
|
3292
|
-
When used with Earley, it generates a forest graph as "sppf.png", if 'dot' is installed.
|
|
3293
|
-
strict
|
|
3294
|
-
Throw an exception on any potential ambiguity, including shift/reduce conflicts, and regex collisions.
|
|
3295
|
-
transformer
|
|
3296
|
-
Applies the transformer to every parse tree (equivalent to applying it after the parse, but faster)
|
|
3297
|
-
propagate_positions
|
|
3298
|
-
Propagates positional attributes into the 'meta' attribute of all tree branches.
|
|
3299
|
-
Sets attributes: (line, column, end_line, end_column, start_pos, end_pos,
|
|
3300
|
-
container_line, container_column, container_end_line, container_end_column)
|
|
3301
|
-
Accepts ``False``, ``True``, or a callable, which will filter which nodes to ignore when propagating.
|
|
3302
|
-
maybe_placeholders
|
|
3303
|
-
When ``True``, the ``[]`` operator returns ``None`` when not matched.
|
|
3304
|
-
When ``False``, ``[]`` behaves like the ``?`` operator, and returns no value at all.
|
|
3305
|
-
(default= ``True``)
|
|
3306
|
-
cache
|
|
3307
|
-
Cache the results of the Lark grammar analysis, for x2 to x3 faster loading. LALR only for now.
|
|
3308
|
-
|
|
3309
|
-
- When ``False``, does nothing (default)
|
|
3310
|
-
- When ``True``, caches to a temporary file in the local directory
|
|
3311
|
-
- When given a string, caches to the path pointed by the string
|
|
3312
|
-
regex
|
|
3313
|
-
When True, uses the ``regex`` module instead of the stdlib ``re``.
|
|
3314
|
-
g_regex_flags
|
|
3315
|
-
Flags that are applied to all terminals (both regex and strings)
|
|
3316
|
-
keep_all_tokens
|
|
3317
|
-
Prevent the tree builder from automagically removing "punctuation" tokens (Default: ``False``)
|
|
3318
|
-
tree_class
|
|
3319
|
-
Lark will produce trees comprised of instances of this class instead of the default ``lark.Tree``.
|
|
3320
|
-
|
|
3321
|
-
**=== Algorithm Options ===**
|
|
3322
|
-
|
|
3323
|
-
parser
|
|
3324
|
-
Decides which parser engine to use. Accepts "earley" or "lalr". (Default: "earley").
|
|
3325
|
-
(there is also a "cyk" option for legacy)
|
|
3326
|
-
lexer
|
|
3327
|
-
Decides whether or not to use a lexer stage
|
|
3328
|
-
|
|
3329
|
-
- "auto" (default): Choose for me based on the parser
|
|
3330
|
-
- "basic": Use a basic lexer
|
|
3331
|
-
- "contextual": Stronger lexer (only works with parser="lalr")
|
|
3332
|
-
- "dynamic": Flexible and powerful (only with parser="earley")
|
|
3333
|
-
- "dynamic_complete": Same as dynamic, but tries *every* variation of tokenizing possible.
|
|
3334
|
-
ambiguity
|
|
3335
|
-
Decides how to handle ambiguity in the parse. Only relevant if parser="earley"
|
|
3336
|
-
|
|
3337
|
-
- "resolve": The parser will automatically choose the simplest derivation
|
|
3338
|
-
(it chooses consistently: greedy for tokens, non-greedy for rules)
|
|
3339
|
-
- "explicit": The parser will return all derivations wrapped in "_ambig" tree nodes (i.e. a forest).
|
|
3340
|
-
- "forest": The parser will return the root of the shared packed parse forest.
|
|
3341
|
-
|
|
3342
|
-
**=== Misc. / Domain Specific Options ===**
|
|
3343
|
-
|
|
3344
|
-
postlex
|
|
3345
|
-
Lexer post-processing (Default: ``None``) Only works with the basic and contextual lexers.
|
|
3346
|
-
priority
|
|
3347
|
-
How priorities should be evaluated - "auto", ``None``, "normal", "invert" (Default: "auto")
|
|
3348
|
-
lexer_callbacks
|
|
3349
|
-
Dictionary of callbacks for the lexer. May alter tokens during lexing. Use with caution.
|
|
3350
|
-
use_bytes
|
|
3351
|
-
Accept an input of type ``bytes`` instead of ``str``.
|
|
3352
|
-
ordered_sets
|
|
3353
|
-
Should Earley use ordered-sets to achieve stable output (~10% slower than regular sets. Default: True)
|
|
3354
|
-
edit_terminals
|
|
3355
|
-
A callback for editing the terminals before parse.
|
|
3356
|
-
import_paths
|
|
3357
|
-
A List of either paths or loader functions to specify from where grammars are imported
|
|
3358
|
-
source_path
|
|
3359
|
-
Override the source of from where the grammar was loaded. Useful for relative imports and unconventional grammar loading
|
|
3360
|
-
**=== End of Options ===**
|
|
3361
|
-
"""
|
|
3362
|
-
if __doc__:
|
|
3363
|
-
__doc__ += OPTIONS_DOC
|
|
3364
|
-
|
|
3365
|
-
##
|
|
3366
|
-
|
|
3367
|
-
##
|
|
3368
|
-
|
|
3369
|
-
##
|
|
3370
|
-
|
|
3371
|
-
##
|
|
3372
|
-
|
|
3373
|
-
##
|
|
3374
|
-
|
|
3375
|
-
##
|
|
3376
|
-
|
|
3377
|
-
_defaults: Dict[str, Any] = {
|
|
3378
|
-
"debug": False,
|
|
3379
|
-
"strict": False,
|
|
3380
|
-
"keep_all_tokens": False,
|
|
3381
|
-
"tree_class": None,
|
|
3382
|
-
"cache": False,
|
|
3383
|
-
"postlex": None,
|
|
3384
|
-
"parser": "earley",
|
|
3385
|
-
"lexer": "auto",
|
|
3386
|
-
"transformer": None,
|
|
3387
|
-
"start": "start",
|
|
3388
|
-
"priority": "auto",
|
|
3389
|
-
"ambiguity": "auto",
|
|
3390
|
-
"regex": False,
|
|
3391
|
-
"propagate_positions": False,
|
|
3392
|
-
"lexer_callbacks": {},
|
|
3393
|
-
"maybe_placeholders": True,
|
|
3394
|
-
"edit_terminals": None,
|
|
3395
|
-
"g_regex_flags": 0,
|
|
3396
|
-
"use_bytes": False,
|
|
3397
|
-
"ordered_sets": True,
|
|
3398
|
-
"import_paths": [],
|
|
3399
|
-
"source_path": None,
|
|
3400
|
-
"_plugins": {},
|
|
3401
|
-
}
|
|
3402
|
-
|
|
3403
|
-
def __init__(self, options_dict: Dict[str, Any]) -> None:
|
|
3404
|
-
o = dict(options_dict)
|
|
3405
|
-
|
|
3406
|
-
options = {}
|
|
3407
|
-
for name, default in self._defaults.items():
|
|
3408
|
-
if name in o:
|
|
3409
|
-
value = o.pop(name)
|
|
3410
|
-
if isinstance(default, bool) and name not in (
|
|
3411
|
-
"cache",
|
|
3412
|
-
"use_bytes",
|
|
3413
|
-
"propagate_positions",
|
|
3414
|
-
):
|
|
3415
|
-
value = bool(value)
|
|
3416
|
-
else:
|
|
3417
|
-
value = default
|
|
3418
|
-
|
|
3419
|
-
options[name] = value
|
|
3420
|
-
|
|
3421
|
-
if isinstance(options["start"], str):
|
|
3422
|
-
options["start"] = [options["start"]]
|
|
3423
|
-
|
|
3424
|
-
self.__dict__["options"] = options
|
|
3425
|
-
|
|
3426
|
-
assert_config(self.parser, ("earley", "lalr", "cyk", None))
|
|
3427
|
-
|
|
3428
|
-
if self.parser == "earley" and self.transformer:
|
|
3429
|
-
raise ConfigurationError(
|
|
3430
|
-
"Cannot specify an embedded transformer when using the Earley algorithm. "
|
|
3431
|
-
"Please use your transformer on the resulting parse tree, or use a different algorithm (i.e. LALR)"
|
|
3432
|
-
)
|
|
3433
|
-
|
|
3434
|
-
if o:
|
|
3435
|
-
raise ConfigurationError("Unknown options: %s" % o.keys())
|
|
3436
|
-
|
|
3437
|
-
def __getattr__(self, name: str) -> Any:
|
|
3438
|
-
try:
|
|
3439
|
-
return self.__dict__["options"][name]
|
|
3440
|
-
except KeyError as e:
|
|
3441
|
-
raise AttributeError(e)
|
|
3442
|
-
|
|
3443
|
-
def __setattr__(self, name: str, value: str) -> None:
|
|
3444
|
-
assert_config(
|
|
3445
|
-
name, self.options.keys(), "%r isn't a valid option. Expected one of: %s"
|
|
3446
|
-
)
|
|
3447
|
-
self.options[name] = value
|
|
3448
|
-
|
|
3449
|
-
def serialize(self, memo=None) -> Dict[str, Any]:
|
|
3450
|
-
return self.options
|
|
3451
|
-
|
|
3452
|
-
@classmethod
|
|
3453
|
-
def deserialize(
|
|
3454
|
-
cls, data: Dict[str, Any], memo: Dict[int, Union[TerminalDef, Rule]]
|
|
3455
|
-
) -> "LarkOptions":
|
|
3456
|
-
return cls(data)
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
##
|
|
3460
|
-
|
|
3461
|
-
##
|
|
3462
|
-
|
|
3463
|
-
_LOAD_ALLOWED_OPTIONS = {
|
|
3464
|
-
"postlex",
|
|
3465
|
-
"transformer",
|
|
3466
|
-
"lexer_callbacks",
|
|
3467
|
-
"use_bytes",
|
|
3468
|
-
"debug",
|
|
3469
|
-
"g_regex_flags",
|
|
3470
|
-
"regex",
|
|
3471
|
-
"propagate_positions",
|
|
3472
|
-
"tree_class",
|
|
3473
|
-
"_plugins",
|
|
3474
|
-
}
|
|
3475
|
-
|
|
3476
|
-
_VALID_PRIORITY_OPTIONS = ("auto", "normal", "invert", None)
|
|
3477
|
-
_VALID_AMBIGUITY_OPTIONS = ("auto", "resolve", "explicit", "forest")
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
_T = TypeVar("_T", bound="Lark")
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
class Lark(Serialize):
|
|
3484
|
-
#--
|
|
3485
|
-
|
|
3486
|
-
source_path: str
|
|
3487
|
-
source_grammar: str
|
|
3488
|
-
grammar: "Grammar"
|
|
3489
|
-
options: LarkOptions
|
|
3490
|
-
lexer: Lexer
|
|
3491
|
-
parser: "ParsingFrontend"
|
|
3492
|
-
terminals: Collection[TerminalDef]
|
|
3493
|
-
|
|
3494
|
-
def __init__(self, grammar: "Union[Grammar, str, IO[str]]", **options) -> None:
|
|
3495
|
-
self.options = LarkOptions(options)
|
|
3496
|
-
re_module: types.ModuleType
|
|
3497
|
-
|
|
3498
|
-
##
|
|
3499
|
-
|
|
3500
|
-
use_regex = self.options.regex
|
|
3501
|
-
if use_regex:
|
|
3502
|
-
if _has_regex:
|
|
3503
|
-
re_module = regex
|
|
3504
|
-
else:
|
|
3505
|
-
raise ImportError(
|
|
3506
|
-
"`regex` module must be installed if calling `Lark(regex=True)`."
|
|
3507
|
-
)
|
|
3508
|
-
else:
|
|
3509
|
-
re_module = re
|
|
3510
|
-
|
|
3511
|
-
##
|
|
3512
|
-
|
|
3513
|
-
if self.options.source_path is None:
|
|
3514
|
-
try:
|
|
3515
|
-
self.source_path = grammar.name ##
|
|
3516
|
-
|
|
3517
|
-
except AttributeError:
|
|
3518
|
-
self.source_path = "<string>"
|
|
3519
|
-
else:
|
|
3520
|
-
self.source_path = self.options.source_path
|
|
3521
|
-
|
|
3522
|
-
##
|
|
3523
|
-
|
|
3524
|
-
try:
|
|
3525
|
-
read = grammar.read ##
|
|
3526
|
-
|
|
3527
|
-
except AttributeError:
|
|
3528
|
-
pass
|
|
3529
|
-
else:
|
|
3530
|
-
grammar = read()
|
|
3531
|
-
|
|
3532
|
-
cache_fn = None
|
|
3533
|
-
cache_sha256 = None
|
|
3534
|
-
if isinstance(grammar, str):
|
|
3535
|
-
self.source_grammar = grammar
|
|
3536
|
-
if self.options.use_bytes:
|
|
3537
|
-
if not isascii(grammar):
|
|
3538
|
-
raise ConfigurationError(
|
|
3539
|
-
"Grammar must be ascii only, when use_bytes=True"
|
|
3540
|
-
)
|
|
3541
|
-
|
|
3542
|
-
if self.options.cache:
|
|
3543
|
-
if self.options.parser != "lalr":
|
|
3544
|
-
raise ConfigurationError(
|
|
3545
|
-
"cache only works with parser='lalr' for now"
|
|
3546
|
-
)
|
|
3547
|
-
|
|
3548
|
-
unhashable = (
|
|
3549
|
-
"transformer",
|
|
3550
|
-
"postlex",
|
|
3551
|
-
"lexer_callbacks",
|
|
3552
|
-
"edit_terminals",
|
|
3553
|
-
"_plugins",
|
|
3554
|
-
)
|
|
3555
|
-
options_str = "".join(
|
|
3556
|
-
k + str(v) for k, v in options.items() if k not in unhashable
|
|
3557
|
-
)
|
|
3558
|
-
from . import __version__
|
|
3559
|
-
|
|
3560
|
-
s = grammar + options_str + __version__ + str(sys.version_info[:2])
|
|
3561
|
-
cache_sha256 = sha256_digest(s)
|
|
3562
|
-
|
|
3563
|
-
if isinstance(self.options.cache, str):
|
|
3564
|
-
cache_fn = self.options.cache
|
|
3565
|
-
else:
|
|
3566
|
-
if self.options.cache is not True:
|
|
3567
|
-
raise ConfigurationError("cache argument must be bool or str")
|
|
3568
|
-
|
|
3569
|
-
try:
|
|
3570
|
-
username = getpass.getuser()
|
|
3571
|
-
except Exception:
|
|
3572
|
-
##
|
|
3573
|
-
|
|
3574
|
-
##
|
|
3575
|
-
|
|
3576
|
-
##
|
|
3577
|
-
|
|
3578
|
-
username = "unknown"
|
|
3579
|
-
|
|
3580
|
-
cache_fn = (
|
|
3581
|
-
tempfile.gettempdir()
|
|
3582
|
-
+ "/.lark_cache_%s_%s_%s_%s.tmp"
|
|
3583
|
-
% (username, cache_sha256, *sys.version_info[:2])
|
|
3584
|
-
)
|
|
3585
|
-
|
|
3586
|
-
old_options = self.options
|
|
3587
|
-
try:
|
|
3588
|
-
with FS.open(cache_fn, "rb") as f:
|
|
3589
|
-
logger.debug("Loading grammar from cache: %s", cache_fn)
|
|
3590
|
-
##
|
|
3591
|
-
|
|
3592
|
-
for name in set(options) - _LOAD_ALLOWED_OPTIONS:
|
|
3593
|
-
del options[name]
|
|
3594
|
-
file_sha256 = f.readline().rstrip(b"\n")
|
|
3595
|
-
cached_used_files = pickle.load(f)
|
|
3596
|
-
if file_sha256 == cache_sha256.encode(
|
|
3597
|
-
"utf8"
|
|
3598
|
-
) and verify_used_files(cached_used_files):
|
|
3599
|
-
cached_parser_data = pickle.load(f)
|
|
3600
|
-
self._load(cached_parser_data, **options)
|
|
3601
|
-
return
|
|
3602
|
-
except FileNotFoundError:
|
|
3603
|
-
##
|
|
3604
|
-
|
|
3605
|
-
pass
|
|
3606
|
-
except (
|
|
3607
|
-
Exception
|
|
3608
|
-
): ##
|
|
3609
|
-
|
|
3610
|
-
logger.exception(
|
|
3611
|
-
"Failed to load Lark from cache: %r. We will try to carry on.",
|
|
3612
|
-
cache_fn,
|
|
3613
|
-
)
|
|
3614
|
-
|
|
3615
|
-
##
|
|
3616
|
-
|
|
3617
|
-
##
|
|
3618
|
-
|
|
3619
|
-
self.options = old_options
|
|
3620
|
-
|
|
3621
|
-
##
|
|
3622
|
-
|
|
3623
|
-
self.grammar, used_files = load_grammar(
|
|
3624
|
-
grammar,
|
|
3625
|
-
self.source_path,
|
|
3626
|
-
self.options.import_paths,
|
|
3627
|
-
self.options.keep_all_tokens,
|
|
3628
|
-
)
|
|
3629
|
-
else:
|
|
3630
|
-
assert isinstance(grammar, Grammar)
|
|
3631
|
-
self.grammar = grammar
|
|
3632
|
-
|
|
3633
|
-
if self.options.lexer == "auto":
|
|
3634
|
-
if self.options.parser == "lalr":
|
|
3635
|
-
self.options.lexer = "contextual"
|
|
3636
|
-
elif self.options.parser == "earley":
|
|
3637
|
-
if self.options.postlex is not None:
|
|
3638
|
-
logger.info(
|
|
3639
|
-
"postlex can't be used with the dynamic lexer, so we use 'basic' instead. "
|
|
3640
|
-
"Consider using lalr with contextual instead of earley"
|
|
3641
|
-
)
|
|
3642
|
-
self.options.lexer = "basic"
|
|
3643
|
-
else:
|
|
3644
|
-
self.options.lexer = "dynamic"
|
|
3645
|
-
elif self.options.parser == "cyk":
|
|
3646
|
-
self.options.lexer = "basic"
|
|
3647
|
-
else:
|
|
3648
|
-
assert False, self.options.parser
|
|
3649
|
-
lexer = self.options.lexer
|
|
3650
|
-
if isinstance(lexer, type):
|
|
3651
|
-
assert issubclass(
|
|
3652
|
-
lexer, Lexer
|
|
3653
|
-
) ##
|
|
3654
|
-
|
|
3655
|
-
else:
|
|
3656
|
-
assert_config(lexer, ("basic", "contextual", "dynamic", "dynamic_complete"))
|
|
3657
|
-
if self.options.postlex is not None and "dynamic" in lexer:
|
|
3658
|
-
raise ConfigurationError(
|
|
3659
|
-
"Can't use postlex with a dynamic lexer. Use basic or contextual instead"
|
|
3660
|
-
)
|
|
3661
|
-
|
|
3662
|
-
if self.options.ambiguity == "auto":
|
|
3663
|
-
if self.options.parser == "earley":
|
|
3664
|
-
self.options.ambiguity = "resolve"
|
|
3665
|
-
else:
|
|
3666
|
-
assert_config(
|
|
3667
|
-
self.options.parser,
|
|
3668
|
-
("earley", "cyk"),
|
|
3669
|
-
"%r doesn't support disambiguation. Use one of these parsers instead: %s",
|
|
3670
|
-
)
|
|
3671
|
-
|
|
3672
|
-
if self.options.priority == "auto":
|
|
3673
|
-
self.options.priority = "normal"
|
|
3674
|
-
|
|
3675
|
-
if self.options.priority not in _VALID_PRIORITY_OPTIONS:
|
|
3676
|
-
raise ConfigurationError(
|
|
3677
|
-
"invalid priority option: %r. Must be one of %r"
|
|
3678
|
-
% (self.options.priority, _VALID_PRIORITY_OPTIONS)
|
|
3679
|
-
)
|
|
3680
|
-
if self.options.ambiguity not in _VALID_AMBIGUITY_OPTIONS:
|
|
3681
|
-
raise ConfigurationError(
|
|
3682
|
-
"invalid ambiguity option: %r. Must be one of %r"
|
|
3683
|
-
% (self.options.ambiguity, _VALID_AMBIGUITY_OPTIONS)
|
|
3684
|
-
)
|
|
3685
|
-
|
|
3686
|
-
if self.options.parser is None:
|
|
3687
|
-
terminals_to_keep = "*"
|
|
3688
|
-
elif self.options.postlex is not None:
|
|
3689
|
-
terminals_to_keep = set(self.options.postlex.always_accept)
|
|
3690
|
-
else:
|
|
3691
|
-
terminals_to_keep = set()
|
|
3692
|
-
|
|
3693
|
-
##
|
|
3694
|
-
|
|
3695
|
-
self.terminals, self.rules, self.ignore_tokens = self.grammar.compile(
|
|
3696
|
-
self.options.start, terminals_to_keep
|
|
3697
|
-
)
|
|
3698
|
-
|
|
3699
|
-
if self.options.edit_terminals:
|
|
3700
|
-
for t in self.terminals:
|
|
3701
|
-
self.options.edit_terminals(t)
|
|
3702
|
-
|
|
3703
|
-
self._terminals_dict = {t.name: t for t in self.terminals}
|
|
3704
|
-
|
|
3705
|
-
##
|
|
3706
|
-
|
|
3707
|
-
if self.options.priority == "invert":
|
|
3708
|
-
for rule in self.rules:
|
|
3709
|
-
if rule.options.priority is not None:
|
|
3710
|
-
rule.options.priority = -rule.options.priority
|
|
3711
|
-
for term in self.terminals:
|
|
3712
|
-
term.priority = -term.priority
|
|
3713
|
-
##
|
|
3714
|
-
|
|
3715
|
-
##
|
|
3716
|
-
|
|
3717
|
-
##
|
|
3718
|
-
|
|
3719
|
-
elif self.options.priority is None:
|
|
3720
|
-
for rule in self.rules:
|
|
3721
|
-
if rule.options.priority is not None:
|
|
3722
|
-
rule.options.priority = None
|
|
3723
|
-
for term in self.terminals:
|
|
3724
|
-
term.priority = 0
|
|
3725
|
-
|
|
3726
|
-
##
|
|
3727
|
-
|
|
3728
|
-
self.lexer_conf = LexerConf(
|
|
3729
|
-
self.terminals,
|
|
3730
|
-
re_module,
|
|
3731
|
-
self.ignore_tokens,
|
|
3732
|
-
self.options.postlex,
|
|
3733
|
-
self.options.lexer_callbacks,
|
|
3734
|
-
self.options.g_regex_flags,
|
|
3735
|
-
use_bytes=self.options.use_bytes,
|
|
3736
|
-
strict=self.options.strict,
|
|
3737
|
-
)
|
|
3738
|
-
|
|
3739
|
-
if self.options.parser:
|
|
3740
|
-
self.parser = self._build_parser()
|
|
3741
|
-
elif lexer:
|
|
3742
|
-
self.lexer = self._build_lexer()
|
|
3743
|
-
|
|
3744
|
-
if cache_fn:
|
|
3745
|
-
logger.debug("Saving grammar to cache: %s", cache_fn)
|
|
3746
|
-
try:
|
|
3747
|
-
with FS.open(cache_fn, "wb") as f:
|
|
3748
|
-
assert cache_sha256 is not None
|
|
3749
|
-
f.write(cache_sha256.encode("utf8") + b"\n")
|
|
3750
|
-
pickle.dump(used_files, f)
|
|
3751
|
-
self.save(f, _LOAD_ALLOWED_OPTIONS)
|
|
3752
|
-
except IOError as e:
|
|
3753
|
-
logger.exception("Failed to save Lark to cache: %r.", cache_fn, e)
|
|
3754
|
-
|
|
3755
|
-
if __doc__:
|
|
3756
|
-
__doc__ += "\n\n" + LarkOptions.OPTIONS_DOC
|
|
3757
|
-
|
|
3758
|
-
__serialize_fields__ = "parser", "rules", "options"
|
|
3759
|
-
|
|
3760
|
-
def _build_lexer(self, dont_ignore: bool = False) -> BasicLexer:
|
|
3761
|
-
lexer_conf = self.lexer_conf
|
|
3762
|
-
if dont_ignore:
|
|
3763
|
-
from copy import copy
|
|
3764
|
-
|
|
3765
|
-
lexer_conf = copy(lexer_conf)
|
|
3766
|
-
lexer_conf.ignore = ()
|
|
3767
|
-
return BasicLexer(lexer_conf)
|
|
3768
|
-
|
|
3769
|
-
def _prepare_callbacks(self) -> None:
|
|
3770
|
-
self._callbacks = {}
|
|
3771
|
-
##
|
|
3772
|
-
|
|
3773
|
-
if self.options.ambiguity != "forest":
|
|
3774
|
-
self._parse_tree_builder = ParseTreeBuilder(
|
|
3775
|
-
self.rules,
|
|
3776
|
-
self.options.tree_class or Tree,
|
|
3777
|
-
self.options.propagate_positions,
|
|
3778
|
-
self.options.parser != "lalr" and self.options.ambiguity == "explicit",
|
|
3779
|
-
self.options.maybe_placeholders,
|
|
3780
|
-
)
|
|
3781
|
-
self._callbacks = self._parse_tree_builder.create_callback(
|
|
3782
|
-
self.options.transformer
|
|
3783
|
-
)
|
|
3784
|
-
self._callbacks.update(
|
|
3785
|
-
_get_lexer_callbacks(self.options.transformer, self.terminals)
|
|
3786
|
-
)
|
|
3787
|
-
|
|
3788
|
-
def _build_parser(self) -> "ParsingFrontend":
|
|
3789
|
-
self._prepare_callbacks()
|
|
3790
|
-
_validate_frontend_args(self.options.parser, self.options.lexer)
|
|
3791
|
-
parser_conf = ParserConf(self.rules, self._callbacks, self.options.start)
|
|
3792
|
-
return _construct_parsing_frontend(
|
|
3793
|
-
self.options.parser,
|
|
3794
|
-
self.options.lexer,
|
|
3795
|
-
self.lexer_conf,
|
|
3796
|
-
parser_conf,
|
|
3797
|
-
options=self.options,
|
|
3798
|
-
)
|
|
3799
|
-
|
|
3800
|
-
def save(self, f, exclude_options: Collection[str] = ()) -> None:
|
|
3801
|
-
#--
|
|
3802
|
-
if self.options.parser != "lalr":
|
|
3803
|
-
raise NotImplementedError(
|
|
3804
|
-
"Lark.save() is only implemented for the LALR(1) parser."
|
|
3805
|
-
)
|
|
3806
|
-
data, m = self.memo_serialize([TerminalDef, Rule])
|
|
3807
|
-
if exclude_options:
|
|
3808
|
-
data["options"] = {
|
|
3809
|
-
n: v for n, v in data["options"].items() if n not in exclude_options
|
|
3810
|
-
}
|
|
3811
|
-
pickle.dump({"data": data, "memo": m}, f, protocol=pickle.HIGHEST_PROTOCOL)
|
|
3812
|
-
|
|
3813
|
-
@classmethod
|
|
3814
|
-
def load(cls: Type[_T], f) -> _T:
|
|
3815
|
-
#--
|
|
3816
|
-
inst = cls.__new__(cls)
|
|
3817
|
-
return inst._load(f)
|
|
3818
|
-
|
|
3819
|
-
def _deserialize_lexer_conf(
|
|
3820
|
-
self,
|
|
3821
|
-
data: Dict[str, Any],
|
|
3822
|
-
memo: Dict[int, Union[TerminalDef, Rule]],
|
|
3823
|
-
options: LarkOptions,
|
|
3824
|
-
) -> LexerConf:
|
|
3825
|
-
lexer_conf = LexerConf.deserialize(data["lexer_conf"], memo)
|
|
3826
|
-
lexer_conf.callbacks = options.lexer_callbacks or {}
|
|
3827
|
-
lexer_conf.re_module = regex if options.regex else re
|
|
3828
|
-
lexer_conf.use_bytes = options.use_bytes
|
|
3829
|
-
lexer_conf.g_regex_flags = options.g_regex_flags
|
|
3830
|
-
lexer_conf.skip_validation = True
|
|
3831
|
-
lexer_conf.postlex = options.postlex
|
|
3832
|
-
return lexer_conf
|
|
3833
|
-
|
|
3834
|
-
def _load(self: _T, f: Any, **kwargs) -> _T:
|
|
3835
|
-
if isinstance(f, dict):
|
|
3836
|
-
d = f
|
|
3837
|
-
else:
|
|
3838
|
-
d = pickle.load(f)
|
|
3839
|
-
memo_json = d["memo"]
|
|
3840
|
-
data = d["data"]
|
|
3841
|
-
|
|
3842
|
-
assert memo_json
|
|
3843
|
-
memo = SerializeMemoizer.deserialize(
|
|
3844
|
-
memo_json, {"Rule": Rule, "TerminalDef": TerminalDef}, {}
|
|
3845
|
-
)
|
|
3846
|
-
options = dict(data["options"])
|
|
3847
|
-
if (set(kwargs) - _LOAD_ALLOWED_OPTIONS) & set(LarkOptions._defaults):
|
|
3848
|
-
raise ConfigurationError(
|
|
3849
|
-
"Some options are not allowed when loading a Parser: {}".format(
|
|
3850
|
-
set(kwargs) - _LOAD_ALLOWED_OPTIONS
|
|
3851
|
-
)
|
|
3852
|
-
)
|
|
3853
|
-
options.update(kwargs)
|
|
3854
|
-
self.options = LarkOptions.deserialize(options, memo)
|
|
3855
|
-
self.rules = [Rule.deserialize(r, memo) for r in data["rules"]]
|
|
3856
|
-
self.source_path = "<deserialized>"
|
|
3857
|
-
_validate_frontend_args(self.options.parser, self.options.lexer)
|
|
3858
|
-
self.lexer_conf = self._deserialize_lexer_conf(
|
|
3859
|
-
data["parser"], memo, self.options
|
|
3860
|
-
)
|
|
3861
|
-
self.terminals = self.lexer_conf.terminals
|
|
3862
|
-
self._prepare_callbacks()
|
|
3863
|
-
self._terminals_dict = {t.name: t for t in self.terminals}
|
|
3864
|
-
self.parser = _deserialize_parsing_frontend(
|
|
3865
|
-
data["parser"],
|
|
3866
|
-
memo,
|
|
3867
|
-
self.lexer_conf,
|
|
3868
|
-
self._callbacks,
|
|
3869
|
-
self.options, ##
|
|
3870
|
-
|
|
3871
|
-
)
|
|
3872
|
-
return self
|
|
3873
|
-
|
|
3874
|
-
@classmethod
|
|
3875
|
-
def _load_from_dict(cls, data, memo, **kwargs):
|
|
3876
|
-
inst = cls.__new__(cls)
|
|
3877
|
-
return inst._load({"data": data, "memo": memo}, **kwargs)
|
|
3878
|
-
|
|
3879
|
-
@classmethod
|
|
3880
|
-
def open(
|
|
3881
|
-
cls: Type[_T], grammar_filename: str, rel_to: Optional[str] = None, **options
|
|
3882
|
-
) -> _T:
|
|
3883
|
-
#--
|
|
3884
|
-
if rel_to:
|
|
3885
|
-
basepath = os.path.dirname(rel_to)
|
|
3886
|
-
grammar_filename = os.path.join(basepath, grammar_filename)
|
|
3887
|
-
with open(grammar_filename, encoding="utf8") as f:
|
|
3888
|
-
return cls(f, **options)
|
|
3889
|
-
|
|
3890
|
-
@classmethod
|
|
3891
|
-
def open_from_package(
|
|
3892
|
-
cls: Type[_T],
|
|
3893
|
-
package: str,
|
|
3894
|
-
grammar_path: str,
|
|
3895
|
-
search_paths: "Sequence[str]" = [""],
|
|
3896
|
-
**options
|
|
3897
|
-
) -> _T:
|
|
3898
|
-
#--
|
|
3899
|
-
package_loader = FromPackageLoader(package, search_paths)
|
|
3900
|
-
full_path, text = package_loader(None, grammar_path)
|
|
3901
|
-
options.setdefault("source_path", full_path)
|
|
3902
|
-
options.setdefault("import_paths", [])
|
|
3903
|
-
options["import_paths"].append(package_loader)
|
|
3904
|
-
return cls(text, **options)
|
|
3905
|
-
|
|
3906
|
-
def __repr__(self):
|
|
3907
|
-
return "Lark(open(%r), parser=%r, lexer=%r, ...)" % (
|
|
3908
|
-
self.source_path,
|
|
3909
|
-
self.options.parser,
|
|
3910
|
-
self.options.lexer,
|
|
3911
|
-
)
|
|
3912
|
-
|
|
3913
|
-
def lex(self, text: str, dont_ignore: bool = False) -> Iterator[Token]:
|
|
3914
|
-
#--
|
|
3915
|
-
lexer: Lexer
|
|
3916
|
-
if not hasattr(self, "lexer") or dont_ignore:
|
|
3917
|
-
lexer = self._build_lexer(dont_ignore)
|
|
3918
|
-
else:
|
|
3919
|
-
lexer = self.lexer
|
|
3920
|
-
lexer_thread = LexerThread.from_text(lexer, text)
|
|
3921
|
-
stream = lexer_thread.lex(None)
|
|
3922
|
-
if self.options.postlex:
|
|
3923
|
-
return self.options.postlex.process(stream)
|
|
3924
|
-
return stream
|
|
3925
|
-
|
|
3926
|
-
def get_terminal(self, name: str) -> TerminalDef:
|
|
3927
|
-
#--
|
|
3928
|
-
return self._terminals_dict[name]
|
|
3929
|
-
|
|
3930
|
-
def parse_interactive(
|
|
3931
|
-
self, text: Optional[str] = None, start: Optional[str] = None
|
|
3932
|
-
) -> "InteractiveParser":
|
|
3933
|
-
#--
|
|
3934
|
-
return self.parser.parse_interactive(text, start=start)
|
|
3935
|
-
|
|
3936
|
-
def parse(
|
|
3937
|
-
self,
|
|
3938
|
-
text: str,
|
|
3939
|
-
start: Optional[str] = None,
|
|
3940
|
-
on_error: "Optional[Callable[[UnexpectedInput], bool]]" = None,
|
|
3941
|
-
) -> "ParseTree":
|
|
3942
|
-
#--
|
|
3943
|
-
return self.parser.parse(text, start=start, on_error=on_error)
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3949
|
-
class DedentError(LarkError):
|
|
3950
|
-
pass
|
|
3951
|
-
|
|
3952
|
-
|
|
3953
|
-
class Indenter(PostLex, ABC):
|
|
3954
|
-
paren_level: int
|
|
3955
|
-
indent_level: List[int]
|
|
3956
|
-
|
|
3957
|
-
def __init__(self) -> None:
|
|
3958
|
-
self.paren_level = 0
|
|
3959
|
-
self.indent_level = [0]
|
|
3960
|
-
assert self.tab_len > 0
|
|
3961
|
-
|
|
3962
|
-
def handle_NL(self, token: Token) -> Iterator[Token]:
|
|
3963
|
-
if self.paren_level > 0:
|
|
3964
|
-
return
|
|
3965
|
-
|
|
3966
|
-
yield token
|
|
3967
|
-
|
|
3968
|
-
indent_str = token.rsplit("\n", 1)[1] ##
|
|
3969
|
-
|
|
3970
|
-
indent = indent_str.count(" ") + indent_str.count("\t") * self.tab_len
|
|
3971
|
-
|
|
3972
|
-
if indent > self.indent_level[-1]:
|
|
3973
|
-
self.indent_level.append(indent)
|
|
3974
|
-
yield Token.new_borrow_pos(self.INDENT_type, indent_str, token)
|
|
3975
|
-
else:
|
|
3976
|
-
while indent < self.indent_level[-1]:
|
|
3977
|
-
self.indent_level.pop()
|
|
3978
|
-
yield Token.new_borrow_pos(self.DEDENT_type, indent_str, token)
|
|
3979
|
-
|
|
3980
|
-
if indent != self.indent_level[-1]:
|
|
3981
|
-
raise DedentError(
|
|
3982
|
-
"Unexpected dedent to column %s. Expected dedent to %s"
|
|
3983
|
-
% (indent, self.indent_level[-1])
|
|
3984
|
-
)
|
|
3985
|
-
|
|
3986
|
-
def _process(self, stream):
|
|
3987
|
-
for token in stream:
|
|
3988
|
-
if token.type == self.NL_type:
|
|
3989
|
-
yield from self.handle_NL(token)
|
|
3990
|
-
else:
|
|
3991
|
-
yield token
|
|
3992
|
-
|
|
3993
|
-
if token.type in self.OPEN_PAREN_types:
|
|
3994
|
-
self.paren_level += 1
|
|
3995
|
-
elif token.type in self.CLOSE_PAREN_types:
|
|
3996
|
-
self.paren_level -= 1
|
|
3997
|
-
assert self.paren_level >= 0
|
|
3998
|
-
|
|
3999
|
-
while len(self.indent_level) > 1:
|
|
4000
|
-
self.indent_level.pop()
|
|
4001
|
-
yield Token(self.DEDENT_type, "")
|
|
4002
|
-
|
|
4003
|
-
assert self.indent_level == [0], self.indent_level
|
|
4004
|
-
|
|
4005
|
-
def process(self, stream):
|
|
4006
|
-
self.paren_level = 0
|
|
4007
|
-
self.indent_level = [0]
|
|
4008
|
-
return self._process(stream)
|
|
4009
|
-
|
|
4010
|
-
##
|
|
4011
|
-
|
|
4012
|
-
@property
|
|
4013
|
-
def always_accept(self):
|
|
4014
|
-
return (self.NL_type,)
|
|
4015
|
-
|
|
4016
|
-
@property
|
|
4017
|
-
@abstractmethod
|
|
4018
|
-
def NL_type(self) -> str:
|
|
4019
|
-
raise NotImplementedError()
|
|
4020
|
-
|
|
4021
|
-
@property
|
|
4022
|
-
@abstractmethod
|
|
4023
|
-
def OPEN_PAREN_types(self) -> List[str]:
|
|
4024
|
-
raise NotImplementedError()
|
|
4025
|
-
|
|
4026
|
-
@property
|
|
4027
|
-
@abstractmethod
|
|
4028
|
-
def CLOSE_PAREN_types(self) -> List[str]:
|
|
4029
|
-
raise NotImplementedError()
|
|
4030
|
-
|
|
4031
|
-
@property
|
|
4032
|
-
@abstractmethod
|
|
4033
|
-
def INDENT_type(self) -> str:
|
|
4034
|
-
raise NotImplementedError()
|
|
4035
|
-
|
|
4036
|
-
@property
|
|
4037
|
-
@abstractmethod
|
|
4038
|
-
def DEDENT_type(self) -> str:
|
|
4039
|
-
raise NotImplementedError()
|
|
4040
|
-
|
|
4041
|
-
@property
|
|
4042
|
-
@abstractmethod
|
|
4043
|
-
def tab_len(self) -> int:
|
|
4044
|
-
raise NotImplementedError()
|
|
4045
|
-
|
|
4046
|
-
|
|
4047
|
-
class PythonIndenter(Indenter):
|
|
4048
|
-
NL_type = "_NEWLINE"
|
|
4049
|
-
OPEN_PAREN_types = ["LPAR", "LSQB", "LBRACE"]
|
|
4050
|
-
CLOSE_PAREN_types = ["RPAR", "RSQB", "RBRACE"]
|
|
4051
|
-
INDENT_type = "_INDENT"
|
|
4052
|
-
DEDENT_type = "_DEDENT"
|
|
4053
|
-
tab_len = 8
|
|
4054
|
-
|
|
4055
|
-
|
|
4056
|
-
|
|
4057
|
-
import pickle, zlib, base64
|
|
4058
|
-
DATA = (
|
|
4059
|
-
b'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n2xZtCMOSSIOSSIOSSIOSSIOSSIOSSIOSWJtkEQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckkQckqzmGcO0k/QCrqSS6VPvufxE77kcWju/uPdchoZXRsSWMv+l+spaNZxgkZWySptAt4EOSMqFGjX5lP5fV07P/wh0FWgPqBu0GXQ16BrQFtBIUA9oL2gBaA1oH2g/KAi6FjQdlARdB7oedAOoEXQjaARoGegm0M2gAqgV1Au6BXQr6DZQEXQ7qA90B2gi6E7QXaC7QfeA7gXdB7of9ADoQdAB0EOgh0GPgB4FjQE9BnoctAn0BKgTdBD0JOgp0NOgZ0AZ0CHQs6DDoOdAz4N2g3aB0qAO0HKQBbQCtBK0CrQatBa0DmQGrQdlQRtAG0EvgI6AXgS9BHoZ9AroVdBroNdBb4DeBL0F6ge9LSkXGgFpHoA0D0CMByDGA5DfAUjsAER1ADI6AKkcgFQOQCoHII4DkMMByNoAhGwAQjYAQRqAIA1gig5AngYgTwOQpwEI0gAEaQCiMwDRGUCpG0A5G0ABG4AIDKCcDaCADaBkDaBIDaBIDaD0DKDYDKC8DKC8DKC8DKAwDKAwDKAwDEDEByDUAxDqAUjJAIrUAKRkABNvAJNkAJNkAJNyAJNyAJNyAJNyAJNrAJNrABN2ABN2ABNvABNvABNvADI6gEI0gEI0gEI0gEI0gEJUpWWgR0CPgm4DPQZ6HLQJ1Ak6CHoS9BToadAzoAzoEOhZ0GHQblAa1AFaDrKAVoBWglaBVoPWgtaBzKD1oCxoA2ijpFzIocmQaw9Crj0IufYg5NqDkGsPQq49CLn2IOTag5BrD0KuPQi59iDk2oOQaw9Crj0IufYg5NqDkGsPQq49CLn2IOTag5BrD0KuPQi59iDk2oOQa091CTxSG7xNuO175Q/fVQtWtU+glrDfkvdg/E35wm3yXcMfvKH3uPfx/nW5YVL/zQ/cx5sLfUPDrcvqUb//pOerD2mKqYa6mTlbWZf9FsZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCN8ZCd3UsODX5TJWdlTmZAJ0GmgHaBrKAbKCZoJGgaaAFoCBoPmgOaDpoOCgJGgdqBM0DjQBNAs0CuUCjQK2ghaCxoCmgJaAxIA9oKagJlAKZQRNBAdBk0GyQGzQVFAYtAs0FRUEm0ATQeEm5kIsiorTDrg1qh1lTX+GufMU7ZT6gREWFOzZNzPzxCHfGI9wZj3BnPMKd8dVw57chTWZIkxnSZIY0mSFNZkiTGdJkhjSZIU1mSJMZ0mSGNJkhTWZIkxnSZIY0mSFNZkiTGdJkhjSZIU1mSJMZ0mSGNJkhTeaqNHnQyRZ0sgWdbEEnW9DJFnSyBZ1sQSdb0MkWdLIFnWxBJ1vQyRZ0sgWdbEEnW9DJFnSyBZ1sQSdb0MkWdLIFnWxBJ1vQyZZqJ4+qdHJtzTcfnno+3Ol8rMjmw6fPh7+fD789H6uu+dUZ7NWkBVFG438f04Icz3mUTUvbeflP5EBGY1j1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1YFj1VIfVGHRyFzq5C53chU7uQid3oZO70Mld6OQudHIXOrkLndyFTu5CJ3ehk7vQyV3o5C50chc6uQud3IVO7kInd6GTu9DJXejkLnRylWygmaCRoGmgIOhs0HTQcNA8UA40CeQCtYIWgs4BTQEtAY0BnQvygLpATaCJoPNA54Mmg2aDpoICoLmgRaA5oAmgTaAzQBeAEqAZoM2gLaCtoG2gBaDtoPmgC0FJ0A7QOFAj6CLQCNAo0FjQxaA8aCdoKSgFioLCoF0gE2g3aDzoEtCloMtAl4OuAF0pKRcaCxnVIaM6ZFSHjOqQUR0yqkNGdcioDhnVIaM6ZFSHjOqQUR0yqkNGdcioDhnVIaM6ZFSHjOqQUR0yqkNGdcioDhnVq508Tht8udDNZeOwMfQ76HMNfa6hzzX0uYY+19DnGvpcQ59r6HMNfa6hzzX0uYY+19DnGvpcQ59r6HMNfa6hzzX0uYY+19DnGvpcQ59r6HOt2uenoZP3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3o5P3Vzt5fG1gP1YZ2BPQ5w3o8wb0eQP6vAF93oA+b0CfN6DPG9DnDejzBvR5A/q8AX3egD5vQJ83oM8b0OcN6PMG9HkD+rwBfd6APm9AnzegzxvQ5w3VPv9d7dSZ5q/dbVJf8wd9qzu8w2rV/WV5KEjIB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naB6naV5WqiZVOrr3s6t9FP1ZhuQSbhJkS1kpYIyEoYbiEnIRJEpZJWCjhHAlTJIyRcK6ELglNEtZJmChhsoTZEqZKcEu4UsIcCRMkbJKQlpCQsFnCFglbJWyTYJGwQMJqCdslzJdwoYSkhA0SxkkYIWGshIsl7JSwVMJZEq6QYJYQlbBeQlhCVoJJwm4J4yVcIuFSCSMlTJNwmYSzJUyXsFHCDyWcKWGeBJeEVglLJHgkXC7hPAnnSwhImCthkYQzJFwgYYaETgkrJKySsENCo4SLJGQkzJIwSsJKCXkJKQm7BORC30QtsaKWWFFLrKglVtQSK2qJFbXEilpiRS2xopZYUUusqCVW1BIraokVtcSKWmJFLbGillhRS6yoJVbUEitqiRW1xIpaYkUtsVZrySQNO3KHy40Harv537Xkq8uQGaqhdvz/SD3YKzRZO2WVf9Ot8ovm/Od/O6Dyu9PVWPwaPD8v1FSeReX6ZgodsKhF/u9VJpV6oOzZtWl3TuXrppyabZ96tqmB8zfmr8G0+6qtUL80s20qzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzEQHzESVbKCZoJGgaaAg6GzQdNBw0DxQDjQJ5AK1ghaCzgFNAS0BjQGdC/KAukBNoImg80DngyaDZoOmggKguaBFoDmgCaBNoDNAF4ASoBmgzaAtoK2gbaAFoO2g+aALQUnQDtA4UCPoItAI0CjQWNDFoDxoJ2gpKAWKgsKgXSATaDdoPOgS0KWgy0CXg64AXSkpF/p9Td6B04RX6TXh5XlNeHleE16e14SX5zXh5XlNeHleE16e14QX5DXhBXlNeEFeE16Q14QX5DXhBXlNeEFeE16Q14QX5DXhBXlNeCVeE16X14SXMjXhBXlNeEFeE16Q14QX5FVpGegm0M2gAqgV1Au6BXQr6DZQEXQ7qA90B2gi6E7QXaC7QfeA7gXdB7of9ADoQdAB0EOgh0GPgB4FjQE9BnoctAn0BKgTdBD0JOgp0NOgZ0AZ0CHQs6DDoOdAz4N2g3aB0qAO0HKQBbQCtBK0CrQatBa0DmQGrQdlQRtAG0EvgI6AXgS9BHoZ9AroVdBroNdBb4DeBL0F6ge9LSkXmqYNrif/3qzWk9+qKHV50RSa1pCvfvBt1fhpuYS4y///s/L//zBfXex1NIjBeAhVp0qHQWMk5ULf1qS1dsBaO2CtHbDWDlhrB6y1A9baAWvtgLV2wFo7YK0dsNYOWGsHrLUD1toBa+2AtXbAWjtgrR2w1g5YawestQPW2gFr7YC1dlQ7eTo6OY5OjqOT4+jkODo5jk6Oo5Pj6OQ4OjmOTo6jk+Po5Dg6OY5OjqOT4+jkODo5jk6Oo5Pj6OQ4OjmOTo6jk+Po5Dg6OY71SxzrlzjWL3GsX+JYv8Sxfolj/RLH+iWO9Usc65c41i9xrF/iWL/EsX6JY/0Sx/oljvVLHLM4jvVLHOuXONYvcaxf4li/xLF+iWP9Esf6JY71SxzrlzjWL3GsX+JYv8Sxfolj/RLH+iWO9Usc65c41i9xrF/iWL/EsX6JY/0Sx/oljvVLHOuXONYvcaxf4li/xLF+iWP9Esf6JY71SxzrlzjWL3GsX+JYv8Sxfolj/RLH+iWO9Usc65c41i9xVJI41i9xrF/iWL/EsX6JY/0Sx/oljvVLHOuXONYv8aqMfuc4VbFeBctlMfQNlUKpOvneh5TFDxTCP9C+8kmtemjukvyXILE9GUGtepz10vypJy9/pYPb78L4RGF8ojA+URifKIxPFMYnCuMThfGJwvhEYXyiMD5RGJ8ojE8UxicK4xOF8YnC+ERhfKIwPlEYnyiMTxTGJwrjE4XxicL4RGF8ojA+URifKIxPFMYnCuMThfGJwvhEYXyiMD5RGJ8ojE8UxicK4xOF8YnC+ERhfKJQ7SiMTxTGJwrjE4XxicL4RGF8ojA+URifKIxPFMYnCuMThfGJwvhEYXyiMD5RGJ8ojE8UxicK4xOF8YnC+ERhfKIwPlEYnyiMTxTGJwrjE4XxicL4RGF8ojA+URifKIxPFMYnCuMThfGJwvhEYXyiMD5RGJ8ojE8UxicK4xOFV4jC+ERhfKIwPlEYnyiMTxTGJwrjE4XxicL4RKve5Hvax3656dB3mh73Vab1RPgnlXtGrwLtAXWDNoOuBl0D2gK6H9QD2gtaAFoD2gfaDwqCrgVNByVB14GuBzWCbgQtAxVAraBe0C2gW0G3gYqg20F9oDtAE0F3ge4G3QO6F3Qf6GbQA6AHQQdAD4EeBj0CehQ0BvQY6HHQJtAToE7QQdCToKdAT4OeAWVAh0DPgg6DngM9D9oN2iUpF5qhyQeH7LDIQlClGSALyAaaCRoJmg8aDjKBxoHmgUaAZoFcoFGghaCxoCmgJSAPaAxoKagJlAKZQQHQbFAU5AYtAoVBk0FzQVNBc0ATJOVCf1gZDDVn+h785nvwm+/BCb8HJ/wenPB78JvvwXO9V61GMyv/bO245z+Lr6jCGRISEk6TMEOCRYJNwkwJIyVMk7BAQlDCfAlzJEyXMFxCUsI4CY0S5kkYIWGShFkSXBJGSWiVsFDCWAlTJCyR4JGwVEKThJQEs4SJEgISJkuYLcEtYaqEsIRFEuZKiEowSZggYbyAXOiPtCEPtNqgjoipk68Ta0fw9MqB1+9rH/LoaZXV7DTnP/ozqBn+1COEegpUyxI+ykOp62nQ0KdT10Ogj/WY6g++0ebDH1tdj4c+yvOrh+QVH+s51kOijKHPs65lGbVQ6ZM837qWPw19znUt5fgYry/6+IFIPbKqJVX1hKQWVZ3gudh+Tb6H5+h7d7rKX9GjRmmH6ojaq2ZuMQ8OzqJ5cHD2mcXgFG/nqY3O0DR16VEzXs9TSymrr4553CwH5jFe3VMPLGtDNPQt9dkmjFH1Hp6D5rzIQtULoJ+z4J3J69Xvrf6T9Whye7lxSH2binffVo2c+uOpxnlqPh3vtcrfVq2/VZ9OV61/UK3vqNb75nw9xQz9QeW9QmY5JutJb30s1l4cdHTM1V9C9F311f9iHhSYfz/mqdTzy42SWc7kTeWGpv6DKrtutIjxJ97uXJ+otZC0Pi+Hjs0d5YZb9eT31LePxsuLZlTe0GyRsqNeQfSWLkZm2TqUWxMsR8douaqXr3xTXdlZbjSpxkVKKlXjBOJZexlSXQaPvhWppoNlsS5f+ba6MiRUHXL4dVC2yqpd/uQ76vfxq9b3LPmhcWrodPXRH6qPau9WOirdg0J19H1KKh4Pfd8ilWowyRVvWhoSutZevTQ0W62pjXgVU11vaiF6/d1MZ5cbp6vfZpb64haL0JVQQF1qVZfOLTfmWz6O1AzJXmvveTpazOqv5aqXo3oVurDcCKmPhm4zHP8cuHqqW1R902Ahqb6UKqmu1KpEyFCXlqpL9fJwcblxlywPx3wRek31LylfSOHdXW3nlBsZ8WypULP6aDlf4TUo2sd8HXptv2Crmp/qwgXlxq8t+WPsIKgj52bVVYNbCaGg+q/o6kptC6FWwcWb1GerllV9Ub7csKN0b1YzX12pvxesXrGHbAqc8AVh9cob+mN16Rvq0ofuDIR+oL7Wqb72eFsCoTnqS9zqSwaLZPUlbB51Rb1JfoxqDH0Be6hFtcapD48WsdPLRay8/Da1PaVOs8yiWVMebbc2KKG7NPX1Ae0rv/n2tdh0+5w225QSe0SFOLXrVjeZSnm8n64EHJ2Gxqlp9fWbVqf2rj98Fn36yVOZiDeY1SxqrqzI5qrZc1bN+f9ANdT9ft+rfEmwMtHU8ZOpenW8He+Iyk/VFfU1n/jE5uzB+M0U+nP1H1TV1FubB/UwZIuer94PfF6lvv5x5Xt+Uubba7/BrarxoPqeilT84JRUnJKKz04q1Gy60fw114xc2UOrWaSStUb1y9aetFv7OWs/nnr4/znm/LHeX1cbMrXBrP4uV8u3AdRG95Bn79Z+mtpAzZWduRIutTxr+3nZqA/NlMS7nCuRUjU6WWf5NK91ric6Q9OekFO1foFA5RhRTn2pWH378kPHWyue6EXPR2MV1YE7P/Q9z62q9YSG9aJKTfpU41L1U+DNz5WV0d7jvAM6NE+1XlGtP6nEYupnvKLceFC+IDo0X312SM2j+pLw8nJjhz4obperxkl4Z/QCdamxQQYVoYWqdVB9WS2hqCZ/Pzn2Gu9oqlB7CMtDlVI0d2gK/z31C6n6cnqtODWrRrkUtYXUt7RWxmSlvjymhvWvy41/rcaa1Sr3Tbz+oErLQTbQTNBa0BpQEDQc9B+gHGgSaBloIegc0BTQGNC5oC5QE2gdaCJoMmg2aCrIDboSNAc0AbQJlAYlQJtBW0BbQdtAFtAC0GrQdtB80IWgJGgDaBxoBGgs6GLQTtBSkBkUBa0HhUFZkAm0GzQedAnoQdBI0DTQ2aDpoI2gH4LOBM0DuUCtoCUgD+g80PmgAGguaBHoDNAFoBmgTtAK0CrQDlAj6CJQBjQLNAq0EpQHpUC7JOXKtWTISzduqYVoN1W8/Z+cBOcesitLsDv/RVv4ZeWf4vb852bl1Zzbnv/cLX3ov6jefj//xXv7k/HskVCj+m3+Mf8l9PbqHoJ/yZ9kjz9/aJp9uBICLNDEkx1DPvgYH3yMDz7GBx/jg4r7oOI+eBwfPI4PHscHvfdB733wPz6ovw/q74P6+6D+PjglH5ySD07JhzrhQ53wwUX54KJ8cFE+VBQfPJUPnsqHauODw/LBYfngsHxwWD5UKR+qlA/uywf35YP78sF9+VDdfKhuPlQ3H5yZD87MB2fmQx30oQ764Np8cG0+1EgfPJwPFdMHR+eDo/PB0fng6HyotD5UWh/cng9uzwe354Pb88Ht+eD2fKjePng/H7yfD5Xdh8rugy/0oc77UOd9qPM+OEgfHKQPHsAHD+CDu/TBXfrgD3zwmj54TR+8pg9e0wev6YPL8MF5+uA8fXCePjjPKl0pKVdeVaq1XUg5kC61pFN54/+lzmH8qbr0Uxk4Hr2rHDLpgEw6IJMOyKQDMumATDogkw7IpAMy6YBMOiCTDsikAzLpgEw6IJMOyKQDMumATDogkw7IpAMy6YBMOiCTDsikAzLpgEw6IJMOyKQDMumATDogkw7IpAMy6YBMOiCTDsikAzLpgEw6IJMOyKQDMumATDogkw7IpAMy6YBMOiCTDsikAzLpgEw6IJMOyKQDMumATDogkw7IpAMy6YBMOiCTDsikAzLpgEw6IJMOyKQDMumATDogkw7IpAMy6YBMOiCTDsikAzLpgEw6IJMOyKQDMumATDogkw7IpAMy6YBMOiCTDsikAzLpgEw6IJMOyKQDMumATDqqMqloivKNbc/mj27b5MqrAvl4pvcr3/oj0B5QN+hq0EjQXtAaUBB0LWg66DrQDaCbQAVQK6gIuh00BtQHugM0EXQX6G7QfaD7QVeBNoOuAT0B2gLqAS0A7QPtByVB14MaQTeCRoB6QbeAbgXdCboHdC/oedDNoF2gF0CvgV4HHQG9CHoJ9DLoDdCboFdAr4LeAvWD3gY9B3oA9CDoAOgh0MOgZaBHQI+CbgM9BnoctAnUCToIehL0FOhp0DOgDOgQ6FnQYdBuUBrUAVoOsoBWgFaCVoFWg9aC1oHMoPWgLGgDaKOkXNnTDlnzd1XCgD+FZjdYpGZX6SrQHlA3aDPoatA1oC2gkaAe0F7QAtAa0D7QflAQdC1oOigJug50PegGUCPoRtAI0DLQTaCbQQVQK6gXdAvoVtBtoCLodlAf6A7QRNCdoLtAd4PuAd0Lug90P+gB0IOgA6CHQA+DHgE9ChoDegz0OGgT6AlQJ+gg6EnQU6CnQc+AMqBDoGdBh0HPgZ4H7QbtAqVBHaDlIAtoBWglaBVoNWgtaB3IDFoPyoI2gDaCXgAdAb0Iegn0MugV0Kug10Cvg94AvQl6C9QPeltSLhSGNDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNTkizE9LshDQ7Ic1OSLMT0uyENDshzU5IsxPS7IQ0OyHNzqo0R7Ta6zJ+YRZ/s3jVbC/S5G3tv8Rt7b/Ebe2/xG3tv8Rt7b/Ebe2/xG3tv8S52r+qnqv9M00+q8qOZ1XZ8awqO55VZcezqux4VpUdz6qy41lVdjyryo5fxY5fxY5fxY5nVdnxrCo7nlVlx7Oq7HhWlR3PqrKjk+3oZDueVWXHs6rseFaVHZ1sx7Oq7NVOjmqyKJeQcZWQcZWwGi8h8Soh8SphpV7CSr2ENKyENKyEVXwJ2VgJ2VgJ2VgJ2VgJq/8SkrISkrISkoEScrMScoISUrQSUrQSMoQSMoQSErYSMrUS8rYS0oYS0oYS0rcS0rcS0rcS0rcS0rcS0rcS0rcS8owSsrgSsrgSsrgSsrgScpASkrkSUpEScroScroScroScroS0pQS0pQSMrwSspUSspUS8r0S8r0S8r0S8r0SMpkSMpkSsr8Ssr8Ssr8S0psSksASksASksAScp4SkrISUsISUsISEqESMsMS8qES8qES8qES8qES8qES8qES8qES8qES8qES8qES8qES8qES8qES8qES8qEqvQB6DfQ66AjoRdBLoJdBb4DeBL0CehX0Fqgf9LakXCimnboD5NQdIPnP8g6Q67/+d4Asrswi1dtJ+fevjczaN9R+7g/e1VH78T94d0cuFNcGXys/q/LGuT/XpEn+Ffzbr+DffgVn+Ss4y1/BWf4K/u1XMMm/qvq3M06JxCmR+A24o1SplcPyWYlEojKL1M2hK5QiqjulOitHSJOVD2oLos1INDYjM9mM3G5zdV29pPLtz5X/c1vVwVxdTc/V6tepLbjakYK2IwVtRwrajhS0HSloO1LQdqSg7UhB25GCtiMFbUcK2o4UtB0paDtS0HakoO1IQduRgrYjBW1HCtqOFLQdvdmOFLQdKWg7UtB2pKDtyD3b8fdqRwrajhS0HSloO1LQdqSg7UhB25F7tiP7a0cK2o4UtB0paDtS0HakoO1IQduRgrYjBW1HCtqOFLQdKWh7daz+RW2sVu6QVHdEvjo4R0N/0jCoNPdXHuC2VH1lWSiUwKgb5yKq9TM1wBep1piaZI9Wk+1fy41mdfPan2mD/95vVf+9dk0mD8MwEYZhIgzDRBiGiTAME2EYJsIwTIRhmAjDMBGGYSIMw0QYhokwDBNhGCbCMEyEYZgIwzARhmEiDMNEGIaJMAwTYRgmwjBMhGGYCMMwEaq0DHQT6GZQAdQK6gXdAroVdBuoCLod1Ae6AzQRdCfoLtDdoHtA94LuA90PegD0IOgA6CHQw6BHQI+CxoAeAz0O2gR6AtQJOgh6EvQU6GnQM6AM6BDoWdBh0HOg50G7QbtAaVAHaDnIAloBWglaBVoNWgtaBzKD1oOyoA2gjaAXQEdAL4JeAr0MegX0Kug10OugN0Bvgt4C9YPelpQLpTR540y4Ek6cBloOsoFmgkaCpoHWgtaAgqCzQdNBw0EbQT8EnQmaB8qBJoGWgVygVtBC0DmgKaAloDGgc0EeUBeoCbQONBF0Huh80GTQbNBUkBsUAM0FLQLNAU0AbQKdAboAlAYlQDNAm0GdoC2graBtIAtoBWgVaAFoNWg7aD7oQlAStAO0ATQO1Ai6CDQClAHNAo0CjQVdDFoJyoN2gpaCUiAzKApaDwqDsqBdIBNoN2g86BLQlZJyoR9q0ptm4U2z8KZZeNMsvGkW3jQLb5qFN83Cm2bhTbPwpll40yy8aRbeNAtvmoU3zcKbZuFNs/CmWXjTLLxpFt40C2+ahTfNwptm4U2z8KZZeNMsvGkW3jQLb5qFN83Cm2bhTbPwpll40yy8aRbeNAtvmoU3zcKbZuFNs/CmWXjTLLxpFt40C2+ahTfNwptm4U2z8KZZeNMsvGkW3jQLb5qFN83Cm2bhTbPwpll40yy8aRbeNAtvmoU3zcKbZuFNs/CmWXjTLLxpFt40C2+ahTfNwptm4U2z8KZZeNMsvGkW3jQLb5qFN83Cm2bhTbPwpll40yy8aRbeNAtvmoU3zcKbZuFNs/CmWXjTLLxpFt40C2+ahTfNwptm4U2z8KZZeNMsvGkW3rRKp4F+LCkXSmu1pz39aUO+G1nGEXN+6GOfVKTx+kd77NMneNpThyZdtAsu2gUX7YKLdsFFu+CiXXDRLrhoF1y0Cy7aBRftgot2wUW74KJdcNEuuGgXXLQLLtoFF+2Ci3bBRbvgol1w0S64aBdctAsu2gUX7YKLdsFFu+CiXXDRLrhoF1y0Cy7aBRftgot2wUW74KJdcNEuuGgXXLQLLtoFF+2Ci3bBRbvgol1w0S64aBdctAsu2gUX7YKLdsFFu+CiXXDRLrhoF1y0Cy7aBRftgot2wUW74KJdcNEuuGgXXLQLLtoFF+2Ci3bBRbvgol1w0S64aBdctAsu2gUX7YKLdsFFu+CiXXDRLrhoF1y0Cy7aBRftgot2wUW74KJdcNEuuGgXXLQLLtoFF+2quugzNemibXDRNrhoG1y0DS7aBhdtg4u2wUXb4KJtcNE2uGgbXLQNLtoGF22Di7bBRdvgom1w0Ta4aBtctA0u2gYXbYOLtsFF2+CibXDRNrhoG1y0DS7aBhdtg4u2wUXb4KJtcNE2uGgbXLQNLtoGF22Di7bBRdvgom1w0Ta4aBtctA0u2gYXbYOLtsFF2+CibXDRNrhoG1y0DS7aBhdtg4u2wUXb4KJtcNE2uGgbXLQNLtoGF22Di7bBRdvgom1w0Ta4aBtctA0u2gYXbYOLtsFF2+CibXDRNrhoG1y0DS7aBhdtg4u2wUXb4KJtcNE2uGgbXLQNLtoGF22Di7bBRdvgom1w0Ta4aBtctA0u2gYXbYOLtsFF2+CibXDRNrhoG1y0DS7aBhdtqzrljFY78H1XgxivkapwL9M+5A1NH/XFTBGcNxnqsk/wHqahr1/6WG9d+vC3LH2Ulyt9rJcqqbMKl+NNNid4q9IneYvSkPMpJziXcvzjEbWVS/3EypBzEcd4CVKnNuR+2021B1ePqWwKLz9ZY6ZyRun75UavfHHSxxs8J3iJ1xcwir4mr+g6uaNuyKu4TjD6VpzSo0+gRydZhtTAGG75kujRSk3eG7QY9wYtxr1Bi3Fv0GLcG7QY9wYtxr1Bi3Fv0GLcG7QYJzgX4wTnYpzgXIx7gxbj3qDFuDdoMe4NWox7gxbj3qDFOFu6GGdLF+PeoMW4N2gx7g1ajLOli3FvUJVsoJmgkaBpoCDobNB00HDQPFAONAnkArWCFoLOAU0BLQGNAZ0L8oC6QE2giaDzQOeDJoNmg6aCAqC5oEWgOaAJoE2gM0AXgBKgGaDNoC2graBtoAWg7aD5oAtBSdAO0DhQI+gi0AjQKNBY0MWgPGgnaCkoBYqCwqBdIBNoN2g86BLQpaDLQJeDrgBdKSkXWqV9Lu+x/8tKOnQVaA+oG7QZdDXoGtAW0P2gHtBe0ALQGtA+0H5QEHQtaDooCboOdD2oEXQjaBmoAGoF9YJuAd0Kug1UBN0O6gPdAZoIugt0N+ge0L2g+0A3gx4APQg6AHoI9DDoEdCjoDGgx0CPgzaBngB1gg6CngQ9BXoa9AwoAzoEehZ0GPQc6HnQbtAuSbnQ6ooSPF+euS6L+NpX4IKqdD3ogKRcaI0m30X+j6KXq3CGhISE0yTMkGCRYJMwU8JICdMkLJAQlDBfwhwJ0yUMl5CUME5Co4R5EkZImCRhlgSXhFESWiUslDBWwhQJSyR4JCyV0CQhJcEsYaKEgITJEmZLcEuYKiEsYZGEuRKiEkwSJkgYLyAXWqvVtoHbLfmhW7jhqy0mzaT+N7j4qS3F6svA4930dXTFWFvxDN31PUuTmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eLHp4cWmhxebHl5senix6eHFpocXmx5ebHp4senhxaaHF5seXmx6eKubHus0ERq1/Vz8parQIeE0CWdKyEhYJqFTwiwJyyVYJKyQsFLCKgmrJayRsFbCWRLWSTBLWC/BLSErYYOEjRJsEmZKGClhmoSghLMlTJcwXMI8CTkJkyS4JLRKWCjhHAlTJCyRMEbCuRI8ErokNEmYKOE8CedLmCxhtoSpEgIS5kpYJGGOhAkSNkk4Q8IFEhISZkjYLGGLhK0StklYIGG7hPkSLpSQlLBDwjgJjRIukjBCwigJYyVcLCEvYaeEpRJSEqISwhJ2STBJ2C1hvIRLJFwq4TIJl0u4QsKVAnKh9Zp0oG44UDccqBsO1A0H6oYDdcOBuuFA3XCgbjhQNxyoGw7UDQfqhgN1w4G64UDdcKBuOFA3HKgbDtQNB+qGA3XDgbrhQN1woG44UDccqBsO1A0H6oYDdcOBuuFA3XCgbjhQNxyoGw7UDQfqhgN1w4G64UDdcKBuOFA3HKgbDtQNB+qGA3XDgbrhQN1woG44UDccqBsO1A0H6oYDdcOBuuFA3XCgbjhQNxyoGw7UDQfqhgN1w4G64UDdcKBuOFA3HKgbDtQNB+qGA3XDgbrhQN1woG44UDccqBsO1A0H6oYDdcOBuuFA3XCgbjhQNxyoGw7UDQfqhgN1w4G64UDdcKBuOFA3HKgbDtQNB+qGA3XDgbrhQN1woG44UDccqBsO1A0H6oYDdVcdaFarpWy/J1O2I0jZjiBlO4KU7Ug1ZdsAifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPZB4DyTeA4n3QOI9kHgPJN4DifdA4j2QeA8k3gOJ90DiPVWJ31iR5tqQehJ7vk/ipEGVDkvKhc6GsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXoew6lF2HsutQdh3KrkPZdSi7DmXXq8qe0+SZw0acOWzEmcNGnDlsxJnDRpw5bMSZw0asAxpx5rARZw4bceawEWcOG3HmsBFnDhtx5rARZw4bceawEWcOG3HmsBFnDhtx5rARZw4bceawEWcOG3HmsLFa/87RZP2zov5ZUf+sqH9W1D8r6p8V9c+K+mdF/bOi/llR/6yof1bUPyvqnxX1z4r6Z0X9s6L+WVH/rKh/VtQ/K+qfFfXPivpnRf2zov5ZUf+sqH9W1D8r6p8V9c+K+mdF/bOi/llR/6yof1bUPyvqnxX1z4r6Z0X9s6L+WVH/rKh/VtQ/K+qfFfXPivpnRf2zov5ZUf+sqH9W1D8r6p8V9c+K+mdF/bOi/llR/6yof1bUPyvqnxX1z4r6Z0X9s6L+WVH/rKh/VtQ/K+qfFfXPivpnRf2zov5ZUf+sqH9W1D8r6p8V9c+K+mdF/bOi/llR/6yof1bUPyvqnxX1z4r6Z0X9s6L+WVH/rKh/VtQ/K+qfFfXPivpnRf2zov5ZUf+sqH9W1D8r6p+1Wv/O1YbcA/QXlcP4XZUP/o+6caShMqxNbb+oDFpT208qE94U+lutMuJMbf8z3x0yaeXGq5UBaWo7Ur6gqQs/KzfMqvFyZViZ2v5G/bfP06pPWW77vnrI8vmaLMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMGdKMFVsoFmgkaCpoGCoLNB00HDQfNAOdAkkAvUCloIOgc0BbQENAZ0LsgD6gI1gSaCzgOdD5oMmg2aCgqA5oIWgeaAJoA2gc4AXQBKgGaANoO2gLaCtoEWgLaD5oMuBCVBO0DjQI2gi0AjQKNAY0EXg/KgnaCloBQoCgqDdoFMoN2g8aBLQJeCLgNdDroCdKWkXGiTktHQ7yqx/XlZdUeoRl+54VCNYr76NPWBipqaQmepR/xOVw/2XadaI1XrAktFUkyhLku+eovdVvXZN9RneUtFCE2hgrr0W+rSdktFnUyhayz56tO1n1OfudVni9Rzg52q9QutopnlqqIueSqPF1atUarVo1X+TKbQXerSVHXpIdXyqla/ao1WraJWUXZT6F2tUhpMoZz6l1rVZw+r1hjVyqrWWNU615Kv3tq3U10apy5dZKmUClNoj7r0O+rSlap1mmrtVx/+sNzos1T+HOWfwlLRb1PoWfVFE9UX7VWtBap1nmqNV62XVGtC5YdVrXmq9Yql8ocyhR605Kt3LD6vPpuvPjvUUJFpU2iyXvnbmkI79Hz1DsPL9UoVKveJeqzyN9VXF/RKgSn/0+rSJHWpV7UmV3561WpSrTv0SgUp/4Pq0hR16XHVWqhaB/VKWSr/WOqST136iV6pRqbQG+rS71c6Xa8UDFPop/rREdh2oDKsLtBOvYvg1LsI8tWH9X9Djemv+UsJPpN3EWzWZAKiIQHRkIBoSEA0JCAaEhANCYiGBERDAqIhAdGQgGhIQDQkIBoSEA0JiIYEREMCoiEB0ZCAaEhANCQgGhIQDQmIhgREQwKiIQHRkIBoSEA0JCAaEhANCYiGBERDAqIhAdGQgGhIQDQkIBoSEA0JiIYEREMCoiEB0ZCAaEhANCQgGhIQDQmIhgREQwKiIQHRkIBoSEA0JCAaEhANCYiGBERDAqIhAdGQgGhIQDQkIBoSEA0JiIYEREMCoiEB0ZCAaEhANCQgGhIQDQmIhgREQwKiIQHRkIBoSEA0JCAaEhANCYiGBERDAqIhAdGQgGhIQDQkIBoSEA0JiIYEREMCoiEB0ZCAaEhANCQgGhIQDQmIhgREQwKiIQHRkIBoSEA0JCAaEhCtmoBs0cTNbaEDWEAewG7ugarR3vrFOSJVjMerGnzKGuU/a2uk/M77qq8/3COdckQf3xFt02TqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF0PqF4Nox5D6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xZD6xapmZDvcyyOYCI/AvTxS/YYLNXmU7Wn8Rk/j25/Gtz9d/fYdWu027G7pH+q3YX8Wd19fpA2+lPNqXe0XXfzF+a9Ttiv/JbJdyg1POZVI5T+R/8prMpH6u8rjQ34Eugq0B9QN2gy6GnQNaAtoJKgHtBe0ALQGtA+0HxQEXQuaDkqCrgNdD7oB1Ai6ETQCtAx0E+hmUAHUCuoF3QK6FXQbqAi6HdQHugM0EXQn6C7Q3aB7QPeC7gPdD3oA9CDoAOgh0MOgR0CPgsaAHgM9DtoEegLUCToIehL0FOhp0DOgDOgQ6FnQYdBzoOdBu0G7QGlQB2g5yAJaAVoFWg1aC9oA2ghaCVoHMoPWg7KgF0BHQC+CXgK9DHoF9CroNdDroDdAb4LeAvWD3paUC+2sSPM9qkaahfL2QcP6MFf7oDB9mLl9UN4+qEgftLYP2tAHleyDpvRBU/qgkn2Yx32YO32YO32Y432Y432YV32Y8X2YZX2YZX1Qgz7MuT7MuT7MuT7MuT6oSB9UpA8q0gcV6YOK9GHm9mHm9mHm9mHm9mHm9mHm9kGZ+qojZpcmw5QIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIwpQIFoERhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRRA8RhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCkRhCmRarixGzIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchoGDIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchoGDIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchoGDIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchoGDIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchoGDIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchoGDIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchoGDIahoyGIaNhyGgYMhqGjIYho2HIaBgyGoaMhiGjYchouCqjl2gfchK1dgK1diT16PnTo2dSP+ZJ1OppUGtD/lhnUivHNkc2fK6nUz+3M6kf8yRq/fypOJL6ZT+J+lhlWF1aqc7PlT+0qN9RV19/mnwieS+O1VUpAboKtAfUDdoMuhp0DagTtAV0AHQ/aCSoB7QXtAC0BrQPtB8UBF0Lmg66DpQEjQNdD7oB1Ai6ETQCdBNoFqgAagX1gm4B3Qoqgm4H9YHuAE0E3Qm6C3Q36B6QG3Qv6HnQfaCbQbsl5UKXVWR1qJp2qblqlrKq5vot5kHpLKqG2gnrk69eEkf+a3tioWnq0qNmKG1tV6w6Yx8358W22DHuB6hvkNX2xULfUp9twn6YEsuD6r9U33sbevfAURWvb4ltV3JlrvSLKfS2auTU7pVqnFdu/LX52BIe+rZq/a25Vlz+QbW+o1rvm/P13bPQH6grA3jTV31nsb6PVlP3oxtpteJR2Z/8d/XtQ7bWzi83Sua82DTcVG5og/Uv1Kgate02USzqO4C1Lbn6JuHQLbkd5YZb9d/31LePRmGZoS6NVZfq+3Sqrrylvq+2hRf6Q/VFEyz5+h5eaKa68k11ZWe50aQaF5UbU1XjBNt3tQJV3747Wp9qG3mhP1JXvq2uDDlkXt+nq23cDe7Xhb6vvuc76vfxq9b31Hd/cA8vdLr66A8ton4d3bod3M07WrPa/rPc+L764vq+3uD2oahmQ3b6auVt6IZebd/uaOE7uoNX27Kt1b/y+sUUOl39NrPUF7eon6K2uxcKqEut6tK55cZ81fjkG371WlrfL6/7qvoWeH3D+8JyI6Q+GrqZffw97C1qEqtvGtzMrhi/UFJdqe1dhwx1aam6VN/Frhmr+rb1MX1VbeP6kvKFFGxVeRFmCmVUY3DrOtSsPlpOezW4V30sdxX6rmo9rb6qtl+9Vc1UdeGCcuPXqjFkB1ttT5tVpw1uZYeC6r+iqyvbylcW5Y/uUws/NrtiTtUX5csNu2rU96w3Kw1QV+o3BtV3r4fsSZ/QjtU3qkN/rC59Q1360I3p0A/U1zrlEY0P7kiH5qgvcasvGdyJrrpPz7HtW6hFtcapD4/uNl+uyWMqP9GklfhJddVwReVLlDQeUD/nv5UbCXO1WrRNySsvZQrFzeorr9TkI59/sTF/9JHPFeiQcJqEMyVkJCyT0ClhloTlEiwSVkhYKWGVhNUS1khYK+EsCeskmCWsl+CWkJWwQcJGCTYJMyWMlDBNQlDC2RKmSxguYZ6EnIRJElwSWiUslHCOhCkSlkgYI+FcCR4JXRKaJEyUcJ6E8yVMljBbwlQJAQlzJSySMEfCBAmbJJwh4QIJCQkzJGyWsEXCVgnbJCyQsF3CfAkXSkhK2CFhnIRGCRdJGCFhlISxEi6WkJewU8JSCSkJUQlhCbskmCTsljBewiUSLpVwmYTLJVwh4UoBubLjlCd0RmNxOxrL2dFYzo7GcnY0lrOjsZwdjeXsaCxgR2OROhqL1NFYpI7GInU0FqmjsUgdjUXqaCxSR2OROhqL1NFYlo7GknU0lqWjsSwdjWXpaCxLR2NZWqVloJtAN4MKoFZQL+gW0K2g20BF0O2gPtAdoImgO0F3ge4G3QO6F3Qf6H7QA6AHQQdAD4EeBj0CehQ0BvQY6HHQJtAToE7QQdCToKdAT4OeAWVAh0DPgg6DngM9D9oN2gVKgzpAy0EW0ArQStAq0GrQWtA6kBm0HpQFbQBtBL0AOgJ6EfQS6GXQK6BXQa+BXge9AXoT9BaoH/S2pFzoR1rtFPR3tMpf19T2vfL/v1u+cH1D/ujisGap1fp2PQ611hdftYO3HzxJXTsaPOTA9NDz0VdptWD0ni8+DmUAehD0dQhAvyqR5xjQlykAPQzaBTpBHJoL7amMc5WZTWvIV2PAb6vGz8qN+835atjToa78VH2NWYy/Q9glO4S92UPV9We3Vl2imkI/1vIfPAvNk7w8u8szsTzTjLPCudDVlX+jJrnvYMv9HWy5v4PDAO/gMMA7OAzwDrbc38GW37s4pvAufu13sYn5brUTrqn8gOopYKNqGaS/lm6+W1l892jyjIQfZyT8OCPhxz/uxxkJP85I+HFGwo8zEn6ckfCjW/zoFj+6xY8zEn6ckfDjjIQfZyT8OCPhxxkJP/5gfvzB/Dgj4ccZCT/OSPjxB/PjjIQfZyT8OCPhxxkJP85I+HFGwo8zEn6ckfDjjIQfZyT8OCPhxxkJP85I+HFGwo8zEn6ckfDjjIQfZyT8GJB+nJHw44yEH2ck/Dgj4ccZCT/OSPhxRsKPMxJ+nJHw44yEH2ck/Dgj4ccZCT/OSPhxRsKPMxJ+nJHw44yEH2ck/Dgj4ccZCT/OSPhxRsKPMxJ+nJHw44yEH2ck/Dgj4ccZCT/OSPhxRsKPMxJ+nJHwQ178OCPhxxkJP85I+HFGwo8zEn6ckfDjjIQfZyT8OCPhh/r7cUbCD8H044yEH2ck/Dgj4ccZCT/OSPhxRsKPMxL+qtDu1eTi3gSrZoI5M8GcmWDOTDBnJpgzE8yZCebMBANmggEzwYCZYMBMMGAmGDATDJgJBswEA2aCATPBcplgx6p0PegGUCPoRtAI0DLQTaCbQQVQK6gXdAvoVtBtoCLodlAf6A7QRNCdoLtAd4PuAd0Lug90P+gB0IOgA6CHQA+DHgE9ChoDegz0OGgT6AlQJ+gg6EnQU6CnQc+AMqBDoGdBh0HPgZ4H7QbtAqVBHaDlIAtoBWglaBVoNWgtaB3IDFoPyoI2gDaCXgAdAb0Iegn0MugV0Kug10Cvg94AvQl6C9QPeltSLrRPkw43DYebhsNNw+Gm4XDTcLhpONw0HG4aDjcNh5uGw03D4abhcNNwuGk43DQcbhoONw2Hm4bDTcPhpuFw03C4aTjcNBxuGg43DYebhsNNw+Gm4XDTcLhpONw0HG4aDjcNh5uGw03D4abhcNNwuGk43DQcbhoONw2Hm4bDTcPhpuFw03C4aTjcNBxuGg43DYebhsNNw+Gm4XDTcLhpONw0HG4aDjcNh5uGw03D4abhcNNwuGk43DQcbhoONw2Hm4bDTcPhpuFw03C4aTjcNBxuGg43DYebhsNNw+Gm4XDTcLhpONw0HG4aDjcNh5uGw03D4abhcNNwuGk43DQcbhoONw2Hm4bDTcPhpuFw03C4aTjcNBxuuupw92vS4drhcO1wuHY4XDscrh0O1w6Ha4fDtcPh2uFw7XC4djhcOxyuHQ7XDodrh8O1w+Ha4XDtcLh2OFw7HK4dDtcOh2uHw7XD4drhcO1wuHY4XDscrh0O1w6Ha4fDtcPh2uFw7XC4djhcOxyuHQ7XDodrh8O1w+Ha4XDtcLh2OFw7HK4dDtcOh2uHw7XD4drhcO1wuHY4XDscrh0O1w6Ha4fDtcPh2uFw7XC4djhcOxyuHQ7XDodrh8O1w+Ha4XDtcLh2OFw7HK4dDtcOh2uHw7XD4drhcO1wuHY4XDscrh0O1w6Ha4fDtcPh2uFw7XC4djhcOxyuHQ7XDodrh8O1w+Ha4XDtcLh2OFw7HK4dDtcOh2uHw7XD4drhcO1wuHY4XDscrh0O1151uNdq0uFm4HAzcLgZONwMHG4GDjcDh5uBw83A4WbgcDNwuBk43AwcbgYONwOHm4HDzcDhZuBwM3C4GTjcDBxuBg43A4ebgcPNwOFm4HAzcLgZONwMHG4GDjcDh5uBw83A4WbgcDNwuBk43AwcbgYONwOHm4HDzcDhZuBwM3C4GTjcDBxuBg43A4ebgcPNwOFm4HAzcLgZONwMHG4GDjcDh5uBw83A4WbgcDNwuBk43AwcbgYONwOHm4HDzcDhZuBwM3C4GTjcDBxuBg43A4ebgcPNwOFm4HAzcLgZONwMHG4GDjcDh5uBw83A4WbgcDNwuBk43AwcbgYONwOHm4HDzcDhZuBwM3C4GTjcDBxuBg43A4ebgcPNVB3uddqQd+d815KvbpbNUI2D5cYfWdSXXj/0S++o7atdq6mvuEE79VSzr+hTzW4rX/iz/Ml+3v6ph5od5x6H/1L+/8X5Ez7c7Eatto19rXlwll1sHpyQB8z5oxvbudBN8EIpeKEUvFAKXigFL5SCF0rBC6XghVLwQil4oRS8UApeKAUvlIIXSsELpeCFUvBCKXihFLxQCl4oBS+UghdKwQul4IVS8EIpeKEUvFAKXigFL5SCF0rBC6XghVLwQil4oRS8UApeKAUvlIIXSsELpeCFUvBCKXihFLxQCl4oBS+UghdKwQul4IVS8EIpeKEUvFAKXigFL5SCF0rBC6XghVLwQil4oRS8UApeKAUvlIIXSsELpeCFUvBCKXihFLxQCl4oBS+UghdKwQul4IVS8EL/P3t3Hhhnnd+HX5KhFOw6LQRSzwSQHGYEpXXyC8VVIWu1aKzIOFOiWE3AZGqBPb5mRr4kBmFsbmHvepeuOWxAlgchw8AONwZkLEu2sUAIFpbN0TNt0zbtpkfOtkkj0p+eGUv7vDDXblj28v7DvGTZ1srPvL/v7+f7zGgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWgZXWhZpQs9Uj1199S/+p7dPdV/YonaMhXvf1m+OelRwjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEeY5wjxHmOcI8xxhniPMc4R5jjDPEea5SpgPEKPtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2E6PtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2E6PtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2E6PtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2E6PtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2E6PtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2E6PtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2E6PtxGg7MdpOjLYTo+3EaDsx2k6MthOj7cRoOzHaToy2V2J0XzUjvc9hknfiAO/Ecd1HTuk+Zjj3mQzjThjCTU3nvpth3Gf7wy5PHLpNz9ZOmLqFhm3JJcFXPT1kmx67fTbTtk+csk1P14L56t8KdkKf088OeKx8YX/Md3r6mp++Mj/84v9lLv4TXxw3/c8+fc2f+E82fc1P/9udeM2f+K85fbF/8Onwaf5Zg+/uL4Xf4OTb/8DTT5npf+np58z0P/n0k2f633z6WTT9jz/1jz79dProf/3pf/QTxt4fM+7+6Oth6jqYfu6dcCFMP+e+fUU8Xh1+YdO36FDfokN9i3b3Ldrdt2h336JDfYse8a1KwhZ/zC/EE6+/4NK8ijfa+fG6EJ9g69LL1qWXrUsvW5deti69bF162br0snXpZevSy8Xdy8Xdy8Xdy9all61LL1uXXrYuvWxdetm69PK06+Vp18vWpZetSy9bl16edr1sXXorT7sn+SYv55u8nG/ycr7Jy/kmL+ebvJxv8nK+ycv5Ji/nm7ycb/JyvsnL+SYv55u8nG/ycr7Jy/kmL+ebvJxv8nK+ycv5Ji/nm7ycb/JyvsnL+SZXdBq6FM1GF6MFqBPNQ2egZtSFLkBnooXoSnQDuhBdi+agPDob3YjiaC7qRjehGGpEF6HLUQK1oivQ+WgzuhrdjK5Bl6AtaCu6Bd2KFqHbUAu6HS1Fd6AomonuRLPQOSiC7kI96G6UQsvQEnQV2oaq0HZ0Hvoi+hLagb6MvoLuCasr+TViNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To2liNE2MponRNDGaJkbTxGiaGE0To+lKjJbKMfrfJ7cAbwYbn+B9cLaXb7p7inztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1g3ztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1g3ztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1g3ztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1g3ztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1g3ztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1g3ztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1g3ztIF87yNcO8rWDfO0gXzvI1w7ytYN87SBfO8jXDvK1o5KvTxOjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLRGjJWK0RIyWiNESMVoiRkvEaIkYLVVi9JnqE18tMvUSkFvLt6I/W/39Py+efsHHd3Bw/Gle3nHyBPkH+gT5szw4/pXJT9hR0/OxJ8jP0SkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fI0CkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fI0CkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fI0CkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fI0CkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fI0CkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fI0CkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fI0CkydIoMnSJDp8jQKTJ0igydIkOnyNApMnSKDJ0iQ6fIVDrF89VTr7r4xWD09T151cUL03/Hld+zv+PF6s/oPo6W8M84+2G+j+P7efvGdAf4Pt7HsT9cEBYfCfWDCs4N4/owloexIoyVYVwWxpfCWBXGjDDuCmN1GGvCWBtGJoxsGLkwdoTx5TC+Esa6MGrCWB/GWWFsCGNjGJtC6Eq+9KmfhMEFcvWMT342/sjcVfVjejPVy+EnYTJLS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPQsLT1LS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPQsLT1LS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPQsLT1LS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPQsLT1LS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPQsLT1LS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPQsLT1LS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPQsLT1LS8/S0rO09CwtPUtLz9LSs7T0LC09S0vP0tKztPRspaW/Uh3+4Yd53vEvX3lHrkGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StFGSNkrSRknaKEkbJWmjJG2UpI2StNFK0h4gRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRohRiPEaIQYjRCjEWI0QoxGiNEIMRqpxOir5RidCs6NM8JRuZG38t3IWxVX9CW0Cs1Aq9FalEFZlEM70Ea0CbWj5WgFugzdhdagL6OvoHWoBq1HZ6ENYXUlD1aH9g+Lx4PP2BNCV3Ko/Al7glnPjG9fS4vfLf/iofIvHp78xV8N/+J74T/mvfJnDgefmVwSvPVk49QPqzwUnjx98GdUTo2zpoZrU0OsqWHT1GhpasTWlRypnnpjvp+aGtNN/3y5Xzs1+IzD5S/ijOCL+POaT/F3Tg8TP/iXT8/1puaOyb82+Ycubgn9/wmeaGt6TvyRmuUp4S+U31HqyOSXU/7q/tHkd2RT8mj56w9+4OD1M8pPig/+LEJ+BOHK6p5P+KGDr1WfcFPIc1Pfj5fLN4Ucqw6/jX62fH18Fe1E96L70BZ0P3oAbUWz0S60Gy1CWfQgeggtQA+jeWgp6kV7UB+aifaiWSiNCugR1I8WokfRANqHHkOPoyJ6Aj2J5qKvoRJ6Cj2NnkHPoufQ8+gF9CLaj15CL6NX0Bw0iA6gzehVtBIdREPoEBpGI2gFOoyOoKPoNXQMbUfb0HXoerQKzUCr0Rq0FmVQDq1DNWg92oA2ok1oFL2O3kBj6E00jt5Cb6Ovo3fQu+gb6D30TXQu+o2wupKjxPZf1oRju6Kd6F50H9qC7kcPoK1oNtqFdqNFKIseRA+hBehhNA8tRb1oD+pDM9FeNAulUQE9gvrRQvQoGkD70GPocVRET6An0Vz0NVRCT6Gn0TPoWfQceh69gF5E+9FL6GX0CpqDBtEBtBm9ilaig2gIHULDaAStQIfREXQUvYaOoe1oG7oOXY9WoRloNVqD1qIMyqF1qAatRxvQRrQJjaLX0RtoDL2JxtFb6G30dfQOehd9A72HvhlWV/J1ormBRt1Ao26gUTfQqBto1A006gYadQONuoFG3UCjbqBRN9CoG2jUDTTqBhp1A426gUbdQKNuoFE30KgbaNQNNOoGGnUDjbqBRt1Ao26gUTfQqBto1A006gYadQONuoFG3UCjbqBRN9CoG2jUDTTqBhp1A426gUbdQKNuoFE30KgbaNQNNOoGGnUDjbqBRt1Ao26gUTfQqBto1A006gYadQONuoFG3UCjbqBRN9CoG2jUDTTqBhp1A426gUbdQKNuoFE30KgbaNQNNOoGGnUDjbqBRt1Ao26gUTfQqBto1A006gYadQONuoFG3UCjbqBRN9CoG2jUDTTqBhp1A426gUbdQKNuoFE30KgbaNQNNOoGGnUDjbqBRt1Ao26gUTfQqBto1A2V1vxGOZr/9PgHXwg+mPyVatgKpy/pFyp/wFj5DwhmL0uCIcyJ85lgdPMbNT2hQc3HzmferA4fKBU4UCpwoFTgQKnAgVKBA6UCB0oFDpQKHCgVOFAqcKBU4ECpwIFSgQOlAgdKBQ6UChwoFThQKnCgVOBAqcCBUoEDpQIHSgUOlAocKBU4UCpwoFTgQKnAgVKBA6UCB0oFDpQKHCgVOFAqcKBU4ECpwIFSgQOlAgdKBQ6UChwoFThQKnCBFThQKnCgVOBAqcCBUoEDpQIHSgUOlAocKBU4UCpwoFTgQKnAgVKBA6UCB0oFDpQKHCgVOFAqcKBU4ECpwIFSgQOlAgdKBQ6UChwoFThQKnCgVOBAqcCBUoEDpQIHSgUOlAocKBU4UCpwoFTgQKnAgVKBA6UCB0oFDpQKHCgVOFAqcKBU4ECpwIFSgQOlAgdKBQ6UChwoFThQKnCgVOBAqcCBUoEDpUIlRsfLMTpVr5rZrzezG2tmjtHMvrSZ3Vgzu/BmJgnNlab/VvmvDW4l/rnjJwTJr5QPGd6unhrjX/cpxvgPfOIY/+vTf94Fn+LP6//EP++d6pM/DOyH9IeBfYpXkQY/wOrv9Jz8YWDf43cpfrd66iRx8UU93/eDxG+cfEr/yDylgyfwP/7Qp/bJp/T39Cn9Xng7tvhfhnZjFVwfxrlhLA9jRRjpMFaGcVkYq8KYEcbqMNaEsTaMTBjZMHJhdISxLoyaMNaHcVYYG8LYGMamME4L49IwZodxcRgLwugMY14YZ4TRHEZXGBeEcWYYC8O4MowbwrgwjGtDuL+qqroq+N9Ur6p8Sj6Ms8O4MYx4GHPD6A7jpjBiYTSGcVEYl4eRCKM1jCvCOD+MzWFcHcbNYVwTxiVhbAljaxi3hHFrGIvCuC2MljBuD2NpGHeEEQ1jZhh3hjErjHPCiIRxVxg9YdwdRiqMZWEsCeOqMLaFURXG9jDOC+OLYXwpjB1hfDmMr4RxTwhdyW+W8276pR81oVg7rlXoNHQpmo0uRjmURQtQJ5qHzkCbUDtajppRF7oApdGZaCG6Et2ALkTXojkoj85GN6I4Wofmom50E4qhRnQROgtdjhKoFV2Bzkeb0dXoZnQdugZdgraglWgrugXdimag1WgtWoQy6DbUgm5HS9EdaCOKopnoTjQLrUCXoXNQBN2F1qAedDdKoWWoBi1B69FVaAPahqrQdnQe+iK6J6yu5G9Uh+fvA8zfB5i/DzB/H2D+PsD8fYD5+wDz9wHm7wPM3weYvw8wfx9g/j7A/H2A+fsA8/cB5u8DzN8HmL8PMH8fYP4+wPx9gPn7APP3AebvA8zfB5i/DzB/H2D+PsD8fYD5+wDz9wHm7wPM3weYvw8wfx9g/j7A/H2A+fsA8/cB5u8DzN8HmLQNMH8fYP4+wPx9gPn7APP3AebvA8zfB5i/DzB/H2D+PsD8fYD5+wDz9wHm7wPM3weYvw8wfx9g/j7A/H2A+fsA8/cB5u8DzN8HmL8PMH8fYP4+wPx9gPn7APP3AebvA8zfB5i/DzB/H2D+PsD8fYD5+wDz9wHm7wPM3weYvw8wfx9g/j7A/H2A+fsA8/cB5u8DzN8HmL8PMH8fYP4+wPx9gPn7APP3gco8+TerTw6fflSGTyeHTlNDp18Kro3gK/qcpk+/VX4WTUXqP5kRDtGKLkEz0GnoUjQbLUItaB46A1WhKJqJmtEsdAG6DJ2JzkEL0ZUogi5E16Kz0RyUQnG0DNWguehy1IiWoLNQK7oKxVACXYSuQOeH1ZX87erK7S9VyeJUoA2eWrnnpSr5xqnhm2F+ovI7/gWXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZCuXZGvlAvuX1eGbZVeXP+WraCe6F92HtqD70QNoK5qNdqHdaBHKogfRQ2gBehjNQ0tRL9qD+tBMtBfNQmlUQI+gfrQQPYoG0D70GHocFdET6Ek0F30NldBT6Gn0DHoWPYeeRy+gF9F+9BJ6Gb2C5qBBdABtRq+ileggGkKH0DAaQSvQYXQEHUWvoWNoO9qGrkPXo1VoBlqN1qC1KINyaB2qQevRBrQRbUKj6HX0BhpDb6Jx9BZ6G30dvYPeRd9A76FvonPRb4TVlfxX1eG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WZG5WbEyN/vX1SfnZp//3Kxyz97f7/k0A7Rv34v3wzFJS/d8Z5O0qTsLv5OJWjAX+1/Ba1x+4O/n+jfB8ytZG/wT/uvJf8tZwYMnJh/8jeDB48cvvD/oCdrK5NU0Y/JX5gXPwXXBo9nBo5uD2603TD64ccbxZ+Mtwa/9RPBrPcGHVk8+6A8+9DeDD90WfGh98NcHD1ZOPngt+LWzgl9rDf5frpl88OvBJXh28KH7g0fnBI92VZfDrypZCj50UfCh/cGjnwoevRc8+tvBo8eDT1sx+eB3gwfXTT7oCv78OcGvbQgeRYJH+eBRNHh0Z/BlLA+ekcGHfjr40D3Bo3ODRw8Fv9g++eCJGeVEm/wrgwfZyQdHgk+aG3zS7uDRecGjseDR+eWvJ3jUHDwan1FOuKrkCzOOp9ax4Ndagl87HFyaGycfxE4ph2JV8o7gwarg/21wk+vPBJ/UH3xobfD3BB+6IPjQo8GjWPlLDR7Fg0dPBp+2Lvh7gg9dGHzoQPDoyuDRweDRouDRSPBVZIKvK/hQXfCh3wx+Z27ywTvBh/5O+RsbfGjT5IPfKl8j/5YqezpV9nSq7OlU2dOpsqdTZU+nyp5OlT2dKns6VfZ0quzpVNnTqbKnU2VPp8qeTpU9nSp7OlX2dKrs6VTZ06myp1NlT6fKnk6VPZ0qe3plofud6s/oBzC4Bn6eb/keBNTFPZ/VW7+fEMTf0VvAn5DNJ74V/NQ6+d28JfzUkvqD8IMa/l11+M2Nzy5fXHvC6kr+++rwDLGNGWIbU8M2poZtzAnbmAW2Mf1rY97XxkyvjZleGzO9NqZ4bczt2pi/tTFxa2Pi1sbkrI3JWRuzpDbmaG3M0dqYo7UxOWtjctbGdKyN6VgbM9k25q5tTFrbmFa1MXdtY9Laxmy1jWlqG9PUNmakbUxF25iDtjEHbWMO2sYEs40JZhsTzDamjW1MFNuYKLYx82pjmtrGzKuNCVEb05w2pjltTI/amB61MT1qY3rUxhSojSlQG5OlNiZLbUyI2pgQtTEhamPe18bEtI2JaRsT0zYmpm1MTCtKo5fRK+gxNIgOoM1oJTqIhtAhNIxG0Ap0GB1BR9F2dB26Hq1CM9BqtAatRRmUQ+tQDVqPNqCNaFNYXcn/UI7mYE2PBzn/55MP7j6lHHuT3Xpq97n2lHJgVyV/O3jwfycf1J1SDsqq5JWnlNOmavHfm/zvX0z+94ry87Eq+fvBLwSrXq78o9h/t/z3BIX78Rk9lTp/9qk9lS5+1qlTLbvu1OBz/+Pk55aX5n9XHbzl4n8q/9Zg8V722b4f5PRi+cFXbXUl/zMr1nxWrPkk7HzWr/msX/NJ3/msZvPJ4vmk73xWuvlk8XzWvfkk83xWwfnk9Hxyej4r5HxWyPmskPNJ9Pmsl/PJ9/msnvNJ+/mk/XzSfj65Mp9Vdz45PZ81eD5r8HzWjPmsGfNZM+aTTvNZu+ezds9ntZ7Paj2f1Xo+69B81u75rN3zWaPms0bNZ12fz7o+nwyfT4bPJ8Pnk+HzyfD5pPZ8UruiOWgQHUCb0atoJTqIhtAhNIxG0Ap0GB1BR9Fr6Bjajrah69D1aBWagVajNWgtyqAcWodq0Hq0AW1Em9Aoeh29gcbQm2gcvYXeRl9H76B30TfQe+ibYXUlf6/6e7tTnR7bTo0AP83WdXp8e+Iednpq+x1tZj/4o4I/eVM7Pdf9jHa3vz754Ixgwf2rbXOnRo/fm+3u1FDyO/iB0J9+fjm9DZ6aLE9vh6dGyx+zLf4v5ct0qhfsJb33kt57Se+9rO97yfK9rNN7Waf3kvN7WVP3kvp7Sf29rIZ7WQ33shruZX3Yy/qwl/VhLyvlXlbKvawde1k79rJ27KUT7WUl2ctKspeVZC9rx17Wlb00lr2sK3tZV/bSJ/ayyuxlDd/LmrOXNWcva85e1py9rDl7K+n2X6vD77x/J0tPReeilWgVmoFWo7Uog7IohzaiTagdLUcrUBpdhtagDrQO1aD16Cy0Iayu5LfK3+QT36TltyafzvGe0Ju1BG/o0lzd8wlv1vL71byHe/DW7c8Gvzt4M/f7TilfG1WLG4LP/G/VUz9K99emPsG3wT84+WBrOT/++0d/jcnnTvngF3nZJ36R/6P6+FvhLL6gsmosru359moylcpTmfiJm6np5XJ6kfnozdT/rA5vpn6l/C/yVXQvug/dj2aj3SiLFqCH0TzUi/pQAfWjhehxVERz0BPoSTQXldBT6Fn0HNqJtqAH0KtoK9qFFqEH0UNoKdqDZqK9aBZ6FA2gfehr6Gn0DDqGHkHb0AF0BA2hQ+gV9BgaRW+jr6PX0RtoDL2J3kHvonH0FvoGeg99E72GnkcvoBfRfvQSSqOX0SDajFaig2gYjaAV6DA6iraj69D1aBWagVajNWgtyqAcWodq0Hq0AW1Em8LqSv5Bdfj9VP4i9P+yguvDODeM5WGsCCMdxsowLgtjVRgzwlgdxpow1oaRCSMbRi6MjjDWhVETxvowzgpjQxgbw9gUQlfyD8vfy2OTy9471aGr+uc4Efu5ymr8R9XHi8Dinyr/YlXyJ8tvEvXH1VNvWPdHwZg02Nz99/Cu73s69PyT6vCbTeygbe7gGb6Da76i09ClaDa6GOVQFi1AnWgeOgNNoE2oHS1HzagLXYDS6Ey0EF2JbkAXomvRHJRHZ6MbURytQ3NRN7oJxVAjugidhe5Bl6MEakVXoPPRZnQ1eh9dh65BN6NL0Ba0Em1Ft6Bb0Qy0Gq1Fi1AG3YZa0O1oKboDbURRNBPdiWahFegydA6KoLvQGtSD7kYptAzVoCVoPboKbUDbUBXajs5DXwyrK/mn1eHpzh7K0B6icg9lqKLdaD96CT2M5qE0ehm9gh5Dj6MimoMG0QH0JJqLNqNX0Uq0FR1EQ+gQGkHDaA9agQ6jR9ERdBS9ho6h7WhbWF3J/1V98gbiky+87/mubhcObuNNBBP4H9xX4H9Otwn/7+oPH4YFo6+R6p4PvL3ybaf0fMIw7P9Uf0ZnSL/8fbvb8bO5y/G7u7vxY457vpvjnclrZ/F/+LDn9+d3E+OfVR//sRGLr+752LfvnrziFl/S8+2l6jCvWano6Mdden9eHX7B/gMU1YrORZegGeg0dCmajS5Gi9AC1IKuQPPQGWgpiqKZqBnNQhegy9CZ6By0EF2JIuhCdC2ag85GKRRHy1ANmosuRzHUiM5CF6GrUCtKoCWoCp2PzgurK/l/q8Mz+z8pvzXbV9G96D50P5qNdqMsWoAeRvNQL+pDBdSPFqLHURHNQU+gJ9FcVEJPoWfRc2gn2oIeQK+irWgXWoQeRA+hpWgPmon2olnoUTSA9qGvoafRM+gYegRtQ6PobfR19Dp6A42hN9E76F00jt5C30DvoW+i19Dz6AX0ItqPXkJp9DJ6BT2GBtEBtBmtRAfREDqEhtEIWoEOoyPoKNqOrkPXo1VoBlqN1qC1KINyaB2qQevRBrQRbQqrK/kX5WieSv27y+m9PKyu5ET11E/BOjNoTUFNfihoLx9TbD62L79f/vNenPzcf19djoeqxe8FH//L6qlbc8c+tyn1/6v+sdxRBz9y4LGekzvrH/G3tPucNtRVNVM3ovzb40/o4wdQ1ZO/UP7W/mH53vua8udNfi+SbwfnUVN9cIzGMkYfHKMPjtFmxmiHY3SbMdrMGG1mjOY4RnMco9uM0W3GaJVjtMoxWuUYLWiMjjlGJxqjE42xwo7RUcbon2M0pDEa0hgNaYy1eIymOkZTHaObjtFNx+imY3TTMbrpGB1sjA42Rm8do7eO0VHG6ChjdJQxOsoYHWWMVjJGK6loDhpEB9Bm9CpaiQ6iIXQIDaMRtAIdRkfQUfQaOoa2o21hdSVn1PxYLn4/cIteMJq9PfiVk6vfD+Hqd0pN+EaH93nXgPd5vf/7vNHT+7zR0/u80dP7vNHT+7ym/31e7/8+bwL1Pm8C9T5vAvU+bwL1Pq/br6gdLUfNqAtdgNLoTLQQXYluQBeia9EclEdnoxtRHK1Dc1E3ugnFUCO6CJ2FLkcJ1IquQOejzehqdDO6Dl2DLkFb0Eq0Fd2CbkUz0Gq0Fi1CGXQbakG3o6XoDrQRRdFMdCeahVagy9A5KILuQmtQD7obpdAyVIOWoPXoKrQBbUNVaDs6D30R3RNWV/LUmvB094/KTeOr6F50H7ofzUa7URYtQA+jeagX9aEC6kcL0eOoiOagJ9CTaC4qoafQs+g5tBNtQQ+gV9FWtAstQg+ih9BStAfNRHvRLPQoGkD70NfQ0+gZdAw9grahUfQ2+jp6Hb2BxtCb6B30LhpHb6FvoPfQN9Fr6Hn0AnoR7UcvoTR6Gb2CHkOD6ADajFaig2gIHULDaAStQIfREXQUbUfXoevRKjQDrUZr0FqUQTm0DtWg9WgD2og2hdWV/Gt005ryp5yLVqHT0KVoNroY5VAWLUCdaB46A21C7Wg5akZd6AKURmeihehKdAO6EF2L5qA8OhvdiOJoHZqLutFNKIYa0UXoLHQ5SqBWdAU6H21GV6Ob0XXoGnQJ2oJWoq3oFnQrmoFWo7VoEcqg21ALuh0tRXegjSiKZqI70Sy0Al2GzkERdBdag3rQ3SiFlqEatAStR1ehDWgbqkLb0Xnoi+iesLqSp9UcP1NafGbP53Sk9NdreAFn8CLMP6rcQ1aVbAseBC/U3DD1Ss7zgt9yevm3fNJXF5yMffXUz+rLPKP8d041yYPlb9696FmURg+gregR1I8eRY+hXehxtBsVURY9gZaiB9FD6Ek0Fy1AJfQ0egY9jHrRc2ge2oNmoufRq2glegG9iA6i/WgIHUIvoWE0glagw+hl9AqagwbRAXQEHUWvoWNoO9qGNofVlZxZ89G3iq7gxDu42+/3ez7h5HvWR/xxwdn6mzU9H3gZ9s5PPEn/G0ZN8AqwmuMB8/9qKgGT/Gr5JG528JnJ8oj/T4JP/c3JB5cGh3DvTz7408lPSbYFvzYRPPqnwaNFwWdNTD5oqS5fSpN/RfCWqr8a/NrC4ENTpXJu+ft2LlqFTkOXotnoYpRDWbQAdaJ56Ay0CbWj5agZdaELUBqdiRaiK9EN6EJ0LZqD8uhsdCOKo3VoLupGN6EYakQXobPQ5SiBWtEV6Hy0GV2NbkbXoWvQJWgLWom2olvQrWgGWo3WokUog25DLeh2tBTdgTaiKJqJ7kSz0Ap0GToHRdBdaA3qQXejFFqGatAStB5dhTagbagKbUfnoS+ie8LqSv5ETeX1WlXJs4OUnVqtH2LNr+gxlEZz0VZ0EL2KXkTb0Bw0gl5CK9BmtB2tRAfQETSEDqFX0H70GhpGR9Hz6AV0GL2MBtGxsLqSf5MpyQQneBOc4E1wgjfBCd4EJ3gTnOBNcII3wQneBCd4E5zgTXCCN8EJ3gQneBOc4E1wgjfBCd4EJ3gTnOBNcII3wQneBCd4E5zgTXCCN8EJ3gQneBP0mAlO8CY4wZvgBG+CE7wJTvAmOMGb4ARvghO8CU7wJjjBm+AEb4ITvAlO8CY4wZvgBG+CE7wJTvAmOMGb4ARvghO8CU7wJjjBm+AEb4ITvAlO8CY4wZvgBG+CE7wJTvAmOMGb4ARvghO8CU7wJjjBm+AEb4ITvAlO8CY4wZvgBG+CE7wJTvAmOMGb4ARvghO8CU7wJjjBm+AEb4ITvAlO8CY4wZvgBG+CE7wJTvAmOMGb4ARvghO8CU7wJjjBm+AEb4ITvAlO8CY4wZvgBG+CE7yJyj7ib9WEX4DcxwuQ+3gBch8vQO7jBch9vAC5j5cc9/GSnz5enNzHC5D7eAFyHy9A7uMFyH28ALmPFyD38RKcPl6A3McLkPt4AXIfL7Pp4wXIfbwAuY8XIPfxAuQ+XoDcxwuQ+3gBch8vQO7jBch9vAC5jxcg9/EC5D5egNzHC5ArehodRa+hY2g72hZWV/JMRkiHykvrvehZlEYPoK3oEdSPHkWPoV3ocbQbFVEWPYGWogfRQ+hJNBctQCX0NHoGPYx60XNoHtqDZqLn0atoJXoBvYgOov1oCB1CL6FhNIJWoMPoZfQKmoMG0QF0BB1Fr6FjaDvahjaH1ZU8K1wuF/958BnnhrEqjNPCuDSMXBjZMBaEcUYYXWFcEEY6jCvDuCGMC8OYE0Y+jBvDiIexLoy5YcTCaAzjojDOCuOeMK4I4/wwNodxXRjXhLEljK1h3BLGrWHMCGNRGJkwbgujJYzbw1gaxsYwomHMCiMSxl1h3B1GKoyOML4SRk0YS8JYH8ZVYWwIoyqM7WGcF8YXw/hSGLPDuDiMHWF0hjEvjE1htIexPIzmMM4MY2EY14ZxdhhfDqM7jJvCuDyMRBitYVwdxs1hXBLGyjBWh7E2jDvCmBnGnWGsCOOyMM4JY00YPWEsC2NbCF3JnyzHXHDu9Hc/zc9V+MiTq/84+eDJmp4TTq66kmd7t/oPyE3qJ96b/pnckv6Z3Ip+wi3oH/1+1r8w+eCCmp5P80Ksz+sW9E9+G/NP8+YUf6V7zz/ynvOpe80/9m0ovof3nJ9Tfi6kJ/07lQlkVfJ/l895furkSzq+5y/pKP9A0eT8mp7v7hWNJ3/G6A/zzxj92+Un2NRO7wvsa7/APuUL7Gu/wA7qC+wwvsBO9gvs375Q2UXMCV5JGZwX/0L5lZSRmpM/tqLnr/pjK4KfSdFU82GX8Gf90xl/XH9sRfTDX/D7RvkK34nuRfehLeh+9ADainah3SiLHkQPoQXoYTQPLUW9aA+aidLoEdSPHkUDaB96DD2OiugJ9CSai0roKfQ0egY9i55Dz6MX0ItoP3oJvYxeQXPQIDqANqNX0Up0EA2hQ2gYjaAV6DA6go6i19AxtB1tC6sr+dPBKhL82LzfLK8i55afnlNpMRWqwSKw9dTQE/ujfpzDR+3hupLncaDaUf5SzkWr0GnoUjQbXYxyKIsWoE40D52BNqF2tBw1oy50AUqjM9FCdCW6AV2IrkVzUB6djW5EcbQOzUXd6CYUQ43oInQWuhwlUCu6Ap2PNqOr0c3oOnQNugRtQSvRVnQLuhXNQKvRWrQIZdBtqAXdjpaiO9BGFEUz0Z1oFlqBLkPnoAi6C61BPehulELLUA1agtajq9AGtA1Voe3oPPRFdE9YXcnzj5+MVS3Olde/qsV/vSdYP6uSxaA6/ZvJB98Iiln/5IP/GVSjZyYf/Fnw4IHJB/8nePBQsCUKHuyafPCnwYPnJh/8SfDgkckHf1j+Qai15b9naq2/n7CpaA86iF5E29CraA4aQS+hFWgz2o5WolfQAXQEDaFDaD8aRq+ho+h59AI6hg6jl9FgWF3Juprwm3N2l09Qv4riaA9qRuegq1ArugJdi84Oqys5ly+whXcPbeH9Qlt4v9AW3i+0hfcLbeH9Qlt4h9AW3hO0hVsCWngX0BbeYbKFdwFt4V1AW/hmtfAuoC28C2gL7wLawruAtvBNbuFdQFt4F9AW3gW0hXcBbeFb3sK3vIUbElp4F9AWLoYW3gW0hXcBbeH2hBbeBbSF9/1s4R07W3gX0BYumxYuqRbeS7SFdwFt4d1DW7jcWngX0JbKBfYzQd88flkvHtsUdM4Ljs9PqhY/3/PtXV9v+fnzMHoMpdFctBXtQQfRHPQqehFtQy+hEbQCbUYr0XZ0AB1BQ+gQegXtR6+hYXQUPY9eQIfRy2gQHQurKxnjPqJe7iPq5T6iXu4j6uU+ol7uI+rlXqFe7irqJUJ6uY+ol/uIermPqJf7iHq5j6iX+4h6edr2ch9RL/cR9XIfUS9P1F7uI+rlPqJe7iPq5T6iXu4j6uU+ol7uI+rlPqJe7iPqZXXp5T6iXu4j6uU+ol7uI+rlzqFe7hzq5c6hXu4c6uXOod5KMMSnzy/GTu2pnF/8RXXwC/WVxKhKHjw1SIsLWaFuZAm9kdS8kf+TN7Iq3Ei630je3UgW3kim3Uie30ie31j5P3LRyfOWH4i30Dr5zlk/qO+cFRztvBRM2T/mUOXvMC86tby0nItWodPQpWg2uhjlUBYtQJ1oHjoDbULtaDlqRl3oApRGZ6KF6Ep0A7oQXYvmoDw6G92I4mgdmou60U0ohhrRRegsdDlKoFZ0BTofbUZXo5vRdegadAnaglairegWdCuagVajtWgRyqDbUAu6HS1Fd6CNKIpmojvRLLQCXYbOQRF0F1qDetDdKIWWoRq0BK1HV6ENaBuqQtvReeiL6J6wupIXn/hC3vqe8gt5Fx8Lfv3vll++e0r5hbnBBOi1yQf/onzDx9/zdwYv/f3JYJEJ3lvgJyp/VLKqHLLzyp85uVwkVwWfOXUY93b569mJ7kX3oS3ofvQA2op2od0oix5ED6EF6GE0Dy1FvWgPmon2ojR6BPWjhehRNID2ocfQ46iInkBPormohJ5CT6Nn0LPoOfQ8egG9iPajl9DL6BU0Bw2iA2gzehWtRAfREDqEhtEIWoEOoyPoKHoNHUPb0bawupI/+zFvFPA3PvhGAYt/puev8COEfq78VwXvN5CoPv43/L2a8N85/VVM/53f9d/1/wW7u+CN/6+vCXZ3P8/5Y1C2D06GW/LXgphbG96aTDXG7/Ru0q7kJbxEZYR0G+GaH+H5PkKejZBnI2TBCFkwwrN/hGf4CDk4wvN9hFQc4dk/QkaOkAUjZN0I+TlCfo6QGiOkxgjZOkKGjJAaI6TGCCk8QtKOkCEjJPQIKTxCCo+QNiM8w0d4ho+QRCMk0QjP/hFyaYQsGCELRsisEZJhhGQYIRlGSIYRsm6ErBsh60bIuhGyboR8GSFfRsiXEfJlhHwZIV9GyM+RStr8/ZrQz+1OXsBrTyu6Hp2LlqMVKI1WosvQKjQDrUZr0FqUQVmUQx1oHapB69FZaAPaiDah09ClaDa6GC1AnWgeOgM1oy50AToTLURXohvQhehaNAfl0dnoRhRHc1E3ugnFUCO6CF2OEqgVXYHOR5vR1ehmdA26BG1BW9Et6Fa0CN2GWtDtaCm6A0XRTHQnmoXOQRF0F+pBd6MUWoaWoKvQNlSFtqPz0BfRl9AO9GX0FXRPWF3JS2sqP9eo8sGfZyD988znf54zjZ+vjJLnl3/78Z+GNP3H/Fklov9B+Rcfn+w1zwYtbXdw30AwS5vqMv2sxP2s9f00m35W/n6aTT+9o581u58u088K3s9q28+a3c+63M/q18/a1M/a289q289q288q1k8r6Gf166dN9NMY+mkF/bSCflpBPz2gn7W+n7W+n7W+n9W9n9W9n9W9n9W9n9W9n9W9v3JBNPwgvRoqOEv4iWDT8KP2sqgfnFdDTR0rnHxV1EcfI/xDNnvDbPaG2ewNE4nDbPaGicRhNnvDbPaG2ewNE5DDbPaG2ewNs9kbJnSH2ewNs9kbZrM3zGZvmM3eMAvAMJE/zGZvmM3eMJu9YTZ7wywxw2z2htnsDbNwDLNUDLPZGyaeh1k4hon1YaJ7mEVlmOVnmFgfJtaHifVhFpxhQn6Y5WeY5WeYBWCYBWCYBWCY5W6Y5WCY5WCY5WCY5WCY5WCY5WCY5W6YBXWYZXK4snBcdsKoOXnd1LvSvjr1rrRzgs+8fPozZwQvW7s6GMtce+rx3/PPTg0+5ReCgc6xSf7ujGCg84WaqR98vbTnwyZIwbAq2vNZTJIWsGWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNsWWNcYHF2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLG2LLGCLkYW9YYW9YYW9YYW9YYW9YYW9YYW9YYW9YYW9ZYJUYbg/x+bPKr2B3E9z/6vPYUQeX/L9U9oc3FiXuK72AH8TEbhx/1DcMP19smfL82Bv+Y92B6PVQIKlgVxmlhXBrG7DAuDiMXRjaMBWF0hjEvjDPC2BRGexjLw2gOoyuMC8JIh3FmGAvDuDKMG8K4MIxrw5gTRj6Ms8O4MYx4GOvCmBtGdxg3hRELozGMi8I4K4zLw0iE0RrGFWGcH8bmMK4O4+YwrgvjmjAuCWNLGCvD2BrGLWHcGsaMMFaHsTaMRWFkwrgtjJYwbg9jaRh3hLExjGgYM8O4M4xZYawI47IwzgkjEsZdYawJoyeMu8NIhbEsjJowloSxPoyrwtgQxrYwqsLYHsZ5YXwxjC+FsSOML4fxlTDuCaEreUU52f5fkJ5B1L8y+WX8m55gV1m1+Dd7ykt78vUgVg9NfuBbk5u4quC9R97qCXbEVYtfn/xAdfCB3558UBM8eLMn2INWLf5PwZ/dxDhliHHKEOOUIcYpQ4xThhinDDFOGWKcMsQ4ZYhxyhDjlCHGKUOMU4YYpwwxThlinDLEOGWIccoQ45QhxilDjFOGGKcMMU4ZYpwyxDhliHHKEOOUIcYpQ4xThhinDDFOGWKcMsQ4ZYhxyhDjlCHGKUOMU4YYpwwxThlinDLEOGWIccoQ45QhxilDjFOGGKcMMU4ZYpwyxDhliHHKEOOUIcYpQ4xThhinDDFOGWKcMsQ4ZagyTkkcfyVD5YM/Wx3+x/nZSsle+LmP6v9KbfrTzOO/X7U6OF/40+BXTvbrnh+gft188lUwJ18F8319FcwvTX7KL/ZUZhlXfuyT5wfjVTEf82T6xfKTaWqwt41XO1d0X1hdyZbybwieEfHgT/zzyQd3Bw8Kkw9unnpqrA0efHXywW8HD3ZOPvid4P/B/518UBd8pG/ywZXBg7+Y/IKu6Al+6m5V8vdPOX7J5srvNrCo/BcF/9gXB783mO9fXTlDqHw9zzBIfYYp/jOVtfDK8h8R3L5+OPidL00++K3gwcjkg39RfgXg4qnPWLzw+L/n3ww+/EsM/OsY+Ncx8K9j4F/HwL+OgX8dA/86Bv51DPzrGPjXMfCvY+Bfx8C/joF/HQP/Ogb+dQz86xj41zHwr2PgX8fAv46Bfx0D/zoG/nUM/OsY+Ncx8K9j4F/HwL+OgX8dA/86Bv51DPzrGPjXMfCvY+Bfx8C/joF/HQP/Ogb+dQz86xj413Gd1jHwr2PgX8fAv46Bfx0D/zoG/nUM/OsY+Ncx8K9j4F/HwL+OgX8dA/86Bv51DPzrGPjXMfCvY+Bfx8C/joF/HQP/Ogb+dQz86xj41zHwr2PgX8fAv46Bfx0D/zoG/nUM/OsY+Ncx8K9j4F/HwL+OgX8dA/86Bv51DPzrGPjXMfCvY+Bfx8C/joF/HQP/Ogb+dQz86xj41zHwr2PgX8fAv46Bfx0D/7pK/ibLMTr12p//Wd7RfBXdi+5D96PZaDfKogXoYTQP9aI+VED9aCF6HBXRHPQEehLNRSX0FHoWPYd2oi3oAfQq2op2oUXoQfQQWor2oJloL5qFHkUDaB/6GnoaPYOOoUfQNjSK3kZfR6+jN9AYehO9g95F4+gt9A30Hvomeg09j15AL6L96CWURi+jV9BjaBAdQJvRSnQQDaFDaBiNoBXoMDqCjqLt6Dp0PVqFZqDVaA1aizIoh9ahGrQebUAb0aawupL/hIZbS8OtpeHW0nBrabi1NNxaGm4tDbeWhltLw62l4dbScGtpuLU03Foabi0Nt5aGW0vDraXh1tJwa2m4tTTcWhpuLQ23loZbS8OtpeHW0nBrabi1NNxaGm4tDbeWhltLw62l4dbScGtpuLU03Foabi0Nt5aGW0vDraXh1tJwa2m4tTTcWhpuLQ23loZbS8OtpeHW0nBrabi1NNxaGm4tDbeWhltLw62l4dbScGtpuLU03Foabi0Nt5aGW0vDraXh1tJwa2m4tTTcWhpuLQ23loZbS8OtpeHW0nBrabi1NNxaGm4tDbeWhltLw62l4dbScGtpuLU03Foabi0Nt5aGW0vDraXh1tJwa2m4tTTcWhpuLQ23ttJwryrH6EjwZfRUXij/bnmu8Mvljwd3Of7i1F2OP91znzdC/kzlnsSqZLx8d2Nr+bcEv3D+1ADw23dC/pPysOZXyp+yd/IPG+r59mvqx2l+4/TqcXr1OK1wnJY9TkccpxWO0zTH6Yjj9PFx+vg4jXGcxjhOVx+nq4/T1cfpluM093Ga5jhNc5zeMk6PH6fHj9M7x+md4/TOcRrOOP1/nP4/TuMfp/GP0/jHafzjNP5xmu04zXac3cA4zXac5jdO8xun+Y3T/MZpfuN0vXG6XkVz0CA6gDajV9FKdBANoUNoGI2gFegwOoKOotfQMbQdbQurK7mERjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjWbRjW7krdtvOrtV3nvvl/lfeh+lVfE/WpleP1Py7/9T49/8Knyp/wv9L/RnLC6kr/KPCPCG8RVtBPdi+5DW9D96AG0Fc1Gu9ButAhl0YPoIbQAPYzmoaWoF+1BfWgm2otmoTQqoEdQP1qIHkUDaB96DD2OiugJ9CSai76GSugp9DR6Bj2LnkPPoxfQi2g/egm9jF5Bc9AgOoA2o1fRSnQQDaFDaBiNoBXoMDqCjqLX0DG0HW1D16Hr0So0A61Ga9BadDx+76+qqq4K/nf8wzk+aR2qQevRBrQRbUKj6HX0BhpDb6Jx9BZ6G30dvYPeRd9A76FvhtWV/DVeR7T4f0w++NlTeyrvef4Ppvv0Faf2VOr6fzqlp9LGG8ol/OoTX6/0ZzU9lZpeP/XCpdqpSr8g+C3XcE/Ofi7K/Twl9hMx+3l67q989UvLf9gn/TzD6ZsXPvhWNMHNIAu4B2T6OP0DP+Fw+iaBruS1FJduiks3xaWb4tJNcemmuHRTXLopLt0Ul26KSzfFpZvi0k1x6aa4dFNcuiku3RSXbopLN8Wlm+LSTXHpprh0U1y6KS7dFJduRkHdjIK6GQV1MwrqZhTUzSiom1FQN6OgbkZB3YyCuhkFdTMK6mYU1M0oqJtRUDejoG5GQd2MgroZBXUzCupmFNTNKKibUVA3o6BuRkHdjIK6GQV1MwrqZhTUzSiom1FQN6OgbkZB3YyCuhkFdTMK6mYU1M0oqJtRUDejoG5GQd2MgroZBXUzCupmFNTNKKibUVA3o6BuRkHdjIK6GQV1MwrqZhTUzSiom1FQN6OgbkZB3YyCuhkFdTMK6mYU1M0oqJtRUDejoG5GQd2MgroZBXUzCupmFNTNKKibUVB3ZWvy69NvbdZY3XPfh7yd2vTrUIN3PSuc0vNXeEFqaurdO5L/ujq0iPxsZRH5Z9OTpDnVPff5do2byu/juGz6a+2pOf4F/cwpPd+bt2FrZ0kLVqjnT/1u1rbvZEm77kPf3WRe5dtzPbu4JezilrBvW8K+bQk7tSXsxpaw/1rCjmsJu6ol7KqWsKtawj5qCTunJeyAlrDnWcKeZwl7lyXsXZbQ5pewk1nCTmYJO5kl7F2WsHdZwv5kCfuTinaiLegB9CrainahRehB9BBaivagmWgvmoUeRQNoH/oaeho9g46hR9A2dAAdQUPoEHoFPYZG0dvo6+h19AYaQ2+id9C7aBy9hb6B3kPfRK+h59EL6EW0H72E0uhlNIg2o5XoIBpGI2gFOoyOou3oOnQ9WoVmoNVoDVqLMiiH1qEatB5tQBvRprC6ksvL0XxsMrd3hv7vjrF9qGgPejGsruSK8h8T3H/6T6vL39Kq5B2nfvs5tfit0J9QRlcyzc9+uKL8xV2DzkWXoBnoNHQpmo0uRovQITSEFqAWdAWah85AS1EUzUTNaBa6AF2GzkTnoIXoFXQliqAL0WPoWjQHnY1SKI4OoCNoGapBc9HlKIYa0VnoInQVakUJtARVofPReWF1JVd+7q+nCH5KQ+3UGwuffGHFyRdWLP4h+fEiH/NCilXBm1sEY8KV5TcnWn3yRUonn0uf43MpiNSfrvlRe1KtmS5yuVOP/7/dELo0K2/e3vVh44Sp93f/xHdtP2GKMNUL3ywvjmvphc30wmaaYDNNsJkm2EwTbKYJNtP9mml0zXS4ZjpcM+t8Mx2umQ7XTIdrpsM10+Ga6XDNdLhmOlwzHa6Z1tZMa2umtTXT05ppZs20tmZ6WjM9rZku1kwXa6aLNdPFmmlfzfSmZrpYM32rmS7WTKNrpos10+GaaeTNdLHmSvvKBOvG5MWZvPvUYN3IegAVLCg/X9m6VCX/YfAgGOJ9oTzkygW/M/j4llOC39kxPROMzjj+G1aXP28d5ztxznfinO/EOd+Jc74T53wnzvlOnA1anPOdOOc7cc534pzvxDnfiXO+E+d8J875TpzznTjnO3HOd+Kc78Q534lzvhPnfCfO+U6c85045ztxznfinO/EOd+Jc74T53wnzvlOnPOdOOc7cc534pzvxDnfiXO+E+d8J875TpzznTjnO3EmvHHOd+Kc78Q534lzvhPnfCfO+U6c85045ztxznfinO/EOd+Jc74T53wnzvlOnPOdOOc7cc534pzvxDnfiXO+E+d8J875TpzznTjnO3HOd+Kc78Q534lzvhPnfCfO+U6c85045ztxznfinO/EOd+Jc74T53wnzvlOnPOdOOc7cc534pzvxDnfiXPKEOd8J875TpzznTjnO3HOd+Kc78Q534lzvhPnfCdeGSqtL8foZElNnhok89TgYSd3me7kftSd3EW7k7sbd3IX5k7uptzJPZI7udtwJ3do7uTOx53cabmT+yB3cgfjTu673MmdnTu5e3Mnd0zu5J7MndyTuZM7SXdyN+VO7tfcyX2XO7lXdSf3qu7k7s2d3I+6k3tOd3K/5s7KPZkbyv9m/3ny0nmg/O2tWnx7+cletbizp1IJg9/0B5P//eeT//0vk/+9oSe0VZhu9f918lfunfzvH07+d0NPqN3/0eQHbipnfNXir/SEdlGTu7HFt07+91uT/91XjqKqxQ/2hNrw709+4MWecl9evH/yv783+d+XJ//73yb/Ozj53z+e/O/BntCOarJ7Lx4uLwRVi48G/+c2lv/PfcwuZXr3Ob01/PDd5y+z+5ze20zvPqe/H9ObzhPfsWRyH7D47Z7QnnN633PiDvPENzWZ3kh+cM/5ad7dZHrzOb0Zmv6eTW+Gpred07ui6f3n9LZoeiM6vT+a2kxM70g/xXufnLBZ/ZhN6kfvlaZ2KdPb1xM2SdPb1W/vljZR9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctT9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctT9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctT9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctT9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctT9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctT9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctT9PIUvTxFL0/Ry1P08hS9PEUvT9HLU/TyFL08RS9P0ctXil7n9Gu3fnJqbZq+GbTyw027yp/xxOQX+lw5nqoW/0ZPcA9CVfL3qnsqI9n+YBbXO/kgEjyYugFikBdnDfKip0GK5CAvxxqkSA7yUqZBXrw0yEu1Bnm50iAv3BrkxUuDvIxrkJcyDfICrEFexjXIC5sGeWHTIC/xGuRlToO8sGmQFzYN8vKvQV7mNMjLnAap24MUyUFK9CCFd5CSOUgVH6SmD1JqB6m/g9TfQYr5IIV3kJo+SDEfpOIOUnEHKeaDbBIGqb+DlPZBSvsgdXuQYj5IbR5kkzDIxmOQzcVgpWDfMP0mTfcEz5Wgrn0r3OO+p3d55ct/+cPB87MmdJnv5om0m0tyN0+k3Vw+u/mH381FsZtv/W4urd18m3ZzGezmH34338LdXAa7uUB38w+xm3/c3fzj7uaS3M0luZvLZzeX8m4ug91crru5YHbztNrNU2c3F+9uLt7dXKC7udB2Vy6fG8v/gsHbqf1xT2i/cvK07ORp2eIP/ASqqdOy6T3jyZPn49u+7vKTKPiHCub+U+WiQLYVWKYLJGSBhCyQkAUqSoE6UaAkFEjPAnlZIC8LJGuB9CyQngXSs0BeFsjSAulZID0L5FeB/CqQiQWytECWFkjIArlXIPcKpG6BFCyQ5AWSvEDqFsjnAulZqKTnTeV/+GDNPW1Gz+e05m5mxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpBkxpCszBhuPnl72MnC+znfHnbbj1zz3UIZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJEUZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJEUZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJEUZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJEUZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJEUZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJEUZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJEUZSVFGUpSRFGUkRRlJUUZSlJEUZSRFGUlRRlKUkRRlJFUpI1vLMVqcjNWfDE8Q+pgZ9DEz6GNm0MfMoI+ZQR8zgz6mEn3MDPqYEvQxJehjStDHdKGPmUEfM4M+ZgZ9zAz6mBn0MTPoY5/exz69jylBH1OCPvb+fUwX+tjR9zFP6GPv38fEoo+JRR+Thz4mD33MGvqYGfRVZga38G4lX5kRvhy+Urkj9VZW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1XpW1frKqnobMbqDGN1BjO4gRncQozuI0R3E6A5idAcxuoMY3UGM7iBGdxCjO4jRHcToDmJ0BzG6gxjdQYzuIEZ3EKM7iNEdxOgOYnQHMbqj8k2+/VPd4PnJN3b+weQHbgw+8AN1h+cd5f93wbuz/OUpPR/2ljLBO7gsmrrD8xPfpuUDb8xy5+c+gwrecK35x+R1v9/BzxsMhjOLK3cwVCWTwYMf3PHUyfPYT5xK3UXwJwj+BMGfIPgTBH+C4E8Q/AmCP0HwJwj+BMGfIPgTBH+C4E8Q/AmCP0HwJwj+BMGfIPgTBH+C4E8Q/AmCP0HwJ+jPCfpzgv6coD8n6M8J+nOC/pygPyfozwn6c4L+nKA/J+jPCfpzgv6coD8n6M8JgjtBf07QnxP05wT9OUF/TtCfE/TnBP05QX9O0J8T9OcE/TlBf07QnxP05wT9OUF/TtCfE/TnBP05QX9O0J8T9OcE/TlBf07QnxP05wT9OUF/TtCfE/TnBP05QX9O0J8T9OcE/TlBf07QnxP05wT9OUF/TtCfE/TnBHUhQX9O0J8T9OcE/TlBf07QnxP05wT9OUF/TlTqSc/0bbgP1/RU7r69a+qtWF+s6QndmHt08sGz5ei9+0NvzJ2+DffEO3Snbsw9UJ6V3IseRmn0ANqK+tGj6Dn0GNqFHke7UREtRQ+hJ9FctACV0NPoGTQPPYseQXvQ8+hVtBK9gF5EB9F+NIQOoZfQMBpBK9Bh9DJ6Bc1Bg+gAOoKOotfQMbQdbUObw+pKbis/Ez58x/Dfqns+8G6Ut33Su1F+YOuwnbdQ/PflL+CraCe6F92HtqD70QNoK5qNdqHdaBHKogfRQ2gBehjNQ0tRL9qD+tBMtBfNQmlUQI+gfrQQPYoG0D70GHocFdET6Ek0F30NldBT6Gn0DHoWPYeeRy+gF9F+9BJ6Gb2C5qBBdABtRq+ileggGkKH0DAaQSvQYXQEHUWvoWNoO9qGrkPXo1VoBlqN1qIMyqGNaBNag9ahGrQebUCj6HX0BhpDb6Jx9BZ6G30dvYPeRd9A76FvhtWV/GI5mp+aDPWvzui5L3lN9WQJ+rs9wU+LqkrWVpef9ZN77eCXlgYTn00zyk/9quTh4EPXBh/68oxyKlcl3wk+9OvBh9ZOdqVkKnh0+YxySFctvjsU8qOE/CghP0qQjxLkozyFRwnyUYJ8lOgeJbpHie5RonuU6B4lukeJ7lGie5ToHiWsRwnkUUJ3lJgdJUpHidJRonSUKB0lSkeJ0lHCc5S4HCUuR4nLUZaKUeJylIgaJaJGidJRonSU+BolWEcJs1HCbJTQHSXaRom2UaJtlGgbJaxHCetRwnqUsB4lrEcJyFECcpSAHCUgRwnIUQJylAVgtPLE/BInr/dw8npP5eR1x/E7+Ssf3Mezah9X5D6ukH1ckfu4XvZx1e3j+bePZ8c+rtZ9PP/2cbXu4+rZx9Wzj6tnH1fPPq6efVw9+7h69nH17OPq2ce/wz6upX1cS/u4lvZxLe3jWtrHtbSPa2kf19I+rqV9XEv7uJb2cS3t41rax/Wyj2tpH1fPvsrV8+Wp93Rf/Ds93+7av1f+1FmogL6GZqO+sLqSXyn/FVNfxdeZMVa0B70YVlfyHn/k4cf9qMN/Xv7Uqcowq/zFnItWodPQpWg2uhjlUBYtQJ1oHjoDbULtaDlqRl3oApRGZ6KF6Ep0A7oQXYvmoDw6G92I4mgdmou60U0ohhrRRegsdDlKoFZ0BTofbUZXo5vRdegadAnaglairegWdCuagVajtWgRyqDbUAu6HS1Fd6CNKIpmojvRLLQCXYbOQRF0F1qDetDdKIWWoRq0BK1HV6ENaBuqQtvReeiL6J6wupJfnXrrvt8tv3XfzoDB4eho+T0A7/U9AINIPWfqLf1+t6anMvC8pjzwvM8xTzDL6azp+bAfOhIMfnac2vMJg537p19S9sef20vKHjj5WoiTr4X4HA+bg5ebP9XzI3bovOvH80kU/Hi/uad8R8+mqR8E+DFPq+kfDPg9fn4FN35cfMqP7BPtR+oJtpsjj58ub9+/inaie9F9aAu6Hz2AtqLZaBfajRahLHoQPYQWoIfRPLQU9aI9qA/NRHvRLJRGBfQI6kcL0aNoAO1Dj6HHURE9gZ5Ec9HXUAk9hZ5Gz6Bn0XPoefQCehHtRy+hl9EraA4aRAfQZvQqWokOoiF0CA2jEbQCHUZH0FH0GjqGtqNt6Dp0PVqFZqDVaA1aizIoh9ahGrQebUAb0SY0il5Hb6Ax9CYaR2+ht9HX0TvoXfQN9B76ZlhdyQcZJ3UyTupknNTJOKmTcVIn46ROxkmdjJM6GSd1Mk7qZJzUyTipk3FSJ+OkTsZJnYyTOhkndTJO6mSc1Mk4qZNxUifjpE7GSZ2MkzoZJ3UyTupknNTJOKmTcVIn46ROxkmdjJM6GSd1Mk7qZJzUyTipk3FSJ+OkTsZJnYyTOhkndTJO6mSc1Mk4qZNxUifjpE7GSZ2MkzoZJ3UyTupknNTJOKmTcVIn46ROxkmdjJM6GSd1Mk7qZJzUyTipk3FSJ+OkTsZJnYyTOhkndTJO6mSc1Mk4qZNxUifjpE7GSZ2MkzoZJ3UyTupknNTJOKmTcVIn46ROxkmdjJM6GSd1Mk7qZJzUyTipk3FSJ+OkTsZJnYyTOhkndTJO6mSc1FkZJz3EudFA+VPuRXvQkyiN5qLH0Vb0MHoM7UZF9Dx6Fa1EL6AX0UG0Hw2hQ+gYegkNoxG0Ah1GL6NX0Bw0iA6gI+goeg1tQ9vR5rC6kg9zM3oTN6M3cTN6EzejN3EzehM3ozdxM3oTB0VN3IzexM3oTdyM3sTN6E3cjN7EzehN3IzexM3oTdyM3sTN6E3cjN7EzehN3IzexM3oTdyM3sTN6E3cjN7EzehN3IzexM3oTdyM3sTN6E3cjN7EzehN3IzexM3oTdyM3sTN6E3cjN7EzehN3IzexM3oTdyM3sTN6E1MjJu4Gb2Jm9GbuBm9iZvRm7gZvYmb0Zu4Gb2Jm9GbuBm9iZvRm7gZvYmb0Zu4Gb2Jm9GbuBm9iZvRm7gZvYmb0Zu4Gb2Jm9GbuBm9iZvRm7gZvYmb0Zu4Gb2Jm9GbuBm9iZvRm7gZvYmb0Zu4Gb2Jm9GbuBm9iZvRm7gZvYmb0Zu4Gb2Jm9GbuBm9iZvRm7gZvYmb0Zu4Gb2JG1CbuBm9iZvRm7gZvYmb0Zu4Gb2Jm9GbuBm9iZvRm7gZvalyLtJbjtF7FlclN9SUs68qeSi4J+qfBYPWL5V/pvqe4BBnZTDPKp/p9B0/sK/8MS/x1KnoaFhdyb3l3zC1jO5iad7FIr6LBXAXi+MuFohdLLG7WJB2scjtYjncxZK3i4VlF4vOLpbtXSyAu1jkdrHI7WKh3sVCvYslfRdL8y6Ww10slbuoF7uoELtY/HexiO9iEd/FQr2rsowWWEYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbWUYbyYJGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltFGltHG/5+9ew+M8j7zQy9LjtzOaNkVFLqD5EFiQYWyy/aUdbsrWlixDIeLpuws3S4wQhhzGZgBDxcP96sAgUgiThIndkLkOL6NLTm+xE7ie+JbEufm2DndTS97epqebve02/acY8vXrHz0apD8+xjHcbLO5ob/ej+SEBjm/b7P+zyP3uEyOp/L6Hwuo/O5jM7nMjqfy+h8LqPzuYzO5zI6n8vofC6j87mMzucyOp/L6Hwuo/Mr17hPhzG67PtBilZwVYjLQ6wPsSHExhCbQrSGyIWoCbE5xJYQ+RCFEFtDbAtxdYhiiOoQ20NMCLEjxM4QuwKU0je9V2//5DB4bIw4NhUenSe+m/eDGpsOj80aLxwK/0jvDDU6kBydQ3YMf+L3Rn/6753fMmpsfvxu3jvqguHlj/QeUhfMNS98L6nRwebojPnHeW+p0Sn02KRzbBw9OvJ8F08bGB1Hv/vp6NjgenRMPTYmHZ1Tv8ObUt3M3PTZkeLqw+gj6Fp0CH0UfQwdRvei69D1aAnaij6OPoHmoXNoNlqNPon6UBx9Cm1EN6EUuhndgm5Ft6Eyuh3dgfrRVHQn+gy6C92N7kGfRp9F96H70efQ59EX0AMogR5ED6ED6GG0CT2CHkWPoS+iL6EN6HH0BHoSPYWeRj3odKhS+paRE3Y0P6L4/t/CVcDRU300v0bTYzR+o+vH74Qx9taVwFL6VuZ1W6uDi/155dBl6Ao0Ds1C29BWNA9dg2ajGNqFrkTr0SJUQtPQRjQepdBStBvNQFmUQHvQRLQXtaAimor2of1oOpqPZqIJaC5aiDJoAZqCDqCV6CBah1ahOegQ2oQOoyPoKKpBm1EeLUEFdAwtRl1oNTqOdqIGFEcnUB3agFrRJDQZnURbUDc6hdagtagarUDb0XK0A51GVagHJdEZdDZUKX3b6A/zpFdEpWz0nu1/b6SHWB75RJS5J8Kd6Xebve+4hX3LSPbeTvYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2Vsgewtkb4HsLZC9BbK3QPYWyN4C2VuoZO8dIwEYtURaomR8dfjgVHRw4/DBwejg+eGDWHTwzPDB90f32vPRwYeGD/5s9EGGR6ODbw4f/PnwQfrSaBD0fPSh7wwfXBHdA782fNAcfeSG4YOl0cFzwwd/GR28Pvx/s6A7WoCrStcPF8vp90W//NKobP768Kf+S3dUsVctm9gdbcVVpV+Mfs3A8MF/jQ6+Nnzwjagk/1bUh4gOom7Dtujgy9GfKzr4RtQ7iA6+GrVfooOvDB8cjg5Gb8X/zcjfzofRR9C16BD6KPoYOozuRdeh69EStBV9HH0CzUPn0Gz0SbQaxdGn0E0ohW5Gt6BbURndju5A/WgquhN9Bt2F7kan0T3o06FK6X5ml7860sntC1VKD0TTzvui5uPItPPO6FeMnATLbjl/ftSEL7ab2ZevaBX6MPoIuhYdQh9FH0OH0SPoXjQOXYeuR0vQVvRx9Ak0D51Ds9En0WrUgPrQDSiOPoXq0I2oFd2EUuhmdAu6FZXR7egO1I+mogF0J/oMugtNQHejp9E96NPodKhS+jMjp8ho1XKShfCKLkebUA7VoM0ojwpoK9qGdqJd6Eq0Hm1AG1Er2oKuRkVUjbajCWhHqFL6rl+GH2qLfgisl4nGxR8RXfZTfrusX6ifXLs7ulRHG0v/rCa6VN8zclKNXjqy1AYVPYwS6P5QpfS9F/yo+rLvdo886mPZcyPft2rZs9HXfZbB7xvRd1oX4qoQl4dYH2JDiI0hNoVoDZELURNic4gtIfIhCiG2htgW4uoQxRDVIbaHmBBiR4idIXYFKKXvY6L2veqwsvoeRf33KOq/R1H/PYr671HUf4+i/nsU9RWNQ9eh69EStBV9HH0CzUPn0Gy0Gn0S9aEbUBx9CtWhjehG9Gl0E0qhm9Et6FZ0Gyqj29EdqB9NRQPoTvQZdBe6G92D7kWfRfeh+9Hn0OfRF9ADKIEeRA+hA+hhtAk9gh5Fj6Evoi+hDehx9AR6Ej2FnkY96DRah65COVSDNqM8KqBtaCfahbagIqpG29EO9GX0FfRV9Az6Gvo6+gb6JvoWehZ9Gz2HnkffCVVK3/9e7eT84dvv5LybFZwLN29+pIWbH75X827WaX68NZp3WJ/5cdZlhsuqZX/a/TYV7ztUuj+48rpgG+aCkutttl8+d77YGv4bu3QkBqvS/+OS6BOfP184VV4+f8TF6o8qL6YvsHNcxc5xFTvHVewcV7FzXMXOcRU7x1XsHFexc1zFznEVO8dV7BxXsXNcxc5xFTvHVewcV7FzXMXOcRU7x1XsHFexc1zFznEVO8dV7BxXsXNcVeljPcA87BX+Il/hr+AVlpRfYUn5FZaUX2FJ+RX+N1/hr+AVFphfYYH5FRaYX2GB+RX+Vyq6Eq1Hi1AJTUMb0XiUQkvRbjQDZVEC7UET0V7UgopoKtqH9qPpaD6aiSaguWghyqAFaAo6gFaig2gdWoXmoENoEzqMjqCjqAZtRnm0BBXQMbQYdaHV6DjaiRpQHJ1AdWgDakWT0GR0Em1B3egUWoPWomq0Am1Hy9EOdBpVoR6URGfQ2VCl9IME4AdpXVZ0H8qhy9AVaByahbahrWgeugbNRjH0fbQLXYnWo0WohKahjWg8SqGlaDeagbIogfagiWgvakFFNBXtQ/vRdDQfzUQT0Fk0Fy1EGbQATUEH0Er012gdWoUOojnoENqEDqMj6CiqQZtRHi1BBXQMLUZdaDU6jnaiBhRHJ1Ad2oBa0SQ0GZ1EW1A3OoXWoLWoGq1A29FytAOdRlWoByXRmVCl9ENE5SC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14iC14mClVnyYALy8OgzAy+k9VnQZugKNQ7PQNrQVzUPXoNkohnahK9F6tAiV0DS0EY1HKbQU7UYzUBYl0B40Ee1FLaiIpqJ9aD+ajuajmWgCmosWogxagKagA2glOojWoVVoDjqENqHD6Ag6imrQZpRHS1ABHUOLURdajY6jnagBxdEJVIc2oFY0CU1GJ9EW1I1OoTVoLapGK9B2tBztQKdRFepBSXQGnQ1VSj8yEoDRQz7K0XbbVcMH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blkn3bJOumWddMs66ZZ10i3rpFvWSbesk25ZJ92yTrplnXTLOumWddIt66Rb1km3rJNuWSfdsk66ZZ10yzrplnXSLeukW9ZJt6yTblkn3bJOumWddMs66ZZ10i3rpFvWSbesk25ZJ92yTrplnXTLOumWddIt66Rb1km3rJNuWSfdsk66ZZ10yzrplnXSLeukW9ZJt6yTblkn3bJOumWddMs66ZZ10i3rpFvWSbesk25ZJ92yTrplnXTLOumWddIt66Rb1km3rJNuWSfdsk66ZZ2VbtkbxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzxGiGGM0QoxliNEOMZojRDDGaIUYzlRitqqn8dETlg7828iV9oUrpS0a+5B1aN2MtubF+2du25JZ9uzvoyI31e8Y6cqPtpMrW4Kqa7qAlN9YMGmsCjXbighXwsb7QhR24sYbQWKtorNH21p5c9PYAK6JPjLWIxppGY72isebcWLNorEs31jUaa8uNdY3G+nNjbaOxRt1Y/2i0XzTWsbugcfQODaMLunrv0M37wU2l0WbSWJ9vbKH7grbSWIPvzf5SNS+oe0nWip4MVUrX1Fxs6/7itnV/hDfkuvjUsL9BW/fSmrAcbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbqccbie02ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH2ymH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qgzRVBmiqTJEU2WIpsoQTZUhmipDNFWGaKoM0VQZoqkyRFNliKbKEE2VIZoqQzRVhmiqDNFUGaKpMkRTZYimyhBNlSGaKkM0VYZoqgzRVBmiqTJEU2WIpsoQTZUhmipDNFWGaKoM0VQZoqkyRFNliKbKEE2VIZoqQzRVhmiqDNFUGaKpMkRTZYimylClC7KZN9GeNnLH9iH0YfQRdC06hD6KPoYOo3HoOnQ9WoK2oo+jT6B56ByajVajT6I+dAOKo0+hOrQR3Yg+jW5CKXQzugXdim5DZXQ7ugP1o6loAN2JPoPuQneje9C96LPoPnQ/+hz6PPoCegAl0IPoIXQAPYw2oUfQo+gx9EX0JbQBPY6eQE+ip9DTqAedRuvQVSiHatBmtAXlUQFtQ0VUjbajHWgn2oW+jL6JvoW+gr6KnkFfQ8+ib6Ovo2+g59Dz6DuhSukt1KYJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulwJulyJSpcrP/pI/vQT4TTvTyqfLfCOTPdz5byf6/b91EH3U0PcX8narcPfLL2NWnhw5I/0IfQRdC36KBqHrkdb0Tx0Ds1Gn0Q3oBvRTSiFyuh2lEB3oH40Fd2JPoPuQfeiD6ND6GPoYXQYXYeWoI+jT6DVqA/F0adQHboZ3YJuRQPoLnQ3ehp9Gp1GX0bfRN9CX0FfRc+gr6Fn0bfR19E30HPoefQd9BT6LLoP3Y8+hz6PNqIvoAfQbehB9BA6gDahR9Cj6DH0RfQltAE9jp5AT6IetA5dhXKoBm1GW1AeFdA2VETVaDvagXaiXaFK6atHonnT8JVl0ci3qVqWjz5cDFeLlz0a/M9XcHmIq0KsD7EhxKYQrSHeHyIXoibEyRCbQ2wJ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of+LuuRVl65Wo3FqdG2l9U1X6HepSwF1qUeN3qtGzWr0PjV6To18anR7peUmKvTvqUsJdWmTZnmcCj2pXn28uhRTowlqtF3L2Fu4+9SlierSHs3yO2Ykpy69X11qVaNz1Oh69aDanb5Ds75b8/1oljMwvxb1pMnqSdepkV+NnlajSdZbVKNFavSMZn3XFXqXlrHrFZ5Ujy1Wjx0ZYVn6Cn1qlTU9KvTdVRl7B7mlynJk5mdiDvQPqWffUmX5KPMF1aVt1tegRlPU6FY1mmq9ezWapkZ3VlnuyHxpdalaXXpQjZaqUV+V5ePMN6gufVBd+naV5doq9G+oSx+2Pv4qy/tU6N+pOjmda++zJlhoSJ6ldpy6fh6vq7TLjFIipt5Ku5xfuqNZpRW+r7R+QcXo09Sr/FJ9P2qgzhbdWaptiqrB5ebgu2qgdqFnqT/6K3PwQXXl8yo3pgYqPp+pHvq1+YbmZ9SOY4X+Q/WIqobYbPUnrhrcH6nQE+orKEV65yLyOhex5LmInM9F/H0uIqhzEbefa8dF/4K4KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KI24KG3HRavLjeXPCbv9S9vG1kkbWzsgTKwNYQnnSFgrYZ2E9RI2SJgtISJBk2BIqJcQlbBRwiYJmyVcJGGLBIeErRI8EmIS4hISEkZKmCVhrITpEuZK2CZhhoRREhZJSEqYIsEtYaGEpRJSEqolrJIwXsJ2CV4JF0uYJmGyhEsk7JAwVcI8CQEJcyQskLBcwnwJkySkJZwnYaeE8yXMlNAgoVHCpRJ2SVgi4TIJiyU0SVgpYbeEiRJGS9gjYYyEcRImSNgrISNhn4TVEtZIWCFh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ZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZS4MZa7CUPaf0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0n0G0nCt32Qjw/ovDYiKQjU3iSRLP9iIlFaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDaJDDhQZ5sV1Gj1hbCCPs2lcS+V17byHAR/j8hZVMWC8ezb/wDxXl562H9V3K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asAeqgF7qAbsoRqwh2rAHqoBe6gG7KEasIdqwB6qAXuoBuyhGsI91BW5P+Tsm23/dnLjq731OPtm24N46/HrvtT2ytzPl43kL53wFMMP5/6zXsXL0jdlfvCB3N+xVr5tt+2Xkv3FHclv/Lu37S7/J9+2ezUmNj/JfYlcAbsSdhWsFbYAdjXsGthCWCfYCti1sLGwKth1sOthRbAbYINgU2E3wlbCboJ1gN0M6wgrh90CWwXzYKNgt8J82G2w1bDbYXfA7oTdBYvB7oatgd0Duxe2FrYOth62AbYRtgm2GbYFthW2DdYdth22AzYfthM2C7YLthu2B7YXtg9WBtsPOwBLwg7CDsGaYEthpbAZsNmwAlgFLA6zYDasBlYLq4QlYPmwatgc2H2ww7D7YQ/AjsAehD0Eexj2COxR2GOwx2FPwJ6MWn3xNbha+aeR/1KhzIhKr6jMjEpZVMqjMisqQ6MyOyoFUamISmVU4lGxolIVFTsqTlQSUcmPSnVUukRlTlRqolIblXZRGRKVTlEpjEpRVOqiMigq7aMyOir1Uekblc5RGRWVcVE5PyoDojItKt2jckFUukblwqj0j0osKnOjMi8q/aIyPCoDo2JGZWRUJkZlRFT6RGV+VCZHxY3KlKgMjsqCqCyMykVRuTgqY6NySVTGROXSqEyNyqKo9IxKh6gsjkrHqHSLSo+oNESlMSpLojI9KiVRmRSVCVFZGpW8qDRFpXdUlkXlsqg0R6UlKpdHZXlE6otXoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooAEaaIAGGqCBBmigARpogAYaoIEGaKABGmiABhqggQZooEHYQK/NHc3ZbY6dHVZk51wPv21zruuQCwlcS5LA1SMJXD2SwNUjCVw9ksDVIwlcPZLA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'
|
|
4060
|
-
)
|
|
4061
|
-
DATA = pickle.loads(zlib.decompress(base64.b64decode(DATA)))
|
|
4062
|
-
MEMO = (
|
|
4063
|
-
b'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'
|
|
4064
|
-
)
|
|
4065
|
-
MEMO = pickle.loads(zlib.decompress(base64.b64decode(MEMO)))
|
|
4066
|
-
Shift = 0
|
|
4067
|
-
Reduce = 1
|
|
4068
|
-
def Lark_StandAlone(**kwargs):
|
|
4069
|
-
return Lark._load_from_dict(DATA, MEMO, **kwargs)
|