tmsgpack 0.3.13__tar.gz → 0.3.15__tar.gz

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.
Files changed (31) hide show
  1. {tmsgpack-0.3.13/tmsgpack.egg-info → tmsgpack-0.3.15}/PKG-INFO +1 -1
  2. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/pyproject.toml +1 -1
  3. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tests/test_codec.py +4 -4
  4. tmsgpack-0.3.15/tests/test_codec_custom.py +240 -0
  5. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/codec.py +12 -8
  6. tmsgpack-0.3.15/tmsgpack/codec_custom.py +125 -0
  7. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/core.c +11 -11
  8. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/core.pyx +1 -1
  9. {tmsgpack-0.3.13 → tmsgpack-0.3.15/tmsgpack.egg-info}/PKG-INFO +1 -1
  10. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack.egg-info/SOURCES.txt +2 -0
  11. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/MANIFEST.in +0 -0
  12. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/README.md +0 -0
  13. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/build_pyx.py +0 -0
  14. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/setup.cfg +0 -0
  15. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/setup.py +0 -0
  16. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tests/test_build_pyx.py +0 -0
  17. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tests/test_round_trip.py +0 -0
  18. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/__init__.py +0 -0
  19. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/api.py +0 -0
  20. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/01-imports +0 -0
  21. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/02-constants +0 -0
  22. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/03-encode-fn +0 -0
  23. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/04-decode-fn +0 -0
  24. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/05-encode-buffer +0 -0
  25. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/06-decode-buffer +0 -0
  26. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/07-encode-buffer-slow +0 -0
  27. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/08-decode-buffer-slow +0 -0
  28. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack/src-parts/09-exceptions +0 -0
  29. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack.egg-info/dependency_links.txt +0 -0
  30. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack.egg-info/requires.txt +0 -0
  31. {tmsgpack-0.3.13 → tmsgpack-0.3.15}/tmsgpack.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tmsgpack
3
- Version: 0.3.13
3
+ Version: 0.3.15
4
4
  Summary: Typed MessagePack serializer (inspired by but different from msgpack)
5
5
  Author-email: Yaakov Belch <yaakov.belch@gmail.com>
6
6
  License: ISC
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tmsgpack"
3
- version = "0.3.13"
3
+ version = "0.3.15"
4
4
  description = "Typed MessagePack serializer (inspired by but different from msgpack)"
5
5
  requires-python = ">=3.14"
6
6
  license = {text = "ISC"}
@@ -154,13 +154,13 @@ def test_with_seed_data_round_trip(codec):
154
154
  assert decoded.dbh is other_dbh
155
155
 
156
156
 
157
- # --- Encoder/decoder caches are shared after with_seed_data ---
157
+ # --- with_seed_data produces independent caches ---
158
158
 
159
- def test_with_seed_data_shares_caches(codec):
159
+ def test_with_seed_data_has_independent_caches(codec):
160
160
  codec, t = codec
161
161
  codec2 = codec.with_seed_data({t.Dbh: t.Dbh()})
162
- assert codec2.encoder_cache is codec.encoder_cache
163
- assert codec2.decoder_cache is codec.decoder_cache
162
+ assert codec2.encoder_cache is not codec.encoder_cache
163
+ assert codec2.decoder_cache is not codec.decoder_cache
164
164
 
165
165
 
166
166
  # --- Inject[T] without a DependencyInjector ---
@@ -0,0 +1,240 @@
1
+ """Tests for TmsgpackCustom: custom encode/decode for non-dataclass types."""
2
+
3
+ import struct
4
+ import textwrap
5
+ import pytest
6
+ from pathlib import Path
7
+
8
+ pytest.importorskip("semifun.di")
9
+ pytest.importorskip("semifun.plugins")
10
+
11
+ from tmsgpack.codec import NoDependencyInjector, TmsgpackCodec
12
+ from semifun.di.injector import DependencyInjector
13
+ from semifun.plugins.testing import create_registry_from_paths
14
+ from semifun.plugins.registry import _feature_map_from_registry
15
+
16
+
17
+ # --- Write test packages with custom codec types ---
18
+
19
+ def _write_custom_types_package(tmp_path: Path) -> Path:
20
+ pkg = tmp_path / "test_custom_types"
21
+ pkg.mkdir()
22
+ (pkg / "__init__.py").write_text("")
23
+ (pkg / "types.py").write_text(textwrap.dedent("""\
24
+ import struct
25
+ from tmsgpack.codec_custom import TmsgpackCustom
26
+
27
+ # --- Target types (not dataclasses) ---
28
+
29
+ class Pair:
30
+ def __init__(self, x, y):
31
+ self.x = x
32
+ self.y = y
33
+ def __eq__(self, other):
34
+ return type(other) is Pair and self.x == other.x and self.y == other.y
35
+
36
+ class Point:
37
+ def __init__(self, x, y):
38
+ self.x = x
39
+ self.y = y
40
+ def __eq__(self, other):
41
+ return type(other) is Point and self.x == other.x and self.y == other.y
42
+
43
+ # --- Dict mode ---
44
+
45
+ #::testing_custom_codec:Pair=CodecPairDict
46
+ class CodecPairDict(TmsgpackCustom):
47
+ def encode_dict(obj):
48
+ return {'x': obj.x, 'y': obj.y}
49
+ def decode_dict(*, x, y):
50
+ return Pair(x=x, y=y)
51
+
52
+ # --- List mode ---
53
+
54
+ #::testing_custom_codec:Point=CodecPointList
55
+ class CodecPointList(TmsgpackCustom):
56
+ def encode_list(obj):
57
+ return [obj.x, obj.y]
58
+ def decode_list(x, y):
59
+ return Point(x, y)
60
+ """))
61
+ (pkg / "types_bytes.py").write_text(textwrap.dedent("""\
62
+ import struct
63
+ from tmsgpack.codec_custom import TmsgpackCustom
64
+
65
+ class FloatPair:
66
+ def __init__(self, x, y):
67
+ self.x = x
68
+ self.y = y
69
+ def __eq__(self, other):
70
+ return (type(other) is FloatPair
71
+ and self.x == other.x and self.y == other.y)
72
+
73
+ #::testing_custom_codec:FloatPair=CodecFloatPairBytes
74
+ class CodecFloatPairBytes(TmsgpackCustom):
75
+ def encode_bytes(obj):
76
+ return struct.pack('<ff', obj.x, obj.y)
77
+ def decode_bytes(data):
78
+ x, y = struct.unpack('<ff', data)
79
+ return FloatPair(x, y)
80
+ """))
81
+ return pkg
82
+
83
+
84
+ @pytest.fixture
85
+ def test_types(tmp_path):
86
+ pkg = _write_custom_types_package(tmp_path)
87
+ registry = create_registry_from_paths(
88
+ packages=[("test_custom_types", pkg)],
89
+ )
90
+ feature_map = _feature_map_from_registry(registry, "testing_custom_codec")
91
+ import test_custom_types.types as t
92
+ import test_custom_types.types_bytes as tb
93
+ return t, tb, feature_map
94
+
95
+
96
+ @pytest.fixture
97
+ def codec(test_types):
98
+ t, tb, feature_map = test_types
99
+ return TmsgpackCodec(sort_keys=False, di=NoDependencyInjector(),
100
+ plugin_feature_type=feature_map), t, tb
101
+
102
+
103
+ # --- Dict mode round-trip ---
104
+
105
+ def test_dict_mode_round_trip(codec):
106
+ codec, t, tb = codec
107
+ pair = t.Pair(x='hello', y=42)
108
+ data = codec.encode(pair)
109
+ restored = codec.decode(data)
110
+ assert restored == pair
111
+
112
+
113
+ # --- List mode round-trip ---
114
+
115
+ def test_list_mode_round_trip(codec):
116
+ codec, t, tb = codec
117
+ point = t.Point(x=10, y=20)
118
+ data = codec.encode(point)
119
+ restored = codec.decode(data)
120
+ assert restored == point
121
+
122
+
123
+ # --- Bytes mode round-trip ---
124
+
125
+ def test_bytes_mode_round_trip(codec):
126
+ codec, t, tb = codec
127
+ fp = tb.FloatPair(x=1.5, y=2.5)
128
+ data = codec.encode(fp)
129
+ restored = codec.decode(data)
130
+ assert restored == fp
131
+
132
+
133
+ # --- Content hashing works with custom types ---
134
+
135
+ def test_content_hash_dict_mode(codec):
136
+ codec, t, tb = codec
137
+ codec_sorted = TmsgpackCodec(sort_keys=True, di=NoDependencyInjector(),
138
+ plugin_feature_type=codec.plugin_feature_type)
139
+ pair = t.Pair(x='a', y=1)
140
+ h = codec_sorted.hash_to_str(pair)
141
+ assert isinstance(h, str)
142
+ assert len(h) == 22
143
+ # Same value, same hash
144
+ assert codec_sorted.hash_to_str(t.Pair(x='a', y=1)) == h
145
+
146
+
147
+ # --- Nested values in custom types ---
148
+
149
+ def test_dict_mode_nested_values(codec):
150
+ codec, t, tb = codec
151
+ pair = t.Pair(x=[1, 2, 3], y={'a': True})
152
+ data = codec.encode(pair)
153
+ restored = codec.decode(data)
154
+ assert restored == pair
155
+
156
+
157
+ # --- Validation: mismatched modes ---
158
+
159
+ def test_mismatched_modes_raises():
160
+ from tmsgpack.codec_custom import TmsgpackCustom
161
+ with pytest.raises(TypeError, match="mode mismatch"):
162
+ class Bad(TmsgpackCustom):
163
+ def encode_dict(obj): return {}
164
+ def decode_list(x): return None
165
+
166
+
167
+ def test_no_encode_raises():
168
+ from tmsgpack.codec_custom import TmsgpackCustom
169
+ with pytest.raises(TypeError, match="encode_dict, encode_list, encode_bytes"):
170
+ class Bad(TmsgpackCustom):
171
+ def decode_dict(*, x): return None
172
+
173
+
174
+ def test_no_decode_raises():
175
+ from tmsgpack.codec_custom import TmsgpackCustom
176
+ with pytest.raises(TypeError, match="decode_dict, decode_list, decode_bytes"):
177
+ class Bad(TmsgpackCustom):
178
+ def encode_dict(obj): return {}
179
+
180
+
181
+ # --- DI on decode ---
182
+
183
+ def _write_di_types_package(tmp_path: Path) -> Path:
184
+ pkg = tmp_path / "test_custom_di_types"
185
+ pkg.mkdir()
186
+ (pkg / "__init__.py").write_text("")
187
+ (pkg / "types.py").write_text(textwrap.dedent("""\
188
+ from tmsgpack.codec_custom import TmsgpackCustom
189
+ from semifun.di.model import Inject
190
+
191
+ class Cache:
192
+ def __init__(self):
193
+ self.store = {}
194
+ def get(self, key):
195
+ return self.store[key]
196
+ def put(self, key, value):
197
+ self.store[key] = value
198
+
199
+ class Widget:
200
+ def __init__(self, name, data):
201
+ self.name = name
202
+ self.data = data
203
+ def __eq__(self, other):
204
+ return (type(other) is Widget
205
+ and self.name == other.name
206
+ and self.data == other.data)
207
+
208
+ #::testing_custom_di_codec:Widget=CodecWidget
209
+ class CodecWidget(TmsgpackCustom):
210
+ def encode_dict(obj, cache: Inject[Cache]):
211
+ cache.put(obj.name, obj.data)
212
+ return {'name': obj.name}
213
+ def decode_dict(*, name, cache: Inject[Cache]):
214
+ data = cache.get(name)
215
+ return Widget(name=name, data=data)
216
+ """))
217
+ return pkg
218
+
219
+
220
+ def test_di_on_encode_and_decode(tmp_path):
221
+ pkg = _write_di_types_package(tmp_path)
222
+ registry = create_registry_from_paths(
223
+ packages=[("test_custom_di_types", pkg)],
224
+ )
225
+ feature_map = _feature_map_from_registry(registry, "testing_custom_di_codec")
226
+ import test_custom_di_types.types as t
227
+
228
+ cache = t.Cache()
229
+ injectors_map = lambda name, default=None: default
230
+ di = DependencyInjector(injectors_map=injectors_map, seed_data={t.Cache: cache})
231
+ codec = TmsgpackCodec(sort_keys=False, di=di, plugin_feature_type=feature_map)
232
+
233
+ widget = t.Widget(name='gizmo', data=[1, 2, 3])
234
+ data = codec.encode(widget)
235
+
236
+ # The cache was populated during encode
237
+ assert cache.store == {'gizmo': [1, 2, 3]}
238
+
239
+ restored = codec.decode(data)
240
+ assert restored == widget
@@ -5,6 +5,7 @@ from semifun.caching.cached_property import cached_property
5
5
 
6
6
  import enum
7
7
  from .api import EncodeDecode
8
+ from .codec_custom import TmsgpackCustom, make_codec_handler_custom
8
9
 
9
10
 
10
11
  class DependencyInjectorProtocol(Protocol):
@@ -30,18 +31,13 @@ class TmsgpackCodec(EncodeDecode):
30
31
  sort_keys: bool
31
32
  di: DependencyInjectorProtocol
32
33
  # Memoization only: init=False keeps them out of the constructor.
33
- # `replace()` would re-run default_factory and silently drop them.
34
- # So with_seed_data re-attaches them explicitly --
35
- # the same pattern as DependencyInjector._call_with_args_sig_cache.
34
+ # `replace()` re-runs default_factory, giving each derived codec fresh caches.
36
35
  encoder_cache: dict = field(default_factory=dict, init=False, repr=False)
37
36
  decoder_cache: dict = field(default_factory=dict, init=False, repr=False)
38
37
  plugin_feature_type: str
39
38
 
40
39
  def with_seed_data(self, seed_data):
41
- new = replace(self, di=self.di.with_seed_data(seed_data))
42
- object.__setattr__(new, 'encoder_cache', self.encoder_cache)
43
- object.__setattr__(new, 'decoder_cache', self.decoder_cache)
44
- return new
40
+ return replace(self, di=self.di.with_seed_data(seed_data))
45
41
 
46
42
  def prep_encode(self, value, target): return [None, self, value]
47
43
 
@@ -69,7 +65,13 @@ class TmsgpackCodec(EncodeDecode):
69
65
  return codec_handler.decode_dctx(dctx=dctx)
70
66
 
71
67
  def decode_from_bytes(self, dctx):
72
- raise NotImplementedError(f'No bytes extension defined: {dctx._type}')
68
+ type_name = dctx._type
69
+ if type_name not in self.decoder_cache:
70
+ codec_spec = self.type_name_to_codec_spec(type_name=type_name)
71
+ codec_handler = self.codec_spec_to_codec_handler(codec_spec=codec_spec, type_name=type_name)
72
+ self.decoder_cache[type_name] = codec_handler
73
+ codec_handler = self.decoder_cache[type_name]
74
+ return codec_handler.decode_dctx(dctx=dctx)
73
75
 
74
76
  @cached_property
75
77
  def feature_map(self):
@@ -85,6 +87,8 @@ class TmsgpackCodec(EncodeDecode):
85
87
  def codec_spec_to_codec_handler(self, codec_spec, type_name):
86
88
  if isinstance(codec_spec, enum.EnumType):
87
89
  return CodecHandler(type_name=type_name, attributes=('value',), constructor=codec_spec)
90
+ if isinstance(codec_spec, type) and issubclass(codec_spec, TmsgpackCustom):
91
+ return make_codec_handler_custom(codec_spec=codec_spec, type_name=type_name, di=self.di)
88
92
  if is_dataclass(codec_spec):
89
93
  all_fields = fields(codec_spec)
90
94
  injected_type = self.di.injected_type
@@ -0,0 +1,125 @@
1
+ import inspect
2
+ from dataclasses import dataclass
3
+
4
+ _MODES = ('dict', 'list', 'bytes')
5
+
6
+
7
+ class TmsgpackCustom:
8
+ """Base class for custom tmsgpack codec handlers.
9
+
10
+ Subclass and define exactly one encode/decode pair:
11
+ encode_dict / decode_dict — wire format is key-value pairs
12
+ encode_list / decode_list — wire format is ordered sequence
13
+ encode_bytes / decode_bytes — wire format is raw bytes
14
+
15
+ Example (dict mode):
16
+ class CodecBar(TmsgpackCustom):
17
+ def encode_dict(obj):
18
+ return {'x': obj.x, 'y': obj.y}
19
+ def decode_dict(*, x, y):
20
+ return Bar(x=x, y=y)
21
+
22
+ Example (bytes mode):
23
+ class CodecPoint(TmsgpackCustom):
24
+ def encode_bytes(obj):
25
+ return struct.pack('ff', obj.x, obj.y)
26
+ def decode_bytes(data):
27
+ x, y = struct.unpack('ff', data)
28
+ return Point(x, y)
29
+
30
+ Dependency injection on encode or decode:
31
+ class CodecBig(TmsgpackCustom):
32
+ def encode_dict(obj, store: Inject[BlobStore]):
33
+ blob_id = store.put(obj.data)
34
+ return {'id': blob_id, 'name': obj.name}
35
+ def decode_dict(*, id, name, store: Inject[BlobStore]):
36
+ data = store.get(id)
37
+ return Big(name=name, data=data)
38
+ """
39
+
40
+ def __init_subclass__(cls, **kwargs):
41
+ super().__init_subclass__(**kwargs)
42
+ encode_modes = [m for m in _MODES if hasattr(cls, f'encode_{m}')]
43
+ decode_modes = [m for m in _MODES if hasattr(cls, f'decode_{m}')]
44
+ if len(encode_modes) != 1:
45
+ raise TypeError(
46
+ f'{cls.__name__}: define exactly one of encode_dict, encode_list, encode_bytes'
47
+ f' (found: {", ".join(f"encode_{m}" for m in encode_modes) or "none"})'
48
+ )
49
+ if len(decode_modes) != 1:
50
+ raise TypeError(
51
+ f'{cls.__name__}: define exactly one of decode_dict, decode_list, decode_bytes'
52
+ f' (found: {", ".join(f"decode_{m}" for m in decode_modes) or "none"})'
53
+ )
54
+ if encode_modes[0] != decode_modes[0]:
55
+ raise TypeError(
56
+ f'{cls.__name__}: mode mismatch — encode_{encode_modes[0]} vs decode_{decode_modes[0]}'
57
+ )
58
+
59
+
60
+ def _has_injected(fn, di):
61
+ """Check whether any parameter of fn has an Inject[T] annotation."""
62
+ sig = inspect.signature(fn)
63
+ for param in sig.parameters.values():
64
+ if param.annotation is not inspect.Parameter.empty:
65
+ if di.injected_type(param.annotation):
66
+ return True
67
+ return False
68
+
69
+
70
+ @dataclass(frozen=True)
71
+ class CodecHandlerCustom:
72
+ type_name: str
73
+ encode_fn: object
74
+ decode_fn: object
75
+ mode: str # 'dict' | 'list' | 'bytes'
76
+ encode_has_di: bool
77
+ decode_has_di: bool
78
+ di: object # DependencyInjectorProtocol
79
+
80
+ def encode_ectx(self, ectx):
81
+ value = ectx.value
82
+ if self.encode_has_di:
83
+ data = self.di.sync_call_with_args(fn=self.encode_fn, args=(value,), kwargs={})
84
+ else:
85
+ data = self.encode_fn(value)
86
+ mode = self.mode
87
+ if mode == 'dict': ectx.put_dict(self.type_name, data)
88
+ elif mode == 'list': ectx.put_sequence(self.type_name, data)
89
+ else: ectx.put_bytes(self.type_name, data)
90
+
91
+ def decode_dctx(self, dctx):
92
+ mode = self.mode
93
+ if mode == 'dict':
94
+ data = dctx.take_dict()
95
+ if self.decode_has_di:
96
+ return self.di.sync_call_with_args(fn=self.decode_fn, args=(), kwargs=data)
97
+ return self.decode_fn(**data)
98
+ elif mode == 'list':
99
+ data = dctx.take_list()
100
+ if self.decode_has_di:
101
+ return self.di.sync_call_with_args(fn=self.decode_fn, args=tuple(data), kwargs={})
102
+ return self.decode_fn(*data)
103
+ else:
104
+ data = dctx.take_bytes()
105
+ if self.decode_has_di:
106
+ return self.di.sync_call_with_args(fn=self.decode_fn, args=(data,), kwargs={})
107
+ return self.decode_fn(data)
108
+
109
+
110
+ def make_codec_handler_custom(codec_spec, type_name, di):
111
+ """Create a CodecHandlerCustom from a TmsgpackCustom subclass."""
112
+ for mode in _MODES:
113
+ if hasattr(codec_spec, f'encode_{mode}'):
114
+ break
115
+ encode_fn = getattr(codec_spec, f'encode_{mode}')
116
+ decode_fn = getattr(codec_spec, f'decode_{mode}')
117
+ return CodecHandlerCustom(
118
+ type_name=type_name,
119
+ encode_fn=encode_fn,
120
+ decode_fn=decode_fn,
121
+ mode=mode,
122
+ encode_has_di=_has_injected(encode_fn, di),
123
+ decode_has_di=_has_injected(decode_fn, di),
124
+ di=di,
125
+ )
@@ -3065,7 +3065,7 @@ static __pyx_mstatetype * const __pyx_mstate_global = &__pyx_mstate_global_stati
3065
3065
  #endif
3066
3066
  /* #### Code section: constant_name_defines ### */
3067
3067
  #define __pyx_kp_u_ __pyx_string_tab[0]
3068
- #define __pyx_kp_u_0_3_13 __pyx_string_tab[1]
3068
+ #define __pyx_kp_u_0_3_15 __pyx_string_tab[1]
3069
3069
  #define __pyx_kp_u_B __pyx_string_tab[2]
3070
3070
  #define __pyx_kp_u_H __pyx_string_tab[3]
3071
3071
  #define __pyx_kp_u_I __pyx_string_tab[4]
@@ -24659,11 +24659,11 @@ __Pyx_RefNannySetupContext("PyInit_core", 0);
24659
24659
  /* "tmsgpack/core.pyx":4
24660
24660
  * # DON'T EDIT THIS FILE. EDIT THE SOURCES, INSTEAD: tmsgpack/src-parts/[inserted by cython to avoid comment start]*
24661
24661
  *
24662
- * __version__ = "0.3.13" # <<<<<<<<<<<<<<
24662
+ * __version__ = "0.3.15" # <<<<<<<<<<<<<<
24663
24663
  *
24664
24664
  * from libc.stdint cimport int8_t, int16_t, int32_t, int64_t
24665
24665
  */
24666
- if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_version, __pyx_mstate_global->__pyx_kp_u_0_3_13) < (0)) __PYX_ERR(0, 4, __pyx_L1_error)
24666
+ if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_version, __pyx_mstate_global->__pyx_kp_u_0_3_15) < (0)) __PYX_ERR(0, 4, __pyx_L1_error)
24667
24667
 
24668
24668
  /* "tmsgpack/core.pyx":13
24669
24669
  * ctypedef double float64_t
@@ -26244,31 +26244,31 @@ static int __Pyx_InitConstants(__pyx_mstatetype *__pyx_mstate) {
26244
26244
  {
26245
26245
  const struct { const unsigned int length: 9; } index[] = {{1},{6},{2},{2},{2},{23},{21},{179},{27},{2},{18},{8},{2},{2},{16},{18},{7},{16},{18},{6},{2},{2},{2},{9},{50},{11},{2},{14},{26},{26},{26},{24},{17},{16},{34},{36},{25},{26},{24},{24},{24},{24},{23},{25},{25},{25},{25},{16},{34},{36},{25},{25},{26},{24},{24},{24},{24},{23},{25},{25},{25},{25},{12},{9},{27},{29},{20},{19},{19},{18},{20},{12},{9},{27},{29},{19},{18},{22},{17},{19},{8},{20},{16},{34},{36},{26},{24},{24},{24},{24},{25},{25},{25},{25},{16},{34},{36},{26},{24},{24},{24},{24},{25},{25},{25},{25},{13},{12},{8},{18},{9},{18},{5},{4},{15},{17},{16},{8},{5},{7},{4},{14},{12},{3},{6},{8},{12},{13},{5},{6},{8},{13},{10},{15},{3},{1},{8},{7},{4},{3},{11},{9},{8},{12},{7},{9},{14},{12},{11},{10},{31},{31},{31},{31},{14},{12},{8},{9},{7},{7},{7},{7},{6},{8},{8},{8},{8},{10},{17},{13},{4},{12},{10},{12},{19},{4},{9},{5},{5},{6},{3},{10},{9},{9},{8},{10},{8},{13},{5},{6},{6},{12},{5},{6},{11},{8},{9},{7},{7},{7},{7},{6},{8},{8},{8},{8},{21},{17},{24},{43},{43},{80},{61},{24},{19},{24},{24},{24},{24},{264},{33},{30},{57},{11},{19},{21},{24},{19},{19},{13},{25},{9},{97},{105},{15},{11},{58},{96}};
26246
26246
  #if (CYTHON_COMPRESS_STRINGS) == 3 && __PYX_LIMITED_VERSION_HEX >= 0x030e0000 /* compression: zstd (1738 bytes) */
26247
- const char* const cstring = "(\265/\375`#\021\0056\000\372E\240\016E\360\222\250\r\314\300\354\004[\0237;6]\326\235B\243\301t\246H\232\270{\264\010\373\233+\233D\226\337FkI\261\235\\\245\204\2124Q\247a2\014 \323\246%S\023\330\211F\244\253\200\236'\010x\221\241&\002\306\000\300\000\335\0004\364\022\232\247\352\356\276\225$\246\232\007b\311\362\370\244,\234!\314OM\013\225B5j\232\204*\266R\223k\325e\024\202*(('&\033\240\237\252\274\237-t\315N\256\205\307\361&Y|E/\325`\311\251\322X-}\371\266VY\002\3371\254\376\362Xr\320>\324\334+\314\266\203\246\026\350\301\316u\017+\375\215\346\0224Y\210\035c\271\315R\306\020\377\364\033~\241V%\004\245\200L\\\254\270\200\365\372Oz\037\303n\363\227\327Kts\rb\n\253}\371\256\004|\371\362\320\345K\r~\346*\205/\247l\253\303\267,\240\212\347M\256`\225\276Y[\202\233<\371\266\265\264\204P\204H\2048|<\034<\033F\004[\326\254|\217\261R\231\332\376\351\206S\3764bz\212\263fS\214\232G\217qZ-\306\224\275\246\030M\271\244\315\222Oy?n\363\272v-\366J?\333k\247\307\322Y;,c\274\366\336\225\025$\223\204a\362\027\017\343,\242\t\230\316E\214\316u$\257\226\305}\237\325\263\3523\267q\371a\276\304eaYW@'\031t\362\371JS^\332\315\244\335\177\3071N\317u\223)\223p\023\216%\t\230\216\363\370\265S\003jJ\356\204S?\251\366\230n\360Z\323\266\311\t\243\243\344\213\360y\263\305\367qH\205\375\273R\214O+\235\233\244+z\337\244\332\2325\030\243\317\254\371\215\021\376\226%\264U\3034$\317\202\205]@E\262\ttV6H\346i<\224\375\021\313\\\032\227\n\370\371:\237\007\3177K\264\037hdT\257\020\217\017\305KQY\320\231\3164!\032\001HL\344\211x\035\366\223\350\025\215\2003#\372>_j\017\330\235\310\333x\252\355!\275\n^\346\021\330(*-u\212\026\010'\246q\251>\023\217e\177\000\265>\262'=\326\226\033\204\376V\010'\366\331\01681Q\214\350\223\341\211\274\017\273\263G\264>63\232\230\216\313\303w\302\373x\027v\266E\264@\004\000\340\354\320\304P|}\3458k\\\256\331\343\037#\356\360\317|q\347\250\370\327\342h\332`|\223YU\222\277\362\r5)W3\327\375o\031\373Me\214\232\3762\257\344\374r\226\213\221\3455%\253\323\373\325\243\275\036Y\211""\010\272\003\214\357\344K\360\241\262\257C\204\327\210\r\354\023s!\301\252\014\013\007X\307u\342A\347H\361(\210\300D6\261\027#\030J\006\304\353\303\265\001\302T[\302\312\363Rq\375'?\222\t\033\230\312\363\030y#\n4:<t\330x\235\\#\327\210\353\023\002[\260@'\030\331+ZFk\025\343\261\211I/\303f\321\037}\242\005\262\211e\232\324:0\322\030Z\00561M\314\310%r\211t\036H\206^e\233\244E:\317\217\325\331\r>\005\237&\206\352\305\207\321\267:\260\027\314\224l\215\004{5\002|]\347\313\276\022\317\245\300ViP\2665[E\006\2013\243G\272e\264W\n:\020b\231\016\034\032\035\335K\276h\270TZ\364\204\031\232B\002\0031\006\036i\237t\005\355\3222\300\231\031m\321\026\3318N\350\021\031)\003\341\245y\205\370bx'\017\255\232\311\276\201\205\250\241\241q\206fDD$\005I\n\031\016\241\014Q\2329\307\324\003\222i\260\244@\014\021\302\010!\220P\005\222\nR\036\205\264\006\244\r\224\264\353\356\320T\tRAo\260z\247\225\230\312hs\020Xl'}>\031\r\355\352\276Q\322v7\362D\027x\013<\257\234/pa\026\303\341\325\005\273\3737\335\244\323\205\034\274\275l*\310_\206\365\314U\357\323\204\260\224\004\244\236\353\035Bt\264\t\000\224\352\340\263\001\346\354\244I\023\304]\314PI\246\030\262\005\374x\301\232\211\377\365\253\031\366\200\035Tj3h\264\237:\016l\000u\207\236\002\240\271\275@D\034\336\304\223\320\315\345x\213\327I\014\347~\335$\360\004$\203\256#\006\006{\020\311\312\210%8m\265\341\366C\320\330\326\350!\333[\026\237\343\206\\%#a\350\333\006\350\211OL\236YM\016\203\337\033\000\221\177: \223(\355\326lR\236'78\323\005#\0034V(;\205\t\266C\336\346\255:}\233\274b}\361\r\310@\204\367Q=\"\220l\206\224\210P\251\n\325h\241k\031\300\026&^\003\334\211Q\004(\261q\326\312Y\361\007\365\306-\331\321LVN\305\371\324f\250\302\030R\275\247\276QLG\340\316\034\362y\341-\tC\252k%SS\264\027\350\243d7\355\203\000\324\244\267\212s\221\357\212\340\213\021\254wQ\241\030 \251\203\224\\P\351\007\325jD\255px\214\216\r\021\260\362\374\257\263;\007\213P\026\273@\345mqs\302qwO\017\375\366H\371\204\030\313\177fH\340\313\004\217u\360\032\347LJ\270H\366\350U""\266\177\016\234\230R\300=\254\224\356Ro\336\320R\375\214\276P\212\214$[z\377\367\212}\242\031\331\t<\016T'N/\340\215\202,\223\205\302\313\267\235\177f^\3764\362,\t\243E\271\330\020\345\376Ph\351\354\257\n\225E\332\300S\221\355V\306\213\202sVbteo\227\030<\367\377\262S4nfM\\\003\222\323\032NxV^\301-V{R\321\356\005\024\r\033\001h\221\200\370\034\010\233\212\244zq\014\004\342\020\345hYr\316\314p;}ZI=n\026\322E\313\034x\315\000\007}\237\200e\361\323\370x5*.\260T=\233\236J\0373=\326\016.\201\354`@\246\273!\217\222\337\026\360\347\353Q\345\213\003uWp\342SIOe\277\016\361Q\242\333\243P\037\000*\212\266\371X\266{\2301\025\201\263\261\311\206\361\375L\314\2310\357\330\217V(\311\002#\017\300\020\322\016G\023\345\321\362uh\247tM\177K\215\032\350\324\r\236\306\373\361s\353\221\216\373HC\207\253\375G\274\306\306\367\203:o\235\374\354\300\016\231\2442\334\274`:\005\346\030\236\275\224\300\234f\224\213\001\351\306\000\316\203\300\323\245\252J\213\251\324,\302`fPy\027v$\262\367\202\022UF\350O\364\031j";
26247
+ const char* const cstring = "(\265/\375`#\021\0056\000\372E\240\016E\360\222\250\r\314\300\354\004[\0237;6]\326\235B\243\301t\246H\232\270{\264\010\373\233+\233D\226\337FkI\261\235\\\245\204\2124Q\247a2\014 \323\246%S\023\330\211F\244\253\200\236'\010x\221\241&\002\306\000\300\000\335\0004\364\022\232\247\352\356\276\225$\246\232\007b\311\362\370\244,\234!\314OM\013\225B5j\232\204*\266R\223k\325e\024\202*(('&\033\240\237\252\274\237-t\315N\256\205\307\361&Y|E/\325`\311\251\322X-}\371\266VY\002\3371\254\376\362Xr\320>\324\334+\314\266\203\246\026\350\301\316u\017+\375\215\346\0224Y\210\035c\271\315R\306\020\377\364\033~\241V%\004\245\200L\\\254\270\200\365\372Oz\037\303n\363\227\327Kts\rb\n\253}\371\256\004|\371\362\320\345K\r~\346*\205/\247l\253\303\267,\240\212\347M\256`\225\276Y[\202\233<\371\266\265\264\204P\204H\204P>\036\016\236\r#\002[\326\254|\217\261R\231\332\376\351\206S\3764bz\212\263fS\214\232G\217qZ-\306\224\275\246\030M\271\244\315\222Oy?n\363\272v-\366J?\333k\247\307\322Y;,c\274\366\336\225\025$\223\204a\362\027\017\343,\242\t\230\316E\214\316u$\257\226\305}\237\325\263\3523\267q\371a\276\304eaYW@'\031t\362\371JS^\332\315\244\335\177\3071N\317u\223)\223p\023\216%\t\230\216\363\370\265S\003jJ\356\204S?\251\366\230n\360Z\323\266\311\t\243\243\344\213\360y\263\305\367qH\205\375\273R\214O+\235\233\244+z\337\244\332\2325\030\243\317\254\371\215\021\376\226%\264U\3034$\317\202\205]@E\262\ttV6H\346i<\224\375\021\313\\\032\227\n\370\371:\237\007\3177K\264\037hdT\257\020\217\017\305KQY\320\231\3164!\032\001HL\344\211x\035\366\223\350\025\215\2003#\372>_j\017\330\235\310\333x\252\355!\275\n^\346\021\330(*-u\212\026\010'\246q\251>\023\217e\177\000\265>\262'=\326\226\033\204\376V\010'\366\331\01681Q\214\350\223\341\211\274\017\273\263G\264>63\232\230\216\313\303w\302\373x\027v\266E\264@\004\000\340\354\320\304P|}\3458k\\\256\331\343\037#\356\360\317|q\347\250\370\327\342h\332`|\223YU\222\277\362\r5)W3\327\375o\031\373Me\214\232\3762\257\344\374r\226\213\221\3455%\253\323\373\325\243\275\036Y""\211\010\272\003\214\357\344K\360\241\262\257C\204\327\210\r\354\023s!\301\252\014\013\007X\307u\342A\347H\361(\210\300D6\261\027#\030J\006\304\353\303\265\001\302T[\302\312\363Rq\375'?\222\t\033\230\312\363\030y#\n4:<t\330x\235\\#\327\210\353\023\002[\260@'\030\331+ZFk\025\343\261\211I/\303f\321\037}\242\005\262\211e\232\324:0\322\030Z\00561M\314\310%r\211t\036H\206^e\233\244E:\317\217\325\331\r>\005\237&\206\352\305\207\321\267:\260\027\314\224l\215\004{5\002|]\347\313\276\022\317\245\300ViP\2665[E\006\2013\243G\272e\264W\n:\020b\231\016\034\032\035\335K\276h\270TZ\364\204\031\232B\002\0031\006\036i\237t\005\355\3222\300\231\031m\321\026\3318N\350\021\031)\003\341\245y\205\370bx'\017\255\232\311\276\201\206\250\241\241q\206fDD$\005I\n\031\016\241\014Q\2329\307\324\003\262i\256\244@\014\021\302\010!\220P\005\202\nR\036\205\264\006\244\rt\332\325\356\320U\211WA#XI\247\025\230\312k#\220-\266;}\206\214\206~u\217Qk\273[y\242\013\274\004\206WN\027\270|\212\341\360\272\202\335\375\033\302\244\377B\034\214^\366\024\370/\307z&UoiBYJ\302Q\317\325\016\241:Z\004\300J\325\360\231\002sv\331\244\t\342_\214\250\244b\014\330\002>^H\315\344w\275\325\207=\314\016J\265\r\032\357'\236\003\033@\365\241\247\000hn/\020\321\2027\361$ts9\336\372:\211\306\271W7\005\336\203\344\321u\312\300`\017\"Y\031\261<\247\2556\334v\010\002\333\202\036\362\232\313\342s\334\220\013d%\014i\333\004=\361\304\3263\223\311)\360{\003 \361O#d\022\245\335\232M\346y\366\0063]}d0c\312\262S\230`;$l\336\252\323\247\311\353\256/\324\200\014\210\360^\252D\004*\315\220\005\021Z\252P\023-\224-\003\330\302\306g\200;1\212\000\0056\316Z%+\370A\345\270%`4\363\225SW>\325\030\2520\206T\357in\264\351\010\271C\207|1xK\325\220\n\255\311\324\213\256\005\372\235LM\3732\000\225\365\026r.\357\273(\370\022\004\343\275T)\006\250\350 \013\027\264\374\240\246\032Q$\034\236\243c\201\004\304$\377{\254\316A&\224\305.Py[\325\234p\304]\323C\275=V\036\"\306\362\237\013\022x4\301/\035\334\306\271\311\026.\312\036\275\242\355\377\201\323\246""\004\270\r+\365]\353\315\036Z\246\277\320\027R\221\226`K\377\377Z\261'\232\0218\300\343Fu\307\351\r\274\005\220k\262\000,9\333\231\317\314\347\017D\036%\341Z,\027\007Q\236\017\005-\235\343U\241\252H\233]\326\323\375\312xp\240.\353\350\3569\333q\022\307\375\247\354\024M7+\223\335\200\354t\204x\2130\000\007X\301w\242\240\360\224\300\330\205\246>\001\004\341h\200T\370\352!i\256\230C\217#\346\344,3\003\351\264~%{\234/\250\213\233\331\361\232\004^\324>\001K\303\247\361\353e\250\270\300\262\365\354s+\375\310\364X;\273\004\262\203\001\225\356\346x,\374\026\203o_5*\017(\254\227D\031\237V\372\025tDH\3072\202}U\365\005\240\224h\233Oek\017+^\221r\2662\3310\276\237\211G\023\312\013\373\353\212K\262\315H\002<\234\264\213\321\\y\256|m\336)]3\335R\243\006\006\352fI\343x\374\034\364\210\307A\324\320\300\255-@<\306\306\373\3018oO~\352\300\216Lr\031n^0\235\002k\014\277\275d@\206f\254\213\001\351\307@\316\203\346\351\272\252\244\305\254\324,\306`3\250x\027\026\0229\367\202R*#\374'Z\r5";
26248
26248
  PyObject *data = __Pyx_DecompressString(cstring, 1738, 3);
26249
26249
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
26250
26250
  const char* const bytes = __Pyx_PyBytes_AsString(data);
26251
26251
  #if !CYTHON_ASSUME_SAFE_MACROS
26252
26252
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
26253
26253
  #endif
26254
- #elif (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (1879 bytes) */
26255
- const char* const cstring = "BZh91AY&SYW\006>\225\000\001[\177\377\357\377\377\277\376\257\377\377\277\367\377\370\277\377\377\364@@@@@@@@@@@@@\000@\000`\007n\371\311J\364s\275\335\333X\266jkJ\243\200\201$\242jj\017S =G\224\321\357Ra3E\003A\223\324\362\232\r\014!\241\246\203\324\365\0324h\321\241\352z\203\332\t\244\022H\t\243D\323Si4\247\264\221\215M\000\000\310\311\240\000\000\000\000\0004\017Q\264F@\250\247\372\224\375Q\2024\306\232\t\350\2320LF\000L\004\304\030#L\2154\304`\2310\021\240\323\021\201\251\376\252\201\023P\r\r4\000\000\000\001\241\240\000\000\000\000\000\000\000\001\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Jh\202#\02214a\023\025?)\215I\2614L\000\003@\001\030L\000\236H\300M\243A\240\216\265\320`\273u\242\274+\360D_#\030#\220@<\312>\352X\2316'\232\004c\251\007\022\223#U\227\360O\3650\2450 B\220\245!\"\"%\000\202\023$1Z\330\356\373C(\302lf\230LC\023\223\003\310\245\341\000\023*\343\032K\350\236q\005\344R$\340\344\225\356\252j`\213kJ\335Y\020\200<\241\t\274\036\347\003\242\221h\365VY1\032}\345\336a\307\305\320\177\027\361\027\371o\351C\2461\306\347Q\375\036\306\037\250~\365\260\352R\212s\306\027>\316\264\312N\307\270\222\227X\210\347\026n\006\315z\3667\205\0144\224-C\243Rn\252b\242\225\235\237\032\t\213\371G\243\330\332\231\237\325\236\346\2038\201\t\277=2\336Jl<\301\207a\003\031\251\223\375\256=@\333\272\314\\\034\340\315\331\214\007\2530N\331O_\231\356N`\250\212\327\331\366\236^@\213\201\341\027\364,\030&J`\365\327\272X\3344\033\233\177\337\371wl\374\177.i~\327S7\226\271\322\314\203&`\215\271x \204\322C4\246\347\301\307\3234l\340\331\262))K\222\263EJ\326\265\212B\020\204\262HA\253' PelKx\013\216\357\267\230\222\234\311\316\0239\226\255&k\334s\202Dg\314S\2579\211\202a\366\341u{]\307^&s\356\331\312\257\332\337v\200\302B!!8\213<%\006\232h\000\003\235\221\222!\214c\000\000\002\220l!,\301!@A\002\335\334(\014$EA7M\266\322\312\027\003Z\204\203.\307hBL\013\250\002@\354\034\257\301 uE\270\267\242\252\275(\235\226S\367\355\314\355\311\314`\261\350\340\033\r\223\254""\206\307\021t^K\tc\212E\3179O\025k \n@\235\316\253\326\251$\344\224BI$\200\000Wm\222\372\272V\265L\202RL%\221I-WU\267\252\266WUw]0Y/*\272\340\000\000,\222\364\264\272\265rV\264\260]\303\021\321\304!^\364\227\371\315\324\036'K\256\005\353\276\312\2724\370\270\341\274l\217\202\222PXRdK\024\256\002D\206y\211c\212\023RNI\361>9x\037!\223,\346U\tR\300O\227C\241\204.\ry\344\024\264\317<c\030\336\3218L\025\021\304Wx\262\340\"JD\224\200\000J%\010\330\3713\330\030)I3\\\354^\315\021,\234\2122\032\344\004XK\n\354\344\306\270\352\311\000\213\265[\252\367\275\3623F*\302\030\2135\032\367p\307\303\271\206\331\222)I;0\301<\251!$\002\000\000P\000\200\031\372\252Yv\334\3023\277\032\213Y\361V)BzZ\263I$\222I'g\306[\r\2151\211Br\273r\032?D qg_=v\205\357\2744\302b\032/:tP!\031C\022\257\266\205\261m\334\037Ll\037\212B\\\025\316\0213p\266\336\354X\013\232F\2667X\013!6\236\037\325vr\215\363\300\317e\303\206\344\010M\232BL\220\223\356\026\3502\275\342\364\347\266\021\300\305\377\3343\360\347mh\003V\337<\336\r\326\342F\264+v\255\321\237\026\211\030/\344\261/a\000\000\000\000\010\210\2423\365N\262\223\266\334,\367];\237h`\222\243\222\317\206\003\326\215\360\307\221t6\336\020\031\252YU\245\233*\206\326\324&\275n8\n>\245 \266\247h%\221\031>\307\275\t\326\244:\221]\245\212\016\377\374\014\300\366\256\322\262\323m\030*!\032e\215\032G\262\344M\000\235\263L\230\206\366\"\267Z\001\034\232\232$r\355a*\034\256\303~\315\340\263\033\203Y\216\324\to(\262\245\372[r\230\251\332\246\214A@No\331.GW-\325\215_7L\034\355s;\276\207r\374K\236\354Cw/9\007\204)zC\234i\267\r\244cf\006\250\202\225$\325R\224\245x\265\3420\360\3230\233T\306Ld\306X\230\251jZ\211\336t\027& 4\230\177h\332\016\343\220\302\322G6X\205s\221t\017\031\\\004\207\220\034\273g\244\226\244V,H\301\31046\013\217\007V\035\235\345C\206\251\356eY\225L\t\213\270\335\246\252\322#\221[^\027\333\313\317\2734+\034\345\006\n\244\231$\201$\212Qw\350u}\244Z\031\261;5\2758\377\373+\221\334N\356\352\314\262l\210CM\212\002\256\032\2642E\214\242\314n\003\222X\342BXM""\246\237TA\264\257-1,\231\030\022xK\005R\302A\331\000\210G3\r\310\3076o*\323\2501{n\n\003\035\340xi\tM\327\000\245\252\214\334\274\242\034\032\312CHp\275\222\021\224\340iX\305\r\016\227tSp+\271[\014f\375\250\310\216\212:(\350\243\242\244\215H\232&\211\336t\206\303\030\301\304\205\202`F\277#\r\257\026\241Il\000\347p\214\332\255L\033\246\030u!\032|c\260\264\257\363\305\3319T\235\351\346\312RSy\306\375+C\334c\327e-f`\017a\257\230j\223\231\0142R\331\341\255\031\014,wV\031\255\373\222;\260\177J\013y\204g\027\311F\317\334\271\247\264;\223\371YQ%\001\266\017>~\221\313\235q\205\270\232;<\310\241{4\330&\343;F\035\351\307\342\331\362k\275\r\"\216\301r\226e.\230\300\333qB\337\316\263\305\022\240\305#s\n\364\"\250\374a\252_\025\333C\177\212u+\021\252E\363\306\0245\030< \365xi\323\253\365 O\010u\022\225~\2752\366\023CTj\366\362\352g\276\024\346e\321\256O\016\373`\031\323\261<\214\371\266\033\310\347:\323\363\346\326\326\302\220\363\3640\314\332\037A\251a\345?MW\312\n\326rs\254\351l\216\230\\\324\007f\227[$Y\001/#C\237\017\033\234\021/\030n\360tctC\022\356x\244\254\275n\267\211/\344\336G\254l2i\2704]\313\323\377\317\027\032m\362w\272]iV\201(&\210/R\234\235\310$\255I\017\004\202\203\312\t\216\304C\261\n\204=!3C\224\035\336T\032Hy7\364.\344\212p\241 \256\014}*";
26256
- PyObject *data = __Pyx_DecompressString(cstring, 1879, 2);
26254
+ #elif (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (1856 bytes) */
26255
+ const char* const cstring = "BZh91AY&SY\315/\306j\000\001[\177\377\357\377\377\277\376\257\377\377\277\367\377\370\277\377\377\364@@@@@@@@@@@@@\000@\000`\007n\371\310(\254\335\335\333X\266jkJ\243\200\330$\224MMA\352d\007\250\362\232=\352L&h\240h2z\236SA\241\20444\320z\236\243F\215\0324=OP{A4\202I\001\006\211\246\247\242eOjj1\224\001\351\0000\200\036\240\000\000\000\000h\036\223j\017$ \300\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rO\365T\010\232\200hi\240\000\000\000\r\r\000\000\000\000\000\000\000\000\0100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002SD\021\014\211\246#\021\031\0324\311\014\232\r\032\032\r\000\001\240\000\003 \000\321\240\004u\256\203\005\333\255\025\341_\202\"\371\030\301\034\202\001\346Q\367R\304\311\261<\320#\035H8\224\231\032\254\277\202\177\251\205)\201\002\024\205)\t\021\021(\004\020\231!\212\326\307w\3102\213\346\306\314\302b\030\234\230\036E.\010\000\231W\030\322]D\363\210.\"\221'\007$\256uSS\004[ZW\025dB\000\362\262\023x=\316\007E\"\301\352\214\261b5\375\345\276i\307\305\323\177\027\361\027\371\217\352\303\2561\306\347V\377\033\263\207\352\037\275*?\252\353S\236\020\265\365rL\256u=\304\224\271\010\216qfp\334\327\257q\272\220\303IB\324:5&\351&*)Y\332\352\3011\177\310\363\3739&f\364\347\237A\230@\204\337\276\231m\2456\036`\303\260\201\215\232c\367W+P6\326\203#\207L3\276q\001\351T\031\366\355\346{\024\2405\214a\303\353u\372\362.&Q\301\341\027s\255\030&J`\366k\332,m\352\r\307O\177\345\321g\353\373q\313\372\305L\275e\310\226T\030\362\204lK\301\004&\222\031\2457>\r\376\201\243sV\275qIJ\\\272\315\025+Z\326)\010B\022\305!\006X\271\002\203+\"Y\260\264\340\356f$\2472s\204\315\373\026sf\347\034\342\221\031\266Jv'10L?\013\361W\267\315\354D\316\034[\234\325vM\327h\013\3446e\367\347\302j\335\335\335\210\210\357'DR\224\244DDJ\347\311\237h\311s1\216\371F\322%\004\3356\303K(b\006\265\t\006]\307hBL\013\242\002@\354\034\307\335\2009\244\332\033S\346\323\340|j\252\\\274\2219 \342\320kt\356\212\375\221\234\005k\337G\334J\371a\212F'\234\247\202\265\220""\005 N\347I\353T\222rJ!$\222@\000+\266\311}]+Z\246A)&\022\310\244\226\253\252\333\325[+\252\273\256\230,\227\225]p\000\000\026IzZ]Z\271+\032W\256\351\210\346\342\020\256zK\375\360\362\016\217W\224\013\227}\2153g\352a~\263T|\024\222\202\302\223\"X\245p\022$3\314K\034P\232\222rO\211\361\313\300\371\014\231g2\250J\225\342|\272\035\014!r5\346\220R\3234\360\214a{D\3410TF\371]\262\313\200\211)\022R\000\001(\224#c\344\317``\245$\315k\260{4D\261r+d5\250\010\260\225\364\325\315\2150\313\024\002-\312\315W=\317\215\2320V\020\304Y\250\327\265~\035\354\367\354\030\342\224\223\263\014\023\312\222\022@ \000\005\000\010\001\237\252\245\227lL#3\362\224Z\317\202\261J\023\322\325\232I$\222I;>\022\330l)\214\n\023\225\273P\315\372!\003\212\271ti\260.}\301\236\023\020\321y\327\255@\204e\014\n>\312\313\"\333w\276\274*\037\202B\\\312h\204M\016\026\313\235\203\001kH\322\306\333\001T&\323\277\371\246\256q\270x\0325Z8m\321\t\264$$\311\t>\321m\203+\236/F{\001\034\206.\356\0036\366f\326\2005lp\233a\264\333\350\326\205nKtf\301\242F\013\371,K\330@\000\000\000\002\"(\214\374\247II\333-\026\215\267N\327\330\027\244\253rZ7\240=f\334\0147m\206\313\202\0035\n\250\263\263c@\330\331\t\256[N\002\267\320\256\013bvbX\221\223\352{\320\235jC\251\025\310\260A\323\357\206`{WmYi\260\213\325\020\2152\302\215#\331\211\023@'j\317&!\257\001Y\245\000\216m\014\3229\3660\225g;\262\334\253XU\206 \326a\265\002[j,\251v\226\317L\024\355\323F\000\240'7l\227\003\254KiaWM\323\007'\\\316\357\235\317}\365\302\354Cs\336r\016\240\245\350\016r\223g2#\01305D\024\251&\252\224\245+\305\257\021\207\206\231\204\332\2462c&2\304\305KR\324N\343\234\2700\001\244\277\227\031\003\233\300_i#\217,B\304\344b\201\343+\200\220\362\003\227p\364\222\311\024\213\022/r\014\315z\343\275\324\206\375\305\003z\211\356eI\225L\t\214\\\247i\252\264\210\340V\327y\3662\360\342\331\205c\234\300`\252I\222H\022H\245\027M\016\256\264\213Cg\003\263[\320\217\317r\270\335\304\356\356\254\313&\306\2044\330\254\025/\3133$T\312,\306\3209%\206\004%|\332i\364D\033:\353&""%\217\033\002O\t^\252XH;@\021\010\343a\270\030\343\331\362-:#\0276\320\2401\320\017\025!)\272\320\024\262\255\233\237\214C\231\244\256\031\303y\354\220\214\247!\245c\0244:]\311L\341\\\365\260\302n\332\214h\342G\0228\221\304\244\215H\232&\211\334wC_\204`\337B\2750#_\215~O\022\241In\000rw\206mV\246\r\242\373\3720\215=S\262\264\257_\177\264s\024\235\351\345JRSy\306\355+C\333c\327e-f`\017a\257\230j\223\231\0142R\331\341\255\031\014,wV\031\255\373\222;\260\177J\013y\204g\027\311F\317\334\271\247\264;\223\371YQ%\001\266\017>~\221\313\235q\205\270\232;<\310\241{4\330&\343;F\035\351\307\342\331\362k\275\r\"\216\301r\226e.\230\300\333qB\337\316\263\305\022\240\305#s\n\364\"\250\374a\252_\025\333C\177\212u+\021\252E\363\306\0245\030< \365xi\323\253\365 O\010u\022\225~\2752\366\023CTj\366\362\352g\276\024\346e\321\256O\016\373`\031\323\261<\214\371\266\033\310\347:\323\363\346\326\326\302\220\363\3640\314\332\037A\251a\345?MW\312\n\326rs\254\351l\216\230\\\324\007f\227[$Y\001/#C\237\017\033\234\021/\030n\360tctC\022\356x\244\254xxz\220\377\215Lz\346\3036\272\006\232o\364?\027>\206\272\374\255\\\0340\234\202\017\"\303\313\232\023\223\271\004\225\251!\340\220PyA1\330\210v!P\207\244&hr\203\273\312\203I\017&\377\305\334\221N\024$3K\361\232\200";
26256
+ PyObject *data = __Pyx_DecompressString(cstring, 1856, 2);
26257
26257
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
26258
26258
  const char* const bytes = __Pyx_PyBytes_AsString(data);
26259
26259
  #if !CYTHON_ASSUME_SAFE_MACROS
26260
26260
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
26261
26261
  #endif
26262
- #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (1751 bytes) */
26263
- const char* const cstring = "x\332\245WKs\033\305\026F\205.6\261!(\316\243x\004\332\201T\352\026D7r\344<\214 \245\004'\370\026\344F\301!p\357\242\2535\323\222\007\217{\244\231n\331\242Xx\251\345,{9\313Yj\251\245\227Yz\251\245\177\002?\201\323=\017\275f.\241H\325\310\335\3379}\336\347t\347\301\255\362\355r\345v\355a\355\333\332\316\216m\3236\261Q\323qlJ\030\352\021[\320-\364\324\341\2102G\264\367\220\305:\202#\223p\002 E|\217p\364\250\317\367\034\206,\017\231\324\266\232\324%\234\332}\344q\32728u\025\023C\317\266\237\335\254\336\253\"\302L\344\322_\250\301=\344\211\246a\023\317\243\036rZ\250),\233[\014\361~\207ze\264\323B}G F\251\211\270\203:\3007}\200\357Q\206<\312\325\002\335 \2149\234p\313a\030\216[\254}\003\231\226\013J\254\036U\247\037\023\333\243\345\377t\014\307\244\310\001\017@\237KX\233\242[7767\267P\255\361\202\231\264e1\320\346h\266-DL\023\203XZk\326L\323\340GHx\312\226C\313\240e\275?$\036\002\006\215\227M\313#M\233\3229F\272\300H\231\342k\033\265\275\232ey\321\316d\016\004\257E\204\315\021\306.5\205A1F\246\320\3263\207\335\204`\366,H\r\306\206\305,\216\225e\250\331\347\324\003\343\2735\025l\326\366\034\341\032\364kN\366)\3264d\020H\251\211Z\216\213l\313\343\232bBZ\246\t\232SS\024K6\005\344/\310:\360\332\035b\354\377\313p\\Z\356\364\217\036\022\217~CU\354\036\212V\213\272\363\373r\352\231\241+\006\343\014\016H)h\344\377\207\3075#\337\262\010-\333!\374^\026\305b\274\222\203o\344\340\325\034<S>\004(\013\026yzE\236b\221\247Y$\252\267\331l\214\247\367\3311\236\343\310\214\361\014\017\361&1\236!\034\272\371\204I\360\347)I\0202\360\215\034\274\232\203g\312\217\203?\017\213<\275\"O\261\310\323\254\203?\235\221h\375\210\037\245\213\305\320O\223\026b>!N\332u\016S\215:\007\251\306\233\203\300\3719\204\213\216=\343A\264\006z\272X4v\232\264`\354\204\010\343?\262u\026R\246\316\"\036\355\n\312\014:\207rw\026\320W\314S\207\321]\030\373\030?\353\037\301\367\rH\303O\351\021\177N[?\220\326L+\314\357\027=\311\340Xph\201'\035\036Y\024UG9\370F\016^\315\3013\345\213<\005\"O\203\310S!\022\035\323\371\237""\337g\307\354\317\246\304\002O\332\363Y\224\304\245\254\236\317\301\2539x\246|\221\247@\344i\020y*t\314v\277\217\256\263m\327u\\\214\343\027\005\224d2\013\211\327g\206\345\224\341\272\203\027\004\274\024<\005;\256I]\303\206-X\212\271K\014\332\004)J\201a6EK}Xw\245\256tS\247\013\267\\\347 \222:\r\250\346\306\272\225p\362\307t\014\214)\310P\037N\033\206j\017\222\265\t\235\002\277\030\267\004\003v\214\333I\3520\266<\234\032lqz\340\331\026\3476P\016\010\330\013\377\016('\372Q\2457\216)\024\021V\256\203)\203W\005\005\002\334\364\300\313\310\201&1z\210\261\nU\307\351\300\302\245\035\342\002!\235\014\311<\230\236\002q\357\247\016\000;t\272\261G\215}O\034D;\227z\360\376\211\326\261\371j\311\365`P+\301:\226\261\017\366\315_\217\031\344\351\034\317\221\347\333&\203\274x\272\307\325;M\271\337\025\304\216B\221\274D\322\331\021\217\212x2\304\203 \356\373\350\215\2204{\322\333I+'\235;y\374-\264h\n\320#\325\234vK\267h\234\025X\305\357\307\251\306\305\031M\3549.W\037\336\247}\017HnD\007\323\004<\311\373\336\3442J\257\240\364\342I\256\233\311%\203\261b\204\337\370-\250\232\203\352\214A8a/:\360_\005\n\317\336\324\020\235}\375\003u\325\243\256\247\336\3548yV\244\023%\036 \361\274\210\307C<\r\242\013?\031\001I\307'\r\236\364\363q\341\367\3457\376\261:\370Z\226\344?\203J\360$\274;\\?.\234\025W\006\017\344\272\274\037\324\203\227a\375\270>^\376PV\306\313\347\007\334\377R\022y\030\220@D\370\312\240\n\340}\3718\270\031v\207\205\361\362\352\340\337>\361\273\021\363\246|;(\005\237\005\344uX\227d7(\006\251\324\276|K\036\204\225\260\2362\236-\277\347\353c\333\376%\330sy'X\013\352\343\325\367\374\363p\2640\265(\371%\377z$\271\373\027\344\335\0136\303%\260\355\374\250{RH\017\177$\353\231\256GR\016%\r\356\206\353aEA\010\034\370nX\030\226\306 zEn\006\205\240\264\200\257\312m\010\312\372\002\376\266\274\004\n\272\013\3709y]y\245\360\353\301nX:\233\004N\371\325\365\227\300\210v\360c\370\325\2500\272zBN\300\261\213\376\223(a\277\3125Y\227\215\263\345w\006/\374\317\374\266\334\r\336W\326\216\337\271""\360\267\266\237\372?\275\376\366\232\277\023o\267\206?\217\310\250\377\252\220\005\377\372\2524\276\272>\013\234-_\006W{\262\241\342\275\3437|(\245\263\345\253p\256\244\220\357dA\226\242\354T\375\256<\227\324\332U\371\"\270\021\226\302\365I\346\372\341\233*\373\021\365\277\201\247\215\233\224\302%\220m\312\033Jl\254\361LW\306\025\371.\244\274\0276\324\301\230r\034\027\304}\010\355s]\022\335i\350G(\243Bx9\324\340\007r=\263z\246\241\303P{5\201\014ez\304%\374\272\277+K\321\246\347\277\324\362\253A\037\252cmX\0376\216\013\343\342\271\301\347~#\352\345w\007\273~i\\\\\035<\361+\376c\371E@\306\305\245\343\336\340\245\277-/\252(^\360\301\236+\312\343+\272\342\241v\025\207\352\225\323\363\225\341\305ac\330\036\375\357\325\322+\340\230A\n\023\005\227u\357]\014\032\257\257h3X\n\272\257\251\350\264x\r\222w)$!\037n\215\264\207e\330\364\224\263g\305Od\367\024\335\032\256\214\276<\331?m<\037\027\327N\327>\r\356\351\316\006\371\277\371wU\3047\206\353\247\267\037\237\260\323\335\027c\230f\225\323\342\203\021\250\376\030\272\365NXR\213\375\360B\270\021\376\020u\331\312\340\216\377\261\352\262\251\346\312\256\210G*#\343UH+\204\240\224.\376\000\2619\031\014";
26264
- PyObject *data = __Pyx_DecompressString(cstring, 1751, 1);
26262
+ #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (1749 bytes) */
26263
+ const char* const cstring = "x\332\245WKs\033\305\026F\205\300&6\004\305y\024\217p\333@*EADd\344<\214 \245\004'\327\024\204(8\204\307\242\2535\323\222\007\217{\244\231n\331\242Xx\251\345,{9\313Yj\251\245\227Yz\251\245\177\302\375\t\367t\317C\257\031\010E\252F\356\376\316\351\363>\247;\367n\226\277(W6k\367k\377\255\355\354\3306m\023\0335\035\307\246\204\241\036\261\005\335B\217\035\216(sD{\017Y\254#82\t'\000R\304\367\010G\017\372|\317a\310\362\220Im\253I]\302\251\335G\036w-\203SW11\364d\373\311\215\352\235*\"\314D.\375\235\032\334C\236h\0326\361<\352!\247\205\232\302\262\271\305\020\357w\250WF;-\324w\004b\224\232\210;\250\003|\323\007\370\036e\310\243\\-\320u\302\230\303\t\267\034\206\341\270\305\332\327\221i\271\240\304\352Qu\372!\261=Z\376\241c8&E\016x\000\372\\\302\332\024\335\274\261\261\271\271\205j\215g\314\244-\213\2016G\263m!b\232\030\304\322Z\263f\232\006?B\302S\266\034Z\006-\353\375!\361\0200h\274lZ\036i\332\224\3161\322\005F\312\024_\333\250\355\325,\313\213v&s x-\"l\2160v\251)\014\21212\205\266\2369\354\006\004\263gAj06,fq\254,C\315>\247\036\030\337\255\251`\263\266\347\010\327\240_s\262O\261\246!\203@JM\324r\\d[\036\327\024\023\3222M\320\234\232\242X\262) \177A\326\201\327\356\020c\377s\303qi\271\323?\272O<\372\rU\261\273/Z-\352\316\357\313\251g\206\256\030\21438 \245\240\221\377\005\217kF\276e\021Z\266C\370\235,\212\305x%\007\337\310\301\2539x\246|\010P\026,\362\364\212<\305\"O\263HTo\263\331\030O\357\263c<\307\221\031\343\031\036\342Mb<C8t\363\t\223\340\317S\222 d\340\0339x5\007\317\224\037\007\177\036\026yzE\236b\221\247Y\007\177:#\321\372\001?J\027\213\241\237&-\304|B\234\264\353\034\246\032u\016R\2157\007\201\363s\010\027\035{\306\203h\r\364t\261h\3544i\301\330\t\021\306\177d\353,\244L\235E<\332\025\224\031t\016\345\356,\240\257\230\307\016\243\2730\3661~\322?\202\357\033\220\206\037\323#\376\224\266~$\255\231V\230\337/z\222\301\261\340\320\002O:<\262(\252\216r\360\215\034\274\232\203g\312\027y\nD\236\006\221\247B$:\246\363?\277\317\216\331\337M\211\005\236\264\347\263(\211KY=""\237\203Ws\360L\371\"O\201\310\323 \362T\350\230\355~\037]g\333\256\353\270\030\307/\n(\311d\026\022\257\317\014\313)\303u\007/\010x)x\nv\\\223\272\206\r[\260\024s\227\030\264\tR\224\002\303l\212\226\372\260\356J]\351\246N\027n\271\316A$u\032P\315\215u+\341\344\217\351\030\030S\220\241>\2346\014\325\036$k\023:\005~1n\t\006\354\030\267\223\324aly85\330\342\364\300\263-\316m\240\034\020\260\027\376\035PN\364\243Jo\034S(\"\254\\\007S\006\257\n\n\004\270\351\201\227\221\003Mb\364\020c\025\252\216\323\201\205K;\304\005B:\031\222y0=\005\342\336O\035\000v\350tc\217\032\373\2368\210v.\365\340\375\023\255c\363\325\222\353\301\240V\202u,c\037\354\233\277\0363\310\3239\236#\317\267M\006y\361t\217\253w\232r\277+\210\035\205\"y\211\244\263#\036\025\361d\210\007A\334\367\321\033!i\366\244\267\223VN:w\362\370[h\321\024\240G\2529\355\226n\3218+\260\212\337\217S\215\2133\232\330s\\\256>\274O\373\036\220\334\210\016\246\tx\222\367\275\311e\224^A\351\305\223\\7\223K\006c\305\010\277\361[P5\007\325\031\203p\302^t\340\277\n\024\236\275\251!:\373\372\007\352\252G]O\275\331q\362\254H'J<@\342y\021\217\207x\032D\027~2\002\222\216O\032<\351\347\343\302\377\226_ymu\360\265,\311O\202J\360(\274=\\?.\234\025W\006\367\344\272\274\033\324\203\347a\375\270>^~OV\306\313\347\007\334\377R\022y\030\220@D\370\312\240\n\340]\3710\270\021v\207\205\361\362\352\340[\237\370\335\210yS\276\021\224\202\217\003\3622\254K\262\033\024\203Tj_\276.\017\302JXO\031\317\226\337\366\365\261m\377\022\354\271\274\025\254\005\365\361\352\333\376y8Z\230Z\224\374\222\177-\222\334\375\007\362\356\004\233\341\022\330v~\324=)\244\207\337\227\365L\327#)\207\222\006\267\303\365\260\242 \004\016|7,\014Kc\020\275\"7\203BPZ\300W\3456\004e}\001\177C^\002\005\335\005\374\234\274\246\274R\370\265`7,\235M\002\247\374\352\372K`D;\370)\374jT\030]=!'\340\330E\377Q\224\260?\344\232\254\313\306\331\362\233\203g\376\307~[\356\006\357(k\307o^\370W\333\217\374\237_~\373\241\277\023o\267\206\277\214\310\250\377\242\220\005\377\361\2424\276\272>""\013\234-_\006W{\262\241\342\275\3437|(\245\263\345\253p\256\244\220\357dA\226\242\354T\375\256<\227\324\332U\371,\270\036\226\302\365I\346\372\341\253*\373\021\365\327\300\323\306MJ\341\022\3106\345u%6\326x\246+\343\212|\013R\336\013\033\352`L9\216\013\342.\204\366\251.\211\3564\364\023\224Q!\274\034j\360]\271\236Y=\323\320a\250\275\232@\2062=\342\022~\335\337\225\245h\323\363\237k\371\325\240\017\325\2616\254\017\033\307\205q\361\334\340S\277\021\365\362[\203]\2774.\256\016\036\371\025\377\241\374, \343\342\322qo\360\334\337\226\027U\024/\370`\317\025\345\361\025]\361P\273\212C\365\312\351\371\312\360\342\2601l\217~{\261\364\0028f\220\302D\301e\335{\027\203\306\313+\332\014\226\202\356K*:-~\010\311\273\024\222\220\017\267F\332\3032lz\312\331\263\342\177d\367\024\335\034\256\214\276<\331?m<\035\027\327N\327>\n\356\350\316\006\371\177\372\267U\3047\206\353\247_<<a\247\273\317\3060\315*\247\305{#P\375\001t\353\255\260\244\026\373\341\205p#\3741\352\262\225\301-\377\003\325eS\315\225]\021\017TF\306\253\220V\010A)]\374\037\325s\031\016";
26264
+ PyObject *data = __Pyx_DecompressString(cstring, 1749, 1);
26265
26265
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
26266
26266
  const char* const bytes = __Pyx_PyBytes_AsString(data);
26267
26267
  #if !CYTHON_ASSUME_SAFE_MACROS
26268
26268
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
26269
26269
  #endif
26270
26270
  #else /* compression: none (4643 bytes) */
26271
- const char* const bytes = "?0.3.13<B<H<IIllegal boolean value: Not enough input dataNote that Cython is deliberately stricter than PEP-484 and rejects subclasses of builtin types. If you need to pass subclasses then set the 'annotation_typing' directive to False.Opcode out of range 0-255: <QUndefined opcode: add_note<b<ddctx used twice.dctx was not used.disableectx used twice.ectx was not used.enablegc<h<iisenabledno default __reduce__ due to non-trivial __cinit__not bytes: <q<stringsource>take_bytes called for listtake_dict called for bytestake_list called for bytestake_str called for listtmsgpack/core.pyxBaseDecodeBufferBaseDecodeBuffer.__reduce_cython__BaseDecodeBuffer.__setstate_cython__BaseDecodeBuffer.rd_bytesBaseDecodeBuffer.rd_float8BaseDecodeBuffer.rd_int1BaseDecodeBuffer.rd_int2BaseDecodeBuffer.rd_int4BaseDecodeBuffer.rd_int8BaseDecodeBuffer.rd_strBaseDecodeBuffer.rd_uint1BaseDecodeBuffer.rd_uint2BaseDecodeBuffer.rd_uint4BaseDecodeBuffer.rd_uint8BaseEncodeBufferBaseEncodeBuffer.__reduce_cython__BaseEncodeBuffer.__setstate_cython__BaseEncodeBuffer.as_bytesBaseEncodeBuffer.wr_bytesBaseEncodeBuffer.wr_float8BaseEncodeBuffer.wr_int1BaseEncodeBuffer.wr_int2BaseEncodeBuffer.wr_int4BaseEncodeBuffer.wr_int8BaseEncodeBuffer.wr_strBaseEncodeBuffer.wr_uint1BaseEncodeBuffer.wr_uint2BaseEncodeBuffer.wr_uint4BaseEncodeBuffer.wr_uint8DecodeBufferDecodeCtxDecodeCtx.__reduce_cython__DecodeCtx.__setstate_cython__DecodeCtx.take_bytesDecodeCtx.take_dictDecodeCtx.take_listDecodeCtx.take_strDecodeCtx.take_tupleEncodeBufferEncodeCtxEncodeCtx.__reduce_cython__EncodeCtx.__setstate_cython__EncodeCtx.put_bytesEncodeCtx.put_dictEncodeCtx.put_sequenceEncodeCtx.put_strEncodeCtx.put_valueNoneType__Pyx_PyDict_NextRefSafeDecodeBufferSafeDecodeBuffer.__reduce_cython__SafeDecodeBuffer.__setstate_cython__SafeDecodeBuffer.rd_float8SafeDecodeBuffer.rd_int1SafeDecodeBuffer.rd_int2SafeDecodeBuffer.rd_int4SafeDecodeBuffer.rd_int8SafeDecodeBuffer.rd_uint1SafeDecodeBuffer.rd_uint2SafeDecodeBuffer.rd_uint4SafeDecodeBuffer.rd_""uint8SafeEncodeBufferSafeEncodeBuffer.__reduce_cython__SafeEncodeBuffer.__setstate_cython__SafeEncodeBuffer.wr_float8SafeEncodeBuffer.wr_int1SafeEncodeBuffer.wr_int2SafeEncodeBuffer.wr_int4SafeEncodeBuffer.wr_int8SafeEncodeBuffer.wr_uint1SafeEncodeBuffer.wr_uint2SafeEncodeBuffer.wr_uint4SafeEncodeBuffer.wr_uint8TMsgpackError__annotate__as_bytesasyncio.coroutinesbyteordercline_in_tracebackcodecdbufdbuf_take_valuedecode_from_bytesdecode_from_list__dict___dict__doc__ebufebuf_put_valueencode_valueendextend__func____getstate___is_coroutineitemslittle__main____metaclass____module____mro_entries__msgn__name____new__packpop__prepare__put_bytesput_dictput_sequenceput_strput_value__pyx_checksum__pyx_result__pyx_state__pyx_type__pyx_unpickle_BaseDecodeBuffer__pyx_unpickle_BaseEncodeBuffer__pyx_unpickle_SafeDecodeBuffer__pyx_unpickle_SafeEncodeBuffer__pyx_vtable____qualname__rd_bytesrd_float8rd_int1rd_int2rd_int4rd_int8rd_strrd_uint1rd_uint2rd_uint4rd_uint8__reduce____reduce_cython____reduce_ex__self__set_name__setdefault__setstate____setstate_cython__sortsort_keysstartstatestructsystake_bytestake_dicttake_listtake_strtake_tuple__test__tmsgpack.core_typeunpackupdateuse_setstatevaluevalues__version__wr_byteswr_float8wr_int1wr_int2wr_int4wr_int8wr_strwr_uint1wr_uint2wr_uint4wr_uint8\200\001\360\010\000\005\014\210>\230\021\230)\2401\240G\2507\260!\200\001\340\004\013\210?\230!\2309\240A\240W\250A\200A\330\010\033\2301\330\010\017\210t\220;\230a\230w\240a\240u\250A\200A\330\010\013\2104\210t\2209\230F\240-\250q\260\001\330\010\014\210J\220a\220q\330\010\017\210t\2205\230\t\240\021\240$\240a\200A\330\010\013\2104\210t\2209\230F\240-\250q\260\001\330\010\014\210J\220a\220q\330\010\017\210t\2205\230\007\230q\240\004\240A\200A\330\010\013\2104\210y\230\006\230m\2501\250A\330\010\014\210J\220a\220q\340\010\020\220\001\330\010\014\210E\220\025\220a\220t\2306\240\023\240A\330\014\020\220\017\230q\240\001\330\014\020\220\017\230q\240\001\330\014\021\220\021\220%\220q\330\010\017\210q\200A""\330\010\013\2104\210y\230\006\230m\2501\250A\330\010\014\210J\220a\220q\340\010\020\220\001\330\010\014\210E\220\025\220a\220t\2308\2405\250\007\250q\260\017\270q\300\001\330\010\017\210q\200A\330\010\034\230A\330\010\017\210t\220;\230a\230w\240a\240u\250A\200A\330\010\014\210J\220a\220w\230e\2407\250!\2501\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\013\2305\240\001\240\021\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\014\230E\240\021\240!\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\t\230\025\230a\230q\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\n\230%\230q\240\001\200A\330\010%\240T\250\021\340\010\014\210J\220a\220q\330\010\013\2104\210q\220\007\220w\230g\240V\250=\270\001\270\035\300a\300q\340\010\024\220G\2301\330\010\017\210z\230\023\230A\230Q\340\010\r\210U\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220#\220X\230T\240\031\250!\2501\330\r\022\220#\220X\230T\240\031\250!\2501\330\r\022\220#\220X\230T\240\031\250!\2501\330\r\022\220\"\220I\230T\240\031\250!\250:\260Y\270a\270y\310\001\330\r\022\220\"\220I\230T\240\031\250!\250:\260Y\270a\270z\310\021\330\035!\240\031\250!\250:\260Y\270a\270z\310\021\340\010\026\220a\220v\230Q\330\010\014\210I\220Q\220a\200A\340\010\035\230T\240\021\330\010\014\210L\230\001\230\021\330\010\017\210t\2204\220q\230\n\240$\240a\200A\330\010\035\230U\240'\250\021\250!\330\010\017\210t\220;\230a\230y\250\003\2501\250A\200A\330\010\035\230Z\240s\250!\2501\330\010\014\210J\220a\220q\340\010\025\220Q\220d\230'\240\021\330\010\026\220a\220v\230Q\340\010\014\210E\220\027\230\016\240a\240v\250Q\200A\330\010\026\220a\220v\230Q\200A\330\010\017\210t\2209\230A\230R\230w\240a\240q\200A\330\010\017\210t\2209\230A\230V\2405\250\001\250\026\250q\200A\330\010\032\230!\330\010\017\210t\220;\230a\230w\240a\240u\250A\200A""\330\010\017\210t\220;\230a\230w\240a\240w\250a\200A\340\010\017\210t\220;\230a\230w\240c\250\021\250!\200A\330\010\017\210u\220A\220T\230\021\200A\330\010\017\210v\220W\230A\230V\2404\240y\260\001\260\023\260A\260Q\200\001\330\004\n\210+\220Q\200\001\360\010\000\005\016\210T\220\021\330\004\014\210G\2201\220F\230,\240a\330\004\007\200v\210W\220E\230\024\230Q\330\010\022\220!\330\010\027\220q\340\010\027\220t\2308\2407\250!\330\004\007\200q\330\010\017\320\0171\260\024\260Q\260g\270[\310\007\310q\340\010\017\320\0171\260\024\260Q\260g\270[\310\001\200\001\360\010\000\005\016\210T\220\026\220t\2306\240\024\240Q\330\004\014\210G\2201\220F\230,\240a\330\004\007\200v\210W\220E\230\024\230Q\330\010\022\220!\330\010\027\220q\340\010\027\220t\2305\240\007\240q\330\004\007\200q\330\010\017\320\0171\260\024\260Q\260g\270[\310\007\310q\340\010\017\320\0171\260\024\260Q\260g\270[\310\001\320\004\"\240'\250\025\250a\250t\260:\270Q\200\001\330\004.\250a\250v\260Q\200\001\340\004\037\230q\320 0\260\013\270;\300k\320QR\330\004\023\320\023#\2408\2501\250A\330\004\007\200|\2207\230!\330\0102\260!\3203F\300n\320TU\330\004\013\2101\320\004?\270q\330\010\036\230e\2406\250\021\330\010\036\230k\250\022\2502\250S\260\001\260\021\330\010\013\2106\220\036\230q\240\001\340\010\014\210J\220a\220q\330\010\025\220Q\220d\230'\240\021\330\010\026\220a\220v\230Q\340\010\014\210C\210u\220A\330\014\032\230!\2306\240\021\330\014\032\230!\2306\240\021";
26271
+ const char* const bytes = "?0.3.15<B<H<IIllegal boolean value: Not enough input dataNote that Cython is deliberately stricter than PEP-484 and rejects subclasses of builtin types. If you need to pass subclasses then set the 'annotation_typing' directive to False.Opcode out of range 0-255: <QUndefined opcode: add_note<b<ddctx used twice.dctx was not used.disableectx used twice.ectx was not used.enablegc<h<iisenabledno default __reduce__ due to non-trivial __cinit__not bytes: <q<stringsource>take_bytes called for listtake_dict called for bytestake_list called for bytestake_str called for listtmsgpack/core.pyxBaseDecodeBufferBaseDecodeBuffer.__reduce_cython__BaseDecodeBuffer.__setstate_cython__BaseDecodeBuffer.rd_bytesBaseDecodeBuffer.rd_float8BaseDecodeBuffer.rd_int1BaseDecodeBuffer.rd_int2BaseDecodeBuffer.rd_int4BaseDecodeBuffer.rd_int8BaseDecodeBuffer.rd_strBaseDecodeBuffer.rd_uint1BaseDecodeBuffer.rd_uint2BaseDecodeBuffer.rd_uint4BaseDecodeBuffer.rd_uint8BaseEncodeBufferBaseEncodeBuffer.__reduce_cython__BaseEncodeBuffer.__setstate_cython__BaseEncodeBuffer.as_bytesBaseEncodeBuffer.wr_bytesBaseEncodeBuffer.wr_float8BaseEncodeBuffer.wr_int1BaseEncodeBuffer.wr_int2BaseEncodeBuffer.wr_int4BaseEncodeBuffer.wr_int8BaseEncodeBuffer.wr_strBaseEncodeBuffer.wr_uint1BaseEncodeBuffer.wr_uint2BaseEncodeBuffer.wr_uint4BaseEncodeBuffer.wr_uint8DecodeBufferDecodeCtxDecodeCtx.__reduce_cython__DecodeCtx.__setstate_cython__DecodeCtx.take_bytesDecodeCtx.take_dictDecodeCtx.take_listDecodeCtx.take_strDecodeCtx.take_tupleEncodeBufferEncodeCtxEncodeCtx.__reduce_cython__EncodeCtx.__setstate_cython__EncodeCtx.put_bytesEncodeCtx.put_dictEncodeCtx.put_sequenceEncodeCtx.put_strEncodeCtx.put_valueNoneType__Pyx_PyDict_NextRefSafeDecodeBufferSafeDecodeBuffer.__reduce_cython__SafeDecodeBuffer.__setstate_cython__SafeDecodeBuffer.rd_float8SafeDecodeBuffer.rd_int1SafeDecodeBuffer.rd_int2SafeDecodeBuffer.rd_int4SafeDecodeBuffer.rd_int8SafeDecodeBuffer.rd_uint1SafeDecodeBuffer.rd_uint2SafeDecodeBuffer.rd_uint4SafeDecodeBuffer.rd_""uint8SafeEncodeBufferSafeEncodeBuffer.__reduce_cython__SafeEncodeBuffer.__setstate_cython__SafeEncodeBuffer.wr_float8SafeEncodeBuffer.wr_int1SafeEncodeBuffer.wr_int2SafeEncodeBuffer.wr_int4SafeEncodeBuffer.wr_int8SafeEncodeBuffer.wr_uint1SafeEncodeBuffer.wr_uint2SafeEncodeBuffer.wr_uint4SafeEncodeBuffer.wr_uint8TMsgpackError__annotate__as_bytesasyncio.coroutinesbyteordercline_in_tracebackcodecdbufdbuf_take_valuedecode_from_bytesdecode_from_list__dict___dict__doc__ebufebuf_put_valueencode_valueendextend__func____getstate___is_coroutineitemslittle__main____metaclass____module____mro_entries__msgn__name____new__packpop__prepare__put_bytesput_dictput_sequenceput_strput_value__pyx_checksum__pyx_result__pyx_state__pyx_type__pyx_unpickle_BaseDecodeBuffer__pyx_unpickle_BaseEncodeBuffer__pyx_unpickle_SafeDecodeBuffer__pyx_unpickle_SafeEncodeBuffer__pyx_vtable____qualname__rd_bytesrd_float8rd_int1rd_int2rd_int4rd_int8rd_strrd_uint1rd_uint2rd_uint4rd_uint8__reduce____reduce_cython____reduce_ex__self__set_name__setdefault__setstate____setstate_cython__sortsort_keysstartstatestructsystake_bytestake_dicttake_listtake_strtake_tuple__test__tmsgpack.core_typeunpackupdateuse_setstatevaluevalues__version__wr_byteswr_float8wr_int1wr_int2wr_int4wr_int8wr_strwr_uint1wr_uint2wr_uint4wr_uint8\200\001\360\010\000\005\014\210>\230\021\230)\2401\240G\2507\260!\200\001\340\004\013\210?\230!\2309\240A\240W\250A\200A\330\010\033\2301\330\010\017\210t\220;\230a\230w\240a\240u\250A\200A\330\010\013\2104\210t\2209\230F\240-\250q\260\001\330\010\014\210J\220a\220q\330\010\017\210t\2205\230\t\240\021\240$\240a\200A\330\010\013\2104\210t\2209\230F\240-\250q\260\001\330\010\014\210J\220a\220q\330\010\017\210t\2205\230\007\230q\240\004\240A\200A\330\010\013\2104\210y\230\006\230m\2501\250A\330\010\014\210J\220a\220q\340\010\020\220\001\330\010\014\210E\220\025\220a\220t\2306\240\023\240A\330\014\020\220\017\230q\240\001\330\014\020\220\017\230q\240\001\330\014\021\220\021\220%\220q\330\010\017\210q\200A""\330\010\013\2104\210y\230\006\230m\2501\250A\330\010\014\210J\220a\220q\340\010\020\220\001\330\010\014\210E\220\025\220a\220t\2308\2405\250\007\250q\260\017\270q\300\001\330\010\017\210q\200A\330\010\034\230A\330\010\017\210t\220;\230a\230w\240a\240u\250A\200A\330\010\014\210J\220a\220w\230e\2407\250!\2501\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\013\2305\240\001\240\021\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\014\230E\240\021\240!\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\t\230\025\230a\230q\200A\330\010 \240\004\240L\260\001\260\021\330\010\020\220\n\230%\230q\240\001\200A\330\010%\240T\250\021\340\010\014\210J\220a\220q\330\010\013\2104\210q\220\007\220w\230g\240V\250=\270\001\270\035\300a\300q\340\010\024\220G\2301\330\010\017\210z\230\023\230A\230Q\340\010\r\210U\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220$\220g\230T\240\031\250!\2501\330\r\022\220#\220X\230T\240\031\250!\2501\330\r\022\220#\220X\230T\240\031\250!\2501\330\r\022\220#\220X\230T\240\031\250!\2501\330\r\022\220\"\220I\230T\240\031\250!\250:\260Y\270a\270y\310\001\330\r\022\220\"\220I\230T\240\031\250!\250:\260Y\270a\270z\310\021\330\035!\240\031\250!\250:\260Y\270a\270z\310\021\340\010\026\220a\220v\230Q\330\010\014\210I\220Q\220a\200A\340\010\035\230T\240\021\330\010\014\210L\230\001\230\021\330\010\017\210t\2204\220q\230\n\240$\240a\200A\330\010\035\230U\240'\250\021\250!\330\010\017\210t\220;\230a\230y\250\003\2501\250A\200A\330\010\035\230Z\240s\250!\2501\330\010\014\210J\220a\220q\340\010\025\220Q\220d\230'\240\021\330\010\026\220a\220v\230Q\340\010\014\210E\220\027\230\016\240a\240v\250Q\200A\330\010\026\220a\220v\230Q\200A\330\010\017\210t\2209\230A\230R\230w\240a\240q\200A\330\010\017\210t\2209\230A\230V\2405\250\001\250\026\250q\200A\330\010\032\230!\330\010\017\210t\220;\230a\230w\240a\240u\250A\200A""\330\010\017\210t\220;\230a\230w\240a\240w\250a\200A\340\010\017\210t\220;\230a\230w\240c\250\021\250!\200A\330\010\017\210u\220A\220T\230\021\200A\330\010\017\210v\220W\230A\230V\2404\240y\260\001\260\023\260A\260Q\200\001\330\004\n\210+\220Q\200\001\360\010\000\005\016\210T\220\021\330\004\014\210G\2201\220F\230,\240a\330\004\007\200v\210W\220E\230\024\230Q\330\010\022\220!\330\010\027\220q\340\010\027\220t\2308\2407\250!\330\004\007\200q\330\010\017\320\0171\260\024\260Q\260g\270[\310\007\310q\340\010\017\320\0171\260\024\260Q\260g\270[\310\001\200\001\360\010\000\005\016\210T\220\026\220t\2306\240\024\240Q\330\004\014\210G\2201\220F\230,\240a\330\004\007\200v\210W\220E\230\024\230Q\330\010\022\220!\330\010\027\220q\340\010\027\220t\2305\240\007\240q\330\004\007\200q\330\010\017\320\0171\260\024\260Q\260g\270[\310\007\310q\340\010\017\320\0171\260\024\260Q\260g\270[\310\001\320\004\"\240'\250\025\250a\250t\260:\270Q\200\001\330\004.\250a\250v\260Q\200\001\340\004\037\230q\320 0\260\013\270;\300k\320QR\330\004\023\320\023#\2408\2501\250A\330\004\007\200|\2207\230!\330\0102\260!\3203F\300n\320TU\330\004\013\2101\320\004?\270q\330\010\036\230e\2406\250\021\330\010\036\230k\250\022\2502\250S\260\001\260\021\330\010\013\2106\220\036\230q\240\001\340\010\014\210J\220a\220q\330\010\025\220Q\220d\230'\240\021\330\010\026\220a\220v\230Q\340\010\014\210C\210u\220A\330\014\032\230!\2306\240\021\330\014\032\230!\2306\240\021";
26272
26272
  PyObject *data = NULL;
26273
26273
  CYTHON_UNUSED_VAR(__Pyx_DecompressString);
26274
26274
  #endif
@@ -1,7 +1,7 @@
1
1
  # THIS FILE IS AUTOMATICALLY CREATED BY build_pyx.py
2
2
  # DON'T EDIT THIS FILE. EDIT THE SOURCES, INSTEAD: tmsgpack/src-parts/*
3
3
 
4
- __version__ = "0.3.13"
4
+ __version__ = "0.3.15"
5
5
 
6
6
  from libc.stdint cimport int8_t, int16_t, int32_t, int64_t
7
7
  from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tmsgpack
3
- Version: 0.3.13
3
+ Version: 0.3.15
4
4
  Summary: Typed MessagePack serializer (inspired by but different from msgpack)
5
5
  Author-email: Yaakov Belch <yaakov.belch@gmail.com>
6
6
  License: ISC
@@ -5,10 +5,12 @@ pyproject.toml
5
5
  setup.py
6
6
  tests/test_build_pyx.py
7
7
  tests/test_codec.py
8
+ tests/test_codec_custom.py
8
9
  tests/test_round_trip.py
9
10
  tmsgpack/__init__.py
10
11
  tmsgpack/api.py
11
12
  tmsgpack/codec.py
13
+ tmsgpack/codec_custom.py
12
14
  tmsgpack/core.c
13
15
  tmsgpack/core.pyx
14
16
  tmsgpack.egg-info/PKG-INFO
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes