diff --git a/README.md b/README.md index 1f2e4f669dfce2d796341b75ca87530ee4234c98..2e0f3fbf8d2d1ba40b7c1ea21a5e3d87b43a2a03 100644 --- a/README.md +++ b/README.md @@ -9,32 +9,16 @@ tags: # ActionCodec2 -Tokenizers for **ActionCodec2: A Streaming Action Tokenizer**. This repository contains -30 variants with one shared runtime and an optional native extension. +- **Paper edition**: first- and second-order tokenizers used in the paper; 5 mm translation precision and 4,096 tokens per profile. +- **Extended edition**: retrained after additional pretraining-data cleaning and filtering, with more precision and vocabulary options. +- **Sparse version**: standard and high-dynamic first-order tokenizers, each with EEF and joint profiles and binary (`2bin`) or 21-level (`21bin`) grippers. -## Editions - -- **Paper edition**: `paper-1st` and `paper-2nd` are the first- and second-order tokenizers - used in the paper. Both use **5 mm translation precision** and a **4,096-token budget - per profile**, with joint and EEF profiles. -- **Extended edition**: tokenizers retrained after additional cleaning and filtering of - the pretraining data. They offer first and second order, **1/5/10 mm translation - precision**, and **1k–16k token budgets per profile** for a wider range of precision - and vocabulary requirements. The 1 mm tier starts at 2k; its 2k variants contain - EEF profiles only. - -Precision labels describe translation quantization settings. Rotation and joint settings -are specified separately in each profile's configuration. Paper and Extended variants -have separately trained vocabularies, including when their precision and budget match. -The six released VLA policies use the Paper edition and must keep their original variant. +All 34 variants use one shared runtime. Precision labels describe translation quantization; rotation and joint limits are in each profile's configuration. ## Tokenizer usage -Select a variant explicitly to load its configuration and fitted assets together: - ```bash -export HF_ENDPOINT=https://hf-mirror.com -pip install numpy scipy torch "transformers>=4.57,<6" huggingface-hub pyyaml +pip install numpy scipy torch "transformers>=5.2,<6" huggingface-hub pyyaml ``` ```python @@ -42,50 +26,46 @@ import numpy as np from transformers import AutoProcessor codec = AutoProcessor.from_pretrained( - "ZibinDong/ActionCodec2", variant="paper-1st", trust_remote_code=True, - revision="v0.1.1", + "ZibinDong/ActionCodec2", variant="paper-1st", + action_space="single_eef_delta", trust_remote_code=True, ) -actions = np.zeros((12, 7), dtype=np.float32) +actions = np.zeros((1, 16, 7), dtype=np.float32) tokens = codec.encode(actions, fps=15) -decoded = codec.decode(tokens, fps=15) -codec.save_pretrained("./saved-tokenizer") -restored = AutoProcessor.from_pretrained( - "./saved-tokenizer", trust_remote_code=True, local_files_only=True, -) +restored = codec.decode(tokens, fps=15) ``` -The default action space is `single_eef_delta`: translation increments in metres, -body-frame rotation-vector increments in radians, and an absolute binary gripper command. -Rotation follows `R_next = R_previous @ Exp(rotvec)`; the gripper opens at values >= 0.8. -Pass the actual recording rate as `fps`; the tokenizer resamples to 15 Hz. -Inputs have shape `(T, D)` or `(B, T, D)`; decoded CPU float32 tensors have shape `(B, T_out, D)`. -Resampling may change the length. Quantization is lossy. +Use `variant="sparse-standard-2bin"` or `"sparse-high-dynamic-21bin"` for Sparse; +Sparse decoding requires `horizon=actions.shape[-2]` in source frames. +Each profile has its own token namespace; the budget is per profile, not the total routed vocabulary. + +The EEF layout is `[x, y, z, rx, ry, rz, gripper]`, in metres and radians. +Delta rotations use `R_next = R_previous @ Exp(rotvec)`. Grippers are absolute open fractions (0 closed, 1 open). +Inputs are `(T,D)` or `(B,T,D)` and are resampled to 15 Hz. Reconstruction is lossy. +Absolute layouts also require `current_state`; second-order variants require +`previous_first_order` in canonical 15 Hz increments in both encode and decode. +Zero boundaries are valid only when the preceding motion is known to be zero. +Use `final_first_order` to carry reconstructed second-order boundaries between chunks. -Second-order variants require the preceding first-order motion at every chunk boundary: +`codec.print_action_spaces()` lists the layouts. Dual arms are interleaved by time; +BPE tokens never merge across arms. The historical `single_joint6_abs_continuous_gripper` +name aliases `single_joint6_abs_no_gripper`: six joint coordinates, no separate gripper slot. + +## Train tokenizers ```python -codec = AutoProcessor.from_pretrained( - "ZibinDong/ActionCodec2", variant="paper-2nd", trust_remote_code=True, - revision="v0.1.1", -) -# Use a zero template only when the preceding motion is known to be zero. -boundary = codec.first_order_template(batch_size=1) -tokens = codec.encode(actions, fps=15, previous_first_order=boundary) -decoded = codec.decode(tokens, fps=15, previous_first_order=boundary) -boundary = codec.final_first_order(tokens, previous_first_order=boundary, executed_steps=None) +codec.fit(episodes, fps=15) +codec.save_pretrained("./my-tokenizer") ``` -`executed_steps` counts reconstructed steps at the tokenizer's internal **15 Hz**, even -when `encode` or `decode` uses a different `fps`; `None` carries the full chunk boundary. -`previous_first_order` uses the same 15 Hz convention. The VLA adapter handles conversion -from the last raw executed action at the policy's control frequency. -Use `codec.for_action_space("single_joint7_delta")` or another registered layout to change -the physical input convention. Absolute layouts require `current_state` for reconstruction. -The 1mm/2k variants contain EEF profiles only. +Cleaning is off by default, including VLA training and inference. Only tokenizer fitting +accepts `apply_preprocessing=True`, with a recorded or explicitly supplied `preprocessing` +configuration. It acts on continuous canonical trajectories before quantization. +Split recording discontinuities first; second-order cleaning needs `bootstrap_context=True`. +Saved cleaning settings do not enable filtering during encode or decode. ## Available variants -| Variant | Edition | Order | Translation precision | Token budget per profile | Profiles | +| Variant | Edition | Order | Translation precision | Budget / profile | Profiles | | --- | --- | --- | --- | --- | --- | | `paper-1st` | Paper | 1 | 5mm | 4096 | joint, eef | | `paper-2nd` | Paper | 2 | 5mm | 4096 | joint, eef | @@ -117,52 +97,22 @@ The 1mm/2k variants contain EEF profiles only. | `extended-2nd-10mm-4k` | Extended | 2 | 10mm | 4096 | joint, eef | | `extended-2nd-10mm-8k` | Extended | 2 | 10mm | 8192 | joint, eef | | `extended-2nd-10mm-16k` | Extended | 2 | 10mm | 16384 | joint, eef | +| `sparse-standard-2bin` | Sparse | 1 | 5mm | 4096 | eef, joint | +| `sparse-standard-21bin` | Sparse | 1 | 5mm | 4096 | eef, joint | +| `sparse-high-dynamic-2bin` | Sparse | 1 | 5mm | 4096 | eef, joint | +| `sparse-high-dynamic-21bin` | Sparse | 1 | 5mm | 4096 | eef, joint | -Joint and EEF token IDs occupy disjoint namespaces. Budgets apply separately to each -profile. Quantization is lossy; the precision label alone does not determine policy accuracy. -Pin `revision` to a commit for reproducibility; `variants.json` records each variant's -asset hashes and its previous repository ID. Loading downloads shared files plus the -selected variant, and verifies its assets. `subfolder` is not a variant selector. - -Saved processors contain only the selected assets and the complete portable runtime. -They load offline and preserve `artifact_manifest.json` with their asset hashes and origin. -Select a different variant by loading the catalog again. - -## Native acceleration - -Build the optional C++17 kernels once for all variants: - -```bash -hf download ZibinDong/ActionCodec2 --revision v0.1.1 --include "setup.py" "pyproject.toml" "LICENSE" "actioncodec2_kernels/*" --local-dir ./actioncodec2-kernels -pip install ./actioncodec2-kernels -``` - -`ACTIONCODEC2_NUM_THREADS` controls the per-process thread budget. -`ACTIONCODEC2_NO_NATIVE=1` selects the Python reference implementation. - -## VLA inference package - -The versioned source archive `actioncodec2-0.1.1.tar.gz` contains policy inference code, -native kernels, training recipes, and evaluation scripts. Use **Python 3.12 or later** -and a C++17 compiler. Inference has been checked with Python 3.12, PyTorch 2.7.1, -and Transformers 5.14.1. - -```bash -pip install "actioncodec2[cuda] @ https://hf-mirror.com/ZibinDong/ActionCodec2/resolve/v0.1.1/actioncodec2-0.1.1.tar.gz" -``` +Pin `revision` for reproducibility. `variants.json` records asset hashes; a selected +`save_pretrained()` directory contains its assets and the shared portable runtime. +The optional C++17 kernels can be built with `pip install ./downloaded-tokenizer`. -The `cuda` extra adds Liger and Flash Linear Attention. Each policy bundles its exact -AC2 variant and text tokenizer; once downloaded, inference works offline without -another model or tokenizer repository. Each policy's README describes its inputs. +## VLA policies -| Training data / evaluation target | First-order policy | Second-order policy | -| --- | --- | --- | -| LIBERO | [First order](https://hf-mirror.com/ZibinDong/G05_ActionCodec2-1st_LIBERO) | [Second order](https://hf-mirror.com/ZibinDong/G05_ActionCodec2-2nd_LIBERO) | -| Bridge / SimplerEnv (WidowX) | [First order](https://hf-mirror.com/ZibinDong/G05_ActionCodec2-1st_SimplerEnv) | [Second order](https://hf-mirror.com/ZibinDong/G05_ActionCodec2-2nd_SimplerEnv) | -| DROID | [First order](https://hf-mirror.com/ZibinDong/G05_ActionCodec2-1st_DROID) | [Second order](https://hf-mirror.com/ZibinDong/G05_ActionCodec2-2nd_DROID) | +Installation, paper-policy evaluation and VLA training: [source repository](https://github.com/ZibinDong/actioncodec2). +The existing six AC2 policies retain their single-arm tokenizer behavior. The released Sparse +profiles have a 4,096-token budget; the current G0.5 Sparse adapter additionally needs an EOS +position and therefore requires a vocabulary of at most 4,095 tokens when training a new VLA. ## License -The tokenizer runtime and fitted assets use [Apache-2.0](LICENSE). The source archive -also includes G0.5 components under `LICENSE-G0.5`. G0.5-derived policy weights use the -G0.5 Community License; see the individual policy cards and the archive's license files. +Tokenizer code and assets: Apache-2.0. G0.5 policy code and weights use their separate community license. diff --git a/actioncodec2-0.1.1.tar.gz b/actioncodec2-0.1.1.tar.gz deleted file mode 100644 index efc272286df456ba48e142479c2e1e31508ee86d..0000000000000000000000000000000000000000 --- a/actioncodec2-0.1.1.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dac31a13dfbe46534186f8b51db19fceab9febcfe54fd880f029b5fd9ce5915d -size 302806 diff --git a/actioncodec2-0.3.0.tar.gz b/actioncodec2-0.3.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..204455d0f8dac832ce0c6977fb03791af3cb3d12 --- /dev/null +++ b/actioncodec2-0.3.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdb76fb260435f45fba5a6572122eee3f3ceacb11480091f781e645ab60c0bec +size 503117 diff --git a/actioncodec2_kernels/__init__.py b/actioncodec2_kernels/__init__.py index 0102cb43af492d4ad6d149af86f29b56fb8bc5e8..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/actioncodec2_kernels/__init__.py +++ b/actioncodec2_kernels/__init__.py @@ -1 +0,0 @@ -"""Portable ActionCodec2 CPU kernels.""" diff --git a/actioncodec2_kernels/bpe.cpp b/actioncodec2_kernels/bpe.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4e16981c3e857c5a23e224794818de23d0bc136d --- /dev/null +++ b/actioncodec2_kernels/bpe.cpp @@ -0,0 +1,428 @@ +// Native BPE trainer -- the FAST-style ablation baseline. +// +// Set-BPE treats one control step as an unordered set of primitive cells and +// merges spatially before merging across time. Plain BPE instead serializes +// the quantized ``[T, D]`` cell matrix row-major into one symbol sequence and +// runs textbook byte-pair encoding on it, which is what FAST does after its +// DCT stage. Both trainers consume the identical quantized corpus, +// so a paired run isolates the tokenizer structure and nothing else. +// +// Correctness is identical to the Python reference trainer in +// ``actioncodec2/bpe_training.py``, including the tie-break (largest count, +// then lexicographically smallest ordered ``(left, right)`` pair) and the +// left-to-right application order, so the two emit the same merge list. +// +// Where the time goes, and what is done about it: +// * occurrences of every observed ordered pair are indexed once, so a merge +// touches only the positions that actually carry it; +// * the corpus is a doubly linked list over one flat symbol array, so +// collapsing a pair is O(1) and never rewrites the tail; +// * counters live in the same flat linear-probing table as the Set-BPE +// kernels (common.hpp), and the heap is lazy with per-merge deduplication +// of the keys a merge could have changed. + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "common.hpp" + +namespace py = pybind11; + +namespace { + +// BPE pairs are ordered, so the key keeps ``left`` in the high word. The +// heap tie-break in common.hpp prefers the smallest key, which is therefore the +// lexicographically smallest ``(left, right)`` -- the Python reference rule. +inline uint64_t ordered_key(int32_t left, int32_t right) { + return (static_cast(static_cast(left)) << 32) | + static_cast(static_cast(right)); +} + +inline int32_t key_left(uint64_t key) { return static_cast(key >> 32); } +inline int32_t key_right(uint64_t key) { return static_cast(key & 0xffffffffull); } + +// Per-merge set of pair keys whose counters moved. A merge can only touch +// pairs incident to its two parents or its child, so the live population is +// bounded by a small multiple of the vocabulary; clearing is a generation bump +// rather than a table sweep. +class StampSet { + public: + explicit StampSet(size_t capacity_hint) { + size_t target = 1024; + while (target < capacity_hint * 4) target <<= 1; + keys_.assign(target, 0); + stamps_.assign(target, 0); + mask_ = target - 1; + } + + void reset() { + ++generation_; + members_.clear(); + if (generation_ != 0) return; + std::fill(stamps_.begin(), stamps_.end(), 0); + generation_ = 1; + } + + void insert(uint64_t key) { + size_t slot = mix(key) & mask_; + while (stamps_[slot] == generation_) { + if (keys_[slot] == key) return; + slot = (slot + 1) & mask_; + } + if ((members_.size() + 1) * 4 > (mask_ + 1) * 3) { + grow(); + slot = mix(key) & mask_; + while (stamps_[slot] == generation_) { + if (keys_[slot] == key) return; + slot = (slot + 1) & mask_; + } + } + keys_[slot] = key; + stamps_[slot] = generation_; + members_.push_back(key); + } + + const std::vector& members() const { return members_; } + + private: + static uint64_t mix(uint64_t value) { + value ^= value >> 30; + value *= 0xbf58476d1ce4e5b9ull; + value ^= value >> 27; + value *= 0x94d049bb133111ebull; + return value ^ (value >> 31); + } + + void grow() { + const size_t buckets = (mask_ + 1) << 1; + keys_.assign(buckets, 0); + stamps_.assign(buckets, 0); + mask_ = buckets - 1; + generation_ = 1; + for (const uint64_t key : members_) { + size_t slot = mix(key) & mask_; + while (stamps_[slot] == generation_) slot = (slot + 1) & mask_; + keys_[slot] = key; + stamps_[slot] = generation_; + } + } + + std::vector keys_; + std::vector stamps_; + std::vector members_; + size_t mask_ = 0; + uint32_t generation_ = 1; +}; + +// Occurrence index. ``slots`` maps a pair key to its 1-based row in +// ``lists``; a value of zero means "no row yet", which is exactly the absent +// value CounterMap already reports, so no separate presence bit is needed. +struct OccurrenceIndex { + ac2::CounterMap slots{1 << 16}; + std::vector> lists; + std::vector keys; + int64_t stored = 0; + + int64_t row_for(uint64_t key) { + const int64_t existing = slots.get(key); + if (existing > 0) return existing - 1; + const int64_t row = static_cast(lists.size()); + lists.emplace_back(); + keys.push_back(key); + slots.add(key, row + 1); + return row; + } + + void append(uint64_t key, int32_t position) { + lists[static_cast(row_for(key))].push_back(position); + ++stored; + } +}; + +struct Corpus { + std::vector symbol; // live token id per slot, -1 once absorbed + std::vector prev; + std::vector next; + int64_t actions = 0; + int64_t episodes = 0; +}; + +void ingest_chunk(Corpus& corpus, const int32_t* cells, int64_t rows, int32_t dimension, + const int32_t* offsets, const int32_t* bins, const int64_t* episode_offsets, + int64_t episode_count) { + for (int64_t episode = 0; episode < episode_count; ++episode) { + const int64_t start = episode_offsets[episode]; + const int64_t stop = episode_offsets[episode + 1]; + if (stop <= start || start < 0 || stop > rows) { + throw std::invalid_argument("BPE episode offsets must be increasing and in range"); + } + const size_t first = corpus.symbol.size(); + const int32_t* initial = cells + start * dimension; + for (int64_t row = start; row < stop; ++row) { + const int32_t* values = cells + row * dimension; + for (int32_t dim = 0; dim < dimension; ++dim) { + const int32_t value = values[dim]; + if ((value >= 0) != (initial[dim] >= 0)) { + throw std::invalid_argument("active dimensions must remain constant within an episode"); + } + if (value < 0) { + if (value != -1) throw std::invalid_argument("cells must contain -1 or a valid index"); + continue; + } + if (value >= bins[dim]) throw std::invalid_argument("cell index exceeds its bin count"); + corpus.symbol.push_back(offsets[dim] + value); + } + } + const size_t last = corpus.symbol.size(); + if (last == first) throw std::invalid_argument("every control step needs an active coordinate"); + if (last > static_cast(INT32_MAX)) { + throw std::invalid_argument( + "BPE corpus exceeds 2^31 primitive cells; lower the fitting coverage"); + } + corpus.prev.resize(last); + corpus.next.resize(last); + for (size_t index = first; index < last; ++index) { + corpus.prev[index] = index == first ? -1 : static_cast(index - 1); + corpus.next[index] = index + 1 == last ? -1 : static_cast(index + 1); + } + corpus.actions += stop - start; + ++corpus.episodes; + } +} + +} // namespace + +py::tuple train_bpe_native(py::iterable cell_chunks, const std::vector& bins, + int64_t vocab_size, int64_t max_token_cells, int threads) { + const int32_t dimension = static_cast(bins.size()); + if (dimension < 1) throw std::invalid_argument("bins must not be empty"); + std::vector offsets(dimension + 1, 0); + for (int32_t index = 0; index < dimension; ++index) { + if (bins[index] < 1) throw std::invalid_argument("every dimension needs at least one bin"); + offsets[index + 1] = offsets[index] + bins[index]; + } + const int32_t atom_count = offsets[dimension]; + if (vocab_size < atom_count) { + throw std::invalid_argument("vocab_size is below the number of primitive atoms"); + } + if (max_token_cells < 1) throw std::invalid_argument("max_token_cells must be positive"); + + // Greedy merge updates are serial. Preserve the requested option for the + // shared trainer API without changing the calling thread's OpenMP settings. + const int thread_count = 1; + + Corpus corpus; + for (py::handle raw_chunk : cell_chunks) { + py::tuple chunk = py::cast(raw_chunk); + if (chunk.size() != 2) throw std::invalid_argument("each chunk must be (cells, offsets)"); + auto cells = py::cast>(chunk[0]); + auto bounds = + py::cast>(chunk[1]); + auto cells_view = cells.unchecked<2>(); + auto bounds_view = bounds.unchecked<1>(); + if (cells_view.shape(1) != dimension) { + throw std::invalid_argument("cells must have one column per bin count"); + } + if (bounds_view.shape(0) < 2) throw std::invalid_argument("offsets must bound one episode"); + { + py::gil_scoped_release release; + ingest_chunk(corpus, cells_view.data(0, 0), cells_view.shape(0), dimension, offsets.data(), + bins.data(), bounds_view.data(0), bounds_view.shape(0) - 1); + } + } + if (corpus.symbol.empty()) throw std::invalid_argument("BPE training needs one episode"); + + const int64_t initial_length = static_cast(corpus.symbol.size()); + int64_t length = initial_length; + std::vector& symbol = corpus.symbol; + std::vector& prev = corpus.prev; + std::vector& next = corpus.next; + + ac2::CounterMap counts(1 << 16); + OccurrenceIndex index; + std::vector> merges; + std::vector token_cells(static_cast(atom_count), 1); + int64_t initial_pair_types = 0; + int64_t heap_pops = 0; + int64_t counter_updates = 0; + int64_t compactions = 0; + int64_t peak_stored = 0; + int64_t oversized_pairs = 0; + int32_t observed_cells = 1; + + { + py::gil_scoped_release release; + + // One pass builds ascending occurrence lists; the counter is their length. + for (int64_t position = 0; position < initial_length; ++position) { + const int32_t follower = next[position]; + if (follower < 0) continue; + index.append(ordered_key(symbol[position], symbol[follower]), + static_cast(position)); + } + for (size_t row = 0; row < index.lists.size(); ++row) { + counts.add(index.keys[row], static_cast(index.lists[row].size())); + } + initial_pair_types = static_cast(index.lists.size()); + peak_stored = index.stored; + + std::vector heap; + heap.reserve(index.lists.size()); + counts.for_each([&](uint64_t key, int64_t value) { heap.push_back({value, key, 0}); }); + std::make_heap(heap.begin(), heap.end(), ac2::HeapOrder{}); + + token_cells.reserve(static_cast(vocab_size)); + merges.reserve(static_cast(vocab_size - atom_count)); + + ac2::CounterMap oversized(1 << 12); + StampSet touched(static_cast(vocab_size)); + std::vector occurrences; + + while (static_cast(atom_count + merges.size()) < vocab_size && !heap.empty()) { + const ac2::HeapEntry top = ac2::heap_pop(heap); + ++heap_pops; + const uint64_t key = top.key; + const int64_t frequency = counts.get(key); + if (frequency <= 0 || frequency != top.count) continue; + if (oversized.get(key) != 0) continue; + const int32_t left = key_left(key); + const int32_t right = key_right(key); + const int64_t span = static_cast(token_cells[left]) + token_cells[right]; + if (span > max_token_cells) { + oversized.add(key, 1); + continue; + } + + const int32_t child = atom_count + static_cast(merges.size()); + token_cells.push_back(static_cast(span)); + observed_cells = std::max(observed_cells, static_cast(span)); + + occurrences.clear(); + occurrences.swap(index.lists[static_cast(index.slots.get(key) - 1)]); + index.stored -= static_cast(occurrences.size()); + // Left-to-right application is what makes overlapping runs deterministic; + // later appends leave the list unsorted, so restore the order first. + std::sort(occurrences.begin(), occurrences.end()); + touched.reset(); + touched.insert(key); + + int64_t applied = 0; + for (const int32_t position : occurrences) { + if (symbol[position] != left) continue; + const int32_t follower = next[position]; + if (follower < 0 || symbol[follower] != right) continue; + const int32_t before = prev[position]; + const int32_t after = next[follower]; + if (before >= 0) { + const uint64_t stale = ordered_key(symbol[before], left); + counts.add(stale, -1); + touched.insert(stale); + } + if (after >= 0) { + const uint64_t stale = ordered_key(right, symbol[after]); + counts.add(stale, -1); + touched.insert(stale); + } + symbol[position] = child; + symbol[follower] = -1; + next[position] = after; + if (after >= 0) prev[after] = position; + prev[follower] = -1; + next[follower] = -1; + if (before >= 0) { + const uint64_t fresh = ordered_key(symbol[before], child); + counts.add(fresh, 1); + index.append(fresh, before); + touched.insert(fresh); + } + if (after >= 0) { + const uint64_t fresh = ordered_key(child, symbol[after]); + counts.add(fresh, 1); + index.append(fresh, position); + touched.insert(fresh); + } + ++applied; + } + counts.add(key, -applied); + counter_updates += 4 * applied; + length -= applied; + merges.emplace_back(left, right); + + for (const uint64_t member : touched.members()) { + const int64_t value = counts.get(member); + if (value > 0) ac2::heap_push(heap, {value, member, 0}); + } + peak_stored = std::max(peak_stored, index.stored); + + // Superseded positions stay in the lists of pairs that never won. Sweep + // them out once they outnumber the live corpus, so memory tracks the + // corpus rather than the merge history. + if (index.stored > 3 * length) { + int64_t retained = 0; + for (size_t row = 0; row < index.lists.size(); ++row) { + auto& list = index.lists[row]; + if (list.empty()) continue; + const int32_t expected_left = key_left(index.keys[row]); + const int32_t expected_right = key_right(index.keys[row]); + size_t write = 0; + for (const int32_t position : list) { + const int32_t follower = next[position]; + if (symbol[position] != expected_left) continue; + if (follower < 0 || symbol[follower] != expected_right) continue; + list[write++] = position; + } + list.resize(write); + if (write * 2 < list.capacity()) list.shrink_to_fit(); + retained += static_cast(write); + } + index.stored = retained; + ++compactions; + } + + if (heap.size() > 4 * counts.size() + 65536) { + heap.clear(); + counts.for_each([&](uint64_t member, int64_t value) { heap.push_back({value, member, 0}); }); + std::make_heap(heap.begin(), heap.end(), ac2::HeapOrder{}); + } + } + + oversized_pairs = static_cast(oversized.live_entries()); + } + + py::list merge_list; + for (const auto& merge : merges) { + merge_list.append(py::make_tuple(merge.first, merge.second)); + } + py::dict report; + report["episodes"] = corpus.episodes; + report["actions"] = corpus.actions; + report["atoms"] = static_cast(atom_count); + report["merges"] = static_cast(merges.size()); + report["vocab_size"] = static_cast(atom_count + merges.size()); + report["cells"] = initial_length; + report["tokens_per_action_initial"] = + static_cast(initial_length) / static_cast(corpus.actions); + report["tokens_per_action"] = + static_cast(length) / static_cast(corpus.actions); + report["compression"] = static_cast(initial_length) / static_cast(length); + report["max_token_cells"] = max_token_cells; + report["max_token_cells_observed"] = static_cast(observed_cells); + report["oversized_pairs_skipped"] = oversized_pairs; + report["initial_pair_types"] = initial_pair_types; + report["pair_types_peak"] = static_cast(index.lists.size()); + report["occurrence_slots_peak"] = peak_stored; + report["occurrence_compactions"] = compactions; + report["heap_pops"] = heap_pops; + report["counter_updates"] = counter_updates; + report["threads"] = thread_count; + report["requested_threads"] = threads; + report["trainer"] = "native_sparse_exact"; + return py::make_tuple(merge_list, report); +} diff --git a/actioncodec2_kernels/common.hpp b/actioncodec2_kernels/common.hpp new file mode 100644 index 0000000000000000000000000000000000000000..e06016a59275a1afccd33c0e9786367e4cf8860e --- /dev/null +++ b/actioncodec2_kernels/common.hpp @@ -0,0 +1,139 @@ +// Shared primitives for the ActionCodec2 native kernels. +#pragma once + +#include +#include +#include +#include + +namespace ac2 { + +class CounterMap { + public: + static constexpr uint64_t kEmpty = ~0ull; + + explicit CounterMap(size_t capacity_hint = 1024) { reserve(capacity_hint); } + + void reserve(size_t entries) { + size_t target = 16; + while (target * 3 < entries * 4) target <<= 1; // keep load factor <= 0.75 + if (target <= mask_ + 1 && !keys_.empty()) return; + rehash(target); + } + + size_t size() const { return size_; } + size_t buckets() const { return mask_ + 1; } + + void clear() { + std::fill(keys_.begin(), keys_.end(), kEmpty); + size_ = 0; + } + + int64_t get(uint64_t key) const { + size_t slot = probe(key); + return keys_[slot] == key ? values_[slot] : 0; + } + + int64_t add(uint64_t key, int64_t delta) { + return add_with_previous(key, delta).second; + } + + // Update and expose both values with one hash-table probe. This is useful + // when a caller must distinguish a newly observed key from a stale one. + std::pair add_with_previous(uint64_t key, int64_t delta) { + size_t slot = probe(key); + if (keys_[slot] != key) { + if ((size_ + 1) * 4 > (mask_ + 1) * 3) { + rehash((mask_ + 1) << 1); + slot = probe(key); + } + keys_[slot] = key; + values_[slot] = 0; + ++size_; + } + const int64_t previous = values_[slot]; + values_[slot] += delta; + return {previous, values_[slot]}; + } + + template + void for_each(Fn&& fn) const { + for (size_t slot = 0; slot <= mask_; ++slot) { + if (keys_[slot] != kEmpty && values_[slot] != 0) fn(keys_[slot], values_[slot]); + } + } + + size_t live_entries() const { + size_t live = 0; + for (size_t slot = 0; slot <= mask_; ++slot) { + if (keys_[slot] != kEmpty && values_[slot] != 0) ++live; + } + return live; + } + + private: + static uint64_t mix(uint64_t value) { // splitmix64 finalizer + value ^= value >> 30; + value *= 0xbf58476d1ce4e5b9ull; + value ^= value >> 27; + value *= 0x94d049bb133111ebull; + return value ^ (value >> 31); + } + + size_t probe(uint64_t key) const { + size_t slot = mix(key) & mask_; + while (keys_[slot] != kEmpty && keys_[slot] != key) slot = (slot + 1) & mask_; + return slot; + } + + void rehash(size_t buckets) { + std::vector old_keys; + std::vector old_values; + old_keys.swap(keys_); + old_values.swap(values_); + keys_.assign(buckets, kEmpty); + values_.assign(buckets, 0); + mask_ = buckets - 1; + size_ = 0; + for (size_t slot = 0; slot < old_keys.size(); ++slot) { + if (old_keys[slot] != kEmpty && old_values[slot] != 0) { + size_t target = probe(old_keys[slot]); + keys_[target] = old_keys[slot]; + values_[target] = old_values[slot]; + ++size_; + } + } + } + + std::vector keys_; + std::vector values_; + size_t mask_ = 0; + size_t size_ = 0; +}; + +struct HeapEntry { + int64_t count; + uint64_t key; + uint32_t version; // only shifted temporal self-rules use this +}; + +struct HeapOrder { + bool operator()(const HeapEntry& a, const HeapEntry& b) const { + if (a.count != b.count) return a.count < b.count; // larger count first + return a.key > b.key; // smaller key first + } +}; + +inline void heap_push(std::vector& heap, const HeapEntry& entry) { + heap.push_back(entry); + std::push_heap(heap.begin(), heap.end(), HeapOrder{}); +} + +inline HeapEntry heap_pop(std::vector& heap) { + std::pop_heap(heap.begin(), heap.end(), HeapOrder{}); + HeapEntry top = heap.back(); + heap.pop_back(); + return top; +} + +} // namespace ac2 diff --git a/actioncodec2_kernels/grammar.cpp b/actioncodec2_kernels/grammar.cpp index ba278ebdc517aa90ec034903729b60e3f341b26e..e0639358cc56ecede680359ebbb9ccac82d1db39 100644 --- a/actioncodec2_kernels/grammar.cpp +++ b/actioncodec2_kernels/grammar.cpp @@ -1,162 +1,279 @@ +// Coverage grammars and multi-component routing, including time-major streams. #include #include #include - #include #include -#include -#include #include #include #include +#include "parallel.hpp" +#include "token_streams.hpp" -namespace py = pybind11; +namespace py=pybind11; namespace { -using State = std::vector; - -class CoverageGrammar { - protected: - int64_t horizon_, vocabulary_; - virtual void validate_state(const State&) const = 0; - virtual bool allowed(const State&, int64_t) const = 0; - virtual State apply(const State&, int64_t) const = 0; +using State=std::vector; +using States=std::vector; +class Grammar { public: - virtual ~CoverageGrammar() = default; - State advance(const State& state, int64_t token) const { - validate_state(state); - if (token < 0 || token >= vocabulary_ || !allowed(state, token)) return {}; - return apply(state, token); - } - py::array_t mask(const State& state) const { - validate_state(state); - py::array_t result(vocabulary_); - auto* output = result.mutable_data(); + int64_t horizon,vocabulary; + virtual ~Grammar()=default; + virtual State initial()const=0; + virtual State advance(const State&,int64_t)const=0; + virtual int64_t covered(const State&)const=0; + virtual int64_t next_dimension(const State&)const=0; + virtual bool allowed(const State&,int64_t)const=0; + virtual std::shared_ptr clone(int64_t)const=0; + py::array_t mask(const State& state)const { + py::array_t result(vocabulary); py::gil_scoped_release release; - for (int64_t token = 0; token < vocabulary_; ++token) output[token] = allowed(state, token); + for(int64_t token=0;token roots_; - std::vector>> patterns_; - std::vector scope_; - - void validate_state(const State& state) const override { - if (static_cast(state.size()) != horizon_) - throw std::invalid_argument("invalid grammar state length"); - for (int64_t value : state) { - if (value < 0 || (static_cast(value) & ~full_)) - throw std::invalid_argument("invalid grammar state support"); + using Patterns=std::vector>>; + std::shared_ptr> roots_; + std::shared_ptr patterns_; + std::shared_ptr> scope_; + public: + SetGrammar(int64_t steps,uint64_t full,std::vector roots, + std::vector>> patterns) + :full_(full),roots_(std::make_shared>(std::move(roots))), + patterns_(std::make_shared(std::move(patterns))) { + if(steps<1 || !full || roots_->size()!=patterns_->size())throw std::invalid_argument("invalid grammar metadata"); + horizon=steps;vocabulary=roots_->size(); + std::vector scopes; + for(const auto& pattern:*patterns_) { + bool scope=true; + for(auto[offset,support]:pattern) { + if(offset<0)throw std::invalid_argument("negative grammar pattern offset"); + scope=scope && !(support & ~full_); + } + scopes.push_back(scope); } + scope_=std::make_shared>(std::move(scopes)); + } + std::shared_ptr clone(int64_t steps)const override { + if(steps<1)throw std::invalid_argument("horizon must be positive"); + auto result=std::make_shared(*this);result->horizon=steps;return result; + } + State initial()const override{return State(horizon,0);} + int64_t covered(const State& state)const override { + if(static_cast(state.size())!=horizon)throw std::invalid_argument("invalid grammar state"); + for(int64_t i=0;i(state[i])!=full_)return i; + return horizon; } - int64_t front(const State& state) const { - for (int64_t t = 0; t < horizon_; ++t) - if (static_cast(state[t]) != full_) return t; - return horizon_; - } - bool allowed(const State& state, int64_t token) const override { - if (!scope_[token]) return false; - const int64_t start = front(state); - if (start == horizon_) return false; - uint64_t missing = full_ & ~static_cast(state[start]); - int64_t root = 0; - while (!(missing & 1)) { missing >>= 1; ++root; } - if (roots_[token] != root) return false; - for (auto [offset, support] : patterns_[token]) { - if (offset >= horizon_ - start || (static_cast(state[start + offset]) & support)) - return false; + int64_t next_dimension(const State& state)const override { + int64_t front=covered(state);if(front==horizon)return -1; + uint64_t missing=full_ & ~static_cast(state[front]); + int64_t d=0;while(!(missing & 1)){missing>>=1;++d;}return d; + } + bool allowed(const State& state,int64_t token)const override { + if(token<0 || token>=vocabulary || !(*scope_)[token])return false; + const int64_t front=covered(state); + if(front==horizon || (*roots_)[token]!=next_dimension(state))return false; + for(auto[offset,support]:(*patterns_)[token]) { + if(front+offset>=horizon || (static_cast(state[front+offset]) & support))return false; } return true; } - State apply(const State& state, int64_t token) const override { - State result = state; - const int64_t start = front(state); - for (auto [offset, support] : patterns_[token]) - result[start + offset] |= static_cast(support); + State advance(const State& state,int64_t token)const override { + if(!allowed(state,token))return {}; + State result=state;int64_t front=covered(state); + for(auto[offset,support]:(*patterns_)[token])result[front+offset]|=static_cast(support); return result; } +}; +class PlainGrammar:public Grammar { + std::shared_ptr> lengths_,dims_; + std::shared_ptr> phase_; public: - SetGrammar(int64_t horizon, uint64_t full, std::vector roots, - std::vector>> patterns) - : full_(full), roots_(std::move(roots)), patterns_(std::move(patterns)) { - if (horizon < 1 || !full || full > static_cast(INT64_MAX) || - roots_.empty() || roots_.size() != patterns_.size()) - throw std::invalid_argument("invalid Set-BPE grammar metadata"); - horizon_ = horizon; - vocabulary_ = roots_.size(); - for (int64_t token = 0; token < vocabulary_; ++token) { - if (roots_[token] < 0 || roots_[token] >= 63 || patterns_[token].empty()) - throw std::invalid_argument("invalid grammar root or empty pattern"); - std::map coverage; - bool scope = true; - for (auto [offset, support] : patterns_[token]) { - if (offset < 0 || !support || support > static_cast(INT64_MAX) || - (coverage[offset] & support)) - throw std::invalid_argument("invalid grammar pattern offset or support"); - coverage[offset] |= support; - scope = scope && !(support & ~full_); - } - const uint64_t anchor = coverage[0]; - if (!(anchor & (uint64_t{1} << roots_[token])) || - (anchor & ((uint64_t{1} << roots_[token]) - 1))) - throw std::invalid_argument("grammar root must anchor the pattern"); - scope_.push_back(scope); - } + PlainGrammar(int64_t steps,std::vector lengths,std::vector dims, + py::array_t phase) + :lengths_(std::make_shared>(std::move(lengths))), + dims_(std::make_shared>(std::move(dims))) { + horizon=steps;vocabulary=lengths_->size(); + if(steps<1 || dims_->empty() || phase.ndim()!=2 || phase.shape(0)!=static_cast(dims_->size()) || phase.shape(1)!=vocabulary) + throw std::invalid_argument("invalid plain-BPE grammar metadata"); + for(auto value:*lengths_)if(value<1)throw std::invalid_argument("invalid token expansion"); + phase_=std::make_shared>(phase.data(),phase.data()+phase.size()); + } + std::shared_ptr clone(int64_t steps)const override { + if(steps<1)throw std::invalid_argument("horizon must be positive"); + auto result=std::make_shared(*this);result->horizon=steps;return result; + } + State initial()const override{return {0};} + int64_t covered(const State& state)const override { + if(state.size()!=1 || state[0]<0)throw std::invalid_argument("invalid grammar state"); + return state[0]/dims_->size(); + } + int64_t next_dimension(const State& state)const override{return (*dims_)[state[0]%dims_->size()];} + bool allowed(const State& state,int64_t token)const override { + return token>=0 && token(dims_->size()) && (*phase_)[(state[0]%dims_->size())*vocabulary+token]; + } + State advance(const State& state,int64_t token)const override { + if(!allowed(state,token))return {}; + return {state[0]+(*lengths_)[token]}; } }; - -class PlainGrammar : public CoverageGrammar { - int64_t width_, cells_; - std::vector lengths_; - std::vector phase_; - - void validate_state(const State& state) const override { - if (state.size() != 1 || state[0] < 0 || state[0] > cells_) - throw std::invalid_argument("invalid plain-BPE grammar state"); +using Grammars=std::vector>; +int64_t next_component(const Grammars& grammars,const States& states,bool time_major) { + int64_t selected=grammars.size(),minimum=INT64_MAX; + for(size_t i=0;icovered(states[i]); + if(front>=grammars[i]->horizon)continue; + if(!time_major)return i; + if(frontinitial());return states; +} +bool advance(const Grammars& grammars,const std::vector& offsets,States& states,int64_t index,int64_t token) { + if(index<0 || index>=static_cast(grammars.size()))return false; + State next=grammars[index]->advance(states[index],token-offsets[index]); + if(next.empty())return false; + states[index]=std::move(next); + return true; +} +py::tuple state_tuple(const State& state) { + py::tuple result(state.size());for(size_t i=0;i& offsets, + bool time_major,int64_t index,States states,int64_t token) { + if(states.size()!=grammars.size() || offsets.size()!=grammars.size())throw std::invalid_argument("invalid routed metadata"); + if(!advance(grammars,offsets,states,index,token))return py::none(); + py::tuple local(states.size());for(size_t i=0;i interleave(const Grammars& grammars,const std::vector& offsets, + bool time_major,const std::vector>& streams) { + if(streams.size()!=grammars.size() || offsets.size()!=grammars.size())throw std::invalid_argument("one stream per component is required"); + States states=initial(grammars);std::vector cursor(streams.size());std::vector output; + int64_t index; + while((index=next_component(grammars,states,time_major))(grammars.size())) { + if(cursor[index]==streams[index].size())throw std::invalid_argument("component stream ends before complete coverage"); + const int64_t token=streams[index][cursor[index]++]+offsets[index]; + if(!advance(grammars,offsets,states,index,token))throw std::invalid_argument("invalid routed component stream"); + output.push_back(token); } - State apply(const State& state, int64_t token) const override { - return {state[0] + lengths_[token]}; + for(size_t i=0;i> split(const Grammars& grammars,const std::vector& offsets, + bool time_major,const std::vector& tokens) { + if(offsets.size()!=grammars.size())throw std::invalid_argument("invalid routed offsets"); + States states=initial(grammars);std::vector> output(grammars.size()); + for(int64_t token:tokens) { + int64_t index=next_component(grammars,states,time_major); + if(!advance(grammars,offsets,states,index,token))throw std::invalid_argument("invalid routed token coverage"); + output[index].push_back(token-offsets[index]); } - public: - PlainGrammar(int64_t horizon, std::vector lengths, - const py::array_t& phase) - : lengths_(std::move(lengths)) { - if (horizon < 1 || lengths_.empty() || phase.ndim() != 2 || phase.shape(0) < 1 || - phase.shape(1) != static_cast(lengths_.size()) || - horizon > std::numeric_limits::max() / phase.shape(0)) - throw std::invalid_argument("invalid plain-BPE grammar metadata"); - for (int64_t length : lengths_) { - if (length < 1) throw std::invalid_argument("token expansion must be positive"); + if(next_component(grammars,states,time_major)!=static_cast(grammars.size())) + throw std::invalid_argument("Incomplete action token stream"); + return output; +} + +using Streams=std::vector>; +using ComponentStreams=std::vector; + +Streams interleave_batch(const Grammars& grammars,const std::vector& offsets, + bool time_major,const ComponentStreams& streams) { + if(streams.size()!=grammars.size() || streams.empty() || streams.front().empty()) + throw std::invalid_argument("one non-empty batch per component is required"); + const int64_t batch=streams.front().size(); + for(const auto& rows:streams)if(static_cast(rows.size())!=batch) + throw std::invalid_argument("component batches must have the same size"); + Streams output(batch); + py::gil_scoped_release release; + ac2::parallel_for(batch,0,[&](int64_t b) { + Streams local;for(const auto& rows:streams)local.push_back(rows[b]); + output[b]=interleave(grammars,offsets,time_major,local); + }); + return output; +} + +py::tuple decode_batch(const Grammars& prototypes,const std::vector& offsets, + bool time_major,const py::iterable& streams, + py::array_t counts, + int64_t cells_per_step) { + if(prototypes.empty() || counts.ndim()!=1 || cells_per_step<1) + throw std::invalid_argument("invalid routed batch metadata"); + const auto rows=ac2::checked_token_streams(streams,counts.size(),true); + int64_t steps=-1; + ComponentStreams output(prototypes.size(),Streams(rows.size())); + { + py::gil_scoped_release release; + for(const auto& row:rows) { + int64_t cells=0; + for(int64_t token:row) { + if(counts.data()[token]<1)throw std::invalid_argument("token is outside the routed profile vocabularies"); + cells+=counts.data()[token]; + } + if(cells%cells_per_step || cells/cells_per_step<1) + throw std::invalid_argument("Incomplete action token stream: " + + std::to_string(cells_per_step-cells%cells_per_step) + + " more coordinate values are needed to finish a step. " + "Constrain generation with codec.grammar(H, fps=...).next_token_mask(prefix) " + "and check is_complete(tokens) for the intended H before decoding. " + "Use codec.batch_decode(..., errors='return') to isolate invalid rows; " + "do not pad truncated tokens with zeros."); + if(steps>=0 && steps!=cells/cells_per_step) + throw std::invalid_argument("all token streams must decode to the same length; use codec.batch_decode(...) for independent variable-length outputs"); + steps=cells/cells_per_step; } - horizon_ = horizon; - width_ = phase.shape(0); - cells_ = horizon * width_; - vocabulary_ = lengths_.size(); - phase_.assign(phase.data(), phase.data() + phase.size()); + Grammars grammars;for(const auto& prototype:prototypes)grammars.push_back(prototype->clone(steps)); + ac2::parallel_for(rows.size(),0,[&](int64_t b) { + auto local=split(grammars,offsets,time_major,rows[b]); + for(size_t i=0;i complete(const Grammars& grammars,const std::vector& offsets, + bool time_major,std::vector tokens,int64_t steps, + const std::vector>& zero_atoms) { + if(grammars.empty() || offsets.size()!=grammars.size() || zero_atoms.size()!=grammars.size() || + steps<1 || steps>grammars.front()->horizon)throw std::invalid_argument("invalid prefix completion metadata"); + py::gil_scoped_release release; + States states=initial(grammars); + for(int64_t token:tokens) { + int64_t index=next_component(grammars,states,time_major); + if(!advance(grammars,offsets,states,index,token))throw std::invalid_argument("invalid routed token prefix"); + } + for(size_t i=0;icovered(states[i])(grammars.size())) { + int64_t dimension=grammars[index]->next_dimension(states[index]); + if(dimension<0 || dimension>=static_cast(zero_atoms[index].size())) + throw std::invalid_argument("missing zero-motion primitive atom"); + const int64_t token=offsets[index]+zero_atoms[index][dimension]; + if(!advance(grammars,offsets,states,index,token))throw std::invalid_argument("invalid zero-motion suffix"); + tokens.push_back(token); + } + return tokens; } +} // namespace void register_grammar(py::module_& module) { - py::class_>(module, "CoverageGrammar") - .def("advance", [](const CoverageGrammar& grammar, const State& state, int64_t token) -> py::object { - State next = grammar.advance(state, token); - if (next.empty()) return py::none(); - py::tuple result(next.size()); - for (size_t i = 0; i < next.size(); ++i) result[i] = next[i]; - return result; + py::class_>(module,"CoverageGrammar") + .def("advance",[](const Grammar& g,const State& s,int64_t token)->py::object { + State next=g.advance(s,token);return next.empty()?py::object(py::none()):py::object(state_tuple(next)); }) - .def("mask", &CoverageGrammar::mask); - py::class_>(module, "SetGrammar") - .def(py::init, - std::vector>>>()); - py::class_>(module, "PlainGrammar") - .def(py::init, - const py::array_t&>()); + .def("mask",&Grammar::mask).def("covered",&Grammar::covered).def("clone",&Grammar::clone); + py::class_>(module,"SetGrammar") + .def(py::init,std::vector>>>()); + py::class_>(module,"PlainGrammar") + .def(py::init,std::vector,py::array_t>()); + module.def("route_advance",&route_advance); + module.def("route_interleave",&interleave,py::call_guard()); + module.def("route_split",&split,py::call_guard()); + module.def("route_interleave_batch",&interleave_batch); + module.def("route_decode_batch",&decode_batch); + module.def("route_complete",&complete); } diff --git a/actioncodec2_kernels/inference.cpp b/actioncodec2_kernels/inference.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e360264321ed5c1e6636aed9e2b7036dffc7db1a --- /dev/null +++ b/actioncodec2_kernels/inference.cpp @@ -0,0 +1,245 @@ +// Lossless plain-BPE inference and additive physical reconstruction. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "parallel.hpp" +#include "quaternion.hpp" + +namespace py = pybind11; +namespace { +using I64 = py::array_t; +using F64 = py::array_t; +using F32 = py::array_t; + + + +F64 quaternion_map(const F64& values, const std::string& operation) { + const bool vector_in = operation == "from_rotvec" || operation == "from_euler"; + const int input_width=vector_in?3:4; + const bool vector_out=operation == "to_rotvec" || operation == "to_euler"; + const int width=vector_out?3:4; + if(values.ndim()!=2 || values.shape(1)!=input_width) + throw std::invalid_argument("invalid quaternion operation shape"); + F64 output({values.shape(0),static_cast(width)}); + py::gil_scoped_release release; + for(int64_t i=0;i(previous.data()[3*b+d])*scale.data()[d]; + auto increment=rotation_vector?ac2q::from_rotvec(boundary):ac2q::from_euler(boundary); + ac2q::Q state{0,0,0,1}; + float accumulated[3]={0,0,0}; + auto apply=[&](ac2q::Q a,ac2q::Q v){return left?ac2q::multiply(v,a):ac2q::multiply(a,v);}; + for(int64_t t=0;t=table.shape(1))throw std::invalid_argument("invalid primitive cell"); + v[d]=table.data()[d*table.shape(1)+cell]; + } + if(primitive_order==2) { + const double norm=std::sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); + const double factor=std::min(1.,radius/std::max(norm,std::numeric_limits::min())); + for(double& x:v)x*=factor; + increment=apply(increment,ac2q::from_rotvec(v)); + state=apply(state,increment); + auto q=input_order==1?increment:state; + if(rotation_vector)ac2q::to_rotvec(q,represented);else ac2q::to_euler(q,represented); + } else if(input_order==1) { + if(rotation_vector)std::copy(v,v+3,represented); + else {for(double& x:v)x=static_cast(x);ac2q::to_euler(ac2q::from_rotvec(v),represented);} + } else { + state=apply(state,ac2q::from_rotvec(v)); + if(rotation_vector)ac2q::to_rotvec(state,represented);else ac2q::to_euler(state,represented); + } + for(int d=0;d<3;++d) { + float value=static_cast(represented[d]/scale.data()[d]); + if(primitive_order==1 && input_order==1) { + const float next=accumulated[d]+value;value=next-accumulated[d];accumulated[d]=next; + } + output.mutable_data()[(b*steps+t)*3+d]=value; + } + } + }); + return output; +} + +F32 additive_reconstruct(const F64& table, const I64& cells, const F32& previous, + const F32& scale, int input_order, int primitive_order) { + if (cells.ndim() != 3 || table.ndim() != 2 || scale.ndim() != 1 || + cells.shape(2) != table.shape(0) || scale.size() != cells.shape(2) || + previous.ndim() != 2 || previous.shape(0) != cells.shape(0) || previous.shape(1) != cells.shape(2)) + throw std::invalid_argument("invalid additive reconstruction shapes"); + if (primitive_order != 2 || input_order < 0 || input_order > 2) + throw std::invalid_argument("invalid differential order"); + const int64_t batch = cells.shape(0), steps = cells.shape(1), width = cells.shape(2); + F32 output({batch, steps, width}); + py::gil_scoped_release release; + ac2::parallel_for(batch, 0, [&](int64_t b) { + for (int64_t d = 0; d < width; ++d) { + double change_sum = 0, position = 0; + const float boundary = previous.data()[b * width + d] * scale.data()[d]; + for (int64_t t = 0; t < steps; ++t) { + const int64_t index = (b * steps + t) * width + d, cell = cells.data()[index]; + if (cell < 0 || cell >= table.shape(1)) throw std::invalid_argument("invalid cell"); + const double primitive = table.data()[d * table.shape(1) + cell]; + change_sum += primitive; + const double velocity = change_sum + boundary; + position += velocity; + const double value = input_order == 2 ? primitive : input_order == 1 ? velocity : position; + output.mutable_data()[index] = static_cast(value / scale.data()[d]); + } + } + }); + return output; +} + +I64 choose_cells(const F32& table,const I64& bins,const F32& request, + const F32& direction,const F32& limits,bool smooth) { + if(table.ndim()!=2 || request.ndim()!=2 || direction.ndim()!=2 || + direction.shape(0)!=request.shape(0) || direction.shape(1)!=request.shape(1) || + table.shape(0)!=request.shape(1) || bins.size()!=request.shape(1) || limits.size()!=request.shape(1)) + throw std::invalid_argument("invalid primitive selection shapes"); + I64 output({request.shape(0),request.shape(1)}); + py::gil_scoped_release release; + const int64_t width=request.shape(1); + for(int64_t i=0;i::epsilon()) { + if(distance0?1.F:p<0?-1.F:0.F)*sign>=0 && distance=0?preferred:feasible>=0?feasible:nearest):nearest; + } + return output; +} + +F32 additive_decode(const F32& table,const I64& cells,const F32& scale, + const F32& lower,const F32& upper,int input_order,int primitive_order) { + if(cells.ndim()!=3 || table.ndim()!=2 || table.shape(0)!=cells.shape(2) || + scale.size()!=cells.shape(2) || lower.size()!=cells.shape(2) || upper.size()!=cells.shape(2) || + primitive_order<0 || primitive_order>1 || input_order<0 || input_order>2) + throw std::invalid_argument("invalid additive decoding metadata"); + const int64_t batch=cells.shape(0),steps=cells.shape(1),width=cells.shape(2); + F32 output({batch,steps,width}); + py::gil_scoped_release release; + ac2::parallel_for(batch,0,[&](int64_t b) { + for(int64_t d=0;d=table.shape(1))throw std::invalid_argument("invalid primitive cell"); + const float picked=table.data()[d*table.shape(1)+cell]; + position=primitive_order?std::clamp(position+picked,lower.data()[d],upper.data()[d]):picked; + output.mutable_data()[index]=position; + } + for(int order=0;order0;--t) + output.mutable_data()[(b*steps+t)*width+d]-=output.data()[(b*steps+t-1)*width+d]; + for(int64_t t=0;t& tokens,const I64& expansions, + const I64& supports,uint64_t full) { + if(expansions.ndim()!=2 || supports.ndim()!=1 || expansions.shape(0)!=supports.size()) + throw std::invalid_argument("invalid spatial metadata"); + const int64_t width=expansions.shape(1);I64 output(width); + std::fill(output.mutable_data(),output.mutable_data()+width,-1); + uint64_t covered=0; + py::gil_scoped_release release; + for(int64_t token:tokens) { + if(token<0 || token>=supports.size())throw std::invalid_argument("token is outside the vocabulary"); + const uint64_t support=supports.data()[token]; + if(covered & support)throw std::invalid_argument("token supports overlap"); + covered|=support; + for(int64_t d=0;d=0)output.mutable_data()[d]=value; + } + } + if(covered!=full)throw std::invalid_argument("token set does not exactly cover the requested active dimensions"); + return output; +} +F32 additive_transform(const F32& values,int order,bool integrate) { + if(values.ndim()!=3 || order<0 || order>2)throw std::invalid_argument("expected [B,T,D] and order 0..2"); + const int64_t batch=values.shape(0),steps=values.shape(1),width=values.shape(2); + F32 output({batch,steps,width});std::copy(values.data(),values.data()+values.size(),output.mutable_data()); + py::gil_scoped_release release; + for(int level=0;level0;--t)output.mutable_data()[(b*steps+t)*width+d]-=output.data()[(b*steps+t-1)*width+d]; + } + } + return output; +} +} // namespace + +void register_inference(py::module_& module) { + module.def("additive_reconstruct", &additive_reconstruct); + module.def("so3_reconstruct", &so3_reconstruct); + module.def("quaternion_map", &quaternion_map); + module.def("quaternion_multiply", &quaternion_multiply); + module.def("choose_cells", &choose_cells); + module.def("additive_decode", &additive_decode); + module.def("spatial_expand", &spatial_expand); + module.def("additive_transform", &additive_transform); +} diff --git a/actioncodec2_kernels/module.cpp b/actioncodec2_kernels/module.cpp index 2b6149f4714c7f3aaa61b53bef5f1afc8e4d7cac..f1076c7f54b5bd4fdbbe4b2deaf84a691ef40240 100644 --- a/actioncodec2_kernels/module.cpp +++ b/actioncodec2_kernels/module.cpp @@ -1,13 +1,25 @@ -#include +// pybind11 entry point for the ActionCodec2 native kernels. +// +// Every function here has an exactly equivalent Python implementation in the +// package. The native module is a pure accelerator: if it is not built, the +// package still works, and the test suite asserts the two agree bit for bit. + #include +#include +#include #include -#include - -#include "parallel.hpp" +#include namespace py = pybind11; +void register_resample(py::module_&); +void register_setbpe(py::module_&); +void register_inference(py::module_&); +void register_preprocessing(py::module_&); +void register_grammar(py::module_&); +void register_sparse(py::module_&); + py::array_t so3_second_order_encode_batch( const py::array_t&, const py::array_t&, @@ -22,6 +34,15 @@ py::array_t additive_second_order_encode_batch( const py::array_t&, const py::array_t&, bool, int); +py::tuple train_spatial_native(py::array_t, + py::array_t, + const std::vector&, int64_t, int); + +py::tuple train_temporal_native(py::iterable, int64_t, + py::array_t, + py::array_t, + int32_t, int32_t, int64_t, int64_t, int); + py::array_t physical_decode_batch( const py::array_t&, const py::array_t&, const py::array_t&, const py::array_t&, const py::array_t&, @@ -41,30 +62,24 @@ py::array_t so3_encode_batch( const py::array_t&, const py::array_t&, const py::array_t&, int32_t, bool, bool, - double, bool, int); + double, int32_t, int); -void register_setbpe(py::module_& module); -void register_resample(py::module_& module); -void register_reconstruction(py::module_& module); -void register_grammar(py::module_& module); +py::tuple train_bpe_native(py::iterable, const std::vector&, int64_t, int64_t, int); -PYBIND11_MODULE(_actioncodec2_native, module) { - module.doc() = "ActionCodec2 encode/decode kernels: physical stage, resampling, Set-BPE"; - register_setbpe(module); +py::tuple spatial_encode_instances( + const py::array_t&, + const py::array_t&, + const std::vector&, + const py::array_t&, int); + +PYBIND11_MODULE(_native, module) { register_resample(module); - register_reconstruction(module); + register_setbpe(module); + register_inference(module); + register_preprocessing(module); register_grammar(module); - module.def( - "set_thread_budget", - [](int threads) { - if (threads < 0) throw std::invalid_argument("thread budget must be non-negative"); - ac2::thread_budget().store(threads); - }, - py::arg("threads"), - "Cap threads per call for this process; 0 uses every CPU it may run on."); - module.def("thread_budget", [] { return ac2::thread_budget().load(); }); - module.def("plan_threads", &ac2::plan_threads, py::arg("count"), py::arg("requested"), - py::arg("seconds_each"), "Threads a call would use for ``count`` items."); + register_sparse(module); + module.doc() = "ActionCodec2 native kernels (Set-BPE training and batched physical stage)"; module.def("so3_second_order_encode_batch", &so3_second_order_encode_batch, py::arg("table"), py::arg("bins"), py::arg("quaternions"), py::arg("previous_first_order"), py::arg("input_order"), py::arg("left"), @@ -73,16 +88,39 @@ PYBIND11_MODULE(_actioncodec2_native, module) { py::arg("table"), py::arg("bins"), py::arg("positions"), py::arg("previous_first_order"), py::arg("epsilon"), py::arg("smooth"), py::arg("threads") = 0); + + module.def("train_spatial", &train_spatial_native, py::arg("codes"), py::arg("weights"), + py::arg("bins"), py::arg("vocab_size"), py::arg("threads") = 0, + "Exact greedy spatial Set-BPE; returns (merges, report)."); + + module.def("train_temporal", &train_temporal_native, py::arg("instance_tokens"), + py::arg("total_anchors"), py::arg("spatial_support"), + py::arg("spatial_anchor"), py::arg("dimension"), py::arg("lookahead"), + py::arg("vocab_size"), py::arg("action_count"), py::arg("threads") = 0, + "Exact greedy rooted temporal Set-BPE; returns (merges, report)."); + + module.def("train_bpe", &train_bpe_native, py::arg("cell_chunks"), py::arg("bins"), + py::arg("vocab_size"), py::arg("max_token_cells"), py::arg("threads") = 0, + "Exact greedy BPE over the row-major flattened cell stream; returns (merges, report)."); + module.def("physical_decode_batch", &physical_decode_batch, py::arg("table"), py::arg("bins"), py::arg("binary"), py::arg("lower"), py::arg("upper"), py::arg("cells"), py::arg("initial"), py::arg("initial_velocity"), py::arg("order"), py::arg("threads") = 0); + module.def("physical_encode_batch", &physical_encode_batch, py::arg("table"), py::arg("bins"), py::arg("binary"), py::arg("lower"), py::arg("upper"), py::arg("positions"), py::arg("initial"), py::arg("initial_velocity"), py::arg("order"), py::arg("threads") = 0, py::arg("epsilon") = py::array_t(), py::arg("smooth") = false); + module.def("so3_encode_batch", &so3_encode_batch, py::arg("table"), py::arg("bins"), py::arg("actions"), py::arg("input_order"), py::arg("rotation_vector"), - py::arg("left"), py::arg("limit"), py::arg("smooth"), py::arg("threads") = 0); + py::arg("left"), py::arg("limit"), py::arg("selection"), py::arg("threads") = 0, + "Batched exact SO(3) error-feedback encoding; selection 0 nearest, 1 smooth, " + "2 momentum_lazy."); + + module.def("spatial_encode_instances", &spatial_encode_instances, py::arg("codes"), + py::arg("row_anchors"), py::arg("bins"), py::arg("merges"), + py::arg("threads") = 0); } diff --git a/actioncodec2_kernels/parallel.hpp b/actioncodec2_kernels/parallel.hpp index 8d009d5beb6b3b8d6fec621242d13f110dcc5ed5..cdac5d7274a027b46ccd05d2d52ac2ff16f7b6e5 100644 --- a/actioncodec2_kernels/parallel.hpp +++ b/actioncodec2_kernels/parallel.hpp @@ -16,6 +16,7 @@ namespace ac2 { +// Process-wide cap on threads per call; 0 means every CPU the process may use. inline std::atomic& thread_budget() { static std::atomic value{0}; return value; @@ -32,8 +33,11 @@ inline int available_cpus() { return std::max(1, static_cast(std::thread::hardware_concurrency())); } +// Measured cost of starting and joining one thread (seconds). constexpr double kThreadStartSeconds = 30e-6; +// Threads for ``count`` iterations of ``seconds_each``: at most ``requested`` +// when positive, at most the process budget, and at most ``sqrt(W / s)``. inline int64_t plan_threads(int64_t count, int requested, double seconds_each) { const int budget = thread_budget().load(); int64_t threads = budget > 0 ? budget : available_cpus(); @@ -85,4 +89,4 @@ void parallel_for(int64_t count, int threads, Body&& body) { if (failure) std::rethrow_exception(failure); } -} +} // namespace ac2 diff --git a/actioncodec2_kernels/physical.cpp b/actioncodec2_kernels/physical.cpp index ae1385c2900e37578ff1fdb9ec7d9914ac754c44..e2d7296aa7951101b97de7f132892e6683c1995d 100644 --- a/actioncodec2_kernels/physical.cpp +++ b/actioncodec2_kernels/physical.cpp @@ -1,3 +1,4 @@ + #include #include #include @@ -6,7 +7,6 @@ #include #include #include -#include #include #include "parallel.hpp" @@ -33,7 +33,7 @@ inline int32_t pick_second_order_axis(const SecondOrderAxis& axis, double reques const int32_t right = std::min(insertion, axis.count - 1); int32_t nearest = std::fabs(request - values[left]) <= std::fabs(request - values[right]) ? left : right; - + // Rounded distance plateaus must keep the original first-cell tie-break. while (nearest > 0 && std::fabs(request - values[nearest - 1]) == std::fabs(request - values[nearest])) --nearest; if constexpr (!Smooth) return nearest; @@ -43,7 +43,7 @@ inline int32_t pick_second_order_axis(const SecondOrderAxis& axis, double reques const double sign = primitive > 0 ? 1 : primitive < 0 ? -1 : 0; return sign * direction >= 0 && std::fabs(request - primitive) <= epsilon ? preferred : nearest; } - + // Small tables are faster to scan; arbitrary stored order also uses this path. int32_t nearest = 0, feasible = -1, preferred = -1; double nearest_distance = INFINITY, feasible_distance = INFINITY, preferred_distance = INFINITY; for (int32_t k = 0; k < axis.count; ++k) { @@ -62,7 +62,7 @@ inline int32_t pick_second_order_axis(const SecondOrderAxis& axis, double reques return preferred >= 0 ? preferred : feasible >= 0 ? feasible : nearest; } -} +} // namespace py::array_t additive_second_order_encode_batch( const py::array_t& table, @@ -124,16 +124,17 @@ namespace { struct Layout { int32_t dimension; - int32_t width; - const float* table; - const int32_t* bins; - const uint8_t* binary; + int32_t width; // padded primitive-table stride + const float* table; // [dimension * width], +inf padding + const int32_t* bins; // [dimension] + const uint8_t* binary; // [dimension], 1 for absolute two-valued axes const float* lower; const float* upper; - const float* epsilon; - bool smooth; + const float* epsilon; // [dimension]; null unless `smooth` is set + bool smooth; // pick by FirstOrderCodec._select_smooth }; +// Matches PhysicalCodecBase.SOURCE_TOLERANCE. constexpr float kSourceTolerance = 8.0F * FLT_EPSILON; inline int32_t nearest(const Layout& layout, int32_t axis, float request) { @@ -175,7 +176,7 @@ inline int32_t select_smooth(const Layout& layout, int32_t axis, float request, feasible_distance = distance; feasible_index = index; } - + // np.sign(value) * direction >= 0: a zero primitive never reverses. const float sign = values[index] > 0.0F ? 1.0F : (values[index] < 0.0F ? -1.0F : 0.0F); if (!(sign * direction >= 0.0F)) continue; if (!any_preferred || distance < preferred_distance) { @@ -193,7 +194,7 @@ void encode_first_order(const Layout& layout, const float* positions, int64_t st const float* initial, int32_t* cells) { const int32_t dimension = layout.dimension; std::vector state(initial, initial + dimension); - + // Sign of the last non-zero primitive each coordinate emitted. std::vector direction(dimension, 0.0F); for (int64_t step = 0; step < steps; ++step) { const float* target = positions + step * dimension; @@ -297,47 +298,6 @@ Layout make_layout(const py::array_t& table, const py::array_t& const py::array_t& binary, const py::array_t& lower, const py::array_t& upper, const py::array_t& epsilon, bool smooth) { - if (table.ndim() != 2 || table.shape(0) < 1 || table.shape(1) < 1 || - table.shape(0) > std::numeric_limits::max() || - table.shape(1) > std::numeric_limits::max()) { - throw std::invalid_argument("table must have non-empty shape [D, K]"); - } - for (const py::array* array : {static_cast(&table), - static_cast(&bins), - static_cast(&binary), - static_cast(&lower), - static_cast(&upper), - static_cast(&epsilon)}) { - if (!(array->flags() & py::array::c_style)) { - throw std::invalid_argument("physical layout arrays must be C-contiguous"); - } - } - const auto dimension = table.shape(0); - if (bins.ndim() != 1 || binary.ndim() != 1 || lower.ndim() != 1 || upper.ndim() != 1 || - bins.size() != dimension || binary.size() != dimension || - lower.size() != dimension || upper.size() != dimension) { - throw std::invalid_argument("layout vectors must have shape [D]"); - } - if ((epsilon.size() && (epsilon.ndim() != 1 || epsilon.size() != dimension)) || - (smooth && !epsilon.size())) { - throw std::invalid_argument("smooth selection needs epsilon with shape [D]"); - } - for (py::ssize_t axis = 0; axis < dimension; ++axis) { - const int32_t count = bins.data()[axis]; - if (count < 1 || count > table.shape(1) || binary.data()[axis] > 1 || - !(lower.data()[axis] <= upper.data()[axis])) { - throw std::invalid_argument("invalid physical layout bounds or primitive count"); - } - if (epsilon.size() && - !(std::isfinite(epsilon.data()[axis]) && epsilon.data()[axis] >= 0)) { - throw std::invalid_argument("epsilon must be finite and non-negative"); - } - for (int32_t cell = 0; cell < count; ++cell) { - if (!std::isfinite(table.data()[axis * table.shape(1) + cell])) { - throw std::invalid_argument("active primitives must be finite"); - } - } - } Layout layout; layout.dimension = static_cast(table.shape(0)); layout.width = static_cast(table.shape(1)); @@ -348,6 +308,12 @@ Layout make_layout(const py::array_t& table, const py::array_t& layout.upper = upper.data(); layout.epsilon = epsilon.size() == 0 ? nullptr : epsilon.data(); layout.smooth = smooth && layout.epsilon != nullptr; + if (smooth && layout.epsilon == nullptr) { + throw std::invalid_argument("smooth selection needs a per-coordinate epsilon"); + } + if (layout.epsilon != nullptr && epsilon.size() != layout.dimension) { + throw std::invalid_argument("epsilon must have one entry per coordinate"); + } return layout; } @@ -355,7 +321,7 @@ using Array2D = py::array_t; using Array3D = py::array_t; using Cells3D = py::array_t; -} +} // namespace py::array_t physical_decode_batch(const py::array_t& table, const py::array_t& bins, @@ -365,29 +331,21 @@ py::array_t physical_decode_batch(const py::array_t& table, const Array2D& initial, const Array2D& initial_velocity, int32_t order, int threads) { - const Layout layout = - make_layout(table, bins, binary, lower, upper, py::array_t(), false); - if (cells.ndim() != 3 || cells.shape(1) < 1 || cells.shape(2) != layout.dimension || initial.ndim() != 2 || + if (cells.ndim() != 3 || cells.shape(2) != table.shape(0) || initial.ndim() != 2 || initial_velocity.ndim() != 2 || initial.shape(0) != cells.shape(0) || initial_velocity.shape(0) != cells.shape(0) || initial.shape(1) != cells.shape(2) || initial_velocity.shape(1) != cells.shape(2) || (order != 1 && order != 2)) { throw std::invalid_argument("invalid physical decode batch shapes or order"); } + const Layout layout = + make_layout(table, bins, binary, lower, upper, py::array_t(), false); const int64_t batch = cells.shape(0); const int64_t steps = cells.shape(1); const int64_t dimension = layout.dimension; - for (py::ssize_t index = 0; index < initial.size(); ++index) { - if (!std::isfinite(initial.data()[index]) || !std::isfinite(initial_velocity.data()[index])) { - throw std::invalid_argument("initial state and velocity must be finite"); - } - } - for (py::ssize_t index = 0; index < cells.size(); ++index) { - const int32_t cell = cells.data()[index]; - if (cell < 0 || cell >= layout.bins[index % dimension]) { - throw std::invalid_argument("cell index is outside its primitive table"); - } - } py::array_t positions({batch, steps, dimension}); +#ifndef _OPENMP + (void)threads; +#endif { py::gil_scoped_release release; ac2::parallel_for(batch, threads, [&](int64_t index) { @@ -404,6 +362,7 @@ py::array_t physical_decode_batch(const py::array_t& table, return positions; } +// One thread per chunk. ``positions`` is [B, T, D] and ``initial`` is [B, D]. py::array_t physical_encode_batch(const py::array_t& table, const py::array_t& bins, const py::array_t& binary, @@ -414,24 +373,6 @@ py::array_t physical_encode_batch(const py::array_t& table, int threads, const py::array_t& epsilon, bool smooth) { const Layout layout = make_layout(table, bins, binary, lower, upper, epsilon, smooth); - if (positions.ndim() != 3 || positions.shape(1) < 1 || - positions.shape(2) != layout.dimension || initial.ndim() != 2 || - initial_velocity.ndim() != 2 || initial.shape(0) != positions.shape(0) || - initial_velocity.shape(0) != positions.shape(0) || - initial.shape(1) != layout.dimension || initial_velocity.shape(1) != layout.dimension || - (order != 1 && order != 2)) { - throw std::invalid_argument("invalid physical encode batch shapes or order"); - } - for (py::ssize_t index = 0; index < positions.size(); ++index) { - if (!std::isfinite(positions.data()[index])) { - throw std::invalid_argument("positions must be finite"); - } - } - for (py::ssize_t index = 0; index < initial.size(); ++index) { - if (!std::isfinite(initial.data()[index]) || !std::isfinite(initial_velocity.data()[index])) { - throw std::invalid_argument("initial state and velocity must be finite"); - } - } const int64_t batch = positions.shape(0); const int64_t steps = positions.shape(1); const int64_t dimension = layout.dimension; @@ -440,6 +381,9 @@ py::array_t physical_encode_batch(const py::array_t& table, const float* starts = initial.data(); const float* velocities = initial_velocity.data(); int32_t* output = cells.mutable_data(); +#ifndef _OPENMP + (void)threads; +#endif { py::gil_scoped_release release; ac2::parallel_for(batch, threads, [&](int64_t index) { diff --git a/actioncodec2_kernels/preprocessing.cpp b/actioncodec2_kernels/preprocessing.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6dc8fce14945f6f3a23229a767f3f97c44eac36b --- /dev/null +++ b/actioncodec2_kernels/preprocessing.cpp @@ -0,0 +1,281 @@ +// Continuous-segment preprocessing kernels. Policy and statistics stay in Python. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "quaternion.hpp" + +namespace py = pybind11; +namespace { +using D64=py::array_t; +using F32=py::array_t; + +double step_norm(const double* a,const double* b,int64_t width,bool single) { + if(single) { + float sum=0; + for(int64_t d=0;d(b[d])-static_cast(a[d]);sum+=v*v;} + return std::sqrt(sum); + } + double sum=0; + for(int64_t d=0;d(0,values.shape(0)-1),width=values.shape(1); + D64 output(steps); + py::gil_scoped_release release; + for(int64_t t=0;t boundary_trim(const D64& values,double tau,int64_t idle, + int64_t context,bool legacy,bool single) { + if(values.ndim()!=2 || context<1)throw std::invalid_argument("invalid trimming input"); + int64_t length=values.shape(0),width=values.shape(1); + if(length<2)return {0,length}; + py::gil_scoped_release release; + int64_t first=-1,last=-1; + for(int64_t t=0;ttau) { + if(first<0)first=t; + last=t; + } + } + if(first<0)return legacy?std::make_pair(length,length):std::make_pair(int64_t{0},length); + const int64_t trailing=length-2-last; + int64_t start=first>=idle?(legacy?first+1:std::max(0,first-context+1)):0; + int64_t stop=trailing>=idle?last+2:length; + return {start,legacy?std::max(start,stop):std::max(start+1,stop)}; +} + +py::dict trim_deviation(const D64& values,int64_t start,int64_t stop, + const std::string& profile,int64_t gripper) { + if(values.ndim()!=2 || start<0 || start>=stop || stop>values.shape(0)) + throw std::invalid_argument("trim slice must retain at least one row"); + const int64_t width=values.shape(1),length=values.shape(0); + std::vector motion; + for(int64_t d=0;d maximum(motion.size(),0); + double translation=0,rotation=0;bool changed=false; + { + py::gil_scoped_release release; + for(int side=0;side<2;++side) { + int64_t begin=side?stop:0,end=side?length:start,anchor=side?stop-1:start; + const double* a=values.data()+anchor*width; + for(int64_t t=begin;t=0)changed=changed || v[gripper]!=a[gripper]; + if(profile=="eef") { + double distance=0,ra[3],rv[3],relative[3]; + for(int d=0;d<3;++d) { + double delta=v[motion[d]]-a[motion[d]];distance+=delta*delta; + ra[d]=a[motion[d+3]];rv[d]=v[motion[d+3]]; + } + translation=std::max(translation,std::sqrt(distance)); + ac2q::to_rotvec(ac2q::multiply(ac2q::conjugate(ac2q::from_rotvec(ra)),ac2q::from_rotvec(rv)),relative); + rotation=std::max(rotation,std::sqrt(relative[0]*relative[0]+relative[1]*relative[1]+relative[2]*relative[2])); + } + } + } + } + py::dict result; + result["motion_max_error"]=maximum;result["translation_max_error_m"]=translation; + result["rotation_max_error_rad"]=rotation;result["gripper_changed"]=changed; + return result; +} + +// Small normalized Vandermonde least-squares systems, solved in extended precision. +std::vector polynomial_weights(int window,int degree) { + const int p=degree+1; + std::vector basis(window*p),matrix(p*2*p,0); + for(int i=0;istd::abs(matrix[pivot*2*p+a]))pivot=b; + if(std::abs(matrix[pivot*2*p+a])<1e-25L)throw std::invalid_argument("singular polynomial fit"); + for(int j=0;j<2*p;++j)std::swap(matrix[a*2*p+j],matrix[pivot*2*p+j]); + long double scale=matrix[a*2*p+a]; + for(int j=0;j<2*p;++j)matrix[a*2*p+j]/=scale; + for(int b=0;b weights(window*window); + for(int target=0;target(w); + } + return weights; +} + +F32 savgol(const D64& values,int window,int degree) { + if(values.ndim()!=2 || window<3 || window%2!=1 || degree<0 || degree>=window || window>values.shape(0)) + throw std::invalid_argument("invalid Savitzky-Golay shape or polynomial order"); + std::vector weights; + { + static std::mutex mutex; + static std::map,std::vector> cache; + std::lock_guard lock(mutex); + auto key=std::make_pair(window,degree);auto it=cache.find(key); + if(it==cache.end())it=cache.emplace(key,polynomial_weights(window,degree)).first; + weights=it->second; + } + const int64_t length=values.shape(0),width=values.shape(1); + F32 output({length,width}); + py::gil_scoped_release release; + for(int64_t t=0;t(t-window/2,0,length-window),target=t-begin; + for(int64_t d=0;d(value); + } + } + return output; +} + +D64 median(const D64& values,int window,bool nearest) { + if(values.ndim()!=1 || window<1 || window%2!=1)throw std::invalid_argument("invalid median filter input"); + const int64_t length=values.size();D64 output(length); + py::gil_scoped_release release; + std::vector sample(window); + for(int64_t i=0;i=length)?(nearest?values.data()[std::clamp(k,0,length-1)]:0):values.data()[k]; + } + std::nth_element(sample.begin(),sample.begin()+window/2,sample.end()); + output.mutable_data()[i]=sample[window/2]; + } + return output; +} + +F32 ease(const D64& values,const D64& limits) { + if(values.ndim()!=2 || limits.ndim()!=1 || limits.size()!=values.shape(1)) + throw std::invalid_argument("invalid easing shape"); + int64_t length=values.shape(0),width=values.shape(1);F32 output({length,width}); + py::gil_scoped_release release; + for(int64_t d=0;d(values.data()[d]); + for(int64_t t=1;t0?1:-1)*limit;debt=candidate-step;} + sum+=step;output.mutable_data()[t*width+d]=static_cast(values.data()[d]+sum); + } + } + return output; +} + +F32 gripper(const D64& values,const std::string& operation,double first,double second) { + if(values.ndim()!=2 || values.shape(1)!=1)throw std::invalid_argument("gripper action must be [T,1]"); + F32 output({values.shape(0),int64_t{1}}); + py::gil_scoped_release release; + for(int64_t i=0;i(values.data()[i]); + if(!std::isfinite(v))throw std::invalid_argument("gripper fraction must be finite"); + if(operation=="normalize") { + const float span=static_cast(second-first); + output.mutable_data()[i]=std::clamp((v-static_cast(first))/span,0.F,1.F); + } else if(operation=="binary")output.mutable_data()[i]=v>=static_cast(first)?1.F:0.F; + else if(operation=="eleven")output.mutable_data()[i]=std::nearbyint(v*10.F)/10.F; + else throw std::invalid_argument("invalid gripper operation"); + } + return output; +} +std::vector max_change(const D64& values,const D64& reference, + const std::vector& columns,bool single) { + if(values.ndim()!=2 || reference.ndim()!=2 || values.shape(0)!=reference.shape(0) || values.shape(1)!=reference.shape(1)) + throw std::invalid_argument("mismatched change metric shapes"); + std::vector result(columns.size(),0);const int64_t width=values.shape(1); + py::gil_scoped_release release; + for(size_t i=0;i(values.data()[t*width+d])-static_cast(reference.data()[t*width+d])) + :std::abs(values.data()[t*width+d]-reference.data()[t*width+d]); + result[i]=std::max(result[i],change); + } + } + return result; +} + +int64_t overspeed_steps(const D64& values,const D64& limits,bool single) { + if(values.ndim()!=2 || limits.size()!=values.shape(1))throw std::invalid_argument("invalid overspeed metric shapes"); + int64_t count=0,width=values.shape(1);py::gil_scoped_release release; + for(int64_t t=1;t(values.data()[t*width+d])-static_cast(values.data()[(t-1)*width+d]) + :values.data()[t*width+d]-values.data()[(t-1)*width+d]; + if(std::abs(delta)>limits.data()[d]){++count;break;} + } + return count; +} + +F32 wrap_angles(const D64& values) { + std::vector shape(values.shape(),values.shape()+values.ndim());F32 output(shape); + const double pi=std::acos(-1.);py::gil_scoped_release release; + for(py::ssize_t i=0;i(pi-remainder); + } + return output; +} + +template +void unwrap_column(const double* values,double* output,int64_t length,int64_t width,int64_t d) { + if(!length)return; + const T pi=static_cast(std::acos(-1.)),period=static_cast(2*std::acos(-1.)); + T sum=0;output[d]=values[d]; + for(int64_t t=1;t(values[t*width+d])-static_cast(values[(t-1)*width+d]); + T reduced=std::fmod(static_cast(delta+pi),period);if(reduced<0)reduced+=period; + reduced-=pi;if(reduced==-pi && delta>0)reduced=pi; + const T correction=std::abs(delta)(static_cast(values[t*width+d])+sum); + } +} +D64 unwrap_angles(const D64& values,bool single) { + if(values.ndim()!=2)throw std::invalid_argument("unwrap expects [T,D]"); + int64_t length=values.shape(0),width=values.shape(1);D64 output({length,width}); + py::gil_scoped_release release; + for(int64_t d=0;d(values.data(),output.mutable_data(),length,width,d); + else unwrap_column(values.data(),output.mutable_data(),length,width,d); + } + return output; +} +} // namespace + +void register_preprocessing(py::module_& module) { + module.def("step_norms",&step_norms); + module.def("boundary_trim",&boundary_trim); + module.def("trim_deviation",&trim_deviation); + module.def("savgol_smooth",&savgol); + module.def("median_filter",&median); + module.def("ease_overspeed",&ease); + module.def("gripper_transform",&gripper); + module.def("max_change",&max_change); + module.def("overspeed_steps",&overspeed_steps); + module.def("wrap_angles",&wrap_angles); + module.def("unwrap_angles",&unwrap_angles); +} diff --git a/actioncodec2_kernels/quaternion.hpp b/actioncodec2_kernels/quaternion.hpp index d72ebb33a8800ea9cc7238c40595391a52c65bfd..b580c70c37aa4b4a3a54f1c87733871448bfb438 100644 --- a/actioncodec2_kernels/quaternion.hpp +++ b/actioncodec2_kernels/quaternion.hpp @@ -43,4 +43,4 @@ inline void to_euler(Q q, double* out) { out[1]=std::asin(std::clamp(2*(w*y-z*x),-1.,1.)); out[2]=std::atan2(2*(w*z+x*y),1-2*(y*y+z*z)); } -} +} // namespace ac2q diff --git a/actioncodec2_kernels/reconstruct.cpp b/actioncodec2_kernels/reconstruct.cpp deleted file mode 100644 index e6617bd2377c83155075a8816b9d59b83579bb29..0000000000000000000000000000000000000000 --- a/actioncodec2_kernels/reconstruct.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include - -#include "parallel.hpp" -#include "quaternion.hpp" - -namespace py = pybind11; -namespace { -using I64 = py::array_t; -using I32 = py::array_t; -using F64 = py::array_t; -using F32 = py::array_t; - -void validate_reconstruction(const F64& table, const I32& bins, const I64& cells, - const F32& previous, const F32& scale) { - if (table.ndim() != 2 || table.shape(0) < 1 || table.shape(1) < 1 || - bins.ndim() != 1 || bins.size() != table.shape(0) || - cells.ndim() != 3 || cells.shape(0) < 1 || cells.shape(1) < 1 || - cells.shape(2) != table.shape(0) || previous.ndim() != 2 || - previous.shape(0) != cells.shape(0) || previous.shape(1) != cells.shape(2) || - scale.ndim() != 1 || scale.size() != cells.shape(2)) { - throw std::invalid_argument("invalid reconstruction shapes"); - } - for (py::ssize_t d = 0; d < bins.size(); ++d) { - if (bins.data()[d] < 1 || bins.data()[d] > table.shape(1)) - throw std::invalid_argument("primitive count exceeds table width"); - if (!std::isfinite(scale.data()[d]) || scale.data()[d] <= 0) - throw std::invalid_argument("scale must be positive and finite"); - for (int32_t k = 0; k < bins.data()[d]; ++k) { - if (!std::isfinite(table.data()[d * table.shape(1) + k])) - throw std::invalid_argument("active primitives must be finite"); - } - } - for (py::ssize_t i = 0; i < previous.size(); ++i) { - if (!std::isfinite(previous.data()[i])) - throw std::invalid_argument("previous first-order values must be finite"); - } - for (py::ssize_t i = 0; i < cells.size(); ++i) { - if (cells.data()[i] < 0 || cells.data()[i] >= bins.data()[i % bins.size()]) - throw std::invalid_argument("cell index is outside its primitive table"); - } -} - -F32 so3_reconstruct(const F64& table, const I32& bins, const I64& cells, - const F32& previous, const F32& scale, int input_order, - int primitive_order, bool left, bool rotation_vector, double radius) { - validate_reconstruction(table, bins, cells, previous, scale); - if (table.shape(0) != 3 || (input_order != 0 && input_order != 1) || - (primitive_order != 1 && primitive_order != 2) || - std::isnan(radius) || radius <= 0) - throw std::invalid_argument("invalid SO(3) reconstruction order or radius"); - const int64_t batch = cells.shape(0), steps = cells.shape(1); - F32 output({batch, steps, int64_t{3}}); - auto* target = output.mutable_data(); - py::gil_scoped_release release; - ac2::parallel_for(batch, 0, [&](int64_t b) { - double boundary[3]; - for (int d = 0; d < 3; ++d) - boundary[d] = static_cast(previous.data()[3 * b + d]) * scale.data()[d]; - auto increment = rotation_vector ? ac2q::from_rotvec(boundary) : ac2q::from_euler(boundary); - ac2q::Q state{0, 0, 0, 1}; - float accumulated[3] = {0, 0, 0}; - auto apply = [&](ac2q::Q a, ac2q::Q v) { - return left ? ac2q::multiply(v, a) : ac2q::multiply(a, v); - }; - for (int64_t t = 0; t < steps; ++t) { - double v[3], represented[3]; - for (int d = 0; d < 3; ++d) - v[d] = table.data()[d * table.shape(1) + cells.data()[(b * steps + t) * 3 + d]]; - if (primitive_order == 2) { - const double norm = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); - const double factor = std::min(1., radius / std::max(norm, std::numeric_limits::min())); - for (double& x : v) x *= factor; - increment = apply(increment, ac2q::from_rotvec(v)); - state = apply(state, increment); - auto q = input_order == 1 ? increment : state; - if (rotation_vector) ac2q::to_rotvec(q, represented); - else ac2q::to_euler(q, represented); - } else if (input_order == 1) { - if (rotation_vector) std::copy(v, v + 3, represented); - else { - for (double& x : v) x = static_cast(x); - ac2q::to_euler(ac2q::from_rotvec(v), represented); - } - } else { - state = apply(state, ac2q::from_rotvec(v)); - if (rotation_vector) ac2q::to_rotvec(state, represented); - else ac2q::to_euler(state, represented); - } - for (int d = 0; d < 3; ++d) { - float value = static_cast(represented[d] / scale.data()[d]); - if (primitive_order == 1 && input_order == 1) { - const float next = accumulated[d] + value; - value = next - accumulated[d]; - accumulated[d] = next; - } - target[(b * steps + t) * 3 + d] = value; - } - } - }); - return output; -} - -F32 additive_reconstruct(const F64& table, const I32& bins, const I64& cells, - const F32& previous, const F32& scale, int input_order) { - validate_reconstruction(table, bins, cells, previous, scale); - if (input_order < 0 || input_order > 2) - throw std::invalid_argument("invalid additive reconstruction order"); - const int64_t batch = cells.shape(0), steps = cells.shape(1), width = cells.shape(2); - F32 output({batch, steps, width}); - auto* target = output.mutable_data(); - py::gil_scoped_release release; - ac2::parallel_for(batch, 0, [&](int64_t b) { - for (int64_t d = 0; d < width; ++d) { - double change_sum = 0, position = 0; - const float boundary = previous.data()[b * width + d] * scale.data()[d]; - for (int64_t t = 0; t < steps; ++t) { - const int64_t index = (b * steps + t) * width + d; - const double primitive = table.data()[d * table.shape(1) + cells.data()[index]]; - change_sum += primitive; - const double velocity = change_sum + boundary; - position += velocity; - const double value = input_order == 2 ? primitive : input_order == 1 ? velocity : position; - target[index] = static_cast(value / scale.data()[d]); - } - } - }); - return output; -} -} - -void register_reconstruction(py::module_& module) { - module.def("so3_reconstruct", &so3_reconstruct, py::arg("table"), py::arg("bins"), - py::arg("cells"), py::arg("previous_first_order"), py::arg("scale"), - py::arg("input_order"), py::arg("primitive_order"), py::arg("left"), - py::arg("rotation_vector"), py::arg("radius")); - module.def("additive_reconstruct", &additive_reconstruct, py::arg("table"), py::arg("bins"), - py::arg("cells"), py::arg("previous_first_order"), py::arg("scale"), - py::arg("input_order")); -} diff --git a/actioncodec2_kernels/repacking.hpp b/actioncodec2_kernels/repacking.hpp new file mode 100644 index 0000000000000000000000000000000000000000..61ea8f09cd4d5de508ff3846f50af367127c6819 --- /dev/null +++ b/actioncodec2_kernels/repacking.hpp @@ -0,0 +1,437 @@ +// Optional lossless fixed-vocabulary packing for the native Set-BPE encoder. +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ac2pack { +using Instance = std::tuple; +using Cover = std::array; + +struct CoverHash { + size_t operator()(const Cover& value) const { + size_t hash = 0; + for (uint64_t word : value) hash ^= std::hash{}(word) + + 0x9e3779b97f4a7c15ULL + (hash << 6) + (hash >> 2); + return hash; + } +}; + +struct Placement { + Cover cells{}; + int64_t token; + int anchor, count; +}; + +struct Requirement { int offset; uint64_t mask, key; }; +using MatchCache = std::array>, 8>; + +inline int first_free(const Cover& cover) { + for (int word = 0; word < 4; ++word) + if (~cover[word]) return word * 64 + __builtin_ctzll(~cover[word]); + return 256; +} + +inline int free_count(const Cover& cover) { + int count = 0; + for (uint64_t word : cover) count += __builtin_popcountll(~word); + return count; +} + +inline bool overlaps(const Cover& a, const Cover& b) { + for (int word = 0; word < 4; ++word) if (a[word] & b[word]) return true; + return false; +} + +inline Cover unite(Cover a, const Cover& b) { + for (int word = 0; word < 4; ++word) a[word] |= b[word]; + return a; +} + +class Search { + public: + Search(const std::vector& bins, const std::vector& support, + const std::vector& expansion, + const std::vector>>& patterns, + const std::vector& roots) + : bins_(bins), width_(bins.size()), spatial_size_(support.size()), + support_(support), patterns_(patterns) { + if (width_ > 8) throw std::invalid_argument("packing search supports at most eight slots"); + for (int64_t count : bins) + if (count > 255) throw std::invalid_argument("packing search supports at most 255 bins per slot"); + keys_.resize(spatial_size_); + anchors_.resize(patterns.size()); + spans_.resize(patterns.size(), 1); + counts_.resize(patterns.size()); + for (int64_t id = 0; id < spatial_size_; ++id) { + for (int d = 0; d < width_; ++d) { + const int64_t value = expansion[id * width_ + d]; + if (value >= 0) keys_[id] |= uint64_t(value + 1) << (8 * d); + } + lookup_.emplace(keys_[id], id); + } + temporal_by_root_.resize(spatial_size_); + for (size_t id = 0; id < patterns.size(); ++id) { + anchors_[id] = __builtin_ctzll(support[roots[id]]); + int count = 0; + for (auto [time, sid] : patterns[id]) { + count += __builtin_popcountll(support[sid]); + spans_[id] = std::max(spans_[id], int(time + 1)); + } + max_cells_ = std::max(max_cells_, count); + counts_[id] = count; + if (id >= static_cast(spatial_size_)) + temporal_by_root_[lookup_.at(keys_[roots[id]])].push_back(id); + } + byte_masks_.resize(1 << width_); + for (int mask = 1; mask < (1 << width_); ++mask) { + const int d = __builtin_ctz(mask); + byte_masks_[mask] = byte_masks_[mask ^ (1 << d)] | (uint64_t{255} << (8 * d)); + } + prepare_spatial_trie(); + prepare_patterns(); + } + + std::vector apply(const int64_t* cells, int64_t steps, + const std::vector& original, bool spatial, bool temporal, int window, int beam) const { + if (!temporal) return spatial ? repack(cells, steps, original) : original; + auto result = local_repack(cells, steps, original, window, beam); + return spatial ? repack(cells, steps, result) : result; + } + + private: + struct TrieNode { std::vector children; int64_t token = -1; }; + + int32_t trie_node(int dimension) { + const auto index = static_cast(trie_.size()); + trie_.emplace_back(); + if (dimension < width_) trie_.back().children.assign(bins_[dimension] + 1, -1); + return index; + } + + void prepare_spatial_trie() { + for (int d = 0; d < width_; ++d) trie_roots_[d].assign(bins_[d] + 1, -1); + for (int64_t sid = 0; sid < spatial_size_; ++sid) { + if (lookup_.at(keys_[sid]) != sid) continue; + const int root = anchors_[sid], value = (keys_[sid] >> (8 * root)) & 255; + int32_t node = trie_roots_[root][value]; + if (node < 0) { + node = trie_node(root + 1); + trie_roots_[root][value] = node; + } + for (int d = root + 1; d < width_; ++d) { + const int cell = (keys_[sid] >> (8 * d)) & 255; + int32_t child = trie_[node].children[cell]; + if (child < 0) { + child = trie_node(d + 1); + trie_[node].children[cell] = child; + } + node = child; + } + trie_[node].token = sid; + } + } + + void query_spatial_trie(int32_t node, int dimension, uint64_t row, + std::vector& result) const { + if (node < 0) return; + if (dimension == width_) { result.push_back(trie_[node].token); return; } + query_spatial_trie(trie_[node].children[0], dimension + 1, row, result); + const int value = (row >> (8 * dimension)) & 255; + if (value) query_spatial_trie(trie_[node].children[value], dimension + 1, row, result); + } + + void prepare_patterns() { + relative_.resize(patterns_.size()); + requirements_.resize(patterns_.size()); + for (size_t token = 0; token < patterns_.size(); ++token) { + if (spans_[token] * width_ > 256) continue; + std::vector rows(spans_[token], Requirement{0, 0, 0}); + for (auto [offset, sid] : patterns_[token]) { + rows[offset].offset = offset; + rows[offset].mask |= byte_masks_[support_[sid]]; + rows[offset].key |= keys_[sid]; + uint64_t support = support_[sid]; + while (support) { + const int d = __builtin_ctzll(support); support &= support - 1; + const int bit = offset * width_ + d; + relative_[token][bit / 64] |= uint64_t{1} << (bit % 64); + } + } + for (const auto& row : rows) if (row.mask) requirements_[token].push_back(row); + } + } + + uint64_t row_key(const int64_t* row) const { + uint64_t key = 0; + for (int d = 0; d < width_; ++d) + if (row[d] >= 0) key |= uint64_t(row[d] + 1) << (8 * d); + return key; + } + + std::vector matching_spatial(uint64_t row, int dim) const { + std::vector result; + const int value = (row >> (8 * dim)) & 255; + if (value) query_spatial_trie(trie_roots_[dim][value], dim + 1, row, result); + return result; + } + + bool placement(int64_t token, int anchor, const std::vector& rows, + const Cover& fixed, Placement& out) const { + if (anchor + spans_[token] > static_cast(rows.size())) return false; + for (const auto& req : requirements_[token]) + if ((rows[anchor + req.offset] & req.mask) != req.key) return false; + out = Placement{}; out.token = token; out.anchor = anchor; out.count = counts_[token]; + const int start = anchor * width_, word = start / 64, shift = start % 64; + const int words = (spans_[token] * width_ + 63) / 64; + for (int i = 0; i < words && word + i < 4; ++i) { + out.cells[word + i] |= relative_[token][i] << shift; + if (shift && word + i + 1 < 4) + out.cells[word + i + 1] |= relative_[token][i] >> (64 - shift); + } + return !overlaps(out.cells, fixed); + } + + std::vector candidates( + int root, const std::vector& rows, const Cover& fixed, + MatchCache& cache) const { + std::vector result; + const int time = root / width_, dim = root % width_; + auto& table = cache[dim]; + auto found = table.find(rows[time]); + if (found == table.end()) + found = table.emplace(rows[time], matching_spatial(rows[time], dim)).first; + for (int64_t sid : found->second) { + Placement offer; + if (placement(sid, time, rows, fixed, offer)) result.push_back(offer); + for (int64_t token : temporal_by_root_[sid]) + if (placement(token, time, rows, fixed, offer)) result.push_back(offer); + } + std::sort(result.begin(), result.end(), [](const Placement& a, const Placement& b) { + return std::make_pair(-a.count, a.token) < std::make_pair(-b.count, b.token); + }); + return result; + } + + using Options = std::function&(int)>; + + std::vector greedy_cover(const Options& options, Cover occupied, int bound) const { + std::vector result; + while (first_free(occupied) != 256 && static_cast(result.size()) + 1 < bound) { + const auto& offers = options(first_free(occupied)); + auto choice = std::find_if(offers.begin(), offers.end(), [&](const Placement& offer) { + return !overlaps(occupied, offer.cells); + }); + if (choice == offers.end()) return {}; + result.emplace_back(choice->anchor, anchors_[choice->token], choice->token); + occupied = unite(occupied, choice->cells); + } + return first_free(occupied) == 256 ? result : std::vector{}; + } + + std::vector beam_cover(const Options& options, + const Cover& fixed, int bound, int beam) const { + if (beam == 1) return greedy_cover(options, fixed, bound); + struct Node { Cover covered; int parent; int64_t token; int anchor, remaining, root; }; + std::vector arena{{fixed, -1, -1, -1, free_count(fixed), first_free(fixed)}}; + arena.reserve(beam * bound + 1); + std::vector frontier{0}; + frontier.reserve(beam); + std::array next; + auto better = [](const Node& a, const Node& b) { + if (a.remaining != b.remaining) return a.remaining < b.remaining; + return a.root != b.root ? a.root > b.root : a.covered < b.covered; + }; + for (int depth = 0; depth + 1 < bound && !frontier.empty(); ++depth) { + int keep = 0; + for (int index : frontier) { + for (const auto& offer : options(arena[index].root)) { + if (overlaps(arena[index].covered, offer.cells)) continue; + Cover covered = unite(arena[index].covered, offer.cells); + const int remaining = arena[index].remaining - offer.count; + if (!remaining) { + std::vector result{{offer.anchor, anchors_[offer.token], offer.token}}; + for (int p = index; arena[p].parent >= 0; p = arena[p].parent) + result.emplace_back(arena[p].anchor, anchors_[arena[p].token], arena[p].token); + std::reverse(result.begin(), result.end()); + return result; + } + if (keep == beam && remaining > next[keep - 1].remaining) continue; + Node node{covered, index, offer.token, offer.anchor, remaining, first_free(covered)}; + if (keep == beam && !better(node, next[keep - 1])) continue; + bool duplicate = false; + for (int i = 0; i < keep; ++i) if (covered == next[i].covered) { duplicate = true; break; } + if (duplicate) continue; + int position = keep < beam ? keep++ : keep - 1; + while (position && better(node, next[position - 1])) { + next[position] = next[position - 1]; --position; + } + next[position] = node; + } + } + frontier.clear(); + for (int i = 0; i < keep; ++i) { + frontier.push_back(arena.size()); + arena.push_back(std::move(next[i])); + } + } + return {}; + } + + std::vector local_repack(const int64_t* cells, int64_t steps, + const std::vector& stream, int window, int beam) const { + uint64_t full = 0; + for (int d = 0; d < width_; ++d) if (cells[d] >= 0) full |= uint64_t{1} << d; + std::vector coverage(steps, 0), fixed(steps, 0); + std::vector> blocks((steps + window - 1) / window); + std::vector result; + int64_t front = 0; + for (int64_t token : stream) { + while (front < steps && coverage[front] == full) ++front; + const bool crossing = front / window != (front + spans_[token] - 1) / window; + Instance instance{front, anchors_[token], token}; + if (crossing) result.push_back(instance); + else blocks[front / window].push_back(instance); + for (auto [offset, sid] : patterns_[token]) { + coverage[front + offset] |= support_[sid]; + if (crossing) fixed[front + offset] |= support_[sid]; + } + } + MatchCache cache; + for (size_t block = 0; block < blocks.size(); ++block) { + const int start = block * window, length = std::min(window, steps - start); + Cover occupied; occupied.fill(~uint64_t{0}); + std::vector rows(length); + for (int t = 0; t < length; ++t) { + rows[t] = row_key(cells + (start + t) * width_); + for (int d = 0; d < width_; ++d) { + const int bit = t * width_ + d; + if ((full & (uint64_t{1} << d)) && !(fixed[start + t] & (uint64_t{1} << d))) + occupied[bit / 64] &= ~(uint64_t{1} << (bit % 64)); + } + } + std::vector improved; + const int bound = blocks[block].size(); + if ((free_count(occupied) + max_cells_ - 1) / max_cells_ < bound) { + std::vector> options(length * width_); + std::vector ready(length * width_, 0); + auto get_options = [&](int root) -> const std::vector& { + if (!ready[root]) { + options[root] = candidates(root, rows, occupied, cache); + ready[root] = 1; + } + return options[root]; + }; + improved = beam_cover(get_options, occupied, bound, beam); + } + if (improved.empty()) result.insert(result.end(), blocks[block].begin(), blocks[block].end()); + else for (auto [time, root, token] : improved) result.emplace_back(start + time, root, token); + for (auto& table : cache) if (table.size() > 4096) table.clear(); + } + std::sort(result.begin(), result.end()); + std::vector tokens; + for (auto [time, root, token] : result) tokens.push_back(token); + if (tokens.size() > stream.size()) throw std::runtime_error("local packing regressed"); + return tokens; + } + + std::vector optimal(uint64_t row, int mask, + const std::vector& incumbent) const { + if (incumbent.size() < 2) return incumbent; + std::array matched; + matched.fill(-2); + auto match = [&](int subset) { + int64_t& token = matched[subset]; + if (token == -2) { + const auto found = lookup_.find(row & byte_masks_[subset]); + token = found == lookup_.end() ? -1 : found->second; + } + return token; + }; + if (int64_t token = match(mask); token >= 0) return {token}; + if (incumbent.size() == 2) return incumbent; + const int bit = mask & -mask; + for (int sub = (mask - 1) & mask; sub; sub = (sub - 1) & mask) { + if (!(sub & bit)) continue; + const int64_t left = match(sub), right = match(mask ^ sub); + if (left >= 0 && right >= 0) return {left, right}; + } + if (incumbent.size() == 3) return incumbent; + std::array costs, choices; + costs.fill(99); choices.fill(0); costs[0] = 0; + std::function solve = [&](int remaining) { + if (costs[remaining] != 99) return costs[remaining]; + int best = 98; + const int first = remaining & -remaining; + for (int sub = remaining; sub; sub = (sub - 1) & remaining) { + if (!(sub & first) || match(sub) < 0) continue; + const int cost = 1 + solve(remaining ^ sub); + if (cost < best) { best = cost; choices[remaining] = sub; } + } + return costs[remaining] = best; + }; + if (solve(mask) >= static_cast(incumbent.size())) return incumbent; + std::vector result; + for (int remaining = mask; remaining; remaining ^= choices[remaining]) + result.push_back(match(choices[remaining])); + return result; + } + + std::vector repack(const int64_t* cells, int64_t steps, + const std::vector& stream) const { + uint64_t full = 0; + for (int d = 0; d < width_; ++d) if (cells[d] >= 0) full |= uint64_t{1} << d; + std::vector covered(steps, 0), fixed(steps, 0); + std::vector> old_spatial(steps), temporal(steps); + int64_t front = 0; + for (int64_t token : stream) { + while (front < steps && covered[front] == full) ++front; + if (front == steps || token < 0 || token >= static_cast(patterns_.size()) || + anchors_[token] != __builtin_ctzll(full & ~covered[front])) + throw std::invalid_argument("invalid original token stream"); + const bool frozen = token >= spatial_size_; + (frozen ? temporal[front] : old_spatial[front]).push_back(token); + for (auto [offset, id] : patterns_[token]) { + if (front + offset >= steps || (covered[front + offset] & support_[id])) + throw std::invalid_argument("invalid original token coverage"); + covered[front + offset] |= support_[id]; + if (frozen) fixed[front + offset] |= support_[id]; + } + } + std::vector result; + result.reserve(stream.size()); + for (int64_t time = 0; time < steps; ++time) { + if (covered[time] != full) throw std::invalid_argument("incomplete original stream"); + auto tokens = optimal(row_key(cells + time * width_), full & ~fixed[time], old_spatial[time]); + tokens.insert(tokens.end(), temporal[time].begin(), temporal[time].end()); + std::sort(tokens.begin(), tokens.end(), [&](int64_t a, int64_t b) { + return std::make_pair(anchors_[a], a) < std::make_pair(anchors_[b], b); + }); + result.insert(result.end(), tokens.begin(), tokens.end()); + } + if (result.size() > stream.size()) throw std::runtime_error("packing regressed"); + return result; + } + + const std::vector& bins_; + int width_; + int64_t spatial_size_; + const std::vector& support_; + const std::vector>>& patterns_; + std::vector keys_, byte_masks_; + std::vector anchors_, spans_, counts_; + std::vector relative_; + std::vector> requirements_; + std::vector> temporal_by_root_; + std::vector trie_; + std::array, 8> trie_roots_; + int max_cells_ = 1; + std::unordered_map lookup_; +}; +} // namespace ac2pack diff --git a/actioncodec2_kernels/replay.cpp b/actioncodec2_kernels/replay.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a86616d17593aac52718984d1e9895c4a251a930 --- /dev/null +++ b/actioncodec2_kernels/replay.cpp @@ -0,0 +1,160 @@ +// Parallel replay of a learned Spatial Set-BPE vocabulary over action cells. + +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +namespace py = pybind11; + +namespace { + +struct Replay { + int32_t dimension; + int32_t vocab_size; + std::vector offsets; + std::vector rule; + std::vector anchor; + + int32_t child(int32_t left, int32_t right) const { + if (left > right) std::swap(left, right); + return rule[static_cast(left) * vocab_size + right]; + } + + std::vector encode(const int32_t* code) const { + std::vector active; + active.reserve(dimension); + for (int32_t axis = 0; axis < dimension; ++axis) { + if (code[axis] < 0) continue; + active.push_back(offsets[axis] + code[axis]); + } + using Candidate = std::tuple; + std::priority_queue, std::greater> heap; + auto offer = [&](int32_t left, int32_t right) { + const int32_t value = child(left, right); + if (value >= 0) heap.emplace(value, std::min(left, right), std::max(left, right)); + }; + for (int32_t a = 0; a < static_cast(active.size()); ++a) { + for (int32_t b = a + 1; b < static_cast(active.size()); ++b) { + offer(active[a], active[b]); + } + } + while (!heap.empty()) { + const auto [child_token, left, right] = heap.top(); + heap.pop(); + auto left_it = std::find(active.begin(), active.end(), left); + auto right_it = std::find(active.begin(), active.end(), right); + if (left_it == active.end() || right_it == active.end()) continue; + *left_it = child_token; + active.erase(right_it); + for (const int32_t other : active) { + if (other != child_token) offer(child_token, other); + } + } + std::sort(active.begin(), active.end(), [&](int32_t left, int32_t right) { + if (anchor[left] != anchor[right]) return anchor[left] < anchor[right]; + return left < right; + }); + return active; + } +}; + +} // namespace + +py::tuple spatial_encode_instances( + const py::array_t& codes, + const py::array_t& row_anchors, + const std::vector& bins, + const py::array_t& merges, + int threads) { + if (codes.ndim() != 2 || row_anchors.ndim() != 1 || + row_anchors.shape(0) != codes.shape(0) || + codes.shape(1) != static_cast(bins.size()) || merges.ndim() != 2 || + merges.shape(1) != 2) { + throw std::invalid_argument("invalid spatial replay inputs"); + } + Replay replay; + replay.dimension = static_cast(bins.size()); + replay.offsets.assign(replay.dimension + 1, 0); + for (int32_t axis = 0; axis < replay.dimension; ++axis) { + replay.offsets[axis + 1] = replay.offsets[axis] + bins[axis]; + } + const int32_t atoms = replay.offsets.back(); + replay.vocab_size = atoms + static_cast(merges.shape(0)); + replay.rule.assign(static_cast(replay.vocab_size) * replay.vocab_size, -1); + replay.anchor.assign(replay.vocab_size, -1); + for (int32_t axis = 0; axis < replay.dimension; ++axis) { + for (int32_t token = replay.offsets[axis]; token < replay.offsets[axis + 1]; ++token) { + replay.anchor[token] = axis; + } + } + auto rules = merges.unchecked<2>(); + for (int32_t index = 0; index < merges.shape(0); ++index) { + const int32_t left = rules(index, 0), right = rules(index, 1), child = atoms + index; + if (left < 0 || right < 0 || left >= child || right >= child) { + throw std::invalid_argument("invalid spatial merge rule"); + } + replay.rule[static_cast(std::min(left, right)) * replay.vocab_size + + std::max(left, right)] = child; + replay.anchor[child] = std::min(replay.anchor[left], replay.anchor[right]); + } + + const int64_t rows = codes.shape(0); + std::vector counts(rows); + const int32_t* source = codes.data(); + for (int64_t row = 0; row < rows; ++row) { + int32_t active = 0; + for (int32_t axis = 0; axis < replay.dimension; ++axis) { + const int32_t value = source[row * replay.dimension + axis]; + if (value < -1 || value >= bins[axis]) { + throw std::invalid_argument("a cell index is outside its coordinate's bin count"); + } + active += value >= 0; + } + if (active == 0) throw std::invalid_argument("every row needs an active coordinate"); + } +#ifndef _OPENMP + (void)threads; +#endif + { + py::gil_scoped_release release; +#ifdef _OPENMP +#pragma omp parallel for schedule(static) num_threads(threads > 0 ? threads : omp_get_max_threads()) +#endif + for (int64_t row = 0; row < rows; ++row) { + counts[row] = static_cast( + replay.encode(source + row * replay.dimension).size()); + } + } + std::vector offsets(rows + 1, 0); + for (int64_t row = 0; row < rows; ++row) offsets[row + 1] = offsets[row] + counts[row]; + py::array_t tokens(offsets.back()); + py::array_t anchors(offsets.back()); + int32_t* output_tokens = tokens.mutable_data(); + int64_t* output_anchors = anchors.mutable_data(); + const int64_t* input_anchors = row_anchors.data(); + { + py::gil_scoped_release release; +#ifdef _OPENMP +#pragma omp parallel for schedule(static) num_threads(threads > 0 ? threads : omp_get_max_threads()) +#endif + for (int64_t row = 0; row < rows; ++row) { + const auto encoded = replay.encode(source + row * replay.dimension); + const int64_t begin = offsets[row]; + for (int32_t index = 0; index < static_cast(encoded.size()); ++index) { + output_tokens[begin + index] = encoded[index]; + output_anchors[begin + index] = input_anchors[row]; + } + } + } + return py::make_tuple(tokens, anchors); +} diff --git a/actioncodec2_kernels/resample.cpp b/actioncodec2_kernels/resample.cpp index f05e1d9f0ce8c5a8f32a06bf85c23fc76374baaa..87794c62fa1d7accfb707828a641073288a13bb8 100644 --- a/actioncodec2_kernels/resample.cpp +++ b/actioncodec2_kernels/resample.cpp @@ -1,3 +1,4 @@ + #include #include @@ -21,6 +22,8 @@ struct Quat { double x, y, z, w; }; +// ---- runtime ``_so3`` quaternion math (xyzw), NumPy evaluation order ---- + Quat so3_normalize(const Quat& q) { const double norm = std::sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w); if (norm < 1e-12) throw std::invalid_argument("a pose contains a zero quaternion"); @@ -53,6 +56,8 @@ void so3_to_rotvec(const Quat& raw, double* out) { out[2] = q.z * scale; } +// ---- scipy ``Rotation`` operations used by RotationSpline ---- + Quat sp_from_quat(const Quat& q) { const double norm = std::sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w); if (!(norm > 0.0)) throw std::invalid_argument("found zero norm quaternions in `quat`"); @@ -97,6 +102,9 @@ Quat sp_from_rotvec(const double* v) { return {scale * v[0], scale * v[1], scale * v[2], std::cos(angle / 2.0)}; } +// ---- piecewise cubics (scipy PPoly with CubicHermiteSpline coefficients) ---- + +// PPoly interval: x[i] <= t < x[i+1], extrapolating with the end intervals. int64_t ppoly_interval(const Vec& x, double t) { const int64_t n = static_cast(x.size()); if (t >= x[n - 1]) return n - 2; @@ -104,6 +112,8 @@ int64_t ppoly_interval(const Vec& x, double t) { return static_cast(std::upper_bound(x.begin(), x.end(), t) - x.begin()) - 1; } +// scipy ``evaluate_poly1`` for a cubic: sum of c[k-1-p] * s**p, powers built by +// repeated multiplication. double ppoly_value(const double* c, double s) { double result = 0.0, z = 1.0; result = result + c[3] * z; @@ -116,6 +126,8 @@ double ppoly_value(const double* c, double s) { return result; } +// Hermite coefficients per interval and column: c[(k*4 + p)*cols + a] with +// p = 0..3 the descending powers, as CubicHermiteSpline stacks them. Vec hermite_coefficients(const Vec& x, const Vec& y, const Vec& slopes, int64_t cols) { const int64_t n = static_cast(x.size()); Vec c(static_cast((n - 1) * 4 * cols)); @@ -148,6 +160,7 @@ void ppoly_evaluate(const Vec& x, const Vec& c, int64_t cols, const Vec& times, } } +// LAPACK dgtsv (reference algorithm) for several right-hand sides b[n][cols]. void gtsv(Vec dl, Vec d, Vec du, Vec& b, int64_t cols) { const int64_t n = static_cast(d.size()); auto pivot = [&](int64_t i, bool last) { @@ -188,6 +201,7 @@ void gtsv(Vec dl, Vec d, Vec du, Vec& b, int64_t cols) { } } +// scipy CubicSpline(bc_type="natural") slopes at the knots. Vec natural_cubic_slopes(const Vec& x, const Vec& y, int64_t cols) { const int64_t n = static_cast(x.size()); Vec dx(n - 1), slope((n - 1) * cols); @@ -195,7 +209,7 @@ Vec natural_cubic_slopes(const Vec& x, const Vec& y, int64_t cols) { dx[k] = x[k + 1] - x[k]; for (int64_t a = 0; a < cols; ++a) slope[k * cols + a] = (y[(k + 1) * cols + a] - y[k * cols + a]) / dx[k]; } - + // Banded A (3 x n): A[0] superdiagonal, A[1] diagonal, A[2] subdiagonal. Vec upper(n, 0.0), diagonal(n, 0.0), lower(n, 0.0), b(n * cols); for (int64_t k = 1; k < n - 1; ++k) diagonal[k] = 2.0 * (dx[k - 1] + dx[k]); for (int64_t k = 2; k < n; ++k) upper[k] = dx[k - 2]; @@ -204,7 +218,7 @@ Vec natural_cubic_slopes(const Vec& x, const Vec& y, int64_t cols) { for (int64_t a = 0; a < cols; ++a) b[k * cols + a] = 3.0 * (dx[k] * slope[(k - 1) * cols + a] + dx[k - 1] * slope[k * cols + a]); } - + // Natural ends: second derivative zero (bc value 0.0). diagonal[0] = 2.0 * dx[0]; upper[1] = dx[0]; diagonal[n - 1] = 2.0 * dx[n - 2]; @@ -230,6 +244,7 @@ double pchip_edge(double h0, double h1, double m0, double m1) { return d; } +// scipy PchipInterpolator derivatives at the knots. Vec pchip_slopes(const Vec& x, const Vec& y, int64_t cols) { const int64_t n = static_cast(x.size()); Vec h(n - 1), m((n - 1) * cols), dk(n * cols, 0.0); @@ -262,6 +277,8 @@ Vec pchip_slopes(const Vec& x, const Vec& y, int64_t cols) { return dk; } +// ---- scipy RotationSpline ---- + using Mat3 = std::array; Mat3 skew(const double* v) { return {0.0, -v[2], v[1], v[2], 0.0, -v[0], -v[1], v[0], 0.0}; } @@ -363,7 +380,7 @@ void gbsv(int64_t n, int64_t kl, int64_t ku, Vec& ab, Vec& b) { } } } - + // Forward: L, with the row interchanges. for (int64_t j = 0; j + 1 < n; ++j) { const int64_t lm = std::min(kl, n - 1 - j); if (pivots[j] != j) std::swap(b[pivots[j]], b[j]); @@ -372,7 +389,7 @@ void gbsv(int64_t n, int64_t kl, int64_t ku, Vec& ab, Vec& b) { for (int64_t i = 1; i <= lm; ++i) b[j + i] = b[j + i] + at(kv + i, j) * temp; } } - + // Backward: U, a band of width kl+ku above the diagonal (dtbsv). const int64_t k = kl + ku; for (int64_t j = n - 1; j >= 0; --j) { if (b[j] != 0.0) { @@ -386,7 +403,7 @@ void gbsv(int64_t n, int64_t kl, int64_t ku, Vec& ab, Vec& b) { struct RotationSpline { Vec times; std::vector rotations; - Vec coefficients; + Vec coefficients; // ppoly layout, 3 columns RotationSpline(const Vec& knots, const std::vector& raw) : times(knots) { const int64_t n = static_cast(knots.size()); @@ -416,8 +433,8 @@ struct RotationSpline { } } - - + // scipy RotationSpline._solve_for_angular_rates; ``rates`` comes back as the + // knot angular rates, ``rotvecs_dot`` as the segment rotation-vector rates. static void solve_rates(const Vec& dt, Vec& rates, const Vec& rotvecs, Vec& rotvecs_dot) { const int64_t m = static_cast(dt.size()); const double first[3] = {rates[0], rates[1], rates[2]}; @@ -426,7 +443,7 @@ struct RotationSpline { a[k] = rate_to_rotvec_dot(&rotvecs[k * 3]); a_inv[k] = rotvec_dot_to_rate(&rotvecs[k * 3]); } - + // Block-tridiagonal system of m-1 unknown 3-vectors in (5, 5) band form. const int64_t size = 3 * (m - 1), kl = 5, ku = 5, ldab = 2 * kl + ku + 1; Vec band(ldab * size, 0.0); auto set = [&](int64_t i, int64_t j, double value) { band[(kl + ku + i - j) + ldab * j] = value; }; @@ -474,7 +491,7 @@ struct RotationSpline { if (converged) break; } for (int64_t k = 0; k < m; ++k) matvec(a[k], &rates[k * 3], &rotvecs_dot[k * 3]); - + // Knot rates: the fixed first rate, then the solved interior ones. Vec shifted(m * 3); for (int r = 0; r < 3; ++r) shifted[r] = first[r]; for (int64_t i = 0; i < 3 * (m - 1); ++i) shifted[3 + i] = rates[i]; @@ -516,6 +533,8 @@ Quat slerp(const Quat& left, const Quat& right, double weight) { return so3_normalize(out); } +// ---- runtime resample_uniform ---- + enum Kind { kLinear = 0, kHold = 1, kPose = 2 }; enum Method { kLinearMethod = 0, kPchip = 1, kCubic = 2 }; @@ -525,7 +544,8 @@ int64_t resampled_horizon(int64_t length, double source_hz, double target_hz) { int64_t output_width(int kind, int64_t width) { return kind == kPose ? 7 : width; } -void resample_row(const float* input, int64_t steps, int64_t width, double source_hz, double target_hz, +// One row: float32 [T, D] in, float32 [count, D'] out. +void resample_row(const double* input, int64_t steps, int64_t width, double source_hz, double target_hz, int kind, int64_t count, bool identity, int method, float* output) { Vec values(steps * width); for (int64_t i = 0; i < steps * width; ++i) values[i] = input[i]; @@ -565,7 +585,7 @@ void resample_row(const float* input, int64_t steps, int64_t width, double sourc } else if (method == kCubic) { const Vec c = hermite_coefficients(source_time, continuous, natural_cubic_slopes(source_time, continuous, cols), cols); ppoly_evaluate(source_time, c, cols, interpolation_time, out_width, 0, result.data()); - + // Guard: fall back to PCHIP on axes that materially leave their envelope. std::vector fallback; for (int64_t a = 0; a < cols; ++a) { double lower = continuous[a], upper = continuous[a]; @@ -635,14 +655,15 @@ int parse_method(const std::string& method) { } using F32 = py::array_t; +using F64 = py::array_t; -void check_finite(const F32& values) { - const float* data = values.data(); +void check_finite(const F64& values) { + const double* data = values.data(); for (py::ssize_t i = 0; i < values.size(); ++i) if (!std::isfinite(data[i])) throw std::invalid_argument("values must be a non-empty finite [T, D] array"); } -F32 resample_uniform_batch(const F32& values, double source_hz, double target_hz, const std::string& kind_name, +F32 resample_uniform_batch(const F64& values, double source_hz, double target_hz, const std::string& kind_name, int64_t target_length, const std::string& method_name, int threads) { if (values.ndim() != 3 || values.shape(0) < 1 || values.shape(1) < 1) throw std::invalid_argument("values must have non-empty shape [B, T, D]"); @@ -658,7 +679,7 @@ F32 resample_uniform_batch(const F32& values, double source_hz, double target_hz if (count < 1) throw std::invalid_argument("target_length must be a positive integer"); const int64_t out_width = output_width(kind, width); F32 output({batch, count, out_width}); - const float* in = values.data(); + const double* in = values.data(); float* out = output.mutable_data(); { py::gil_scoped_release release; @@ -670,14 +691,15 @@ F32 resample_uniform_batch(const F32& values, double source_hz, double target_hz return output; } +// Elementwise pose maps over [B, T, D] float32 arrays. template -F32 map_rows(const F32& values, int64_t in_width, int64_t out_width, int threads, Row&& row) { +F32 map_rows(const F64& values, int64_t in_width, int64_t out_width, int threads, Row&& row) { if (values.ndim() != 3 || values.shape(2) != in_width || values.shape(1) < 1) throw std::invalid_argument("expected shape [B, T, " + std::to_string(in_width) + "]"); check_finite(values); const int64_t batch = values.shape(0), steps = values.shape(1); F32 output({batch, steps, out_width}); - const float* in = values.data(); + const double* in = values.data(); float* out = output.mutable_data(); { py::gil_scoped_release release; @@ -688,8 +710,9 @@ F32 map_rows(const F32& values, int64_t in_width, int64_t out_width, int threads return output; } -F32 integrate_eef_deltas_batch(const F32& deltas, int threads) { - return map_rows(deltas, 6, 7, threads, [](const float* in, int64_t steps, float* out) { +// runtime integrate_eef_deltas: [T, 6] body increments -> [T, 7] absolute poses. +F32 integrate_eef_deltas_batch(const F64& deltas, int threads) { + return map_rows(deltas, 6, 7, threads, [](const double* in, int64_t steps, float* out) { double position[3] = {0.0, 0.0, 0.0}; Quat current{0.0, 0.0, 0.0, 1.0}; for (int64_t t = 0; t < steps; ++t) { @@ -707,8 +730,9 @@ F32 integrate_eef_deltas_batch(const F32& deltas, int threads) { }); } -F32 eef_pose_from_rotvec_batch(const F32& poses, int threads) { - return map_rows(poses, 6, 7, threads, [](const float* in, int64_t steps, float* out) { +// runtime eef_pose_from_components(..., "rotation_vector"). +F32 eef_pose_from_rotvec_batch(const F64& poses, int threads) { + return map_rows(poses, 6, 7, threads, [](const double* in, int64_t steps, float* out) { for (int64_t t = 0; t < steps; ++t) { for (int a = 0; a < 3; ++a) out[t * 7 + a] = in[t * 6 + a]; const Quat q = so3_from_rotvec(in[t * 6 + 3], in[t * 6 + 4], in[t * 6 + 5]); @@ -720,8 +744,9 @@ F32 eef_pose_from_rotvec_batch(const F32& poses, int threads) { }); } -F32 eef_pose_absolute_batch(const F32& poses, int threads) { - return map_rows(poses, 7, 6, threads, [](const float* in, int64_t steps, float* out) { +// runtime eef_pose_absolute: [T, 7] xyz + xyzw -> [T, 6] xyz + rotation vector. +F32 eef_pose_absolute_batch(const F64& poses, int threads) { + return map_rows(poses, 7, 6, threads, [](const double* in, int64_t steps, float* out) { for (int64_t t = 0; t < steps; ++t) { for (int a = 0; a < 3; ++a) out[t * 6 + a] = in[t * 7 + a]; double rotvec[3]; @@ -731,8 +756,9 @@ F32 eef_pose_absolute_batch(const F32& poses, int threads) { }); } -F32 eef_pose_deltas_batch(const F32& poses, int threads) { - return map_rows(poses, 7, 6, threads, [](const float* in, int64_t steps, float* out) { +// runtime eef_pose_deltas: local [T, 7] path -> [T, 6] body increments. +F32 eef_pose_deltas_batch(const F64& poses, int threads) { + return map_rows(poses, 7, 6, threads, [](const double* in, int64_t steps, float* out) { Quat previous{0.0, 0.0, 0.0, 1.0}; for (int64_t t = 0; t < steps; ++t) { for (int a = 0; a < 3; ++a) { @@ -748,8 +774,10 @@ F32 eef_pose_deltas_batch(const F32& poses, int threads) { }); } -F32 rotvec_left_to_right_batch(const F32& increments, int threads) { - return map_rows(increments, 3, 3, threads, [](const float* in, int64_t steps, float* out) { +// Re-express per-step rotation increments between world-frame (left) and +// body-frame (right) multiplication, as scipy ``Rotation`` composes them. +F32 rotvec_left_to_right_batch(const F64& increments, int threads) { + return map_rows(increments, 3, 3, threads, [](const double* in, int64_t steps, float* out) { Quat current{0.0, 0.0, 0.0, 1.0}; for (int64_t t = 0; t < steps; ++t) { const double v[3] = {in[t * 3], in[t * 3 + 1], in[t * 3 + 2]}; @@ -762,8 +790,8 @@ F32 rotvec_left_to_right_batch(const F32& increments, int threads) { }); } -F32 rotvec_right_to_left_batch(const F32& increments, int threads) { - return map_rows(increments, 3, 3, threads, [](const float* in, int64_t steps, float* out) { +F32 rotvec_right_to_left_batch(const F64& increments, int threads) { + return map_rows(increments, 3, 3, threads, [](const double* in, int64_t steps, float* out) { Quat current{0.0, 0.0, 0.0, 1.0}; for (int64_t t = 0; t < steps; ++t) { const double v[3] = {in[t * 3], in[t * 3 + 1], in[t * 3 + 2]}; @@ -776,7 +804,7 @@ F32 rotvec_right_to_left_batch(const F32& increments, int threads) { }); } -} +} // namespace void register_resample(py::module_& module) { module.def("resample_uniform_batch", &resample_uniform_batch, py::arg("values"), py::arg("source_hz"), diff --git a/actioncodec2_kernels/setbpe.cpp b/actioncodec2_kernels/setbpe.cpp index 6c3b4865a98afadd451daa5fb7c5309148b3333a..16a44299693f9d53debc81a47c3db04b68df9278 100644 --- a/actioncodec2_kernels/setbpe.cpp +++ b/actioncodec2_kernels/setbpe.cpp @@ -1,3 +1,10 @@ +// Set-BPE serialization: quantized cell trajectories <-> token streams. +// +// A port of the runtime's SpatialVocabulary / TemporalVocabulary (Python, +// ``tokenization/setbpe_{spatial,temporal}.py``). Every merge is applied from +// a priority queue ordered exactly as the Python heaps order their tuples, so +// the token streams are identical, not merely equivalent. + #include #include #include @@ -5,6 +12,8 @@ #include #include #include +#include +#include #include #include #include @@ -14,6 +23,8 @@ #include #include "parallel.hpp" +#include "repacking.hpp" +#include "token_streams.hpp" namespace py = pybind11; @@ -74,7 +85,7 @@ class SetBPE { for (int64_t token = 0; token < spatial_size_; ++token) spatial_anchor_[token] = lowest_bit(support_[token]); - + // Rooted temporal tokens: a pattern of (time offset, spatial token) pairs. vocab_size_ = spatial_size_ + static_cast(temporal_merges.size()); patterns_.resize(vocab_size_); root_.resize(vocab_size_); @@ -113,9 +124,16 @@ class SetBPE { } int64_t vocab_size() const { return vocab_size_; } - int64_t dimension() const { return static_cast(bins_.size()); } + int64_t dimension() const { return bins_.size(); } + const ac2pack::Search& packing_search() const { + std::call_once(packing_once_, [&] { + packing_ = std::make_unique(bins_, support_, expansion_, patterns_, root_); + }); + return *packing_; + } + // One dense [T, D] trajectory with -1 for semantically absent slots. std::vector encode(const int64_t* cells, int64_t steps) const { const int64_t dimension = static_cast(bins_.size()); if (steps < 1) throw std::invalid_argument("every episode must have at least one step"); @@ -134,10 +152,10 @@ class SetBPE { throw std::invalid_argument("active dimensions must remain constant within an episode"); } - + // Instances, as in the Python encoder: token, anchor step, liveness. std::vector tokens, anchors; std::vector active; - std::vector>> at(steps); + std::vector>> at(steps); // (token, instance) for (int64_t t = 0; t < steps; ++t) { for (int64_t token : spatial_encode(cells + t * dimension)) { at[t].emplace_back(token, static_cast(tokens.size())); @@ -147,7 +165,7 @@ class SetBPE { } } - + // (rank, anchor, root anchor dimension, left instance, right instance, child) using Offer = std::tuple; std::priority_queue, std::greater> frontier; auto offer = [&](int64_t left_instance, int64_t right_instance) { @@ -218,7 +236,7 @@ class SetBPE { return stream; } - + // Tokens -> dense [T, D] cells (-1 outside ``full``), validating like the runtime. std::vector decode(const int64_t* stream, int64_t length, uint64_t full) const { const int64_t dimension = static_cast(bins_.size()); std::vector coverage{0}; @@ -264,7 +282,7 @@ class SetBPE { } private: - + // Spatial Set-BPE of one dense row: merges in rank order, then anchor order. std::vector spatial_encode(const int64_t* row) const { const int64_t dimension = static_cast(bins_.size()); std::vector present; @@ -272,7 +290,7 @@ class SetBPE { if (row[d] >= 0) present.push_back(offsets_[d] + row[d]); } std::sort(present.begin(), present.end()); - using Candidate = std::tuple; + using Candidate = std::tuple; // rank, child, left, right std::priority_queue, std::greater> heap; for (size_t i = 0; i < present.size(); ++i) { for (size_t j = i + 1; j < present.size(); ++j) { @@ -281,7 +299,7 @@ class SetBPE { heap.emplace(found->second.rank, found->second.child, present[i], present[j]); } } - std::vector tokens = present; + std::vector tokens = present; // a small set; linear lookups are fastest auto contains = [&](int64_t token) { return std::find(tokens.begin(), tokens.end(), token) != tokens.end(); }; @@ -325,13 +343,40 @@ class SetBPE { std::vector>> patterns_; std::vector root_; std::unordered_map, Rule, TupleHash> temporal_rules_; + mutable std::once_flag packing_once_; + mutable std::unique_ptr packing_; }; +py::list encode_search_batch(const SetBPE& codec, + const py::array_t& cells, + bool spatial, bool temporal, int window, int beam, int threads) { + if (cells.ndim() != 3 || cells.shape(0) < 1 || cells.shape(1) < 1 || + cells.shape(2) != codec.dimension()) + throw std::invalid_argument("expected nonempty [B,T,D] cells matching codec width"); + if (window < 1 || window * codec.dimension() > 256 || beam < 1 || beam > 64) + throw std::invalid_argument("packing requires window*D <= 256 and beam in [1,64]"); + const auto* search = spatial || temporal ? &codec.packing_search() : nullptr; + const int64_t batch = cells.shape(0), steps = cells.shape(1), width = cells.shape(2); + std::vector> streams(batch); + { + py::gil_scoped_release release; + ac2::parallel_for(batch, threads, [&](int64_t index) { + const auto* row = cells.data() + index * steps * width; + auto original = codec.encode(row, steps); + streams[index] = search ? search->apply(row, steps, original, spatial, temporal, window, beam) + : std::move(original); + }); + } + py::list output(batch); + for (int64_t index = 0; index < batch; ++index) output[index] = py::cast(streams[index]); + return output; +} + +// Encode B dense [T, D] trajectories in parallel; returns one stream per row. py::list encode_batch(const SetBPE& codec, const py::array_t& cells, int threads) { - if (cells.ndim() != 3 || cells.shape(1) < 1 || cells.shape(2) != codec.dimension()) - throw std::invalid_argument("cells must have shape [B, T, D] with the codec's dimension"); + if (cells.ndim() != 3) throw std::invalid_argument("cells must have shape [B, T, D]"); const int64_t batch = cells.shape(0), steps = cells.shape(1), width = cells.shape(2); const int64_t* data = cells.data(); std::vector> streams(batch); @@ -346,15 +391,11 @@ py::list encode_batch(const SetBPE& codec, return output; } +// Decode B equal-horizon streams to dense [B, T, D] cells (-1 outside ``full``). py::array_t decode_batch(const SetBPE& codec, const std::vector>& streams, int64_t width, uint64_t full, int threads) { const int64_t batch = static_cast(streams.size()); if (batch < 1) throw std::invalid_argument("streams must not be empty"); - if (width != codec.dimension()) - throw std::invalid_argument("width must equal the codec's dimension"); - const uint64_t all = (uint64_t{1} << codec.dimension()) - 1; - if (!full || (full & ~all)) - throw std::invalid_argument("full_support must select existing dimensions"); std::vector> cells(batch); { py::gil_scoped_release release; @@ -375,7 +416,7 @@ py::array_t decode_batch(const SetBPE& codec, const std::vector(module, "SetBPE") @@ -386,38 +427,14 @@ void register_setbpe(py::module_& module) { .def_property_readonly("vocab_size", &SetBPE::vocab_size) .def("encode_batch", &encode_batch, py::arg("cells"), py::arg("threads") = 0, "Dense [B, T, D] cells (-1 = absent) -> one token stream per row.") + .def("encode_search_batch", &encode_search_batch, py::arg("cells"), + py::arg("spatial_search") = false, py::arg("temporal_search") = false, + py::arg("search_window") = 32, py::arg("search_beam") = 4, py::arg("threads") = 0) .def("decode_batch", &decode_batch, py::arg("streams"), py::arg("width"), py::arg("full_support"), py::arg("threads") = 0, "Equal-horizon streams -> dense [B, T, D] cells, -1 outside full_support.") .def("decode_checked_batch", [](const SetBPE& codec, const py::iterable& streams, - int64_t width, uint64_t full, int threads) { - const py::object numpy_integer = py::module_::import("numpy").attr("integer"); - py::object integral; - std::vector> rows; - if (PyList_Check(streams.ptr())) rows.reserve(PyList_GET_SIZE(streams.ptr())); - for (py::handle stream : streams) { - std::vector row; - if (PyList_Check(stream.ptr())) row.reserve(PyList_GET_SIZE(stream.ptr())); - for (py::handle raw : py::reinterpret_borrow(stream)) { - bool integer = PyLong_Check(raw.ptr()) || py::isinstance(raw, numpy_integer); - if (!integer) { - if (!integral) integral = py::module_::import("numbers").attr("Integral"); - integer = py::isinstance(raw, integral); - } - if (PyBool_Check(raw.ptr()) || !integer) - throw std::invalid_argument("tokens must be integers"); - py::object number = PyLong_Check(raw.ptr()) - ? py::reinterpret_borrow(raw) - : py::reinterpret_steal(PyNumber_Long(raw.ptr())); - if (!number) throw py::error_already_set(); - int overflow = 0; - const int64_t token = PyLong_AsLongLongAndOverflow(number.ptr(), &overflow); - if (PyErr_Occurred()) throw py::error_already_set(); - if (overflow) throw std::invalid_argument("token is outside the vocabulary"); - row.push_back(token); - } - rows.push_back(std::move(row)); - } - return decode_batch(codec, rows, width, full, threads); + int64_t width, uint64_t full, int threads) { + return decode_batch(codec, ac2::checked_token_streams(streams, codec.vocab_size()), width, full, threads); }, py::arg("streams"), py::arg("width"), py::arg("full_support"), py::arg("threads") = 0); } diff --git a/actioncodec2_kernels/so3.cpp b/actioncodec2_kernels/so3.cpp index 02e08a4c66aff729ac85ffde89220753a11fbdd0..010b61bfaa3df7e21f00d92a00f9a1f8aebe5499 100644 --- a/actioncodec2_kernels/so3.cpp +++ b/actioncodec2_kernels/so3.cpp @@ -1,3 +1,5 @@ +// Intrinsic first- and stateful second-order SO(3) error-feedback encoders. + #include #include @@ -104,6 +106,8 @@ struct SO3Layout { bool left; int32_t input_order; double projection_radius = std::numeric_limits::infinity(); + bool lazy = false; // momentum_lazy ranking (first order only) + std::array zero{}; // exact zero primitive per axis, used by ``lazy`` }; void project_primitive(double* value, double radius) { @@ -150,22 +154,31 @@ std::vector smooth_axis(const SO3Layout& layout, int axis, double reque return output; } -bool earlier(double error, const std::array& choice, double best_error, - const std::array& best_choice, bool found) { - return !found || error < best_error || (error == best_error && choice < best_choice); -} +// Lexicographic selection key: (moving axes, zero distance) under ``lazy``, then error, cell. +struct ChoiceKey { + int moving = 0; + int distance = 0; + double error = 0.0; + std::array choice{}; + bool operator<(const ChoiceKey& o) const { + if (moving != o.moving) return moving < o.moving; + if (distance != o.distance) return distance < o.distance; + if (error != o.error) return error < o.error; + return choice < o.choice; + } +}; std::array smooth_choice(const SO3Layout& layout, const std::array& request, const Quaternion& reconstruction, const Quaternion& target, const std::array& direction, - const std::array& nearest) { + const std::array& nearest, + const std::array& previous = {-1, -1, -1}) { const auto x = smooth_axis(layout, 0, request[0], nearest[0]); const auto y = smooth_axis(layout, 1, request[1], nearest[1]); const auto z = smooth_axis(layout, 2, request[2], nearest[2]); - std::array best_any{}, best_preferred{}; - double any_error = 0.0, preferred_error = 0.0; + ChoiceKey best_any, best_preferred; bool found_any = false, found_preferred = false; for (const int32_t ix : x) { for (const int32_t iy : y) { @@ -179,23 +192,30 @@ std::array smooth_choice(const SO3Layout& layout, const double error = std::sqrt(remaining[0] * remaining[0] + remaining[1] * remaining[1] + remaining[2] * remaining[2]); if (error > layout.limit + 1e-12) continue; - if (earlier(error, choice, any_error, best_any, found_any)) { - best_any = choice; - any_error = error; + if (layout.lazy && choice == previous) return choice; + ChoiceKey key; + key.error = error; + key.choice = choice; + if (layout.lazy) { + for (int axis = 0; axis < 3; ++axis) { + key.moving += choice[axis] != layout.zero[axis]; + key.distance += std::abs(choice[axis] - layout.zero[axis]); + } + } + if (!found_any || key < best_any) { + best_any = key; found_any = true; } const double dot = vector[0] * direction[0] + vector[1] * direction[1] + vector[2] * direction[2]; - if (dot >= -1e-15 && earlier(error, choice, preferred_error, best_preferred, - found_preferred)) { - best_preferred = choice; - preferred_error = error; + if (dot >= -1e-15 && (!found_preferred || key < best_preferred)) { + best_preferred = key; found_preferred = true; } } } } - return found_preferred ? best_preferred : (found_any ? best_any : nearest); + return found_preferred ? best_preferred.choice : (found_any ? best_any.choice : nearest); } void encode_trajectory(const SO3Layout& layout, const float* actions, int64_t steps, @@ -203,14 +223,16 @@ void encode_trajectory(const SO3Layout& layout, const float* actions, int64_t st Quaternion truth{0.0, 0.0, 0.0, 1.0}; Quaternion reconstruction = truth; std::array direction{}; + std::array previous = layout.zero; for (int64_t step = 0; step < steps; ++step) { const Quaternion value = from_input(actions + 3 * step, layout.rotation_vector); truth = layout.input_order == 0 ? value : apply(truth, value, layout.left); const auto request = as_rotvec(residual(truth, reconstruction, layout.left)); auto choice = nearest_choice(layout, request); if (layout.smooth) { - choice = smooth_choice(layout, request, reconstruction, truth, direction, choice); + choice = smooth_choice(layout, request, reconstruction, truth, direction, choice, previous); } + previous = choice; const double vector[3] = {primitive(layout, 0, choice[0]), primitive(layout, 1, choice[1]), primitive(layout, 2, choice[2])}; @@ -222,7 +244,7 @@ void encode_trajectory(const SO3Layout& layout, const float* actions, int64_t st } } -} +} // namespace py::array_t so3_second_order_encode_batch( const py::array_t& table, @@ -263,7 +285,7 @@ py::array_t so3_second_order_encode_batch( const auto request = as_rotvec(correction); auto choice = nearest_choice(layout, request); if (smooth) { - + // Python scores U^-1 W for both conventions; use exactly that order. SO3Layout selection = layout; selection.left = false; choice = smooth_choice(selection, request, identity, correction, direction, choice); @@ -284,10 +306,11 @@ py::array_t so3_encode_batch( const py::array_t& table, const py::array_t& bins, const py::array_t& actions, - int32_t input_order, bool rotation_vector, bool left, double limit, bool smooth, + int32_t input_order, bool rotation_vector, bool left, double limit, int32_t selection, int threads) { if (table.ndim() != 2 || table.shape(0) != 3 || bins.size() != 3 || actions.ndim() != 3 || - actions.shape(2) != 3 || (input_order != 0 && input_order != 1) || limit <= 0.0) { + actions.shape(2) != 3 || (input_order != 0 && input_order != 1) || limit <= 0.0 || + selection < 0 || selection > 2) { throw std::invalid_argument("invalid SO(3) batch encoder arguments"); } for (int axis = 0; axis < 3; ++axis) { @@ -295,11 +318,28 @@ py::array_t so3_encode_batch( throw std::invalid_argument("SO(3) primitive count exceeds table width"); } } - const SO3Layout layout{table.data(), bins.data(), table.shape(1), limit, smooth, - rotation_vector, left, input_order}; + // selection: 0 nearest, 1 smooth, 2 momentum_lazy + SO3Layout layout{table.data(), bins.data(), table.shape(1), limit, selection != 0, + rotation_vector, left, input_order}; + layout.lazy = selection == 2; + for (int axis = 0; axis < 3; ++axis) { + double best = std::numeric_limits::infinity(); + for (int32_t index = 0; index < bins.data()[axis]; ++index) { + if (std::fabs(primitive(layout, axis, index)) < best) { + best = std::fabs(primitive(layout, axis, index)); + layout.zero[axis] = index; + } + } + if (layout.lazy && best != 0.0) { + throw std::invalid_argument("momentum_lazy needs an exact zero primitive per axis"); + } + } const int64_t batch = actions.shape(0); const int64_t steps = actions.shape(1); py::array_t output({batch, steps, int64_t{3}}); +#ifndef _OPENMP + (void)threads; +#endif { py::gil_scoped_release release; ac2::parallel_for(batch, threads, [&](int64_t index) { diff --git a/actioncodec2_kernels/sparse.cpp b/actioncodec2_kernels/sparse.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9f262243f220f3cc6369093e6bec23b4ee1c42ba --- /dev/null +++ b/actioncodec2_kernels/sparse.cpp @@ -0,0 +1,1308 @@ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "parallel.hpp" + +#ifdef _OPENMP +#include +#endif +#if defined(_OPENMP) && defined(__GLIBCXX__) +#include +#define AC2_PARALLEL_SORT __gnu_parallel::sort +#else +#define AC2_PARALLEL_SORT std::sort +#endif + +namespace py = pybind11; + +namespace { + +constexpr int kMaxLookahead = 32; +constexpr size_t kCertifyBatch = 32; +constexpr size_t kApplyGrain = 256; // minimum candidate pairs per parallel apply group + +constexpr size_t kShards = 64; // rule-table shards updated concurrently after a merge + +inline uint64_t mix(uint64_t key) { return key * 0x9E3779B97F4A7C15ull; } +inline size_t shard_of(uint64_t key) { return static_cast(mix(key) >> 58); } + +// Small open-addressing accumulator for rule-count deltas; clearing costs O(used). +class DeltaMap { + public: + void add(uint64_t key, int64_t delta) { + if ((filled_.size() + 1) * 2 > keys_.size()) grow(); + size_t h = slot(key); + while (keys_[h] != kEmpty && keys_[h] != key) h = (h + 1) & (keys_.size() - 1); + if (keys_[h] == kEmpty) { + keys_[h] = key; + filled_.push_back(static_cast(h)); + } + values_[h] += delta; + } + template + void each(F&& visit) const { + for (uint32_t h : filled_) visit(keys_[h], values_[h]); + } + void clear() { + for (uint32_t h : filled_) { + keys_[h] = kEmpty; + values_[h] = 0; + } + filled_.clear(); + } + + private: + static constexpr uint64_t kEmpty = ~0ull; + size_t slot(uint64_t key) const { + return static_cast(mix(key) >> 20) & (keys_.size() - 1); + } + void grow() { + std::vector keys = std::move(keys_); + std::vector values = std::move(values_); + std::vector filled = std::move(filled_); + const size_t capacity = std::max(64, keys.size() * 2); + keys_.assign(capacity, kEmpty); + values_.assign(capacity, 0); + filled_.clear(); + for (uint32_t h : filled) add(keys[h], values[h]); + } + std::vector keys_; + std::vector values_; + std::vector filled_; +}; + +inline uint64_t rule_key(int32_t left, int32_t right, int32_t offset) { + return (static_cast(left) << 40) | (static_cast(right) << 16) | + static_cast(offset); +} + +inline void unpack(uint64_t key, int32_t& left, int32_t& right, int32_t& offset) { + left = static_cast(key >> 40); + right = static_cast((key >> 16) & 0xffffffull); + offset = static_cast(key & 0xffffull); +} + +// Immutable-per-token geometry shared by the trainer, encoder and decoder. +struct Tables { + int32_t dims = 0; // physical slots including E + int32_t e_dim = 0; // index of E + int32_t lookahead = 0; // maximum token span in frames + std::vector masks; // token * lookahead -> support mask + std::vector emask; // token -> bit per offset holding E + std::vector first_from; // token * lookahead + k -> first support offset >= k + std::vector span, rdim; + std::vector>> pattern; // (offset, spatial token) + int32_t base = 0; + + void init(const std::vector& spatial_support, int32_t dims_, int32_t lookahead_) { + dims = dims_; + e_dim = dims_ - 1; + lookahead = lookahead_; + if (lookahead < 1 || lookahead > kMaxLookahead) throw std::invalid_argument("lookahead"); + if (dims < 2 || dims > 16) throw std::invalid_argument("dims must be in [2, 16]"); + base = static_cast(spatial_support.size()); + for (int32_t t = 0; t < base; ++t) { + uint32_t s = spatial_support[t]; + if (!s) throw std::invalid_argument("spatial token without support"); + push({{0, t}}, std::vector{s}); + } + } + + void push(std::vector> pat, const std::vector& m) { + const size_t token = span.size(); + masks.resize((token + 1) * lookahead, 0); + uint32_t e = 0; + int32_t sp = 0; + for (size_t o = 0; o < m.size(); ++o) { + masks[token * lookahead + o] = m[o]; + if (m[o]) sp = static_cast(o) + 1; + if (m[o] >> e_dim & 1u) e |= 1u << o; + } + emask.push_back(e); + first_from.resize((token + 1) * lookahead, -1); + for (int32_t k = sp - 1, next = -1; k >= 0; --k) { + if (masks[token * lookahead + k]) next = k; + first_from[token * lookahead + k] = static_cast(next); + } + span.push_back(sp); + rdim.push_back(__builtin_ctz(m[0])); + pattern.push_back(std::move(pat)); + } + + int32_t size() const { return static_cast(span.size()); } + uint32_t mask(int32_t token, int32_t o) const { + return masks[static_cast(token) * lookahead + o]; + } + + // Merge geometry; returns false when the union would exceed the lookahead or overlap. + bool compose(int32_t a, int32_t b, int32_t off, std::vector& out) const { + if (off < 0 || off >= lookahead) return false; + const int32_t sp = std::max(span[a], off + span[b]); + if (sp > lookahead) return false; + out.assign(sp, 0); + for (int32_t o = 0; o < span[a]; ++o) out[o] = mask(a, o); + for (int32_t o = 0; o < span[b]; ++o) { + if (out[o + off] & mask(b, o)) return false; + out[o + off] |= mask(b, o); + } + return true; + } + + int32_t add_merge(int32_t a, int32_t b, int32_t off) { + std::vector m; + if (!compose(a, b, off, m)) throw std::invalid_argument("illegal temporal merge"); + auto pat = pattern[a]; + for (auto [o, t] : pattern[b]) pat.push_back({o + off, t}); + std::sort(pat.begin(), pat.end()); + push(std::move(pat), m); + return size() - 1; + } +}; + +using Key = std::tuple; +using InstanceId = uint32_t; +constexpr InstanceId kNoInstance = UINT32_MAX; + +// Mutable instance state over a global frame axis. Used per chunk by the encoder and +// globally by the trainer. +struct Instances { + const Tables* tb = nullptr; + int64_t frames = 0; + std::vector tok; + std::vector root; + std::vector alive; + std::vector member; // frame * dims + dim -> instance + + void reset(const Tables* tables, int64_t frame_count) { + tb = tables; + frames = frame_count; + tok.clear(); + root.clear(); + alive.clear(); + member.assign(static_cast(frame_count) * tables->dims, kNoInstance); + } + + InstanceId cell(int64_t f, int32_t d) const { + return member[static_cast(f) * tb->dims + d]; + } + + Key key(InstanceId i) const { + const uint32_t e = tb->emask[tok[i]]; + return Key(root[i], e ? 1 : 0, e ? root[i] + __builtin_ctz(e) : 0, tb->rdim[tok[i]]); + } + + InstanceId add(int32_t token, int64_t r) { + if (tok.size() >= kNoInstance) throw std::length_error("instance ids"); + const InstanceId i = static_cast(tok.size()); + tok.push_back(token); + root.push_back(r); + alive.push_back(1); + place(i); + return i; + } + + // Reserves dead slots that disjoint frame ranges then fill concurrently via ``place``. + InstanceId reserve(size_t count) { + const size_t base = tok.size(); + if (base + count > static_cast(kNoInstance)) throw std::length_error("instance ids"); + tok.resize(base + count, 0); + root.resize(base + count, 0); + alive.resize(base + count, 0); + return static_cast(base); + } + + void place(InstanceId i) { + const int32_t token = tok[i]; + const int64_t r = root[i]; + alive[i] = 1; + for (int32_t o = 0; o < tb->span[token]; ++o) { + uint32_t m = tb->mask(token, o); + while (m) { + const int32_t d = __builtin_ctz(m); + m &= m - 1; + InstanceId& slot = member[static_cast(r + o) * tb->dims + d]; + if (slot != kNoInstance) throw std::runtime_error("instance overlap"); + slot = i; + } + } + } + + void kill(InstanceId i) { + alive[i] = 0; + const int32_t token = tok[i]; + for (int32_t o = 0; o < tb->span[token]; ++o) { + uint32_t m = tb->mask(token, o); + while (m) { + const int32_t d = __builtin_ctz(m); + m &= m - 1; + member[static_cast(root[i] + o) * tb->dims + d] = kNoInstance; + } + } + } + + bool first(InstanceId a, InstanceId b) const { + return std::make_pair(root[a], tb->rdim[tok[a]]) < std::make_pair(root[b], tb->rdim[tok[b]]); + } + + // Ordered candidate pairs (a, b, offset) involving i inside the lookahead window. + // Each neighbour is emitted once, at its first support cell inside the window. + template + void partners(InstanceId i, bool allow_zero, F&& emit) const { + const int64_t r = root[i]; + const int32_t L = tb->lookahead; + const int64_t lo = std::max(0, r - L + 1), hi = std::min(frames - 1, r + L - 1); + for (int64_t f = lo; f <= hi; ++f) { + for (int32_t d = 0; d < tb->dims; ++d) { + const InstanceId j = cell(f, d); + if (j == kNoInstance || j == i) continue; + const int32_t tj = tok[j]; + const int64_t o = f - root[j]; + const int64_t k = std::max(0, lo - root[j]); + if (tb->first_from[static_cast(tj) * L + k] != o) continue; + if (__builtin_ctz(tb->mask(tj, static_cast(o))) != d) continue; + const bool ij = first(i, j); + const InstanceId a = ij ? i : j, b = ij ? j : i; + const int64_t off = root[b] - root[a]; + if (off >= L || (off == 0 && !allow_zero)) continue; + if (std::max(tb->span[tok[a]], off + tb->span[tok[b]]) > L) continue; + emit(a, b, static_cast(off)); + } + } + } + + // Would merging a (rooted first) with b keep the stream decodable? + bool valid(InstanceId a, InstanceId b, int32_t off) const { + const int32_t ta = tok[a], tb_ = tok[b]; + const int32_t sp = std::max(tb->span[ta], off + tb->span[tb_]); + uint32_t emask = tb->emask[ta] | (tb->emask[tb_] << off); + const Key km(root[a], emask ? 1 : 0, emask ? root[a] + __builtin_ctz(emask) : 0, + tb->rdim[ta]); + for (int32_t o = 0; o < sp; ++o) { + uint32_t m = (o < tb->span[ta] ? tb->mask(ta, o) : 0) | + (o >= off && o - off < tb->span[tb_] ? tb->mask(tb_, o - off) : 0); + if (!m) continue; + const int64_t u = root[a] + o; + const InstanceId h = cell(u, tb->e_dim); + if (h != kNoInstance && h != a && h != b && !(key(h) > km)) return false; + if (emask >> o & 1u) { + for (int32_t d = 0; d < tb->dims; ++d) { + const InstanceId j = cell(u, d); + if (j != kNoInstance && j != a && j != b && !(key(j) < km)) return false; + } + } + } + return true; + } + + // Right partner of left instance a under rule (left, right, off), or -1. + InstanceId right_of(InstanceId a, int32_t right, int32_t off) const { + const int64_t f = root[a] + off; + if (f >= frames) return kNoInstance; + const InstanceId b = cell(f, tb->rdim[right]); + if (b == kNoInstance || b == a || !alive[b] || tok[b] != right || root[b] != f) return kNoInstance; + return b; + } + + // Left partner of right instance b under rule (left, right, off), or -1. + InstanceId left_of(InstanceId b, int32_t left, int32_t off) const { + const int64_t f = root[b] - off; + if (f < 0) return kNoInstance; + const InstanceId a = cell(f, tb->rdim[left]); + if (a == kNoInstance || a == b || !alive[a] || tok[a] != left || root[a] != f) return kNoInstance; + return a; + } + + std::vector serialize() const { + std::vector live; + for (size_t i = 0; i < tok.size(); ++i) + if (alive[i]) live.push_back(static_cast(i)); + std::sort(live.begin(), live.end(), [&](InstanceId x, InstanceId y) { return key(x) < key(y); }); + std::vector out; + out.reserve(live.size()); + for (InstanceId i : live) out.push_back(tok[i]); + return out; + } +}; + +struct Stat { + bool retired = false; // a rule is learned at most once; leftovers stay unmerged + int64_t raw = 0; + uint32_t version = 0; + int64_t exact = -1; // matching- and validity-certified count at exact_version + uint32_t exact_version = 0; + int64_t added = 0; // cumulative pair insertions; bounds growth since certification + int64_t added_at_exact = 0; + uint32_t dirty_epoch = 0; // merge batch that last queued this key for re-push + bool live = false; // a heap entry (queued_version, queued_count) represents the key + uint32_t queued_version = 0; + int64_t queued_count = 0; +}; + +// Open-addressing rule table; references are invalidated only by inserting a new key. +class StatMap { + public: + Stat* find(uint64_t key) { + if (keys_.empty()) return nullptr; + for (size_t h = slot(key);; h = (h + 1) & (keys_.size() - 1)) { + if (keys_[h] == key) return &values_[h]; + if (keys_[h] == kEmpty) return nullptr; + } + } + Stat& operator[](uint64_t key) { + if ((used_ + 1) * 2 > keys_.size()) grow(); + size_t h = slot(key); + while (keys_[h] != kEmpty && keys_[h] != key) h = (h + 1) & (keys_.size() - 1); + if (keys_[h] == kEmpty) { + keys_[h] = key; + ++used_; + } + return values_[h]; + } + size_t size() const { return used_; } + template + void each(F&& visit) const { + for (size_t h = 0; h < keys_.size(); ++h) + if (keys_[h] != kEmpty) visit(keys_[h], values_[h]); + } + + private: + static constexpr uint64_t kEmpty = ~0ull; + size_t slot(uint64_t key) const { + return static_cast(mix(key) >> 20) & (keys_.size() - 1); + } + void grow() { + std::vector keys = std::move(keys_); + std::vector values = std::move(values_); + const size_t capacity = std::max(1 << 16, keys.size() * 2); + keys_.assign(capacity, kEmpty); + values_.assign(capacity, Stat{}); + used_ = 0; + for (size_t h = 0; h < keys.size(); ++h) + if (keys[h] != kEmpty) (*this)[keys[h]] = values[h]; + } + std::vector keys_; + std::vector values_; + size_t used_ = 0; +}; + +// Rule table split by key hash so disjoint shards can be updated concurrently. +class ShardedStats { + public: + Stat* find(uint64_t key) { return shards_[shard_of(key)].find(key); } + Stat& operator[](uint64_t key) { return shards_[shard_of(key)][key]; } + StatMap& shard(size_t p) { return shards_[p]; } + size_t size() const { + size_t n = 0; + for (const auto& s : shards_) n += s.size(); + return n; + } + template + void each(F&& visit) const { + for (const auto& s : shards_) s.each(visit); + } + + private: + StatMap shards_[kShards]; +}; + +struct Entry { + int64_t count; + uint64_t key; + uint32_t version; + bool operator<(const Entry& o) const { + if (count != o.count) return count < o.count; + return key > o.key; + } +}; + +class Trainer { + public: + Trainer(std::vector spatial_support, int32_t dims, int32_t lookahead, + int64_t vocab_size, bool allow_zero, int64_t min_count, int threads, + bool dense_census = false, int64_t max_instances = UINT32_MAX) + : vocab_size_(vocab_size), allow_zero_(allow_zero), dense_census_(dense_census), + min_count_(min_count), max_instances_(max_instances) { + if (max_instances_ < 1 || max_instances_ > UINT32_MAX) + throw std::invalid_argument("max_instances"); + tables_.init(spatial_support, dims, lookahead); +#ifdef _OPENMP + threads_ = threads > 0 ? threads : std::min(omp_get_max_threads(), 32); +#else + (void)threads; + threads_ = 1; +#endif + } + + // anchors: global frame index per instance (chunks already separated by >= lookahead). + void set_instances(py::array_t anchors, + py::array_t tokens, int64_t frames) { + auto a = anchors.unchecked<1>(); + auto t = tokens.unchecked<1>(); + if (a.shape(0) != t.shape(0)) throw std::invalid_argument("anchors/tokens length"); + if (a.shape(0) > max_instances_) + throw std::length_error("live instance capacity exceeded before training"); + st_.reset(&tables_, frames); + // Pre-sized so references into the outer vector stay valid while children are added. + occurrence_.assign(static_cast(vocab_size_) + 16, {}); + dead_.assign(static_cast(vocab_size_) + 16, 0); + for (py::ssize_t i = 0; i < a.shape(0); ++i) { + const int32_t tk = t(i); + if (tk < 0 || tk >= tables_.base) throw std::invalid_argument("token outside spatial vocab"); + occurrence_[tk].push_back(st_.add(tk, a(i))); + } + for (auto& occ : occurrence_) + std::sort(occ.begin(), occ.end(), [&](InstanceId x, InstanceId y) { return st_.root[x] < st_.root[y]; }); + initial_instances_ = a.shape(0); + // Supports never change, so frames preceded by >= lookahead empty frames split the + // axis into ranges whose merges never read or write each other's cells. + safe_.clear(); + int64_t empty = tables_.lookahead; + for (int64_t f = 0; f < frames; ++f) { + bool occupied = false; + for (int32_t d = 0; d < tables_.dims && !occupied; ++d) occupied = st_.cell(f, d) != kNoInstance; + if (!occupied) { + ++empty; + continue; + } + if (empty >= tables_.lookahead) safe_.push_back(f); + empty = 0; + } + } + + py::dict train(bool progress) { + const auto t0 = std::chrono::steady_clock::now(); + { + py::gil_scoped_release release; + census(); + std::vector keys; + keys.reserve(stats_.size()); + stats_.each([&](uint64_t k, const Stat&) { keys.push_back(k); }); + for (uint64_t k : keys) queue(k, stats_[k], stats_[k].raw); + initial_types_ = stats_.size(); + census_seconds_ = seconds_since(t0); + run(progress); + } + py::dict report; + report["initial_instances"] = initial_instances_; + report["final_instances"] = live_; + report["initial_rule_types"] = initial_types_; + report["merges"] = static_cast(merges_.size()); + report["dry_runs"] = dry_runs_; + report["rejected_by_validity"] = rejected_; + report["applied"] = applied_; + report["census_seconds"] = census_seconds_; + report["dry_run_seconds"] = dry_seconds_; + report["apply_seconds"] = apply_seconds_; + report["collect_seconds"] = collect_seconds_; + report["parallel_seconds"] = parallel_seconds_; + report["serial_seconds"] = serial_seconds_; + report["merge_seconds"] = merge_seconds_; + report["changes"] = changes_; + report["compactions"] = compactions_; + report["total_seconds"] = seconds_since(t0); + return report; + } + + std::vector> merges() const { return merges_; } + + // Count every forward pair once: blockwise parallel key generation, parallel sort, RLE. + void census() { + const int64_t n = static_cast(st_.tok.size()); + const int64_t base = tables_.base; + const int64_t universe = base * base * tables_.lookahead; + if (dense_census_ && universe <= 4000000) { + std::vector> local( + threads_, std::vector(static_cast(universe), 0)); +#ifdef _OPENMP +#pragma omp parallel num_threads(threads_) +#endif + { +#ifdef _OPENMP + auto& counts = local[omp_get_thread_num()]; +#else + auto& counts = local[0]; +#endif +#ifdef _OPENMP +#pragma omp for schedule(static) +#endif + for (int64_t i = 0; i < n; ++i) { + const InstanceId ii = static_cast(i); + st_.partners(ii, allow_zero_, [&](InstanceId a, InstanceId b, int32_t off) { + if (a == ii) { + const int64_t key = (static_cast(st_.tok[a]) * base + st_.tok[b]) * + tables_.lookahead + off; + ++counts[static_cast(key)]; + } + }); + } + } + for (int64_t key = 0; key < universe; ++key) { + int64_t count = 0; + for (const auto& counts : local) count += counts[static_cast(key)]; + if (!count) continue; + const int32_t offset = static_cast(key % tables_.lookahead); + const int64_t pair = key / tables_.lookahead; + const int32_t left = static_cast(pair / base); + const int32_t right = static_cast(pair % base); + stats_[rule_key(left, right, offset)].raw += count; + } + return; + } + const int64_t block = int64_t{1} << 22; + std::vector> local(threads_); + std::vector keys; + for (int64_t start = 0; start < n; start += block) { + const int64_t stop = std::min(n, start + block); +#ifdef _OPENMP +#pragma omp parallel num_threads(threads_) +#endif + { +#ifdef _OPENMP + auto& out = local[omp_get_thread_num()]; +#else + auto& out = local[0]; +#endif + out.clear(); +#ifdef _OPENMP +#pragma omp for schedule(static) +#endif + for (int64_t i = start; i < stop; ++i) { + const InstanceId ii = static_cast(i); + st_.partners(ii, allow_zero_, [&](InstanceId a, InstanceId b, int32_t off) { + if (a == ii) out.push_back(rule_key(st_.tok[a], st_.tok[b], off)); + }); + } + } + keys.clear(); + for (auto& v : local) keys.insert(keys.end(), v.begin(), v.end()); + AC2_PARALLEL_SORT(keys.begin(), keys.end()); + for (size_t k = 0; k < keys.size();) { + size_t e = k; + while (e < keys.size() && keys[e] == keys[k]) ++e; + stats_[keys[k]].raw += static_cast(e - k); + k = e; + } + } + } + + private: + // Reclaim dead slots without changing token order, coverage, or candidate statistics. + void compact_instances() { + std::vector remap(st_.tok.size(), kNoInstance); + std::vector tokens; + std::vector roots; + std::vector alive; + tokens.reserve(static_cast(live_)); + roots.reserve(static_cast(live_)); + alive.reserve(static_cast(live_)); + for (size_t old = 0; old < st_.tok.size(); ++old) { + if (!st_.alive[old]) continue; + remap[old] = static_cast(tokens.size()); + tokens.push_back(st_.tok[old]); + roots.push_back(st_.root[old]); + alive.push_back(1); + } + if (tokens.size() != static_cast(live_)) + throw std::runtime_error("instance compaction live count mismatch"); + for (auto& occ : occurrence_) { + size_t next = 0; + for (InstanceId old : occ) { + const InstanceId mapped = remap[static_cast(old)]; + if (mapped != kNoInstance) occ[next++] = mapped; + } + occ.resize(next); + } + for (auto& slot : st_.member) + if (slot != kNoInstance) slot = remap[static_cast(slot)]; + st_.tok.swap(tokens); + st_.root.swap(roots); + st_.alive.swap(alive); + std::fill(dead_.begin(), dead_.end(), 0); + ++compactions_; + } + + void change(uint64_t k, int64_t delta, StatMap& table, std::vector& dirty) { + Stat& s = table[k]; + s.raw += delta; + if (delta > 0) s.added += delta; + ++s.version; + if (s.dirty_epoch != epoch_) { + s.dirty_epoch = epoch_; + dirty.push_back(k); + } + } + + std::vector& lefts(int32_t left) { + auto& occ = occurrence_[left]; + // Lists are root-sorted by construction: atoms are sorted once, and every child list + // is appended in the root order of its single merge batch. + if (dead_[left] * 4 > static_cast(occ.size())) { + occ.erase(std::remove_if(occ.begin(), occ.end(), [&](InstanceId i) { return !st_.alive[i]; }), + occ.end()); + dead_[left] = 0; + } + return occ; + } + + static double seconds_since(std::chrono::steady_clock::time_point t) { + return std::chrono::duration(std::chrono::steady_clock::now() - t).count(); + } + + // Candidate (a, b) pairs are visited in increasing root order of a by scanning the + // shorter occurrence list; the partner is one cell lookup away in either direction. + const std::vector& scanned(int32_t left, int32_t right, bool& forward) const { + const auto& lo = occurrence_[left]; + const auto& ro = occurrence_[right]; + forward = left == right || lo.size() <= ro.size(); + return forward ? lo : ro; + } + + template + void pairs_in(int32_t left, int32_t right, int32_t off, size_t begin, size_t end, + F&& visit) const { + bool forward; + const auto& scan = scanned(left, right, forward); + for (size_t i = begin; i < end; ++i) { + const InstanceId x = scan[i]; + if (!st_.alive[x]) continue; + if (forward) { + const InstanceId b = st_.right_of(x, right, off); + if (b != kNoInstance) visit(x, b); + } else { + const InstanceId a = st_.left_of(x, left, off); + if (a != kNoInstance) visit(a, x); + } + } + } + + // Cuts of a root-sorted list into blocks of about ``grain`` entries at safe frames, so + // per-block replay (self-rule chains included) equals one sequential pass. + std::vector blocks(const std::vector& scan, size_t grain) const { + std::vector cuts{0}; + for (size_t next = grain; next < scan.size();) { + auto frame = std::upper_bound(safe_.begin(), safe_.end(), st_.root[scan[next]]); + if (frame == safe_.end()) break; + const size_t at = static_cast( + std::lower_bound(scan.begin() + next, scan.end(), *frame, + [&](InstanceId i, int64_t f) { return st_.root[i] < f; }) - + scan.begin()); + if (at >= scan.size()) break; + cuts.push_back(at); + next = at + grain; + } + cuts.push_back(scan.size()); + return cuts; + } + + // Candidate pairs in scan order, gathered by blocks in parallel. + std::vector> collect(int32_t left, int32_t right, int32_t off) const { + bool forward; + const std::vector cuts = blocks(scanned(left, right, forward), 1 << 16); + std::vector>> parts(cuts.size() - 1); +#ifdef _OPENMP +#pragma omp parallel for schedule(dynamic, 1) num_threads(threads_) if (parts.size() > 1) +#endif + for (size_t k = 0; k < parts.size(); ++k) + pairs_in(left, right, off, cuts[k], cuts[k + 1], + [&](InstanceId a, InstanceId b) { parts[k].emplace_back(a, b); }); + std::vector> pairs; + for (auto& part : parts) pairs.insert(pairs.end(), part.begin(), part.end()); + return pairs; + } + + // Exact count of one block under the real merge's matching and validity tests. + int64_t count_exact(int32_t left, int32_t right, int32_t off, size_t begin, size_t end) const { + int64_t n = 0; + // Self rules chain: a may be the right half of a recent match (roots increase). + std::vector recent; + size_t head = 0; + pairs_in(left, right, off, begin, end, [&](InstanceId a, InstanceId b) { + if (left == right) { + while (head < recent.size() && st_.root[recent[head]] < st_.root[a]) ++head; + if (std::find(recent.begin() + head, recent.end(), a) != recent.end()) return; + } + if (!st_.valid(a, b, off)) return; + if (left == right) recent.push_back(b); + ++n; + }); + return n; + } + + // Certifies a batch of keys; every key is split into blocks so one large list does + // not serialize the batch. Read-only on shared state. + void certify(std::vector& batch) { + struct Timer { + double& sink; + std::chrono::steady_clock::time_point t; + ~Timer() { sink += seconds_since(t); } + } timer{dry_seconds_, std::chrono::steady_clock::now()}; + dry_runs_ += static_cast(batch.size()); + struct Task { + size_t key, begin, end; + }; + std::vector tasks; + for (size_t k = 0; k < batch.size(); ++k) { + int32_t l, r, o; + unpack(batch[k].key, l, r, o); + lefts(l); // compaction mutates lists: do it before the parallel region + lefts(r); + bool forward; + const std::vector cuts = blocks(scanned(l, r, forward), 1 << 15); + for (size_t c = 0; c + 1 < cuts.size(); ++c) tasks.push_back({k, cuts[c], cuts[c + 1]}); + } + std::vector partial(tasks.size()); +#ifdef _OPENMP +#pragma omp parallel for schedule(dynamic, 1) num_threads(threads_) +#endif + for (size_t t = 0; t < tasks.size(); ++t) { + int32_t l, r, o; + unpack(batch[tasks[t].key].key, l, r, o); + partial[t] = count_exact(l, r, o, tasks[t].begin, tasks[t].end); + } + std::vector exact(batch.size(), 0); + for (size_t t = 0; t < tasks.size(); ++t) exact[tasks[t].key] += partial[t]; + for (size_t k = 0; k < batch.size(); ++k) { + Stat& s = stats_[batch[k].key]; + s.exact = exact[k]; + s.exact_version = s.version; + s.added_at_exact = s.added; + if (s.exact >= min_count_) queue(batch[k].key, s, s.exact); + } + } + + // Pairs are applied in root order; ranges split at safe frames are independent, so + // each is replayed sequentially by one thread with exactly the serial outcome. + void apply(int32_t left, int32_t right, int32_t off, int32_t child) { + struct Timer { + double& sink; + std::chrono::steady_clock::time_point t; + ~Timer() { sink += seconds_since(t); } + } timer{apply_seconds_, std::chrono::steady_clock::now()}; + lefts(left); + lefts(right); + // Candidates are collected first: applying merges kills instances in both lists. + const auto collect_start = std::chrono::steady_clock::now(); + std::vector> pairs = collect(left, right, off); + if (st_.tok.size() + pairs.size() > static_cast(max_instances_)) { + pairs.clear(); + pairs.shrink_to_fit(); + compact_instances(); + pairs = collect(left, right, off); + if (st_.tok.size() + pairs.size() > static_cast(max_instances_)) + throw std::length_error("live instance capacity exceeded after compaction"); + } + collect_seconds_ += seconds_since(collect_start); + const std::vector cuts = split(pairs); + const size_t groups = cuts.size() - 1; + const InstanceId base = st_.reserve(pairs.size()); + if (pool_.size() < groups) pool_.resize(groups, std::vector(kShards)); + dirty_shards_.resize(kShards); + std::vector> born(groups); + std::vector applied(groups, 0), rejected(groups, 0); + const auto loop_start = std::chrono::steady_clock::now(); +#ifdef _OPENMP +#pragma omp parallel for schedule(dynamic, 1) num_threads(std::min(threads_, groups)) +#endif + for (size_t g = 0; g < groups; ++g) { + auto& delta = pool_[g]; + auto add = [&](uint64_t key, int64_t d) { delta[shard_of(key)].add(key, d); }; + for (size_t k = cuts[g]; k < cuts[g + 1]; ++k) { + const InstanceId a = pairs[k].first, b = pairs[k].second; + if (!st_.alive[a] || !st_.alive[b]) continue; + if (!st_.valid(a, b, off)) { + ++rejected[g]; + continue; + } + st_.partners(a, allow_zero_, [&](InstanceId x, InstanceId y, int32_t o) { + add(rule_key(st_.tok[x], st_.tok[y], o), -1); + }); + st_.partners(b, allow_zero_, [&](InstanceId x, InstanceId y, int32_t o) { + if (x != a && y != a) add(rule_key(st_.tok[x], st_.tok[y], o), -1); + }); + const int64_t r = st_.root[a]; + st_.kill(a); + st_.kill(b); + const InstanceId m = base + static_cast(k); + st_.tok[m] = child; + st_.root[m] = r; + st_.place(m); + born[g].push_back(m); + st_.partners(m, allow_zero_, [&](InstanceId x, InstanceId y, int32_t o) { + add(rule_key(st_.tok[x], st_.tok[y], o), +1); + }); + ++applied[g]; + } + } + (groups > 1 ? parallel_seconds_ : serial_seconds_) += seconds_since(loop_start); + const auto merge_start = std::chrono::steady_clock::now(); + std::vector changes(kShards, 0); +#ifdef _OPENMP +#pragma omp parallel for schedule(dynamic, 1) num_threads(threads_) if (groups > 1) +#endif + for (size_t p = 0; p < kShards; ++p) { + StatMap& table = stats_.shard(p); + for (size_t g = 0; g < groups; ++g) { + pool_[g][p].each([&](uint64_t k, int64_t d) { + change(k, d, table, dirty_shards_[p]); + ++changes[p]; + }); + pool_[g][p].clear(); + } + } + for (size_t p = 0; p < kShards; ++p) { + dirty_.insert(dirty_.end(), dirty_shards_[p].begin(), dirty_shards_[p].end()); + dirty_shards_[p].clear(); + changes_ += changes[p]; + } + for (size_t g = 0; g < groups; ++g) { + auto& occ = occurrence_[child]; + occ.insert(occ.end(), born[g].begin(), born[g].end()); + dead_[left] += applied[g]; + dead_[right] += applied[g]; + applied_ += applied[g]; + rejected_ += rejected[g]; + live_ -= applied[g]; + } + merge_seconds_ += seconds_since(merge_start); + } + + // Cut root-ordered pairs into contiguous groups at safe frames. + std::vector split(const std::vector>& pairs) const { + std::vector cuts{0}; + const size_t n = pairs.size(); + const size_t groups = std::max(1, std::min(threads_, n / kApplyGrain)); + for (size_t g = 1; g < groups; ++g) { + const size_t target = std::max(cuts.back(), n * g / groups); + if (target >= n) break; + auto frame = std::upper_bound(safe_.begin(), safe_.end(), st_.root[pairs[target].first]); + if (frame == safe_.end()) break; + const size_t cut = static_cast( + std::lower_bound(pairs.begin() + target, pairs.end(), *frame, + [&](const std::pair& p, int64_t f) { + return st_.root[p.first] < f; + }) - + pairs.begin()); + if (cut > cuts.back() && cut < n) cuts.push_back(cut); + } + cuts.push_back(n); + return cuts; + } + + static bool certified(const Stat& s) { return s.exact >= 0 && s.exact_version == s.version; } + + static int64_t bound(const Stat& s) { + if (certified(s)) return s.exact; + return s.exact >= 0 ? std::min(s.raw, s.exact + s.added - s.added_at_exact) : s.raw; + } + + void queue(uint64_t key, Stat& s, int64_t count) { + heap_.push({count, key, s.version}); + s.live = true; + s.queued_version = s.version; + s.queued_count = count; + } + + bool take(Entry& e, Stat*& s) { + e = heap_.top(); + heap_.pop(); + s = stats_.find(e.key); + if (!s || s->retired || !s->live || e.version != s->queued_version) return false; + s->live = false; + if (e.version == s->version) return true; + const int64_t b = bound(*s); + if (b > 0) queue(e.key, *s, b); + return false; + } + + bool current_certified(const Entry& e) { + const Stat* s = stats_.find(e.key); + return s && !s->retired && s->live && e.version == s->queued_version && + e.version == s->version && certified(*s); + } + + void run(bool progress) { + live_ = initial_instances_; + while (tables_.size() < vocab_size_ && !heap_.empty()) { + Entry top; + Stat* found; + if (!take(top, found)) continue; + Stat& s = *found; + if (!certified(s)) { + std::vector batch{top}; + while (!heap_.empty() && batch.size() < kCertifyBatch) { + if (current_certified(heap_.top())) break; + Entry e; + Stat* next; + if (take(e, next)) batch.push_back(e); + } + certify(batch); + continue; + } + if (top.count != s.exact) continue; + if (s.exact < min_count_) continue; + int32_t l, r, o; + unpack(top.key, l, r, o); + std::vector m; + if (!tables_.compose(l, r, o, m)) { + s.exact = 0; + continue; + } + const int32_t child = tables_.add_merge(l, r, o); + merges_.emplace_back(l, r, o); + s.retired = true; + dirty_.clear(); + ++epoch_; + apply(l, r, o, child); + // Lazy decrease-key: only a grown bound needs a new entry now. + for (uint64_t k : dirty_) { + Stat& d = stats_[k]; + if (d.retired) continue; + const int64_t b = bound(d); + if (b > 0 && (!d.live || b > d.queued_count)) queue(k, d, b); + } + dirty_.clear(); + if (progress && merges_.size() % 256 == 0) { + py::gil_scoped_acquire acquire; + py::print("sparse temporal merges", merges_.size(), "live", live_, py::arg("flush") = true); + } + } + } + + Tables tables_; + Instances st_; + int64_t vocab_size_; + bool allow_zero_; + bool dense_census_; + int64_t min_count_; + int64_t max_instances_; + std::vector> occurrence_; + ShardedStats stats_; + std::vector> pool_; // [apply group][shard] + std::vector> dirty_shards_; // [shard] + std::priority_queue heap_; + std::vector dirty_; + std::vector> merges_; + std::vector dead_; + std::vector safe_; + uint32_t epoch_ = 0; + int threads_ = 1; + int64_t initial_instances_ = 0, live_ = 0, dry_runs_ = 0, rejected_ = 0, applied_ = 0; + int64_t compactions_ = 0; + size_t initial_types_ = 0; + int64_t changes_ = 0; + double census_seconds_ = 0, dry_seconds_ = 0, apply_seconds_ = 0, collect_seconds_ = 0, + parallel_seconds_ = 0, serial_seconds_ = 0, merge_seconds_ = 0; +}; + +struct Spatial { + std::vector offsets; + std::vector support; + std::vector> expansion; // token -> value per sparse slot (-1 absent) + std::unordered_map> rules; // (lo, hi) -> (child, rank) + int32_t dims = 0; + + static uint64_t pair_key(int32_t a, int32_t b) { + if (a > b) std::swap(a, b); + return (static_cast(a) << 32) | static_cast(b); + } + + void init(const std::vector& bins, const std::vector>& merges) { + dims = static_cast(bins.size()); + offsets.assign(1, 0); + for (int64_t b : bins) { + if (b < 1) throw std::invalid_argument("every sparse slot needs at least one value"); + offsets.push_back(offsets.back() + b); + } + for (int32_t d = 0; d < dims; ++d) + for (int64_t v = 0; v < bins[d]; ++v) { + support.push_back(1u << d); + std::vector e(dims, -1); + e[d] = static_cast(v); + expansion.push_back(std::move(e)); + } + const int32_t atoms = static_cast(support.size()); + for (size_t r = 0; r < merges.size(); ++r) { + const auto [a, b] = merges[r]; + const int32_t child = atoms + static_cast(r); + if (a < 0 || b < 0 || a >= child || b >= child || (support[a] & support[b])) + throw std::invalid_argument("invalid spatial merge"); + support.push_back(support[a] | support[b]); + std::vector e(dims); + for (int32_t d = 0; d < dims; ++d) e[d] = std::max(expansion[a][d], expansion[b][d]); + expansion.push_back(std::move(e)); + rules.emplace(pair_key(a, b), std::make_pair(child, static_cast(r))); + } + } + + std::vector encode(const int32_t* row) const { + std::set tokens; + for (int32_t d = 0; d < dims; ++d) + if (row[d] >= 0) tokens.insert(static_cast(offsets[d] + row[d])); + using Item = std::tuple; + std::priority_queue, std::greater> heap; + auto offer = [&](int32_t a, int32_t b) { + auto it = rules.find(pair_key(a, b)); + if (it != rules.end()) + heap.emplace(it->second.second, it->second.first, std::min(a, b), std::max(a, b)); + }; + for (auto i = tokens.begin(); i != tokens.end(); ++i) + for (auto j = std::next(i); j != tokens.end(); ++j) offer(*i, *j); + while (!heap.empty()) { + const auto [rank, child, left, right] = heap.top(); + heap.pop(); + if (!tokens.count(left) || !tokens.count(right)) continue; + tokens.erase(left); + tokens.erase(right); + for (int32_t other : tokens) offer(child, other); + tokens.insert(child); + } + return {tokens.begin(), tokens.end()}; + } +}; + +// Runtime codec over dense primitive cells ``(T, D)`` with ``-1`` for inactive slots. +class SparseCodec { + public: + SparseCodec(std::vector bins, std::vector zero, + std::vector> spatial_merges, int32_t lookahead, + std::vector> temporal_merges) + : bins_(std::move(bins)), zero_(std::move(zero)) { + if (bins_.empty() || bins_.size() != zero_.size()) + throw std::invalid_argument("bins and zero must have one entry per slot"); + dims_ = static_cast(bins_.size()); + std::vector sparse; + for (int32_t d = 0; d < dims_; ++d) { + // -2 retains every dense value; -1 change-codes an absolute slot. + if (zero_[d] >= bins_[d] || zero_[d] < -2) throw std::invalid_argument("zero index"); + sparse.push_back(bins_[d] - (zero_[d] >= 0)); + } + sparse.push_back(1); // E + spatial_.init(sparse, spatial_merges); + tables_.init(spatial_.support, dims_ + 1, lookahead); + for (size_t r = 0; r < temporal_merges.size(); ++r) { + auto [a, b, o] = temporal_merges[r]; + if (a < 0 || b < 0 || a >= tables_.size() || b >= tables_.size()) + throw std::invalid_argument("merge order"); + tables_.add_merge(a, b, o); + if (!rank_.emplace(rule_key(a, b, o), static_cast(r)).second) + throw std::invalid_argument("duplicate temporal rule"); + } + } + + int32_t vocab_size() const { return tables_.size(); } + int32_t spatial_vocab_size() const { return static_cast(spatial_.support.size()); } + + std::vector> encode_batch( + const py::array_t& cells, + int threads) const { + if (cells.ndim() != 3 || cells.shape(2) != dims_ || cells.shape(0) < 1 || cells.shape(1) < 1) + throw std::invalid_argument("cells must have shape (B, T, D) with B, T >= 1"); + const int64_t batch = cells.shape(0), steps = cells.shape(1); + const int32_t* data = cells.data(); + std::vector> out(batch); + { + py::gil_scoped_release release; + ac2::parallel_for(batch, threads, [&](int64_t b) { + out[b] = encode_one(data + b * steps * dims_, steps); + }); + } + return out; + } + + py::array_t decode_batch(const std::vector>& rows, + int64_t horizon, const std::vector& active) const { + if (horizon < 1) throw std::invalid_argument("horizon must be positive"); + if (static_cast(active.size()) != dims_) + throw std::invalid_argument("active must have one flag per slot"); + py::array_t out({static_cast(rows.size()), horizon, int64_t{dims_}}); + int32_t* data = out.mutable_data(); + for (size_t k = 0; k < rows.size(); ++k) decode_one(rows[k], horizon, active, data + k * horizon * dims_); + return out; + } + + // Spatial tokens of sparse frames ``(N, D + 1)``: per-frame counts and flat tokens. + py::tuple spatial_encode( + const py::array_t& frames) const { + if (frames.ndim() != 2 || frames.shape(1) != dims_ + 1) + throw std::invalid_argument("frames must have shape (N, D + 1)"); + const int64_t n = frames.shape(0); + py::array_t counts(n); + std::vector flat; + for (int64_t i = 0; i < n; ++i) { + const int32_t* row = frames.data() + i * (dims_ + 1); + for (int32_t d = 0; d <= dims_; ++d) + if (row[d] >= static_cast(spatial_.offsets[d + 1] - spatial_.offsets[d])) + throw std::invalid_argument("sparse value out of range"); + const auto tokens = spatial_.encode(row); + counts.mutable_data()[i] = static_cast(tokens.size()); + flat.insert(flat.end(), tokens.begin(), tokens.end()); + } + return py::make_tuple(counts, py::array_t(flat.size(), flat.data())); + } + + std::vector>> patterns() const { return tables_.pattern; } + + private: + // Dense chunk -> sparse frames (T, D + 1); validates slot activity and ranges. + std::vector sparsify(const int32_t* cells, int64_t steps) const { + const int32_t width = dims_ + 1; + std::vector sparse(static_cast(steps) * width, -1); + int64_t last = -1; + for (int32_t d = 0; d < dims_; ++d) { + const bool active = cells[d] >= 0; + for (int64_t t = 0; t < steps; ++t) { + const int32_t v = cells[t * dims_ + d]; + if ((v >= 0) != active) + throw std::invalid_argument("a slot must be active for the whole chunk or not at all"); + if (v >= bins_[d]) throw std::invalid_argument("cell outside the primitive range"); + if (!active) continue; + int32_t s = -1; + if (zero_[d] == -2) { + s = v; + } else if (zero_[d] < 0) { + if (t == 0 || v != cells[(t - 1) * dims_ + d]) s = v; + } else if (v != zero_[d]) { + s = v - (v > zero_[d]); + } + sparse[t * width + d] = s; + if (s >= 0) last = std::max(last, t); + } + } + for (int64_t t = 0; t < last; ++t) sparse[t * width + dims_] = 0; + return sparse; + } + + std::vector encode_one(const int32_t* cells, int64_t steps) const { + const std::vector sparse = sparsify(cells, steps); + Instances s; + s.reset(&tables_, steps + tables_.lookahead); + for (int64_t t = 0; t < steps; ++t) + for (int32_t token : spatial_.encode(sparse.data() + t * (dims_ + 1))) s.add(token, t); + using Cand = std::tuple; + std::priority_queue, std::greater> heap; + auto offer = [&](InstanceId i) { + s.partners(i, true, [&](InstanceId a, InstanceId b, int32_t off) { + auto it = rank_.find(rule_key(s.tok[a], s.tok[b], off)); + if (it == rank_.end()) return; + heap.emplace(it->second, s.root[a], tables_.rdim[s.tok[a]], s.root[b], a, b, off); + }); + }; + for (size_t i = 0; i < s.tok.size(); ++i) offer(static_cast(i)); + while (!heap.empty()) { + auto [r, ra, da, rb, a, b, off] = heap.top(); + heap.pop(); + if (!s.alive[a] || !s.alive[b] || !s.valid(a, b, off)) continue; + const int64_t root = s.root[a]; + s.kill(a); + s.kill(b); + offer(s.add(tables_.base + r, root)); + } + return s.serialize(); + } + + void decode_one(const std::vector& row, int64_t horizon, + const std::vector& active, int32_t* cells) const { + const int32_t L = tables_.lookahead, width = dims_ + 1; + uint32_t allowed = 1u << dims_; + for (int32_t d = 0; d < dims_; ++d) + if (active[d]) allowed |= 1u << d; + std::vector cover(horizon + L, 0); + std::vector sparse(static_cast(horizon) * width, -1); + int64_t front = 0; + std::vector own(L, 0); + std::vector frames; + for (int32_t token : row) { + if (token < 0 || token >= tables_.size()) throw std::invalid_argument("token outside vocab"); + if (front >= horizon) throw std::invalid_argument("token after the last open frame"); + frames.clear(); + for (auto [o, t] : tables_.pattern[token]) { + const int64_t u = front + o; + const uint32_t m = spatial_.support[t]; + if (u >= horizon) throw std::invalid_argument("token exceeds horizon"); + if (m & ~allowed) throw std::invalid_argument("token touches an inactive slot"); + if (m & own[o]) throw std::invalid_argument("overlapping token supports"); + if ((m >> dims_ & 1u) && u == horizon - 1) + throw std::invalid_argument("end-of-frame atom on the last frame"); + if (!own[o]) frames.push_back(o); + own[o] |= m; + for (int32_t d = 0; d < width; ++d) + if (spatial_.expansion[t][d] >= 0) sparse[u * width + d] = spatial_.expansion[t][d]; + } + for (int32_t o : frames) { + const int64_t u = front + o; + if (cover[u] & own[o]) throw std::invalid_argument("overlapping token supports"); + if (cover[u] >> dims_ & 1u) throw std::invalid_argument("token touches a closed frame"); + cover[u] |= own[o]; + own[o] = 0; + } + while (front < horizon && (cover[front] >> dims_ & 1u)) ++front; + } + for (int32_t d = 0; d < dims_; ++d) { + int32_t carried = -1; + for (int64_t t = 0; t < horizon; ++t) { + const int32_t v = sparse[t * width + d]; + int32_t& out = cells[t * dims_ + d]; + if (!active[d]) { + out = -1; + } else if (zero_[d] == -2) { + if (v < 0) throw std::invalid_argument("dense active slot is missing"); + out = v; + } else if (zero_[d] < 0) { + if (v >= 0) carried = v; + if (carried < 0) throw std::invalid_argument("an absolute slot must be stated on frame 0"); + out = carried; + } else { + out = v < 0 ? static_cast(zero_[d]) : v + (v >= zero_[d]); + } + } + } + } + + std::vector bins_, zero_; + int32_t dims_ = 0; + Spatial spatial_; + Tables tables_; + std::unordered_map rank_; +}; + +} // namespace + +void register_sparse(py::module_& m) { + py::class_(m, "SparseTrainer") + .def(py::init, int32_t, int32_t, int64_t, bool, int64_t, int, bool, int64_t>(), + py::arg("spatial_support"), py::arg("dims"), py::arg("lookahead"), + py::arg("vocab_size"), py::arg("allow_zero_offset"), py::arg("min_count") = 2, + py::arg("threads") = 0, py::arg("dense_census") = false, + py::arg("max_instances") = UINT32_MAX) + .def("set_instances", &Trainer::set_instances) + .def("train", &Trainer::train, py::arg("progress") = false) + .def("merges", &Trainer::merges); + py::class_(m, "SparseCodec") + .def(py::init, std::vector, + std::vector>, int32_t, + std::vector>>(), + py::arg("bins"), py::arg("zero"), py::arg("spatial_merges"), py::arg("lookahead"), + py::arg("temporal_merges")) + .def_property_readonly("vocab_size", &SparseCodec::vocab_size) + .def_property_readonly("spatial_vocab_size", &SparseCodec::spatial_vocab_size) + .def("encode_batch", &SparseCodec::encode_batch, py::arg("cells"), py::arg("threads") = 0) + .def("decode_batch", &SparseCodec::decode_batch, py::arg("rows"), py::arg("horizon"), + py::arg("active")) + .def("spatial_encode", &SparseCodec::spatial_encode, py::arg("frames")) + .def("patterns", &SparseCodec::patterns); +} diff --git a/actioncodec2_kernels/spatial.cpp b/actioncodec2_kernels/spatial.cpp new file mode 100644 index 0000000000000000000000000000000000000000..32d8bb6644a3398199d4728c486fc7ba49245cb7 --- /dev/null +++ b/actioncodec2_kernels/spatial.cpp @@ -0,0 +1,297 @@ + +#include +#include +#include + +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +#include "common.hpp" + +namespace py = pybind11; + +namespace { + +inline uint64_t pair_key(int32_t left, int32_t right) { + uint32_t low = static_cast(left < right ? left : right); + uint32_t high = static_cast(left < right ? right : left); + return (static_cast(low) << 32) | high; +} + +struct Corpus { + int64_t records = 0; + int32_t width = 0; // slots per record == action dimension + std::vector member; // [records * width], -1 when free + std::vector weights; // [records] +}; + +} // namespace + +py::tuple train_spatial_native(py::array_t codes, + py::array_t weights, + const std::vector& bins, int64_t vocab_size, + int threads) { + auto codes_view = codes.unchecked<2>(); + auto weights_view = weights.unchecked<1>(); + const int64_t records = codes_view.shape(0); + const int32_t dimension = static_cast(codes_view.shape(1)); + if (dimension != static_cast(bins.size())) { + throw std::invalid_argument("codes must have one column per bin count"); + } + if (weights_view.shape(0) != records) { + throw std::invalid_argument("weights must have one entry per record"); + } + + std::vector offsets(dimension + 1, 0); + for (int32_t index = 0; index < dimension; ++index) offsets[index + 1] = offsets[index] + bins[index]; + const int32_t atom_count = offsets[dimension]; + if (vocab_size < atom_count) { + throw std::invalid_argument("vocab_size is below the number of primitive atoms"); + } + +#ifdef _OPENMP + const int thread_count = threads > 0 ? threads : omp_get_max_threads(); +#else + (void)threads; + const int thread_count = 1; +#endif + + Corpus corpus; + corpus.records = records; + corpus.width = dimension; + corpus.member.resize(static_cast(records) * dimension); + corpus.weights.resize(records); + int64_t total_weight = 0; + int64_t initial_length = 0; + for (int64_t record = 0; record < records; ++record) { + corpus.weights[record] = weights_view(record); + total_weight += weights_view(record); + int32_t active = 0; + for (int32_t slot = 0; slot < dimension; ++slot) { + const int32_t value = codes_view(record, slot); + if (value < -1 || value >= bins[slot]) { + throw std::invalid_argument("a cell index is outside its coordinate's bin count"); + } + if (value < 0) { + corpus.member[static_cast(record) * dimension + slot] = -1; + } else { + corpus.member[static_cast(record) * dimension + slot] = offsets[slot] + value; + ++active; + } + } + if (active == 0) throw std::invalid_argument("every record needs an active coordinate"); + initial_length += weights_view(record) * active; + } + + // Occurrence sets, kept sorted so intersections and differences are linear. + std::vector> occurrence(atom_count); + for (int32_t slot = 0; slot < dimension; ++slot) { + for (int64_t record = 0; record < records; ++record) { + const int32_t token = corpus.member[static_cast(record) * dimension + slot]; + if (token >= 0) occurrence[token].push_back(static_cast(record)); + } + } + for (auto& members : occurrence) std::sort(members.begin(), members.end()); + + // --- initial census ------------------------------------------------------- + ac2::CounterMap counts(static_cast(records) * 4 + 64); + { + std::vector shards; + shards.reserve(thread_count); + for (int index = 0; index < thread_count; ++index) shards.emplace_back(1024); +#ifdef _OPENMP +#pragma omp parallel num_threads(thread_count) +#endif + { +#ifdef _OPENMP + const int thread = omp_get_thread_num(); +#else + const int thread = 0; +#endif + ac2::CounterMap& local = shards[thread]; +#ifdef _OPENMP +#pragma omp for schedule(static) +#endif + for (int64_t record = 0; record < records; ++record) { + const int32_t* row = &corpus.member[static_cast(record) * dimension]; + const int64_t weight = corpus.weights[record]; + for (int32_t a = 0; a < dimension; ++a) { + if (row[a] < 0) continue; + for (int32_t b = a + 1; b < dimension; ++b) { + if (row[b] < 0) continue; + local.add(pair_key(row[a], row[b]), weight); + } + } + } + } + for (auto& shard : shards) { + shard.for_each([&](uint64_t key, int64_t value) { counts.add(key, value); }); + } + } + + std::vector heap; + heap.reserve(counts.size()); + counts.for_each([&](uint64_t key, int64_t value) { heap.push_back({value, key, 0}); }); + std::make_heap(heap.begin(), heap.end(), ac2::HeapOrder{}); + const size_t initial_pair_types = heap.size(); + + // --- greedy merging ------------------------------------------------------- + std::vector> merges; + merges.reserve(static_cast(vocab_size - atom_count)); + int64_t length = initial_length; // total active tokens over the corpus + int64_t heap_pops = 0; + int64_t counter_updates = 0; + + std::vector matched; + std::vector remainder; + std::vector affected; + std::vector stamp(static_cast(vocab_size) + 16, 0); + int32_t generation = 0; + std::vector deltas; + deltas.reserve(thread_count); + for (int index = 0; index < thread_count; ++index) deltas.emplace_back(1024); + + while (static_cast(merges.size()) + atom_count < vocab_size) { + int32_t left = -1; + int32_t right = -1; + int64_t frequency = 0; + while (!heap.empty()) { + const ac2::HeapEntry top = ac2::heap_pop(heap); + ++heap_pops; + const int64_t current = counts.get(top.key); + if (current <= 0) continue; + if (current != top.count) continue; // a fresher entry for this key exists + left = static_cast(top.key >> 32); + right = static_cast(top.key & 0xffffffffu); + frequency = current; + break; + } + if (left < 0) break; // every record has collapsed to a single token + + matched.clear(); + std::set_intersection(occurrence[left].begin(), occurrence[left].end(), + occurrence[right].begin(), occurrence[right].end(), + std::back_inserter(matched)); + if (matched.empty()) { // cannot happen while counters are exact + counts.add(pair_key(left, right), -frequency); + continue; + } + + const int32_t child = static_cast(occurrence.size()); + occurrence.emplace_back(); + + const bool parallel = matched.size() > 4096 && thread_count > 1; + if (parallel) { + for (auto& shard : deltas) shard = ac2::CounterMap(1024); + } +#ifdef _OPENMP +#pragma omp parallel if (parallel) num_threads(thread_count) +#endif + { +#ifdef _OPENMP + const int thread = parallel ? omp_get_thread_num() : 0; +#else + const int thread = 0; +#endif + ac2::CounterMap& local = parallel ? deltas[thread] : counts; +#ifdef _OPENMP +#pragma omp for schedule(static) +#endif + for (int64_t index = 0; index < static_cast(matched.size()); ++index) { + const int32_t record = matched[index]; + const int32_t* row = &corpus.member[static_cast(record) * dimension]; + const int64_t weight = corpus.weights[record]; + for (int32_t slot = 0; slot < dimension; ++slot) { + const int32_t other = row[slot]; + if (other < 0 || other == left || other == right) continue; + local.add(pair_key(left, other), -weight); + local.add(pair_key(right, other), -weight); + local.add(pair_key(child, other), weight); + } + } + } + if (parallel) { + for (auto& shard : deltas) { + shard.for_each([&](uint64_t key, int64_t value) { counts.add(key, value); }); + } + } + + // Rewrite the touched rows: the child takes the left parent's slot. + for (const int32_t record : matched) { + int32_t* row = &corpus.member[static_cast(record) * dimension]; + for (int32_t slot = 0; slot < dimension; ++slot) { + if (row[slot] == left) { + row[slot] = child; + } else if (row[slot] == right) { + row[slot] = -1; + } + } + } + + counts.add(pair_key(left, right), -frequency); + counter_updates += static_cast(matched.size()) * dimension; + + occurrence[child] = matched; + for (const int32_t parent : {left, right}) { + remainder.clear(); + std::set_difference(occurrence[parent].begin(), occurrence[parent].end(), matched.begin(), + matched.end(), std::back_inserter(remainder)); + occurrence[parent].swap(remainder); + } + + affected.clear(); + if (static_cast(child) >= stamp.size()) stamp.resize(child + 1024, 0); + ++generation; + for (const int32_t record : matched) { + const int32_t* row = &corpus.member[static_cast(record) * dimension]; + for (int32_t slot = 0; slot < dimension; ++slot) { + const int32_t other = row[slot]; + if (other < 0 || other == child) continue; + if (stamp[other] == generation) continue; + stamp[other] = generation; + affected.push_back(other); + } + } + for (const int32_t other : affected) { + for (const int32_t parent : {left, right, child}) { + const uint64_t key = pair_key(parent, other); + const int64_t value = counts.get(key); + if (value > 0) ac2::heap_push(heap, {value, key, 0}); + } + } + + merges.emplace_back(left, right); + length -= frequency; + + if (heap.size() > 4 * counts.size() + 65536) { + heap.clear(); + counts.for_each([&](uint64_t key, int64_t value) { heap.push_back({value, key, 0}); }); + std::make_heap(heap.begin(), heap.end(), ac2::HeapOrder{}); + } + } + + py::list merge_list; + for (const auto& merge : merges) { + merge_list.append(py::make_tuple(merge.first, merge.second)); + } + py::dict report; + report["records"] = records; + report["weight"] = total_weight; + report["atoms"] = atom_count; + report["merges"] = static_cast(merges.size()); + report["vocab_size"] = atom_count + static_cast(merges.size()); + report["tokens_per_action_initial"] = static_cast(initial_length) / total_weight; + report["tokens_per_action"] = static_cast(length) / static_cast(total_weight); + report["compression"] = static_cast(initial_length) / static_cast(length); + report["initial_pair_types"] = static_cast(initial_pair_types); + report["heap_pops"] = heap_pops; + report["counter_updates"] = counter_updates; + report["threads"] = thread_count; + report["backend"] = "native_sparse_exact"; + return py::make_tuple(merge_list, report); +} diff --git a/actioncodec2_kernels/temporal.cpp b/actioncodec2_kernels/temporal.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b1d7c8c703c6d996f4e6d985b442912d40a79ddf --- /dev/null +++ b/actioncodec2_kernels/temporal.cpp @@ -0,0 +1,799 @@ +// Native exact rooted temporal Set-BPE trainer. +// +// A temporal symbol is rooted at one token of the current control step and may +// absorb spatial tokens from a bounded number of future steps. Training is the +// exact sparse local-graph algorithm: counters exist only for rule keys that +// actually occur inside the lookahead window, each merge updates only the edges +// incident to the instances it changed, and shifted self-rules (left == right) +// are certified by exact left-to-right maximum matching before they may win. +// +// This mirrors actioncodec2/setbpe/temporal.py merge for merge, including the +// tie-break, so the reference trainer can prove the two agree. What differs is +// the constant factor: the Python trainer allocates a dense +// ``lookahead x V x V`` legality table, while this one derives legality from the +// per-token time-shifted support masks in O(span) with no allocation, which is +// what makes large vocabularies tractable. + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.hpp" + +#ifdef _OPENMP +#include +#endif + +namespace py = pybind11; + +namespace { + +struct TemporalEntry { + int64_t count; + uint64_t key; + uint32_t version; + uint8_t certified; +}; + +struct TemporalOrder { + bool operator()(const TemporalEntry& a, const TemporalEntry& b) const { + if (a.count != b.count) return a.count < b.count; // larger count first + if (a.key != b.key) return a.key > b.key; // smaller key first + return a.certified > b.certified; // uncertified first + } +}; + +struct InstanceChunk { + const int32_t* tokens; + const int64_t* anchors; + int64_t size; +}; + +size_t initial_counter_capacity(int64_t instance_count, int32_t base_vocab, int32_t lookahead) { + const size_t by_instances = static_cast(instance_count) * 4 + 64; + const size_t vocab = static_cast(base_vocab); + const size_t offsets = static_cast(std::max(lookahead - 1, 0)); + if (vocab != 0 && offsets > (std::numeric_limits::max() - 64) / vocab / vocab) { + return by_instances; + } + const size_t by_key_universe = vocab * vocab * offsets + 64; + return std::min(by_instances, by_key_universe); +} + +inline uint64_t rule_key(int32_t left, int32_t right, int32_t offset) { + return (static_cast(left) << 40) | (static_cast(right) << 16) | + static_cast(offset); +} + +inline void unpack(uint64_t key, int32_t& left, int32_t& right, int32_t& offset) { + left = static_cast(key >> 40); + right = static_cast((key >> 16) & 0xffffffull); + offset = static_cast(key & 0xffffull); +} + +class Trainer { + public: + Trainer(int64_t total_anchors, int64_t instance_capacity_hint, + const uint64_t* spatial_support, const int32_t* spatial_anchor, int32_t base_vocab, + int32_t dimension, int32_t lookahead, int64_t vocab_size, int threads) + : base_vocab_(base_vocab), + dimension_(dimension), + lookahead_(lookahead), + total_anchors_(total_anchors), + counts_(initial_counter_capacity(instance_capacity_hint, base_vocab, lookahead)) { +#ifdef _OPENMP + // More workers eventually make the per-merge local-map reduction slower + // than the incident scan itself. Keep auto mode at the measured scaling + // knee; an explicit value remains an opt-in override. + threads_ = threads > 0 ? threads : std::min(omp_get_max_threads(), 32); +#else + (void)threads; + threads_ = 1; +#endif + const size_t capacity = static_cast(vocab_size) + 16; + masks_.assign(capacity * lookahead_, 0); + spans_.assign(capacity, 1); + root_anchor_.assign(capacity, 0); + pattern_start_.assign(capacity + 1, 0); + for (int32_t token = 0; token < base_vocab_; ++token) { + masks_[static_cast(token) * lookahead_] = spatial_support[token]; + root_anchor_[token] = spatial_anchor[token]; + pattern_start_[token] = static_cast(pattern_.size()); + pattern_.push_back({0, token}); + } + pattern_start_[base_vocab_] = static_cast(pattern_.size()); + token_count_ = base_vocab_; + + member_.assign(static_cast(total_anchors) * dimension_, -1); + occurrence_.resize(capacity); + dirty_.assign(capacity, 0); + } + + void add_chunk(const InstanceChunk& chunk) { + for (int64_t index = 0; index < chunk.size; ++index) { + add_instance(chunk.tokens[index], chunk.anchors[index]); + } + initial_count_ += chunk.size; + } + + void finalize_instances() { + if (initial_count_ <= 0) throw std::runtime_error("temporal training needs instances"); + active_count_ = initial_count_; + const auto census_started = std::chrono::steady_clock::now(); + census(); + census_seconds_ = elapsed(census_started); + counts_.for_each([&](uint64_t key, int64_t value) { heap_.push_back({value, key, 0, 0}); }); + std::make_heap(heap_.begin(), heap_.end(), TemporalOrder{}); + initial_edge_types_ = heap_.size(); + } + + // -- geometry ------------------------------------------------------------ + + bool legal(int32_t left, int32_t right, int32_t offset) const { + const int32_t right_span = spans_[right]; + if (offset + right_span > lookahead_) return false; + const uint64_t* left_masks = &masks_[static_cast(left) * lookahead_]; + const uint64_t* right_masks = &masks_[static_cast(right) * lookahead_]; + const int32_t overlap = std::min(spans_[left] - offset, right_span); + for (int32_t step = 0; step < overlap; ++step) { + if (left_masks[offset + step] & right_masks[step]) return false; + } + return true; + } + + // -- instance bookkeeping ------------------------------------------------ + + int32_t add_instance(int32_t token, int64_t anchor) { + if (token < 0 || static_cast(token) >= occurrence_.size()) { + throw std::runtime_error("temporal instance token " + std::to_string(token) + + " is outside trainer capacity " + + std::to_string(occurrence_.size())); + } + if (anchor < 0 || anchor >= total_anchors_) { + throw std::runtime_error("temporal instance anchor is outside the corpus timeline"); + } + int32_t* row = &member_[static_cast(anchor) * dimension_]; + int32_t slot = 0; + while (slot < dimension_ && row[slot] >= 0) ++slot; + if (slot == dimension_) { + throw std::runtime_error("temporal anchor exceeded the token-width bound"); + } + row[slot] = token; + occurrence_[token].push_back(anchor); + dirty_[token] = 1; + return slot; + } + + // Removal touches only the row mirror. The occurrence list is allowed to + // keep stale anchors because ``occurs_at`` is an exact membership test, so + // compaction can be deferred to the next time the list is actually read. + void remove_instance(int32_t token, int64_t anchor) { + int32_t* row = &member_[static_cast(anchor) * dimension_]; + for (int32_t slot = 0; slot < dimension_; ++slot) { + if (row[slot] == token) { + row[slot] = -1; + break; + } + } + dirty_[token] = 1; + } + + const std::vector& sorted_occurrence(int32_t token) { + auto& anchors = occurrence_[token]; + if (dirty_[token]) { + std::sort(anchors.begin(), anchors.end()); + anchors.erase(std::unique(anchors.begin(), anchors.end()), anchors.end()); + anchors.erase(std::remove_if(anchors.begin(), anchors.end(), + [&](int64_t anchor) { return !occurs_at(token, anchor); }), + anchors.end()); + dirty_[token] = 0; + } + return anchors; + } + + bool occurs_at(int32_t token, int64_t anchor) const { + const int32_t* row = &member_[static_cast(anchor) * dimension_]; + for (int32_t slot = 0; slot < dimension_; ++slot) { + if (row[slot] == token) return true; + } + return false; + } + + // -- matching ------------------------------------------------------------ + + std::vector> select(int32_t left, int32_t right, int32_t offset) { + std::vector> matches; + const std::vector& anchors = sorted_occurrence(left); + if (left != right) { +#ifdef _OPENMP + if (threads_ > 1 && anchors.size() >= 65536) { + const int workers = std::min(threads_, anchors.size() / 32768); + std::vector>> local(workers); +#pragma omp parallel num_threads(workers) + { + const int worker = omp_get_thread_num(); + const size_t start = anchors.size() * static_cast(worker) / workers; + const size_t stop = anchors.size() * static_cast(worker + 1) / workers; + auto& output = local[worker]; + output.reserve(stop - start); + for (size_t index = start; index < stop; ++index) { + const int64_t anchor = anchors[index]; + const int64_t target = anchor + offset; + if (target < total_anchors_ && occurs_at(right, target)) { + output.emplace_back(anchor, target); + } + } + } + size_t count = 0; + for (const auto& output : local) count += output.size(); + matches.reserve(count); + for (auto& output : local) { + matches.insert(matches.end(), output.begin(), output.end()); + } + return matches; + } +#endif + for (const int64_t anchor : anchors) { + const int64_t target = anchor + offset; + if (target < total_anchors_ && occurs_at(right, target)) { + matches.emplace_back(anchor, target); + } + } + return matches; + } + // Shifted self-rule: an instance cannot be both the left and the right end + // of two different merges, so the true gain is a maximum matching, which + // for a fixed shift on a line is exactly greedy left to right. + std::deque consumed_targets; + for (const int64_t anchor : anchors) { + while (!consumed_targets.empty() && consumed_targets.front() < anchor) { + consumed_targets.pop_front(); + } + if (!consumed_targets.empty() && consumed_targets.front() == anchor) { + consumed_targets.pop_front(); + continue; + } + const int64_t wide = anchor + offset; + if (wide >= total_anchors_) continue; + const int64_t target = wide; + if (!occurs_at(left, target)) continue; + matches.emplace_back(anchor, target); + consumed_targets.push_back(target); + } + return matches; + } + + // -- search -------------------------------------------------------------- + + bool best(int32_t& left, int32_t& right, int32_t& offset, + std::vector>& matches) { + while (!heap_.empty()) { + std::pop_heap(heap_.begin(), heap_.end(), TemporalOrder{}); + const TemporalEntry top = heap_.back(); + heap_.pop_back(); + ++heap_pops_; + const int64_t current = counts_.get(top.key); + if (current <= 0) continue; + unpack(top.key, left, right, offset); + const bool self_rule = left == right; + const uint32_t version = self_rule ? self_version(top.key) : 0; + const bool stale = self_rule ? version != top.version : current != top.count; + if (stale) { + heap_.push_back({current, top.key, version, 0}); + std::push_heap(heap_.begin(), heap_.end(), TemporalOrder{}); + continue; + } + if (self_rule && !top.certified) { + // Raw edge count only upper-bounds the achievable gain here; replace + // the priority with the exact matching size and re-queue. + auto certified = select(left, right, offset); + self_cache_[top.key] = {version, certified}; + heap_.push_back({static_cast(certified.size()), top.key, version, 1}); + std::push_heap(heap_.begin(), heap_.end(), TemporalOrder{}); + ++self_certifications_; + continue; + } + if (top.certified) { + auto cached = self_cache_.find(top.key); + if (cached == self_cache_.end() || cached->second.first != version) continue; + matches = cached->second.second; + } else { + matches = select(left, right, offset); + } + if (static_cast(matches.size()) != top.count) { + throw std::runtime_error("temporal counter disagrees with exact matching"); + } + return !matches.empty(); + } + return false; + } + + // -- commit -------------------------------------------------------------- + + void commit(int32_t left, int32_t right, int32_t offset, + const std::vector>& matches) { + const int32_t child = token_count_++; + // The child's pattern is the left pattern plus the right pattern shifted. + const int32_t start = static_cast(pattern_.size()); + for (int32_t index = pattern_start_[left]; index < pattern_start_[left + 1]; ++index) { + pattern_.push_back(pattern_[index]); + } + for (int32_t index = pattern_start_[right]; index < pattern_start_[right + 1]; ++index) { + pattern_.push_back({pattern_[index].first + offset, pattern_[index].second}); + } + std::sort(pattern_.begin() + start, pattern_.end()); + pattern_start_[child] = start; + pattern_start_[child + 1] = static_cast(pattern_.size()); + + int32_t span = 0; + int32_t roots = 0; + uint64_t* child_masks = &masks_[static_cast(child) * lookahead_]; + for (int32_t index = start; index < static_cast(pattern_.size()); ++index) { + const int32_t time = pattern_[index].first; + const uint64_t support = masks_[static_cast(pattern_[index].second) * lookahead_]; + if (time >= lookahead_) throw std::runtime_error("temporal merge exceeds the lookahead"); + if (child_masks[time] & support) { + throw std::runtime_error("temporal merge joins overlapping spatial supports"); + } + child_masks[time] |= support; + span = std::max(span, time + 1); + roots += (time == 0); + } + if (roots != 1) throw std::runtime_error("a rooted temporal token needs one time-zero token"); + spans_[child] = span; + root_anchor_[child] = root_anchor_[left]; + + ac2::CounterMap deltas( + std::min(matches.size() * 8 + 64, incident_key_capacity(token_count_))); + std::vector> removed; // (token, anchor), sorted by anchor + removed.reserve(matches.size() * 2); + size_t left_index = 0; + size_t right_index = 0; + while (left_index < matches.size() || right_index < matches.size()) { + const int64_t left_anchor = + left_index < matches.size() ? matches[left_index].first : total_anchors_; + const int64_t right_anchor = + right_index < matches.size() ? matches[right_index].second : total_anchors_; + if (left_anchor <= right_anchor) { + removed.emplace_back(left, left_anchor); + ++left_index; + } else { + removed.emplace_back(right, right_anchor); + ++right_index; + } + } + accumulate_incident(removed, -1, deltas); + correct_internal(removed, +1, deltas); + + for (const auto& instance : removed) remove_instance(instance.first, instance.second); + std::vector> children; + children.reserve(matches.size()); + for (const auto& match : matches) { + add_instance(child, match.first); + children.emplace_back(child, match.first); + } + accumulate_incident(children, +1, deltas); + correct_internal(children, -1, deltas); + + apply(deltas, rule_key(left, right, offset)); + active_count_ -= static_cast(matches.size()); + merges_.push_back({left, right, offset}); + } + + // -- accessors ----------------------------------------------------------- + + const std::vector>& merges() const { return merges_; } + int64_t active_count() const { return active_count_; } + int64_t initial_count() const { return initial_count_; } + int64_t heap_pops() const { return heap_pops_; } + int64_t counter_updates() const { return counter_updates_; } + int64_t self_certifications() const { return self_certifications_; } + size_t initial_edge_types() const { return initial_edge_types_; } + size_t live_edge_types() const { return counts_.live_entries(); } + size_t counter_buckets() const { return counts_.buckets(); } + int threads() const { return threads_; } + double census_seconds() const { return census_seconds_; } + double incident_seconds() const { return incident_seconds_; } + double incident_parallel_seconds() const { return incident_parallel_seconds_; } + double incident_merge_seconds() const { return incident_merge_seconds_; } + double correction_seconds() const { return correction_seconds_; } + double correction_parallel_seconds() const { return correction_parallel_seconds_; } + double apply_seconds() const { return apply_seconds_; } + + private: + static double elapsed(std::chrono::steady_clock::time_point started) { + return std::chrono::duration(std::chrono::steady_clock::now() - started).count(); + } + + size_t incident_key_capacity(int32_t vocabulary) const { + return static_cast(6) * static_cast(vocabulary) * + static_cast(std::max(lookahead_ - 1, 0)) + + 64; + } + + void census_anchor(int64_t anchor, ac2::CounterMap& counter) const { + const int32_t* row = &member_[static_cast(anchor) * dimension_]; + for (int32_t slot = 0; slot < dimension_; ++slot) { + const int32_t left = row[slot]; + if (left < 0) continue; + for (int32_t offset = 1; offset < lookahead_; ++offset) { + const int64_t target = anchor + offset; + if (target >= total_anchors_) break; + const int32_t* other_row = &member_[static_cast(target) * dimension_]; + for (int32_t other_slot = 0; other_slot < dimension_; ++other_slot) { + const int32_t right = other_row[other_slot]; + if (right >= 0 && legal(left, right, offset)) { + counter.add(rule_key(left, right, offset), 1); + } + } + } + } + } + + void census() { + const size_t key_universe = initial_counter_capacity(total_anchors_, base_vocab_, lookahead_); +#ifdef _OPENMP + if (threads_ > 1 && total_anchors_ >= 4096) { + const int workers = std::min(threads_, total_anchors_ / 2048); + // Small rule universes fit comfortably in one local map per worker. + // For a large spatial vocabulary, each long-running worker would + // eventually discover almost the whole universe and multiply memory by + // the thread count. Merge fixed-size anchor batches instead: this keeps + // local memory bounded while the global counter remains exact. + const bool batched = key_universe > (1u << 20); + const int64_t anchors_per_worker = batched ? 8192 : total_anchors_; + const int64_t batch_size = anchors_per_worker * workers; + const size_t local_hint = batched + ? std::min(key_universe, + anchors_per_worker * 32 + 64) + : key_universe; + std::vector> local; + local.reserve(workers); + for (int worker = 0; worker < workers; ++worker) { + local.push_back(std::make_unique(local_hint)); + } + for (int64_t batch_start = 0; batch_start < total_anchors_; batch_start += batch_size) { + const int64_t batch_end = std::min(total_anchors_, batch_start + batch_size); +#pragma omp parallel for schedule(static) num_threads(workers) + for (int64_t anchor = batch_start; anchor < batch_end; ++anchor) { + census_anchor(anchor, *local[omp_get_thread_num()]); + } + for (const auto& counter : local) { + counter->for_each([&](uint64_t key, int64_t value) { counts_.add(key, value); }); + if (batched) counter->clear(); + } + } + return; + } +#endif + for (int64_t anchor = 0; anchor < total_anchors_; ++anchor) census_anchor(anchor, counts_); + } + + uint32_t self_version(uint64_t key) const { + auto found = self_versions_.find(key); + return found == self_versions_.end() ? 0u : found->second; + } + + void accumulate_incident(const std::vector>& instances, + int64_t multiplier, ac2::CounterMap& deltas) { + const auto started = std::chrono::steady_clock::now(); +#ifdef _OPENMP + if (threads_ > 1 && instances.size() >= 1024) { + const int workers = std::min(threads_, static_cast(instances.size() / 512)); + const size_t hint = std::min( + instances.size() * 8 / static_cast(workers) + 64, + incident_key_capacity(token_count_)); + std::vector> local; + local.reserve(workers); + for (int worker = 0; worker < workers; ++worker) { + local.push_back(std::make_unique(hint)); + } + const auto parallel_started = std::chrono::steady_clock::now(); +#pragma omp parallel for schedule(static) num_threads(workers) + for (int64_t index = 0; index < static_cast(instances.size()); ++index) { + accumulate_one(instances[static_cast(index)], multiplier, + *local[omp_get_thread_num()]); + } + incident_parallel_seconds_ += elapsed(parallel_started); + const auto merge_started = std::chrono::steady_clock::now(); + for (const auto& counter : local) { + counter->for_each([&](uint64_t key, int64_t value) { deltas.add(key, value); }); + } + incident_merge_seconds_ += elapsed(merge_started); + incident_seconds_ += elapsed(started); + return; + } +#endif + for (const auto& instance : instances) { + accumulate_one(instance, multiplier, deltas); + } + incident_seconds_ += elapsed(started); + } + + void accumulate_one(const std::pair& instance, int64_t multiplier, + ac2::CounterMap& deltas) const { + const int32_t token = instance.first; + const int64_t anchor = instance.second; + for (int32_t offset = 1; offset < lookahead_; ++offset) { + const int64_t forward = anchor + offset; + if (forward < total_anchors_) { + const int32_t* row = &member_[static_cast(forward) * dimension_]; + for (int32_t slot = 0; slot < dimension_; ++slot) { + const int32_t other = row[slot]; + if (other >= 0 && legal(token, other, offset)) { + deltas.add(rule_key(token, other, offset), multiplier); + } + } + } + const int64_t backward = anchor - offset; + if (backward >= 0) { + const int32_t* row = &member_[static_cast(backward) * dimension_]; + for (int32_t slot = 0; slot < dimension_; ++slot) { + const int32_t other = row[slot]; + if (other >= 0 && legal(other, token, offset)) { + deltas.add(rule_key(other, token, offset), multiplier); + } + } + } + } + } + + // Incident aggregation sees a changed-to-changed edge once from each end. + void correct_internal(const std::vector>& instances, + int64_t correction, ac2::CounterMap& deltas) { + const auto started = std::chrono::steady_clock::now(); + if (instances.empty()) return; + std::vector groups{0}; + groups.reserve(instances.size()); + for (size_t index = 1; index < instances.size(); ++index) { + if (instances[index].second < instances[index - 1].second) { + throw std::runtime_error("changed temporal instances must be anchor-sorted"); + } + if (instances[index].second != instances[index - 1].second) groups.push_back(index); + } + groups.push_back(instances.size()); + const size_t group_count = groups.size() - 1; +#ifdef _OPENMP + if (threads_ > 1 && group_count >= 1024) { + const int workers = std::min(threads_, static_cast(group_count / 512)); + const size_t hint = std::min(group_count * 2 / static_cast(workers) + 64, + incident_key_capacity(token_count_)); + std::vector> local; + local.reserve(workers); + for (int worker = 0; worker < workers; ++worker) { + local.push_back(std::make_unique(hint)); + } + const auto parallel_started = std::chrono::steady_clock::now(); +#pragma omp parallel for schedule(static) num_threads(workers) + for (int64_t index = 0; index < static_cast(group_count); ++index) { + correct_group(static_cast(index), groups, instances, correction, + *local[omp_get_thread_num()]); + } + correction_parallel_seconds_ += elapsed(parallel_started); + for (const auto& counter : local) { + counter->for_each([&](uint64_t key, int64_t value) { deltas.add(key, value); }); + } + } else +#endif + { + for (size_t group = 0; group < group_count; ++group) { + correct_group(group, groups, instances, correction, deltas); + } + } + correction_seconds_ += elapsed(started); + } + + void correct_group(size_t group, const std::vector& groups, + const std::vector>& instances, + int64_t correction, ac2::CounterMap& deltas) const { + const size_t left_start = groups[group]; + const size_t left_stop = groups[group + 1]; + const int64_t anchor = instances[left_start].second; + for (size_t other = group + 1; other + 1 < groups.size(); ++other) { + const size_t right_start = groups[other]; + const int64_t distance = instances[right_start].second - anchor; + if (distance >= lookahead_) break; + const int32_t offset = static_cast(distance); + for (size_t left_index = left_start; left_index < left_stop; ++left_index) { + const int32_t left = instances[left_index].first; + for (size_t right_index = right_start; right_index < groups[other + 1]; ++right_index) { + const int32_t right = instances[right_index].first; + if (legal(left, right, offset)) { + deltas.add(rule_key(left, right, offset), correction); + } + } + } + } + } + + void apply(const ac2::CounterMap& deltas, uint64_t selected) { + const auto started = std::chrono::steady_clock::now(); + deltas.for_each([&](uint64_t key, int64_t delta) { + const auto [previous, count] = counts_.add_with_previous(key, delta); + if (count < 0) { + int32_t bl = 0, br = 0, bo = 0; + unpack(key, bl, br, bo); + throw std::runtime_error("temporal edge counter became negative: rule=(" + + std::to_string(bl) + "," + std::to_string(br) + "," + + std::to_string(bo) + ") previous=" + std::to_string(previous) + + " delta=" + std::to_string(delta) + " at merge " + + std::to_string(merges_.size())); + } + counter_updates_ += delta < 0 ? -delta : delta; + int32_t left = 0; + int32_t right = 0; + int32_t offset = 0; + unpack(key, left, right, offset); + uint32_t version = 0; + if (left == right) { + version = self_version(key) + 1; + self_versions_[key] = version; + self_cache_.erase(key); + } + // Every edge a commit adds contains the freshly minted child token, so a + // pre-existing key can only lose mass; its stale heap priority stays an + // admissible upper bound and is repaired when popped. New keys and the + // key just consumed need an entry right away. + if (count > 0 && (previous == 0 || key == selected)) { + heap_.push_back({count, key, version, 0}); + std::push_heap(heap_.begin(), heap_.end(), TemporalOrder{}); + } + }); + apply_seconds_ += elapsed(started); + } + + int32_t base_vocab_; + int32_t dimension_; + int32_t lookahead_; + int64_t total_anchors_; + int threads_ = 1; + int32_t token_count_ = 0; + + std::vector masks_; + std::vector spans_; + std::vector root_anchor_; + std::vector> pattern_; // (time, spatial token) + std::vector pattern_start_; + + std::vector member_; + std::vector> occurrence_; + std::vector dirty_; + + ac2::CounterMap counts_; + std::vector heap_; + std::unordered_map self_versions_; + std::unordered_map>>> + self_cache_; + + std::vector> merges_; + int64_t active_count_ = 0; + int64_t initial_count_ = 0; + int64_t heap_pops_ = 0; + int64_t counter_updates_ = 0; + int64_t self_certifications_ = 0; + size_t initial_edge_types_ = 0; + double census_seconds_ = 0.0; + double incident_seconds_ = 0.0; + double incident_parallel_seconds_ = 0.0; + double incident_merge_seconds_ = 0.0; + double correction_seconds_ = 0.0; + double correction_parallel_seconds_ = 0.0; + double apply_seconds_ = 0.0; +}; + +} // namespace + +py::tuple train_temporal_native( + py::iterable instance_chunks, int64_t total_anchors, + py::array_t spatial_support, + py::array_t spatial_anchor, + int32_t dimension, int32_t lookahead, int64_t vocab_size, int64_t action_count, int threads) { + if (lookahead < 1) throw std::invalid_argument("lookahead must be positive"); + const int32_t base_vocab = static_cast(spatial_support.size()); + if (vocab_size < base_vocab) { + throw std::invalid_argument("vocab_size is below the spatial vocabulary size"); + } + std::unique_ptr trainer; + { + py::gil_scoped_release release; + trainer = std::make_unique( + total_anchors, action_count, spatial_support.data(), + spatial_anchor.data(), base_vocab, dimension, lookahead, vocab_size, threads); + } + int64_t instance_count = 0; + for (py::handle raw_chunk : instance_chunks) { + py::tuple chunk = py::cast(raw_chunk); + if (chunk.size() != 2) { + throw std::invalid_argument("every temporal instance chunk must be a token/anchor pair"); + } + auto tokens = py::cast< + py::array_t>(chunk[0]); + auto anchors = py::cast< + py::array_t>(chunk[1]); + if (tokens.ndim() != 1 || anchors.ndim() != 1 || tokens.size() != anchors.size()) { + throw std::invalid_argument("every temporal token/anchor chunk must be an aligned vector"); + } + for (py::ssize_t index = 0; index < tokens.size(); ++index) { + if (tokens.data()[index] < 0 || tokens.data()[index] >= base_vocab) { + throw std::invalid_argument("input temporal token is outside the spatial vocabulary"); + } + } + const InstanceChunk view{tokens.data(), anchors.data(), tokens.size()}; + { + py::gil_scoped_release release; + trainer->add_chunk(view); + } + instance_count += tokens.size(); + } + if (instance_count <= 0) { + throw std::invalid_argument("temporal instance chunks must not be empty"); + } + int32_t left = 0; + int32_t right = 0; + int32_t offset = 0; + std::vector> matches; + double selection_seconds = 0.0; + double commit_seconds = 0.0; + { + py::gil_scoped_release release; + trainer->finalize_instances(); + while (static_cast(trainer->merges().size()) + base_vocab < vocab_size) { + auto started = std::chrono::steady_clock::now(); + const bool found = trainer->best(left, right, offset, matches); + selection_seconds += + std::chrono::duration(std::chrono::steady_clock::now() - started).count(); + if (!found) break; + started = std::chrono::steady_clock::now(); + trainer->commit(left, right, offset, matches); + commit_seconds += + std::chrono::duration(std::chrono::steady_clock::now() - started).count(); + } + } + + py::list merge_list; + for (const auto& merge : trainer->merges()) { + merge_list.append(py::make_tuple(merge[0], merge[1], merge[2])); + } + py::dict report; + report["lookahead"] = lookahead; + report["spatial_vocab_size"] = base_vocab; + report["merges"] = static_cast(trainer->merges().size()); + report["vocab_size"] = base_vocab + static_cast(trainer->merges().size()); + report["actions"] = action_count; + report["tokens_per_action_initial"] = + static_cast(trainer->initial_count()) / static_cast(action_count); + report["tokens_per_action"] = + static_cast(trainer->active_count()) / static_cast(action_count); + report["compression"] = + static_cast(trainer->initial_count()) / static_cast(trainer->active_count()); + report["initial_edge_types"] = static_cast(trainer->initial_edge_types()); + report["live_edge_types"] = static_cast(trainer->live_edge_types()); + report["counter_buckets"] = static_cast(trainer->counter_buckets()); + report["census_seconds"] = trainer->census_seconds(); + report["incident_seconds"] = trainer->incident_seconds(); + report["incident_parallel_seconds"] = trainer->incident_parallel_seconds(); + report["incident_merge_seconds"] = trainer->incident_merge_seconds(); + report["correction_seconds"] = trainer->correction_seconds(); + report["correction_parallel_seconds"] = trainer->correction_parallel_seconds(); + report["apply_seconds"] = trainer->apply_seconds(); + report["selection_seconds"] = selection_seconds; + report["commit_seconds"] = commit_seconds; + report["heap_pops"] = trainer->heap_pops(); + report["counter_updates"] = trainer->counter_updates(); + report["self_certifications"] = trainer->self_certifications(); + report["backend"] = "native_sparse_exact"; + report["threads"] = trainer->threads(); + report["threads_requested"] = threads; + return py::make_tuple(merge_list, report); +} diff --git a/actioncodec2_kernels/token_streams.hpp b/actioncodec2_kernels/token_streams.hpp new file mode 100644 index 0000000000000000000000000000000000000000..bc3c1a2a9f611678442360801c7c6e9497474c4c --- /dev/null +++ b/actioncodec2_kernels/token_streams.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace ac2 { +namespace py = pybind11; + +// Preserve the public Python integer contract; never coerce floats or booleans. +inline std::vector> checked_token_streams( + const py::iterable& streams, int64_t vocabulary, bool routed = false) { + const py::object numpy_integer = py::module_::import("numpy").attr("integer"); + py::object integral; + std::vector> output; + if (PyList_Check(streams.ptr())) output.reserve(PyList_GET_SIZE(streams.ptr())); + for (py::handle stream : streams) { + std::vector row; + if (PyList_Check(stream.ptr())) row.reserve(PyList_GET_SIZE(stream.ptr())); + for (py::handle raw : py::reinterpret_borrow(stream)) { + bool integer = PyLong_Check(raw.ptr()) || py::isinstance(raw, numpy_integer); + if (!integer && !routed) { + if (!integral) integral = py::module_::import("numbers").attr("Integral"); + integer = py::isinstance(raw, integral); + } + if (PyBool_Check(raw.ptr()) || !integer) + throw std::invalid_argument(routed ? "tokens[" + std::to_string(row.size()) + "] must be an integer" + : "tokens must be integers"); + py::object number = py::reinterpret_steal(PyNumber_Long(raw.ptr())); + if (!number) throw py::error_already_set(); + int overflow = 0; + const int64_t token = PyLong_AsLongLongAndOverflow(number.ptr(), &overflow); + if (PyErr_Occurred()) throw py::error_already_set(); + if (overflow || token < 0 || token >= vocabulary) + throw std::invalid_argument(routed ? "tokens[" + std::to_string(row.size()) + + "] is outside the routed profile vocabularies; out of range [0, " + std::to_string(vocabulary) + ")" + : "token is outside the vocabulary"); + row.push_back(token); + } + if (row.empty()) throw std::invalid_argument("token stream must not be empty"); + output.push_back(std::move(row)); + } + if (output.empty()) throw std::invalid_argument("streams must not be empty"); + return output; +} +} // namespace ac2 diff --git a/config.json b/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/config.json +++ b/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/processing_actioncodec2.py b/processing_actioncodec2.py index 94759ec53383d7b0c4c8ac1edff59c24a4d0a7d8..92a90d2012e5415118399d8374ef642a6fae4749 100644 --- a/processing_actioncodec2.py +++ b/processing_actioncodec2.py @@ -21,11 +21,15 @@ SHARED_PATTERNS = ( def asset_inventory(directory: Path) -> dict[str, str]: """Hash the complete configuration and fitted assets for one variant.""" - names = ["router_config.yaml", "config.json", "processor_config.json"] + sparse = (directory / "sparse_router_config.yaml").is_file() + names = ["sparse_router_config.yaml" if sparse else "router_config.yaml", "config.json", "processor_config.json"] profiles = [name for name in ("eef", "joint") if (directory / "profiles" / name).is_dir()] if not profiles: raise ValueError("variant has no fitted profiles") - names.extend(f"profiles/{profile}/{name}" for profile in profiles for name in PROFILE_FILES) + names.extend(f"profiles/{profile}/{name}" for profile in profiles + for name in (tuple("sparse_bpe.json" if n == "bpe.json" else n for n in PROFILE_FILES) if sparse else PROFILE_FILES)) + names.extend(f"profiles/{profile}/preprocessing.json" for profile in profiles + if (directory / "profiles" / profile / "preprocessing.json").is_file()) return {name: hashlib.sha256((directory / name).read_bytes()).hexdigest() for name in sorted(names)} @@ -62,11 +66,12 @@ class _VariantBinding: def save_pretrained(self, save_directory, push_to_hub=False, **kwargs): directory = Path(save_directory) + include_training_report = kwargs.pop("include_training_report", False) if (directory / "variants.json").is_file(): raise ValueError("save a selected variant to a separate directory, outside the catalog root") if not push_to_hub and kwargs: raise TypeError(f"unused save_pretrained keyword(s): {', '.join(sorted(kwargs))}") - files = super().save_pretrained(directory) + files = super().save_pretrained(directory, include_training_report=include_training_report) inventory = asset_inventory(directory) manifest = directory / "artifact_manifest.json" manifest.write_text(json.dumps({ @@ -77,10 +82,8 @@ class _VariantBinding: }, indent=2) + "\n", encoding="utf-8") files.append(str(manifest)) if push_to_hub: - package = type(self.action_tokenizer).__module__.split(".routing.", 1)[0] - importlib.import_module(f"{package}.integration.hf").upload_pretrained_directory( - directory, **kwargs - ) + package = type(self).__module__.split(".frontend.", 1)[0] + importlib.import_module(f"{package}.backends.actioncodec2.hf").upload_pretrained_directory(directory, **kwargs) return files @@ -169,7 +172,7 @@ class ActionCodec2: root = Path(snapshot_download( str(pretrained_model_name_or_path), allow_patterns=[*SHARED_PATTERNS, "router_config.yaml", "profiles/**", - "artifact_manifest.json"], **kwargs, + "sparse_router_config.yaml", "artifact_manifest.json"], **kwargs, )) directory = root manifest = root / "artifact_manifest.json" @@ -185,33 +188,28 @@ class ActionCodec2: if variant_fingerprint is not None and variant_fingerprint != origin.get("fingerprint"): raise ValueError("variant fingerprint differs from the tokenizer bound to this policy") - runtime = root / "runtime" - package_file = runtime / "__init__.py" - if not package_file.is_file(): - raise FileNotFoundError(f"ActionCodec2 runtime is missing from {root}") - identity = hashlib.sha256(str(runtime.resolve()).encode()).hexdigest()[:16] - package_name = f"_actioncodec2_artifact_{identity}" - if package_name not in sys.modules: - spec = importlib.util.spec_from_file_location( - package_name, package_file, submodule_search_locations=[str(runtime)] - ) - if spec is None or spec.loader is None: - raise ImportError(f"cannot load ActionCodec2 runtime from {runtime}") - package = importlib.util.module_from_spec(spec) - sys.modules[package_name] = package - try: + family = "actioncodec2_sparse" if (directory / "sparse_router_config.yaml").is_file() else "actioncodec2" + if __package__ == "actioncodec2.core": + package_name = __package__ + else: + runtime = root / "runtime" + package_file = runtime / "__init__.py" + if not package_file.is_file(): + raise FileNotFoundError(f"ActionCodec2 runtime is missing from {root}") + identity = hashlib.sha256(str(runtime.resolve()).encode()).hexdigest()[:16] + package_name = f"_actioncodec2_artifact_{identity}" + if package_name not in sys.modules: + spec = importlib.util.spec_from_file_location( + package_name, package_file, submodule_search_locations=[str(runtime)] + ) + package = importlib.util.module_from_spec(spec) + sys.modules[package_name] = package spec.loader.exec_module(package) - except BaseException: - del sys.modules[package_name] - raise - processor = importlib.import_module(f"{package_name}.processing_actioncodec2") - if (runtime / "hub_acceleration.py").is_file(): - acceleration = importlib.import_module(f"{package_name}.hub_acceleration") - acceleration.install(package_name) + processor = importlib.import_module(f"{package_name}.frontend.{family}.processor") + base = processor.ActionCodec2Sparse if family == "actioncodec2_sparse" else processor.ActionCodec2 if not hasattr(processor, "_catalog_processor_class"): processor._catalog_processor_class = type( - "ActionCodec2", (_VariantBinding, processor.ActionCodec2), - {"__module__": processor.__name__}, + base.__name__, (_VariantBinding, base), {"__module__": processor.__name__} ) codec = processor._catalog_processor_class.from_pretrained(directory, action_space=action_space) codec._variant_origin = origin diff --git a/pyproject.toml b/pyproject.toml index dd0e26a7fb93782a3ad58086b12a81c13270c41b..9564ec51fd88e38ed771d1e78242b8956301ff01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,3 @@ [build-system] requires = ["setuptools>=77", "wheel", "pybind11>=2.12"] build-backend = "setuptools.build_meta" - -[project] -name = "actioncodec2-kernels" -version = "0.1.0" -description = "Portable C++17 encode/decode kernels for ActionCodec2 tokenizer artifacts" -requires-python = ">=3.10" -license = "Apache-2.0" - -[tool.setuptools] -packages = ["actioncodec2_kernels"] - -[tool.setuptools.package-data] -actioncodec2_kernels = ["*.cpp", "*.hpp"] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index a140fba756c72a75eaffe68088f049d7000f7f65..0000000000000000000000000000000000000000 --- a/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -numpy -scipy -torch>=2.3 -transformers>=4.57,<6 -huggingface-hub -pyyaml diff --git a/runtime/__init__.py b/runtime/__init__.py index 80ac1fb2f5fdce15983f50c63e788e5f870bcccd..57c21caf3a45aa6397eac284d9eb3a2f0da35840 100644 --- a/runtime/__init__.py +++ b/runtime/__init__.py @@ -1 +1 @@ -"""Private inference runtime bundled with this ActionCodec2 artifact.""" +"""Shared ActionCodec2 and ActionCodec2Sparse runtime.""" diff --git a/runtime/backend/__init__.py b/runtime/backend/__init__.py deleted file mode 100644 index 7f82d8351a7c8342f78ecb6d99091596a4144b01..0000000000000000000000000000000000000000 --- a/runtime/backend/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Internal backend components for ActionCodec2.""" diff --git a/runtime/backends/__init__.py b/runtime/backends/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/runtime/backends/actioncodec2/__init__.py b/runtime/backends/actioncodec2/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..52e40e3f708e23fab17eed1fa064229c86fdee7d --- /dev/null +++ b/runtime/backends/actioncodec2/__init__.py @@ -0,0 +1,8 @@ +"""Shared physical models, layouts, and dense and sparse routers.""" +from .configuration import ActionCodec2Config, ConfigError +from .presets import ComponentSpec, PresetConfig +from .processor import ActionCodec2Processor +from .routing import ActionCodec2Router +from .trajectory import ActiveTrajectory + +__all__ = ["ActionCodec2Config", "ConfigError", "ComponentSpec", "PresetConfig", "ActionCodec2Processor", "ActionCodec2Router", "ActiveTrajectory"] diff --git a/runtime/physical/_so3.py b/runtime/backends/actioncodec2/_so3.py similarity index 76% rename from runtime/physical/_so3.py rename to runtime/backends/actioncodec2/_so3.py index 286467ac301d1572811b2ef127975ef157a93fc8..070068c54298e0ba29414b64fd182f2343fa4961 100644 --- a/runtime/physical/_so3.py +++ b/runtime/backends/actioncodec2/_so3.py @@ -4,9 +4,22 @@ from __future__ import annotations import numpy as np +from .native_backend import native_kernel + + +def _mapped(values, operation, width): + kernel = native_kernel("quaternion_map") + if kernel is None: + return None + array = np.asarray(values, dtype=np.float64) + return kernel(array.reshape(-1, array.shape[-1]), operation).reshape(*array.shape[:-1], width) + def normalize_quaternion(values: np.ndarray) -> np.ndarray: """Normalize quaternion rows and reject an undefined zero rotation.""" + result = _mapped(values, "normalize", 4) + if result is not None: + return result quaternions = np.asarray(values, dtype=np.float64) norms = np.linalg.norm(quaternions, axis=-1, keepdims=True) if np.any(norms < 1e-12): @@ -18,6 +31,10 @@ def multiply_quaternions(left: np.ndarray, right: np.ndarray) -> np.ndarray: """Return the Hamilton product of broadcastable xyzw arrays.""" first = np.asarray(left, dtype=np.float64) second = np.asarray(right, dtype=np.float64) + kernel = native_kernel("quaternion_multiply") + if kernel is not None: + first, second = np.broadcast_arrays(first, second) + return kernel(first.reshape(-1, 4), second.reshape(-1, 4)).reshape(first.shape) first_vector, first_scalar = first[..., :3], first[..., 3:4] second_vector, second_scalar = second[..., :3], second[..., 3:4] return normalize_quaternion( @@ -36,6 +53,9 @@ def multiply_quaternions(left: np.ndarray, right: np.ndarray) -> np.ndarray: def conjugate_quaternion(quaternion: np.ndarray) -> np.ndarray: """Return the conjugate of an xyzw quaternion array.""" + native = _mapped(quaternion, "conjugate", 4) + if native is not None: + return native result = np.asarray(quaternion, dtype=np.float64).copy() result[..., :3] *= -1.0 return result @@ -43,20 +63,24 @@ def conjugate_quaternion(quaternion: np.ndarray) -> np.ndarray: def rotvec_to_quaternion(rotvec: np.ndarray) -> np.ndarray: """Convert rotation vectors to xyzw quaternions.""" + result = _mapped(rotvec, "from_rotvec", 4) + if result is not None: + return result values = np.asarray(rotvec, dtype=np.float64) angle = np.linalg.norm(values, axis=-1) scale = np.full_like(angle, 0.5) regular = angle >= 1e-12 scale[regular] = np.sin(0.5 * angle[regular]) / angle[regular] return normalize_quaternion( - np.concatenate( - (values * scale[..., None], np.cos(0.5 * angle)[..., None]), axis=-1 - ) + np.concatenate((values * scale[..., None], np.cos(0.5 * angle)[..., None]), axis=-1) ) def quaternion_to_rotvec(quaternion: np.ndarray) -> np.ndarray: """Convert xyzw quaternions to shortest-path rotation vectors.""" + result = _mapped(quaternion, "to_rotvec", 3) + if result is not None: + return result values = normalize_quaternion(quaternion).copy() values[values[..., 3] < 0.0] *= -1.0 vector_norm = np.linalg.norm(values[..., :3], axis=-1) @@ -72,6 +96,9 @@ def euler_xyz_to_quaternion(euler: np.ndarray) -> np.ndarray: values = np.asarray(euler, dtype=np.float64) if values.ndim != 2 or values.shape[1] != 3: raise ValueError("XYZ Euler angles must have shape [N, 3]") + result = _mapped(values, "from_euler", 4) + if result is not None: + return result half = 0.5 * values sin_roll, sin_pitch, sin_yaw = np.sin(half).T cos_roll, cos_pitch, cos_yaw = np.cos(half).T @@ -88,6 +115,9 @@ def quaternion_to_euler_xyz(quaternion: np.ndarray) -> np.ndarray: values = normalize_quaternion(quaternion) if values.ndim != 2 or values.shape[1] != 4: raise ValueError("xyzw quaternions must have shape [N, 4]") + result = _mapped(values, "to_euler", 3) + if result is not None: + return result x, y, z, w = values.T return np.stack( ( diff --git a/runtime/common/_validation.py b/runtime/backends/actioncodec2/_validation.py similarity index 84% rename from runtime/common/_validation.py rename to runtime/backends/actioncodec2/_validation.py index f091b7498d43a4be4ccbfb47116825e6fdf44068..125e8572bf677089465c6f580336f4d250537456 100644 --- a/runtime/common/_validation.py +++ b/runtime/backends/actioncodec2/_validation.py @@ -18,13 +18,11 @@ def active_dimensions( ) -> tuple[int, ...]: """Normalize and validate a non-empty increasing subset of dimensions.""" dims = ( - tuple(range(dimension)) - if active_dims is None - else tuple(int(item) for item in active_dims) + tuple(range(dimension)) if active_dims is None else tuple(int(item) for item in active_dims) ) if not dims: raise ValueError(f"{subject} must not be empty") - if any(left >= right for left, right in zip(dims, dims[1:])): + if any(left >= right for left, right in zip(dims, dims[1:], strict=False)): raise ValueError(f"{subject} must be strictly increasing") if dims[0] < 0 or dims[-1] >= dimension: raise ValueError(f"{subject} contains a dimension outside the vocabulary") @@ -76,13 +74,9 @@ def validate_dimension_partition( for name, dims in groups: for index in dims: if index < 0 or index >= dimension: - raise error_type( - f"{label} {index} used by {name!r} is outside input_dim" - ) + raise error_type(f"{label} {index} used by {name!r} is outside input_dim") if index in owners: - raise error_type( - f"{label} {index} belongs to both {owners[index]!r} and {name!r}" - ) + raise error_type(f"{label} {index} belongs to both {owners[index]!r} and {name!r}") owners[index] = name missing = sorted(set(range(dimension)) - set(owners)) if missing: diff --git a/runtime/backends/actioncodec2/assets/presets/dual_eef_abs.yaml b/runtime/backends/actioncodec2/assets/presets/dual_eef_abs.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4ecc40f53fae301b0bb0cc5ee7d3b6f2424e0835 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/dual_eef_abs.yaml @@ -0,0 +1,20 @@ +name: dual_eef_abs +input_dim: 14 +input: absolute +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + left_arm: + space: eef + position_dims: [0, 1, 2] + rotation_dims: [3, 4, 5] + rotation_format: rotation_vector + gripper_dim: 6 + right_arm: + space: eef + position_dims: [7, 8, 9] + rotation_dims: [10, 11, 12] + rotation_format: rotation_vector + gripper_dim: 13 diff --git a/runtime/backends/actioncodec2/assets/presets/dual_eef_delta.yaml b/runtime/backends/actioncodec2/assets/presets/dual_eef_delta.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1edfdedceb893145714572d38eab733f113fa81a --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/dual_eef_delta.yaml @@ -0,0 +1,20 @@ +name: dual_eef_delta +input_dim: 14 +input: delta +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + left_arm: + space: eef + position_dims: [0, 1, 2] + rotation_dims: [3, 4, 5] + rotation_format: rotation_vector + gripper_dim: 6 + right_arm: + space: eef + position_dims: [7, 8, 9] + rotation_dims: [10, 11, 12] + rotation_format: rotation_vector + gripper_dim: 13 diff --git a/runtime/backends/actioncodec2/assets/presets/dual_joint6_abs.yaml b/runtime/backends/actioncodec2/assets/presets/dual_joint6_abs.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4c5662323bed1af49401d9c541cf32bfe194920b --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/dual_joint6_abs.yaml @@ -0,0 +1,18 @@ +name: dual_joint6_abs +input_dim: 14 +input: absolute +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + left_arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5] + joint_wrap: pi + gripper_dim: 6 + right_arm: + space: joint + joint_dims: [7, 8, 9, 10, 11, 12] + joint_wrap: pi + gripper_dim: 13 diff --git a/runtime/backends/actioncodec2/assets/presets/dual_joint6_delta.yaml b/runtime/backends/actioncodec2/assets/presets/dual_joint6_delta.yaml new file mode 100644 index 0000000000000000000000000000000000000000..113d91e87e7bb963f55ef389b78c387b4e29b24c --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/dual_joint6_delta.yaml @@ -0,0 +1,16 @@ +name: dual_joint6_delta +input_dim: 14 +input: delta +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + left_arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5] + gripper_dim: 6 + right_arm: + space: joint + joint_dims: [7, 8, 9, 10, 11, 12] + gripper_dim: 13 diff --git a/runtime/backends/actioncodec2/assets/presets/dual_joint7_abs.yaml b/runtime/backends/actioncodec2/assets/presets/dual_joint7_abs.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1c3a2aaa67e1f482fd8bfffde8c9cbfba077fbb2 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/dual_joint7_abs.yaml @@ -0,0 +1,18 @@ +name: dual_joint7_abs +input_dim: 16 +input: absolute +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + left_arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5, 6] + joint_wrap: pi + gripper_dim: 7 + right_arm: + space: joint + joint_dims: [8, 9, 10, 11, 12, 13, 14] + joint_wrap: pi + gripper_dim: 15 diff --git a/runtime/backends/actioncodec2/assets/presets/dual_joint7_delta.yaml b/runtime/backends/actioncodec2/assets/presets/dual_joint7_delta.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f9ecafc22a943ed03b0508be5a65e3652cdab648 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/dual_joint7_delta.yaml @@ -0,0 +1,16 @@ +name: dual_joint7_delta +input_dim: 16 +input: delta +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + left_arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5, 6] + gripper_dim: 7 + right_arm: + space: joint + joint_dims: [8, 9, 10, 11, 12, 13, 14] + gripper_dim: 15 diff --git a/runtime/backends/actioncodec2/assets/presets/single_eef_abs.yaml b/runtime/backends/actioncodec2/assets/presets/single_eef_abs.yaml new file mode 100644 index 0000000000000000000000000000000000000000..212e73ea5634baf84a930d39947f819ba98b2a55 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/single_eef_abs.yaml @@ -0,0 +1,14 @@ +name: single_eef_abs +input_dim: 7 +input: absolute +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + arm: + space: eef + position_dims: [0, 1, 2] + rotation_dims: [3, 4, 5] + rotation_format: rotation_vector + gripper_dim: 6 diff --git a/runtime/backends/actioncodec2/assets/presets/single_eef_delta.yaml b/runtime/backends/actioncodec2/assets/presets/single_eef_delta.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8ad60528010f381789a4e0d6cba89633b7e1cc6d --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/single_eef_delta.yaml @@ -0,0 +1,14 @@ +name: single_eef_delta +input_dim: 7 +input: delta +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + arm: + space: eef + position_dims: [0, 1, 2] + rotation_dims: [3, 4, 5] + rotation_format: rotation_vector + gripper_dim: 6 diff --git a/runtime/backends/actioncodec2/assets/presets/single_joint6_abs.yaml b/runtime/backends/actioncodec2/assets/presets/single_joint6_abs.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6c5830439ba29d38761b81b52b309fc577b52ec0 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/single_joint6_abs.yaml @@ -0,0 +1,13 @@ +name: single_joint6_abs +input_dim: 7 +input: absolute +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5] + joint_wrap: pi + gripper_dim: 6 diff --git a/runtime/backends/actioncodec2/assets/presets/single_joint6_abs_no_gripper.yaml b/runtime/backends/actioncodec2/assets/presets/single_joint6_abs_no_gripper.yaml new file mode 100644 index 0000000000000000000000000000000000000000..459e788f2d76387f22b1b04c40951999d782c603 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/single_joint6_abs_no_gripper.yaml @@ -0,0 +1,12 @@ +name: single_joint6_abs_no_gripper +input_dim: 6 +input: absolute +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5] + joint_wrap: pi diff --git a/runtime/backends/actioncodec2/assets/presets/single_joint6_delta.yaml b/runtime/backends/actioncodec2/assets/presets/single_joint6_delta.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4313e00922585e44a74269f8ee379937d7da2188 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/single_joint6_delta.yaml @@ -0,0 +1,12 @@ +name: single_joint6_delta +input_dim: 7 +input: delta +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5] + gripper_dim: 6 diff --git a/runtime/backends/actioncodec2/assets/presets/single_joint7_abs.yaml b/runtime/backends/actioncodec2/assets/presets/single_joint7_abs.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e92e58c3829e4f99b6e06b7e21d7993453120409 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/single_joint7_abs.yaml @@ -0,0 +1,13 @@ +name: single_joint7_abs +input_dim: 8 +input: absolute +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5, 6] + joint_wrap: pi + gripper_dim: 7 diff --git a/runtime/backends/actioncodec2/assets/presets/single_joint7_delta.yaml b/runtime/backends/actioncodec2/assets/presets/single_joint7_delta.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4592c2a2974fc41e742aa4f266d3f597ce333f00 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/presets/single_joint7_delta.yaml @@ -0,0 +1,12 @@ +name: single_joint7_delta +input_dim: 8 +input: delta +source_hz: 15.0 +target_hz: 15.0 +interpolation: cubic +token_order: time_major +components: + arm: + space: joint + joint_dims: [0, 1, 2, 3, 4, 5, 6] + gripper_dim: 7 diff --git a/runtime/backends/actioncodec2/assets/profiles/eef.yaml b/runtime/backends/actioncodec2/assets/profiles/eef.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1966823a724b4ab62db12fef9884beeff9d120e2 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/profiles/eef.yaml @@ -0,0 +1,74 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 7 + components: + translation_m: + dims: + start: 0 + stop: 3 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -2.0 + max: 2.0 + order_1: + min: -0.08 + max: 0.08 + distortion_limit: 0.005 + primitive_selection: smooth + orientation_so3: + dims: + start: 3 + stop: 6 + space: so3 + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -3.141592653589793 + max: 3.141592653589793 + order_1: + min: -0.25 + max: 0.25 + distortion_limit: 0.02 + primitive_selection: smooth + representation: rotation_vector + multiplication: right + gripper_open_command: + dims: + - 6 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false +train: + primitives: + zero_primitive_components: + - translation_m + - orientation_so3 + bpe: + spatial_vocab_size: 2048 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 diff --git a/runtime/backends/actioncodec2/assets/profiles/eef_second_order.yaml b/runtime/backends/actioncodec2/assets/profiles/eef_second_order.yaml new file mode 100644 index 0000000000000000000000000000000000000000..875a0aead072d3c76c46a7ed38f18fd2e94de30e --- /dev/null +++ b/runtime/backends/actioncodec2/assets/profiles/eef_second_order.yaml @@ -0,0 +1,80 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 7 + components: + translation_m: + dims: + start: 0 + stop: 3 + space: additive + input_order: 0 + primitive_order: 2 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -2.0 + max: 2.0 + order_2: + min: -0.025 + max: 0.025 + order_1: + min: -0.08 + max: 0.08 + distortion_limit: 0.005 + primitive_selection: smooth + orientation_so3: + dims: + start: 3 + stop: 6 + space: so3 + input_order: 0 + primitive_order: 2 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -3.141592653589793 + max: 3.141592653589793 + order_2: + min: -0.08 + max: 0.08 + order_1: + min: -0.25 + max: 0.25 + distortion_limit: 0.02 + primitive_selection: smooth + representation: rotation_vector + multiplication: right + gripper_open_command: + dims: + - 6 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false +train: + primitives: + zero_primitive_components: + - translation_m + - orientation_so3 + bpe: + spatial_vocab_size: 2048 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 diff --git a/runtime/backends/actioncodec2/assets/profiles/joint.yaml b/runtime/backends/actioncodec2/assets/profiles/joint.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bc73f62cc4965f0c4c32a2dcec3f988b24041448 --- /dev/null +++ b/runtime/backends/actioncodec2/assets/profiles/joint.yaml @@ -0,0 +1,52 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 8 + components: + generalized_joint_position: + dims: + start: 0 + stop: 7 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -6.283185307179586 + max: 6.283185307179586 + order_1: + min: -0.35 + max: 0.35 + distortion_limit: [0.004, 0.004, 0.006, 0.0075, 0.015, 0.020, 0.020] + primitive_selection: smooth + gripper_open_command: + dims: + - 7 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false +train: + primitives: + zero_primitive_components: + - generalized_joint_position + bpe: + spatial_vocab_size: 2048 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 diff --git a/runtime/backends/actioncodec2/assets/profiles/joint_second_order.yaml b/runtime/backends/actioncodec2/assets/profiles/joint_second_order.yaml new file mode 100644 index 0000000000000000000000000000000000000000..01828458271c25aa5a8e1738bdec60192033bb1a --- /dev/null +++ b/runtime/backends/actioncodec2/assets/profiles/joint_second_order.yaml @@ -0,0 +1,62 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 8 + components: + generalized_joint_position: + dims: + start: 0 + stop: 7 + space: additive + input_order: 0 + primitive_order: 2 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -6.283185307179586 + max: 6.283185307179586 + order_2: + min: -0.25 + max: 0.25 + order_1: + min: -0.35 + max: 0.35 + distortion_limit: + - 0.004 + - 0.004 + - 0.006 + - 0.0075 + - 0.015 + - 0.02 + - 0.02 + primitive_selection: smooth + gripper_open_command: + dims: + - 7 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false +train: + primitives: + zero_primitive_components: + - generalized_joint_position + bpe: + spatial_vocab_size: 2048 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 diff --git a/runtime/backends/actioncodec2/batch_semantics.py b/runtime/backends/actioncodec2/batch_semantics.py new file mode 100644 index 0000000000000000000000000000000000000000..fddb989ee0615376de53c5b33d5a4dbe3e74ef41 --- /dev/null +++ b/runtime/backends/actioncodec2/batch_semantics.py @@ -0,0 +1,269 @@ +"""Canonical adapters shared by episode fitting and batched inference.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np + +from ._so3 import ( + conjugate_quaternion, + multiply_quaternions, + normalize_quaternion, + quaternion_to_rotvec, +) +from .native_backend import native_kernel +from .semantic import ( + difference_additive, + eef_pose_absolute, + eef_pose_components, + eef_pose_deltas, + eef_pose_from_components, + integrate_additive, + integrate_eef_deltas, + normalize_gripper_actions, + resample_uniform, + wrap_to_pi, +) + +if TYPE_CHECKING: + from .presets import ComponentSpec, PresetConfig + + +def _resample(values, source_hz, target_hz, method, *, kind="linear", target_length=None): + source_hz, target_hz = float(source_hz), float(target_hz) + if source_hz == target_hz and target_length in (None, values.shape[1]): + return values + kernel = native_kernel("resample_uniform_batch") + if kernel is not None: + return kernel( + values, + source_hz, + target_hz, + kind, + -1 if target_length is None else target_length, + method, + ) + return np.stack( + [ + resample_uniform( + row, + source_hz=source_hz, + target_hz=target_hz, + kind=kind, + target_length=target_length, + method=method, + ) + for row in values + ] + ) + + +def _pose_map(values, kernel_name, reference): + kernel = native_kernel(kernel_name) + return kernel(values) if kernel is not None else np.stack([reference(row) for row in values]) + + +def _rotvec_poses(values): + kernel = native_kernel("eef_pose_from_rotvec_batch") + if kernel is not None: + return kernel(values) + flat = values.reshape(-1, 6) + return eef_pose_from_components(flat[:, :3], flat[:, 3:], "rotation_vector").reshape( + *values.shape[:2], 7 + ) + + +def _poses(values: np.ndarray, component: ComponentSpec) -> np.ndarray: + position = np.take(values, component.position_dims, axis=-1) + rotation = np.take(values, component.rotation_dims, axis=-1) + if component.rotation_format == "rotation_vector": + return _rotvec_poses(np.concatenate((position, rotation), axis=-1)) + return eef_pose_from_components( + position.reshape(-1, 3), rotation.reshape(-1, rotation.shape[-1]), component.rotation_format + ).reshape(*values.shape[:2], 7) + + +def _local(poses, anchor): + quaternion = normalize_quaternion(poses[..., 3:7]) + inverse = conjugate_quaternion(normalize_quaternion(anchor[..., 3:7])) + relative = multiply_quaternions(inverse, quaternion) + return np.concatenate( + (poses[..., :3].astype(np.float64) - anchor[..., :3], quaternion_to_rotvec(relative)), + axis=-1, + ).astype(np.float32) + + +def _joint(preset, values, component, source_hz, current_state): + source = np.take(values, component.joint_dims, axis=-1) + if preset.input == "delta": + source = integrate_additive(source, 1) + anchor = np.zeros((len(source), 1, source.shape[-1]), np.float32) + else: + anchor = ( + source[:, :1] + if current_state is None + else np.take(current_state, component.joint_dims, axis=-1)[:, None] + ) + joined = np.concatenate((anchor, source), axis=1) + if component.joint_wrap == "pi": + outside = np.abs(joined) > np.pi + 1e-5 + if outside.any(): + row = int(np.flatnonzero(outside.any(axis=(1, 2)))[0]) + column = component.joint_dims[int(np.argmax(outside[row].any(axis=0)))] + raise ValueError( + f"action space {preset.name!r} declares joint_wrap='pi' for component " + f"{component.name!r}, so its absolute joint columns must lie in (-pi, pi]; " + f"source column {column} reaches {joined[row][outside[row]][0]:.6g} rad. Wrap the " + "inputs, or register a layout with joint_wrap='none' for coordinates that " + "are continuous past one turn, such as a multi-turn or prismatic axis." + ) + batch, steps, width = joined.shape + kernel = native_kernel("unwrap_angles") + unwrapped = ( + ( + kernel(joined.transpose(1, 0, 2).reshape(steps, batch * width), True) + .reshape(steps, batch, width) + .transpose(1, 0, 2) + ) + if kernel is not None + else np.unwrap(joined, axis=1) + ) + anchor, source = unwrapped[:, :1], unwrapped[:, 1:] + return np.asarray( + _resample(source, source_hz, preset.target_hz, preset.interpolation) - anchor, + dtype=np.float32, + ) + + +def _eef(preset, values, component, source_hz, current_state): + if preset.input == "delta": + delta = np.concatenate( + ( + np.take(values, component.position_dims, axis=-1), + np.take(values, component.rotation_dims, axis=-1), + ), + axis=-1, + ) + poses = _pose_map(delta, "integrate_eef_deltas_batch", integrate_eef_deltas) + sampled = _resample( + poses, source_hz, preset.target_hz, preset.interpolation, kind="pose_xyzw" + ) + return _pose_map(sampled, "eef_pose_absolute_batch", eef_pose_absolute) + poses = _poses(values, component) + anchor = poses[:, :1] if current_state is None else _poses(current_state[:, None], component) + sampled = _resample(poses, source_hz, preset.target_hz, preset.interpolation, kind="pose_xyzw") + return _local(sampled, anchor) + + +def canonicalize_batch(preset: PresetConfig, values, *, source_hz, current_state): + """Return component ``(B,T_codec,D_active)`` arrays from validated input.""" + return { + component.name: canonicalize_component_batch( + preset, values, component, source_hz=source_hz, current_state=current_state + ) + for component in preset.components + } + + +def canonicalize_component_batch(preset, values, component, *, source_hz, current_state): + """Convert one component of validated ``(B,T,D)`` source actions.""" + motion = (_joint if component.space == "joint" else _eef)( + preset, values, component, source_hz, current_state + ) + if component.gripper_dim is None: + return motion + gripper = values[..., component.gripper_dim : component.gripper_dim + 1] + if component.gripper_threshold is not None: + gripper = ((gripper >= component.gripper_threshold) if component.gripper_open_is_high + else (gripper <= component.gripper_threshold)).astype(np.float32) + else: + gripper = normalize_gripper_actions( + gripper.reshape(-1, 1), + closed_value=component.gripper_closed_value, + open_value=component.gripper_open_value, + ).reshape(*values.shape[:2], 1) + gripper = _resample(gripper, source_hz, preset.target_hz, preset.interpolation, kind="hold") + return np.concatenate((motion, gripper), axis=-1) + + +def _external_eef(motion, component, current_state): + poses = _rotvec_poses(motion) + if current_state is None: + return _pose_map(poses, "eef_pose_deltas_batch", eef_pose_deltas) + anchor = _poses(current_state[:, None], component) + quaternion = multiply_quaternions( + normalize_quaternion(anchor[..., 3:7]), normalize_quaternion(poses[..., 3:7]) + ) + attached = np.concatenate( + (poses[..., :3].astype(np.float64) + anchor[..., :3], quaternion), axis=-1 + ).astype(np.float32) + return eef_pose_components(attached.reshape(-1, 7), component.rotation_format).reshape( + *attached.shape[:2], 3 + len(component.rotation_dims) + ) + + +def externalize_batch( + values, component: ComponentSpec, *, source_hz, target_hz, target_length, method, current_state +): + """Resample decoded paths and return ``(B,T_output,D_component)`` arrays.""" + sampled = resample_canonical_batch( + values, + component, + source_hz=source_hz, + target_hz=target_hz, + target_length=target_length, + method=method, + ) + return externalize_canonical_batch(sampled, component, current_state=current_state) + + +def resample_canonical_batch( + values, component: ComponentSpec, *, source_hz, target_hz, target_length, method +): + """Rate-convert local ``(B,T,D_active)`` paths, holding gripper commands.""" + motion_width = len(component.joint_dims or ()) if component.space == "joint" else 6 + motion = values[..., :motion_width] + if component.space == "eef": + poses = _rotvec_poses(motion) + poses = _resample( + poses, source_hz, target_hz, method, kind="pose_xyzw", target_length=target_length + ) + motion = _pose_map(poses, "eef_pose_absolute_batch", eef_pose_absolute) + else: + motion = _resample(motion, source_hz, target_hz, method, target_length=target_length) + if component.gripper_dim is None: + return np.asarray(motion, dtype=np.float32) + gripper = _resample( + values[..., motion_width : motion_width + 1], + source_hz, + target_hz, + method, + kind="hold", + target_length=target_length, + ) + return np.asarray(np.concatenate((motion, gripper), axis=-1), dtype=np.float32) + + +def externalize_canonical_batch(values, component: ComponentSpec, *, current_state): + """Restore source coordinates or deltas from ``(B,T,D_active)`` local paths.""" + motion_width = len(component.joint_dims or ()) if component.space == "joint" else 6 + motion = values[..., :motion_width] + if component.space == "eef": + motion = _external_eef(motion, component, current_state) + elif current_state is None: + motion = difference_additive(motion, 1) + else: + motion = motion + np.take(current_state, component.joint_dims, axis=-1)[:, None] + if component.joint_wrap == "pi": + motion = wrap_to_pi(motion) + if component.gripper_dim is None: + return np.asarray(motion, dtype=np.float32) + gripper = values[..., motion_width : motion_width + 1] + if component.gripper_threshold is not None: + gripper = gripper if component.gripper_open_is_high else 1.0 - gripper + return np.asarray(np.concatenate((motion, gripper), axis=-1), dtype=np.float32) + gripper = component.gripper_closed_value + gripper * ( + component.gripper_open_value - component.gripper_closed_value + ) + return np.asarray(np.concatenate((motion, gripper), axis=-1), dtype=np.float32) diff --git a/runtime/physical/boundary.py b/runtime/backends/actioncodec2/boundary.py similarity index 74% rename from runtime/physical/boundary.py rename to runtime/backends/actioncodec2/boundary.py index 752f59988a111609e00525d644d13371d7ca9440..6e302a27aa71618251a24a54266ab1cce5cf1ce7 100644 --- a/runtime/physical/boundary.py +++ b/runtime/backends/actioncodec2/boundary.py @@ -6,21 +6,14 @@ import numpy as np from .configuration import ActionCodec2Config from .physical_codec import _scale, _SO3Runtime -from .trajectory import ( - ActiveTrajectory, - TrajectoryLike, - prepare_trajectory, - trajectory_boundary, -) +from .trajectory import ActiveTrajectory, TrajectoryLike, prepare_trajectory, trajectory_boundary def source_differences( trajectory: TrajectoryLike, config: ActionCodec2Config ) -> dict[str, tuple[tuple[int, ...], np.ndarray, np.ndarray]]: - "Measure physical first/second differences with the declared group law." - values, dims = prepare_trajectory( - trajectory, dimension=config.physical.input_dim, index=0 - ) + """Measure physical first/second differences with the declared group law.""" + values, dims = prepare_trajectory(trajectory, dimension=config.physical.input_dim, index=0) boundary = trajectory_boundary(trajectory, config, dims) output = {} for name, component in config.physical.components.items(): @@ -31,11 +24,7 @@ def source_differences( indices = [component.dims.index(d) for d in present] scale = np.take(_scale(component), indices) raw = values[:, local].astype(np.float64) * scale - previous = ( - None - if boundary is None - else boundary[list(present)].astype(np.float64) * scale - ) + previous = None if boundary is None else boundary[list(present)].astype(np.float64) * scale if component.space == "additive": if component.input_order == 0: first = np.diff(raw, axis=0, prepend=np.zeros((1, len(present)))) @@ -43,9 +32,7 @@ def source_differences( first = raw else: if previous is None: - raise ValueError( - "order-2 input statistics require previous_first_order" - ) + raise ValueError("order-2 input statistics require previous_first_order") first = np.cumsum(raw, axis=0) + previous second = ( np.diff(first, axis=0) @@ -54,15 +41,11 @@ def source_differences( ) else: if len(present) != 3: - raise ValueError( - "differential statistics require complete SO(3) components" - ) + raise ValueError("differential statistics require complete SO(3) components") runtime = _SO3Runtime(component, (np.zeros(1),) * 3) quaternion = runtime._from_representation(raw) if component.input_order == 0: - anchors = np.concatenate( - (np.array([[0.0, 0.0, 0.0, 1.0]]), quaternion[:-1]) - ) + anchors = np.concatenate((np.array([[0.0, 0.0, 0.0, 1.0]]), quaternion[:-1])) increments = runtime._residual(quaternion, anchors) else: increments = quaternion @@ -82,18 +65,14 @@ def source_differences( def bootstrap_second_order_trajectory( trajectory: ActiveTrajectory, config: ActionCodec2Config ) -> ActiveTrajectory: - "Use two observed positions as context and encode the remaining suffix." - values, dims = prepare_trajectory( - trajectory, dimension=config.physical.input_dim, index=0 - ) + """Use two observed positions as context and encode the remaining suffix.""" + values, dims = prepare_trajectory(trajectory, dimension=config.physical.input_dim, index=0) if len(values) < 3: raise ValueError( "second-order bootstrap requires two context frames and at least one target" ) if trajectory.previous_first_order is not None: - raise ValueError( - "trajectory already has previous_first_order; do not bootstrap it again" - ) + raise ValueError("trajectory already has previous_first_order; do not bootstrap it again") result = values[2:].copy() previous = np.zeros(len(dims), dtype=np.float32) for component in config.physical.components.values(): @@ -111,12 +90,9 @@ def bootstrap_second_order_trajectory( if len(local) != 3: raise ValueError("bootstrap requires complete SO(3) components") runtime = _SO3Runtime(component, (np.zeros(1),) * 3) - quaternion = runtime._from_representation( - values[:, local] * _scale(component) - ) + quaternion = runtime._from_representation(values[:, local] * _scale(component)) increment = runtime._residual(quaternion[1:2], quaternion[:1]) - from ._so3 import conjugate_quaternion, multiply_quaternions anchor = conjugate_quaternion(quaternion[1:2]) @@ -125,10 +101,6 @@ def bootstrap_second_order_trajectory( if runtime.left else multiply_quaternions(anchor, quaternion[2:]) ) - result[:, local] = runtime._to_representation(local_path) / _scale( - component - ) - previous[local] = runtime._to_representation(increment)[0] / _scale( - component - ) + result[:, local] = runtime._to_representation(local_path) / _scale(component) + previous[local] = runtime._to_representation(increment)[0] / _scale(component) return ActiveTrajectory(result, dims, previous_first_order=previous) diff --git a/runtime/tokenization/bpe.py b/runtime/backends/actioncodec2/bpe.py similarity index 52% rename from runtime/tokenization/bpe.py rename to runtime/backends/actioncodec2/bpe.py index 747ceae95157ded38bf44049b2273ab30f4296eb..a2d5f92293c3b63a503551974320aaca9d04aff1 100644 --- a/runtime/tokenization/bpe.py +++ b/runtime/backends/actioncodec2/bpe.py @@ -1,4 +1,4 @@ -"Strict ``bpe.json`` I/O for both tokenization schemes." +'Strict ``bpe.json`` I/O for both tokenization schemes.' from __future__ import annotations @@ -6,48 +6,35 @@ import json from collections.abc import Mapping, Sequence from numbers import Integral from pathlib import Path +from typing import TypeVar import numpy as np -from ..common._validation import active_dimensions +from ._validation import active_dimensions from .bpe_vocabulary import BPEVocabulary -from ..physical.configuration import ActionCodec2Config, ConfigError -from .setbpe_spatial import SpatialVocabulary -from .setbpe_temporal import TemporalVocabulary +from .configuration import ActionCodec2Config, ConfigError, _integer +from .native_serialization import NativeCacheMixin, decode_native, encode_native +from .packing import EncodingSearch +from .setbpe.spatial import SpatialVocabulary +from .setbpe.temporal import TemporalVocabulary BPE_NAME = "bpe.json" - - -def _integer(value: object, path: str, *, positive: bool = False) -> int: - if isinstance(value, bool) or not isinstance(value, int): - raise ConfigError(f"{path} must be an integer") - minimum = 1 if positive else 0 - if value < minimum: - qualifier = "positive" if positive else "non-negative" - raise ConfigError(f"{path} must be {qualifier}") - return int(value) +SerializerT = TypeVar("SerializerT", bound="_Serializer") def _rules(payload: object, width: int, path: str) -> tuple[tuple[int, ...], ...]: - if not isinstance(payload, Sequence) or isinstance( - payload, (str, bytes, bytearray) - ): + if not isinstance(payload, Sequence) or isinstance(payload, (str, bytes, bytearray)): raise ConfigError(f"{path} must be a list") output = [] for rank, raw_rule in enumerate(payload): rule_path = f"{path}[{rank}]" - if not isinstance(raw_rule, Sequence) or isinstance( - raw_rule, (str, bytes, bytearray) - ): + if not isinstance(raw_rule, Sequence) or isinstance(raw_rule, (str, bytes, bytearray)): raise ConfigError(f"{rule_path} must be a list of {width} integers") if len(raw_rule) != width: raise ConfigError(f"{rule_path} must contain exactly {width} integers") output.append( - tuple( - _integer(value, f"{rule_path}[{index}]") - for index, value in enumerate(raw_rule) - ) + tuple(_integer(value, f"{rule_path}[{index}]") for index, value in enumerate(raw_rule)) ) return tuple(output) @@ -72,16 +59,12 @@ def _validate_rule_references( for rank, (left, right) in enumerate(spatial_merges): child = atom_count + rank if left >= child or right >= child: - raise ConfigError( - f"spatial_merges[{rank}] must reference already-created tokens" - ) + raise ConfigError(f"spatial_merges[{rank}] must reference already-created tokens") spatial_size = atom_count + len(spatial_merges) for rank, (left, right, offset) in enumerate(temporal_merges): child = spatial_size + rank if left >= child or right >= child: - raise ConfigError( - f"temporal_merges[{rank}] must reference already-created tokens" - ) + raise ConfigError(f"temporal_merges[{rank}] must reference already-created tokens") if not 1 <= offset < lookahead: raise ConfigError( f"temporal_merges[{rank}] offset must be positive and smaller than lookahead" @@ -92,11 +75,7 @@ def _read_payload(directory: str | Path) -> dict[str, object]: path = Path(directory) / BPE_NAME try: - return json.loads( - path.read_text(encoding="utf-8"), object_pairs_hook=_unique_json_object - ) - except OSError: - raise + return json.loads(path.read_text(encoding="utf-8"), object_pairs_hook=_unique_json_object) except json.JSONDecodeError as error: raise ConfigError(f"cannot parse {path}: {error}") from error @@ -105,34 +84,34 @@ def _dense_cells( cells: np.ndarray, bins: Sequence[int], active_dims: Sequence[int] | None, + *, + ndim: int = 2, ) -> tuple[np.ndarray, tuple[int, ...] | None]: raw = np.asarray(cells) if raw.dtype.kind not in {"i", "u"}: raise ValueError("cells must contain integer indices") values = np.asarray(raw, dtype=np.int64) - if values.ndim != 2 or len(values) < 1 or values.shape[1] < 1: + if values.ndim != ndim or min(values.shape) < 1: raise ValueError("cells must have non-empty shape [T, D_active]") if active_dims is None: - if values.shape[1] > len(bins): + if values.shape[-1] > len(bins): raise ValueError(f"cells width exceeds codebook dimension {len(bins)}") - if values.shape[1] < len(bins): - dimensions = tuple(range(values.shape[1])) - dense = np.full((len(values), len(bins)), -1, dtype=np.int64) - dense[:, : values.shape[1]] = values + if values.shape[-1] < len(bins): + dimensions = tuple(range(values.shape[-1])) + dense = np.full((*values.shape[:-1], len(bins)), -1, dtype=np.int64) + dense[..., : values.shape[-1]] = values values = dense else: dimensions = None else: dimensions = active_dimensions(active_dims, len(bins)) - if len(dimensions) != values.shape[1]: - raise ValueError( - "active_dims must have one entry per compact cell coordinate" - ) + if len(dimensions) != values.shape[-1]: + raise ValueError("active_dims must have one entry per compact cell coordinate") if np.any(values < 0): raise ValueError("compact cells must not contain -1") - dense = np.full((len(values), len(bins)), -1, dtype=np.int64) - dense[:, dimensions] = values + dense = np.full((*values.shape[:-1], len(bins)), -1, dtype=np.int64) + dense[..., dimensions] = values values = dense counts = np.asarray(tuple(int(value) for value in bins), dtype=np.int64) if np.any(values < -1) or np.any(values >= counts[None, :]): @@ -140,63 +119,84 @@ def _dense_cells( return values, dimensions -class SetBPESerializer: - "Lossless mapping between ``[T,D]`` physical cells and token IDs." +class _Serializer(NativeCacheMixin): + - scheme = "set_bpe" + _merge_fields: tuple[str, ...] - def __init__( - self, - *, - bins: Sequence[int], - lookahead: int, - spatial_merges: Sequence[Sequence[int]], - temporal_merges: Sequence[Sequence[int]], - ) -> None: + def _init_dimensions(self, bins: Sequence[int], lookahead: int) -> None: + self.encoding_search = EncodingSearch() self.lookahead = _integer(lookahead, "lookahead", positive=True) self.bins = tuple( - _integer(value, f"bins[{index}]", positive=True) - for index, value in enumerate(bins) + _integer(value, f"bins[{index}]", positive=True) for index, value in enumerate(bins) ) if not self.bins: raise ConfigError("bins must contain at least one cell slot") - self.spatial_merges = _rules(spatial_merges, 2, "spatial_merges") - self.temporal_merges = _rules(temporal_merges, 3, "temporal_merges") - _validate_rule_references( - atom_count=sum(self.bins), - lookahead=self.lookahead, - spatial_merges=self.spatial_merges, - temporal_merges=self.temporal_merges, - ) - try: - self.spatial = SpatialVocabulary(self.bins, self.spatial_merges) - self.vocabulary = TemporalVocabulary( - self.spatial, self.lookahead, self.temporal_merges - ) - except ValueError as error: - raise ConfigError(str(error)) from error - self.patterns = self.vocabulary.patterns - self.root = self.vocabulary.root - self.vocab_size = self.vocabulary.vocab_size - self.token_cell_counts = np.asarray( - [ - sum( - int(self.spatial.support[spatial_token]).bit_count() - for _, spatial_token in self.patterns[token] - ) - for token in range(self.vocab_size) - ], - dtype=np.int64, + + def configure_encoding( + self, + *, + spatial_search: bool = False, + temporal_search: bool = False, + search_window: int = 32, + search_beam: int = 4, + ): + 'Select independent runtime packing stages; both default to disabled.' + options = EncodingSearch(spatial_search, temporal_search, search_window, search_beam) + options.validate_codec(self.scheme, self.bins) + self.encoding_search = options + return self + + def encode_batch(self, cells: np.ndarray, *, active_dims=None) -> list[list[int]]: + values = np.asarray(cells) + if values.ndim != 3 or min(values.shape) < 1: + raise ValueError("cells must have non-empty shape [B,T,D]") + dense, _ = _dense_cells(values, self.bins, active_dims, ndim=3) + result = encode_native(self, dense) + return ( + result + if result is not None + else [self.encode(row, active_dims=active_dims) for row in values] ) + def decode_batch(self, streams, *, active_dims=None) -> np.ndarray: + dims = active_dimensions(active_dims, len(self.bins)) + result = decode_native(self, streams, dims, validate=True) + if result is not None: + return result + rows = [] + for stream in streams: + row = [] + for token in stream: + if isinstance(token, bool) or not isinstance(token, Integral): + raise ValueError("tokens must be integers") + if not 0 <= int(token) < self.vocab_size: + raise ValueError("token is outside the vocabulary") + row.append(int(token)) + if not row: + raise ValueError("token stream must not be empty") + rows.append(row) + if not rows: + raise ValueError("streams must not be empty") + result = decode_native(self, rows, dims) + if result is not None: + return result + cells = [self.decode(row, active_dims=active_dims) for row in rows] + if len({len(row) for row in cells}) != 1: + raise ValueError("all token streams must decode to the same length") + return np.stack(cells) + def encode( self, cells: np.ndarray, *, active_dims: Sequence[int] | None = None, ) -> list[int]: - "Serialize one non-empty trajectory without emitting absent slots." + 'Serialize one non-empty trajectory without emitting absent slots.' values, _ = _dense_cells(cells, self.bins, active_dims) + result = encode_native(self, values[None]) + if result is not None: + return result[0] return self.vocabulary.encode(values) def decode( @@ -216,51 +216,43 @@ class SetBPESerializer: if not 0 <= value < self.vocab_size: raise ValueError(f"tokens[{index}] is outside the vocabulary") checked.append(value) - return self.vocabulary.decode(checked, active_dims=active_dims) + result = decode_native(self, [checked], active_dimensions(active_dims, len(self.bins))) + return ( + result[0] + if result is not None + else self.vocabulary.decode(checked, active_dims=active_dims) + ) def to_dict(self) -> dict[str, object]: - """Return the intentionally minimal, path-independent BPE artifact.""" + """Return only the merge lists; physical metadata lives in config.yaml.""" return { - "spatial_merges": [list(rule) for rule in self.spatial_merges], - "temporal_merges": [list(rule) for rule in self.temporal_merges], + field: [list(rule) for rule in getattr(self, field)] for field in self._merge_fields } @classmethod def from_dict( - cls, - payload: object, - *, - bins: Sequence[int], - lookahead: int, - ) -> SetBPESerializer: - if not isinstance(payload, Mapping) or not all( - isinstance(key, str) for key in payload - ): + cls: type[SerializerT], payload: object, *, bins: Sequence[int], lookahead: int + ) -> SerializerT: + """Validate the scheme's exact artifact fields before constructing it.""" + if not isinstance(payload, Mapping) or not all(isinstance(key, str) for key in payload): raise ConfigError(f"{BPE_NAME} must contain one JSON object") - allowed = {"spatial_merges", "temporal_merges"} - unknown = sorted(set(payload) - allowed) - if unknown: - raise ConfigError( - f"{BPE_NAME} contains unknown field(s): {', '.join(unknown)}" - ) - missing = sorted(allowed - set(payload)) - if missing: - raise ConfigError(f"{BPE_NAME} is missing field(s): {', '.join(missing)}") - return cls( - bins=bins, - lookahead=lookahead, - spatial_merges=payload["spatial_merges"], - temporal_merges=payload["temporal_merges"], - ) + allowed = set(cls._merge_fields) + for fields, message in ( + (set(payload) - allowed, "contains unknown field(s)"), + (allowed - set(payload), "is missing field(s)"), + ): + if fields: + raise ConfigError(f"{BPE_NAME} {message}: {', '.join(sorted(fields))}") + return cls(bins=bins, lookahead=lookahead, **payload) @classmethod def from_pretrained( - cls, + cls: type[SerializerT], directory: str | Path, *, bins: Sequence[int], lookahead: int, - ) -> SetBPESerializer: + ) -> SerializerT: return cls.from_dict(_read_payload(directory), bins=bins, lookahead=lookahead) def save_pretrained(self, directory: str | Path) -> Path: @@ -271,10 +263,54 @@ class SetBPESerializer: return path -class BPESerializer: - "Lossless mapping between ``[T,D]`` physical cells and plain-BPE ids." +class SetBPESerializer(_Serializer): + 'Lossless mapping between ``[T,D]`` physical cells and token IDs.' + + scheme = "set_bpe" + _merge_fields = ("spatial_merges", "temporal_merges") + + def __init__( + self, + *, + bins: Sequence[int], + lookahead: int, + spatial_merges: Sequence[Sequence[int]], + temporal_merges: Sequence[Sequence[int]], + ) -> None: + self._init_dimensions(bins, lookahead) + self.spatial_merges = _rules(spatial_merges, 2, "spatial_merges") + self.temporal_merges = _rules(temporal_merges, 3, "temporal_merges") + _validate_rule_references( + atom_count=sum(self.bins), + lookahead=self.lookahead, + spatial_merges=self.spatial_merges, + temporal_merges=self.temporal_merges, + ) + try: + self.spatial = SpatialVocabulary(self.bins, self.spatial_merges) + self.vocabulary = TemporalVocabulary(self.spatial, self.lookahead, self.temporal_merges) + except ValueError as error: + raise ConfigError(str(error)) from error + self.patterns = self.vocabulary.patterns + self.root = self.vocabulary.root + self.vocab_size = self.vocabulary.vocab_size + self.token_cell_counts = np.asarray( + [ + sum( + int(self.spatial.support[spatial_token]).bit_count() + for _, spatial_token in self.patterns[token] + ) + for token in range(self.vocab_size) + ], + dtype=np.int64, + ) + + +class BPESerializer(_Serializer): + 'Lossless mapping between ``[T,D]`` physical cells and plain-BPE ids.' scheme = "bpe" + _merge_fields = ("merges",) def __init__( self, @@ -283,21 +319,13 @@ class BPESerializer: lookahead: int, merges: Sequence[Sequence[int]], ) -> None: - self.lookahead = _integer(lookahead, "lookahead", positive=True) - self.bins = tuple( - _integer(value, f"bins[{index}]", positive=True) - for index, value in enumerate(bins) - ) - if not self.bins: - raise ConfigError("bins must contain at least one cell slot") + self._init_dimensions(bins, lookahead) self.merges = _rules(merges, 2, "merges") atom_count = sum(self.bins) for rank, (left, right) in enumerate(self.merges): child = atom_count + rank if left >= child or right >= child: - raise ConfigError( - f"merges[{rank}] must reference already-created tokens" - ) + raise ConfigError(f"merges[{rank}] must reference already-created tokens") try: self.vocabulary = BPEVocabulary(self.bins, self.merges) except ValueError as error: @@ -312,77 +340,6 @@ class BPESerializer: ) self.vocab_size = self.vocabulary.vocab_size - def encode( - self, - cells: np.ndarray, - *, - active_dims: Sequence[int] | None = None, - ) -> list[int]: - "Serialize one non-empty trajectory without emitting absent slots." - values, _ = _dense_cells(cells, self.bins, active_dims) - return self.vocabulary.encode(values) - - def decode( - self, - tokens: Sequence[int], - *, - active_dims: Sequence[int] | None = None, - ) -> np.ndarray: - """Recover dense cells, writing ``-1`` in semantically absent slots.""" - if len(tokens) < 1: - raise ValueError("token stream must not be empty") - checked = [] - for index, token in enumerate(tokens): - if isinstance(token, bool) or not isinstance(token, Integral): - raise ValueError(f"tokens[{index}] must be an integer") - value = int(token) - if not 0 <= value < self.vocab_size: - raise ValueError(f"tokens[{index}] is outside the vocabulary") - checked.append(value) - return self.vocabulary.decode(checked, active_dims=active_dims) - - def to_dict(self) -> dict[str, object]: - """Return the intentionally minimal, path-independent BPE artifact.""" - return {"merges": [list(rule) for rule in self.merges]} - - @classmethod - def from_dict( - cls, - payload: object, - *, - bins: Sequence[int], - lookahead: int, - ) -> BPESerializer: - if not isinstance(payload, Mapping) or not all( - isinstance(key, str) for key in payload - ): - raise ConfigError(f"{BPE_NAME} must contain one JSON object") - unknown = sorted(set(payload) - {"merges"}) - if unknown: - raise ConfigError( - f"{BPE_NAME} contains unknown field(s): {', '.join(unknown)}" - ) - if "merges" not in payload: - raise ConfigError(f"{BPE_NAME} is missing field(s): merges") - return cls(bins=bins, lookahead=lookahead, merges=payload["merges"]) - - @classmethod - def from_pretrained( - cls, - directory: str | Path, - *, - bins: Sequence[int], - lookahead: int, - ) -> BPESerializer: - return cls.from_dict(_read_payload(directory), bins=bins, lookahead=lookahead) - - def save_pretrained(self, directory: str | Path) -> Path: - """Write ``bpe.json`` and return its path.""" - path = Path(directory) / BPE_NAME - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(json.dumps(self.to_dict(), indent=2) + "\n", encoding="utf-8") - return path - SERIALIZERS: dict[str, type[SetBPESerializer] | type[BPESerializer]] = { SetBPESerializer.scheme: SetBPESerializer, @@ -390,8 +347,16 @@ SERIALIZERS: dict[str, type[SetBPESerializer] | type[BPESerializer]] = { } -def serializer_class( - config: ActionCodec2Config, -) -> type[SetBPESerializer] | type[BPESerializer]: +def serializer_class(config: ActionCodec2Config) -> type[SetBPESerializer] | type[BPESerializer]: """Return the serializer the configured tokenization scheme requires.""" - return SERIALIZERS[config.set_bpe.scheme] + scheme = config.set_bpe.scheme + if scheme == "unified_set_bpe": + from .unified_set_bpe import UnifiedSetBPESerializer + + return UnifiedSetBPESerializer + if scheme not in SERIALIZERS: + raise ConfigError( + f"set_bpe.scheme={scheme!r} is not an ActionCodec2 serializer; " + "load sparse_set_bpe artifacts with ActionCodec2Sparse" + ) + return SERIALIZERS[scheme] diff --git a/runtime/tokenization/bpe_training.py b/runtime/backends/actioncodec2/bpe_training.py similarity index 89% rename from runtime/tokenization/bpe_training.py rename to runtime/backends/actioncodec2/bpe_training.py index 950618fa72e33d3461d6c6f4dce5d5771bb3be92..df41b64a328a975567eda9f06a676d1c66cbb9f6 100644 --- a/runtime/tokenization/bpe_training.py +++ b/runtime/backends/actioncodec2/bpe_training.py @@ -1,4 +1,4 @@ -"Plain-BPE fitting implementations." +'Plain-BPE fitting implementations.' from __future__ import annotations @@ -9,7 +9,7 @@ from collections.abc import Iterable, Iterator, Sequence import numpy as np from .bpe_vocabulary import BPEVocabulary -from ..backend.native_backend import require_native, resolve_backend +from .native_backend import require_native, resolve_backend __all__ = ["train_bpe", "cell_chunks"] @@ -19,17 +19,14 @@ def cell_chunks( *, max_chunk_rows: int = 1_000_000, ) -> Iterator[tuple[np.ndarray, np.ndarray]]: - "Yield ``(cells, episode_offsets)`` blocks for the native trainer." + 'Yield ``(cells, episode_offsets)`` blocks for the native trainer.' chunks = getattr(episodes, "chunks", None) offsets = getattr(episodes, "offsets", None) if getattr(episodes, "_actioncodec2_validated", False) and chunks is not None: for index, (codes, bounds) in enumerate(zip(chunks, offsets, strict=True)): if codes is None: raise RuntimeError("cell corpus chunk has already been consumed") - yield ( - np.ascontiguousarray(codes), - np.ascontiguousarray(bounds, dtype=np.int64), - ) + yield np.ascontiguousarray(codes), np.ascontiguousarray(bounds, dtype=np.int64) episodes.release_chunk(index) return pending: list[np.ndarray] = [] @@ -79,14 +76,10 @@ def _flatten( raise ValueError("every episode must be non-empty") support = episode >= 0 if np.any(support != support[:1]): - raise ValueError( - "active dimensions must remain constant within an episode" - ) + raise ValueError("active dimensions must remain constant within an episode") present = np.flatnonzero(support[0]) if not len(present): - raise ValueError( - "every control step needs at least one active coordinate" - ) + raise ValueError("every control step needs at least one active coordinate") shifted = episode[:, present] + offsets[present][None, :] streams.append(shifted.reshape(-1).tolist()) actions += len(episode) @@ -106,9 +99,7 @@ def _train_bpe_python( atoms = int(sum(int(value) for value in bins)) if vocab_size < atoms: - raise ValueError( - f"vocab_size {vocab_size} is below the {atoms} primitive atoms" - ) + raise ValueError(f"vocab_size {vocab_size} is below the {atoms} primitive atoms") if max_token_cells < 1: raise ValueError("max_token_cells must be positive") streams, actions = _flatten(chunks, bins) @@ -178,10 +169,7 @@ def _train_bpe_python( if value > 0: heapq.heappush(heap, (-value, member)) if progress and len(merges) % 256 == 0: - print( - f" bpe merge {len(merges):>5} tokens/action {length / actions:.4f}", - flush=True, - ) + print(f" bpe merge {len(merges):>5} tokens/action {length / actions:.4f}", flush=True) vocabulary = BPEVocabulary(tuple(int(value) for value in bins), tuple(merges)) report: dict[str, object] = { @@ -212,7 +200,7 @@ def train_bpe( progress: bool = False, threads: int = 0, ) -> tuple[BPEVocabulary, dict[str, object]]: - "Fit plain BPE on the row-major flattened primitive-cell stream." + 'Fit plain BPE on the row-major flattened primitive-cell stream.' if resolve_backend(backend) == "python": return _train_bpe_python( cell_chunks(episodes), diff --git a/runtime/tokenization/bpe_vocabulary.py b/runtime/backends/actioncodec2/bpe_vocabulary.py similarity index 78% rename from runtime/tokenization/bpe_vocabulary.py rename to runtime/backends/actioncodec2/bpe_vocabulary.py index 08882d6e400d67fae882f24e38dc9db07b6be7e1..abc1e8bbaceedfaaad572258b29776333c20c78c 100644 --- a/runtime/tokenization/bpe_vocabulary.py +++ b/runtime/backends/actioncodec2/bpe_vocabulary.py @@ -1,4 +1,4 @@ -"Runtime plain-BPE vocabulary over the row-major flattened cell stream." +'Runtime plain-BPE vocabulary over the row-major flattened cell stream.' from __future__ import annotations @@ -8,13 +8,14 @@ from dataclasses import dataclass import numpy as np -from ..common._validation import active_dimensions +from ._validation import active_dimensions +from .native_serialization import NativeCacheMixin, decode_native, encode_native __all__ = ["BPEVocabulary"] @dataclass -class BPEVocabulary: +class BPEVocabulary(NativeCacheMixin): """Primitive atoms plus ordered, adjacency-based merge rules.""" bins: tuple[int, ...] @@ -23,20 +24,15 @@ class BPEVocabulary: def __post_init__(self) -> None: if not self.bins or any(count < 1 for count in self.bins): raise ValueError("every dimension needs at least one bin") - self.offsets = np.concatenate( - ([0], np.cumsum(np.asarray(self.bins, dtype=np.int64))) - ) + self.offsets = np.concatenate(([0], np.cumsum(np.asarray(self.bins, dtype=np.int64)))) self.atom_count = int(self.offsets[-1]) self.vocab_size = self.atom_count + len(self.merges) atom_dims = np.repeat( - np.arange(len(self.bins), dtype=np.int64), - np.asarray(self.bins, dtype=np.int64), + np.arange(len(self.bins), dtype=np.int64), np.asarray(self.bins, dtype=np.int64) ) - expansions: list[tuple[int, ...]] = [ - (token,) for token in range(self.atom_count) - ] + expansions: list[tuple[int, ...]] = [(token,) for token in range(self.atom_count)] for rank, (left, right) in enumerate(self.merges): token = self.atom_count + rank if not 0 <= left < token or not 0 <= right < token: @@ -44,12 +40,9 @@ class BPEVocabulary: expansions.append(expansions[left] + expansions[right]) self.expansions = tuple(expansions) self.token_dims = tuple( - tuple(int(atom_dims[atom]) for atom in expansion) - for expansion in expansions - ) - self.token_cells = np.asarray( - [len(expansion) for expansion in expansions], dtype=np.int64 + tuple(int(atom_dims[atom]) for atom in expansion) for expansion in expansions ) + self.token_cells = np.asarray([len(expansion) for expansion in expansions], dtype=np.int64) self._rules = { (int(left), int(right)): (self.atom_count + rank, rank) for rank, (left, right) in enumerate(self.merges) @@ -69,9 +62,7 @@ class BPEVocabulary: raise ValueError("cells contain an invalid active or absent index") support = values >= 0 if np.any(support != support[:1]): - raise ValueError( - "active dimensions must remain constant within a trajectory" - ) + raise ValueError("active dimensions must remain constant within a trajectory") present = tuple(int(dim) for dim in np.flatnonzero(support[0])) if present != dimensions: raise ValueError("cells do not activate exactly the requested dimensions") @@ -82,12 +73,15 @@ class BPEVocabulary: return (active + base[None, :]).reshape(-1).tolist() def encode(self, cells: np.ndarray) -> list[int]: - "Apply the merges greedily in creation-rank order to one trajectory." + 'Apply the merges greedily in creation-rank order to one trajectory.' values = np.asarray(cells, dtype=np.int64) if values.ndim != 2 or len(values) < 1 or values.shape[1] < 1: raise ValueError("cells must have non-empty shape [T, D]") dimensions = tuple(int(dim) for dim in np.flatnonzero(values[0] >= 0)) stream = self._flatten(values, dimensions) + result = encode_native(self, values[None]) + if result is not None: + return result[0] count = len(stream) previous = list(range(-1, count - 1)) following = list(range(1, count + 1)) @@ -134,6 +128,9 @@ class BPEVocabulary: ) -> np.ndarray: """Expand tokens to dense cells, writing ``-1`` in absent coordinates.""" dimensions = active_dimensions(active_dims, self.dimension) + result = decode_native(self, [[int(token) for token in tokens]], dimensions) + if result is not None: + return result[0] atoms: list[int] = [] for index, raw_token in enumerate(tokens): token = int(raw_token) @@ -142,16 +139,10 @@ class BPEVocabulary: atoms.extend(self.expansions[token]) width = len(dimensions) if not atoms or len(atoms) % width: - raise ValueError( - "token stream does not cover a whole number of routed control steps" - ) + raise ValueError("token stream does not cover a whole number of routed control steps") values = np.asarray(atoms, dtype=np.int64).reshape(-1, width) - starts = np.asarray( - [int(self.offsets[dim]) for dim in dimensions], dtype=np.int64 - ) - stops = np.asarray( - [int(self.offsets[dim + 1]) for dim in dimensions], dtype=np.int64 - ) + starts = np.asarray([int(self.offsets[dim]) for dim in dimensions], dtype=np.int64) + stops = np.asarray([int(self.offsets[dim + 1]) for dim in dimensions], dtype=np.int64) if np.any(values < starts[None, :]) or np.any(values >= stops[None, :]): raise ValueError("token stream does not follow the routed dimension order") cells = np.full((len(values), self.dimension), -1, dtype=np.int64) diff --git a/runtime/routing/cache.py b/runtime/backends/actioncodec2/cache.py similarity index 52% rename from runtime/routing/cache.py rename to runtime/backends/actioncodec2/cache.py index 6c980e904ae90eb4f0315f0168095826d29d94e7..a33d74fb3787b153ae7746aaf875c189b1a6e783 100644 --- a/runtime/routing/cache.py +++ b/runtime/backends/actioncodec2/cache.py @@ -5,8 +5,31 @@ from collections.abc import MutableMapping from threading import RLock +def cached_prefix_state(key, cache, initial, advance): + """Extend a cached parent prefix, replaying only when it was evicted.""" + if not key: + return initial + missing = object() + state = cache.get(key, missing) + if state is not missing: + return state + parent = key[:-1] + state = cache.get(parent, missing) + if state is missing: + state = initial + for token in parent: + state = advance(state, token) + if state is None: + break + cache[parent] = state + if state is not None: + state = advance(state, key[-1]) + cache[key] = state + return state + + class BoundedCache(MutableMapping): - "Evict least-recently-used entries above a fixed capacity." + """Evict least-recently-used entries above a fixed capacity.""" def __init__(self, capacity): if type(capacity) is not int or capacity < 1: @@ -39,3 +62,10 @@ class BoundedCache(MutableMapping): def __len__(self): with self._lock: return len(self._items) + + def reserve(self, capacity): + """Raise the capacity so callers with a known working set stop thrashing.""" + if type(capacity) is not int or capacity < 1: + raise ValueError("cache capacity must be a positive integer") + with self._lock: + self.capacity = max(self.capacity, capacity) diff --git a/runtime/physical/configuration.py b/runtime/backends/actioncodec2/configuration.py similarity index 84% rename from runtime/physical/configuration.py rename to runtime/backends/actioncodec2/configuration.py index d0f016f0fb0018f3e1d73fe2da7c9d7e39b3a469..9bdd57cf26797906967c500fa671e2cf23988686 100644 --- a/runtime/physical/configuration.py +++ b/runtime/backends/actioncodec2/configuration.py @@ -11,7 +11,7 @@ from types import MappingProxyType import yaml -from ..common._validation import validate_dimension_partition +from ._validation import validate_dimension_partition CONFIG_NAME = "config.yaml" @@ -20,7 +20,7 @@ CONFIG_VERSION = 1 _SPACES = ("additive", "so3") _SO3_REPRESENTATIONS = ("rotation_vector", "euler_xyz") _SO3_MULTIPLICATIONS = ("left", "right") -_PRIMITIVE_SELECTIONS = ("nearest", "smooth") +_PRIMITIVE_SELECTIONS = ("nearest", "smooth", "momentum_lazy") _ORDER_KEY = re.compile(r"order_(0|[1-9][0-9]*)\Z") NumberOrVector = float | tuple[float, ...] @@ -65,9 +65,7 @@ def _mapping(value: object, path: str) -> Mapping[str, object]: return value -def _reject_unknown( - payload: Mapping[str, object], allowed: set[str], path: str -) -> None: +def _reject_unknown(payload: Mapping[str, object], allowed: set[str], path: str) -> None: unknown = sorted(set(payload) - allowed) if unknown: rendered = ", ".join(unknown) @@ -101,9 +99,7 @@ def _number(value: object, path: str) -> float: def _number_or_vector(value: object, width: int, path: str) -> NumberOrVector: if isinstance(value, Sequence) and not isinstance(value, (str, bytes, bytearray)): - result = tuple( - _number(item, f"{path}[{index}]") for index, item in enumerate(value) - ) + result = tuple(_number(item, f"{path}[{index}]") for index, item in enumerate(value)) if len(result) != width: raise ConfigError(f"{path} must be a scalar or contain {width} values") return result @@ -130,9 +126,7 @@ def _parse_dims(value: object, input_dim: int, path: str) -> tuple[int, ...]: raise ConfigError(f"{path}.stop must be greater than {path}.start") dims = tuple(range(start, stop)) elif isinstance(value, Sequence) and not isinstance(value, (str, bytes, bytearray)): - dims = tuple( - _integer(item, f"{path}[{index}]") for index, item in enumerate(value) - ) + dims = tuple(_integer(item, f"{path}[{index}]") for index, item in enumerate(value)) if not dims: raise ConfigError(f"{path} must not be empty") else: @@ -142,9 +136,7 @@ def _parse_dims(value: object, input_dim: int, path: str) -> tuple[int, ...]: raise ConfigError(f"{path} contains a repeated dimension") outside = [dimension for dimension in dims if dimension >= input_dim] if outside: - raise ConfigError( - f"{path} contains dimension {outside[0]}, outside input_dim={input_dim}" - ) + raise ConfigError(f"{path} contains dimension {outside[0]}, outside input_dim={input_dim}") return dims @@ -165,12 +157,8 @@ class ConstraintConfig: def from_dict(cls, payload: object, *, width: int, path: str) -> ConstraintConfig: values = _mapping(payload, path) _reject_unknown(values, {"min", "max"}, path) - minimum = _number_or_vector( - _required(values, "min", path), width, f"{path}.min" - ) - maximum = _number_or_vector( - _required(values, "max", path), width, f"{path}.max" - ) + minimum = _number_or_vector(_required(values, "min", path), width, f"{path}.min") + maximum = _number_or_vector(_required(values, "max", path), width, f"{path}.max") if any( lower > upper for lower, upper in zip( @@ -195,9 +183,7 @@ class InputTransformConfig: clip: bool = False @classmethod - def from_dict( - cls, payload: object | None, *, width: int, path: str - ) -> InputTransformConfig: + def from_dict(cls, payload: object | None, *, width: int, path: str) -> InputTransformConfig: if payload is None: return cls() values = _mapping(payload, path) @@ -224,9 +210,7 @@ def _parse_component_geometry( space = _required(values, "space", path) if space not in _SPACES: raise ConfigError(f"{path}.space must be one of {_SPACES}") - input_order = _integer( - _required(values, "input_order", path), f"{path}.input_order" - ) + input_order = _integer(_required(values, "input_order", path), f"{path}.input_order") primitive_order = _integer( _required(values, "primitive_order", path), f"{path}.primitive_order" ) @@ -240,13 +224,9 @@ def _parse_component_geometry( f"{path} with space='so3' supports input_order 0 or 1 and primitive_order 1 or 2" ) if representation not in _SO3_REPRESENTATIONS: - raise ConfigError( - f"{path}.representation must be one of {_SO3_REPRESENTATIONS}" - ) + raise ConfigError(f"{path}.representation must be one of {_SO3_REPRESENTATIONS}") if multiplication not in _SO3_MULTIPLICATIONS: - raise ConfigError( - f"{path}.multiplication must be one of {_SO3_MULTIPLICATIONS}" - ) + raise ConfigError(f"{path}.multiplication must be one of {_SO3_MULTIPLICATIONS}") else: if input_order not in {0, 1, 2} or primitive_order not in {0, 1, 2}: raise ConfigError( @@ -256,14 +236,7 @@ def _parse_component_geometry( raise ConfigError( f"{path}.representation and multiplication are only valid for space='so3'" ) - return ( - dims, - str(space), - input_order, - primitive_order, - representation, - multiplication, - ) + return dims, str(space), input_order, primitive_order, representation, multiplication def _parse_component_constraints( @@ -286,7 +259,7 @@ def _parse_component_constraints( @dataclass(frozen=True) class ComponentConfig: - "One orthogonal physical component of the action vector." + """One orthogonal physical component of the action vector.""" dims: tuple[int, ...] space: str @@ -351,7 +324,13 @@ class ComponentConfig: primitive_selection = _required(values, "primitive_selection", path) if primitive_selection not in _PRIMITIVE_SELECTIONS: - raise ConfigError(f"{path}.primitive_selection must be nearest or smooth") + raise ConfigError( + f"{path}.primitive_selection must be one of {', '.join(_PRIMITIVE_SELECTIONS)}" + ) + if primitive_selection == "momentum_lazy" and (space != "so3" or primitive_order != 1): + raise ConfigError( + f"{path}.primitive_selection='momentum_lazy' requires first-order SO(3) primitives" + ) if ( primitive_selection == "smooth" and space == "additive" @@ -361,9 +340,7 @@ class ComponentConfig: f"{path}.primitive_selection='smooth' requires first- or second-order additive primitives" ) if primitive_order == 2 and "order_2" not in constraints: - raise ConfigError( - f"{path} second-order primitives require constraints.order_2" - ) + raise ConfigError(f"{path} second-order primitives require constraints.order_2") return cls( dims=dims, space=space, @@ -385,8 +362,7 @@ class ComponentConfig: "primitive_order": self.primitive_order, "input_transform": self.input_transform.to_dict(), "constraints": { - key: constraint.to_dict() - for key, constraint in self.constraints.items() + key: constraint.to_dict() for key, constraint in self.constraints.items() }, "distortion_limit": _serialize_number_or_vector(self.distortion_limit), "primitive_selection": self.primitive_selection, @@ -411,9 +387,7 @@ class PhysicalConfig: input_dim = _integer( _required(values, "input_dim", path), f"{path}.input_dim", positive=True ) - raw_components = _mapping( - _required(values, "components", path), f"{path}.components" - ) + raw_components = _mapping(_required(values, "components", path), f"{path}.components") if not raw_components: raise ConfigError(f"{path}.components must not be empty") @@ -445,12 +419,12 @@ class PhysicalConfig: } -TOKENIZATION_SCHEMES = ("set_bpe", "bpe") +TOKENIZATION_SCHEMES = ("set_bpe", "unified_set_bpe", "bpe", "sparse_set_bpe") @dataclass(frozen=True) class SetBPEConfig: - "Runtime settings of the tokenization stage." + """Runtime settings of the tokenization stage.""" lookahead: int allow_cross_component_merge: bool = False @@ -459,25 +433,17 @@ class SetBPEConfig: @classmethod def from_dict(cls, payload: object, *, path: str = "set_bpe") -> SetBPEConfig: values = _mapping(payload, path) - _reject_unknown( - values, {"lookahead", "allow_cross_component_merge", "scheme"}, path - ) + _reject_unknown(values, {"lookahead", "allow_cross_component_merge", "scheme"}, path) lookahead = _integer( _required(values, "lookahead", path), f"{path}.lookahead", positive=True ) allow_cross = values.get("allow_cross_component_merge", False) if not isinstance(allow_cross, bool): - raise ConfigError( - f"{path}.allow_cross_component_merge must be true or false" - ) + raise ConfigError(f"{path}.allow_cross_component_merge must be true or false") scheme = values.get("scheme", "set_bpe") if scheme not in TOKENIZATION_SCHEMES: - raise ConfigError( - f"{path}.scheme must be one of {', '.join(TOKENIZATION_SCHEMES)}" - ) - return cls( - lookahead=lookahead, allow_cross_component_merge=allow_cross, scheme=scheme - ) + raise ConfigError(f"{path}.scheme must be one of {', '.join(TOKENIZATION_SCHEMES)}") + return cls(lookahead=lookahead, allow_cross_component_merge=allow_cross, scheme=scheme) def to_dict(self) -> dict[str, object]: payload: dict[str, object] = { @@ -485,7 +451,6 @@ class SetBPEConfig: "allow_cross_component_merge": self.allow_cross_component_merge, } - if self.scheme != "set_bpe": payload["scheme"] = self.scheme return payload @@ -493,7 +458,7 @@ class SetBPEConfig: @dataclass(frozen=True) class PrimitiveTrainingConfig: - "Serialized config-v1 metadata retained until artifacts are versioned again." + """Serialized config-v1 metadata retained until artifacts are versioned again.""" zero_primitive_components: tuple[str, ...] @@ -508,9 +473,7 @@ class PrimitiveTrainingConfig: values = _mapping(payload, path) _reject_unknown(values, {"zero_primitive_components"}, path) raw_names = _required(values, "zero_primitive_components", path) - if not isinstance(raw_names, Sequence) or isinstance( - raw_names, (str, bytes, bytearray) - ): + if not isinstance(raw_names, Sequence) or isinstance(raw_names, (str, bytes, bytearray)): raise ConfigError(f"{path}.zero_primitive_components must be a list") names = tuple(raw_names) if not all(isinstance(name, str) and name for name in names): @@ -554,15 +517,13 @@ class PrimitiveTrainingConfig: @dataclass(frozen=True) class BPETrainingConfig: - "Spatial and final vocabulary budgets used for whole-trajectory BPE." + """Spatial and final vocabulary budgets used for whole-trajectory BPE.""" spatial_vocab_size: int vocab_size: int @classmethod - def from_dict( - cls, payload: object, *, path: str = "train.bpe" - ) -> BPETrainingConfig: + def from_dict(cls, payload: object, *, path: str = "train.bpe") -> BPETrainingConfig: values = _mapping(payload, path) _reject_unknown(values, {"spatial_vocab_size", "vocab_size"}, path) spatial_vocab_size = _integer( @@ -586,7 +547,7 @@ class BPETrainingConfig: @dataclass(frozen=True) class QualityControlConfig: - "Pretraining-only policy for extreme first-order discontinuities." + """Pretraining-only policy for extreme first-order discontinuities.""" hard_order_1_scale: float min_segment_length: int @@ -619,13 +580,38 @@ class QualityControlConfig: } +@dataclass(frozen=True) +class SparseTrainingConfig: + """ActionCodec2Sparse training-corpus construction.""" + + chunk_horizon: int + static_run_cap: int + + @classmethod + def from_dict(cls, payload: object, *, path: str = "train.sparse") -> SparseTrainingConfig: + values = _mapping(payload, path) + _reject_unknown(values, {"chunk_horizon", "static_run_cap"}, path) + return cls( + chunk_horizon=_integer( + _required(values, "chunk_horizon", path), f"{path}.chunk_horizon", positive=True + ), + static_run_cap=_integer( + _required(values, "static_run_cap", path), f"{path}.static_run_cap", positive=True + ), + ) + + def to_dict(self) -> dict[str, object]: + return {"chunk_horizon": self.chunk_horizon, "static_run_cap": self.static_run_cap} + + @dataclass(frozen=True) class TrainConfig: - "Non-derivable fit choices and BPE budgets." + """Non-derivable fit choices and BPE budgets.""" primitives: PrimitiveTrainingConfig bpe: BPETrainingConfig quality_control: QualityControlConfig | None = None + sparse: SparseTrainingConfig | None = None @classmethod def from_dict( @@ -636,8 +622,9 @@ class TrainConfig: path: str = "train", ) -> TrainConfig: values = _mapping(payload, path) - _reject_unknown(values, {"primitives", "bpe", "quality_control"}, path) + _reject_unknown(values, {"primitives", "bpe", "quality_control", "sparse"}, path) raw_quality_control = values.get("quality_control") + raw_sparse = values.get("sparse") return cls( primitives=PrimitiveTrainingConfig.from_dict( _required(values, "primitives", path), physical=physical @@ -648,18 +635,21 @@ class TrainConfig: if raw_quality_control is None else QualityControlConfig.from_dict(raw_quality_control) ), + sparse=None if raw_sparse is None else SparseTrainingConfig.from_dict(raw_sparse), ) def to_dict(self) -> dict[str, object]: payload = {"primitives": self.primitives.to_dict(), "bpe": self.bpe.to_dict()} if self.quality_control is not None: payload["quality_control"] = self.quality_control.to_dict() + if self.sparse is not None: + payload["sparse"] = self.sparse.to_dict() return payload @dataclass(frozen=True) class ActionCodec2Config: - "Strict YAML configuration for an ActionCodec2 processor artifact." + """Strict YAML configuration for an ActionCodec2 processor artifact.""" physical: PhysicalConfig set_bpe: SetBPEConfig @@ -687,14 +677,17 @@ class ActionCodec2Config: ) physical = PhysicalConfig.from_dict(_required(values, "physical", "config")) raw_train = values.get("train") + set_bpe = SetBPEConfig.from_dict(_required(values, "set_bpe", "config")) + train = None if raw_train is None else TrainConfig.from_dict(raw_train, physical=physical) + sparse = set_bpe.scheme == "sparse_set_bpe" + if train is not None and (train.sparse is not None) != sparse: + raise ConfigError( + "train.sparse is required for, and only valid with, set_bpe.scheme=sparse_set_bpe" + ) return cls( physical=physical, - set_bpe=SetBPEConfig.from_dict(_required(values, "set_bpe", "config")), - train=( - None - if raw_train is None - else TrainConfig.from_dict(raw_train, physical=physical) - ), + set_bpe=set_bpe, + train=train, model_type=str(model_type), config_version=config_version, ) @@ -703,9 +696,7 @@ class ActionCodec2Config: def from_yaml(cls, path: str | Path) -> ActionCodec2Config: source = Path(path) try: - payload = yaml.load( - source.read_text(encoding="utf-8"), Loader=_UniqueKeyLoader - ) + payload = yaml.load(source.read_text(encoding="utf-8"), Loader=_UniqueKeyLoader) except OSError: raise except yaml.YAMLError as error: diff --git a/runtime/backends/actioncodec2/defaults.py b/runtime/backends/actioncodec2/defaults.py new file mode 100644 index 0000000000000000000000000000000000000000..b367a5577ee0a1edc3d557fc7ac31291efcc1c8f --- /dev/null +++ b/runtime/backends/actioncodec2/defaults.py @@ -0,0 +1,122 @@ +"""Package-owned configuration templates for fresh ActionCodec2 instances.""" + +from __future__ import annotations + +from collections.abc import Mapping +from functools import lru_cache +from pathlib import Path +from types import MappingProxyType + +from .bpe import BPESerializer, SetBPESerializer +from .configuration import ActionCodec2Config +from .presets import PresetConfig +from .processor import ActionCodec2Processor +from .routing import ActionCodec2Router +from .training import build_primitives + + +class CodecBuilder: + 'Build unfitted physical profiles from packaged defaults or explicit configs.' + + def __init__(self, *, primitive_order=1, bpe_scheme=None, profile_configs=None): + if type(primitive_order) is not int or primitive_order not in (1, 2): + raise ValueError("primitive_order must be 1 or 2") + if bpe_scheme not in (None, "set_bpe", "unified_set_bpe", "bpe"): + raise ValueError("bpe_scheme must be 'set_bpe', 'unified_set_bpe' or 'bpe'") + if profile_configs is not None and not isinstance(profile_configs, Mapping): + raise TypeError("profile_configs must map 'joint'/'eef' to physical configurations") + self.profile_configs = dict(profile_configs or {}) + if set(self.profile_configs) - {"joint", "eef"}: + raise ValueError("profile_configs keys must be 'joint' or 'eef'") + self.primitive_order = primitive_order + self.bpe_scheme = bpe_scheme + self.assets = Path(__file__).with_name("assets") + + def _config(self, name: str) -> ActionCodec2Config: + suffix = "" if self.primitive_order == 1 else "_second_order" + raw = self.profile_configs.get(name, self.assets / "profiles" / f"{name}{suffix}.yaml") + if isinstance(raw, ActionCodec2Config): + config = raw + elif isinstance(raw, Mapping): + config = ActionCodec2Config.from_dict(raw) + else: + config = ActionCodec2Config.from_yaml(raw) + if config.train is None: + raise ValueError(f"{name} profile config requires a train section") + if self.bpe_scheme is not None: + payload = config.to_dict() + payload["set_bpe"]["scheme"] = self.bpe_scheme + if self.bpe_scheme == "bpe": + payload["train"]["bpe"]["spatial_vocab_size"] = payload["train"]["bpe"][ + "vocab_size" + ] + config = ActionCodec2Config.from_dict(payload) + return config + + def build(self) -> ActionCodec2Router: + """Create primitive-only profiles; the public facade tracks fitted state.""" + processors = {} + budgets = {} + for name in ("joint", "eef"): + config = self._config(name) + primitives = build_primitives(config) + if config.set_bpe.scheme == "bpe": + serializer = BPESerializer( + bins=primitives.bins, lookahead=config.set_bpe.lookahead, merges=() + ) + elif config.set_bpe.scheme == "unified_set_bpe": + from .unified_set_bpe import UnifiedSetBPESerializer + + serializer = UnifiedSetBPESerializer( + bins=primitives.bins, lookahead=config.set_bpe.lookahead, merges=() + ) + else: + serializer = SetBPESerializer( + bins=primitives.bins, + lookahead=config.set_bpe.lookahead, + spatial_merges=(), + temporal_merges=(), + ) + processors[name] = ActionCodec2Processor(config, primitives, serializer) + budgets[name] = config.train.bpe.vocab_size + presets = list(builtin_action_spaces().values()) + return ActionCodec2Router.from_processors( + processors, token_budgets=budgets, presets=presets + ) + + +@lru_cache(maxsize=1) +def builtin_action_spaces(): + 'Return a read-only name-to-preset mapping shipped in the installed package.' + presets = [ + PresetConfig.from_yaml(path) + for path in sorted(Path(__file__).with_name("assets").joinpath("presets").glob("*.yaml")) + ] + return MappingProxyType({preset.name: preset for preset in presets}) + + +class ProfileBundleBuilder: + 'Assemble two existing physical artifacts using their recorded vocabulary budgets.' + + def __init__(self, joint, eef, *, token_budgets=None): + self.paths = {"joint": joint, "eef": eef} + self.budgets = dict(token_budgets or {}) + if self.budgets.keys() - self.paths.keys(): + raise ValueError("token_budgets accepts only 'joint' and 'eef'") + + def build(self): + processors = { + name: ActionCodec2Processor.from_pretrained(path) for name, path in self.paths.items() + } + budgets = { + name: self.budgets.get( + name, + processor.config.train.bpe.vocab_size + if processor.config.train is not None + else processor.vocab_size, + ) + for name, processor in processors.items() + } + return ActionCodec2Router.from_processors( + processors, token_budgets=budgets, presets=list(builtin_action_spaces().values()) + ) diff --git a/runtime/tokenization/grammar.py b/runtime/backends/actioncodec2/grammar.py similarity index 50% rename from runtime/tokenization/grammar.py rename to runtime/backends/actioncodec2/grammar.py index 3af7a3106645329cbe6fc914aca9bd70a57d6867..943f2b8ec11cb6162f3e55b98f548fa6c1f85db0 100644 --- a/runtime/tokenization/grammar.py +++ b/runtime/backends/actioncodec2/grammar.py @@ -7,14 +7,71 @@ from numbers import Integral import numpy as np -from ..common._validation import active_dimensions +from ._validation import active_dimensions from .bpe import BPESerializer, SetBPESerializer -from ..routing.cache import BoundedCache +from .cache import BoundedCache, cached_prefix_state +from .native_backend import native_kernel + + +def _coverage_metadata(serializer, dims): + + cache = getattr(serializer, "_coverage_metadata", None) + if cache is None: + cache = serializer._coverage_metadata = BoundedCache(32) + metadata = cache.get(dims) + if metadata is not None: + return metadata + metadata = {"compiled": None} + if serializer.scheme == "set_bpe": + full = sum(1 << d for d in dims) + metadata["roots"] = np.asarray( + [serializer.spatial.anchor[serializer.root[t]] for t in range(serializer.vocab_size)], + dtype=np.int64, + ) + patterns = tuple( + tuple((offset, int(serializer.spatial.support[token])) for offset, token in pattern) + for pattern in serializer.patterns + ) + metadata["patterns"] = patterns + metadata["scope"] = np.asarray( + [all(support & ~full == 0 for _, support in pattern) for pattern in patterns], + dtype=bool, + ) + else: + phase = np.zeros((len(dims), serializer.vocab_size), dtype=bool) + for index in range(len(dims)): + for token, expansion in enumerate(serializer.vocabulary.token_dims): + phase[index, token] = all( + d == dims[(index + offset) % len(dims)] for offset, d in enumerate(expansion) + ) + metadata["phase"] = phase + metadata["lengths"] = np.asarray(serializer.token_cell_counts, dtype=np.int64) + cache[dims] = metadata + return metadata class _PrefixGrammar: + def _state(self, tokens: Sequence[int]) -> tuple[int, ...] | None: + checked = [] + for token in tokens: + if isinstance(token, bool) or not isinstance(token, Integral): + return None + checked.append(int(token)) + return cached_prefix_state( + tuple(checked), self._state_cache, self._empty_state, self._advance + ) + + def _next_token_mask_from_state(self, state: tuple[int, ...]) -> np.ndarray: + + cached = self._mask_cache.get(state) + if cached is None: + compiled = self._compiled() + cached = compiled.mask(state) if compiled is not None else self._python_mask(state) + self._mask_cache[state] = cached + return cached.copy() + def next_token_mask(self, tokens: Sequence[int]) -> np.ndarray: """Return a boolean vocabulary mask for the next generated token.""" state = self._state(tokens) @@ -29,7 +86,7 @@ class _PrefixGrammar: class ActionCodec2Grammar(_PrefixGrammar): - "Prefix grammar for one exact, fixed-horizon rooted token stream." + 'Prefix grammar for one exact, fixed-horizon rooted token stream.' def __init__( self, @@ -44,31 +101,38 @@ class ActionCodec2Grammar(_PrefixGrammar): self.vocab_size = serializer.vocab_size dims = active_dimensions(active_dims, serializer.spatial.dimension) self._full = sum(1 << dimension for dimension in dims) - self._root_anchor = np.asarray( - [ - serializer.spatial.anchor[serializer.root[token]] - for token in range(self.vocab_size) - ], - dtype=np.int64, - ) - self._patterns = tuple( - tuple( - (offset, int(serializer.spatial.support[spatial_token])) - for offset, spatial_token in serializer.patterns[token] - ) - for token in range(self.vocab_size) - ) + self._metadata = _coverage_metadata(serializer, dims) + self._root_anchor = self._metadata["roots"] + self._patterns = self._metadata["patterns"] + self._in_scope = self._metadata["scope"] self._mask_cache = BoundedCache(64) self._state_cache = BoundedCache(256) - self._state_cache[()] = self._initial_state() + self._empty_state = self._initial_state() + self._native = None + self._compiled() + + def _compiled(self): + constructor = native_kernel("SetGrammar") + if constructor is None: + return None + if self._native is None: + prototype = self._metadata["compiled"] + if prototype is None: + prototype = self._metadata["compiled"] = constructor( + 1, self._full, self._root_anchor.tolist(), self._patterns + ) + self._native = prototype.clone(self.horizon) + return self._native def _advance(self, state: tuple[int, ...], token: int) -> tuple[int, ...] | None: - if not 0 <= token < self.vocab_size: + compiled = self._compiled() + if compiled is not None: + return compiled.advance(state, token) + if not 0 <= token < self.vocab_size or not self._in_scope[token]: return None coverage = list(state) front = next( - (index for index, mask in enumerate(coverage) if mask != self._full), - self.horizon, + (index for index, mask in enumerate(coverage) if mask != self._full), self.horizon ) if front == self.horizon: return None @@ -87,60 +151,31 @@ class ActionCodec2Grammar(_PrefixGrammar): return (0,) * self.horizon + def _covered_steps(self, state: tuple[int, ...]) -> int: + return next((i for i, mask in enumerate(state) if mask != self._full), self.horizon) + def _state_is_complete(self, state: tuple[int, ...]) -> bool: return all(mask == self._full for mask in state) - def _state(self, tokens: Sequence[int]) -> tuple[int, ...] | None: - checked: list[int] = [] - for raw_token in tokens: - if isinstance(raw_token, bool) or not isinstance(raw_token, Integral): - return None - checked.append(int(raw_token)) - key = tuple(checked) - if not key: - return self._initial_state() - missing = object() - cached = self._state_cache.get(key, missing) - if cached is not missing: - return cached - parent = key[:-1] - state = self._state_cache.get(parent, missing) - if state is missing: - state = self._initial_state() - for token in parent: - state = self._advance(state, token) - if state is None: - break - self._state_cache[parent] = state - if state is not None: - state = self._advance(state, key[-1]) - self._state_cache[key] = state - return state - - def _next_token_mask_from_state(self, state: tuple[int, ...]) -> np.ndarray: - + def _python_mask(self, state: tuple[int, ...]) -> np.ndarray: if self._state_is_complete(state): return np.zeros(self.vocab_size, dtype=bool) - cached = self._mask_cache.get(state) - if cached is not None: - return cached.copy() front = next(index for index, mask in enumerate(state) if mask != self._full) uncovered = self._full & ~state[front] expected_anchor = int(uncovered & -uncovered).bit_length() - 1 - mask = self._root_anchor == expected_anchor + mask = (self._root_anchor == expected_anchor) & self._in_scope for token in np.flatnonzero(mask): for offset, support in self._patterns[int(token)]: step = front + offset if step >= self.horizon or state[step] & support: mask[token] = False break - self._mask_cache[state] = mask - return mask.copy() + return mask class ActionCodec2BPEGrammar(_PrefixGrammar): - "Prefix grammar for one exact, fixed-horizon plain-BPE token stream." + 'Prefix grammar for one exact, fixed-horizon plain-BPE token stream.' def __init__( self, @@ -156,25 +191,43 @@ class ActionCodec2BPEGrammar(_PrefixGrammar): dims = active_dimensions(active_dims, serializer.vocabulary.dimension) self._width = len(dims) self._cells = horizon * self._width - self._token_cells = np.asarray(serializer.token_cell_counts, dtype=np.int64) - token_dims = serializer.vocabulary.token_dims - self._phase = np.zeros((self._width, self.vocab_size), dtype=bool) - for phase in range(self._width): - for token in range(self.vocab_size): - expansion = token_dims[token] - self._phase[phase, token] = all( - dimension == dims[(phase + offset) % self._width] - for offset, dimension in enumerate(expansion) - ) + self._metadata = _coverage_metadata(serializer, dims) + self._token_cells = self._metadata["lengths"] + self._phase = self._metadata["phase"] self._mask_cache = BoundedCache(64) + self._state_cache = BoundedCache(256) + self._empty_state = self._initial_state() + + self._active_dims = dims + self._native = None + self._compiled() + + def _compiled(self): + constructor = native_kernel("PlainGrammar") + if constructor is None: + return None + if self._native is None: + prototype = self._metadata["compiled"] + if prototype is None: + prototype = self._metadata["compiled"] = constructor( + 1, self._token_cells.tolist(), self._active_dims, self._phase + ) + self._native = prototype.clone(self.horizon) + return self._native def _initial_state(self) -> tuple[int, ...]: return (0,) + def _covered_steps(self, state: tuple[int, ...]) -> int: + return state[0] // self._width + def _state_is_complete(self, state: tuple[int, ...]) -> bool: return state[0] == self._cells def _advance(self, state: tuple[int, ...], token: int) -> tuple[int, ...] | None: + compiled = self._compiled() + if compiled is not None: + return compiled.advance(state, token) if not 0 <= token < self.vocab_size: return None covered = state[0] @@ -185,25 +238,8 @@ class ActionCodec2BPEGrammar(_PrefixGrammar): return None return (covered + length,) - def _state(self, tokens: Sequence[int]) -> tuple[int, ...] | None: - state: tuple[int, ...] | None = self._initial_state() - for raw_token in tokens: - if isinstance(raw_token, bool) or not isinstance(raw_token, Integral): - return None - assert state is not None - state = self._advance(state, int(raw_token)) - if state is None: - return None - return state - - def _next_token_mask_from_state(self, state: tuple[int, ...]) -> np.ndarray: + def _python_mask(self, state: tuple[int, ...]) -> np.ndarray: covered = state[0] if covered == self._cells: return np.zeros(self.vocab_size, dtype=bool) - cached = self._mask_cache.get(covered) - if cached is None: - cached = self._phase[covered % self._width] & ( - self._token_cells <= self._cells - covered - ) - self._mask_cache[covered] = cached - return cached.copy() + return self._phase[covered % self._width] & (self._token_cells <= self._cells - covered) diff --git a/runtime/integration/hf.py b/runtime/backends/actioncodec2/hf.py similarity index 71% rename from runtime/integration/hf.py rename to runtime/backends/actioncodec2/hf.py index 2b4d322ceb72816c309c52b823dd57ea902f847f..448eed3de533193604bcab1969b04997a288279b 100644 --- a/runtime/integration/hf.py +++ b/runtime/backends/actioncodec2/hf.py @@ -1,4 +1,4 @@ -"Hugging Face AutoProcessor integration." +'Hugging Face AutoProcessor integration.' from __future__ import annotations @@ -8,12 +8,11 @@ from typing import TYPE_CHECKING, Any from transformers import AutoConfig, AutoProcessor, PretrainedConfig -from ..physical.configuration import MODEL_TYPE -from .exporting import USER_GUIDE +from .configuration import CONFIG_NAME, MODEL_TYPE if TYPE_CHECKING: - from ..physical.physical_processor import ActionCodec2Processor - from ..routing.routing import ActionCodec2Router + from .processor import ActionCodec2Processor + from .routing import ActionCodec2Router HF_CONFIG_NAME = "config.json" PROCESSOR_CONFIG_NAME = "processor_config.json" @@ -21,18 +20,27 @@ PROCESSOR_CLASS_NAME = "ActionCodec2Processor" ROUTER_MODEL_TYPE = "actioncodec2_router" ROUTER_PROCESSOR_CLASS_NAME = "ActionCodec2Router" ROUTER_CONFIG_NAME = "router_config.yaml" -ROUTER_ALLOW_PATTERNS = [ +GENERATED_CARD_MARKER = ( + "" +) + + +ROUTER_MANIFEST_PATTERNS = [ ROUTER_CONFIG_NAME, HF_CONFIG_NAME, PROCESSOR_CONFIG_NAME, + f"profiles/*/{CONFIG_NAME}", + "manifest.json", + f"joint/**/{CONFIG_NAME}", + f"eef/**/{CONFIG_NAME}", +] +ROUTER_ALLOW_PATTERNS = [ + *ROUTER_MANIFEST_PATTERNS, "profiles/**", + "joint/**", + "eef/**", "fit_report.json", "README.md", - "*.py", - "requirements.txt", - "runtime/**", "actioncodec2_kernels/**", "setup.py", "pyproject.toml", "LICENSE", - - "native/*", ] @@ -90,8 +98,7 @@ def save_huggingface_metadata( encoding="utf-8", ) processor_path.write_text( - json.dumps({"processor_class": processor_class, **processor_config}, indent=2) - + "\n", + json.dumps({"processor_class": processor_class, **processor_config}, indent=2) + "\n", encoding="utf-8", ) return config_path, processor_path @@ -165,7 +172,7 @@ def register_actioncodec2_auto_processors( processor_class: type[ActionCodec2Processor], router_class: type[ActionCodec2Router], ) -> bool: - "Register both installed ActionCodec2 artifact types with Transformers." + 'Register both installed ActionCodec2 artifact types with Transformers.' AutoConfig.register(MODEL_TYPE, ActionCodec2HFConfig, exist_ok=True) AutoProcessor.register(ActionCodec2HFConfig, processor_class, exist_ok=True) AutoConfig.register(ROUTER_MODEL_TYPE, ActionCodec2RouterHFConfig, exist_ok=True) @@ -174,16 +181,30 @@ def register_actioncodec2_auto_processors( def save_model_card(directory: str | Path, description: str) -> Path: - """Create an informative Hub card on first save, preserving existing user cards.""" + 'Write the generated Hub card, refreshing it whenever the artifact is re-saved.' path = Path(directory) / "README.md" - if not path.exists(): + if not path.exists() or GENERATED_CARD_MARKER in path.read_text(encoding="utf-8"): path.parent.mkdir(parents=True, exist_ok=True) - guide = USER_GUIDE + guide = ( + "---\ntags:\n- robotics\n- action-tokenizer\n---\n\n" + f"{GENERATED_CARD_MARKER}\n\n" + "# ActionCodec2\n\n" + "This artifact contains physical vocabularies, BPE rules and action-space layouts.\n" + "Install actioncodec2 and load the saved processor locally:\n\n" + "```python\nfrom actioncodec2 import ActionCodec2\n" + "from transformers import AutoProcessor\n\n" + "print(ActionCodec2.describe_pretrained('./my_codec'))\n" + "codec = AutoProcessor.from_pretrained(\n" + " './my_codec', action_space='single_eef_delta',\n)\n" + "print(codec)\n```\n\n" + "Choose action_space from your data's physical meaning, units and column order;\n" + "the example layout is not an automatic selection. For a bound artifact, omit\n" + "action_space to restore its saved binding. Pass your actual sampling rate as\n" + "fps to encode/decode. Absolute layouts require current_state; second-order\n" + "profiles require previous_first_order. See the artifact's layout guide below.\n" + ) path.write_text( - guide - + "\n\n## Artifact-specific report\n\n```text\n" - + description - + "\n```\n", + guide + "\n\n## 当前 artifact 的实际布局与要求\n\n```text\n" + description + "\n```\n", encoding="utf-8", ) return path diff --git a/runtime/backend/native_backend.py b/runtime/backends/actioncodec2/native_backend.py similarity index 62% rename from runtime/backend/native_backend.py rename to runtime/backends/actioncodec2/native_backend.py index 5e4ef5b612370f8a9b5d2d2e7e30f79ef8c2e108..59449a741c3bedb983e6e355610ef3b8326469fb 100644 --- a/runtime/backend/native_backend.py +++ b/runtime/backends/actioncodec2/native_backend.py @@ -1,15 +1,21 @@ -"""Optional CPU accelerator; build with python setup.py build_ext --inplace.""" +"""Dispatch AC2 numerical work to the optional C++ runtime.""" from __future__ import annotations import os -__all__ = ["native", "have_native", "require_native", "resolve_backend"] +__all__ = ["native", "have_native", "require_native", "resolve_backend", "native_kernel"] try: # pragma: no cover - exercised by whichever branch the build state picks - from .. import _native as native + from . import _native as native except ImportError: # pragma: no cover - native = None + try: + from actioncodec2.core.backends.actioncodec2 import _native as native + except ImportError: + try: + from actioncodec2_kernels import _native as native + except ImportError: + native = None def have_native() -> bool: @@ -17,12 +23,17 @@ def have_native() -> bool: return native is not None and not os.environ.get("ACTIONCODEC2_NO_NATIVE") +def native_kernel(name: str): + """Resolve an optional kernel, honoring the Python reference override.""" + return getattr(native, name, None) if have_native() else None + + def require_native(): """Return the native module or explain how to get one.""" if not have_native(): raise RuntimeError( - "the actioncodec2 native extension is not available; build it from " - "the package native/ directory (python setup.py build_ext --inplace) or " + "the actioncodec2 native extension is not available; run " + "'python setup.py build_ext --inplace' from the repository root or " "select backend='python'" ) return native diff --git a/runtime/backends/actioncodec2/native_serialization.py b/runtime/backends/actioncodec2/native_serialization.py new file mode 100644 index 0000000000000000000000000000000000000000..c3eaf34fb10c42a84756f820e5ab9ff75e094ed5 --- /dev/null +++ b/runtime/backends/actioncodec2/native_serialization.py @@ -0,0 +1,74 @@ +"""Cached C++ serializers shared by scalar and batched inference paths.""" + +from __future__ import annotations + +import numpy as np + +from .native_backend import native_kernel + + +class NativeCacheMixin: + """Serialize numerical state while rebuilding process-local C++ caches.""" + + def __getstate__(self): + state = vars(self).copy() + for key in ("_compiled_serializer", "_compiled_spatial", "_coverage_metadata"): + state.pop(key, None) + return state + + def __setstate__(self, state): + vars(self).update(state) + + +def compiled_serializer(owner): + """Return a codec for a serializer/vocabulary, or the Python override.""" + spatial = getattr(owner, "spatial", None) + temporal = getattr(owner, "temporal_merges", getattr(owner, "merges", ())) + scheme = getattr(owner, "scheme", "set_bpe" if spatial is not None else "bpe") + constructor = native_kernel("SetBPE" if scheme == "set_bpe" else "PlainBPE") + if constructor is None: + return None + cached = getattr(owner, "_compiled_serializer", None) + if cached is None: + bins = getattr(owner, "bins", spatial.bins if spatial is not None else ()) + if scheme == "set_bpe": + merges = getattr(owner, "spatial_merges", spatial.merges) + cached = constructor(bins, owner.lookahead, merges, temporal) + else: + cached = constructor(bins, owner.merges) + owner._compiled_serializer = cached + return cached + + +def encode_native(owner, dense: np.ndarray): + codec = compiled_serializer(owner) + options = getattr(owner, "encoding_search", None) + if options is not None and options.enabled: + if codec is None or not hasattr(codec, "encode_search_batch"): + raise RuntimeError( + "packing search requires the rebuilt actioncodec2 native extension; " + "run 'python setup.py build_ext --inplace'" + ) + return codec.encode_search_batch( + np.asarray(dense, dtype=np.int64), + options.spatial_search, + options.temporal_search, + options.search_window, + options.search_beam, + ) + return None if codec is None else codec.encode_batch(np.asarray(dense, dtype=np.int64)) + + +def decode_native(owner, rows, dims, *, validate=False): + codec = compiled_serializer(owner) + if codec is None: + return None + bins = getattr(owner, "bins", owner.spatial.bins if hasattr(owner, "spatial") else ()) + if validate: + if not hasattr(codec, "decode_checked_batch"): + return None + support = dims if hasattr(codec, "decode_active_batch") else sum(1 << d for d in dims) + return codec.decode_checked_batch(rows, len(bins), support) + if hasattr(codec, "decode_active_batch"): + return codec.decode_active_batch(rows, len(bins), dims) + return codec.decode_batch(rows, len(bins), sum(1 << d for d in dims)) diff --git a/runtime/backends/actioncodec2/packing.py b/runtime/backends/actioncodec2/packing.py new file mode 100644 index 0000000000000000000000000000000000000000..f100c0f4feb306d7142eadbfc23e79374f4018bc --- /dev/null +++ b/runtime/backends/actioncodec2/packing.py @@ -0,0 +1,40 @@ +"""Runtime opt-in controls for lossless fixed-vocabulary Set-BPE search.""" + +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass(frozen=True) +class EncodingSearch: + 'Independent post-encoding stages; defaults retain ranked merge replay.' + + spatial_search: bool = False + temporal_search: bool = False + search_window: int = 32 + search_beam: int = 4 + + def __post_init__(self): + for name in ("spatial_search", "temporal_search"): + if not isinstance(getattr(self, name), bool): + raise TypeError(f"{name} must be a bool") + for name in ("search_window", "search_beam"): + value = getattr(self, name) + if isinstance(value, bool) or not isinstance(value, int) or value < 1: + raise ValueError(f"{name} must be a positive integer") + if self.search_beam > 64: + raise ValueError("search_beam must be at most 64") + + @property + def enabled(self): + return self.spatial_search or self.temporal_search + + def validate_codec(self, scheme, bins): + if not self.enabled: + return + if scheme != "set_bpe": + raise ValueError("packing search requires set_bpe") + if len(bins) > 8 or max(bins) > 255: + raise ValueError("packing search supports at most eight slots and 255 bins per slot") + if self.search_window * len(bins) > 256: + raise ValueError("search_window times profile width must be at most 256") diff --git a/runtime/physical/physical_codec.py b/runtime/backends/actioncodec2/physical_codec.py similarity index 80% rename from runtime/physical/physical_codec.py rename to runtime/backends/actioncodec2/physical_codec.py index f6c5880b10bff976be4b188ac8f75f14e2c44540..ba1adff151d1cfd7fc260c867a3587546dc25082 100644 --- a/runtime/physical/physical_codec.py +++ b/runtime/backends/actioncodec2/physical_codec.py @@ -1,4 +1,4 @@ -"Configuration-driven physical quantization." +"""Configuration-driven physical quantization.""" from __future__ import annotations @@ -8,24 +8,38 @@ from typing import Protocol import numpy as np -from ._so3 import conjugate_quaternion as _conjugate -from ._so3 import euler_xyz_to_quaternion as _euler_xyz_to_quaternion -from ._so3 import multiply_quaternions as _multiply -from ._so3 import quaternion_to_euler_xyz as _quaternion_to_euler_xyz -from ._so3 import quaternion_to_rotvec as _quaternion_to_rotvec -from ._so3 import rotvec_to_quaternion as _rotvec_to_quaternion -from ..common._validation import broadcast_vector +from ._so3 import ( + conjugate_quaternion as _conjugate, +) +from ._so3 import ( + euler_xyz_to_quaternion as _euler_xyz_to_quaternion, +) +from ._so3 import ( + multiply_quaternions as _multiply, +) +from ._so3 import ( + quaternion_to_euler_xyz as _quaternion_to_euler_xyz, +) +from ._so3 import ( + quaternion_to_rotvec as _quaternion_to_rotvec, +) +from ._so3 import ( + rotvec_to_quaternion as _rotvec_to_quaternion, +) +from ._validation import broadcast_vector from .configuration import ActionCodec2Config, ComponentConfig, ConfigError -from ..backend.native_backend import require_native, resolve_backend +from .native_backend import native_kernel, require_native, resolve_backend from .primitives import PrimitiveStore +from .semantic import difference_additive as _difference_additive +from .semantic import integrate_additive as _integrate_additive _FLOAT32_SLACK = np.float32(8 * np.finfo(np.float32).eps) _IDENTITY = np.asarray((0.0, 0.0, 0.0, 1.0), dtype=np.float64) +_SELECTION_CODES = {"nearest": 0, "smooth": 1, "momentum_lazy": 2} -def _constraint( - component: ComponentConfig, order: int -) -> tuple[np.ndarray, np.ndarray] | None: + +def _constraint(component: ComponentConfig, order: int) -> tuple[np.ndarray, np.ndarray] | None: value = component.constraints.get(f"order_{order}") if value is None: return None @@ -45,40 +59,16 @@ def _scale(component: ComponentConfig) -> np.ndarray: def _transform(component: ComponentConfig, actions: np.ndarray) -> np.ndarray: - values = np.asarray(actions, dtype=np.float32) * _scale(component) if component.input_transform.clip: bounds = _constraint(component, component.input_order) if bounds is None: - raise ConfigError( - f"clipping requires constraints.order_{component.input_order}" - ) + raise ConfigError(f"clipping requires constraints.order_{component.input_order}") values = np.clip(values, bounds[0], bounds[1]) return np.asarray(values, dtype=np.float32) -def _integrate_additive(values: np.ndarray, order: int) -> np.ndarray: - - result = np.asarray(values, dtype=np.float32) - for _ in range(order): - result = np.cumsum(result, axis=-2, dtype=np.float32) - return result - - -def _difference_additive(values: np.ndarray, order: int) -> np.ndarray: - - result = np.asarray(values, dtype=np.float32) - for _ in range(order): - previous = np.concatenate( - (np.zeros_like(result[..., :1, :]), result[..., :-1, :]), axis=-2 - ) - result = result - previous - return result - - class _ComponentRuntime(Protocol): - - def encode_batch( self, actions: np.ndarray, previous_first_order: np.ndarray | None = None ) -> np.ndarray: ... @@ -89,30 +79,19 @@ class _ComponentRuntime(Protocol): class _AdditiveRuntime: - - - def __init__( - self, component: ComponentConfig, primitives: tuple[np.ndarray, ...] - ) -> None: + def __init__(self, component: ComponentConfig, primitives: tuple[np.ndarray, ...]) -> None: self.config = component - self.primitives = tuple( - np.asarray(value, dtype=np.float32) for value in primitives - ) + self.primitives = tuple(np.asarray(value, dtype=np.float32) for value in primitives) self.width = len(component.dims) self.order = component.primitive_order self._second_order_axes = ( - tuple(axis.astype(np.float64) for axis in self.primitives) - if self.order == 2 - else () + tuple(axis.astype(np.float64) for axis in self.primitives) if self.order == 2 else () ) self._second_order_sorted = tuple( bool(np.all(axis[1:] > axis[:-1])) for axis in self._second_order_axes ) self._second_order_zero_bounds = tuple( - ( - int(np.searchsorted(axis, 0)), - int(np.searchsorted(axis, 0, side="right")) - 1, - ) + (int(np.searchsorted(axis, 0)), int(np.searchsorted(axis, 0, side="right")) - 1) if ordered else (0, 0) for axis, ordered in zip( @@ -139,15 +118,22 @@ class _AdditiveRuntime: for coordinate, values in enumerate(self.primitives): table[coordinate, : len(values)] = values self._native_table = np.ascontiguousarray(table) - self._native_bins = np.asarray( - [len(values) for values in self.primitives], dtype=np.int32 - ) + self._native_bins = np.asarray([len(values) for values in self.primitives], dtype=np.int32) self._native_binary = np.zeros(self.width, dtype=np.uint8) def _pick_batch(self, request: np.ndarray, direction: np.ndarray) -> np.ndarray: - flat_request = np.asarray(request, dtype=np.float32).reshape(-1, self.width) flat_direction = np.asarray(direction, dtype=np.float32).reshape(-1, self.width) + kernel = native_kernel("choose_cells") + if kernel is not None: + return kernel( + self._native_table, + self._native_bins, + flat_request, + flat_direction, + self.limit, + self.config.primitive_selection == "smooth", + ).reshape(request.shape) choice = np.empty(flat_request.shape, dtype=np.int64) for coordinate, primitives in enumerate(self.primitives): distance = np.abs(flat_request[:, coordinate, None] - primitives[None, :]) @@ -157,26 +143,20 @@ class _AdditiveRuntime: continue feasible = distance <= self.limit[coordinate] + _FLOAT32_SLACK preferred = feasible & ( - np.sign(primitives)[None, :] * flat_direction[:, coordinate, None] - >= 0.0 - ) - candidates = np.where( - np.any(preferred, axis=1, keepdims=True), preferred, feasible + np.sign(primitives)[None, :] * flat_direction[:, coordinate, None] >= 0.0 ) + candidates = np.where(np.any(preferred, axis=1, keepdims=True), preferred, feasible) smooth = np.argmin(np.where(candidates, distance, np.inf), axis=1) choice[:, coordinate] = np.where(np.any(feasible, axis=1), smooth, nearest) return choice.reshape(request.shape) def _advance_batch(self, state: np.ndarray, primitive: np.ndarray) -> None: - higher = primitive for level in range(self.order - 1, -1, -1): state[:, level] += higher higher = state[:, level] if self.order == 1 and self.position_bounds is not None: - state[:, 0] = np.clip( - state[:, 0], self.position_bounds[0], self.position_bounds[1] - ) + state[:, 0] = np.clip(state[:, 0], self.position_bounds[0], self.position_bounds[1]) def encode_batch( self, actions: np.ndarray, previous_first_order: np.ndarray | None = None @@ -189,14 +169,22 @@ class _AdditiveRuntime: batch, steps, _ = target.shape if self.order == 0: return self._pick_batch(target, np.zeros_like(target)) - if self.position_bounds is not None and resolve_backend("auto") == "native": + if resolve_backend("auto") == "native": + lower, upper = ( + self.position_bounds + if self.position_bounds is not None + else ( + np.full(self.width, -np.inf, dtype=np.float32), + np.full(self.width, np.inf, dtype=np.float32), + ) + ) starts = np.zeros((batch, self.width), dtype=np.float32) cells = require_native().physical_encode_batch( self._native_table, self._native_bins, self._native_binary, - np.ascontiguousarray(self.position_bounds[0], dtype=np.float32), - np.ascontiguousarray(self.position_bounds[1], dtype=np.float32), + np.ascontiguousarray(lower, dtype=np.float32), + np.ascontiguousarray(upper, dtype=np.float32), np.ascontiguousarray(target, dtype=np.float32), starts, starts, @@ -217,10 +205,7 @@ class _AdditiveRuntime: request = target[:, step] - baseline[:, 0] choice = self._pick_batch(request, direction) primitive = np.stack( - [ - self.primitives[index][choice[:, index]] - for index in range(self.width) - ], + [self.primitives[index][choice[:, index]] for index in range(self.width)], axis=1, ) self._advance_batch(state, primitive) @@ -236,12 +221,28 @@ class _AdditiveRuntime: if self.order == 2: return self._decode_second_order(cells, previous_first_order) indices = np.asarray(cells, dtype=np.int64) + kernel = native_kernel("additive_decode") + if kernel is not None: + lower, upper = ( + self.position_bounds + if self.position_bounds is not None + else ( + np.full(self.width, -np.inf, dtype=np.float32), + np.full(self.width, np.inf, dtype=np.float32), + ) + ) + return kernel( + self._native_table, + indices, + _scale(self.config), + lower, + upper, + self.config.input_order, + self.order, + ) if self.order == 0: positions = np.stack( - [ - self.primitives[index][indices[:, :, index]] - for index in range(self.width) - ], + [self.primitives[index][indices[:, :, index]] for index in range(self.width)], axis=2, ) elif self.position_bounds is not None and resolve_backend("auto") == "native": @@ -261,10 +262,7 @@ class _AdditiveRuntime: ) else: picked = np.stack( - [ - self.primitives[index][indices[:, :, index]] - for index in range(self.width) - ], + [self.primitives[index][indices[:, :, index]] for index in range(self.width)], axis=2, ) batch, steps, _ = indices.shape @@ -279,7 +277,6 @@ class _AdditiveRuntime: def _encode_second_order( self, actions: np.ndarray, previous_first_order: np.ndarray ) -> np.ndarray: - transformed = _transform(self.config, actions).astype(np.float64) velocity = previous_first_order.astype(np.float64) * _scale(self.config) target = transformed @@ -300,10 +297,7 @@ class _AdditiveRuntime: self.config.primitive_selection == "smooth", min( len(actions), - max( - 1, - int(os.environ.get("ACTIONCODEC2_PHYSICAL_THREADS", "16")), - ), + max(1, int(os.environ.get("ACTIONCODEC2_PHYSICAL_THREADS", "16"))), ), ), dtype=np.int64, @@ -314,7 +308,6 @@ class _AdditiveRuntime: for step in range(actions.shape[1]): request = target[:, step] - (position + velocity) - choice = self._pick_second_order(request, direction) primitive = np.stack( [axis[choice[:, j]] for j, axis in enumerate(self.primitives)], axis=1 @@ -325,12 +318,9 @@ class _AdditiveRuntime: cells[:, step] = choice return cells - def _pick_second_order( - self, request: np.ndarray, direction: np.ndarray - ) -> np.ndarray: + def _pick_second_order(self, request: np.ndarray, direction: np.ndarray) -> np.ndarray: choice = np.empty(request.shape, dtype=np.int64) for j, axis in enumerate(self._second_order_axes): - if self._second_order_sorted[j] and ( self.config.primitive_selection == "smooth" or len(axis) > 32 ): @@ -338,21 +328,17 @@ class _AdditiveRuntime: left = np.clip(right - 1, 0, len(axis) - 1) right = np.minimum(right, len(axis) - 1) nearest = np.where( - np.abs(request[:, j] - axis[left]) - <= np.abs(request[:, j] - axis[right]), + np.abs(request[:, j] - axis[left]) <= np.abs(request[:, j] - axis[right]), left, right, ) - tied = (nearest > 0) & ( np.abs(request[:, j] - axis[np.maximum(nearest - 1, 0)]) == np.abs(request[:, j] - axis[nearest]) ) if np.any(tied): - nearest[tied] = np.argmin( - np.abs(request[tied, j, None] - axis), axis=1 - ) + nearest[tied] = np.argmin(np.abs(request[tied, j, None] - axis), axis=1) if self.config.primitive_selection == "smooth": nonnegative, nonpositive = self._second_order_zero_bounds[j] preferred = np.where( @@ -378,9 +364,7 @@ class _AdditiveRuntime: continue feasible = distance <= self.limit[j] preferred = feasible & (np.sign(axis)[None] * direction[:, j, None] >= 0) - candidates = np.where( - preferred.any(axis=1, keepdims=True), preferred, feasible - ) + candidates = np.where(preferred.any(axis=1, keepdims=True), preferred, feasible) smooth = np.argmin(np.where(candidates, distance, np.inf), axis=1) choice[:, j] = np.where(feasible.any(axis=1), smooth, nearest) return choice @@ -388,31 +372,32 @@ class _AdditiveRuntime: def _decode_second_order( self, cells: np.ndarray, previous_first_order: np.ndarray ) -> np.ndarray: - + kernel = native_kernel("additive_reconstruct") + if kernel is not None: + return kernel( + self._native_table, + cells, + previous_first_order, + _scale(self.config), + self.config.input_order, + self.order, + ) picked = np.stack( [axis[cells[:, :, j]] for j, axis in enumerate(self.primitives)], axis=2 ).astype(np.float64) if self.config.input_order == 2: result = picked else: - result = np.cumsum(picked, axis=1) + previous_first_order[:, None] * _scale( - self.config - ) + result = np.cumsum(picked, axis=1) + previous_first_order[:, None] * _scale(self.config) if self.config.input_order == 0: result = np.cumsum(result, axis=1) return np.asarray(result / _scale(self.config), dtype=np.float32) class _SO3Runtime: - - - def __init__( - self, component: ComponentConfig, primitives: tuple[np.ndarray, ...] - ) -> None: + def __init__(self, component: ComponentConfig, primitives: tuple[np.ndarray, ...]) -> None: self.config = component - self.primitives = tuple( - np.asarray(value, dtype=np.float64) for value in primitives - ) + self.primitives = tuple(np.asarray(value, dtype=np.float64) for value in primitives) self.left = component.multiplication == "left" self.limit = float(component.distortion_limit) if component.primitive_order == 2: @@ -430,9 +415,13 @@ class _SO3Runtime: for coordinate, values in enumerate(self.primitives): table[coordinate, : len(values)] = values self._native_table = table - self._native_bins = np.asarray( - [len(values) for values in self.primitives], dtype=np.int32 - ) + self._native_bins = np.asarray([len(values) for values in self.primitives], dtype=np.int32) + self.lazy = component.primitive_selection == "momentum_lazy" + self._zero = np.asarray([int(np.argmin(np.abs(values))) for values in self.primitives]) + if self.lazy and any( + values[index] != 0.0 for values, index in zip(self.primitives, self._zero, strict=True) + ): + raise ValueError("momentum_lazy selection requires an exact zero primitive per axis") def _from_representation(self, values: np.ndarray) -> np.ndarray: shape = values.shape[:-1] @@ -480,8 +469,8 @@ class _SO3Runtime: target: np.ndarray, direction: np.ndarray, nearest: np.ndarray, + previous: np.ndarray | None = None, ) -> np.ndarray: - axes = [] for coordinate, values in enumerate(self.primitives): candidates = np.flatnonzero( @@ -491,30 +480,33 @@ class _SO3Runtime: candidates = np.append(candidates, nearest[coordinate]) axes.append(candidates) - best_any: tuple[float, tuple[int, int, int]] | None = None - best_preferred: tuple[float, tuple[int, int, int]] | None = None + best_any: tuple | None = None + best_preferred: tuple | None = None + repeat = previous is not None and tuple(int(v) for v in previous) for raw_choice in itertools.product(*axes): choice = tuple(int(value) for value in raw_choice) - rotvec = np.asarray( - [self.primitives[index][choice[index]] for index in range(3)] - ) + rotvec = np.asarray([self.primitives[index][choice[index]] for index in range(3)]) rebuilt = self._apply(reconstruction, _rotvec_to_quaternion(rotvec)) - error = float( - np.linalg.norm(_quaternion_to_rotvec(self._residual(target, rebuilt))) - ) + error = float(np.linalg.norm(_quaternion_to_rotvec(self._residual(target, rebuilt)))) if error > self.limit + 1e-12: continue - candidate = (error, choice) + if self.lazy and choice == repeat: + return np.asarray(choice, dtype=np.int64) + offset = np.abs(np.asarray(choice) - self._zero) + candidate = ( + (int(np.count_nonzero(offset)), int(offset.sum()), error, choice) + if self.lazy + else (error, choice) + ) if best_any is None or candidate < best_any: best_any = candidate - if np.dot(rotvec, direction) >= -1e-15 and ( best_preferred is None or candidate < best_preferred ): best_preferred = candidate selected = best_preferred or best_any - return nearest if selected is None else np.asarray(selected[1], dtype=np.int64) + return nearest if selected is None else np.asarray(selected[-1], dtype=np.int64) def encode_batch( self, actions: np.ndarray, previous_first_order: np.ndarray | None = None @@ -532,7 +524,7 @@ class _SO3Runtime: self.config.representation == "rotation_vector", self.left, self.limit, - self.config.primitive_selection == "smooth", + _SELECTION_CODES[self.config.primitive_selection], min(len(transformed), os.cpu_count() or 1), ) return np.asarray(cells, dtype=np.int64) @@ -542,12 +534,13 @@ class _SO3Runtime: reconstruction = true.copy() direction = np.zeros((batch, 3), dtype=np.float64) cells = np.empty((batch, steps, 3), dtype=np.int64) + previous = np.broadcast_to(self._zero, (batch, 3)) for step in range(steps): value = converted[:, step] true = value if self.config.input_order == 0 else self._apply(true, value) residual = _quaternion_to_rotvec(self._residual(true, reconstruction)) choice = self._nearest_batch(residual) - if self.config.primitive_selection == "smooth": + if self.config.primitive_selection != "nearest": choice = np.stack( [ self._smooth( @@ -556,16 +549,16 @@ class _SO3Runtime: true[index], direction[index], choice[index], + previous[index] if self.lazy else None, ) for index in range(batch) ] ) + previous = choice primitive = np.stack( [self.primitives[index][choice[:, index]] for index in range(3)], axis=1 ) - reconstruction = self._apply( - reconstruction, _rotvec_to_quaternion(primitive) - ) + reconstruction = self._apply(reconstruction, _rotvec_to_quaternion(primitive)) moved = np.linalg.norm(primitive, axis=1) > 0.0 direction[moved] = primitive[moved] cells[:, step] = choice @@ -575,6 +568,22 @@ class _SO3Runtime: self, cells: np.ndarray, previous_first_order: np.ndarray | None = None ) -> np.ndarray: """Decode ``[B,T,3]`` cells in the configured boundary representation.""" + kernel = native_kernel("so3_reconstruct") + if kernel is not None: + previous = previous_first_order + if previous is None: + previous = np.zeros((len(cells), 3), dtype=np.float32) + return kernel( + self._native_table, + cells, + previous, + _scale(self.config), + self.config.input_order, + self.config.primitive_order, + self.left, + self.config.representation == "rotation_vector", + getattr(self, "second_order_radius", np.inf), + ) if self.config.primitive_order == 2: return self._decode_second_order(cells, previous_first_order) indices = np.asarray(cells, dtype=np.int64) @@ -585,13 +594,10 @@ class _SO3Runtime: represented = ( rotvec if self.config.representation == "rotation_vector" - else self._to_representation( - _rotvec_to_quaternion(rotvec.astype(np.float32)) - ) + else self._to_representation(_rotvec_to_quaternion(rotvec.astype(np.float32))) ) actions = np.asarray(represented / _scale(self.config), dtype=np.float32) - return _difference_additive(np.cumsum(actions, axis=1, dtype=np.float32), 1) batch, steps = indices.shape[:2] @@ -607,10 +613,7 @@ class _SO3Runtime: def _encode_second_order( self, actions: np.ndarray, previous_first_order: np.ndarray ) -> np.ndarray: - - converted = self._from_representation( - _transform(self.config, actions).astype(np.float64) - ) + converted = self._from_representation(_transform(self.config, actions).astype(np.float64)) increment = self._from_representation( previous_first_order.astype(np.float64) * _scale(self.config) ) @@ -630,10 +633,7 @@ class _SO3Runtime: self.config.primitive_selection == "smooth", min( len(actions), - max( - 1, - int(os.environ.get("ACTIONCODEC2_PHYSICAL_THREADS", "16")), - ), + max(1, int(os.environ.get("ACTIONCODEC2_PHYSICAL_THREADS", "16"))), ), ), dtype=np.int64, @@ -654,9 +654,7 @@ class _SO3Runtime: request = _quaternion_to_rotvec(correction) choice = self._nearest_batch(request) if self.config.primitive_selection == "smooth": - choice = self._smooth_second_order_batch( - request, correction, direction, choice - ) + choice = self._smooth_second_order_batch(request, correction, direction, choice) primitive = np.stack( [axis[choice[:, j]] for j, axis in enumerate(self.primitives)], axis=1 ) @@ -669,7 +667,6 @@ class _SO3Runtime: return cells def _second_order_primitive(self, rotvec: np.ndarray) -> np.ndarray: - norm = np.linalg.norm(rotvec, axis=-1, keepdims=True) return rotvec * np.minimum( 1.0, self.second_order_radius / np.maximum(norm, np.finfo(float).tiny) @@ -682,7 +679,6 @@ class _SO3Runtime: direction: np.ndarray, nearest: np.ndarray, ) -> np.ndarray: - if len(request) > 64: return np.concatenate( [ @@ -714,9 +710,7 @@ class _SO3Runtime: best_preferred = np.zeros(len(request), dtype=bool) for offset in range(0, total, 4096): lattice = np.stack( - np.unravel_index( - np.arange(offset, min(total, offset + 4096)), tuple(widths) - ), + np.unravel_index(np.arange(offset, min(total, offset + 4096)), tuple(widths)), axis=1, ) valid = np.all(lattice[None] < counts[:, None], axis=2) @@ -731,8 +725,7 @@ class _SO3Runtime: axis=2, ) rotvec = np.stack( - [axis[choices[:, :, j]] for j, axis in enumerate(self.primitives)], - axis=2, + [axis[choices[:, :, j]] for j, axis in enumerate(self.primitives)], axis=2 ) rotvec = self._second_order_primitive(rotvec) primitive = _rotvec_to_quaternion(rotvec) @@ -757,10 +750,7 @@ class _SO3Runtime: def _decode_second_order( self, cells: np.ndarray, previous_first_order: np.ndarray ) -> np.ndarray: - - rotvec = np.stack( - [axis[cells[:, :, j]] for j, axis in enumerate(self.primitives)], axis=2 - ) + rotvec = np.stack([axis[cells[:, :, j]] for j, axis in enumerate(self.primitives)], axis=2) rotvec = self._second_order_primitive(rotvec) changes = _rotvec_to_quaternion(rotvec) increment = self._from_representation( @@ -771,16 +761,12 @@ class _SO3Runtime: for step in range(cells.shape[1]): increment = self._apply(increment, changes[:, step]) reconstruction = self._apply(reconstruction, increment) - output[:, step] = ( - increment if self.config.input_order == 1 else reconstruction - ) - return np.asarray( - self._to_representation(output) / _scale(self.config), dtype=np.float32 - ) + output[:, step] = increment if self.config.input_order == 1 else reconstruction + return np.asarray(self._to_representation(output) / _scale(self.config), dtype=np.float32) class PhysicalCodec: - "Compose independent physical components in global action-dimension order." + """Compose independent physical components in global action-dimension order.""" def __init__(self, config: ActionCodec2Config, primitives: PrimitiveStore) -> None: if primitives.dimension != config.physical.input_dim: @@ -792,9 +778,7 @@ class PhysicalCodec: self.primitives = primitives runtimes: list[tuple[ComponentConfig, _ComponentRuntime]] = [] for component in config.physical.components.values(): - component_primitives = tuple( - primitives.values[index] for index in component.dims - ) + component_primitives = tuple(primitives.values[index] for index in component.dims) runtime: _ComponentRuntime = ( _AdditiveRuntime(component, component_primitives) if component.space == "additive" @@ -803,9 +787,7 @@ class PhysicalCodec: runtimes.append((component, runtime)) self._runtimes = tuple(runtimes) self.bins = primitives.bins - self.requires_previous_first_order = any( - c.primitive_order == 2 for c, _ in runtimes - ) + self.requires_previous_first_order = any(c.primitive_order == 2 for c, _ in runtimes) def _check_previous_first_order( self, value: np.ndarray | None, batch: int @@ -834,20 +816,17 @@ class PhysicalCodec: def final_first_order( self, cells: np.ndarray, *, previous_first_order: np.ndarray ) -> np.ndarray: - "Return ``[B,D]`` state after these cells, without position differencing." + """Return ``[B,D]`` state after these cells, without position differencing.""" values = self._check_cells(cells) previous = self._check_previous_first_order(previous_first_order, len(values)) - result = np.zeros( - (len(values), self.config.physical.input_dim), dtype=np.float32 - ) + result = np.zeros((len(values), self.config.physical.input_dim), dtype=np.float32) for component, runtime in self._runtimes: if component.primitive_order != 2: continue local = np.take(values, component.dims, axis=2) boundary = np.take(previous, component.dims, axis=1) picked = np.stack( - [axis[local[:, :, j]] for j, axis in enumerate(runtime.primitives)], - axis=2, + [axis[local[:, :, j]] for j, axis in enumerate(runtime.primitives)], axis=2 ) if component.space == "additive": final = boundary.astype(np.float64) + np.sum( @@ -870,16 +849,14 @@ class PhysicalCodec: if values.ndim != 3 or values.shape[2] != expected or values.shape[1] < 1: raise ValueError(f"cells must have non-empty shape [B, T, {expected}]") counts = np.asarray(self.bins, dtype=np.int64) - if values.size and ( - np.any(values < 0) or np.any(values >= counts[None, None, :]) - ): + if values.size and (np.any(values < 0) or np.any(values >= counts[None, None, :])): raise ValueError("a cell index is outside its dimension's primitive set") return values def encode_batch( self, actions: np.ndarray, *, previous_first_order: np.ndarray | None = None ) -> np.ndarray: - "Quantize ``[B,T,D]`` with a required ``[B,D]`` boundary for order 2." + """Quantize ``[B,T,D]`` with a required ``[B,D]`` boundary for order 2.""" values = self._check_actions(actions) previous = self._check_previous_first_order(previous_first_order, len(values)) cells = np.empty(values.shape, dtype=np.int64) diff --git a/runtime/backends/actioncodec2/preprocessing.py b/runtime/backends/actioncodec2/preprocessing.py new file mode 100644 index 0000000000000000000000000000000000000000..f577264847d0fcaf502fd5d17445c879d799a997 --- /dev/null +++ b/runtime/backends/actioncodec2/preprocessing.py @@ -0,0 +1,530 @@ +"""Versioned preprocessing of continuous segments, after discontinuity QC.""" + +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np +from scipy.ndimage import median_filter +from scipy.signal import medfilt, savgol_filter +from scipy.spatial.transform import Rotation + +from .native_backend import native_kernel +from .semantic import discretize_gripper_actions + + +def step_norms(values: np.ndarray) -> np.ndarray: + """L2 norm of per-step deltas, ``[T-1]`` for ``[T, D]`` values.""" + kernel = native_kernel("step_norms") + if kernel is not None: + values = np.asarray(values) + result = kernel(values, values.dtype == np.float32) + return result.astype(np.float32) if values.dtype == np.float32 else result + return np.linalg.norm(np.diff(values, axis=0), axis=1) + + +def _legacy_boundary_trim_indices( + values: np.ndarray, + *, + tau: float, + min_idle_steps: int, +) -> tuple[int, int]: + kernel = native_kernel("boundary_trim") + if kernel is not None: + return tuple( + kernel(values, tau, min_idle_steps, 1, True, np.asarray(values).dtype == np.float32) + ) + if len(values) < 2: + return 0, len(values) + idle = step_norms(values) <= tau + moving = ~idle + if not moving.any(): + return len(values), len(values) + head = int(np.argmax(moving)) + trailing = int(np.argmax(moving[::-1])) + tail = len(idle) - trailing + + start = head + 1 if head >= min_idle_steps else 0 + stop = tail + 1 if trailing >= min_idle_steps else len(values) + if stop <= start: + return start, start + return start, stop + + +def boundary_trim_indices( + values: np.ndarray, + *, + tau: float, + min_idle_steps: int, + context_frames: int = 1, +) -> tuple[int, int]: + """Propose a boundary slice retaining the first moving edge and context.""" + if context_frames < 1: + raise ValueError("context_frames must be positive") + kernel = native_kernel("boundary_trim") + if kernel is not None: + return tuple( + kernel( + values, + tau, + min_idle_steps, + context_frames, + False, + np.asarray(values).dtype == np.float32, + ) + ) + if len(values) < 2: + return 0, len(values) + moving = step_norms(values) > tau + if not moving.any(): + return 0, len(values) + head = int(np.argmax(moving)) + trailing = int(np.argmax(moving[::-1])) + start = max(0, head - context_frames + 1) if head >= min_idle_steps else 0 + stop = len(values) - trailing if trailing >= min_idle_steps else len(values) + return start, max(stop, start + 1) + + +def trim_deviation( + values: np.ndarray, + start: int, + stop: int, + *, + profile: str, + gripper_column: int | None = None, +) -> dict[str, object]: + """Maximum physical error from constant-filling removed boundary rows.""" + if not 0 <= start < stop <= len(values): + raise ValueError("trim slice must retain at least one row") + kernel = native_kernel("trim_deviation") + if kernel is not None: + return kernel( + values, + start, + stop, + profile, + -1 if gripper_column is None else gripper_column % values.shape[1], + ) + width = values.shape[1] + motion = [i for i in range(width) if gripper_column is None or i != gripper_column % width] + result: dict[str, object] = { + "motion_max_error": [0.0] * len(motion), + "translation_max_error_m": 0.0, + "rotation_max_error_rad": 0.0, + "gripper_changed": False, + } + for removed, anchor in ((values[:start], values[start]), (values[stop:], values[stop - 1])): + if not len(removed): + continue + delta = np.abs(removed[:, motion].astype(np.float64) - anchor[motion]) + result["motion_max_error"] = np.maximum( + result["motion_max_error"], delta.max(axis=0) + ).tolist() + if profile == "eef": + result["translation_max_error_m"] = max( + result["translation_max_error_m"], float(np.linalg.norm(delta[:, :3], axis=1).max()) + ) + rotations = Rotation.from_rotvec(removed[:, motion[3:6]]) + relative = Rotation.from_rotvec(anchor[motion[3:6]]).inv() * rotations + result["rotation_max_error_rad"] = max( + result["rotation_max_error_rad"], float(relative.magnitude().max()) + ) + if gripper_column is not None: + result["gripper_changed"] |= bool( + np.any(removed[:, gripper_column] != anchor[gripper_column]) + ) + return result + + +def savgol_smooth( + values: np.ndarray, + *, + window: int, + polyorder: int = 3, +) -> np.ndarray: + """Zero-phase Savitzky-Golay smoothing along time, per dimension.""" + length = len(values) + if length < 3 or window < 3: + return np.asarray(values, dtype=np.float32) + if window >= length: + window = length if length % 2 == 1 else length - 1 + if polyorder >= window: + polyorder = window - 2 if window >= 3 else 1 + kernel = native_kernel("savgol_smooth") + if kernel is not None: + return kernel(values, window, polyorder) + smoothed = savgol_filter(np.asarray(values, dtype=np.float64), window, polyorder, axis=0) + return smoothed.astype(np.float32) + + +def ease_overspeed( + values: np.ndarray, + *, + limits: np.ndarray, + horizon: int | None = None, + max_passes: int | None = None, +) -> np.ndarray: + """Slew-rate-limit per-step deltas, repaying the deficit downstream.""" + del horizon, max_passes + out = np.array(values, dtype=np.float64, copy=True) + if len(out) < 2: + return out.astype(np.float32) + limit = np.broadcast_to(np.asarray(limits, dtype=np.float64), (out.shape[1],)) + kernel = native_kernel("ease_overspeed") + if kernel is not None: + return kernel(out, limit) + steps = np.diff(out, axis=0) + violating_dims = np.flatnonzero(np.any(np.abs(steps) > limit, axis=0)) + for j in violating_dims: + debt = 0.0 + for k in range(len(steps)): + candidate = steps[k, j] + debt + if abs(candidate) <= limit[j]: + steps[k, j] = candidate + debt = 0.0 + else: + sign = 1.0 if candidate > 0 else -1.0 + steps[k, j] = sign * limit[j] + debt = candidate - sign * limit[j] + out[1:] = out[0] + np.cumsum(steps, axis=0) + return out.astype(np.float32) + + +def _median(values: np.ndarray, window: int, *, nearest: bool) -> np.ndarray: + kernel = native_kernel("median_filter") + if kernel is not None: + return kernel(values, window, nearest).astype(values.dtype) + return ( + median_filter(values, size=window, mode="nearest") + if nearest + else medfilt(values, kernel_size=window) + ) + + +def _motion_change(values, reference, columns): + kernel = native_kernel("max_change") + if kernel is not None: + return kernel( + values, reference, columns, values.dtype == np.float32 and reference.dtype == np.float32 + ) + return ( + np.abs(values[:, columns] - reference[:, columns]).max(axis=0).tolist() if columns else [] + ) + + +def _overspeed_steps(values, limits): + kernel = native_kernel("overspeed_steps") + if kernel is not None: + return kernel(values, limits, values.dtype == np.float32) + return int(np.count_nonzero(np.any(np.abs(np.diff(values, axis=0)) > limits, axis=1))) + + +@dataclass(frozen=True) +class PreprocessingSpec: + """Parameters for the shared preprocessing hook.""" + + tau: float = 0.002 + min_idle_steps: int = 15 + savgol_window: int = 0 + savgol_polyorder: int = 3 + ease_horizon: int = 0 + smooth_columns: tuple[int, ...] | None = None + gripper_mode: str = "binary" + gripper_threshold: float = 0.8 + gripper_median_window: int = 0 + version: int = 2 + trim_mode: str = "shadow" + profile: str = "joint" + context_frames: int = 1 + motion_limits: tuple[float, ...] | None = None + translation_limit: float | None = None + rotation_limit: float | None = None + + def __post_init__(self) -> None: + if self.version not in (1, 2): + raise ValueError("unsupported preprocessing version") + if self.trim_mode not in ("off", "shadow", "bounded"): + raise ValueError("trim_mode must be off, shadow or bounded") + if self.profile not in ("joint", "eef") or self.context_frames < 1: + raise ValueError("invalid profile or context_frames") + if self.savgol_window != 0 and (self.savgol_window < 3 or self.savgol_window % 2 == 0): + raise ValueError("savgol_window must be zero or odd and at least three") + if self.savgol_polyorder < 1 or ( + self.savgol_window and self.savgol_polyorder >= self.savgol_window + ): + raise ValueError("invalid Savitzky-Golay polynomial order") + if self.ease_horizon < 0 or ( + self.gripper_median_window >= 3 and self.gripper_median_window % 2 == 0 + ): + raise ValueError("invalid ease or gripper median window") + if not np.isfinite(self.tau) or self.tau < 0 or self.min_idle_steps < 1: + raise ValueError("invalid idle candidate parameters") + budgets = [*(self.motion_limits or ()), self.translation_limit, self.rotation_limit] + if any(v is not None and (not np.isfinite(v) or v <= 0) for v in budgets): + raise ValueError("physical trim budgets must be finite and positive") + if self.version == 2 and self.trim_mode == "bounded": + if self.profile == "joint" and not self.motion_limits: + raise ValueError("bounded joint trimming requires motion_limits") + if self.profile == "eef" and ( + self.translation_limit is None or self.rotation_limit is None + ): + raise ValueError("bounded EEF trimming requires translation and rotation budgets") + if self.gripper_mode not in ("binary", "eleven", "twenty"): + raise ValueError("gripper_mode must be 'binary', 'eleven' or 'twenty'") + if not 0.0 < self.gripper_threshold < 1.0: + raise ValueError("gripper_threshold must lie strictly inside (0, 1)") + + def apply( + self, + values: np.ndarray, + *, + ease_limits: np.ndarray | None = None, + smooth_columns: tuple[int, ...] | None = None, + gripper_column: int | None = None, + stats: dict[str, object] | None = None, + active_dims: tuple[int, ...] | None = None, + gripper_is_discrete: bool = False, + ) -> np.ndarray: + """Transform one finite continuous segment; record alignment and loss.""" + values = np.asarray(values) + if values.ndim != 2 or not values.shape[1] or not np.isfinite(values).all(): + raise ValueError("preprocessing requires finite [T,D] values") + log = {} if stats is None else stats + if not len(values): + log.update(start=0, stop=0, ease_steps=0) + return values.copy() + if self.version == 1: + return self._legacy_apply_recorded( + values, ease_limits, smooth_columns, gripper_column, log + ) + start, stop = self._trim_slice(values, gripper_column, active_dims, log) + original = values[start:stop] + out = np.array(original, dtype=np.result_type(original.dtype, np.float32), copy=True) + columns = self.smooth_columns if smooth_columns is None else smooth_columns + columns = tuple(range(out.shape[1])) if columns is None else tuple(columns) + if self.profile == "eef": + columns = tuple(c for c in columns if c in (0, 1, 2)) + columns = tuple( + c + for c in columns + if gripper_column is None or c % out.shape[1] != gripper_column % out.shape[1] + ) + if self.savgol_window >= 3 and columns: + out[:, columns] = savgol_smooth( + out[:, columns], window=self.savgol_window, polyorder=self.savgol_polyorder + ) + out[: self.context_frames, columns] = original[: self.context_frames, columns] + log["motion_max_change"] = _motion_change(out, original, columns) + log["ease_steps"] = 0 + if self.ease_horizon >= 1 and ease_limits is not None: + if self.profile == "eef": + raise ValueError("additive easing cannot modify EEF rotations") + ease_limits = np.broadcast_to(ease_limits, (out.shape[1],)).copy() + if gripper_column is not None: + ease_limits[gripper_column] = np.inf + log["ease_steps"] = _overspeed_steps(out, ease_limits) + eased = ease_overspeed(out, limits=ease_limits) + log["ease_endpoint_reverted"] = not bool( + np.allclose(eased[-1], out[-1], atol=1e-6, rtol=0) + and np.allclose( + eased[: self.context_frames], out[: self.context_frames], atol=1e-6, rtol=0 + ) + ) + if not log["ease_endpoint_reverted"]: + out = eased + if gripper_column is not None: + column = gripper_column % out.shape[1] + raw = original[:, column : column + 1] + reference = discretize_gripper_actions( + raw, mode=self.gripper_mode, threshold=self.gripper_threshold + ) + if ( + self.gripper_mode in ("eleven", "twenty") + and not gripper_is_discrete + and self.gripper_median_window >= 3 + ): + out[:, column] = _median(raw[:, 0], self.gripper_median_window, nearest=True) + out[:, column] = discretize_gripper_actions( + out[:, column : column + 1], + mode=self.gripper_mode, + threshold=self.gripper_threshold, + )[:, 0] + log["gripper_changed_frames"] = int(np.count_nonzero(out[:, column] != reference[:, 0])) + log["motion_max_change"] = _motion_change(out, original, columns) + return out + + def _legacy_apply_recorded(self, values, ease_limits, smooth_columns, gripper_column, log): + start, stop = _legacy_boundary_trim_indices( + values, tau=self.tau, min_idle_steps=self.min_idle_steps + ) + log.update(start=start, stop=stop, version=1) + out = self._apply_v1( + values, + ease_limits=ease_limits, + smooth_columns=smooth_columns, + gripper_column=gripper_column, + stats=log, + ) + if gripper_column is not None and len(out): + reference = discretize_gripper_actions( + values[start:stop, gripper_column : gripper_column + 1] + if gripper_column >= 0 + else values[start:stop, -1:], + mode=self.gripper_mode, + threshold=self.gripper_threshold, + ) + log["gripper_changed_frames"] = int( + np.count_nonzero(out[:, gripper_column] != reference[:, 0]) + ) + return out + + def _trim_slice(self, values, gripper_column, active_dims, log): + start, stop = boundary_trim_indices( + values, + tau=self.tau, + min_idle_steps=self.min_idle_steps, + context_frames=self.context_frames, + ) + metrics = trim_deviation( + values, start, stop, profile=self.profile, gripper_column=gripper_column + ) + allowed = not metrics["gripper_changed"] + if self.profile == "joint" and self.motion_limits is not None: + dims = tuple(range(values.shape[1])) if active_dims is None else active_dims + local = [ + i + for i in range(values.shape[1]) + if gripper_column is None or i != gripper_column % values.shape[1] + ] + limits = np.asarray(self.motion_limits)[[dims[i] for i in local]] + allowed &= bool(np.all(np.asarray(metrics["motion_max_error"]) <= limits)) + elif ( + self.profile == "eef" + and self.translation_limit is not None + and self.rotation_limit is not None + ): + allowed &= metrics["translation_max_error_m"] <= self.translation_limit + allowed &= metrics["rotation_max_error_rad"] <= self.rotation_limit + else: + allowed = False + log.update( + version=2, + candidate_start=start, + candidate_stop=stop, + candidate_deviation=metrics, + trim_approved=bool(allowed), + trim_mode=self.trim_mode, + ) + if self.trim_mode != "bounded" or not allowed: + start, stop = 0, len(values) + log.update(start=start, stop=stop) + return start, stop + + def _apply_v1( + self, + values: np.ndarray, + *, + ease_limits: np.ndarray | None = None, + smooth_columns: tuple[int, ...] | None = None, + gripper_column: int | None = None, + stats: dict[str, int] | None = None, + ) -> np.ndarray: + smooth_columns = smooth_columns if smooth_columns is not None else self.smooth_columns + out = np.asarray(values) + start, stop = _legacy_boundary_trim_indices( + out, tau=self.tau, min_idle_steps=self.min_idle_steps + ) + if stop <= start: + if stats is not None: + stats["ease_steps"] = 0 + return out[start:start] + out = out[start:stop] + if self.savgol_window >= 3: + if smooth_columns is None: + out = savgol_smooth(out, window=self.savgol_window, polyorder=self.savgol_polyorder) + else: + out = np.array(out, copy=True) + columns = tuple(smooth_columns) + out[:, columns] = savgol_smooth( + out[:, columns], window=self.savgol_window, polyorder=self.savgol_polyorder + ) + if stats is not None: + stats["ease_steps"] = 0 + if self.ease_horizon >= 1 and ease_limits is not None: + limit = np.broadcast_to(np.asarray(ease_limits, dtype=np.float64), (out.shape[1],)) + if stats is not None: + stats["ease_steps"] = _overspeed_steps(out, limit) + out = ease_overspeed(out, limits=ease_limits, horizon=self.ease_horizon) + if gripper_column is not None: + out = np.array(out, copy=True) + column = gripper_column % out.shape[1] + if ( + self.gripper_mode in ("eleven", "twenty") + and self.gripper_median_window >= 3 + and len(out) >= self.gripper_median_window + ): + out[:, column] = _median(out[:, column], self.gripper_median_window, nearest=False) + out[:, column] = discretize_gripper_actions( + out[:, column : column + 1], + mode=self.gripper_mode, + threshold=self.gripper_threshold, + )[:, 0] + return out + + def to_dict(self) -> dict[str, object]: + """Serialize for ``preprocessing.json`` alongside a saved tokenizer.""" + payload = { + "tau": self.tau, + "min_idle_steps": self.min_idle_steps, + "savgol_window": self.savgol_window, + "savgol_polyorder": self.savgol_polyorder, + "ease_horizon": self.ease_horizon, + "smooth_columns": list(self.smooth_columns) + if self.smooth_columns is not None + else None, + "gripper_mode": self.gripper_mode, + "gripper_threshold": self.gripper_threshold, + "gripper_median_window": self.gripper_median_window, + } + if self.version == 2: + payload.update( + version=2, + trim_mode=self.trim_mode, + profile=self.profile, + context_frames=self.context_frames, + motion_limits=list(self.motion_limits) if self.motion_limits is not None else None, + translation_limit=self.translation_limit, + rotation_limit=self.rotation_limit, + ) + return payload + + @classmethod + def from_dict(cls, payload: dict[str, object]) -> PreprocessingSpec: + """Inverse of :meth:`to_dict`; raises on unknown keys.""" + fields = dict(payload) + smooth = fields.pop("smooth_columns", None) + version = fields.pop("version", 1) + limits = fields.pop("motion_limits", None) + spec = cls( + tau=float(fields.pop("tau")), + min_idle_steps=int(fields.pop("min_idle_steps")), + savgol_window=int(fields.pop("savgol_window")), + savgol_polyorder=int(fields.pop("savgol_polyorder")), + ease_horizon=int(fields.pop("ease_horizon")), + smooth_columns=tuple(int(c) for c in smooth) if smooth is not None else None, + gripper_mode=str(fields.pop("gripper_mode", "binary")), + gripper_threshold=float(fields.pop("gripper_threshold", 0.8)), + gripper_median_window=int( + fields.pop("gripper_median_window", 5 if version == 1 else 0) + ), + version=version, + trim_mode=fields.pop("trim_mode", "shadow"), + profile=fields.pop("profile", "joint"), + context_frames=int(fields.pop("context_frames", 1)), + motion_limits=None if limits is None else tuple(float(v) for v in limits), + translation_limit=fields.pop("translation_limit", None), + rotation_limit=fields.pop("rotation_limit", None), + ) + if fields: + raise ValueError(f"unknown preprocessing keys: {sorted(fields)}") + return spec diff --git a/runtime/routing/presets.py b/runtime/backends/actioncodec2/presets.py similarity index 61% rename from runtime/routing/presets.py rename to runtime/backends/actioncodec2/presets.py index af78f9acbed3e033c70332e92c92c0ad4c117f65..1a7ffdbae1bda8bc9038aebfb7a043a06b800c4e 100644 --- a/runtime/routing/presets.py +++ b/runtime/backends/actioncodec2/presets.py @@ -10,8 +10,14 @@ from pathlib import Path import numpy as np import yaml -from ..common._validation import optional_finite_array, validate_dimension_partition -from ..physical.configuration import ( +from ._validation import optional_finite_array, validate_dimension_partition +from .batch_semantics import ( + canonicalize_batch, + canonicalize_component_batch, + externalize_canonical_batch, + resample_canonical_batch, +) +from .configuration import ( ConfigError, _integer, _mapping, @@ -20,27 +26,23 @@ from ..physical.configuration import ( _required, _UniqueKeyLoader, ) -from ..physical.semantic import ( - binarize_gripper_actions, - eef_pose_absolute, - eef_pose_components, - eef_pose_deltas, - eef_pose_from_components, - eef_pose_from_local_absolute, - eef_pose_local_absolute, - integrate_eef_deltas, - resample_uniform, -) -from ..physical.trajectory import ActiveTrajectory +from .semantic import wrap_to_pi as wrap_to_pi +from .trajectory import ActiveTrajectory _NAME = re.compile(r"[a-z][a-z0-9_]*\Z") _SPACES = {"eef", "joint"} _INPUTS = {"absolute", "delta"} _ROTATIONS = {"rotation_vector", "euler_xyz", "quaternion_xyzw"} +_JOINT_WRAPS = {"pi", "none"} _INTERPOLATIONS = {"linear", "pchip", "cubic"} _GRIPPER_DIM = {"eef": 6, "joint": 7} +def canonical_preset_name(name: str) -> str: + """Preserve the historical six-coordinate alias without implying a gripper slot.""" + return "single_joint6_abs_no_gripper" if name == "single_joint6_abs_continuous_gripper" else name + + def _format_dims(dims: Sequence[int]) -> str: values = tuple(dims) if len(values) == 1: @@ -53,9 +55,7 @@ def _format_dims(dims: Sequence[int]) -> str: def _dims(value: object, path: str) -> tuple[int, ...]: if not isinstance(value, Sequence) or isinstance(value, (str, bytes, bytearray)): raise ConfigError(f"{path} must be a list of dimensions") - output = tuple( - _integer(item, f"{path}[{index}]") for index, item in enumerate(value) - ) + output = tuple(_integer(item, f"{path}[{index}]") for index, item in enumerate(value)) if not output: raise ConfigError(f"{path} must not be empty") if len(set(output)) != len(output): @@ -65,19 +65,26 @@ def _dims(value: object, path: str) -> tuple[int, ...]: @dataclass(frozen=True) class ComponentSpec: - "One independently encoded arm/body component in an input tensor." + """One independently encoded arm/body component in an input tensor.""" name: str space: str joint_dims: tuple[int, ...] | None = None + joint_wrap: str | None = None position_dims: tuple[int, ...] | None = None rotation_dims: tuple[int, ...] | None = None rotation_format: str = "rotation_vector" gripper_dim: int | None = None + gripper_closed_value: float = 0.0 + gripper_open_value: float = 1.0 gripper_threshold: float | None = None gripper_open_is_high: bool = True def __post_init__(self) -> None: + if not isinstance(self.gripper_open_is_high, bool): + raise ConfigError("gripper_open_is_high must be boolean") + if self.gripper_threshold is not None: + _number(self.gripper_threshold, "gripper_threshold") if not isinstance(self.name, str) or _NAME.fullmatch(self.name) is None: raise ConfigError(f"component name must match {_NAME.pattern!r}") if self.space not in _SPACES: @@ -94,40 +101,41 @@ class ComponentSpec: if dims is not None: _dims(dims, f"component {self.name}.{label}") self._validate_motion_dims() + if self.space == "joint": + if self.joint_wrap is None: + object.__setattr__(self, "joint_wrap", "pi") + if self.joint_wrap not in _JOINT_WRAPS: + raise ConfigError( + f"component {self.name!r}.joint_wrap must be one of {sorted(_JOINT_WRAPS)}" + ) + elif self.joint_wrap is not None: + raise ConfigError( + f"component {self.name!r}.joint_wrap applies only to joint components" + ) raw_dims = self.source_dims if self.gripper_dim is not None: _integer(self.gripper_dim, f"component {self.name}.gripper_dim") if self.gripper_dim in raw_dims: + raise ConfigError(f"component {self.name!r}.gripper_dim overlaps motion dims") + for anchor in (self.gripper_closed_value, self.gripper_open_value): + _number(anchor, f"component {self.name}.gripper anchor") + if self.gripper_closed_value == self.gripper_open_value: raise ConfigError( - f"component {self.name!r}.gripper_dim overlaps motion dims" + f"component {self.name!r}.gripper_closed_value and gripper_open_value " + "must differ" ) - if not isinstance(self.gripper_open_is_high, bool): - raise ConfigError( - f"component {self.name!r}.gripper_open_is_high must be boolean" - ) - threshold = self.gripper_threshold - if threshold is None: - threshold = 0.8 if self.gripper_open_is_high else 0.2 - object.__setattr__(self, "gripper_threshold", threshold) - _number(threshold, f"component {self.name}.gripper_threshold") def _validate_motion_dims(self) -> None: if self.space == "joint": if self.joint_dims is None or not 1 <= len(self.joint_dims) <= 7: - raise ConfigError( - f"joint component {self.name!r} requires 1..7 joint_dims" - ) + raise ConfigError(f"joint component {self.name!r} requires 1..7 joint_dims") if self.position_dims is not None or self.rotation_dims is not None: - raise ConfigError( - f"joint component {self.name!r} cannot define EEF dims" - ) + raise ConfigError(f"joint component {self.name!r} cannot define EEF dims") return if self.joint_dims is not None: raise ConfigError(f"EEF component {self.name!r} cannot define joint_dims") if self.position_dims is None or len(self.position_dims) != 3: - raise ConfigError( - f"EEF component {self.name!r} requires three position_dims" - ) + raise ConfigError(f"EEF component {self.name!r} requires three position_dims") expected = 4 if self.rotation_format == "quaternion_xyzw" else 3 if self.rotation_dims is None or len(self.rotation_dims) != expected: raise ConfigError( @@ -150,9 +158,7 @@ class ComponentSpec: def all_source_dims(self) -> tuple[int, ...]: """Motion plus optional binary-gripper source columns.""" return ( - self.source_dims - if self.gripper_dim is None - else (*self.source_dims, self.gripper_dim) + self.source_dims if self.gripper_dim is None else (*self.source_dims, self.gripper_dim) ) @property @@ -168,10 +174,13 @@ class ComponentSpec: allowed = { "space", "joint_dims", + "joint_wrap", "position_dims", "rotation_dims", "rotation_format", "gripper_dim", + "gripper_closed_value", + "gripper_open_value", "gripper_threshold", "gripper_open_is_high", } @@ -185,6 +194,7 @@ class ComponentSpec: joint_dims=None if "joint_dims" not in values else _dims(values["joint_dims"], f"{path}.joint_dims"), + joint_wrap=None if values.get("joint_wrap") is None else str(values["joint_wrap"]), position_dims=None if "position_dims" not in values else _dims(values["position_dims"], f"{path}.position_dims"), @@ -193,18 +203,26 @@ class ComponentSpec: else _dims(values["rotation_dims"], f"{path}.rotation_dims"), rotation_format=str(values.get("rotation_format", "rotation_vector")), gripper_dim=gripper_dim, - gripper_threshold=( - None - if values.get("gripper_threshold") is None - else _number(values["gripper_threshold"], f"{path}.gripper_threshold") - ), + gripper_threshold=(values.get("gripper_threshold") if values.get("gripper_threshold") is not None + else (0.8 if values.get("gripper_open_is_high", True) else 0.2) + if "gripper_open_is_high" in values or "gripper_threshold" in values else None), gripper_open_is_high=values.get("gripper_open_is_high", True), + gripper_closed_value=_number( + values.get("gripper_closed_value", 0.0), f"{path}.gripper_closed_value" + ), + gripper_open_value=_number( + values.get("gripper_open_value", 1.0), f"{path}.gripper_open_value" + ), ) def to_dict(self) -> dict[str, object]: payload: dict[str, object] = {"space": self.space} + if self.gripper_dim is not None and self.gripper_threshold is not None: + payload.update(gripper_threshold=self.gripper_threshold, + gripper_open_is_high=self.gripper_open_is_high) if self.space == "joint": payload["joint_dims"] = list(self.joint_dims or ()) + payload["joint_wrap"] = self.joint_wrap else: payload.update( { @@ -217,8 +235,8 @@ class ComponentSpec: payload.update( { "gripper_dim": self.gripper_dim, - "gripper_threshold": self.gripper_threshold, - "gripper_open_is_high": self.gripper_open_is_high, + "gripper_closed_value": self.gripper_closed_value, + "gripper_open_value": self.gripper_open_value, } ) return payload @@ -226,7 +244,7 @@ class ComponentSpec: @dataclass(frozen=True) class PresetConfig: - "A dataset- and embodiment-independent physical ``[B,T,D]`` contract." + """A dataset- and embodiment-independent physical ``[B,T,D]`` contract.""" name: str input_dim: int @@ -235,8 +253,10 @@ class PresetConfig: source_hz: float = 15.0 target_hz: float = 15.0 interpolation: str = "cubic" + token_order: str = "time_major" def __post_init__(self) -> None: + object.__setattr__(self, "name", canonical_preset_name(self.name)) if not isinstance(self.name, str) or _NAME.fullmatch(self.name) is None: raise ConfigError(f"preset.name must match {_NAME.pattern!r}") _integer(self.input_dim, "preset.input_dim", positive=True) @@ -244,39 +264,29 @@ class PresetConfig: raise ConfigError("preset.input must be absolute or delta") if not self.components: raise ConfigError("preset.components must not be empty") - if not all( - isinstance(component, ComponentSpec) for component in self.components - ): + if not all(isinstance(component, ComponentSpec) for component in self.components): raise ConfigError("preset.components must contain ComponentSpec values") names = [component.name for component in self.components] if len(set(names)) != len(names): raise ConfigError("preset.components contains a duplicate name") self._validate_source_partition() - for rate, path in ( - (self.source_hz, "source_hz"), - (self.target_hz, "target_hz"), - ): + for rate, path in ((self.source_hz, "source_hz"), (self.target_hz, "target_hz")): checked = _number(rate, f"preset.{path}") if checked <= 0.0: raise ConfigError(f"preset.{path} must be positive and finite") if self.interpolation not in _INTERPOLATIONS: - raise ConfigError( - f"preset.interpolation must be one of {sorted(_INTERPOLATIONS)}" - ) + raise ConfigError(f"preset.interpolation must be one of {sorted(_INTERPOLATIONS)}") + if self.token_order not in {"time_major", "component_major"}: + raise ConfigError("preset.token_order must be time_major or component_major") if self.input == "delta" and any( component.space == "eef" and component.rotation_format != "rotation_vector" for component in self.components ): - raise ConfigError( - "EEF delta components require rotation_format=rotation_vector" - ) + raise ConfigError("EEF delta components require rotation_format=rotation_vector") def _validate_source_partition(self) -> None: validate_dimension_partition( - ( - (component.name, component.all_source_dims) - for component in self.components - ), + ((component.name, component.all_source_dims) for component in self.components), self.input_dim, label="input dim", error_type=ConfigError, @@ -293,11 +303,10 @@ class PresetConfig: "target_hz", "interpolation", "components", + "token_order", } _reject_unknown(values, allowed, path) - raw_components = _mapping( - _required(values, "components", path), f"{path}.components" - ) + raw_components = _mapping(_required(values, "components", path), f"{path}.components") components = tuple( ComponentSpec.from_dict(name, raw, path=f"{path}.components.{name}") for name, raw in raw_components.items() @@ -312,6 +321,7 @@ class PresetConfig: source_hz=_number(values.get("source_hz", 15.0), f"{path}.source_hz"), target_hz=_number(values.get("target_hz", 15.0), f"{path}.target_hz"), interpolation=str(values.get("interpolation", "cubic")), + token_order=str(values.get("token_order", "time_major")), ) @classmethod @@ -319,9 +329,7 @@ class PresetConfig: """Load one strict user preset without executing arbitrary code.""" source = Path(path) try: - payload = yaml.load( - source.read_text(encoding="utf-8"), Loader=_UniqueKeyLoader - ) + payload = yaml.load(source.read_text(encoding="utf-8"), Loader=_UniqueKeyLoader) except yaml.YAMLError as error: raise ConfigError(f"cannot parse {source}: {error}") from error return cls.from_dict(payload, path=str(source)) @@ -330,9 +338,7 @@ class PresetConfig: """Save the complete reproducible preset and return its path.""" target = Path(path) target.parent.mkdir(parents=True, exist_ok=True) - target.write_text( - yaml.safe_dump(self.to_dict(), sort_keys=False), encoding="utf-8" - ) + target.write_text(yaml.safe_dump(self.to_dict(), sort_keys=False), encoding="utf-8") return target def to_dict(self) -> dict[str, object]: @@ -343,18 +349,17 @@ class PresetConfig: "source_hz": self.source_hz, "target_hz": self.target_hz, "interpolation": self.interpolation, - "components": { - component.name: component.to_dict() for component in self.components - }, + "token_order": self.token_order, + "components": {component.name: component.to_dict() for component in self.components}, } return payload def summary(self) -> str: """Return a compact action-space label for discovery UIs.""" - spaces = "+".join( - dict.fromkeys(component.space for component in self.components) + spaces = "+".join(dict.fromkeys(component.space for component in self.components)) + return ( + f"{self.name} (D={self.input_dim}, {self.input}, {spaces}, {self.source_hz:g} Hz input)" ) - return f"{self.name} (D={self.input_dim}, {self.input}, {spaces}, {self.source_hz:g} Hz input)" def describe(self) -> str: """Describe every source tensor column and its physical interpretation.""" @@ -367,6 +372,12 @@ class PresetConfig: f" dims {_format_dims(component.joint_dims)}: {component.name} " f"generalized-joint {motion} [rad or registered canonical unit]" ) + if self.input == "absolute": + lines.append( + " angles in (-pi, pi]; decode returns that interval" + if component.joint_wrap == "pi" + else " continuous angles, may exceed one turn; decode never wraps" + ) else: assert component.position_dims is not None assert component.rotation_dims is not None @@ -374,9 +385,7 @@ class PresetConfig: f" dims {_format_dims(component.position_dims)}: {component.name} " f"EEF translation {motion} (x, y, z in listed order) [m]" ) - rotation_motion = ( - "orientation" if self.input == "absolute" else "increment" - ) + rotation_motion = "orientation" if self.input == "absolute" else "increment" rotation_unit = ( "unit xyzw quaternion" if component.rotation_format == "quaternion_xyzw" @@ -392,21 +401,21 @@ class PresetConfig: "body-frame increment: R_next = R_previous @ Exp(rotvec)" ) elif component.rotation_format == "rotation_vector": - lines.append( - " rotation_vector = axis * angle [rad], not Euler angles" - ) + lines.append(" rotation_vector = axis * angle [rad], not Euler angles") elif component.rotation_format == "euler_xyz": lines.append(" euler_xyz = extrinsic x, y, z Euler angles [rad]") if component.gripper_dim is not None: - comparison = ">=" if component.gripper_open_is_high else "<=" - lines.append( - f" dim {component.gripper_dim}: {component.name} gripper command " - f"(open if value {comparison} {component.gripper_threshold:g}, otherwise closed; " - "decoded as absolute command: 1=open, 0=closed)" - ) + if component.gripper_threshold is not None: + comparison = ">=" if component.gripper_open_is_high else "<=" + semantics = f"binary; open when raw {comparison} {component.gripper_threshold:g}" + else: + semantics = (f"raw {component.gripper_closed_value:g} = closed, " + f"raw {component.gripper_open_value:g} = open; " + "levels are determined by the loaded profile") + lines.append(f" dim {component.gripper_dim}: {component.name} gripper command ({semantics})") else: lines.append( - f" {component.name}: no binary gripper channel; all listed columns are motion" + f" {component.name}: no gripper channel; all listed columns are motion" ) if self.input == "absolute": lines.append( @@ -429,7 +438,22 @@ class PresetConfig: source_hz: float | None = None, current_state: np.ndarray | None = None, ) -> dict[str, list[ActiveTrajectory]]: - "Convert a batch into local paths for the two shared profiles." + """Convert a batch into local paths for the two shared profiles.""" + batches = self._canonicalize_batch(values, source_hz=source_hz, current_state=current_state) + return { + component.name: [ + ActiveTrajectory(row, component.active_dims) for row in batches[component.name] + ] + for component in self.components + } + + def _canonicalize_batch( + self, + values: np.ndarray, + *, + source_hz: float | None = None, + current_state: np.ndarray | None = None, + ) -> dict[str, np.ndarray]: array = np.asarray(values, dtype=np.float32) if array.ndim != 3 or len(array) < 1 or array.shape[1] < 1: raise ValueError("preset input must have non-empty shape [B, T, D]") @@ -439,27 +463,9 @@ class PresetConfig: ) if not np.all(np.isfinite(array)): raise ValueError("preset input contains a non-finite value") - states: list[np.ndarray | None] - if current_state is None: - states = [None] * len(array) - else: - state_array = optional_finite_array( - current_state, shape=(len(array), self.input_dim) - ) - assert state_array is not None - states = list(state_array) - return { - component.name: [ - self._canonicalize_component( - episode, - component, - source_hz=self.source_hz if source_hz is None else source_hz, - current_state=state, - ) - for episode, state in zip(array, states, strict=True) - ] - for component in self.components - } + state_array = optional_finite_array(current_state, shape=(len(array), self.input_dim)) + source_hz = self.source_hz if source_hz is None else source_hz + return canonicalize_batch(self, array, source_hz=source_hz, current_state=state_array) def canonicalize_episode( self, @@ -474,16 +480,14 @@ class PresetConfig: raise ValueError( f"preset {self.name!r} expects a non-empty [T, {self.input_dim}] episode" ) - if not np.all(np.isfinite(episode)): - raise ValueError("preset input contains a non-finite value") state = optional_finite_array(current_state, shape=(self.input_dim,)) + canonical = self._canonicalize_batch( + episode[None], + source_hz=source_hz, + current_state=None if state is None else state[None], + ) return { - component.name: self._canonicalize_component( - episode, - component, - source_hz=self.source_hz if source_hz is None else source_hz, - current_state=state, - ) + component.name: ActiveTrajectory(canonical[component.name][0], component.active_dims) for component in self.components } @@ -505,105 +509,16 @@ class PresetConfig: source_hz: float, current_state: np.ndarray | None, ) -> ActiveTrajectory: - if component.space == "joint": - motion = self._joint_motion( - episode, component, source_hz=source_hz, current_state=current_state - ) - else: - motion = self._eef_motion( - episode, component, source_hz=source_hz, current_state=current_state - ) - if component.gripper_dim is None: - return ActiveTrajectory(motion, component.active_dims) - gripper = resample_uniform( - episode[:, component.gripper_dim : component.gripper_dim + 1], - source_hz=source_hz, - target_hz=self.target_hz, - kind="hold", - method=self.interpolation, - ) - binary = binarize_gripper_actions( - gripper, - threshold=component.gripper_threshold, - open_is_high=component.gripper_open_is_high, - ) - if len(binary) != len(motion): - raise RuntimeError("motion and gripper produced different target horizons") - return ActiveTrajectory( - np.concatenate((motion, binary), axis=1), component.active_dims - ) - - def _joint_motion( - self, - episode: np.ndarray, - component: ComponentSpec, - *, - source_hz: float, - current_state: np.ndarray | None, - ) -> np.ndarray: - assert component.joint_dims is not None - source = np.take(episode, component.joint_dims, axis=1) - if self.input == "delta": - source = np.cumsum(source, axis=0, dtype=np.float32) - anchor = np.zeros((1, source.shape[1]), dtype=np.float32) - else: - raw_anchor = ( - source[:1] - if current_state is None - else np.take(current_state, component.joint_dims)[None] - ) - unwrapped = np.unwrap(np.concatenate((raw_anchor, source), axis=0), axis=0) - anchor = np.asarray(unwrapped[:1], dtype=np.float32) - source = np.asarray(unwrapped[1:], dtype=np.float32) - sampled = resample_uniform( - source, - source_hz=source_hz, - target_hz=self.target_hz, - kind="linear", - method=self.interpolation, - ) - return np.asarray(sampled - anchor, dtype=np.float32) - - def _eef_motion( - self, - episode: np.ndarray, - component: ComponentSpec, - *, - source_hz: float, - current_state: np.ndarray | None, - ) -> np.ndarray: - assert ( - component.position_dims is not None and component.rotation_dims is not None - ) - position = np.take(episode, component.position_dims, axis=1) - rotation = np.take(episode, component.rotation_dims, axis=1) - if self.input == "delta": - pose = integrate_eef_deltas(np.concatenate((position, rotation), axis=1)) - pose = resample_uniform( - pose, - source_hz=source_hz, - target_hz=self.target_hz, - kind="pose_xyzw", - method=self.interpolation, - ) - return eef_pose_absolute(pose) - pose = eef_pose_from_components(position, rotation, component.rotation_format) - if current_state is None: - initial_pose = pose[0] - else: - initial_pose = eef_pose_from_components( - np.take(current_state, component.position_dims)[None], - np.take(current_state, component.rotation_dims)[None], - component.rotation_format, - )[0] - pose = resample_uniform( - pose, + values = canonicalize_component_batch( + self, + np.asarray(episode, dtype=np.float32)[None], + component, source_hz=source_hz, - target_hz=self.target_hz, - kind="pose_xyzw", - method=self.interpolation, + current_state=None + if current_state is None + else np.asarray(current_state, dtype=np.float32)[None], ) - return eef_pose_local_absolute(pose, initial_pose=initial_pose) + return ActiveTrajectory(values[0], component.active_dims) def format_action_spaces( @@ -611,9 +526,11 @@ def format_action_spaces( *, selected: str | None = None, action_dim: int | None = None, - second_order_dims: Mapping[str, Sequence[int]] | None = None, + second_order_boundaries: Mapping[str, Mapping[str, int]] | None = None, + codec_name: str = "ActionCodec2", + chunk_horizon_decode: bool = False, ) -> str: - "Explain registered tensor layouts without inferring semantics from shape." + """Explain registered tensor layouts without inferring semantics from shape.""" if action_dim is not None: action_dim = _integer(action_dim, "action_dim", positive=True) if not presets: @@ -627,7 +544,7 @@ def format_action_spaces( key=lambda preset: (preset.input_dim, preset.name), ) lines = [ - "ActionCodec2 — action layout guide", + f"{codec_name} — action layout guide", f"Selected action_space: {selected or 'none (choose a layout before encoding)'}", "", "Input: NumPy arrays or Torch tensors, (T,D) or (B,T,D).", @@ -644,19 +561,17 @@ def format_action_spaces( " Supply physical units, not normalized [-1,1] features; convert degrees to radians.", " Non-radian joint coordinates need an explicit mapping to the registered canonical units.", " Pass the actual sampling rate as fps=...; defaults and codec rates appear below.", - " Resampling can change decoded T; token coverage determines the returned length.", + ( + " Rows are independent chunks: decode(rows, horizon=T, fps=...) needs the chunk T." + if chunk_horizon_decode + else " Resampling can change decoded T; token coverage determines the returned length." + ), "", f"Registered configurations: {len(candidates)} shown / {len(presets)} total" - + ( - "" - if action_dim is None - else f" (D={action_dim} candidates, not automatic selection)" - ), + + ("" if action_dim is None else f" (D={action_dim} candidates, not automatic selection)"), ] if not candidates: - widths = ", ".join( - map(str, sorted({preset.input_dim for preset in presets.values()})) - ) + widths = ", ".join(map(str, sorted({preset.input_dim for preset in presets.values()}))) lines.extend( [ f" No registered action space matches D={action_dim}. Available D: {widths}.", @@ -669,13 +584,10 @@ def format_action_spaces( description = preset.describe().splitlines() lines.extend(["", f"- {description[0]}{marker}"]) lines.extend(f" {line.strip()}" for line in description[1:]) - if second_order_dims is not None: + if second_order_boundaries is not None: boundaries = [ - f"{component.name!r}: (B,{len(component.active_dims)})" - for component in preset.components - if set(component.active_dims).intersection( - second_order_dims.get(component.space, ()) - ) + f"{component!r}: (B,{width})" + for component, width in second_order_boundaries.get(name, {}).items() ] lines.append( " previous_first_order: " @@ -690,7 +602,7 @@ def format_action_spaces( [ "", "Next steps:", - " Load: ActionCodec2.from_pretrained(path, action_space='NAME')", + f" Load: {codec_name}.from_pretrained(path, action_space='NAME')", " Switch: codec = codec.for_action_space('NAME')", " Filter: codec.print_action_spaces(action_dim=D)", " Config: codec.action_spaces['NAME'].to_dict() # exact settings for a listed layout", @@ -714,44 +626,15 @@ def resample_canonical_trajectory( method: str = "linear", ) -> ActiveTrajectory: """Rate-convert one decoded canonical component without changing slots.""" - values = np.asarray(trajectory.values, dtype=np.float32) - motion_width = len(component.joint_dims or ()) if component.space == "joint" else 6 - motion = values[:, :motion_width] - if component.space == "eef": - pose = eef_pose_from_components( - motion[:, :3], motion[:, 3:6], "rotation_vector" - ) - sampled_pose = resample_uniform( - pose, - source_hz=source_hz, - target_hz=target_hz, - kind="pose_xyzw", - target_length=target_length, - method=method, - ) - sampled_motion = eef_pose_absolute(sampled_pose) - else: - sampled_motion = resample_uniform( - motion, - source_hz=source_hz, - target_hz=target_hz, - kind="linear", - target_length=target_length, - method=method, - ) - if component.gripper_dim is None: - return ActiveTrajectory(sampled_motion, trajectory.active_dims) - gripper = resample_uniform( - values[:, motion_width : motion_width + 1], + sampled = resample_canonical_batch( + np.asarray(trajectory.values, dtype=np.float32)[None], + component, source_hz=source_hz, target_hz=target_hz, - kind="hold", target_length=target_length, method=method, ) - return ActiveTrajectory( - np.concatenate((sampled_motion, gripper), axis=1), trajectory.active_dims - ) + return ActiveTrajectory(sampled[0], trajectory.active_dims) def externalize_canonical_trajectory( @@ -760,43 +643,11 @@ def externalize_canonical_trajectory( *, current_state: np.ndarray | None, ) -> np.ndarray: - "Return deltas, or absolute values when an external anchor is supplied." - values = np.asarray(trajectory.values, dtype=np.float32) - motion_width = len(component.joint_dims or ()) if component.space == "joint" else 6 - motion = values[:, :motion_width] - if component.space == "joint": - if current_state is None: - previous = np.concatenate((np.zeros_like(motion[:1]), motion[:-1]), axis=0) - output_motion = motion - previous - else: - assert component.joint_dims is not None - output_motion = motion + np.take(current_state, component.joint_dims)[None] - else: - local_pose = eef_pose_from_components( - motion[:, :3], motion[:, 3:6], "rotation_vector" - ) - if current_state is None: - output_motion = eef_pose_deltas(local_pose) - else: - assert ( - component.position_dims is not None - and component.rotation_dims is not None - ) - initial_pose = eef_pose_from_components( - np.take(current_state, component.position_dims)[None], - np.take(current_state, component.rotation_dims)[None], - component.rotation_format, - )[0] - output_motion = eef_pose_components( - eef_pose_from_local_absolute(local_pose, initial_pose=initial_pose), - component.rotation_format, - ) - if component.gripper_dim is None: - return np.asarray(output_motion, dtype=np.float32) - gripper = values[:, motion_width : motion_width + 1] - if not component.gripper_open_is_high: - gripper = 1.0 - gripper - return np.asarray( - np.concatenate((output_motion, gripper), axis=1), - dtype=np.float32, - ) + """Return deltas, or absolute values when an external anchor is supplied.""" + return externalize_canonical_batch( + np.asarray(trajectory.values, dtype=np.float32)[None], + component, + current_state=None + if current_state is None + else np.asarray(current_state, dtype=np.float32)[None], + )[0] diff --git a/runtime/physical/primitives.py b/runtime/backends/actioncodec2/primitives.py similarity index 71% rename from runtime/physical/primitives.py rename to runtime/backends/actioncodec2/primitives.py index dab6bd32fedaa7070b48657b30164d64b89ac202..c2493b7c4daa2f89998b144b64c31c33d9d0ee6d 100644 --- a/runtime/physical/primitives.py +++ b/runtime/backends/actioncodec2/primitives.py @@ -17,7 +17,7 @@ def _key(dimension: int) -> str: class PrimitiveStore: - "Immutable numerical primitive axes in global action-dimension order." + """Immutable numerical primitive axes in global action-dimension order.""" def __init__(self, values: Sequence[np.ndarray | Sequence[float]]) -> None: if not values: @@ -26,20 +26,14 @@ class PrimitiveStore: for dimension, raw in enumerate(values): array = np.asarray(raw) if array.dtype.hasobject: - raise ConfigError( - f"primitive dimension {dimension} must not use object dtype" - ) + raise ConfigError(f"primitive dimension {dimension} must not use object dtype") if array.ndim != 1 or not len(array): - raise ConfigError( - f"primitive dimension {dimension} must be a non-empty vector" - ) + raise ConfigError(f"primitive dimension {dimension} must be a non-empty vector") real_numeric = np.issubdtype(array.dtype, np.integer) or np.issubdtype( array.dtype, np.floating ) if not real_numeric or not np.all(np.isfinite(array)): - raise ConfigError( - f"primitive dimension {dimension} must contain finite numbers" - ) + raise ConfigError(f"primitive dimension {dimension} must contain finite numbers") arrays.append(np.array(array, copy=True)) self.values = tuple(arrays) self.bins = tuple(len(array) for array in arrays) @@ -49,9 +43,7 @@ class PrimitiveStore: return len(self.values) @classmethod - def from_pretrained( - cls, directory: str | Path, *, input_dim: int - ) -> PrimitiveStore: + def from_pretrained(cls, directory: str | Path, *, input_dim: int) -> PrimitiveStore: """Load exactly one safe numeric vector per expected global dimension.""" path = Path(directory) / PRIMITIVES_NAME with np.load(path, allow_pickle=False) as payload: @@ -60,9 +52,7 @@ class PrimitiveStore: missing = sorted(expected - actual) unknown = sorted(actual - expected) if missing: - raise ConfigError( - f"{PRIMITIVES_NAME} is missing array(s): {', '.join(missing)}" - ) + raise ConfigError(f"{PRIMITIVES_NAME} is missing array(s): {', '.join(missing)}") if unknown: raise ConfigError( f"{PRIMITIVES_NAME} contains unknown array(s): {', '.join(unknown)}" @@ -74,6 +64,4 @@ class PrimitiveStore: """Write ``primitives.npz`` without pickled objects or path metadata.""" path = Path(directory) / PRIMITIVES_NAME path.parent.mkdir(parents=True, exist_ok=True) - np.savez( - path, **{_key(index): value for index, value in enumerate(self.values)} - ) + np.savez(path, **{_key(index): value for index, value in enumerate(self.values)}) diff --git a/runtime/physical/physical_processor.py b/runtime/backends/actioncodec2/processor.py similarity index 65% rename from runtime/physical/physical_processor.py rename to runtime/backends/actioncodec2/processor.py index e3246ec457171ed0dedcd444ab956b5f17a05826..21127b11af7393a2fe4a21dd290668de680f02f8 100644 --- a/runtime/physical/physical_processor.py +++ b/runtime/backends/actioncodec2/processor.py @@ -1,4 +1,4 @@ -"Public ActionCodec2 processor and constrained-generation grammars." +'Public ActionCodec2 processor and constrained-generation grammars.' from __future__ import annotations @@ -12,18 +12,13 @@ from typing import Any import numpy as np from transformers.processing_utils import ProcessorMixin -from ..common._validation import active_dimensions -from ..tokenization.bpe import ( - BPE_NAME, - BPESerializer, - SetBPESerializer, - serializer_class, -) -from ..routing.cache import BoundedCache +from ._validation import active_dimensions +from .bpe import BPE_NAME, BPESerializer, SetBPESerializer, serializer_class +from .cache import BoundedCache from .configuration import CONFIG_NAME, MODEL_TYPE, ActionCodec2Config -from ..tokenization.grammar import ActionCodec2BPEGrammar as ActionCodec2BPEGrammar -from ..tokenization.grammar import ActionCodec2Grammar as ActionCodec2Grammar -from ..integration.hf import ( +from .grammar import ActionCodec2BPEGrammar as ActionCodec2BPEGrammar +from .grammar import ActionCodec2Grammar as ActionCodec2Grammar +from .hf import ( resolve_pretrained_directory, save_huggingface_metadata, upload_pretrained_directory, @@ -33,7 +28,7 @@ from .primitives import PRIMITIVES_NAME, PrimitiveStore class ActionCodec2Processor(ProcessorMixin): - "Hugging Face-style processor for continuous robot action trajectories." + 'Hugging Face-style processor for continuous robot action trajectories.' model_type = MODEL_TYPE name = "actioncodec2" @@ -83,14 +78,10 @@ class ActionCodec2Processor(ProcessorMixin): pretrained_model_name_or_path: str | Path, **kwargs: Any, ) -> ActionCodec2Processor: - "Load a local directory or Hugging Face Hub snapshot." - directory = resolve_pretrained_directory( - pretrained_model_name_or_path, **kwargs - ) + 'Load a local directory or Hugging Face Hub snapshot.' + directory = resolve_pretrained_directory(pretrained_model_name_or_path, **kwargs) config = ActionCodec2Config.from_pretrained(directory) - primitives = PrimitiveStore.from_pretrained( - directory, input_dim=config.physical.input_dim - ) + primitives = PrimitiveStore.from_pretrained(directory, input_dim=config.physical.input_dim) serializer = serializer_class(config).from_pretrained( directory, bins=primitives.bins, @@ -106,9 +97,7 @@ class ActionCodec2Processor(ProcessorMixin): ) -> list[str]: """Save numerical artifacts plus standard AutoProcessor metadata.""" if not push_to_hub and kwargs: - raise TypeError( - f"unused save_pretrained keyword(s): {', '.join(sorted(kwargs))}" - ) + raise TypeError(f"unused save_pretrained keyword(s): {', '.join(sorted(kwargs))}") directory = Path(save_directory) self.config.save_pretrained(directory) self.primitives.save_pretrained(directory) @@ -125,8 +114,7 @@ class ActionCodec2Processor(ProcessorMixin): return [str(path) for path in files] def to_dict(self, legacy_serialization: bool = True) -> dict[str, object]: - "Return metadata without embedding numerical artifact arrays." - del legacy_serialization + """Return lightweight processor metadata, never large primitive/BPE arrays.""" return { "processor_class": self.__class__.__name__, "model_type": self.model_type, @@ -139,9 +127,7 @@ class ActionCodec2Processor(ProcessorMixin): """Content hash over config, primitive axes, and ordered BPE rules.""" digest = hashlib.sha256() digest.update( - json.dumps( - self.config.to_dict(), sort_keys=True, separators=(",", ":") - ).encode() + json.dumps(self.config.to_dict(), sort_keys=True, separators=(",", ":")).encode() ) for axis in self.primitives.values: values = np.ascontiguousarray(axis) @@ -149,19 +135,26 @@ class ActionCodec2Processor(ProcessorMixin): digest.update(np.asarray(values.shape, dtype=np.int64).tobytes()) digest.update(values.tobytes()) digest.update( - json.dumps( - self.serializer.to_dict(), sort_keys=True, separators=(",", ":") - ).encode() + json.dumps(self.serializer.to_dict(), sort_keys=True, separators=(",", ":")).encode() ) return digest.hexdigest() + def __call__( + self, actions: np.ndarray, *, previous_first_order: np.ndarray | None = None + ) -> dict[str, list[list[int]]]: + + values = np.asarray(actions) + if values.ndim == 2: + values = values[None] + if previous_first_order is not None: + previous_first_order = np.asarray(previous_first_order)[None] + return {"input_ids": self.encode_batch(values, previous_first_order=previous_first_order)} + def quantize_batch( self, actions: np.ndarray, *, previous_first_order: np.ndarray | None = None ) -> np.ndarray: """Quantize ``[B,T,D]`` using a ``[B,D]`` first-order boundary if required.""" - return self.physical.encode_batch( - actions, previous_first_order=previous_first_order - ) + return self.physical.encode_batch(actions, previous_first_order=previous_first_order) def _dense_previous_first_order( self, previous_first_order: np.ndarray | None, dims: tuple[int, ...], batch: int @@ -194,9 +187,7 @@ class ActionCodec2Processor(ProcessorMixin): ) values = np.asarray(previous_first_order, dtype=np.float32) if values.shape != (batch, len(dims)) or not np.all(np.isfinite(values)): - raise ValueError( - f"previous_first_order must be finite with shape {(batch, len(dims))}" - ) + raise ValueError(f"previous_first_order must be finite with shape {(batch, len(dims))}") dense = np.zeros((batch, self.action_dim), dtype=np.float32) dense[:, dims] = values return dense @@ -210,6 +201,23 @@ class ActionCodec2Processor(ProcessorMixin): """Apply the lossless tokenizer to one compact or dense cell trajectory.""" return self.serializer.encode(cells, active_dims=active_dims) + def configure_encoding( + self, + *, + spatial_search: bool = False, + temporal_search: bool = False, + search_window: int = 32, + search_beam: int = 4, + ) -> ActionCodec2Processor: + 'Opt into lossless packing search; both stages default to disabled.' + self.serializer.configure_encoding( + spatial_search=spatial_search, + temporal_search=temporal_search, + search_window=search_window, + search_beam=search_beam, + ) + return self + def cells_from_tokens( self, tokens: Sequence[int], @@ -224,6 +232,27 @@ class ActionCodec2Processor(ProcessorMixin): values = np.asarray(cells, dtype=np.int64) return np.where(values >= 0, values, self._zero_cells) + def encode( + self, + actions: np.ndarray, + *, + active_dims: Sequence[int] | None = None, + previous_first_order: np.ndarray | None = None, + ) -> list[int]: + 'Encode ``[T,D_active]`` with an optional compact ``[D_active]`` boundary.' + values = np.asarray(actions, dtype=np.float32) + if values.ndim != 2 or len(values) < 1 or values.shape[1] < 1: + raise ValueError("actions must have non-empty shape [T, D_active]") + dims = ( + tuple(range(values.shape[1])) + if active_dims is None and values.shape[1] < self.action_dim + else active_dimensions(active_dims, self.action_dim) + ) + if len(dims) != values.shape[1]: + raise ValueError("active_dims must have one entry per action coordinate") + previous = None if previous_first_order is None else np.asarray(previous_first_order)[None] + return self.encode_batch(values[None], active_dims=dims, previous_first_order=previous)[0] + def encode_batch( self, actions: np.ndarray, @@ -231,14 +260,9 @@ class ActionCodec2Processor(ProcessorMixin): active_dims: Sequence[int] | None = None, previous_first_order: np.ndarray | None = None, ) -> list[list[int]]: - "Encode a dense or compact ``[B,T,D]`` batch into ragged streams." + 'Encode a dense or compact ``[B,T,D]`` batch into ragged streams.' values = np.asarray(actions, dtype=np.float32) - if ( - values.ndim != 3 - or len(values) < 1 - or values.shape[1] < 1 - or values.shape[2] < 1 - ): + if values.ndim != 3 or len(values) < 1 or values.shape[1] < 1 or values.shape[2] < 1: raise ValueError("actions must have non-empty shape [B, T, D_active]") dims = active_dimensions(active_dims, self.action_dim) if len(dims) != values.shape[2]: @@ -247,17 +271,26 @@ class ActionCodec2Processor(ProcessorMixin): if full_width: dense = values else: - dense = np.zeros( - (len(values), values.shape[1], self.action_dim), dtype=np.float32 - ) + dense = np.zeros((len(values), values.shape[1], self.action_dim), dtype=np.float32) dense[:, :, dims] = values - previous = self._dense_previous_first_order( - previous_first_order, dims, len(values) - ) + previous = self._dense_previous_first_order(previous_first_order, dims, len(values)) cells = self.quantize_batch(dense, previous_first_order=previous) if not full_width: cells = np.take(cells, dims, axis=2) - return [self.tokens_from_cells(row, active_dims=dims) for row in cells] + return self.serializer.encode_batch(cells, active_dims=dims) + + def decode( + self, + tokens: Sequence[int], + *, + active_dims: Sequence[int] | None = None, + previous_first_order: np.ndarray | None = None, + ) -> np.ndarray: + 'Decode one stream to ``[T,D_active]`` reconstructed actions.' + previous = None if previous_first_order is None else np.asarray(previous_first_order)[None] + return self.decode_batch([tokens], active_dims=active_dims, previous_first_order=previous)[ + 0 + ] def decode_batch( self, @@ -266,21 +299,11 @@ class ActionCodec2Processor(ProcessorMixin): active_dims: Sequence[int] | None = None, previous_first_order: np.ndarray | None = None, ) -> np.ndarray: - "Decode equal-length streams into one batched physical array." + 'Decode equal-length streams into one batched physical array.' dims = active_dimensions(active_dims, self.action_dim) - cells = [self.cells_from_tokens(stream, active_dims=dims) for stream in streams] - if not cells: - raise ValueError("streams must not be empty") - lengths = {len(value) for value in cells} - if len(lengths) != 1: - raise ValueError( - "all token streams in a batch must decode to the same length" - ) - stacked_cells = np.stack(cells) + stacked_cells = self.serializer.decode_batch(streams, active_dims=dims) dense_cells = self._fill_inactive_cells(stacked_cells) - previous = self._dense_previous_first_order( - previous_first_order, dims, len(cells) - ) + previous = self._dense_previous_first_order(previous_first_order, dims, len(stacked_cells)) decoded = self.physical.decode_batch(dense_cells, previous_first_order=previous) return np.take(decoded, dims, axis=2) @@ -292,13 +315,11 @@ class ActionCodec2Processor(ProcessorMixin): active_dims: Sequence[int] | None = None, executed_steps: int | None = None, ) -> np.ndarray: - "Return the next compact ``[B,D_active]`` reconstructed boundary." + 'Return the next compact ``[B,D_active]`` reconstructed boundary.' dims = active_dimensions(active_dims, self.action_dim) cells = [self.cells_from_tokens(stream, active_dims=dims) for stream in streams] if not cells or len({len(row) for row in cells}) != 1: - raise ValueError( - "streams must be non-empty and have equal decoded horizons" - ) + raise ValueError("streams must be non-empty and have equal decoded horizons") if executed_steps is not None: if ( isinstance(executed_steps, bool) @@ -307,14 +328,21 @@ class ActionCodec2Processor(ProcessorMixin): ): raise ValueError("executed_steps must be within the decoded horizon") cells = [row[:executed_steps] for row in cells] - previous = self._dense_previous_first_order( - previous_first_order, dims, len(cells) - ) + previous = self._dense_previous_first_order(previous_first_order, dims, len(cells)) result = self.physical.final_first_order( self._fill_inactive_cells(np.stack(cells)), previous_first_order=previous ) return np.take(result, dims, axis=1) + def eval(self) -> ActionCodec2Processor: + """Return ``self``; the rule processor has no train/eval state.""" + return self + + def to(self, device: object) -> ActionCodec2Processor: + """Return ``self``; all runtime arrays are CPU NumPy values.""" + del device + return self + def grammar( self, horizon: int, @@ -328,11 +356,16 @@ class ActionCodec2Processor(ProcessorMixin): key = (horizon, dims) grammar = self._grammar_cache.get(key) if grammar is None: - grammar_class = ( - ActionCodec2BPEGrammar - if isinstance(self.serializer, BPESerializer) - else ActionCodec2Grammar - ) + if self.serializer.scheme == "unified_set_bpe": + from .unified_set_bpe import UnifiedSetBPEGrammar + + grammar_class = UnifiedSetBPEGrammar + else: + grammar_class = ( + ActionCodec2BPEGrammar + if isinstance(self.serializer, BPESerializer) + else ActionCodec2Grammar + ) grammar = grammar_class(self.serializer, horizon=horizon, active_dims=dims) self._grammar_cache[key] = grammar return grammar diff --git a/runtime/backends/actioncodec2/release.py b/runtime/backends/actioncodec2/release.py new file mode 100644 index 0000000000000000000000000000000000000000..51a171c242820578d650d8cbcb7c8741b3cbe803 --- /dev/null +++ b/runtime/backends/actioncodec2/release.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +import json + +from pathlib import Path + +from typing import Any + +from .preprocessing import PreprocessingSpec + + +MANIFEST_NAME = "manifest.json" + +SUPPORTED_FORMAT = 1 + +_USER_TO_STORAGE = {"2bin": "binary", "11bin": "eleven", "21bin": "twenty"} + +_GRIPPER_LIMIT = {"2bin": 0.5, "11bin": 0.05, "21bin": 0.025} + +_GRIPPER_BINS = {"2bin": 2, "11bin": 11, "21bin": 21} + +_GRIPPER_COMPONENT = "gripper_open_command" + + +def normalize_gripper_mode(token: str) -> str: + """Map user-facing and legacy gripper-mode tokens onto ``2bin``/``11bin``/``21bin``.""" + token = str(token).strip().lower() + if token in _USER_TO_STORAGE: + return token + legacy = {v: k for k, v in _USER_TO_STORAGE.items()} + if token in legacy: + return legacy[token] + raise ValueError( + f"unknown gripper_mode {token!r}; expected one of " + f"{sorted(_USER_TO_STORAGE)} (legacy tokens accepted)" + ) + + +def read_manifest(package: str | Path) -> dict[str, Any]: + path = Path(package) + manifest_path = path / MANIFEST_NAME + if not manifest_path.is_file(): + raise FileNotFoundError( + f"{path} is not a release package: missing {MANIFEST_NAME}; " + "expected a release directory containing manifest.json" + ) + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + fmt = manifest.get("format") + if type(fmt) is not int or not 1 <= fmt <= SUPPORTED_FORMAT: + raise ValueError(f"unsupported manifest format {fmt!r} in {manifest_path}") + return manifest + + +def release_tokenizer(manifest: dict[str, Any]) -> str: + """Tokenizer family of a release; manifests before ActionCodec2Sparse omit it.""" + return manifest.get("tokenizer", "actioncodec2") + + +def selected_variants( + package: str | Path, *, gripper_mode: str, order: int, tokenizer: str = "actioncodec2" +): + """Select one vocabulary per available physical profile from a release.""" + if type(order) is not int or order not in (1, 2): + raise ValueError("primitive_order must be 1 or 2") + mode = normalize_gripper_mode(gripper_mode) + manifest = read_manifest(package) + found = release_tokenizer(manifest) + if found != tokenizer: + frontend = {"actioncodec2": "ActionCodec2", "actioncodec2_sparse": "ActionCodec2Sparse"} + raise ValueError( + f"{package} is an {found!r} release; load it with {frontend.get(found, found)}" + ) + selected = {} + for variant in manifest["variants"]: + if variant["order"] != order or variant["gripper_mode"] != mode: + continue + profile = variant["profile"] + if profile not in {"joint", "eef"} or profile in selected: + raise ValueError(f"invalid or duplicate release profile {profile!r}") + selected[profile] = variant + if not selected: + raise ValueError(f"{package} has no release variants for {mode}/order{order}") + return manifest, mode, selected + + +def check_gripper_consistency( + entry: Path, + processor, + preprocessing: PreprocessingSpec, + mode: str, +) -> None: + expected_token = _USER_TO_STORAGE[mode] + if preprocessing.gripper_mode != expected_token: + raise ValueError( + f"{entry}: preprocessing.json gripper_mode " + f"{preprocessing.gripper_mode!r} does not match requested {mode!r}" + ) + component = processor.config.physical.components.get(_GRIPPER_COMPONENT) + if component is None: + return + limit = component.distortion_limit + limit = float(limit[0]) if isinstance(limit, (list, tuple)) else float(limit) + if abs(limit - _GRIPPER_LIMIT[mode]) > 1e-9: + raise ValueError( + f"{entry}: gripper distortion_limit {limit} does not match " + f"{mode} ({_GRIPPER_LIMIT[mode]})" + ) + if processor.bins[-1] != _GRIPPER_BINS[mode]: + raise ValueError( + f"{entry}: last primitive bin count {processor.bins[-1]} " + f"does not match {mode} ({_GRIPPER_BINS[mode]})" + ) + + +def check_release_gates(entry: Path) -> None: + validation_path = entry / "validation.json" + derived_path = entry / "derived_report.json" + if validation_path.is_file(): + report = json.loads(validation_path.read_text(encoding="utf-8")) + additive = [x for x in report["additive_within_limit"] if x is not None] + ok = ( + report["primitive_zero_exact"] + and report["set_bpe_cell_roundtrip_exact"] + and all(additive) + and report["passed"] + ) + if not ok: + raise ValueError(f"{entry}: recorded validation gates failed") + elif derived_path.is_file(): + report = json.loads(derived_path.read_text(encoding="utf-8")) + if report["additive_within_limit_segments"] != report["segments"]: + raise ValueError(f"{entry}: derived probe gates failed") + else: + raise FileNotFoundError(f"{entry}: no validation.json or derived_report.json") diff --git a/runtime/backends/actioncodec2/routing.py b/runtime/backends/actioncodec2/routing.py new file mode 100644 index 0000000000000000000000000000000000000000..aac0e03ac9e8ec44d10b9e9a523f240d18c43758 --- /dev/null +++ b/runtime/backends/actioncodec2/routing.py @@ -0,0 +1,959 @@ +'Required-preset routing over the two shared ActionCodec2 processors.' + +from __future__ import annotations + +from .presets import canonical_preset_name + +import re +from collections.abc import Mapping, Sequence +from dataclasses import asdict, dataclass +from pathlib import Path +from types import MappingProxyType +from typing import TYPE_CHECKING + +import numpy as np +import yaml + +from ._validation import optional_finite_array +from .batch_semantics import externalize_batch +from .cache import BoundedCache, cached_prefix_state +from .configuration import ( + ActionCodec2Config, + ConfigError, + _integer, + _mapping, + _reject_unknown, + _required, + _UniqueKeyLoader, +) +from .hf import ( + ROUTER_ALLOW_PATTERNS, + ROUTER_CONFIG_NAME, + ROUTER_MODEL_TYPE, + resolve_pretrained_directory, + save_huggingface_metadata, + save_model_card, +) +from .native_backend import native_kernel +from .presets import ( + ComponentSpec, + PresetConfig, + format_action_spaces, +) +from .processor import ActionCodec2Processor +from .semantic import resampled_horizon +from .trajectory import ActiveTrajectory + +if TYPE_CHECKING: + from ...frontend.actioncodec2 import ActionCodec2 + + +ROUTER_CONFIG_VERSION = 4 +_NAME = re.compile(r"[a-z][a-z0-9_]*\Z") +_PROFILES = {"eef", "joint"} +_PROFILE_WIDTHS = {"eef": 7, "joint": 8} +_ComponentStates = tuple[tuple[int, ...], ...] +_RoutedState = tuple[int, _ComponentStates] + + +@dataclass(frozen=True) +class ProfileSpec: + """Token namespace metadata for one shared physical processor.""" + + name: str + token_offset: int + token_budget: int + artifact_fingerprint: str + + def __post_init__(self) -> None: + if _NAME.fullmatch(self.name) is None: + raise ConfigError(f"profile.name must match {_NAME.pattern!r}") + _integer(self.token_offset, "profile.token_offset") + _integer(self.token_budget, "profile.token_budget", positive=True) + if re.fullmatch(r"[0-9a-f]{64}", self.artifact_fingerprint) is None: + raise ConfigError("profile.artifact_fingerprint must be a SHA-256 hex digest") + + @classmethod + def from_dict(cls, payload: object, *, path: str) -> ProfileSpec: + values = _mapping(payload, path) + allowed = {"name", "token_offset", "token_budget", "artifact_fingerprint"} + _reject_unknown(values, allowed, path) + return cls( + name=str(_required(values, "name", path)), + token_offset=_integer(_required(values, "token_offset", path), f"{path}.token_offset"), + token_budget=_integer( + _required(values, "token_budget", path), + f"{path}.token_budget", + positive=True, + ), + artifact_fingerprint=str(_required(values, "artifact_fingerprint", path)), + ) + + def to_dict(self) -> dict[str, object]: + return asdict(self) + + +def _second_order_dims(config: ActionCodec2Config) -> frozenset[int]: + + return frozenset( + dimension + for component in config.physical.components.values() + if component.primitive_order == 2 + for dimension in component.dims + ) + + +def _second_order_boundaries( + preset: PresetConfig, second_order_dims: Mapping[str, frozenset[int]] +) -> dict[str, int]: + + return { + component.name: len(component.active_dims) + for component in preset.components + if second_order_dims[component.space].intersection(component.active_dims) + } + + +@dataclass(frozen=True) +class _ProfileRuntime: + spec: ProfileSpec + processor: ActionCodec2Processor + + +@dataclass(frozen=True) +class _Segment: + component: ComponentSpec + profile: _ProfileRuntime + + +def _schedule(fronts: Sequence[int], finished: Sequence[bool], time_major: bool) -> int | None: + open_ = [i for i, done in enumerate(finished) if not done] + if not open_: + return None + return min(open_, key=lambda i: (fronts[i], i)) if time_major else open_[0] + + +class RoutedActionCodec2Grammar: + 'Coverage grammar over a shared time grid and namespaced physical components.' + + def __init__(self, router: ActionCodec2Router, *, preset: str, horizon: int) -> None: + horizon = _integer(horizon, "horizon", positive=True) + self.segments = router._segments(router.preset(preset)) + self.horizon = horizon + self.token_order = router.preset(preset).token_order + self.vocab_size = router.vocab_size + self._grammars = tuple( + segment.profile.processor.grammar(horizon, active_dims=segment.component.active_dims) + for segment in self.segments + ) + self._native_grammars = tuple( + getattr(grammar, "_native", None) for grammar in self._grammars + ) + self._native_offsets = tuple(segment.profile.spec.token_offset for segment in self.segments) + states = tuple(grammar._initial_state() for grammar in self._grammars) + self._initial_state = (self._next_component(states), states) + + self._state_cache = BoundedCache(256) + + def _compiled_grammars(self): + if native_kernel("route_advance") is None: + return None + if any(g is None for g in self._native_grammars): + self._native_grammars = tuple(g._compiled() for g in self._grammars) + return self._native_grammars if all(g is not None for g in self._native_grammars) else None + + def _next_component(self, states: _ComponentStates) -> int: + fronts = [grammar._covered_steps(state) for grammar, state in zip(self._grammars, states, strict=True)] + index = _schedule(fronts, [front >= self.horizon for front in fronts], + self.token_order == "time_major") + return len(fronts) if index is None else index + + def _advance_routed_state( + self, + routed_state: _RoutedState, + token: int, + ) -> _RoutedState | None: + segment_index, states = routed_state + kernel = native_kernel("route_advance") + compiled = self._compiled_grammars() + if kernel is not None and compiled is not None: + return kernel( + compiled, + self._native_offsets, + self.token_order == "time_major", + segment_index, + states, + token, + ) + if segment_index == len(self.segments): + return None + segment = self.segments[segment_index] + local_token = token - segment.profile.spec.token_offset + if not 0 <= local_token < segment.profile.processor.vocab_size: + return None + next_state = self._grammars[segment_index]._advance(states[segment_index], local_token) + if next_state is None: + return None + updated = (*states[:segment_index], next_state, *states[segment_index + 1 :]) + return self._next_component(updated), updated + + def _consume(self, tokens: Sequence[int]) -> _RoutedState | None: + checked: list[int] = [] + for raw_token in tokens: + if isinstance(raw_token, bool) or not isinstance(raw_token, (int, np.integer)): + return None + checked.append(int(raw_token)) + return cached_prefix_state( + tuple(checked), self._state_cache, self._initial_state, self._advance_routed_state + ) + + def reserve_states(self, rows: int) -> None: + 'Size the prefix cache for ``rows`` streams advanced in lockstep.' + self._state_cache.reserve(4 * _integer(rows, "rows", positive=True)) + + def next_token_mask(self, tokens: Sequence[int]) -> np.ndarray: + """Return a global namespace mask for the next preset token.""" + state = self._consume(tokens) + if state is None: + raise ValueError("token prefix is not legal for this routed preset") + segment_index, states = state + output = np.zeros(self.vocab_size, dtype=bool) + if segment_index == len(self.segments): + return output + segment = self.segments[segment_index] + mask = self._grammars[segment_index]._next_token_mask_from_state(states[segment_index]) + start = segment.profile.spec.token_offset + output[start : start + len(mask)] = mask + return output + + def is_complete(self, tokens: Sequence[int]) -> bool: + """Whether the prefix completes every segment exactly once.""" + state = self._consume(tokens) + return state is not None and state[0] == len(self.segments) + + def covered_steps(self, tokens: Sequence[int]) -> int: + """Return the contiguous frame prefix covered by every component.""" + state = self._consume(tokens) + if state is None: + raise ValueError("token prefix is not legal for this routed preset") + return min( + grammar._covered_steps(local) for grammar, local in zip(self._grammars, state[1], strict=True) + ) + + def is_prefix_complete(self, tokens: Sequence[int], *, steps: int) -> bool: + """Whether a legal token prefix fully covers the requested action frames.""" + if type(steps) is not int or not 1 <= steps <= self.horizon: + raise ValueError("steps must be an integer within the grammar horizon") + state = self._consume(tokens) + return state is not None and all( + grammar._covered_steps(local) >= steps + for grammar, local in zip(self._grammars, state[1], strict=True) + ) + + def interleave(self, streams: Sequence[Sequence[int]]) -> list[int]: + """Route per-component local token streams without changing their tokens.""" + kernel = native_kernel("route_interleave") + compiled = self._compiled_grammars() + if kernel is not None and compiled is not None: + return kernel(compiled, self._native_offsets, self.token_order == "time_major", streams) + if len(streams) != len(self.segments): + raise ValueError("one token stream is required per component") + state = self._initial_state + cursors = [0] * len(streams) + output = [] + while state[0] < len(streams): + index = state[0] + if cursors[index] == len(streams[index]): + raise ValueError("component token stream ends before complete coverage") + token = ( + int(streams[index][cursors[index]]) + self.segments[index].profile.spec.token_offset + ) + state = self._advance_routed_state(state, token) + if state is None: + raise ValueError("component token stream violates the routed grammar") + cursors[index] += 1 + output.append(token) + if any(cursor != len(stream) for cursor, stream in zip(cursors, streams, strict=True)): + raise ValueError("extra component tokens after complete coverage") + return output + + def complete_prefix(self, tokens: Sequence[int], *, steps: int) -> list[int]: + 'Fill only unreturned future cells with zero-motion primitive atoms.' + if type(steps) is not int or not 1 <= steps <= self.horizon: + raise ValueError("steps must be an integer within the grammar horizon") + if self.covered_steps(tokens) < steps: + raise ValueError(f"action prefix does not cover the first {steps} frames") + kernel = native_kernel("route_complete") + compiled = self._compiled_grammars() + if kernel is not None and compiled is not None: + zero_atoms = [ + ( + np.r_[0, np.cumsum(segment.profile.processor.bins[:-1])] + + segment.profile.processor._zero_cells + ).tolist() + for segment in self.segments + ] + return kernel( + compiled, + self._native_offsets, + self.token_order == "time_major", + [int(token) for token in tokens], + steps, + zero_atoms, + ) + output = [int(token) for token in tokens] + state = self._consume(output) + while state[0] < len(self.segments): + index, states = state + segment = self.segments[index] + processor = segment.profile.processor + local = states[index] + dims = segment.component.active_dims + if processor.serializer.scheme == "unified_set_bpe": + atom = self._grammars[index].completion_token( + local, processor._zero_cells, processor.bins + ) + token = segment.profile.spec.token_offset + atom + state = self._advance_routed_state(state, token) + if state is None: + raise RuntimeError("zero-motion suffix atom violates the routed grammar") + output.append(token) + continue + if processor.serializer.scheme == "bpe": + dimension = dims[local[0] % len(dims)] + else: + full = sum(1 << d for d in dims) + uncovered = next(full & ~mask for mask in local if mask != full) + dimension = (uncovered & -uncovered).bit_length() - 1 + atom = sum(processor.serializer.bins[:dimension]) + int( + processor._zero_cells[dimension] + ) + token = segment.profile.spec.token_offset + atom + state = self._advance_routed_state(state, token) + if state is None: + raise RuntimeError("zero-motion suffix atom violates the routed grammar") + output.append(token) + return output + + +class ActionCodec2Router: + 'Route heterogeneous dataset states into physical token namespaces.' + + model_type = ROUTER_MODEL_TYPE + + def __init__( + self, + profiles: Sequence[tuple[ProfileSpec, ActionCodec2Processor]], + presets: Sequence[PresetConfig], + ) -> None: + runtimes: dict[str, _ProfileRuntime] = {} + expected_offset = 0 + for spec, processor in profiles: + if spec.name in runtimes: + raise ConfigError(f"duplicate physical profile {spec.name!r}") + if spec.token_offset != expected_offset: + raise ConfigError("profile token namespaces must be contiguous and ordered") + if processor.vocab_size > spec.token_budget: + raise ConfigError( + f"profile {spec.name!r} uses {processor.vocab_size} tokens, " + f"exceeding budget {spec.token_budget}" + ) + if processor.artifact_fingerprint != spec.artifact_fingerprint: + raise ConfigError( + f"profile {spec.name!r} artifact fingerprint does not match its processor" + ) + if processor.config.set_bpe.allow_cross_component_merge: + raise ConfigError( + "allow_cross_component_merge=true is not supported by the v1 router; " + "a component-aware Set-BPE serializer and grammar are required" + ) + runtimes[spec.name] = _ProfileRuntime(spec, processor) + expected_offset += spec.token_budget + if not runtimes or set(runtimes) - _PROFILES: + raise ConfigError("router profiles must be a non-empty subset of joint and eef") + for name, runtime in runtimes.items(): + if runtime.processor.action_dim != _PROFILE_WIDTHS[name]: + raise ConfigError( + f"profile {name!r} must have width {_PROFILE_WIDTHS[name]}, " + f"got {runtime.processor.action_dim}" + ) + self.profiles = MappingProxyType(runtimes) + self._second_order_dims = { + name: _second_order_dims(runtime.processor.config) for name, runtime in runtimes.items() + } + self._grammar_cache = BoundedCache(8) + self._action_spaces: dict[str, PresetConfig] = {} + for preset in presets: + self.register_action_space(preset) + self.vocab_size = expected_offset + self._token_cells = np.full(self.vocab_size, -1, dtype=np.int64) + for runtime in runtimes.values(): + start = runtime.spec.token_offset + self._token_cells[start : start + runtime.processor.vocab_size] = ( + runtime.processor.serializer.token_cell_counts + ) + + @property + def action_spaces(self) -> Mapping[str, PresetConfig]: + """Read-only registered built-in and user-created action spaces.""" + return MappingProxyType(self._action_spaces) + + def __str__(self) -> str: + return self.describe_action_spaces() + + def second_order_boundaries(self, preset: str | PresetConfig) -> dict[str, int]: + 'Map each component needing ``previous_first_order`` to its active width.' + if not isinstance(preset, PresetConfig): + preset = self.preset(preset) + return _second_order_boundaries(preset, self._second_order_dims) + + def describe_action_spaces( + self, *, selected: str | None = None, action_dim: int | None = None + ) -> str: + """Explain all layouts, or source-width candidates, using this artifact's state requirements.""" + return format_action_spaces( + self.action_spaces, + selected=selected, + action_dim=action_dim, + second_order_boundaries={ + name: self.second_order_boundaries(preset) + for name, preset in self.action_spaces.items() + }, + ) + + @classmethod + def from_processors( + cls, + processors: Mapping[str, ActionCodec2Processor], + *, + token_budgets: Mapping[str, int], + presets: Sequence[PresetConfig], + ) -> ActionCodec2Router: + """Assign stable contiguous namespaces in canonical joint/eef order.""" + if set(processors) != set(token_budgets): + raise ConfigError("processors and token_budgets must share keys") + if not processors or set(processors) - _PROFILES: + raise ConfigError("processors must contain a non-empty subset of joint and eef") + offset = 0 + entries = [] + for name in ("joint", "eef"): + if name not in processors: + continue + processor = processors[name] + budget = _integer(token_budgets[name], f"token_budgets.{name}", positive=True) + spec = ProfileSpec( + name, + offset, + budget, + processor.artifact_fingerprint, + ) + entries.append((spec, processor)) + offset += budget + return cls(entries, presets) + + def preset(self, name: str) -> PresetConfig: + """Resolve one preset or fail with the available names.""" + try: + return self._action_spaces[canonical_preset_name(name)] + except KeyError as error: + raise KeyError( + f"unknown preset {name!r}; available: {sorted(self._action_spaces)}" + ) from error + + def register_action_space( + self, + preset: PresetConfig | Mapping[str, object] | str | Path, + ) -> PresetConfig: + 'Register a validated action-space config, mapping, or YAML file.' + if isinstance(preset, Mapping): + preset = PresetConfig.from_dict(preset) + elif isinstance(preset, (str, Path)): + preset = PresetConfig.from_yaml(preset) + if not isinstance(preset, PresetConfig): + raise TypeError( + "register_action_space expects PresetConfig, a mapping, or a preset YAML path" + ) + missing = {component.space for component in preset.components} - self.profiles.keys() + if missing: + raise ConfigError( + f"action space {preset.name!r} requires missing profiles: {sorted(missing)}" + ) + existing = self._action_spaces.get(preset.name) + if existing is not None and existing != preset: + raise ConfigError( + f"action-space name {preset.name!r} is already registered differently" + ) + self._action_spaces[preset.name] = preset + return preset + + def _segments(self, preset: PresetConfig) -> tuple[_Segment, ...]: + return tuple( + _Segment(component, self.profiles[component.space]) for component in preset.components + ) + + def configure_encoding( + self, + *, + spatial_search: bool = False, + temporal_search: bool = False, + search_window: int = 32, + search_beam: int = 4, + ) -> ActionCodec2Router: + """Apply runtime packing options to all profiles without changing artifacts.""" + from .packing import EncodingSearch + + options = EncodingSearch(spatial_search, temporal_search, search_window, search_beam) + for profile in self.profiles.values(): + serializer = profile.processor.serializer + options.validate_codec(serializer.scheme, serializer.bins) + for profile in self.profiles.values(): + profile.processor.configure_encoding( + spatial_search=spatial_search, + temporal_search=temporal_search, + search_window=search_window, + search_beam=search_beam, + ) + return self + + def encode_batch( + self, + inputs: np.ndarray, + *, + preset: str, + fps: float | None = None, + current_state: np.ndarray | None = None, + previous_first_order: Mapping[str, np.ndarray] | None = None, + ) -> list[list[int]]: + 'Encode one regular-rate ``[B,T,D]`` tensor at ``fps``.' + preset_config = self.preset(preset) + self._validate_boundary_keys(previous_first_order, preset_config) + canonical = preset_config._canonicalize_batch( + inputs, source_hz=fps, current_state=current_state + ) + batch = len(next(iter(canonical.values()))) + component_streams = [] + for segment in self._segments(preset_config): + values = canonical[segment.component.name] + streams = segment.profile.processor.encode_batch( + values, + active_dims=segment.component.active_dims, + previous_first_order=None + if previous_first_order is None + else previous_first_order.get(segment.component.name), + ) + component_streams.append(streams) + steps = next(iter(canonical.values())).shape[1] + grammar = self.grammar(preset=preset, horizon=steps) + kernel = native_kernel("route_interleave_batch") + compiled = grammar._compiled_grammars() + if kernel is not None and compiled is not None: + return kernel( + compiled, + grammar._native_offsets, + grammar.token_order == "time_major", + component_streams, + ) + return [ + grammar.interleave([streams[row] for streams in component_streams]) + for row in range(batch) + ] + + def route_trajectories( + self, + inputs: np.ndarray, + *, + preset: str, + current_state: np.ndarray | None = None, + fps: float | None = None, + previous_first_order: Mapping[str, np.ndarray] | None = None, + ) -> dict[str, list[ActiveTrajectory]]: + 'Expose canonical complete trajectories grouped by physical profile.' + preset_config = self.preset(preset) + self._validate_boundary_keys(previous_first_order, preset_config) + canonical = preset_config.canonicalize(inputs, current_state=current_state, source_hz=fps) + output: dict[str, list[ActiveTrajectory]] = {} + for component in preset_config.components: + trajectories = canonical[component.name] + processor = self.profiles[component.space].processor + previous = ( + None if previous_first_order is None else previous_first_order.get(component.name) + ) + dense = processor._dense_previous_first_order( + previous, component.active_dims, len(trajectories) + ) + rows = ( + [None] * len(trajectories) + if dense is None + else np.take(dense, component.active_dims, axis=1) + ) + output.setdefault(component.space, []).extend( + ActiveTrajectory(t.values, t.active_dims, previous_first_order=p) + for t, p in zip(trajectories, rows, strict=True) + ) + return output + + def _validate_boundary_keys( + self, previous_first_order: Mapping[str, np.ndarray] | None, preset: PresetConfig + ) -> None: + if previous_first_order is None: + previous_first_order = {} + if not isinstance(previous_first_order, Mapping): + raise ValueError( + "previous_first_order must map component names to canonical [B,D_active] boundaries" + ) + unknown = set(previous_first_order) - {c.name for c in preset.components} + if unknown: + raise ValueError(f"unknown previous_first_order component(s): {sorted(unknown)}") + required = { + name: f"(B, {width})" for name, width in self.second_order_boundaries(preset).items() + } + missing = set(required) - previous_first_order.keys() + if missing: + raise ValueError( + "second-order tokenization requires previous_first_order with arrays " + f"{required}; missing {sorted(missing)}. Use canonical {preset.target_hz:g} Hz " + "reconstructed increments. codec.first_order_template(batch_size) explicitly " + "creates zeros; use zeros only if the preceding increment is known to be zero." + ) + + def final_first_order( + self, + streams: Sequence[Sequence[int]], + *, + preset: str, + previous_first_order: Mapping[str, np.ndarray], + executed_steps: int | None = None, + ) -> dict[str, np.ndarray]: + 'Return component ``[B,D_active]`` boundaries at the canonical clock.' + preset_config = self.preset(preset) + if previous_first_order is None: + raise ValueError("final_first_order requires previous_first_order") + self._validate_boundary_keys(previous_first_order, preset_config) + segments = self._segments(preset_config) + _, component_streams = self._decode_streams(streams, preset_config, segments) + output = {} + for index, segment in enumerate(segments): + processor = segment.profile.processor + if not processor.requires_previous_first_order: + continue + output[segment.component.name] = processor.final_first_order( + component_streams[index], + previous_first_order=previous_first_order.get(segment.component.name), + active_dims=segment.component.active_dims, + executed_steps=executed_steps, + ) + return output + + def _split_stream( + self, tokens: Sequence[int], *, preset: PresetConfig, steps: int + ) -> list[list[int]]: + grammar = self.grammar(preset=preset.name, horizon=steps) + kernel = native_kernel("route_split") + compiled = grammar._compiled_grammars() + if kernel is not None and compiled is not None: + checked = [] + for cursor, token in enumerate(tokens): + if isinstance(token, bool) or not isinstance(token, (int, np.integer)): + raise ValueError(f"tokens[{cursor}] must be an integer") + checked.append(int(token)) + return kernel( + compiled, grammar._native_offsets, grammar.token_order == "time_major", checked + ) + state = grammar._initial_state + output = [[] for _ in grammar.segments] + for cursor, raw_token in enumerate(tokens): + if isinstance(raw_token, bool) or not isinstance(raw_token, (int, np.integer)): + raise ValueError(f"tokens[{cursor}] must be an integer") + index = state[0] + if index == len(grammar.segments): + raise ValueError("Action token stream has extra tokens after complete coverage") + segment = grammar.segments[index] + state = grammar._advance_routed_state(state, int(raw_token)) + if state is None: + raise ValueError( + f"Action token stream has invalid coverage for component {segment.component.name!r}; check the preset token_order and constrain generation with codec.grammar(H, fps=...)." + ) + output[index].append(int(raw_token) - segment.profile.spec.token_offset) + if state[0] != len(grammar.segments): + raise ValueError("Incomplete action token stream; discard or regenerate this row") + return output + + def _token_cell_count(self, raw_token: object, *, index: int) -> int: + + if isinstance(raw_token, bool) or not isinstance(raw_token, (int, np.integer)): + raise ValueError(f"tokens[{index}] must be an integer") + token = int(raw_token) + if 0 <= token < self.vocab_size and self._token_cells[token] >= 0: + return int(self._token_cells[token]) + raise ValueError(f"tokens[{index}] is outside the routed profile vocabularies") + + def _decoded_steps(self, tokens: Sequence[int], segments: Sequence[_Segment]) -> int: + + if not tokens: + raise ValueError("token stream must not be empty") + cells_per_step = sum(len(segment.component.active_dims) for segment in segments) + represented_cells = sum( + self._token_cell_count(token, index=index) for index, token in enumerate(tokens) + ) + steps, remainder = divmod(represented_cells, cells_per_step) + if steps < 1 or remainder: + raise ValueError( + "Incomplete action token stream: " + f"{cells_per_step - remainder} more coordinate values are needed to finish a step. " + "Constrain generation with codec.grammar(H, fps=...).next_token_mask(prefix) " + "and check is_complete(tokens) for the intended H before decoding. " + "Use codec.batch_decode(..., errors='return') to isolate invalid rows; " + "do not pad truncated tokens with zeros." + ) + return steps + + def _batch_steps( + self, + streams: Sequence[Sequence[int]], + segments: Sequence[_Segment], + ) -> int: + + if not streams: + raise ValueError("streams must not be empty") + lengths = [self._decoded_steps(stream, segments) for stream in streams] + if len(set(lengths)) != 1: + raise ValueError( + f"all token streams must decode to the same length, got {lengths}; use codec.batch_decode(...) for independent variable-length outputs" + ) + return lengths[0] + + def decode_batch( + self, + streams: Sequence[Sequence[int]], + *, + preset: str, + fps: float | None = None, + current_state: np.ndarray | None = None, + previous_first_order: Mapping[str, np.ndarray] | None = None, + ) -> dict[str, np.ndarray]: + 'Decode rows to deltas, or absolute components with ``current_state``.' + preset_config = self.preset(preset) + self._validate_boundary_keys(previous_first_order, preset_config) + segments = self._segments(preset_config) + internal_steps, component_streams = self._decode_streams(streams, preset_config, segments) + state_array = optional_finite_array( + current_state, shape=(len(streams), preset_config.input_dim) + ) + output_fps = preset_config.source_hz if fps is None else fps + output_steps = resampled_horizon( + internal_steps, + source_hz=preset_config.target_hz, + target_hz=output_fps, + ) + output: dict[str, np.ndarray] = {} + for segment_index, segment in enumerate(segments): + decoded_batch = segment.profile.processor.decode_batch( + component_streams[segment_index], + active_dims=segment.component.active_dims, + previous_first_order=None + if previous_first_order is None + else previous_first_order.get(segment.component.name), + ) + output[segment.component.name] = externalize_batch( + decoded_batch, + segment.component, + source_hz=preset_config.target_hz, + target_hz=output_fps, + target_length=output_steps, + method=preset_config.interpolation, + current_state=state_array, + ) + return output + + def _decode_streams(self, streams, preset, segments): + + kernel = native_kernel("route_decode_batch") + if kernel is not None: + key = next( + (key for key in reversed(tuple(self._grammar_cache)) if key[0] == preset.name), None + ) + grammar = self._grammar_cache.get(key) + if grammar is None: + grammar = self.grammar(preset=preset.name, horizon=1) + compiled = grammar._compiled_grammars() + if compiled is not None: + width = sum(len(segment.component.active_dims) for segment in segments) + return kernel( + compiled, + grammar._native_offsets, + grammar.token_order == "time_major", + streams, + self._token_cells, + width, + ) + steps = self._batch_steps(streams, segments) + splits = [self._split_stream(row, preset=preset, steps=steps) for row in streams] + return steps, [[row[i] for row in splits] for i in range(len(segments))] + + def decode_prefix_batch( + self, + streams, + *, + preset: str, + horizon: int, + steps: int, + fps: float | None = None, + current_state=None, + previous_first_order=None, + ) -> dict[str, np.ndarray]: + 'Decode only fully covered execution frames on the native codec clock.' + config = self.preset(preset) + output_fps = config.source_hz if fps is None else fps + if output_fps != config.target_hz: + raise ValueError("prefix decode requires fps equal to the native codec clock") + grammar = self.grammar(preset=preset, horizon=horizon) + completed = [grammar.complete_prefix(row, steps=steps) for row in streams] + decoded = self.decode_batch( + completed, + preset=preset, + fps=output_fps, + current_state=current_state, + previous_first_order=previous_first_order, + ) + return {name: values[:, :steps] for name, values in decoded.items()} + + def grammar(self, *, preset: str, horizon: int) -> RoutedActionCodec2Grammar: + """Build the global constrained grammar for one preset and target horizon.""" + horizon = _integer(horizon, "horizon", positive=True) + self.preset(preset) + key = (preset, horizon) + grammar = self._grammar_cache.get(key) + if grammar is None: + grammar = RoutedActionCodec2Grammar(self, preset=preset, horizon=horizon) + self._grammar_cache[key] = grammar + return grammar + + @property + def new_action_tokens(self) -> list[str]: + """Stable physical token names, including reserved profile budget slots.""" + return [ + f"" + for name, runtime in self.profiles.items() + for index in range(runtime.spec.token_budget) + ] + + def save_pretrained(self, directory: str | Path) -> list[str]: + """Save one manifest plus isolated physical processor subdirectories.""" + root = Path(directory) + files = [] + for runtime in self.profiles.values(): + files.extend(runtime.processor.save_pretrained(root / "profiles" / runtime.spec.name)) + manifest = { + "model_type": self.model_type, + "config_version": ROUTER_CONFIG_VERSION, + "profiles": [runtime.spec.to_dict() for runtime in self.profiles.values()], + "presets": [preset.to_dict() for preset in self.action_spaces.values()], + } + path = root / ROUTER_CONFIG_NAME + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(yaml.safe_dump(manifest, sort_keys=False), encoding="utf-8") + metadata = save_huggingface_metadata( + root, + model_type=self.model_type, + processor_class=type(self).__name__, + ) + card = save_model_card(root, str(self)) + return [str(path), str(card), *map(str, metadata), *files] + + @classmethod + def from_pretrained( + cls, + pretrained_model_name_or_path: str | Path, + **kwargs: object, + ) -> ActionCodec2Router | ActionCodec2: + 'Load a router, or bind its public processor when given ``action_space``.' + if "action_space" in kwargs: + from ...frontend.actioncodec2 import ActionCodec2 + + return ActionCodec2.from_pretrained(pretrained_model_name_or_path, **kwargs) + root = resolve_pretrained_directory( + pretrained_model_name_or_path, + allow_patterns=ROUTER_ALLOW_PATTERNS, + **kwargs, + ) + specs, presets = cls.read_manifest(root) + profiles = [ + (spec, ActionCodec2Processor.from_pretrained(root / "profiles" / spec.name)) + for spec in specs + ] + return cls(profiles, presets) + + @classmethod + def read_manifest( + cls, directory: str | Path + ) -> tuple[tuple[ProfileSpec, ...], tuple[PresetConfig, ...]]: + "Read one artifact's profile specs and action spaces, loading no arrays." + path = Path(directory) / ROUTER_CONFIG_NAME + payload = _mapping( + yaml.load(path.read_text(encoding="utf-8"), Loader=_UniqueKeyLoader), "router" + ) + _reject_unknown(payload, {"model_type", "config_version", "profiles", "presets"}, "router") + if payload.get("model_type") != ROUTER_MODEL_TYPE: + raise ConfigError(f"router.model_type must be {ROUTER_MODEL_TYPE!r}") + version = payload.get("config_version") + if version not in (3, ROUTER_CONFIG_VERSION): + raise ConfigError( + f"unsupported router config_version {payload.get('config_version')!r}" + ) + raw_profiles = payload.get("profiles") + raw_presets = payload.get("presets") + if not isinstance(raw_profiles, list) or not isinstance(raw_presets, list): + raise ConfigError("router.profiles and router.presets must be lists") + if version == 3: + raw_presets = [ + dict(_mapping(raw, "router.preset"), token_order="time_major") + for raw in raw_presets + ] + elif any("token_order" not in _mapping(raw, "router.preset") for raw in raw_presets): + raise ConfigError("router config_version=4 requires explicit preset.token_order") + return ( + tuple( + ProfileSpec.from_dict(raw, path=f"router.profiles[{index}]") + for index, raw in enumerate(raw_profiles) + ), + tuple( + PresetConfig.from_dict(raw, path=f"router.presets[{index}]") + for index, raw in enumerate(raw_presets) + ), + ) + + @classmethod + def describe_pretrained( + cls, + directory: str | Path, + *, + selected: str | None = None, + action_dim: int | None = None, + ) -> str: + "Explain a saved artifact's layouts without loading primitives or BPE tables." + root = Path(directory) + specs, presets = cls.read_manifest(root) + second_order_dims = { + spec.name: _second_order_dims( + ActionCodec2Config.from_pretrained(root / "profiles" / spec.name) + ) + for spec in specs + } + return format_action_spaces( + {preset.name: preset for preset in presets}, + selected=selected, + action_dim=action_dim, + second_order_boundaries={ + preset.name: _second_order_boundaries(preset, second_order_dims) + for preset in presets + }, + ) + + def eval(self) -> ActionCodec2Router: + """Return ``self`` because all constituent processors are stateless.""" + return self + + def to(self, device: object) -> ActionCodec2Router: + """Return ``self`` because routed processors use CPU NumPy arrays.""" + del device + return self diff --git a/runtime/physical/semantic.py b/runtime/backends/actioncodec2/semantic.py similarity index 64% rename from runtime/physical/semantic.py rename to runtime/backends/actioncodec2/semantic.py index 201edf5dec30d9d62a96389ab6bd86e2c596550e..2af4bbaf950f5784babca61ac5da98e84e8f295c 100644 --- a/runtime/physical/semantic.py +++ b/runtime/backends/actioncodec2/semantic.py @@ -1,4 +1,4 @@ -"Canonical physical preprocessing for routed ActionCodec2 profiles." +"""Canonical physical preprocessing for routed ActionCodec2 profiles.""" from __future__ import annotations @@ -8,11 +8,57 @@ import numpy as np from scipy.interpolate import CubicSpline, PchipInterpolator from scipy.spatial.transform import Rotation, RotationSpline -from ._so3 import euler_xyz_to_quaternion as _euler_xyz_to_quaternion -from ._so3 import multiply_quaternions as _quaternion_multiply -from ._so3 import normalize_quaternion as _normalize_quaternion -from ._so3 import quaternion_to_rotvec as _quaternion_to_rotvec -from ._so3 import rotvec_to_quaternion as _rotvec_to_quaternion +from ._so3 import ( + euler_xyz_to_quaternion as _euler_xyz_to_quaternion, +) +from ._so3 import ( + multiply_quaternions as _quaternion_multiply, +) +from ._so3 import ( + normalize_quaternion as _normalize_quaternion, +) +from ._so3 import ( + quaternion_to_rotvec as _quaternion_to_rotvec, +) +from ._so3 import ( + rotvec_to_quaternion as _rotvec_to_quaternion, +) +from .native_backend import native_kernel + + +def integrate_additive(values: np.ndarray, order: int) -> np.ndarray: + """Integrate along the penultimate (time) axis from a zero boundary.""" + result = np.asarray(values, dtype=np.float32) + kernel = native_kernel("additive_transform") + if kernel is not None: + shape = result.shape + return kernel(result.reshape(-1, *shape[-2:]), order, True).reshape(shape) + for _ in range(order): + result = np.cumsum(result, axis=-2, dtype=np.float32) + return result + + +def difference_additive(values: np.ndarray, order: int) -> np.ndarray: + """Take zero-anchored finite differences along the time axis.""" + result = np.asarray(values, dtype=np.float32) + kernel = native_kernel("additive_transform") + if kernel is not None: + shape = result.shape + return kernel(result.reshape(-1, *shape[-2:]), order, False).reshape(shape) + for _ in range(order): + previous = np.concatenate((np.zeros_like(result[..., :1, :]), result[..., :-1, :]), axis=-2) + result = result - previous + return result + + +def wrap_to_pi(values: np.ndarray) -> np.ndarray: + """Return angles in radians folded into ``(-pi, pi]``.""" + angles = np.asarray(values, dtype=np.float64) + kernel = native_kernel("wrap_angles") + if kernel is not None: + return kernel(angles) + return np.asarray(np.pi - np.mod(np.pi - angles, 2.0 * np.pi), dtype=np.float32) + _INTERPOLATION_METHODS = {"linear", "pchip", "cubic"} @@ -24,10 +70,7 @@ def _validate_rate(value: float, name: str) -> float: return rate -def _quaternion_slerp( - left: np.ndarray, right: np.ndarray, weight: np.ndarray -) -> np.ndarray: - +def _quaternion_slerp(left: np.ndarray, right: np.ndarray, weight: np.ndarray) -> np.ndarray: first = _normalize_quaternion(np.asarray(left, dtype=np.float64)) second = _normalize_quaternion(np.asarray(right, dtype=np.float64)) dot = np.sum(first * second, axis=1) @@ -50,12 +93,8 @@ def _quaternion_slerp( def resampled_horizon(length: int, *, source_hz: float, target_hz: float) -> int: - "Return the target control-step count for a regular source horizon." - if ( - isinstance(length, bool) - or not isinstance(length, (int, np.integer)) - or length < 1 - ): + """Return the target control-step count for a regular source horizon.""" + if isinstance(length, bool) or not isinstance(length, (int, np.integer)) or length < 1: raise ValueError("a trajectory must contain at least one sample") source_rate = _validate_rate(source_hz, "source_hz") target_rate = _validate_rate(target_hz, "target_hz") @@ -85,7 +124,6 @@ def _guarded_natural_cubic( values: np.ndarray, target_time: np.ndarray, ) -> np.ndarray: - sampled = np.asarray( CubicSpline(source_time, values, axis=0, bc_type="natural")(target_time), dtype=np.float64, @@ -93,11 +131,9 @@ def _guarded_natural_cubic( lower = np.min(values, axis=0) upper = np.max(values, axis=0) - tolerance = 1e-9 + 0.05 * (upper - lower) fallback_axes = np.any( - (sampled < lower[None] - tolerance[None]) - | (sampled > upper[None] + tolerance[None]), + (sampled < lower[None] - tolerance[None]) | (sampled > upper[None] + tolerance[None]), axis=0, ) if np.any(fallback_axes): @@ -116,7 +152,7 @@ def resample_uniform( target_length: int | None = None, method: str = "linear", ) -> np.ndarray: - "Resample one regular control-horizon trajectory onto a target clock." + """Resample one regular control-horizon trajectory onto a target clock.""" source_rate = _validate_rate(source_hz, "source_hz") target_rate = _validate_rate(target_hz, "target_hz") array = np.asarray(values, dtype=np.float64) @@ -130,19 +166,32 @@ def resample_uniform( raise ValueError("pose_xyzw values must have shape [T, 7]") if kind == "pose_euler_xyz" and array.shape[1] != 6: raise ValueError("pose_euler_xyz values must have shape [T, 6]") - standard_length = resampled_horizon( - len(array), source_hz=source_rate, target_hz=target_rate - ) + kernel = native_kernel("resample_uniform_batch") + if kernel is not None: + if target_length is not None and ( + isinstance(target_length, bool) + or not isinstance(target_length, (int, np.integer)) + or target_length < 1 + ): + raise ValueError("target_length must be a positive integer") + if kind == "pose_euler_xyz": + array = np.concatenate((array[:, :3], _euler_xyz_to_quaternion(array[:, 3:6])), axis=1) + kind = "pose_xyzw" + return kernel( + array[None], + source_rate, + target_rate, + kind, + -1 if target_length is None else int(target_length), + method, + )[0] + standard_length = resampled_horizon(len(array), source_hz=source_rate, target_hz=target_rate) if source_rate == target_rate and target_length in {None, standard_length}: if kind == "pose_euler_xyz": - array = np.concatenate( - (array[:, :3], _euler_xyz_to_quaternion(array[:, 3:6])), axis=1 - ) + array = np.concatenate((array[:, :3], _euler_xyz_to_quaternion(array[:, 3:6])), axis=1) return np.asarray(array, dtype=np.float32) - target_time = _target_times( - len(array), source_rate, target_rate, target_length=target_length - ) + target_time = _target_times(len(array), source_rate, target_rate, target_length=target_length) source_time = np.arange(len(array), dtype=np.float64) / source_rate interpolation_time = np.minimum(target_time, source_time[-1]) source_position = target_time * source_rate @@ -157,13 +206,9 @@ def resample_uniform( if len(array) == 1: sampled = np.repeat(continuous, len(target_time), axis=0) elif method == "pchip": - sampled = PchipInterpolator(source_time, continuous, axis=0)( - interpolation_time - ) + sampled = PchipInterpolator(source_time, continuous, axis=0)(interpolation_time) elif method == "cubic": - sampled = _guarded_natural_cubic( - source_time, continuous, interpolation_time - ) + sampled = _guarded_natural_cubic(source_time, continuous, interpolation_time) else: sampled = array[left, : continuous.shape[1]] + weight[:, None] * ( array[right, : continuous.shape[1]] - array[left, : continuous.shape[1]] @@ -172,16 +217,12 @@ def resample_uniform( result = sampled else: quaternion = ( - array[:, 3:7] - if kind == "pose_xyzw" - else _euler_xyz_to_quaternion(array[:, 3:6]) + array[:, 3:7] if kind == "pose_xyzw" else _euler_xyz_to_quaternion(array[:, 3:6]) ) if len(array) == 1: rotation = np.repeat(quaternion, len(target_time), axis=0) elif method == "linear": - rotation = _quaternion_slerp( - quaternion[left], quaternion[right], weight - ) + rotation = _quaternion_slerp(quaternion[left], quaternion[right], weight) else: rotation = RotationSpline(source_time, Rotation.from_quat(quaternion))( interpolation_time @@ -195,6 +236,9 @@ def eef_pose_absolute(poses: np.ndarray) -> np.ndarray: values = np.asarray(poses, dtype=np.float64) if values.ndim != 2 or values.shape[1] != 7 or not np.all(np.isfinite(values)): raise ValueError("poses must be a finite [T, 7] array") + kernel = native_kernel("eef_pose_absolute_batch") + if kernel is not None and len(values): + return kernel(values[None])[0] return np.asarray( np.concatenate((values[:, :3], _quaternion_to_rotvec(values[:, 3:7])), axis=1), dtype=np.float32, @@ -215,9 +259,7 @@ def eef_pose_components(poses: np.ndarray, representation: str) -> np.ndarray: rotation = quaternion else: raise ValueError("unsupported EEF rotation representation") - return np.asarray( - np.concatenate((values[:, :3], rotation), axis=1), dtype=np.float32 - ) + return np.asarray(np.concatenate((values[:, :3], rotation), axis=1), dtype=np.float32) def eef_pose_from_components( @@ -225,7 +267,7 @@ def eef_pose_from_components( rotation: np.ndarray, representation: str, ) -> np.ndarray: - "Build canonical ``xyz + xyzw`` poses from an explicit source layout." + """Build canonical ``xyz + xyzw`` poses from an explicit source layout.""" translation = np.asarray(position, dtype=np.float64) orientation = np.asarray(rotation, dtype=np.float64) if translation.ndim != 2 or translation.shape[1] != 3 or len(translation) < 1: @@ -248,15 +290,13 @@ def eef_pose_from_components( raise ValueError("unsupported EEF rotation representation") if not np.all(np.isfinite(orientation)): raise ValueError("position and rotation must be finite") - return np.asarray( - np.concatenate((translation, quaternion), axis=1), dtype=np.float32 - ) + return np.asarray(np.concatenate((translation, quaternion), axis=1), dtype=np.float32) def eef_pose_local_absolute( poses: np.ndarray, *, initial_pose: np.ndarray | None = None ) -> np.ndarray: - "Express measured poses relative to an explicit or inferred initial pose." + """Express measured poses relative to an explicit or inferred initial pose.""" values = np.asarray(poses, dtype=np.float64) if ( values.ndim != 2 @@ -277,19 +317,15 @@ def eef_pose_local_absolute( initial_quaternion = _normalize_quaternion(initial[:, 3:7]) inverse_start = initial_quaternion.copy() inverse_start[:, :3] *= -1.0 - relative = _quaternion_multiply( - np.broadcast_to(inverse_start, quaternion.shape), quaternion - ) + relative = _quaternion_multiply(np.broadcast_to(inverse_start, quaternion.shape), quaternion) return np.asarray( - np.concatenate( - (values[:, :3] - initial[:, :3], _quaternion_to_rotvec(relative)), axis=1 - ), + np.concatenate((values[:, :3] - initial[:, :3], _quaternion_to_rotvec(relative)), axis=1), dtype=np.float32, ) def eef_pose_deltas(poses: np.ndarray) -> np.ndarray: - "Differentiate a local ``xyz + xyzw`` path from zero/identity." + """Differentiate a local ``xyz + xyzw`` path from zero/identity.""" values = np.asarray(poses, dtype=np.float64) if ( values.ndim != 2 @@ -298,6 +334,9 @@ def eef_pose_deltas(poses: np.ndarray) -> np.ndarray: or not np.all(np.isfinite(values)) ): raise ValueError("poses must be a finite non-empty [T, 7] array") + kernel = native_kernel("eef_pose_deltas_batch") + if kernel is not None: + return kernel(values[None])[0] quaternion = _normalize_quaternion(values[:, 3:7]) previous_position = np.concatenate((np.zeros((1, 3)), values[:-1, :3]), axis=0) identity = np.asarray([[0.0, 0.0, 0.0, 1.0]], dtype=np.float64) @@ -307,16 +346,13 @@ def eef_pose_deltas(poses: np.ndarray) -> np.ndarray: increment = _quaternion_multiply(inverse_previous, quaternion) return np.asarray( np.concatenate( - (values[:, :3] - previous_position, _quaternion_to_rotvec(increment)), - axis=1, + (values[:, :3] - previous_position, _quaternion_to_rotvec(increment)), axis=1 ), dtype=np.float32, ) -def eef_pose_from_local_absolute( - poses: np.ndarray, *, initial_pose: np.ndarray -) -> np.ndarray: +def eef_pose_from_local_absolute(poses: np.ndarray, *, initial_pose: np.ndarray) -> np.ndarray: """Attach an external initial pose to a local ``xyz + xyzw`` path.""" values = np.asarray(poses, dtype=np.float64) initial = np.asarray(initial_pose, dtype=np.float64) @@ -343,12 +379,15 @@ def eef_pose_from_local_absolute( def integrate_eef_deltas(deltas: np.ndarray) -> np.ndarray: - "Integrate ``[dx,dy,dz,body-rotvec]`` from a zero/identity pose." + """Integrate ``[dx,dy,dz,body-rotvec]`` from a zero/identity pose.""" values = np.asarray(deltas, dtype=np.float64) if values.ndim != 2 or values.shape[1] != 6 or not np.all(np.isfinite(values)): raise ValueError("deltas must be a finite [T, 6] array") if len(values) < 1: raise ValueError("deltas must contain at least one step") + kernel = native_kernel("integrate_eef_deltas_batch") + if kernel is not None: + return kernel(values[None])[0] translation = np.cumsum(values[:, :3], axis=0) increments = _rotvec_to_quaternion(values[:, 3:6]) orientation = np.empty((len(values), 4), dtype=np.float64) @@ -356,22 +395,52 @@ def integrate_eef_deltas(deltas: np.ndarray) -> np.ndarray: for index, increment in enumerate(increments): current = _quaternion_multiply(current, increment[None]) orientation[index] = current[0] - return np.asarray( - np.concatenate((translation, orientation), axis=1), dtype=np.float32 - ) + return np.asarray(np.concatenate((translation, orientation), axis=1), dtype=np.float32) -def binarize_gripper_actions( +def normalize_gripper_actions( values: np.ndarray, *, - threshold: float, - open_is_high: bool, + closed_value: float, + open_value: float, ) -> np.ndarray: - """Map one controller gripper channel to canonical ``0=closed, 1=open``.""" + """Map one raw controller gripper channel to the canonical open fraction.""" array = np.asarray(values, dtype=np.float32) if array.ndim != 2 or array.shape[1] != 1 or not np.all(np.isfinite(array)): raise ValueError("gripper action must be a finite [T, 1] array") - if not math.isfinite(threshold): - raise ValueError("gripper threshold must be finite") - opened = array >= threshold if open_is_high else array <= threshold - return opened.astype(np.float32) + if not (math.isfinite(closed_value) and math.isfinite(open_value)): + raise ValueError("gripper anchors must be finite") + if closed_value == open_value: + raise ValueError("gripper closed/open anchors must differ") + kernel = native_kernel("gripper_transform") + if kernel is not None: + return kernel(array, "normalize", closed_value, open_value) + fraction = (array - closed_value) / (open_value - closed_value) + return np.clip(fraction, 0.0, 1.0).astype(np.float32) + + +def discretize_gripper_actions( + values: np.ndarray, + *, + mode: str, + threshold: float = 0.8, +) -> np.ndarray: + """Quantize the canonical open fraction for the codec.""" + array = np.asarray(values, dtype=np.float32) + if array.ndim != 2 or array.shape[1] != 1 or not np.all(np.isfinite(array)): + raise ValueError("gripper fraction must be a finite [T, 1] array") + if mode == "binary": + if not math.isfinite(threshold): + raise ValueError("gripper threshold must be finite") + kernel = native_kernel("gripper_transform") + if kernel is not None: + return kernel(array, mode, threshold, 0) + return (array >= threshold).astype(np.float32) + if mode == "eleven": + kernel = native_kernel("gripper_transform") + if kernel is not None: + return kernel(array, mode, threshold, 0) + return (np.rint(array * 10.0) / 10.0).astype(np.float32) + if mode == "twenty": + return (np.rint(array * 20.0) / 20.0).astype(np.float32) + raise ValueError("gripper mode must be 'binary', 'eleven' or 'twenty'") diff --git a/runtime/backends/actioncodec2/setbpe/__init__.py b/runtime/backends/actioncodec2/setbpe/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/runtime/tokenization/setbpe_spatial.py b/runtime/backends/actioncodec2/setbpe/spatial.py similarity index 77% rename from runtime/tokenization/setbpe_spatial.py rename to runtime/backends/actioncodec2/setbpe/spatial.py index f56d9e3549d65dd8da8665842ab7ad82ed75e8a5..93f10d91f15ae8b477bd64f51fba2cd371049fd4 100644 --- a/runtime/tokenization/setbpe_spatial.py +++ b/runtime/backends/actioncodec2/setbpe/spatial.py @@ -8,7 +8,10 @@ from dataclasses import dataclass import numpy as np -from ..common._validation import active_dimensions +from .._validation import active_dimensions +from ..native_backend import native_kernel +from ..configuration import _integer +from ..native_serialization import NativeCacheMixin __all__ = ["SpatialVocabulary", "aggregate_records"] @@ -16,7 +19,7 @@ __all__ = ["SpatialVocabulary", "aggregate_records"] def aggregate_records( codes: np.ndarray, bins: Sequence[int] | None = None ) -> tuple[np.ndarray, np.ndarray]: - "Lossless micro-aggregation of identical quantized actions." + """Lossless micro-aggregation of identical quantized actions.""" values = np.asarray(codes, dtype=np.int64) if values.ndim != 2: raise ValueError("codes must have shape [U, D]") @@ -39,7 +42,7 @@ def aggregate_records( @dataclass -class SpatialVocabulary: +class SpatialVocabulary(NativeCacheMixin): """Atoms, merge rules and the decoder metadata they induce.""" bins: tuple[int, ...] @@ -48,9 +51,7 @@ class SpatialVocabulary: def __post_init__(self) -> None: if not self.bins or any(count < 1 for count in self.bins): raise ValueError("every dimension needs at least one bin") - self.offsets = np.concatenate( - ([0], np.cumsum(np.asarray(self.bins, dtype=np.int64))) - ) + self.offsets = np.concatenate(([0], np.cumsum(np.asarray(self.bins, dtype=np.int64)))) self.atom_count = int(self.offsets[-1]) self.vocab_size = self.atom_count + len(self.merges) dimension = len(self.bins) @@ -62,6 +63,8 @@ class SpatialVocabulary: support[token] = 1 << index expansion[token, index] = value for rank, (left, right) in enumerate(self.merges): + left = _integer(left, "spatial merge left") + right = _integer(right, "spatial merge right") token = self.atom_count + rank if left >= token or right >= token: raise ValueError("a merge rule must reference already-created tokens") @@ -94,20 +97,16 @@ class SpatialVocabulary: *, active_dims: Sequence[int] | None = None, ) -> list[int]: - "Deterministic online Set-BPE encoding (Algorithm 8)." + """Deterministic online Set-BPE encoding (Algorithm 8).""" compact = [int(value) for value in code] if active_dims is None: if len(compact) != self.dimension: - raise ValueError( - f"a dense quantized action must have {self.dimension} slots" - ) + raise ValueError(f"a dense quantized action must have {self.dimension} slots") pairs = enumerate(compact) else: dimensions = active_dimensions(active_dims, self.dimension) if len(dimensions) != len(compact): - raise ValueError( - "active_dims must have one entry per compact coordinate" - ) + raise ValueError("active_dims must have one entry per compact coordinate") pairs = zip(dimensions, compact, strict=True) tokens = set() for index, value in pairs: @@ -119,9 +118,17 @@ class SpatialVocabulary: raise ValueError(f"bin {value} is out of range for dimension {index}") tokens.add(self.atom(index, value)) if not tokens: - raise ValueError( - "a quantized action must contain at least one active coordinate" - ) + raise ValueError("a quantized action must contain at least one active coordinate") + constructor = native_kernel("SetBPE") + if constructor is not None: + codec = getattr(self, "_compiled_spatial", None) + if codec is None: + codec = self._compiled_spatial = constructor(self.bins, 1, self.merges, ()) + dense = np.full((1, 1, self.dimension), -1, dtype=np.int64) + for atom in tokens: + dimension = int(self.anchor[atom]) + dense[0, 0, dimension] = atom - self.offsets[dimension] + return codec.encode_batch(dense)[0] heap: list[tuple[int, int, int, int]] = [] ordered = sorted(tokens) for position, left in enumerate(ordered): @@ -144,7 +151,7 @@ class SpatialVocabulary: return self.serialize(tokens) def serialize(self, tokens: Iterable[int]) -> list[int]: - "Canonical order for autoregressive supervision." + """Canonical order for autoregressive supervision.""" return sorted(tokens, key=lambda token: (int(self.anchor[token]), int(token))) def decode( @@ -154,6 +161,15 @@ class SpatialVocabulary: active_dims: Sequence[int] | None = None, ) -> np.ndarray: """Expand tokens to a dense row, using ``-1`` for absent coordinates.""" + kernel = native_kernel("spatial_expand") + if kernel is not None: + dims = active_dimensions(active_dims, self.dimension) + return kernel( + [int(token) for token in tokens], + self.expansion, + self.support, + sum(1 << d for d in dims), + ) code = np.full(self.dimension, -1, dtype=np.int64) covered = 0 for token in tokens: @@ -171,7 +187,5 @@ class SpatialVocabulary: dimensions = active_dimensions(active_dims, self.dimension) expected = sum(1 << dimension for dimension in dimensions) if covered != expected: - raise ValueError( - "token set does not exactly cover the requested active dimensions" - ) + raise ValueError("token set does not exactly cover the requested active dimensions") return code diff --git a/runtime/tokenization/setbpe_spatial_training.py b/runtime/backends/actioncodec2/setbpe/spatial_training.py similarity index 91% rename from runtime/tokenization/setbpe_spatial_training.py rename to runtime/backends/actioncodec2/setbpe/spatial_training.py index 4607a6abeb72877bf59b6f3383f533d0f58e1369..4022ba6e60cf6459de3b29fca448c09874bd7445 100644 --- a/runtime/tokenization/setbpe_spatial_training.py +++ b/runtime/backends/actioncodec2/setbpe/spatial_training.py @@ -1,4 +1,4 @@ -"Spatial Set-BPE fitting implementations." +'Spatial Set-BPE fitting implementations.' from __future__ import annotations @@ -7,15 +7,13 @@ from collections.abc import Sequence import numpy as np -from ..backend.native_backend import require_native, resolve_backend -from .setbpe_spatial import SpatialVocabulary +from ..native_backend import require_native, resolve_backend +from .spatial import SpatialVocabulary __all__ = ["train_spatial"] class _SparseSpatialTrainer: - - def __init__( self, codes: np.ndarray, @@ -36,9 +34,7 @@ class _SparseSpatialTrainer: if np.any(np.all(self.records < 0, axis=1)): raise ValueError("every record must contain at least one active coordinate") self.count = int(self.records.shape[0]) - self.offsets = np.concatenate( - ([0], np.cumsum(np.asarray(self.bins, dtype=np.int64))) - ) + self.offsets = np.concatenate(([0], np.cumsum(np.asarray(self.bins, dtype=np.int64)))) self.atom_count = int(self.offsets[-1]) self.occurrence: list[np.ndarray] = [] @@ -69,7 +65,6 @@ class _SparseSpatialTrainer: for second in range(first + 1, self.dimension) ) - self._sparse_counts: dict[int, int] | None = None self._sparse_heap: list[tuple[int, int, int]] = [] @@ -161,9 +156,7 @@ class _SparseSpatialTrainer: new = counts.get(key, 0) + delta if new < 0: pair = self._sparse_pair(key) - raise RuntimeError( - f"sparse spatial pair counter became negative for {pair}" - ) + raise RuntimeError(f"sparse spatial pair counter became negative for {pair}") if new: counts[key] = new pair = self._sparse_pair(key) @@ -192,9 +185,7 @@ class _SparseSpatialTrainer: self.statistics["sparse_pair_types_peak"], len(counts) ) if len(heap) > 2 * len(counts) + 65_536: - self._sparse_heap = [ - (-value, *self._sparse_pair(key)) for key, value in counts.items() - ] + self._sparse_heap = [(-value, *self._sparse_pair(key)) for key, value in counts.items()] heapq.heapify(self._sparse_heap) self.statistics["sparse_heap_rebuilds"] += 1 @@ -203,12 +194,8 @@ class _SparseSpatialTrainer: members = self._intersect(self.occurrence[left], self.occurrence[right]) mass = int(self.weights[members].sum()) if members.size else 0 rows = self.member[members] if members.size else self.member[:0].copy() - self.occurrence[left] = np.setdiff1d( - self.occurrence[left], members, assume_unique=True - ) - self.occurrence[right] = np.setdiff1d( - self.occurrence[right], members, assume_unique=True - ) + self.occurrence[left] = np.setdiff1d(self.occurrence[left], members, assume_unique=True) + self.occurrence[right] = np.setdiff1d(self.occurrence[right], members, assume_unique=True) self.frequency[left] -= mass self.frequency[right] -= mass token = self._append_token( @@ -218,7 +205,6 @@ class _SparseSpatialTrainer: ) self._update_sparse_index(left, right, token, rows, members, mass) - if members.size: rows[rows == right] = -1 rows[rows == left] = token @@ -235,7 +221,6 @@ def _train_spatial_python( vocab_size: int, progress: bool = False, ) -> tuple[SpatialVocabulary, dict[str, object]]: - trainer = _SparseSpatialTrainer(codes, weights, bins) if vocab_size < trainer.atom_count: raise ValueError( @@ -258,9 +243,7 @@ def _train_spatial_python( f" merge {step:>5} tokens/action {length / total_weight:.4f}", flush=True, ) - vocabulary = SpatialVocabulary( - tuple(int(value) for value in bins), tuple(trainer.merges) - ) + vocabulary = SpatialVocabulary(tuple(int(value) for value in bins), tuple(trainer.merges)) report = { "records": int(trainer.count), "weight": total_weight, @@ -287,10 +270,8 @@ def train_spatial( progress: bool = False, **kwargs: object, ) -> tuple[SpatialVocabulary, dict[str, object]]: - "Fit spatial Set-BPE, preferring the native kernel when it is built." + 'Fit spatial Set-BPE, preferring the native kernel when it is built.' if resolve_backend(backend) == "python": - - kwargs.pop("threads", None) return _train_spatial_python( codes, weights, bins, vocab_size=vocab_size, progress=progress, **kwargs diff --git a/runtime/tokenization/setbpe_temporal.py b/runtime/backends/actioncodec2/setbpe/temporal.py similarity index 88% rename from runtime/tokenization/setbpe_temporal.py rename to runtime/backends/actioncodec2/setbpe/temporal.py index 604d45282b5706f0842ab74783f98f3b67312acd..4ac5dadc249dde5a1fdf3994c7d155123fffc17d 100644 --- a/runtime/tokenization/setbpe_temporal.py +++ b/runtime/backends/actioncodec2/setbpe/temporal.py @@ -8,8 +8,9 @@ from dataclasses import dataclass import numpy as np -from ..common._validation import active_dimensions -from .setbpe_spatial import SpatialVocabulary +from .._validation import active_dimensions +from ..native_serialization import NativeCacheMixin, decode_native, encode_native +from .spatial import SpatialVocabulary __all__ = ["TemporalVocabulary"] @@ -39,7 +40,7 @@ def _validate_episode(values: np.ndarray, spatial: SpatialVocabulary) -> int: @dataclass -class TemporalVocabulary: +class TemporalVocabulary(NativeCacheMixin): """A spatial vocabulary plus rooted, forward-only temporal merge rules.""" spatial: SpatialVocabulary @@ -49,23 +50,18 @@ class TemporalVocabulary: def __post_init__(self) -> None: if self.lookahead < 1: raise ValueError("lookahead must be positive") - self.patterns: list[Pattern] = [ - ((0, token),) for token in range(self.spatial.vocab_size) - ] + self.patterns: list[Pattern] = [((0, token),) for token in range(self.spatial.vocab_size)] self.spans: list[int] = [1] * self.spatial.vocab_size self.root: list[int] = list(range(self.spatial.vocab_size)) self.support_masks: list[tuple[int, ...]] = [ - (int(self.spatial.support[token]),) - for token in range(self.spatial.vocab_size) + (int(self.spatial.support[token]),) for token in range(self.spatial.vocab_size) ] self._rules: dict[Rule, tuple[int, int]] = {} for rank, rule in enumerate(self.merges): left, right, offset = (int(value) for value in rule) child = self.spatial.vocab_size + rank if left >= child or right >= child or left < 0 or right < 0: - raise ValueError( - "a temporal merge must reference already-created tokens" - ) + raise ValueError("a temporal merge must reference already-created tokens") pattern, masks = _merge_pattern( self.patterns[left], self.patterns[right], @@ -90,6 +86,9 @@ class TemporalVocabulary: """Encode a dense episode; ``-1`` slots are semantically absent.""" values = np.asarray(codes, dtype=np.int64) _validate_episode(values, self.spatial) + result = encode_native(self, values[None]) + if result is not None: + return result[0] at: list[dict[int, int]] = [dict() for _ in range(values.shape[0])] tokens: list[int] = [] @@ -169,9 +168,7 @@ class TemporalVocabulary: for anchor, instances in enumerate(at): for token, instance in instances.items(): if active[instance]: - ordered.append( - (anchor, int(self.spatial.anchor[self.root[token]]), token) - ) + ordered.append((anchor, int(self.spatial.anchor[self.root[token]]), token)) ordered.sort() return [token for _, _, token in ordered] @@ -184,6 +181,10 @@ class TemporalVocabulary: """Decode ids using the route's requested active-dimension support.""" if not stream: return np.empty((0, self.spatial.dimension), dtype=np.int64) + dims = active_dimensions(active_dims, self.spatial.dimension) + result = decode_native(self, [[int(token) for token in stream]], dims) + if result is not None: + return result[0] full = _active_support(active_dims, self.spatial.dimension) coverage: list[int] = [0] spatial_tokens: list[list[int]] = [[]] @@ -213,19 +214,14 @@ class TemporalVocabulary: spatial_tokens.append([]) support = int(self.spatial.support[spatial_token]) if coverage[step] & support: - raise ValueError( - "temporal stream contains overlapping spatial support" - ) + raise ValueError("temporal stream contains overlapping spatial support") coverage[step] |= support spatial_tokens[step].append(spatial_token) if any(mask != full for mask in coverage): raise ValueError("temporal stream ended with an incomplete control step") return np.stack( - [ - self.spatial.decode(tokens, active_dims=active_dims) - for tokens in spatial_tokens - ] + [self.spatial.decode(tokens, active_dims=active_dims) for tokens in spatial_tokens] ) @@ -252,7 +248,5 @@ def _merge_pattern( masks[time] |= support roots += int(time == 0) if roots != 1: - raise ValueError( - "a rooted temporal token must have exactly one time-zero spatial token" - ) + raise ValueError("a rooted temporal token must have exactly one time-zero spatial token") return pattern, tuple(masks) diff --git a/runtime/tokenization/setbpe_temporal_training.py b/runtime/backends/actioncodec2/setbpe/temporal_training.py similarity index 89% rename from runtime/tokenization/setbpe_temporal_training.py rename to runtime/backends/actioncodec2/setbpe/temporal_training.py index 2b2965674f22bbc3e5243b7b7113364d9df5ce61..48afbd7faafd5b8bd033ecbcbfd9124aa0a8c00d 100644 --- a/runtime/tokenization/setbpe_temporal_training.py +++ b/runtime/backends/actioncodec2/setbpe/temporal_training.py @@ -1,4 +1,4 @@ -"Temporal Set-BPE fitting implementations." +'Temporal Set-BPE fitting implementations.' from __future__ import annotations @@ -9,15 +9,9 @@ from collections.abc import Iterable, Iterator, Sequence import numpy as np -from ..backend.native_backend import require_native, resolve_backend -from .setbpe_spatial import SpatialVocabulary -from .setbpe_temporal import ( - Pattern, - Rule, - TemporalVocabulary, - _merge_pattern, - _validate_episode, -) +from ..native_backend import require_native, resolve_backend +from .spatial import SpatialVocabulary +from .temporal import Pattern, Rule, TemporalVocabulary, _merge_pattern, _validate_episode __all__ = ["train_temporal"] @@ -37,17 +31,13 @@ class _SparseTemporalTrainer: self.spatial = spatial self.lookahead = lookahead self.max_vocab_size = max_vocab_size - self.patterns: list[Pattern] = [ - ((0, token),) for token in range(spatial.vocab_size) - ] + self.patterns: list[Pattern] = [((0, token),) for token in range(spatial.vocab_size)] self.spans: list[int] = [1] * spatial.vocab_size self.masks: list[tuple[int, ...]] = [ (int(spatial.support[token]),) for token in range(spatial.vocab_size) ] self._mask_table = np.zeros((max_vocab_size, lookahead), dtype=np.uint64) - self._mask_table[: spatial.vocab_size, 0] = spatial.support.astype( - np.uint64, copy=False - ) + self._mask_table[: spatial.vocab_size, 0] = spatial.support.astype(np.uint64, copy=False) self.merges: list[Rule] = [] self.tokens = array("I") self.anchors = array("I") @@ -56,9 +46,7 @@ class _SparseTemporalTrainer: self.member = np.full((total_anchors, spatial.dimension), -1, dtype=np.int32) self.occupied = np.zeros(total_anchors, dtype=np.uint64) self._slot_mask = (1 << spatial.dimension) - 1 - self.occurrences: list[dict[int, int]] = [ - dict() for _ in range(spatial.vocab_size) - ] + self.occurrences: list[dict[int, int]] = [dict() for _ in range(spatial.vocab_size)] self.episode_count = len(episodes) self.action_count = sum(len(episode) for episode in episodes) self.initial_count = 0 @@ -66,9 +54,7 @@ class _SparseTemporalTrainer: self.self_versions: dict[int, int] = {} self.heap: list[tuple[int, int, int, int, int, bool]] = [] self.self_cache: dict[int, tuple[int, list[tuple[int, int]]]] = {} - self._legal_table = np.zeros( - (lookahead, max_vocab_size, max_vocab_size), dtype=np.uint8 - ) + self._legal_table = np.zeros((lookahead, max_vocab_size, max_vocab_size), dtype=np.uint8) for offset in range(1, lookahead): self._legal_table[offset, : spatial.vocab_size, : spatial.vocab_size] = 2 self.statistics = Counter() @@ -125,9 +111,7 @@ class _SparseTemporalTrainer: for raw_key in np.flatnonzero(dense_counts): pair, offset = divmod(int(raw_key), self.lookahead) left, right = divmod(pair, base_vocab) - packed_key = ( - left * self.max_vocab_size + right - ) * self.lookahead + offset + packed_key = (left * self.max_vocab_size + right) * self.lookahead + offset initial_counts[packed_key] = int(dense_counts[raw_key]) return initial_counts return self._initial_pair_counts_sparse() @@ -229,11 +213,7 @@ class _SparseTemporalTrainer: consumed: set[int] = set() for anchor in sorted(left_occurrences): target = anchor + offset - if ( - anchor in consumed - or target in consumed - or target not in right_occurrences - ): + if anchor in consumed or target in consumed or target not in right_occurrences: continue selected.append((left_occurrences[anchor], right_occurrences[target])) consumed.add(anchor) @@ -272,9 +252,7 @@ class _SparseTemporalTrainer: matches = self._select(key) gain = -negative if len(matches) != gain: - raise RuntimeError( - "sparse temporal counter disagrees with exact matching" - ) + raise RuntimeError("sparse temporal counter disagrees with exact matching") return key, matches return None @@ -302,14 +280,10 @@ class _SparseTemporalTrainer: if values.size: counts = np.bincount(values, minlength=width) neighbors = np.flatnonzero(counts) - neighbors = neighbors[ - self._legal_table[offset, token, neighbors] == 2 - ] + neighbors = neighbors[self._legal_table[offset, token, neighbors] == 2] for raw_neighbor in neighbors: neighbor = int(raw_neighbor) - packed_key = ( - token * vocab_width + neighbor - ) * lookahead + offset + packed_key = (token * vocab_width + neighbor) * lookahead + offset deltas[packed_key] += multiplier * int(counts[neighbor]) past_anchors = anchors[anchors >= offset] - offset if past_anchors.size: @@ -318,14 +292,10 @@ class _SparseTemporalTrainer: if values.size: counts = np.bincount(values, minlength=width) neighbors = np.flatnonzero(counts) - neighbors = neighbors[ - self._legal_table[offset, neighbors, token] == 2 - ] + neighbors = neighbors[self._legal_table[offset, neighbors, token] == 2] for raw_neighbor in neighbors: neighbor = int(raw_neighbor) - packed_key = ( - neighbor * vocab_width + token - ) * lookahead + offset + packed_key = (neighbor * vocab_width + token) * lookahead + offset deltas[packed_key] += multiplier * int(counts[neighbor]) def _correct_internal_edges( @@ -337,9 +307,7 @@ class _SparseTemporalTrainer: by_anchor: dict[int, list[int]] = {} for instance in instances: - by_anchor.setdefault(self.anchors[instance], []).append( - self.tokens[instance] - ) + by_anchor.setdefault(self.anchors[instance], []).append(self.tokens[instance]) vocab_width = self.max_vocab_size lookahead = self.lookahead for anchor, left_tokens in by_anchor.items(): @@ -350,9 +318,7 @@ class _SparseTemporalTrainer: for left in left_tokens: for right in right_tokens: if self._legal_table[offset, left, right] == 2: - packed_key = ( - left * vocab_width + right - ) * lookahead + offset + packed_key = (left * vocab_width + right) * lookahead + offset deltas[packed_key] += correction def _apply_deltas(self, deltas: Counter[int], selected: Rule) -> None: @@ -363,9 +329,7 @@ class _SparseTemporalTrainer: updates = 0 vocab_width = self.max_vocab_size lookahead = self.lookahead - selected_key = (selected[0] * vocab_width + selected[1]) * lookahead + selected[ - 2 - ] + selected_key = (selected[0] * vocab_width + selected[1]) * lookahead + selected[2] for packed_key, delta in deltas.items(): previous = counts.get(packed_key, 0) count = previous + delta @@ -422,14 +386,11 @@ class _SparseTemporalTrainer: anchor = self.anchors[instance] self.member[anchor, self.slots[instance]] = -1 self._active_count -= 1 - self.occupied[anchor] = int(self.occupied[anchor]) & ~( - 1 << self.slots[instance] - ) + self.occupied[anchor] = int(self.occupied[anchor]) & ~(1 << self.slots[instance]) del self.occurrences[token][anchor] children = [ - self._new_instance(child, self.anchors[left_instance]) - for left_instance, _ in matches + self._new_instance(child, self.anchors[left_instance]) for left_instance, _ in matches ] self._accumulate_incident(children, 1, deltas) self._correct_internal_edges(children, -1, deltas) @@ -538,9 +499,7 @@ def _flatten_instances_native( np.ascontiguousarray(merges), int(threads), ) - return np.asarray(tokens, dtype=np.int32), np.asarray( - anchors, dtype=np.int64 - ) + return np.asarray(tokens, dtype=np.int32), np.asarray(anchors, dtype=np.int64) for episode in episodes: length = len(episode) @@ -574,18 +533,14 @@ def _flatten_cell_corpus( def generate() -> Iterator[tuple[np.ndarray, np.ndarray]]: base = 0 - for chunk_index, (codes, offsets) in enumerate( - zip(chunks, offsets_by_chunk, strict=True) - ): + for chunk_index, (codes, offsets) in enumerate(zip(chunks, offsets_by_chunk, strict=True)): if codes is None: raise RuntimeError("cell corpus chunk has already been consumed") lengths = np.diff(offsets) row_anchors = ( base + np.arange(len(codes), dtype=np.int64) - + np.repeat( - np.arange(len(lengths), dtype=np.int64) * lookahead, lengths - ) + + np.repeat(np.arange(len(lengths), dtype=np.int64) * lookahead, lengths) ) tokens, anchors = require_native().spatial_encode_instances( np.ascontiguousarray(codes), @@ -595,10 +550,7 @@ def _flatten_cell_corpus( int(threads), ) episodes.release_chunk(chunk_index) - yield ( - np.asarray(tokens, dtype=np.int32), - np.asarray(anchors, dtype=np.int64), - ) + yield np.asarray(tokens, dtype=np.int32), np.asarray(anchors, dtype=np.int64) base += len(codes) + len(lengths) * lookahead return generate(), total_anchors, actions @@ -614,7 +566,7 @@ def train_temporal( progress: bool = False, threads: int = 0, ) -> tuple[TemporalVocabulary, dict[str, object]]: - "Fit rooted temporal Set-BPE on top of a frozen spatial vocabulary." + 'Fit rooted temporal Set-BPE on top of a frozen spatial vocabulary.' prepared = _prepare_episodes(episodes, spatial) if resolve_backend(backend) == "python": return _train_temporal_python( @@ -640,9 +592,7 @@ def train_temporal( int(threads), ) vocabulary = TemporalVocabulary( - spatial, - int(lookahead), - tuple(tuple(int(value) for value in rule) for rule in merges), + spatial, int(lookahead), tuple(tuple(int(value) for value in rule) for rule in merges) ) payload = dict(report) payload["episodes"] = episode_count diff --git a/runtime/backends/actioncodec2/sparse/__init__.py b/runtime/backends/actioncodec2/sparse/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0e6996ecc28b96a414a9af5ae06e99c07c6b21d3 --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/__init__.py @@ -0,0 +1,21 @@ +"""ActionCodec2Sparse: ActionCodec2 physics with a zero-free spatio-temporal Set-BPE token layer.""" + +from .fitting import SparseProfileTrainer, sparse_profile_config +from .grammar import SparseGrammar +from .layout import SparseLayout +from .processor import ActionCodec2SparseProcessor +from .routing import ActionCodec2SparseRouter, RoutedSparseGrammar +from .training import fit_sparse_vocabulary +from .vocabulary import SparseVocabulary + +__all__ = [ + "ActionCodec2SparseProcessor", + "ActionCodec2SparseRouter", + "RoutedSparseGrammar", + "SparseGrammar", + "SparseLayout", + "SparseProfileTrainer", + "SparseVocabulary", + "fit_sparse_vocabulary", + "sparse_profile_config", +] diff --git a/runtime/backends/actioncodec2/sparse/fitting.py b/runtime/backends/actioncodec2/sparse/fitting.py new file mode 100644 index 0000000000000000000000000000000000000000..a8e4fe0cd2531f1864d3acc98e373c4f24c7fa5f --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/fitting.py @@ -0,0 +1,126 @@ +"""Profile-level ActionCodec2Sparse fitting and default profile derivation.""" + +from __future__ import annotations + +import time +from collections.abc import Iterable, Sequence + +import numpy as np + +from ..configuration import ActionCodec2Config, ConfigError +from ..physical_codec import PhysicalCodec +from ..primitives import PrimitiveStore +from ..training import _quantize_trajectories, build_primitives +from ..trajectory import TrajectoryLike +from .layout import SparseLayout, training_chunks +from .processor import ActionCodec2SparseProcessor +from .training import fit_sparse_vocabulary + +DEFAULT_VOCAB_SIZE = 4096 +DEFAULT_CHUNK_HORIZON = 32 +DEFAULT_STATIC_RUN_CAP = 8 + + +def sparse_profile_config( + config: ActionCodec2Config, + *, + vocab_size: int = DEFAULT_VOCAB_SIZE, + chunk_horizon: int = DEFAULT_CHUNK_HORIZON, + static_run_cap: int = DEFAULT_STATIC_RUN_CAP, +) -> ActionCodec2Config: + """Derive an ActionCodec2Sparse profile from a first- or second-order ActionCodec2 profile.""" + if config.train is None: + raise ConfigError("a sparse profile is derived from a config with a train section") + payload = config.to_dict() + payload["set_bpe"]["scheme"] = "sparse_set_bpe" + for component in payload["physical"]["components"].values(): + if component["space"] == "so3" and component["primitive_order"] == 1: + component["primitive_selection"] = "momentum_lazy" + layout = SparseLayout.from_config(config, build_primitives(config)) + payload["train"]["bpe"] = { + "spatial_vocab_size": sum(layout.sparse_bins), + "vocab_size": int(vocab_size), + } + payload["train"]["sparse"] = { + "chunk_horizon": int(chunk_horizon), + "static_run_cap": int(static_run_cap), + } + return ActionCodec2Config.from_dict(payload) + + +class SparseProfileTrainer: + """Fit one ActionCodec2Sparse profile on complete canonical trajectories.""" + + def __init__(self, config: ActionCodec2Config) -> None: + if config.set_bpe.scheme != "sparse_set_bpe" or config.train is None: + raise ConfigError("SparseProfileTrainer needs a sparse_set_bpe config with train") + self.config = config + + def fit( + self, + trajectories: Iterable[TrajectoryLike], + *, + backend: str = "auto", + threads: int = 0, + batch_size: int = 256, + progress: bool = False, + max_cell_bytes: int | None = None, + ) -> tuple[ActionCodec2SparseProcessor, dict]: + """Quantize then fit; see :meth:`fit_cells` for the token-layer stage.""" + started = time.perf_counter() + primitives = build_primitives(self.config) + cells, actions, active_values, arities = _quantize_trajectories( + trajectories, + PhysicalCodec(self.config, primitives), + batch_size=batch_size, + max_cell_bytes=max_cell_bytes, + ) + quantized = time.perf_counter() + processor, report = self.fit_cells( + cells, primitives=primitives, backend=backend, threads=threads, progress=progress + ) + report.update( + trajectories=len(cells), + actions=actions, + active_values=active_values, + trajectory_arities={str(k): v for k, v in arities.items()}, + ) + report["seconds"]["quantize"] = quantized - started + return processor, report + + def fit_cells( + self, + cells: Sequence[np.ndarray], + *, + primitives: PrimitiveStore | None = None, + backend: str = "auto", + threads: int = 0, + progress: bool = False, + ) -> tuple[ActionCodec2SparseProcessor, dict]: + """Fit the token layer on quantized cell trajectories ``[(T_i, D)]`` (``-1`` inactive).""" + config = self.config + primitives = build_primitives(config) if primitives is None else primitives + layout = SparseLayout.from_config(config, primitives) + options = config.train.sparse + chunks = training_chunks( + cells, layout, horizon=options.chunk_horizon, static_run_cap=options.static_run_cap + ) + vocabulary, report = fit_sparse_vocabulary( + layout, + chunks, + spatial_vocab_size=config.train.bpe.spatial_vocab_size, + vocab_size=config.train.bpe.vocab_size, + lookahead=config.set_bpe.lookahead, + backend=backend, + threads=threads, + progress=progress, + ) + report["corpus"] = { + "trajectories": len(cells), + "source_frames": int(sum(len(c) for c in cells)), + "training_frames": report["frames"], + "chunk_horizon": options.chunk_horizon, + "static_run_cap": options.static_run_cap, + } + report["tokenization_scheme"] = "sparse_set_bpe" + return ActionCodec2SparseProcessor(config, primitives, vocabulary), report diff --git a/runtime/backends/actioncodec2/sparse/grammar.py b/runtime/backends/actioncodec2/sparse/grammar.py new file mode 100644 index 0000000000000000000000000000000000000000..27c28f6487b80fbccc9393be7f1d9cf339ee8237 --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/grammar.py @@ -0,0 +1,83 @@ +"""Prefix grammar for generating one ActionCodec2Sparse chunk.""" + +from __future__ import annotations + +from collections.abc import Sequence + +import numpy as np + +from .vocabulary import SparseVocabulary + + +SparseState = tuple[int, tuple[int, ...]] + + +class SparseGrammar: + """Legal next tokens of one ``horizon``-frame chunk over the active slots.""" + + def __init__(self, vocabulary: SparseVocabulary, horizon: int, active: Sequence[bool]): + if isinstance(horizon, bool) or not isinstance(horizon, int) or horizon < 1: + raise ValueError("horizon must be a positive integer") + layout, tables = vocabulary.layout, vocabulary.tables + self.horizon, self.lookahead = horizon, vocabulary.lookahead + self.vocab_size = vocabulary.vocab_size + self.masks = np.zeros((len(tables), self.lookahead), dtype=np.int64) + for token, masks in enumerate(tables.masks): + self.masks[token, : len(masks)] = masks + self.e_bit = 1 << layout.e_dim + allowed = self.e_bit | sum(1 << d for d, flag in enumerate(active) if flag) + self.in_scope = np.all((self.masks & ~allowed) == 0, axis=1) + self.span = np.asarray(tables.span, dtype=np.int64) + self.holds_e = (self.masks & self.e_bit) != 0 + self.closes_first = self.holds_e[:, 0] + self.absolute = sum( + 1 << d for d, zero in enumerate(layout.zero) if zero is None and active[d] + ) + + def initial(self) -> SparseState: + return 0, (0,) * (self.horizon + self.lookahead) + + def front(self, state: SparseState) -> int: + return state[0] + + def mask(self, state: SparseState) -> np.ndarray: + """Boolean ``(V,)`` mask of tokens legal after ``state``.""" + front, cover = state + if front >= self.horizon: + return np.zeros(len(self.masks), dtype=bool) + window = np.asarray(cover[front : front + self.lookahead], dtype=np.int64) + legal = self.in_scope & (front + self.span <= self.horizon) + legal &= np.all((self.masks & window[None, :]) == 0, axis=1) + closed = (window & self.e_bit) != 0 + legal &= ~np.any((self.masks != 0) & closed[None, :], axis=1) + last = self.horizon - 1 - front + if last < self.lookahead: + legal &= ~self.holds_e[:, last] + if front == 0 and (cover[0] & self.absolute) != self.absolute: + stated = (cover[0] | self.masks[:, 0]) & self.absolute + legal &= ~self.closes_first | (stated == self.absolute) + return legal + + def advance(self, state: SparseState, token: int) -> SparseState | None: + """State after ``token``, or ``None`` when it is illegal.""" + if not 0 <= token < len(self.masks) or not self.mask(state)[token]: + return None + front, cover = state + updated = list(cover) + for offset in range(self.lookahead): + updated[front + offset] |= int(self.masks[token, offset]) + while front < self.horizon and updated[front] & self.e_bit: + front += 1 + return front, tuple(updated) + + def is_complete(self, state: SparseState) -> bool: + """Whether the chunk may end here (every active absolute slot stated).""" + return (state[1][0] & self.absolute) == self.absolute + + def accepts(self, tokens: Sequence[int]) -> bool: + state = self.initial() + for token in tokens: + state = self.advance(state, int(token)) + if state is None: + return False + return self.is_complete(state) diff --git a/runtime/backends/actioncodec2/sparse/layout.py b/runtime/backends/actioncodec2/sparse/layout.py new file mode 100644 index 0000000000000000000000000000000000000000..58f0c8440e467dd31347268187ad40a1bf4b1019 --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/layout.py @@ -0,0 +1,199 @@ +"""Dense primitive cells to zero-free sparse frames, and sparse training corpora.""" + +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass + +import numpy as np + +from ..configuration import ActionCodec2Config, ConfigError, _integer +from ..primitives import PrimitiveStore + + +@dataclass(frozen=True) +class SparseLayout: + """Maps dense physical cells to zero-free sparse atoms.""" + + bins: tuple[int, ...] + zero: tuple[int | None, ...] + + def __post_init__(self) -> None: + if not self.bins or len(self.bins) != len(self.zero): + raise ValueError("bins and zero must have one entry per slot") + if len(self.bins) > 15: + raise ValueError("sparse frames support at most 15 dense slots") + for count, zero in zip(self.bins, self.zero, strict=True): + _integer(count, "bin count", positive=True) + if zero is not None: + _integer(zero, "zero index") + if count < 1 or (zero is not None and not 0 <= zero < count): + raise ValueError("every slot needs a bin and an in-range zero index") + if zero is not None and count < 2: + raise ValueError("a motion slot needs at least one nonzero primitive") + + @classmethod + def from_config(cls, config: ActionCodec2Config, primitives: PrimitiveStore) -> SparseLayout: + """Motion slots (order 1 or 2) keep their exact zero primitive; order 0 is change-coded.""" + zero: list[int | None] = [None] * len(primitives.bins) + for component in config.physical.components.values(): + if component.primitive_order == 0: + continue + for dimension in component.dims: + axis = np.asarray(primitives.values[dimension]) + matches = np.flatnonzero(axis == 0) + if not len(matches): + raise ConfigError(f"dimension {dimension} has no exact zero primitive") + zero[dimension] = int(matches[0]) + return cls(tuple(int(b) for b in primitives.bins), tuple(zero)) + + @property + def dims(self) -> int: + return len(self.bins) + + @property + def e_dim(self) -> int: + """Sparse slot index of the end-of-frame atom.""" + return len(self.bins) + + @property + def sparse_bins(self) -> tuple[int, ...]: + """Motion slots drop their zero primitive; ``E`` has exactly one value.""" + return tuple(b - (z is not None) for b, z in zip(self.bins, self.zero, strict=True)) + (1,) + + @property + def native_zero(self) -> list[int]: + return [-1 if z is None else int(z) for z in self.zero] + + def sparsify(self, cells: np.ndarray) -> np.ndarray: + """Dense chunk ``(T, D)`` to sparse frames ``(T, D + 1)``.""" + cells = np.asarray(cells, dtype=np.int64) + if cells.ndim != 2 or cells.shape[1] != self.dims or not len(cells): + raise ValueError(f"cells must have shape (T, {self.dims}) with T >= 1") + if np.any(cells >= np.asarray(self.bins)): + raise ValueError("cell outside the primitive range") + out = np.full((len(cells), self.dims + 1), -1, dtype=np.int64) + for d, z in enumerate(self.zero): + column = cells[:, d] + if np.any((column >= 0) != (column[0] >= 0)): + raise ValueError("a slot must be active for the whole chunk or not at all") + if column[0] < 0: + continue + if z is None: + changed = np.concatenate(([True], column[1:] != column[:-1])) + out[changed, d] = column[changed] + else: + moving = column != z + out[moving, d] = column[moving] - (column[moving] > z) + content = np.flatnonzero(np.any(out[:, : self.dims] >= 0, axis=1)) + if len(content): + out[: content[-1], self.dims] = 0 + return out + + def densify(self, sparse: np.ndarray, active: Sequence[bool]) -> np.ndarray: + """Inverse of :meth:`sparsify` given which dense slots are active.""" + sparse = np.asarray(sparse, dtype=np.int64) + out = np.full((len(sparse), self.dims), -1, dtype=np.int64) + for d, z in enumerate(self.zero): + if not active[d]: + continue + column = sparse[:, d] + if z is None: + if column[0] < 0: + raise ValueError("an absolute slot must be stated on frame 0") + index = np.maximum.accumulate(np.where(column >= 0, np.arange(len(column)), 0)) + out[:, d] = column[index] + else: + out[:, d] = np.where(column < 0, z, column + (column >= z)) + return out + + +def sparsify_chunks( + layout: SparseLayout, chunks: Sequence[np.ndarray] +) -> tuple[np.ndarray, np.ndarray]: + """Vectorized :meth:`SparseLayout.sparsify` over many dense chunks ``[(T_i, D)]``.""" + lengths = np.asarray([len(c) for c in chunks], dtype=np.int64) + if not len(lengths) or np.any(lengths < 1): + raise ValueError("chunks must be non-empty") + starts = np.concatenate(([0], np.cumsum(lengths))) + arrays = [np.asarray(c) for c in chunks] + for values in arrays: + if values.ndim != 2 or values.shape[1] != layout.dims or values.dtype.kind not in "iu": + raise ValueError("training cells must be integer matrices matching the sparse layout") + if np.any(values < -1) or np.any(values >= np.asarray(layout.bins)): + raise ValueError("cell outside the primitive range") + if np.any((values >= 0) != (values[0] >= 0)): + raise ValueError("a slot must be active for the whole chunk or not at all") + dtype = np.int16 if max(layout.bins) <= np.iinfo(np.int16).max else np.int32 + cells = np.concatenate(arrays, dtype=dtype) + if getattr(layout, "dense", False): + out = np.full((len(cells), layout.dims + 1), -1, dtype=dtype) + out[:, : layout.dims] = cells + out[:, layout.dims] = 0 + out[starts[1:] - 1, layout.dims] = -1 + return out, starts + chunk = np.repeat(np.arange(len(lengths)), lengths) + first = np.zeros(len(cells), dtype=bool) + first[starts[:-1]] = True + out = np.full((len(cells), layout.dims + 1), -1, dtype=dtype) + for d, z in enumerate(layout.zero): + column = cells[:, d] + active = column >= 0 + if z is None: + changed = active & (first | (column != np.roll(column, 1))) + out[changed, d] = column[changed] + else: + moving = active & (column != z) + out[moving, d] = column[moving] - (column[moving] > z) + local = np.arange(len(cells)) - starts[chunk] + content = np.any(out[:, : layout.dims] >= 0, axis=1) + last = np.maximum.reduceat(np.where(content, local, -1), starts[:-1]) + out[local < last[chunk], layout.dims] = 0 + return out, starts + + +def static_frames(cells: np.ndarray, layout: SparseLayout) -> np.ndarray: + """Frames whose motion cells are all zero and whose absolute slots repeat the last frame.""" + moving = np.zeros(len(cells), dtype=bool) + for d, zero in enumerate(layout.zero): + column = cells[:, d] + if column[0] < 0: + continue + if zero is None: + moving[1:] |= column[1:] != column[:-1] + else: + moving |= column != zero + return ~moving + + +def compress_static(cells: np.ndarray, layout: SparseLayout, run_cap: int) -> np.ndarray: + """Drop leading/trailing static frames and cap interior static runs at ``run_cap``.""" + static = static_frames(cells, layout) + if static.all(): + return cells[:1] + keep = np.zeros(len(cells), dtype=bool) + first, last = int(np.argmax(~static)), len(cells) - int(np.argmax(~static[::-1])) + keep[first:last] = True + index = np.arange(len(cells)) + run_start = np.maximum.accumulate(np.where(~static, index + 1, 0)) + keep &= ~static | (index - run_start < run_cap) + return cells[keep] + + +def training_chunks( + trajectories: Sequence[np.ndarray], + layout: SparseLayout, + *, + horizon: int, + static_run_cap: int, + dtype: np.dtype | type = np.int64, +) -> list[np.ndarray]: + """Static-compressed cell trajectories cut into aligned ``horizon`` chunks.""" + out = [] + for raw in trajectories: + cells = compress_static(np.asarray(raw), layout, static_run_cap) + for start in range(0, len(cells), horizon): + piece = cells[start : start + horizon] + if len(piece) >= 2 or start == 0: + out.append(np.asarray(piece, dtype=dtype)) + return out diff --git a/runtime/backends/actioncodec2/sparse/processor.py b/runtime/backends/actioncodec2/sparse/processor.py new file mode 100644 index 0000000000000000000000000000000000000000..4120318eb5b8b88d58950042963c4623443cd9db --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/processor.py @@ -0,0 +1,224 @@ +"""One ActionCodec2Sparse physical profile: unchanged physical stage plus sparse token layer.""" + +from __future__ import annotations + +import hashlib +import json +from collections.abc import Sequence +from numbers import Integral +from pathlib import Path + +import numpy as np + +from .._validation import active_dimensions +from ..cache import BoundedCache +from ..configuration import CONFIG_NAME, ActionCodec2Config, ConfigError +from ..hf import save_huggingface_metadata +from ..physical_codec import PhysicalCodec +from ..primitives import PRIMITIVES_NAME, PrimitiveStore +from .grammar import SparseGrammar +from .layout import SparseLayout +from .vocabulary import SparseVocabulary + +PROFILE_PROCESSOR_CLASS = "ActionCodec2SparseProcessor" + + +class ActionCodec2SparseProcessor: + """Fitted sparse profile over canonical first- or second-order profile actions.""" + + def __init__( + self, + config: ActionCodec2Config, + primitives: PrimitiveStore, + vocabulary: SparseVocabulary, + ) -> None: + if config.set_bpe.scheme != "sparse_set_bpe": + raise ConfigError("ActionCodec2Sparse profiles require set_bpe.scheme=sparse_set_bpe") + if vocabulary.layout != SparseLayout.from_config(config, primitives): + raise ValueError("sparse layout does not match the physical primitives") + if vocabulary.lookahead != config.set_bpe.lookahead: + raise ValueError("sparse vocabulary lookahead does not match config.yaml") + self.config, self.primitives, self.vocabulary = config, primitives, vocabulary + self.physical = PhysicalCodec(config, primitives) + self.requires_previous_first_order = self.physical.requires_previous_first_order + self.action_dim = config.physical.input_dim + self.bins = primitives.bins + self._grammar_cache = BoundedCache(8) + + @property + def vocab_size(self) -> int: + return self.vocabulary.vocab_size + + @property + def layout(self) -> SparseLayout: + return self.vocabulary.layout + + @classmethod + def from_pretrained(cls, directory: str | Path) -> ActionCodec2SparseProcessor: + """Load ``config.yaml``, ``primitives.npz`` and ``sparse_bpe.json``.""" + root = Path(directory) + config = ActionCodec2Config.from_pretrained(root) + primitives = PrimitiveStore.from_pretrained(root, input_dim=config.physical.input_dim) + return cls(config, primitives, SparseVocabulary.from_pretrained(root)) + + def save_pretrained(self, directory: str | Path) -> list[str]: + root = Path(directory) + self.config.save_pretrained(root) + self.primitives.save_pretrained(root) + files = [root / CONFIG_NAME, root / PRIMITIVES_NAME, self.vocabulary.save_pretrained(root)] + files.extend( + save_huggingface_metadata( + root, processor_class=PROFILE_PROCESSOR_CLASS, vocab_size=self.vocab_size + ) + ) + return [str(path) for path in files] + + @property + def artifact_fingerprint(self) -> str: + """Content hash over config, primitive axes and the ordered sparse rules.""" + digest = hashlib.sha256() + digest.update( + json.dumps(self.config.to_dict(), sort_keys=True, separators=(",", ":")).encode() + ) + for axis in self.primitives.values: + values = np.ascontiguousarray(axis) + digest.update(str(values.dtype).encode()) + digest.update(np.asarray(values.shape, dtype=np.int64).tobytes()) + digest.update(values.tobytes()) + digest.update( + json.dumps(self.vocabulary.to_dict(), sort_keys=True, separators=(",", ":")).encode() + ) + return digest.hexdigest() + + def _active(self, dims: tuple[int, ...]) -> np.ndarray: + flags = np.zeros(self.action_dim, dtype=bool) + flags[list(dims)] = True + return flags + + def _dense_previous_first_order( + self, previous_first_order: np.ndarray | None, dims: tuple[int, ...], batch: int + ) -> np.ndarray | None: + active = set(dims) + for component in self.config.physical.components.values(): + present = active.intersection(component.dims) + if ( + component.primitive_order == 2 + and component.space == "so3" + and present + and present != set(component.dims) + ): + raise ValueError( + "second-order SO(3) requires all three active component dimensions" + ) + if previous_first_order is None: + if any( + c.primitive_order == 2 and active.intersection(c.dims) + for c in self.config.physical.components.values() + ): + raise ValueError( + f"second-order tokenization requires previous_first_order with shape {(batch, len(dims))} in canonical input units" + ) + return ( + np.zeros((batch, self.action_dim), dtype=np.float32) + if self.requires_previous_first_order + else None + ) + values = np.asarray(previous_first_order, dtype=np.float32) + if values.shape != (batch, len(dims)) or not np.all(np.isfinite(values)): + raise ValueError(f"previous_first_order must be finite with shape {(batch, len(dims))}") + dense = np.zeros((batch, self.action_dim), dtype=np.float32) + dense[:, dims] = values + return dense + + def quantize_batch( + self, actions: np.ndarray, *, active_dims=None, previous_first_order=None + ) -> np.ndarray: + """Compact ``(B,T,D_active)`` actions to dense cells ``(B,T,D)``, ``-1`` inactive.""" + values = np.asarray(actions, dtype=np.float32) + if values.ndim != 3 or len(values) < 1 or values.shape[1] < 1: + raise ValueError("actions must have non-empty shape [B, T, D_active]") + dims = active_dimensions(active_dims, self.action_dim) + if len(dims) != values.shape[2]: + raise ValueError("active_dims must have one entry per action coordinate") + dense = np.zeros((len(values), values.shape[1], self.action_dim), dtype=np.float32) + dense[:, :, dims] = values + previous = self._dense_previous_first_order(previous_first_order, dims, len(values)) + cells = np.asarray( + self.physical.encode_batch(dense, previous_first_order=previous), dtype=np.int64 + ) + cells[:, :, ~self._active(dims)] = -1 + return cells + + def encode_batch( + self, + actions: np.ndarray, + *, + active_dims: Sequence[int] | None = None, + previous_first_order: np.ndarray | None = None, + threads: int = 0, + ) -> list[list[int]]: + """Encode independent ``(B,T,D_active)`` chunks into ragged local token rows.""" + cells = self.quantize_batch( + actions, active_dims=active_dims, previous_first_order=previous_first_order + ) + return self.vocabulary.encode_batch(cells, threads=threads) + + def cells_from_tokens( + self, rows: Sequence[Sequence[int]], *, horizon: int, active_dims=None + ) -> np.ndarray: + """Losslessly recover dense cells ``(B,horizon,D)`` with ``-1`` for inactive slots.""" + dims = active_dimensions(active_dims, self.action_dim) + return self.vocabulary.decode_batch(rows, horizon, self._active(dims)) + + def _filled(self, cells: np.ndarray) -> np.ndarray: + zero = [0 if z is None else z for z in self.layout.zero] + return np.where(cells >= 0, cells, np.asarray(zero, dtype=np.int64)) + + def decode_batch( + self, + rows: Sequence[Sequence[int]], + *, + horizon: int, + active_dims=None, + previous_first_order: np.ndarray | None = None, + ) -> np.ndarray: + """Decode rows to ``(B,horizon,D_active)`` reconstructed profile actions.""" + dims = active_dimensions(active_dims, self.action_dim) + cells = self.cells_from_tokens(rows, horizon=horizon, active_dims=dims) + previous = self._dense_previous_first_order(previous_first_order, dims, len(cells)) + decoded = self.physical.decode_batch(self._filled(cells), previous_first_order=previous) + return np.take(decoded, dims, axis=2) + + def final_first_order( + self, + rows: Sequence[Sequence[int]], + *, + horizon: int, + previous_first_order: np.ndarray, + active_dims=None, + executed_steps: int | None = None, + ) -> np.ndarray: + """Next compact ``(B,D_active)`` boundary after ``executed_steps`` codec frames.""" + dims = active_dimensions(active_dims, self.action_dim) + cells = self.cells_from_tokens(rows, horizon=horizon, active_dims=dims) + if executed_steps is not None: + if ( + isinstance(executed_steps, bool) + or not isinstance(executed_steps, Integral) + or not 1 <= executed_steps <= cells.shape[1] + ): + raise ValueError("executed_steps must be within the chunk horizon") + cells = cells[:, :executed_steps] + previous = self._dense_previous_first_order(previous_first_order, dims, len(cells)) + result = self.physical.final_first_order(self._filled(cells), previous_first_order=previous) + return np.take(result, dims, axis=1) + + def grammar(self, horizon: int, *, active_dims=None) -> SparseGrammar: + """Prefix grammar of one ``horizon``-frame chunk over the active slots.""" + dims = active_dimensions(active_dims, self.action_dim) + key = (int(horizon), dims) + grammar = self._grammar_cache.get(key) + if grammar is None: + grammar = SparseGrammar(self.vocabulary, horizon, self._active(dims)) + self._grammar_cache[key] = grammar + return grammar diff --git a/runtime/backends/actioncodec2/sparse/routing.py b/runtime/backends/actioncodec2/sparse/routing.py new file mode 100644 index 0000000000000000000000000000000000000000..daf95e87604d369193d2c4fd7348d437fe30ba64 --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/routing.py @@ -0,0 +1,574 @@ +"""Action-space routing over ActionCodec2Sparse profiles.""" + +from __future__ import annotations + +from ..presets import canonical_preset_name +from ..routing import _schedule + +from collections.abc import Mapping, Sequence +from dataclasses import dataclass +from pathlib import Path +from types import MappingProxyType + +import numpy as np +import yaml + +from .._validation import optional_finite_array +from ..batch_semantics import externalize_batch +from ..cache import BoundedCache, cached_prefix_state +from ..configuration import ConfigError, _integer, _mapping, _reject_unknown, _UniqueKeyLoader +from ..hf import save_huggingface_metadata +from ..presets import ComponentSpec, PresetConfig, format_action_spaces +from ..routing import ( + _PROFILE_WIDTHS, + _PROFILES, + ProfileSpec, + _ProfileRuntime, + _second_order_boundaries, + _second_order_dims, +) +from ..semantic import resampled_horizon +from ..trajectory import ActiveTrajectory +from .processor import ActionCodec2SparseProcessor + +SPARSE_ROUTER_MODEL_TYPE = "actioncodec2_sparse_router" +SPARSE_ROUTER_CONFIG_NAME = "sparse_router_config.yaml" +SPARSE_ROUTER_CONFIG_VERSION = 1 + + +RoutedState = tuple[tuple[bool, ...], tuple] + + +@dataclass(frozen=True) +class _Segment: + component: ComponentSpec + spec: ProfileSpec + processor: ActionCodec2SparseProcessor + + +class _FrontTracker: + def __init__(self, segment: _Segment, horizon: int) -> None: + tables = segment.processor.vocabulary.tables + self.emask, self.offset = tables.emask, segment.spec.token_offset + self.vocab, self.horizon = len(tables), horizon + self.front, self.closed = 0, 0 + + def push(self, token: int) -> None: + self.closed |= self.emask[token] << self.front + while self.front < self.horizon and self.closed >> self.front & 1: + self.front += 1 + + +class RoutedSparseGrammar: + """Constrained-generation grammar of one preset and codec-frame horizon.""" + + def __init__(self, router: ActionCodec2SparseRouter, *, preset: str, horizon: int) -> None: + self.horizon = _integer(horizon, "horizon", positive=True) + self.segments = router._segments(router.preset(preset)) + self.time_major = router.preset(preset).token_order == "time_major" + self.vocab_size, self.end_token = router.vocab_size, router.end_token + self._grammars = tuple( + s.processor.grammar(self.horizon, active_dims=s.component.active_dims) + for s in self.segments + ) + self._initial: RoutedState = ( + (False,) * len(self.segments), + tuple(g.initial() for g in self._grammars), + ) + self._cache = BoundedCache(256) + + def _scheduled(self, state: RoutedState) -> int | None: + fronts = [g.front(s) for g, s in zip(self._grammars, state[1], strict=True)] + return _schedule(fronts, state[0], self.time_major) + + def _advance(self, state: RoutedState, token: int) -> RoutedState | None: + finished, states = state + index = self._scheduled(state) + if index is None: + return None + if token == self.end_token: + if finished.count(False) < 2 or not self._grammars[index].is_complete(states[index]): + return None + return (*finished[:index], True, *finished[index + 1 :]), states + local = token - self.segments[index].spec.token_offset + updated = self._grammars[index].advance(states[index], local) + if updated is None: + return None + return finished, (*states[:index], updated, *states[index + 1 :]) + + def _consume(self, tokens: Sequence[int]) -> RoutedState | None: + checked = [] + for token in tokens: + if isinstance(token, bool) or not isinstance(token, (int, np.integer)): + return None + checked.append(int(token)) + return cached_prefix_state(tuple(checked), self._cache, self._initial, self._advance) + + def reserve_states(self, rows: int) -> None: + """Size the prefix cache for ``rows`` streams advanced in lockstep.""" + self._cache.reserve(4 * _integer(rows, "rows", positive=True)) + + def _mask_from_state(self, state: RoutedState) -> np.ndarray: + output = np.zeros(self.vocab_size, dtype=bool) + index = self._scheduled(state) + if index is None: + return output + finished, states = state + mask = self._grammars[index].mask(states[index]) + start = self.segments[index].spec.token_offset + output[start : start + len(mask)] = mask + if finished.count(False) >= 2 and self._grammars[index].is_complete(states[index]): + output[self.end_token] = True + return output + + def _state_complete(self, state: RoutedState) -> bool: + finished, states = state + open_ = [i for i, done in enumerate(finished) if not done] + return len(open_) == 1 and self._grammars[open_[0]].is_complete(states[open_[0]]) + + def next_token_mask(self, tokens: Sequence[int]) -> np.ndarray: + """Boolean ``(vocab_size,)`` mask of legal next routed tokens.""" + state = self._consume(tokens) + if state is None: + raise ValueError("token prefix is not legal for this sparse preset") + return self._mask_from_state(state) + + def is_complete(self, tokens: Sequence[int]) -> bool: + """Whether the stream may end here: one component left and its chunk complete.""" + state = self._consume(tokens) + return state is not None and self._state_complete(state) + + def covered_steps(self, tokens: Sequence[int]) -> int: + """Leading codec frames that no further token can change.""" + state = self._consume(tokens) + if state is None: + raise ValueError("token prefix is not legal for this sparse preset") + return min( + self.horizon if done else grammar.front(local) + for grammar, local, done in zip(self._grammars, state[1], state[0], strict=True) + ) + + def accepts(self, tokens: Sequence[int]) -> bool: + return self.is_complete(tokens) + + +class ActionCodec2SparseRouter: + """Route action-space tensors through ActionCodec2Sparse profile namespaces.""" + + model_type = SPARSE_ROUTER_MODEL_TYPE + + def __init__( + self, + profiles: Sequence[tuple[ProfileSpec, ActionCodec2SparseProcessor]], + presets: Sequence[PresetConfig], + ) -> None: + runtimes: dict[str, _ProfileRuntime] = {} + offset = 0 + for spec, processor in profiles: + if spec.name in runtimes or spec.name not in _PROFILES: + raise ConfigError(f"invalid or duplicate sparse profile {spec.name!r}") + if spec.token_offset != offset: + raise ConfigError("profile token namespaces must be contiguous and ordered") + if processor.vocab_size > spec.token_budget: + raise ConfigError( + f"profile {spec.name!r} uses {processor.vocab_size} tokens, " + f"exceeding budget {spec.token_budget}" + ) + if processor.artifact_fingerprint != spec.artifact_fingerprint: + raise ConfigError(f"profile {spec.name!r} fingerprint does not match its artifact") + if processor.action_dim != _PROFILE_WIDTHS[spec.name]: + raise ConfigError( + f"profile {spec.name!r} must have width {_PROFILE_WIDTHS[spec.name]}" + ) + runtimes[spec.name] = _ProfileRuntime(spec, processor) + offset += spec.token_budget + if not runtimes: + raise ConfigError("a sparse router needs at least one profile") + self.profiles = MappingProxyType(runtimes) + self._second_order_dims = { + name: _second_order_dims(runtime.processor.config) for name, runtime in runtimes.items() + } + self.end_token = offset + self.vocab_size = offset + 1 + self._grammars = BoundedCache(8) + self._action_spaces: dict[str, PresetConfig] = {} + for preset in presets: + self.register_action_space(preset) + + @classmethod + def from_processors( + cls, + processors: Mapping[str, ActionCodec2SparseProcessor], + *, + token_budgets: Mapping[str, int], + presets: Sequence[PresetConfig], + ) -> ActionCodec2SparseRouter: + """Assign stable contiguous namespaces in canonical joint/EEF order.""" + if set(processors) != set(token_budgets) or set(processors) - _PROFILES: + raise ConfigError("processors and token_budgets must share joint/eef keys") + entries, offset = [], 0 + for name in ("joint", "eef"): + if name in processors: + budget = _integer(token_budgets[name], f"token_budgets.{name}", positive=True) + spec = ProfileSpec(name, offset, budget, processors[name].artifact_fingerprint) + entries.append((spec, processors[name])) + offset += budget + return cls(entries, presets) + + @property + def action_spaces(self) -> Mapping[str, PresetConfig]: + return MappingProxyType(self._action_spaces) + + def preset(self, name: str) -> PresetConfig: + try: + return self._action_spaces[canonical_preset_name(name)] + except KeyError as error: + raise KeyError( + f"unknown preset {name!r}; available: {sorted(self._action_spaces)}" + ) from error + + def register_action_space(self, preset) -> PresetConfig: + """Register a validated preset, mapping, or YAML path without changing token IDs.""" + if isinstance(preset, Mapping): + preset = PresetConfig.from_dict(preset) + elif isinstance(preset, (str, Path)): + preset = PresetConfig.from_yaml(preset) + if not isinstance(preset, PresetConfig): + raise TypeError("register_action_space expects PresetConfig, a mapping, or a YAML path") + missing = {c.space for c in preset.components} - self.profiles.keys() + if missing: + raise ConfigError( + f"action space {preset.name!r} requires missing profiles: {sorted(missing)}" + ) + existing = self._action_spaces.get(preset.name) + if existing is not None and existing != preset: + raise ConfigError( + f"action-space name {preset.name!r} is already registered differently" + ) + self._action_spaces[preset.name] = preset + return preset + + def second_order_boundaries(self, preset) -> dict[str, int]: + """Map each component needing ``previous_first_order`` to its active width.""" + if not isinstance(preset, PresetConfig): + preset = self.preset(preset) + return _second_order_boundaries(preset, self._second_order_dims) + + def _validate_boundary_keys( + self, previous_first_order: Mapping[str, np.ndarray] | None, preset: PresetConfig + ) -> None: + if previous_first_order is None: + previous_first_order = {} + if not isinstance(previous_first_order, Mapping): + raise ValueError( + "previous_first_order must map component names to canonical [B,D_active] boundaries" + ) + unknown = set(previous_first_order) - {c.name for c in preset.components} + if unknown: + raise ValueError(f"unknown previous_first_order component(s): {sorted(unknown)}") + required = { + name: f"(B, {width})" for name, width in self.second_order_boundaries(preset).items() + } + missing = set(required) - previous_first_order.keys() + if missing: + raise ValueError( + "second-order tokenization requires previous_first_order with arrays " + f"{required}; missing {sorted(missing)}. Use canonical {preset.target_hz:g} Hz " + "reconstructed increments. codec.first_order_template(batch_size) explicitly " + "creates zeros; use zeros only if the preceding increment is known to be zero." + ) + + @staticmethod + def _boundary(previous_first_order, segment: _Segment): + return ( + None + if previous_first_order is None + else previous_first_order.get(segment.component.name) + ) + + def describe_action_spaces(self, *, selected=None, action_dim=None) -> str: + return format_action_spaces( + self.action_spaces, + selected=selected, + action_dim=action_dim, + codec_name="ActionCodec2Sparse", + chunk_horizon_decode=True, + ) + + def __str__(self) -> str: + return self.describe_action_spaces() + + def to(self, device: object) -> ActionCodec2SparseRouter: + """Return ``self`` because routed processors use CPU NumPy arrays.""" + del device + return self + + def _segments(self, preset: PresetConfig) -> tuple[_Segment, ...]: + return tuple( + _Segment(c, self.profiles[c.space].spec, self.profiles[c.space].processor) + for c in preset.components + ) + + def grammar(self, *, preset: str, horizon: int) -> RoutedSparseGrammar: + key = (preset, int(horizon)) + grammar = self._grammars.get(key) + if grammar is None: + grammar = RoutedSparseGrammar(self, preset=preset, horizon=horizon) + self._grammars[key] = grammar + return grammar + + def encode_batch( + self, + inputs, + *, + preset: str, + fps=None, + current_state=None, + previous_first_order=None, + threads: int = 0, + ) -> list[list[int]]: + """Encode ``(B,T,D)`` source chunks at ``fps`` into routed token rows.""" + config = self.preset(preset) + self._validate_boundary_keys(previous_first_order, config) + canonical = config._canonicalize_batch(inputs, source_hz=fps, current_state=current_state) + segments = self._segments(config) + streams = [ + s.processor.encode_batch( + canonical[s.component.name], + active_dims=s.component.active_dims, + previous_first_order=self._boundary(previous_first_order, s), + threads=threads, + ) + for s in segments + ] + horizon = next(iter(canonical.values())).shape[1] + time_major = config.token_order == "time_major" + return [ + self._interleave([rows[i] for rows in streams], segments, horizon, time_major) + for i in range(len(streams[0])) + ] + + def _interleave(self, streams, segments, horizon, time_major) -> list[int]: + trackers = [_FrontTracker(s, horizon) for s in segments] + cursors, finished, output = [0] * len(streams), [False] * len(streams), [] + while True: + index = _schedule([t.front for t in trackers], finished, time_major) + if index is None: + return output + if cursors[index] == len(streams[index]): + if finished.count(False) == 1: + return output + finished[index] = True + output.append(self.end_token) + continue + token = int(streams[index][cursors[index]]) + cursors[index] += 1 + trackers[index].push(token) + output.append(token + segments[index].spec.token_offset) + + def _split(self, row, segments, horizon, time_major) -> list[list[int]]: + trackers = [_FrontTracker(s, horizon) for s in segments] + finished, output = [False] * len(segments), [[] for _ in segments] + for position, raw in enumerate(row): + if isinstance(raw, bool) or not isinstance(raw, (int, np.integer)): + raise ValueError(f"tokens[{position}] must be an integer") + index = _schedule([t.front for t in trackers], finished, time_major) + if index is None: + raise ValueError("token after every component is finished") + token = int(raw) + if token == self.end_token: + if finished.count(False) < 2: + raise ValueError("the end token cannot close the last open component") + finished[index] = True + continue + local = token - segments[index].spec.token_offset + if not 0 <= local < trackers[index].vocab: + raise ValueError( + f"tokens[{position}] is outside component {segments[index].component.name!r}" + ) + if trackers[index].front >= horizon: + raise ValueError("token after the last open frame") + trackers[index].push(local) + output[index].append(local) + return output + + def _split_rows(self, rows, config, horizon): + horizon = _integer(horizon, "horizon", positive=True) + rows = list(rows) + if not rows: + raise ValueError("rows must not be empty") + segments = self._segments(config) + time_major = config.token_order == "time_major" + return segments, [self._split(row, segments, horizon, time_major) for row in rows] + + def decode_batch( + self, + rows, + *, + preset: str, + horizon: int, + fps=None, + current_state=None, + previous_first_order=None, + ) -> dict[str, np.ndarray]: + """Decode rows of one codec-frame ``horizon`` to ``{component: (B,T_out,D_c)}``.""" + config = self.preset(preset) + self._validate_boundary_keys(previous_first_order, config) + segments, splits = self._split_rows(rows, config, horizon) + state = optional_finite_array(current_state, shape=(len(splits), config.input_dim)) + output_fps = config.source_hz if fps is None else fps + steps = resampled_horizon(horizon, source_hz=config.target_hz, target_hz=output_fps) + output = {} + for index, segment in enumerate(segments): + decoded = segment.processor.decode_batch( + [split[index] for split in splits], + horizon=horizon, + active_dims=segment.component.active_dims, + previous_first_order=self._boundary(previous_first_order, segment), + ) + output[segment.component.name] = externalize_batch( + decoded, + segment.component, + source_hz=config.target_hz, + target_hz=output_fps, + target_length=steps, + method=config.interpolation, + current_state=state, + ) + return output + + def final_first_order( + self, + rows, + *, + preset: str, + horizon: int, + previous_first_order, + executed_steps: int | None = None, + ) -> dict[str, np.ndarray]: + """Component ``(B,D_active)`` boundaries after ``executed_steps`` codec frames.""" + config = self.preset(preset) + if previous_first_order is None: + raise ValueError("final_first_order requires previous_first_order") + self._validate_boundary_keys(previous_first_order, config) + segments, splits = self._split_rows(rows, config, horizon) + output = {} + for index, segment in enumerate(segments): + if not segment.processor.requires_previous_first_order: + continue + output[segment.component.name] = segment.processor.final_first_order( + [split[index] for split in splits], + horizon=horizon, + previous_first_order=self._boundary(previous_first_order, segment), + active_dims=segment.component.active_dims, + executed_steps=executed_steps, + ) + return output + + def route_trajectories( + self, + inputs: np.ndarray, + *, + preset: str, + current_state: np.ndarray | None = None, + fps: float | None = None, + previous_first_order: Mapping[str, np.ndarray] | None = None, + ) -> dict[str, list[ActiveTrajectory]]: + """Expose canonical complete trajectories grouped by physical profile.""" + preset_config = self.preset(preset) + self._validate_boundary_keys(previous_first_order, preset_config) + canonical = preset_config.canonicalize(inputs, current_state=current_state, source_hz=fps) + output: dict[str, list[ActiveTrajectory]] = {} + for component in preset_config.components: + trajectories = canonical[component.name] + processor = self.profiles[component.space].processor + previous = ( + None if previous_first_order is None else previous_first_order.get(component.name) + ) + dense = processor._dense_previous_first_order( + previous, component.active_dims, len(trajectories) + ) + rows = ( + [None] * len(trajectories) + if dense is None + else np.take(dense, component.active_dims, axis=1) + ) + output.setdefault(component.space, []).extend( + ActiveTrajectory(t.values, t.active_dims, previous_first_order=p) + for t, p in zip(trajectories, rows, strict=True) + ) + return output + + @property + def new_action_tokens(self) -> list[str]: + """Stable token names: profile namespaces (budget slots included), then the end token.""" + names = [ + f"" + for name, runtime in self.profiles.items() + for index in range(runtime.spec.token_budget) + ] + return [*names, ""] + + def save_pretrained(self, directory) -> list[str]: + root = Path(directory) + files = [] + for name, runtime in self.profiles.items(): + files.extend(runtime.processor.save_pretrained(root / "profiles" / name)) + manifest = { + "model_type": self.model_type, + "config_version": SPARSE_ROUTER_CONFIG_VERSION, + "profiles": [runtime.spec.to_dict() for runtime in self.profiles.values()], + "presets": [preset.to_dict() for preset in self.action_spaces.values()], + } + path = root / SPARSE_ROUTER_CONFIG_NAME + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(yaml.safe_dump(manifest, sort_keys=False), encoding="utf-8") + return [str(path), *files] + + @staticmethod + def read_manifest(directory) -> tuple[tuple[ProfileSpec, ...], tuple[PresetConfig, ...]]: + """Read profile specs and action spaces without loading numerical arrays.""" + path = Path(directory) / SPARSE_ROUTER_CONFIG_NAME + payload = _mapping( + yaml.load(path.read_text(encoding="utf-8"), Loader=_UniqueKeyLoader), "router" + ) + _reject_unknown(payload, {"model_type", "config_version", "profiles", "presets"}, "router") + if payload.get("model_type") != SPARSE_ROUTER_MODEL_TYPE: + raise ConfigError(f"router.model_type must be {SPARSE_ROUTER_MODEL_TYPE!r}") + if payload.get("config_version") != SPARSE_ROUTER_CONFIG_VERSION: + raise ConfigError( + f"unsupported sparse router config_version {payload.get('config_version')!r}" + ) + profiles, presets = payload.get("profiles"), payload.get("presets") + if not isinstance(profiles, list) or not isinstance(presets, list): + raise ConfigError("router.profiles and router.presets must be lists") + return ( + tuple( + ProfileSpec.from_dict(p, path=f"router.profiles[{i}]") + for i, p in enumerate(profiles) + ), + tuple( + PresetConfig.from_dict(p, path=f"router.presets[{i}]") + for i, p in enumerate(presets) + ), + ) + + @classmethod + def from_pretrained(cls, directory) -> ActionCodec2SparseRouter: + root = Path(directory) + specs, presets = cls.read_manifest(root) + profiles = [ + (spec, ActionCodec2SparseProcessor.from_pretrained(root / "profiles" / spec.name)) + for spec in specs + ] + return cls(profiles, presets) + + +def save_router_metadata(directory, **processor_config) -> tuple[Path, Path]: + """Hugging Face discovery files for a saved sparse router or bound frontend.""" + return save_huggingface_metadata( + directory, + model_type="actioncodec2_sparse", + processor_class="ActionCodec2Sparse", + **processor_config, + ) diff --git a/runtime/backends/actioncodec2/sparse/training.py b/runtime/backends/actioncodec2/sparse/training.py new file mode 100644 index 0000000000000000000000000000000000000000..81d93187460beb753ae8a2d1be345eb6bf3ed7f2 --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/training.py @@ -0,0 +1,324 @@ +"""ActionCodec2Sparse vocabulary training: optional spatial stage, then certified temporal merges.""" + +from __future__ import annotations + +import heapq +import time +from collections import defaultdict +from collections.abc import Sequence + +import numpy as np + +from ..native_backend import native_kernel, resolve_backend +from ..setbpe.spatial import aggregate_records +from ..setbpe.spatial_training import train_spatial +from .layout import SparseLayout, sparsify_chunks +from .vocabulary import Instances, SparseVocabulary, TokenTables, rule_key + +MIN_PAIR_COUNT = 2 +CERTIFY_BATCH = 32 + + +def _unpack(key: int) -> tuple[int, int, int]: + return key >> 40, (key >> 16) & 0xFFFFFF, key & 0xFFFF + + +class _Stat: + __slots__ = ( + "retired", + "raw", + "version", + "exact", + "exact_version", + "added", + "added_at_exact", + "dirty_epoch", + "live", + "queued_version", + "queued_count", + ) + + def __init__(self) -> None: + self.retired = self.live = False + self.raw = self.version = self.exact_version = self.added = self.added_at_exact = 0 + self.dirty_epoch = self.queued_version = self.queued_count = 0 + self.exact = -1 + + @property + def certified(self) -> bool: + return self.exact >= 0 and self.exact_version == self.version + + @property + def bound(self) -> int: + """Upper bound on the exact count: certified counts grow only by inserted pairs.""" + if self.certified: + return self.exact + if self.exact >= 0: + return min(self.raw, self.exact + self.added - self.added_at_exact) + return self.raw + + +class ReferenceTrainer: + """Python reference of the native temporal trainer (same interface and merges).""" + + def __init__( + self, spatial_support, dims, lookahead, vocab_size, allow_zero_offset, min_count=2 + ): + self.tables = TokenTables([int(s) for s in spatial_support], dims - 1, lookahead) + self.dims, self.vocab_size = dims, vocab_size + self.allow_zero, self.min_count = allow_zero_offset, min_count + self.stats: dict[int, _Stat] = defaultdict(_Stat) + self.heap: list[tuple[int, int, int]] = [] + self._merges: list[tuple[int, int, int]] = [] + self.epoch = 0 + self.counters = dict(dry_runs=0, rejected_by_validity=0, applied=0) + + def set_instances(self, anchors, tokens, frames) -> None: + self.state = Instances(self.tables, int(frames), self.dims) + self.occurrence: dict[int, list[int]] = defaultdict(list) + for anchor, token in zip( + np.asarray(anchors).tolist(), np.asarray(tokens).tolist(), strict=True + ): + if not 0 <= token < self.tables.base: + raise ValueError("token outside spatial vocab") + self.occurrence[token].append(self.state.add(token, anchor)) + for values in self.occurrence.values(): + values.sort(key=lambda i: self.state.root[i]) + self.initial_instances = len(self.state.tok) + + def merges(self) -> list[tuple[int, int, int]]: + return list(self._merges) + + def _queue(self, key: int, stat: _Stat, count: int) -> None: + heapq.heappush(self.heap, (-count, key, stat.version)) + stat.live, stat.queued_version, stat.queued_count = True, stat.version, count + + def _pairs(self, left: int, right: int, offset: int): + st = self.state + for a in self.occurrence[left]: + if not st.alive[a]: + continue + f = st.root[a] + offset + if f >= st.frames: + continue + b = int(st.member[f, self.tables.rdim[right]]) + if b >= 0 and b != a and st.alive[b] and st.tok[b] == right and st.root[b] == f: + yield a, b + + def _count_exact(self, key: int) -> int: + left, right, offset = _unpack(key) + consumed, count = set(), 0 + for a, b in self._pairs(left, right, offset): + if left == right and a in consumed: + continue + if not self.state.valid(a, b, offset): + continue + if left == right: + consumed.add(b) + count += 1 + return count + + def _take(self): + count, key, version = heapq.heappop(self.heap) + stat = self.stats.get(key) + if stat is None or stat.retired or not stat.live or version != stat.queued_version: + return None + stat.live = False + if version == stat.version: + return -count, key, stat + if stat.bound > 0: + self._queue(key, stat, stat.bound) + return None + + def _current_certified(self, entry) -> bool: + _, key, version = entry + stat = self.stats.get(key) + return ( + stat is not None + and not stat.retired + and stat.live + and version == stat.queued_version == stat.version + and stat.certified + ) + + def _certify(self, keys: list[int]) -> None: + self.counters["dry_runs"] += len(keys) + exact = [self._count_exact(key) for key in keys] + for key, count in zip(keys, exact, strict=True): + stat = self.stats[key] + stat.exact, stat.exact_version, stat.added_at_exact = count, stat.version, stat.added + if count >= self.min_count: + self._queue(key, stat, count) + + def _apply(self, left: int, right: int, offset: int, child: int) -> list[int]: + st, delta = self.state, defaultdict(int) + pairs = list(self._pairs(left, right, offset)) + tok = st.tok + for a, b in pairs: + if not st.alive[a] or not st.alive[b]: + continue + if not st.valid(a, b, offset): + self.counters["rejected_by_validity"] += 1 + continue + for x, y, o in st.partners(a, self.allow_zero): + delta[rule_key(tok[x], tok[y], o)] -= 1 + for x, y, o in st.partners(b, self.allow_zero): + if a not in (x, y): + delta[rule_key(tok[x], tok[y], o)] -= 1 + root = st.root[a] + st.kill(a) + st.kill(b) + merged = st.add(child, root) + self.occurrence[child].append(merged) + for x, y, o in st.partners(merged, self.allow_zero): + delta[rule_key(tok[x], tok[y], o)] += 1 + self.counters["applied"] += 1 + dirty = [] + for key, change in delta.items(): + stat = self.stats[key] + stat.raw += change + stat.added += max(change, 0) + stat.version += 1 + if stat.dirty_epoch != self.epoch: + stat.dirty_epoch = self.epoch + dirty.append(key) + return dirty + + def train(self, progress: bool = False) -> dict: + del progress + st = self.state + for i in range(len(st.tok)): + for a, b, o in st.partners(i, self.allow_zero): + if a == i: + self.stats[rule_key(st.tok[a], st.tok[b], o)].raw += 1 + initial_types = len(self.stats) + for key, stat in list(self.stats.items()): + self._queue(key, stat, stat.raw) + while len(self.tables) < self.vocab_size and self.heap: + taken = self._take() + if taken is None: + continue + count, key, stat = taken + if not stat.certified: + batch = [key] + while self.heap and len(batch) < CERTIFY_BATCH: + if self._current_certified(self.heap[0]): + break + following = self._take() + if following is not None: + batch.append(following[1]) + self._certify(batch) + continue + if count != stat.exact or stat.exact < self.min_count: + continue + left, right, offset = _unpack(key) + if self.tables.compose(left, right, offset) is None: + stat.exact = 0 + continue + child = self.tables.add_merge(left, right, offset) + self._merges.append((left, right, offset)) + stat.retired = True + self.epoch += 1 + for dirty in self._apply(left, right, offset, child): + other = self.stats[dirty] + if not other.retired and other.bound > 0: + if not other.live or other.bound > other.queued_count: + self._queue(dirty, other, other.bound) + return dict( + initial_instances=self.initial_instances, + final_instances=sum(st.alive), + initial_rule_types=initial_types, + merges=len(self._merges), + **self.counters, + ) + + +def _spatial_instances(vocabulary: SparseVocabulary, frames: np.ndarray): + bins = np.asarray(vocabulary.layout.sparse_bins, dtype=np.int64) + 1 + if float(np.prod(bins.astype(float))) < 2.0**62: + keys = np.ravel_multi_index((frames.astype(np.int64) + 1).T, bins) + unique, inverse = np.unique(keys, return_inverse=True) + rows = np.stack(np.unravel_index(unique, bins), axis=1) - 1 + else: + rows, inverse = np.unique(frames.astype(np.int64), axis=0, return_inverse=True) + inverse = np.asarray(inverse).reshape(-1) + nonempty = np.flatnonzero(np.any(rows >= 0, axis=1)) + counts = np.zeros(len(rows), dtype=np.int64) + codec = vocabulary._codec() + if codec is not None: + encoded_counts, flat = codec.spatial_encode(np.asarray(rows[nonempty], dtype=np.int32)) + counts[nonempty] = encoded_counts + flat = np.asarray(flat, dtype=np.int32) + else: + parts = [vocabulary.spatial.encode(rows[i].tolist()) for i in nonempty] + counts[nonempty] = [len(p) for p in parts] + flat = np.asarray([t for p in parts for t in sorted(p)], dtype=np.int32) + offsets = np.concatenate(([0], np.cumsum(counts))) + per_frame = counts[inverse] + total = int(per_frame.sum()) + position = np.arange(total) - np.repeat(np.cumsum(per_frame) - per_frame, per_frame) + return per_frame, flat[np.repeat(offsets[:-1][inverse], per_frame) + position] + + +def fit_sparse_vocabulary( + layout: SparseLayout, + chunks: Sequence[np.ndarray], + *, + spatial_vocab_size: int, + vocab_size: int, + lookahead: int, + backend: str = "auto", + threads: int = 0, + progress: bool = False, +) -> tuple[SparseVocabulary, dict]: + """Fit spatial then temporal sparse Set-BPE on independent dense chunks ``[(T_i, D)]``.""" + backend = resolve_backend(backend) + started = time.perf_counter() + frames, starts = sparsify_chunks(layout, chunks) + atoms = sum(layout.sparse_bins) + if spatial_vocab_size < atoms: + raise ValueError(f"spatial_vocab_size must be at least the {atoms} sparse atoms") + spatial_merges, spatial_report = (), {} + if spatial_vocab_size > atoms: + records = frames[np.any(frames >= 0, axis=1)] + codes, weights = aggregate_records(records, layout.sparse_bins) + spatial, spatial_report = train_spatial( + codes, + weights, + layout.sparse_bins, + vocab_size=spatial_vocab_size, + backend=backend, + threads=threads, + progress=progress, + ) + spatial_merges = spatial.merges + spatial_done = time.perf_counter() + vocabulary = SparseVocabulary(layout, spatial_merges, (), lookahead) + per_frame, tokens = _spatial_instances(vocabulary, frames) + chunk = np.repeat(np.arange(len(starts) - 1), np.diff(starts)) + anchors = np.repeat(np.arange(len(frames), dtype=np.int64) + chunk * lookahead, per_frame) + support = [int(s) for s in vocabulary.spatial.support] + arguments = (support, layout.dims + 1, lookahead, vocab_size, True, MIN_PAIR_COUNT) + if backend == "native": + trainer = native_kernel("SparseTrainer")( + *arguments, threads, bool(getattr(layout, "dense", False)) + ) + else: + trainer = ReferenceTrainer(*arguments) + trainer.set_instances(anchors, tokens.astype(np.int32), len(frames) + len(chunks) * lookahead) + del anchors + temporal_report = dict(trainer.train(progress)) + vocabulary = SparseVocabulary(layout, spatial_merges, trainer.merges(), lookahead) + report = dict( + chunks=len(chunks), + frames=len(frames), + sparse_atoms=atoms, + atoms_per_frame=float(np.count_nonzero(frames >= 0) / len(frames)), + spatial_vocab_size=vocabulary.spatial.vocab_size, + vocab_size=vocabulary.vocab_size, + spatial_instances=len(tokens), + spatial=dict(spatial_report), + temporal=temporal_report, + seconds=dict(spatial=spatial_done - started, total=time.perf_counter() - started), + ) + return vocabulary, report diff --git a/runtime/backends/actioncodec2/sparse/vocabulary.py b/runtime/backends/actioncodec2/sparse/vocabulary.py new file mode 100644 index 0000000000000000000000000000000000000000..60911fcc5345c30d4248b93b9b844b833caeb0c6 --- /dev/null +++ b/runtime/backends/actioncodec2/sparse/vocabulary.py @@ -0,0 +1,361 @@ +"""Fitted ActionCodec2Sparse token layer: spatial Set-BPE per sparse frame plus temporal rules.""" + +from __future__ import annotations + +import heapq +import json +from collections.abc import Sequence +from numbers import Integral +from pathlib import Path + +import numpy as np + +from ..native_backend import native_kernel, resolve_backend +from ..configuration import _integer +from ..setbpe.spatial import SpatialVocabulary +from .layout import SparseLayout + +SPARSE_BPE_NAME = "sparse_bpe.json" +FORMAT = "actioncodec2_sparse_bpe" +FORMAT_VERSION = 1 +MAX_LOOKAHEAD = 32 + + +def _ctz(mask: int) -> int: + return (mask & -mask).bit_length() - 1 + + +class TokenTables: + """Per-token geometry shared by the encoder, decoder, trainer and grammar.""" + + def __init__(self, support: Sequence[int], e_dim: int, lookahead: int) -> None: + if not 1 <= lookahead <= MAX_LOOKAHEAD: + raise ValueError(f"lookahead must be in [1, {MAX_LOOKAHEAD}]") + self.e_dim, self.lookahead, self.base = e_dim, lookahead, len(support) + self.masks: list[tuple[int, ...]] = [] + self.patterns: list[tuple[tuple[int, int], ...]] = [] + self.span: list[int] = [] + self.rdim: list[int] = [] + self.emask: list[int] = [] + self.first_from: list[tuple[int, ...]] = [] + for token, mask in enumerate(support): + if not mask: + raise ValueError("spatial token without support") + self._push(((0, token),), (int(mask),)) + + def _push(self, pattern, masks) -> None: + span = max(o for o, m in enumerate(masks) if m) + 1 + masks = tuple(masks[:span]) + self.masks.append(masks) + self.patterns.append(tuple(pattern)) + self.span.append(span) + self.rdim.append(_ctz(masks[0])) + self.emask.append(sum(1 << o for o, m in enumerate(masks) if m >> self.e_dim & 1)) + first, following = [], -1 + for o in range(span - 1, -1, -1): + if masks[o]: + following = o + first.append(following) + self.first_from.append(tuple(reversed(first))) + + def __len__(self) -> int: + return len(self.span) + + def mask(self, token: int, offset: int) -> int: + masks = self.masks[token] + return masks[offset] if offset < len(masks) else 0 + + def compose(self, left: int, right: int, offset: int) -> tuple[int, ...] | None: + """Union support of ``right`` rooted ``offset`` frames after ``left``, or ``None``.""" + if not 0 <= offset < self.lookahead: + return None + span = max(self.span[left], offset + self.span[right]) + if span > self.lookahead: + return None + out = [self.mask(left, o) for o in range(span)] + for o in range(self.span[right]): + if out[o + offset] & self.mask(right, o): + return None + out[o + offset] |= self.mask(right, o) + return tuple(out) + + def add_merge(self, left: int, right: int, offset: int) -> int: + masks = self.compose(left, right, offset) + if masks is None: + raise ValueError("illegal temporal merge") + pattern = sorted( + self.patterns[left] + tuple((o + offset, t) for o, t in self.patterns[right]) + ) + self._push(pattern, masks) + return len(self) - 1 + + +def rule_key(left: int, right: int, offset: int) -> int: + return (left << 40) | (right << 16) | offset + + +class Instances: + """Mutable rooted token instances over one frame axis (reference implementation).""" + + def __init__(self, tables: TokenTables, frames: int, dims: int) -> None: + self.tb, self.frames, self.dims = tables, frames, dims + self.tok: list[int] = [] + self.root: list[int] = [] + self.alive: list[bool] = [] + self.member = np.full((frames, dims), -1, dtype=np.int64) + + def key(self, i: int) -> tuple[int, int, int, int]: + e = self.tb.emask[self.tok[i]] + root = self.root[i] + return (root, 1 if e else 0, root + _ctz(e) if e else 0, self.tb.rdim[self.tok[i]]) + + def add(self, token: int, root: int) -> int: + self.tok.append(token) + self.root.append(root) + self.alive.append(True) + index = len(self.tok) - 1 + self._paint(index, index) + return index + + def _paint(self, i: int, value: int) -> None: + token, root = self.tok[i], self.root[i] + for o, mask in enumerate(self.tb.masks[token]): + while mask: + d = _ctz(mask) + mask &= mask - 1 + if value >= 0 and self.member[root + o, d] >= 0: + raise RuntimeError("instance overlap") + self.member[root + o, d] = value + + def kill(self, i: int) -> None: + self.alive[i] = False + self._paint(i, -1) + + def _first(self, a: int, b: int) -> bool: + return (self.root[a], self.tb.rdim[self.tok[a]]) < (self.root[b], self.tb.rdim[self.tok[b]]) + + def partners(self, i: int, allow_zero: bool): + """Ordered candidate pairs ``(a, b, offset)`` involving ``i`` in the lookahead window.""" + tb, L, root = self.tb, self.tb.lookahead, self.root[i] + lo, hi = max(0, root - L + 1), min(self.frames - 1, root + L - 1) + for f in range(lo, hi + 1): + for d in range(self.dims): + j = int(self.member[f, d]) + if j < 0 or j == i: + continue + tj, o = self.tok[j], f - self.root[j] + k = max(0, lo - self.root[j]) + if tb.first_from[tj][k] != o or _ctz(tb.mask(tj, o)) != d: + continue + a, b = (i, j) if self._first(i, j) else (j, i) + off = self.root[b] - self.root[a] + if off >= L or (off == 0 and not allow_zero): + continue + if max(tb.span[self.tok[a]], off + tb.span[self.tok[b]]) > L: + continue + yield a, b, off + + def valid(self, a: int, b: int, off: int) -> bool: + """Whether merging ``a`` (rooted first) with ``b`` keeps the stream decodable.""" + tb, ta, tbb = self.tb, self.tok[a], self.tok[b] + span = max(tb.span[ta], off + tb.span[tbb]) + emask = tb.emask[ta] | (tb.emask[tbb] << off) + root = self.root[a] + merged = (root, 1 if emask else 0, root + _ctz(emask) if emask else 0, tb.rdim[ta]) + for o in range(span): + mask = tb.mask(ta, o) | (tb.mask(tbb, o - off) if o >= off else 0) + if not mask: + continue + u = root + o + h = int(self.member[u, tb.e_dim]) + if h >= 0 and h not in (a, b) and not self.key(h) > merged: + return False + if emask >> o & 1: + for d in range(self.dims): + j = int(self.member[u, d]) + if j >= 0 and j not in (a, b) and not self.key(j) < merged: + return False + return True + + def serialize(self) -> list[int]: + live = sorted((i for i, alive in enumerate(self.alive) if alive), key=self.key) + return [self.tok[i] for i in live] + + +class SparseVocabulary: + """Fitted sparse token layer over one physical profile's dense cells.""" + + def __init__(self, layout: SparseLayout, spatial_merges, temporal_merges, lookahead: int): + self.layout = layout + self.lookahead = _integer(lookahead, "lookahead", positive=True) + self.spatial = SpatialVocabulary(layout.sparse_bins, tuple(map(tuple, spatial_merges))) + self.temporal_merges = tuple( + tuple(_integer(v, "temporal merge value") for v in m) for m in temporal_merges + ) + self.tables = TokenTables([int(s) for s in self.spatial.support], layout.e_dim, lookahead) + self._rank = {} + for rank, (left, right, offset) in enumerate(self.temporal_merges): + if max(left, right) >= len(self.tables): + raise ValueError("a temporal merge must reference already-created tokens") + self.tables.add_merge(left, right, offset) + if self._rank.setdefault(rule_key(left, right, offset), rank) != rank: + raise ValueError("duplicate temporal rule") + self._native = None + + @property + def vocab_size(self) -> int: + return len(self.tables) + + def __getstate__(self): + + return {**vars(self), "_native": None} + + def _codec(self): + constructor = native_kernel("SparseCodec") + if constructor is not None and self._native is None: + self._native = constructor( + list(self.layout.bins), + self.layout.native_zero, + [tuple(m) for m in self.spatial.merges], + self.lookahead, + list(self.temporal_merges), + ) + return self._native if constructor is not None else None + + def _cells(self, cells) -> np.ndarray: + values = np.asarray(cells) + if values.ndim != 3 or values.shape[0] < 1 or values.shape[1] < 1: + raise ValueError("cells must have shape (B, T, D) with B, T >= 1") + if values.shape[2] != self.layout.dims or values.dtype.kind not in "iu": + raise ValueError(f"cells must be integers with {self.layout.dims} slots") + if np.any(values < -1) or np.any(values >= np.asarray(self.layout.bins)): + raise ValueError("cell outside the primitive range") + return values + + def encode_batch(self, cells, *, backend: str = "auto", threads: int = 0) -> list[list[int]]: + """Encode independent dense chunks ``(B, T, D)`` (``-1`` = inactive) into token rows.""" + values = self._cells(cells) + if resolve_backend(backend) == "native" and self._codec() is not None: + return self._codec().encode_batch(np.asarray(values, dtype=np.int32), threads) + return [self._encode_reference(chunk) for chunk in values] + + def _encode_reference(self, cells: np.ndarray) -> list[int]: + sparse = self.layout.sparsify(cells) + state = Instances(self.tables, len(sparse) + self.lookahead, self.layout.dims + 1) + for t, row in enumerate(sparse): + if np.any(row >= 0): + for token in self.spatial.encode(row.tolist()): + state.add(int(token), t) + heap = [] + + def offer(i): + for a, b, off in state.partners(i, True): + rank = self._rank.get(rule_key(state.tok[a], state.tok[b], off)) + if rank is not None: + item = (rank, state.root[a], self.tables.rdim[state.tok[a]], state.root[b]) + heapq.heappush(heap, (*item, a, b, off)) + + for i in range(len(state.tok)): + offer(i) + while heap: + rank, *_, a, b, off = heapq.heappop(heap) + if not state.alive[a] or not state.alive[b] or not state.valid(a, b, off): + continue + root = state.root[a] + state.kill(a) + state.kill(b) + offer(state.add(self.tables.base + rank, root)) + return state.serialize() + + def decode_batch( + self, rows: Sequence[Sequence[int]], horizon: int, active: Sequence[bool] + ) -> np.ndarray: + """Token rows to dense cells ``(B, horizon, D)``; inactive slots are ``-1``.""" + if isinstance(horizon, bool) or not isinstance(horizon, int) or horizon < 1: + raise ValueError("horizon must be a positive integer") + flags = [bool(a) for a in active] + if len(flags) != self.layout.dims: + raise ValueError(f"active must have {self.layout.dims} flags") + checked = [] + for row in rows: + if any( + isinstance(t, (bool, np.bool_)) + or not isinstance(t, Integral) + or not 0 <= t < self.vocab_size + for t in row + ): + raise ValueError("token ids must be integers within the sparse vocabulary") + checked.append([int(t) for t in row]) + codec = self._codec() + if codec is not None: + return np.asarray(codec.decode_batch(checked, horizon, flags), dtype=np.int64) + out = np.empty((len(checked), horizon, self.layout.dims), dtype=np.int64) + for index, row in enumerate(checked): + out[index] = self.layout.densify(self._frames_reference(row, horizon, flags), flags) + return out + + def _frames_reference(self, row: Sequence[int], horizon: int, active) -> np.ndarray: + tb, e_bit = self.tables, 1 << self.layout.e_dim + allowed = e_bit | sum(1 << d for d, flag in enumerate(active) if flag) + cover = [0] * (horizon + self.lookahead) + sparse = np.full((horizon, self.layout.dims + 1), -1, dtype=np.int64) + front = 0 + for token in row: + if not 0 <= token < len(tb): + raise ValueError("token outside vocab") + if front >= horizon: + raise ValueError("token after the last open frame") + + own: dict[int, int] = {} + for offset, spatial in tb.patterns[token]: + u, mask = front + offset, int(self.spatial.support[spatial]) + if u >= horizon: + raise ValueError("token exceeds horizon") + if mask & ~allowed: + raise ValueError("token touches an inactive slot") + if own.get(u, 0) & mask: + raise ValueError("overlapping token supports") + if mask & e_bit and u == horizon - 1: + raise ValueError("end-of-frame atom on the last frame") + own[u] = own.get(u, 0) | mask + expansion = self.spatial.expansion[spatial] + sparse[u] = np.where(expansion >= 0, expansion, sparse[u]) + for u, mask in own.items(): + if cover[u] & mask: + raise ValueError("overlapping token supports") + if cover[u] & e_bit: + raise ValueError("token touches a closed frame") + cover[u] |= mask + while front < horizon and cover[front] & e_bit: + front += 1 + return sparse + + def to_dict(self) -> dict: + return { + "format": FORMAT, + "format_version": FORMAT_VERSION, + "layout": {"bins": list(self.layout.bins), "zero": list(self.layout.zero)}, + "lookahead": self.lookahead, + "spatial_merges": [list(m) for m in self.spatial.merges], + "temporal_merges": [list(m) for m in self.temporal_merges], + } + + @classmethod + def from_dict(cls, payload: dict) -> SparseVocabulary: + if payload.get("format") != FORMAT or payload.get("format_version") != FORMAT_VERSION: + raise ValueError(f"not an {FORMAT} v{FORMAT_VERSION} vocabulary") + layout = SparseLayout(tuple(payload["layout"]["bins"]), tuple(payload["layout"]["zero"])) + return cls( + layout, payload["spatial_merges"], payload["temporal_merges"], payload["lookahead"] + ) + + def save_pretrained(self, directory: str | Path) -> Path: + path = Path(directory) / SPARSE_BPE_NAME + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(self.to_dict(), separators=(",", ":")) + "\n", encoding="utf-8") + return path + + @classmethod + def from_pretrained(cls, directory: str | Path) -> SparseVocabulary: + path = Path(directory) / SPARSE_BPE_NAME + return cls.from_dict(json.loads(path.read_text(encoding="utf-8"))) diff --git a/runtime/backends/actioncodec2/stats.py b/runtime/backends/actioncodec2/stats.py new file mode 100644 index 0000000000000000000000000000000000000000..d2b49d70b50ab68a3dd490c712caa8eba4205c54 --- /dev/null +++ b/runtime/backends/actioncodec2/stats.py @@ -0,0 +1,212 @@ +"""Streaming corpus statistics for first- and second-order primitive design.""" + +from __future__ import annotations + +import json +from collections.abc import Iterable, Sequence +from dataclasses import asdict, dataclass +from pathlib import Path + +import numpy as np + +from .boundary import source_differences +from .configuration import ActionCodec2Config +from .trajectory import TrajectoryLike, prepare_trajectory + +__all__ = [ + "DEFAULT_QUANTILES", + "AxisStatistics", + "CorpusStatistics", + "analyze_trajectories", +] + +DEFAULT_QUANTILES = (0.001, 0.01, 0.5, 0.99, 0.999) + + +class _StreamingAxis: + + + def __init__(self, sample_size: int, rng: np.random.Generator) -> None: + self.sample_size = sample_size + self.rng = rng + self.count = 0 + self.minimum = np.inf + self.maximum = -np.inf + self.mean = 0.0 + self.m2 = 0.0 + self.sample = np.empty(0, dtype=np.float32) + self.priority = np.empty(0, dtype=np.float64) + + def update(self, raw: np.ndarray) -> None: + values = np.asarray(raw, dtype=np.float32).reshape(-1) + if not len(values): + return + batch_count = len(values) + batch_mean = float(values.mean(dtype=np.float64)) + batch_m2 = float(np.square(values.astype(np.float64) - batch_mean).sum()) + total = self.count + batch_count + delta = batch_mean - self.mean + self.mean += delta * batch_count / total + self.m2 += batch_m2 + delta * delta * self.count * batch_count / total + self.count = total + self.minimum = min(self.minimum, float(values.min())) + self.maximum = max(self.maximum, float(values.max())) + + priority = self.rng.random(batch_count) + candidates = np.concatenate((self.sample, values)) + candidate_priority = np.concatenate((self.priority, priority)) + if len(candidates) > self.sample_size: + keep = np.argpartition(candidate_priority, self.sample_size - 1)[: self.sample_size] + candidates = candidates[keep] + candidate_priority = candidate_priority[keep] + self.sample = candidates + self.priority = candidate_priority + + def finish(self, quantiles: Sequence[float]) -> AxisStatistics: + if self.count == 0: + return AxisStatistics(0, None, None, None, None, {}, {}) + signed = np.quantile(self.sample, quantiles) + absolute = np.quantile(np.abs(self.sample), quantiles) + return AxisStatistics( + samples=self.count, + minimum=self.minimum, + maximum=self.maximum, + mean=self.mean, + std=float(np.sqrt(self.m2 / self.count)), + quantiles={f"{q:g}": float(value) for q, value in zip(quantiles, signed, strict=True)}, + absolute_quantiles={ + f"{q:g}": float(value) for q, value in zip(quantiles, absolute, strict=True) + }, + ) + + +@dataclass(frozen=True) +class AxisStatistics: + """Statistics for one global codebook coordinate at one signal order.""" + + samples: int + minimum: float | None + maximum: float | None + mean: float | None + std: float | None + quantiles: dict[str, float] + absolute_quantiles: dict[str, float] + + +@dataclass(frozen=True) +class CorpusStatistics: + """Per-axis input, first-difference and optional second-difference measurements.""" + + dimension: int + episodes: int + frames: int + active_values: int + binary_dims: list[int] + trajectory_arities: dict[str, int] + origin_max_abs: list[float | None] + order_0: list[AxisStatistics] + order_1: list[AxisStatistics] + quantiles: list[float] + quantile_sample_size: int + order_2: list[AxisStatistics] | None = None + + def to_dict(self) -> dict[str, object]: + payload = asdict(self) + payload["schema"] = "actioncodec2_first_order_statistics/1" + if self.order_2 is None: + payload.pop("order_2") + else: + payload["schema"] = "actioncodec2_differential_statistics/2" + return payload + + def save(self, path: str | Path) -> None: + destination = Path(path) + destination.parent.mkdir(parents=True, exist_ok=True) + destination.write_text(json.dumps(self.to_dict(), indent=2) + "\n", encoding="utf-8") + + +def _validate_options( + dimension: int, + binary_dims: Sequence[int], + quantiles: Sequence[float], + sample_size: int, +) -> tuple[set[int], tuple[float, ...]]: + if dimension < 1: + raise ValueError("dimension must be positive") + binary = {int(value) for value in binary_dims} + if any(value < 0 or value >= dimension for value in binary): + raise ValueError("binary_dims contains a dimension outside the codebook") + checked_quantiles = tuple(float(value) for value in quantiles) + if not checked_quantiles or any(not 0.0 <= value <= 1.0 for value in checked_quantiles): + raise ValueError("quantiles must contain values in [0, 1]") + if sample_size < 1: + raise ValueError("quantile_sample_size must be positive") + return binary, checked_quantiles + + +def analyze_trajectories( + trajectories: Iterable[TrajectoryLike], + *, + dimension: int, + binary_dims: Sequence[int] = (), + quantiles: Sequence[float] = DEFAULT_QUANTILES, + quantile_sample_size: int = 1_000_000, + seed: int = 0, + config: ActionCodec2Config | None = None, +) -> CorpusStatistics: + 'Measure variable-width canonical absolute trajectories in one pass.' + binary, checked_quantiles = _validate_options( + dimension, binary_dims, quantiles, quantile_sample_size + ) + rng = np.random.default_rng(seed) + order_0 = [_StreamingAxis(quantile_sample_size, rng) for _ in range(dimension)] + order_1 = [_StreamingAxis(quantile_sample_size, rng) for _ in range(dimension)] + order_2 = ( + None + if config is None + else [_StreamingAxis(quantile_sample_size, rng) for _ in range(dimension)] + ) + if config is not None and config.physical.input_dim != dimension: + raise ValueError("statistics dimension must match config.physical.input_dim") + origin = np.full(dimension, -np.inf, dtype=np.float64) + arities: dict[int, int] = {} + episodes = frames = active_values = 0 + + for index, raw in enumerate(trajectories): + values, active_dims = prepare_trajectory( + raw, dimension=dimension, index=index, dtype=np.float32 + ) + episodes += 1 + frames += len(values) + active_values += values.size + arities[len(active_dims)] = arities.get(len(active_dims), 0) + 1 + for local, global_dim in enumerate(active_dims): + axis = values[:, local] + order_0[global_dim].update(axis) + origin[global_dim] = max(origin[global_dim], abs(float(axis[0]))) + if global_dim not in binary and config is None: + delta = np.diff(axis, prepend=np.float32(0.0)) + order_1[global_dim].update(delta) + if config is not None: + for dims, first, second in source_differences(raw, config).values(): + for local, global_dim in enumerate(dims): + if global_dim not in binary: + order_1[global_dim].update(first[:, local]) + order_2[global_dim].update(second[:, local]) + + if episodes == 0: + raise ValueError("statistics require at least one complete trajectory") + return CorpusStatistics( + dimension=dimension, + episodes=episodes, + frames=frames, + active_values=active_values, + binary_dims=sorted(binary), + trajectory_arities={str(key): value for key, value in sorted(arities.items())}, + origin_max_abs=[None if value == -np.inf else float(value) for value in origin], + order_0=[axis.finish(checked_quantiles) for axis in order_0], + order_1=[axis.finish(checked_quantiles) for axis in order_1], + quantiles=list(checked_quantiles), + quantile_sample_size=quantile_sample_size, + order_2=None if order_2 is None else [axis.finish(checked_quantiles) for axis in order_2], + ) diff --git a/runtime/training/training.py b/runtime/backends/actioncodec2/training.py similarity index 88% rename from runtime/training/training.py rename to runtime/backends/actioncodec2/training.py index 594a8c3d4490eb822c6c9b41a1f22b5ad0dbb025..d8fb03dbc824568ebf46e1f39c457f33a8f1f4eb 100644 --- a/runtime/training/training.py +++ b/runtime/backends/actioncodec2/training.py @@ -1,4 +1,4 @@ -"Whole-trajectory primitive construction and BPE fitting." +'Whole-trajectory primitive construction and BPE fitting.' from __future__ import annotations @@ -10,26 +10,20 @@ from collections.abc import Iterable, Sequence import numpy as np -from ..common._validation import broadcast_vector -from ..tokenization.bpe import BPESerializer, SetBPESerializer -from ..tokenization.bpe_training import train_bpe -from ..physical.configuration import ActionCodec2Config, ConfigError -from ..physical.physical_codec import PhysicalCodec -from ..physical.physical_processor import ActionCodec2Processor -from ..physical.primitives import PrimitiveStore -from ..tokenization.setbpe_spatial import aggregate_records -from ..tokenization.setbpe_spatial_training import train_spatial -from ..tokenization.setbpe_temporal_training import train_temporal -from ..physical.trajectory import ( - TrajectoryLike, - prepare_trajectory, - trajectory_boundary, -) - - -def _zero_anchored_grid( - lower: np.float32, upper: np.float32, spacing: np.float32 -) -> np.ndarray: +from ._validation import broadcast_vector +from .bpe import BPESerializer, SetBPESerializer +from .bpe_training import train_bpe +from .configuration import ActionCodec2Config, ConfigError +from .physical_codec import PhysicalCodec +from .primitives import PrimitiveStore +from .processor import ActionCodec2Processor +from .setbpe.spatial import aggregate_records +from .setbpe.spatial_training import train_spatial +from .setbpe.temporal_training import train_temporal +from .trajectory import TrajectoryLike, prepare_trajectory, trajectory_boundary + + +def _zero_anchored_grid(lower: np.float32, upper: np.float32, spacing: np.float32) -> np.ndarray: below = int(np.ceil(-lower / spacing)) above = int(np.ceil(upper / spacing)) @@ -57,7 +51,7 @@ def _additive_axis( def build_primitives(config: ActionCodec2Config) -> PrimitiveStore: - "Derive primitive arrays and force an exact zero on every axis." + 'Derive primitive arrays and force an exact zero on every axis.' if config.train is None: raise ConfigError("config.train is required to build primitives") output: list[np.ndarray | None] = [None] * config.physical.input_dim @@ -93,9 +87,7 @@ def build_primitives(config: ActionCodec2Config) -> PrimitiveStore: else: domain = component.constraints[f"order_{component.primitive_order}"] radius_dtype = ( - np.float64 - if component.representation == "rotation_vector" - else np.float32 + np.float64 if component.representation == "rotation_vector" else np.float32 ) lower = broadcast_vector( domain.minimum, width, dtype=np.dtype(radius_dtype), name="minimum" @@ -124,9 +116,7 @@ def build_primitives(config: ActionCodec2Config) -> PrimitiveStore: for dimension, axis in zip(component.dims, axes, strict=True): output[dimension] = axis if any(axis is None for axis in output): - raise RuntimeError( - "internal error: primitive construction left an unassigned dimension" - ) + raise RuntimeError("internal error: primitive construction left an unassigned dimension") store = PrimitiveStore([axis for axis in output if axis is not None]) missing_zero = [ dimension @@ -148,9 +138,7 @@ def _validate_component_support( for name, component in config.physical.components.items(): present = active.intersection(component.dims) if component.space == "so3" and present and present != set(component.dims): - raise ValueError( - f"trajectory {index} activates only part of SO(3) component {name!r}" - ) + raise ValueError(f"trajectory {index} activates only part of SO(3) component {name!r}") def _length_buckets( @@ -252,9 +240,7 @@ def _quantize_pending_batch( for local, index in enumerate(indices): item_length = len(pending[index][0]) dense = np.full((item_length, dimension), -1, dtype=cell_dtype) - dense[:, active_by_item[local]] = encoded[local][ - :item_length, active_by_item[local] - ] + dense[:, active_by_item[local]] = encoded[local][:item_length, active_by_item[local]] result[index] = dense if any(value is None for value in result): raise RuntimeError("internal error: trajectory batch was not fully quantized") @@ -299,9 +285,7 @@ def _quantize_trajectories( ) cell_chunks.append(chunk) retained_cell_bytes = projected - offset_chunks.append( - np.concatenate(([0], np.cumsum(cell_lengths, dtype=np.int64))) - ) + offset_chunks.append(np.concatenate(([0], np.cumsum(cell_lengths, dtype=np.int64)))) cell_parts.clear() cell_lengths.clear() chunk_actions = 0 @@ -319,19 +303,13 @@ def _quantize_trajectories( dimension=physical.config.physical.input_dim, dtype=np.float32, ) - _validate_component_support( - active_dims, physical.config, index=source_index - ) + _validate_component_support(active_dims, physical.config, index=source_index) source_index += 1 action_count += len(trajectory) active_value_count += len(trajectory) * len(active_dims) arity_counts[len(active_dims)] += 1 pending.append( - ( - trajectory, - active_dims, - trajectory_boundary(raw, physical.config, active_dims), - ) + (trajectory, active_dims, trajectory_boundary(raw, physical.config, active_dims)) ) if not pending: break @@ -386,9 +364,7 @@ def _aggregate_trajectory_records( flush() keys = sorted(counts_by_row) records = np.frombuffer(b"".join(keys), dtype=np.int32).reshape(-1, dimension) - weights = np.fromiter( - (counts_by_row[key] for key in keys), dtype=np.int64, count=len(keys) - ) + weights = np.fromiter((counts_by_row[key] for key in keys), dtype=np.int64, count=len(keys)) return records, weights @@ -537,14 +513,7 @@ def _fit_set_bpe( spatial_merges=spatial.merges, temporal_merges=vocabulary.merges, ) - return ( - serializer, - spatial_report, - temporal_report, - len(records), - aggregated, - spatial_done, - ) + return serializer, spatial_report, temporal_report, len(records), aggregated, spatial_done def _fit_bpe( @@ -577,11 +546,11 @@ def _fit_bpe( return serializer, {}, report, 0, started, started -def _validate_fit_options( - config: ActionCodec2Config, max_cell_bytes: int | None -) -> None: +def _validate_fit_options(config: ActionCodec2Config, max_cell_bytes: int | None) -> None: if config.train is None: raise ConfigError("config.train is required for fitting") + if config.set_bpe.scheme == "sparse_set_bpe": + raise ConfigError("sparse_set_bpe profiles are fitted by ActionCodec2Sparse") if max_cell_bytes is not None and ( isinstance(max_cell_bytes, bool) or not isinstance(max_cell_bytes, int) @@ -604,7 +573,7 @@ def _validate_fit_options( class ProfileTrainer: - "Internal whole-trajectory fitter for one physical profile." + 'Internal whole-trajectory fitter for one physical profile.' def __init__(self, config: ActionCodec2Config) -> None: self.config = config @@ -619,7 +588,7 @@ class ProfileTrainer: progress: bool = False, max_cell_bytes: int | None = None, ) -> tuple[ActionCodec2Processor, dict[str, object]]: - "Fit primitives and the configured tokenization scheme on whole trajectories." + 'Fit primitives and the configured tokenization scheme on whole trajectories.' config = self.config _validate_fit_options(config, max_cell_bytes) started = time.perf_counter() @@ -644,14 +613,20 @@ class ProfileTrainer: first_cell_dtype = str(cells[0].dtype) quantized = time.perf_counter() - if config.set_bpe.scheme == "bpe": + if config.set_bpe.scheme == "unified_set_bpe": + from .unified_set_bpe import fit_unified_set_bpe + + serializer, unified_report = fit_unified_set_bpe( + config, cells, threads=threads, backend=backend, progress=progress + ) + temporal_report = { + **unified_report["temporal"], + "tokens_per_action": unified_report["temporal"]["final_instances"] / actions, + } + fitted = serializer, {}, temporal_report, 0, quantized, quantized + elif config.set_bpe.scheme == "bpe": fitted = _fit_bpe( - cells, - config, - primitives, - backend=backend, - threads=threads, - progress=progress, + cells, config, primitives, backend=backend, threads=threads, progress=progress ) else: fitted = _fit_set_bpe( @@ -663,14 +638,9 @@ class ProfileTrainer: threads=threads, progress=progress, ) - ( - serializer, - spatial_report, - temporal_report, - unique_records, - aggregated, - spatial_done, - ) = fitted + serializer, spatial_report, temporal_report, unique_records, aggregated, spatial_done = ( + fitted + ) codec = ActionCodec2Processor(config, primitives, serializer) finished = time.perf_counter() diff --git a/runtime/physical/trajectory.py b/runtime/backends/actioncodec2/trajectory.py similarity index 80% rename from runtime/physical/trajectory.py rename to runtime/backends/actioncodec2/trajectory.py index 5c1404dc5b859390928b2cffaa07e407453ce2b0..01060aed8c1470bcae6f98c9d3ada7a74dfbf77c 100644 --- a/runtime/physical/trajectory.py +++ b/runtime/backends/actioncodec2/trajectory.py @@ -7,7 +7,7 @@ from dataclasses import dataclass import numpy as np -from ..common._validation import active_dimensions +from ._validation import active_dimensions from .configuration import ActionCodec2Config __all__ = ["ActiveTrajectory", "TrajectoryLike", "prepare_trajectory"] @@ -15,7 +15,7 @@ __all__ = ["ActiveTrajectory", "TrajectoryLike", "prepare_trajectory"] @dataclass(frozen=True) class ActiveTrajectory: - "One complete trajectory over an explicit subset of codebook dimensions." + """One complete trajectory over an explicit subset of codebook dimensions.""" values: np.ndarray active_dims: tuple[int, ...] @@ -36,12 +36,9 @@ class ActiveTrajectory: else np.asarray(previous_first_order, dtype=np.float32) ) if previous is not None and ( - previous.shape != (len(self.active_dims),) - or not np.all(np.isfinite(previous)) + previous.shape != (len(self.active_dims),) or not np.all(np.isfinite(previous)) ): - raise ValueError( - "previous_first_order must be finite with shape [D_active]" - ) + raise ValueError("previous_first_order must be finite with shape [D_active]") object.__setattr__(self, "previous_first_order", previous) @classmethod @@ -52,18 +49,12 @@ class ActiveTrajectory: active_dims: Sequence[int], previous_first_order: np.ndarray | None = None, ) -> ActiveTrajectory: - "Drop engineering-only dense padding before the semantic boundary." + """Drop engineering-only dense padding before the semantic boundary.""" array = np.asarray(values) dims = tuple(int(value) for value in active_dims) if array.ndim != 2 or not dims or min(dims) < 0 or max(dims) >= array.shape[1]: - raise ValueError( - "padded values and active_dims do not define a valid trajectory" - ) - previous = ( - None - if previous_first_order is None - else np.take(previous_first_order, dims) - ) + raise ValueError("padded values and active_dims do not define a valid trajectory") + previous = None if previous_first_order is None else np.take(previous_first_order, dims) return cls(np.take(array, dims, axis=1), dims, previous_first_order=previous) @@ -78,9 +69,7 @@ def trajectory_boundary( for c in config.physical.components.values() ) if previous is None and required: - raise ValueError( - "second-order trajectories require explicit previous_first_order" - ) + raise ValueError("second-order trajectories require explicit previous_first_order") if previous is None and not any( c.primitive_order == 2 for c in config.physical.components.values() ): @@ -101,7 +90,7 @@ def prepare_trajectory( index: int, dtype: np.dtype | type = np.float32, ) -> tuple[np.ndarray, tuple[int, ...]]: - "Validate a trajectory and return compact values plus global dimension ids." + """Validate a trajectory and return compact values plus global dimension ids.""" if isinstance(trajectory, ActiveTrajectory): raw = trajectory.values active_dims = trajectory.active_dims diff --git a/runtime/backends/actioncodec2/unified_set_bpe.py b/runtime/backends/actioncodec2/unified_set_bpe.py new file mode 100644 index 0000000000000000000000000000000000000000..b5e42c2ee14ecf4aed960234f00ca692f01beb1a --- /dev/null +++ b/runtime/backends/actioncodec2/unified_set_bpe.py @@ -0,0 +1,238 @@ +"""Dense single-stage spatial/temporal Set-BPE using AC2Sparse's merge trainer.""" + +from __future__ import annotations + +import json +from collections.abc import Sequence +from dataclasses import dataclass +from numbers import Integral +from pathlib import Path + +import numpy as np + +from ._validation import active_dimensions +from .bpe import BPE_NAME, _dense_cells, _read_payload, _rules +from .cache import BoundedCache +from .grammar import _PrefixGrammar +from .sparse.training import fit_sparse_vocabulary +from .sparse.vocabulary import SparseVocabulary + + +@dataclass(frozen=True) +class DenseSetLayout: + 'Keep every active physical cell and append an end-of-frame atom.' + + bins: tuple[int, ...] + dense = True + + @property + def dims(self): + return len(self.bins) + + @property + def e_dim(self): + return self.dims + + @property + def zero(self): + return (-2,) * self.dims + + @property + def native_zero(self): + return [-2] * self.dims + + @property + def sparse_bins(self): + return self.bins + (1,) + + def sparsify(self, cells): + cells = np.asarray(cells, dtype=np.int64) + if cells.ndim != 2 or cells.shape[1] != self.dims or not len(cells): + raise ValueError("cells must be a nonempty dense trajectory") + if np.any(cells < -1) or np.any(cells >= np.asarray(self.bins)): + raise ValueError("cell outside the primitive range") + if np.any((cells >= 0) != (cells[0] >= 0)) or not np.any(cells[0] >= 0): + raise ValueError("active slots must remain fixed and nonempty") + out = np.full((len(cells), self.dims + 1), -1, dtype=np.int64) + out[:, : self.dims] = cells + out[:-1, self.dims] = 0 + return out + + def densify(self, frames, active): + cells = np.asarray(frames, dtype=np.int64)[:, : self.dims].copy() + flags = np.asarray(active, dtype=bool) + if np.any(cells[:, flags] < 0) or np.any(cells[:, ~flags] >= 0): + raise ValueError("dense stream is missing an active cell") + return cells + + +class UnifiedSetBPESerializer: + 'Single-stage Set-BPE over complete physical cells and frame markers.' + + scheme = "unified_set_bpe" + + def __init__(self, *, bins: Sequence[int], lookahead: int, merges): + self.bins = tuple(int(v) for v in bins) + self.lookahead = int(lookahead) + self.merges = _rules(merges, 3, "merges") + self.layout = DenseSetLayout(self.bins) + self.vocabulary = SparseVocabulary(self.layout, (), self.merges, self.lookahead) + self.vocab_size = self.vocabulary.vocab_size + physical_mask = (1 << len(self.bins)) - 1 + self.token_cell_counts = np.asarray( + [ + sum((int(mask) & physical_mask).bit_count() for mask in masks) + for masks in self.vocabulary.tables.masks + ], + dtype=np.int64, + ) + + def configure_encoding(self, *, spatial_search=False, temporal_search=False, **kwargs): + if spatial_search or temporal_search: + raise ValueError("packing search is not available for unified Set-BPE") + return self + + def encode_batch(self, cells, *, active_dims=None): + dense, _ = _dense_cells(np.asarray(cells), self.bins, active_dims, ndim=3) + return self.vocabulary.encode_batch(dense) + + def encode(self, cells, *, active_dims=None): + dense, _ = _dense_cells(np.asarray(cells), self.bins, active_dims) + return self.vocabulary.encode_batch(dense[None])[0] + + def decode_batch(self, streams, *, active_dims=None): + dims = active_dimensions(active_dims, len(self.bins)) + rows, horizons = [], [] + for row in streams: + checked = [] + for token in row: + if ( + isinstance(token, bool) + or not isinstance(token, Integral) + or not 0 <= int(token) < self.vocab_size + ): + raise ValueError("token outside vocabulary") + checked.append(int(token)) + count = sum(int(self.token_cell_counts[token]) for token in checked) + horizon, remainder = divmod(count, len(dims)) + if not checked or not horizon or remainder: + raise ValueError("incomplete unified Set-BPE stream") + rows.append(checked) + horizons.append(horizon) + if not rows or len(set(horizons)) != 1: + raise ValueError("streams must have the same nonempty horizon") + flags = [d in dims for d in range(len(self.bins))] + return self.vocabulary.decode_batch(rows, horizons[0], flags) + + def decode(self, tokens, *, active_dims=None): + return self.decode_batch([tokens], active_dims=active_dims)[0] + + def to_dict(self): + return {"merges": [list(rule) for rule in self.merges]} + + @classmethod + def from_pretrained(cls, directory: str | Path, *, bins, lookahead): + payload = _read_payload(directory) + if set(payload) != {"merges"}: + raise ValueError("unified bpe.json requires exactly merges") + return cls(bins=bins, lookahead=lookahead, merges=payload["merges"]) + + def save_pretrained(self, directory: str | Path): + path = Path(directory) / BPE_NAME + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(self.to_dict(), indent=2) + "\n", encoding="utf-8") + return path + + +class UnifiedSetBPEGrammar(_PrefixGrammar): + 'Dense frame-coverage grammar for unified Set-BPE.' + + def __init__(self, serializer, *, horizon, active_dims=None): + if isinstance(horizon, bool) or not isinstance(horizon, int) or horizon < 1: + raise ValueError("horizon must be positive") + self.horizon, self.vocab_size = horizon, serializer.vocab_size + dims = active_dimensions(active_dims, len(serializer.bins)) + self._full = sum(1 << d for d in dims) + self._e_bit = 1 << len(serializer.bins) + self._e_atom = sum(serializer.bins) + self._patterns = serializer.vocabulary.tables.masks + self._lookahead = serializer.lookahead + self._state_cache, self._mask_cache = BoundedCache(256), BoundedCache(64) + self._empty_state = self._initial_state() + self._native = None + + def _compiled(self): + return None + + def _initial_state(self): + return (0,) * self.horizon + + def _covered_steps(self, state): + for index, mask in enumerate(state): + needed = self._full | (self._e_bit if index < self.horizon - 1 else 0) + if mask != needed: + return index + return self.horizon + + def _state_is_complete(self, state): + return self._covered_steps(state) == self.horizon + + def _advance(self, state, token): + if not 0 <= token < self.vocab_size: + return None + front = self._covered_steps(state) + if front == self.horizon: + return None + masks = self._patterns[token] + if front + len(masks) > self.horizon: + return None + updated = list(state) + allowed = self._full | self._e_bit + for offset, mask in enumerate(masks): + mask = int(mask) + if not mask: + continue + index = front + offset + if mask & ~allowed or mask & updated[index] or updated[index] & self._e_bit: + return None + if index == self.horizon - 1 and mask & self._e_bit: + return None + updated[index] |= mask + if mask & self._e_bit and updated[index] & self._full != self._full: + return None + return tuple(updated) + + def _python_mask(self, state): + return np.asarray( + [self._advance(state, token) is not None for token in range(self.vocab_size)] + ) + + def completion_token(self, state, zero_cells, bins): + front = self._covered_steps(state) + missing = self._full & ~state[front] + if not missing: + return self._e_atom + dim = (missing & -missing).bit_length() - 1 + return sum(bins[:dim]) + int(zero_cells[dim]) + + +def fit_unified_set_bpe(config, cells, *, threads, backend="native", progress=True): + """Fit AC2Sparse's one-stage Set-BPE on complete dense-cell chunks.""" + from .training import build_primitives + + primitives = build_primitives(config) + layout = DenseSetLayout(tuple(primitives.bins)) + vocab, report = fit_sparse_vocabulary( + layout, + cells, + spatial_vocab_size=sum(layout.sparse_bins), + vocab_size=config.train.bpe.vocab_size, + lookahead=config.set_bpe.lookahead, + backend=backend, + threads=threads, + progress=progress, + ) + serializer = UnifiedSetBPESerializer( + bins=primitives.bins, lookahead=config.set_bpe.lookahead, merges=vocab.temporal_merges + ) + return serializer, report diff --git a/runtime/hub_entry.py b/runtime/catalog.py similarity index 80% rename from runtime/hub_entry.py rename to runtime/catalog.py index 94759ec53383d7b0c4c8ac1edff59c24a4d0a7d8..92a90d2012e5415118399d8374ef642a6fae4749 100644 --- a/runtime/hub_entry.py +++ b/runtime/catalog.py @@ -21,11 +21,15 @@ SHARED_PATTERNS = ( def asset_inventory(directory: Path) -> dict[str, str]: """Hash the complete configuration and fitted assets for one variant.""" - names = ["router_config.yaml", "config.json", "processor_config.json"] + sparse = (directory / "sparse_router_config.yaml").is_file() + names = ["sparse_router_config.yaml" if sparse else "router_config.yaml", "config.json", "processor_config.json"] profiles = [name for name in ("eef", "joint") if (directory / "profiles" / name).is_dir()] if not profiles: raise ValueError("variant has no fitted profiles") - names.extend(f"profiles/{profile}/{name}" for profile in profiles for name in PROFILE_FILES) + names.extend(f"profiles/{profile}/{name}" for profile in profiles + for name in (tuple("sparse_bpe.json" if n == "bpe.json" else n for n in PROFILE_FILES) if sparse else PROFILE_FILES)) + names.extend(f"profiles/{profile}/preprocessing.json" for profile in profiles + if (directory / "profiles" / profile / "preprocessing.json").is_file()) return {name: hashlib.sha256((directory / name).read_bytes()).hexdigest() for name in sorted(names)} @@ -62,11 +66,12 @@ class _VariantBinding: def save_pretrained(self, save_directory, push_to_hub=False, **kwargs): directory = Path(save_directory) + include_training_report = kwargs.pop("include_training_report", False) if (directory / "variants.json").is_file(): raise ValueError("save a selected variant to a separate directory, outside the catalog root") if not push_to_hub and kwargs: raise TypeError(f"unused save_pretrained keyword(s): {', '.join(sorted(kwargs))}") - files = super().save_pretrained(directory) + files = super().save_pretrained(directory, include_training_report=include_training_report) inventory = asset_inventory(directory) manifest = directory / "artifact_manifest.json" manifest.write_text(json.dumps({ @@ -77,10 +82,8 @@ class _VariantBinding: }, indent=2) + "\n", encoding="utf-8") files.append(str(manifest)) if push_to_hub: - package = type(self.action_tokenizer).__module__.split(".routing.", 1)[0] - importlib.import_module(f"{package}.integration.hf").upload_pretrained_directory( - directory, **kwargs - ) + package = type(self).__module__.split(".frontend.", 1)[0] + importlib.import_module(f"{package}.backends.actioncodec2.hf").upload_pretrained_directory(directory, **kwargs) return files @@ -169,7 +172,7 @@ class ActionCodec2: root = Path(snapshot_download( str(pretrained_model_name_or_path), allow_patterns=[*SHARED_PATTERNS, "router_config.yaml", "profiles/**", - "artifact_manifest.json"], **kwargs, + "sparse_router_config.yaml", "artifact_manifest.json"], **kwargs, )) directory = root manifest = root / "artifact_manifest.json" @@ -185,33 +188,28 @@ class ActionCodec2: if variant_fingerprint is not None and variant_fingerprint != origin.get("fingerprint"): raise ValueError("variant fingerprint differs from the tokenizer bound to this policy") - runtime = root / "runtime" - package_file = runtime / "__init__.py" - if not package_file.is_file(): - raise FileNotFoundError(f"ActionCodec2 runtime is missing from {root}") - identity = hashlib.sha256(str(runtime.resolve()).encode()).hexdigest()[:16] - package_name = f"_actioncodec2_artifact_{identity}" - if package_name not in sys.modules: - spec = importlib.util.spec_from_file_location( - package_name, package_file, submodule_search_locations=[str(runtime)] - ) - if spec is None or spec.loader is None: - raise ImportError(f"cannot load ActionCodec2 runtime from {runtime}") - package = importlib.util.module_from_spec(spec) - sys.modules[package_name] = package - try: + family = "actioncodec2_sparse" if (directory / "sparse_router_config.yaml").is_file() else "actioncodec2" + if __package__ == "actioncodec2.core": + package_name = __package__ + else: + runtime = root / "runtime" + package_file = runtime / "__init__.py" + if not package_file.is_file(): + raise FileNotFoundError(f"ActionCodec2 runtime is missing from {root}") + identity = hashlib.sha256(str(runtime.resolve()).encode()).hexdigest()[:16] + package_name = f"_actioncodec2_artifact_{identity}" + if package_name not in sys.modules: + spec = importlib.util.spec_from_file_location( + package_name, package_file, submodule_search_locations=[str(runtime)] + ) + package = importlib.util.module_from_spec(spec) + sys.modules[package_name] = package spec.loader.exec_module(package) - except BaseException: - del sys.modules[package_name] - raise - processor = importlib.import_module(f"{package_name}.processing_actioncodec2") - if (runtime / "hub_acceleration.py").is_file(): - acceleration = importlib.import_module(f"{package_name}.hub_acceleration") - acceleration.install(package_name) + processor = importlib.import_module(f"{package_name}.frontend.{family}.processor") + base = processor.ActionCodec2Sparse if family == "actioncodec2_sparse" else processor.ActionCodec2 if not hasattr(processor, "_catalog_processor_class"): processor._catalog_processor_class = type( - "ActionCodec2", (_VariantBinding, processor.ActionCodec2), - {"__module__": processor.__name__}, + base.__name__, (_VariantBinding, base), {"__module__": processor.__name__} ) codec = processor._catalog_processor_class.from_pretrained(directory, action_space=action_space) codec._variant_origin = origin diff --git a/runtime/common/__init__.py b/runtime/common/__init__.py deleted file mode 100644 index 2c5964e8bf7ff68dc273e84ba3ef3b4d4c454a45..0000000000000000000000000000000000000000 --- a/runtime/common/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Internal common components for ActionCodec2.""" diff --git a/runtime/common/_frontend_base.py b/runtime/common/_frontend_base.py deleted file mode 100644 index 9b9b97a15b290425d2b820bdd92bd10c3812914b..0000000000000000000000000000000000000000 --- a/runtime/common/_frontend_base.py +++ /dev/null @@ -1,94 +0,0 @@ -"""ActionCodec2-only tensor and token-row validation helpers.""" - -from __future__ import annotations - -from collections.abc import Sequence - -import numpy as np -import torch - -from ._types import ActionIdxBatch, TokenIds - - -class BaseActionTokenizer: - """Shared action tensor methods, without policy-specific sentinels.""" - - @property - def new_action_tokens(self) -> list[str]: - """Token strings in id order — downstream registers these into its VLM vocab.""" - return list(self._new_action_tokens) - - def to_token_strs(self, token_ids: TokenIds) -> list[str]: - "Render one id row as its token strings, e.g. ```` / ````." - row = self._to_id_row(token_ids).tolist() - n = len(self._new_action_tokens) - bad = [i for i in row if not 0 <= i < n] - if bad: - raise ValueError(f"token ids {bad[:5]} out of range [0, {n})") - return [self._new_action_tokens[i] for i in row] - - def _check_encode_kwargs(self, encode_kwargs: dict | None) -> dict: - - kw = dict(encode_kwargs or {}) - unknown = sorted(set(kw) - self.encode_kwargs) - if unknown: - raise ValueError( - f"{type(self).__name__} does not consume encode_kwargs {unknown}; it declares {sorted(self.encode_kwargs)}" - ) - return kw - - @staticmethod - def _to_id_row(token_ids: TokenIds) -> torch.Tensor: - - if isinstance(token_ids, torch.Tensor): - row = token_ids.detach().cpu() - if ( - row.dtype == torch.bool - or row.dtype.is_floating_point - or row.dtype.is_complex - ): - raise ValueError("token ids must be integers") - row = row.to(torch.long) - else: - values = np.asarray(token_ids) - if values.dtype.kind not in {"i", "u"}: - raise ValueError("token ids must be integers") - row = torch.from_numpy(np.asarray(values, dtype=np.int64)) - if row.ndim != 1: - raise ValueError(f"token id row must be 1D, got {tuple(row.shape)}") - return row - - def _checked_decode_row(self, token_ids: TokenIds) -> torch.Tensor: - - row = self._to_id_row(token_ids) - invalid = (row < 0) | (row >= int(self._action_vocab_size)) - if torch.any(invalid): - bad = row[invalid][:5].tolist() - raise ValueError( - f"token ids {bad} out of range [0, {int(self._action_vocab_size)})" - ) - return row - - def _decode_token_ids_to_actions_batch( - self, - action_token_ids: Sequence[TokenIds], - *, - time_horizon: int | None = None, - action_dim: int | None = None, - decode_kwargs: dict | None = None, - ) -> torch.Tensor: - - batch_action_idx: ActionIdxBatch = [ - self._checked_decode_row(a).tolist() for a in action_token_ids - ] - (actions_np, _) = self._decode_action_indices( - batch_action_idx, - time_horizon=time_horizon, - action_dim=action_dim, - decode_kwargs=decode_kwargs, - ) - return torch.from_numpy(actions_np) - - @property - def vocab_size(self) -> int: - return int(self._action_vocab_size) diff --git a/runtime/exporting.py b/runtime/exporting.py new file mode 100644 index 0000000000000000000000000000000000000000..0c7e42543fcf9bd15869be7153cee4e6fb01acc6 --- /dev/null +++ b/runtime/exporting.py @@ -0,0 +1,52 @@ +"""Export the same shared runtime used by both installed tokenizers.""" +from __future__ import annotations + +import json +from pathlib import Path +import shutil + + +def save_runtime(directory: str | Path) -> list[str]: + """Bundle portable code and AutoProcessor metadata beside fitted assets.""" + root = Path(directory) + source = Path(__file__).absolute().parent + destination = root / 'runtime' + if destination.resolve() != source: + if destination.exists(): + shutil.rmtree(destination) + shutil.copytree(source, destination, ignore=shutil.ignore_patterns('__pycache__', '*.pyc', '*.so', 'native')) + entry = root / 'processing_actioncodec2.py' + entry.write_text((source / 'catalog.py').read_text(encoding='utf-8'), encoding='utf-8') + for name in ('config.json', 'processor_config.json'): + path = root / name + metadata = json.loads(path.read_text()) + metadata['auto_map'] = {'AutoProcessor': 'processing_actioncodec2.ActionCodec2'} + path.write_text(json.dumps(metadata, indent=2) + '\n') + + kernels = root / 'actioncodec2_kernels' + if kernels.exists(): + shutil.rmtree(kernels) + native_source = source / 'backends/actioncodec2/native' + if not native_source.is_dir(): + native_source = source.parent / 'actioncodec2_kernels' + shutil.copytree(native_source, kernels, + ignore=shutil.ignore_patterns('__pycache__', '*.so', '*.o')) + (kernels / '__init__.py').write_text('') + (root / 'setup.py').write_text('''import sys +from setuptools import setup +from pybind11.setup_helpers import Pybind11Extension, build_ext +from pathlib import Path +native = 'actioncodec2_kernels' +openmp = ['-fopenmp'] if sys.platform.startswith('linux') else [] +setup(name='actioncodec2-kernels', version='0.3.0', packages=['actioncodec2_kernels'], + ext_modules=[Pybind11Extension('actioncodec2_kernels._native', + sources=sorted(str(p) for p in Path(native).glob('*.cpp')), + include_dirs=[native], cxx_std=17, + extra_compile_args=['-O3', '-fvisibility=hidden', '-ffp-contract=off', *openmp], + extra_link_args=openmp)], cmdclass={'build_ext': build_ext}) +''') + (root / 'pyproject.toml').write_text('[build-system]\nrequires = ["setuptools>=77", "wheel", "pybind11>=2.12"]\nbuild-backend = "setuptools.build_meta"\n') + license_path = next((p / 'LICENSE' for p in source.parents if (p / 'LICENSE').is_file()), None) + if license_path is not None and license_path.resolve() != (root / 'LICENSE').resolve(): + shutil.copyfile(license_path, root / 'LICENSE') + return [str(entry), *map(str, destination.rglob('*.py'))] diff --git a/runtime/frontend/__init__.py b/runtime/frontend/__init__.py index 66788de9f88a4f53e82e6a93ac898bd709a4f573..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/runtime/frontend/__init__.py +++ b/runtime/frontend/__init__.py @@ -1 +0,0 @@ -"""Internal frontend components for ActionCodec2.""" diff --git a/runtime/common/_types.py b/runtime/frontend/_types.py similarity index 55% rename from runtime/common/_types.py rename to runtime/frontend/_types.py index 957a2446a646af50383079cabe5fc00380770737..765b65e4fb0022c6b133c8845a8cc5151a00d7aa 100644 --- a/runtime/common/_types.py +++ b/runtime/frontend/_types.py @@ -2,6 +2,8 @@ from __future__ import annotations +from typing import NamedTuple + import numpy as np import torch @@ -9,4 +11,9 @@ ActionIdxBatch = list[list[int]] TokenIds = list[int] | np.ndarray | torch.Tensor -__all__ = ["ActionIdxBatch", "TokenIds"] +class DecodeResult(NamedTuple): + action: torch.Tensor + absent_keys: set + + +__all__ = ["ActionIdxBatch", "TokenIds", "DecodeResult"] diff --git a/runtime/frontend/actioncodec2/__init__.py b/runtime/frontend/actioncodec2/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0a56988865eebf86e357c5dc75c7777c15a6f230 --- /dev/null +++ b/runtime/frontend/actioncodec2/__init__.py @@ -0,0 +1,13 @@ +"""Arbitrary-horizon frontend bound to one ActionCodec2 action space.""" + +from transformers import AutoConfig, AutoProcessor + +from ...backends.actioncodec2.hf import ActionCodec2FrontendHFConfig +from .generation import ActionCodec2LogitsProcessor +from .processor import ActionCodec2 +from .tokenizer import ActionCodec2Tokenizer + +AutoConfig.register(ActionCodec2.model_type, ActionCodec2FrontendHFConfig, exist_ok=True) +AutoProcessor.register(ActionCodec2FrontendHFConfig, ActionCodec2, exist_ok=True) + +__all__ = ["ActionCodec2", "ActionCodec2Tokenizer", "ActionCodec2LogitsProcessor"] diff --git a/runtime/tokenization/generation.py b/runtime/frontend/actioncodec2/generation.py similarity index 72% rename from runtime/tokenization/generation.py rename to runtime/frontend/actioncodec2/generation.py index 042b63e83768cf45a4457f65b7f32f64eb891fde..7899ac46f544bd463831ec9586902c454686f16d 100644 --- a/runtime/tokenization/generation.py +++ b/runtime/frontend/actioncodec2/generation.py @@ -5,22 +5,14 @@ from __future__ import annotations import torch from transformers import LogitsProcessor -from ..routing.cache import BoundedCache +from ...backends.actioncodec2.cache import BoundedCache class ActionCodec2LogitsProcessor(LogitsProcessor): - "Constrain generated action IDs, then allow EOS only at complete coverage." + 'Constrain generated action IDs, then allow EOS only at complete coverage.' def __init__( - self, - codec, - horizon, - *, - fps, - prompt_length, - eos_token_id, - token_offset=0, - pad_token_id=None, + self, codec, horizon, *, fps, prompt_length, eos_token_id, token_offset=0, pad_token_id=None ): for name, value in { "prompt_length": prompt_length, @@ -29,9 +21,7 @@ class ActionCodec2LogitsProcessor(LogitsProcessor): }.items(): if type(value) is not int or value < 0: raise ValueError(f"{name} must be a nonnegative integer") - if pad_token_id is not None and ( - type(pad_token_id) is not int or pad_token_id < 0 - ): + if pad_token_id is not None and (type(pad_token_id) is not int or pad_token_id < 0): raise ValueError("pad_token_id must be a nonnegative integer") self.grammar = codec.grammar(horizon, fps=fps) self.prompt_length = prompt_length @@ -49,9 +39,7 @@ class ActionCodec2LogitsProcessor(LogitsProcessor): if self.eos_token_id in row: end = row.index(self.eos_token_id) if any(t not in (self.eos_token_id, self.pad_token_id) for t in row[end:]): - raise ValueError( - "only EOS/padding may follow completed action generation" - ) + raise ValueError("only EOS/padding may follow completed action generation") tokens = [t - self.token_offset for t in row[:end]] if not self.grammar.is_complete(tokens): raise ValueError("EOS occurred before action coverage was complete") @@ -69,32 +57,20 @@ class ActionCodec2LogitsProcessor(LogitsProcessor): mask = self._mask_cache.get(key) if mask is None: mask = torch.zeros(scores.shape[-1], device=scores.device, dtype=torch.bool) - index, local = state + index, states = state if index == len(self.grammar.segments): mask[self.eos_token_id] = True else: segment = self.grammar.segments[index] - allowed = self.grammar._grammars[index]._next_token_mask_from_state( - local - ) + allowed = self.grammar._grammars[index]._next_token_mask_from_state(states[index]) start = self.token_offset + segment.profile.spec.token_offset - mask[start : start + len(allowed)] = torch.as_tensor( - allowed, device=scores.device - ) + mask[start : start + len(allowed)] = torch.as_tensor(allowed, device=scores.device) self._mask_cache[key] = mask return mask - def __call__( - self, input_ids: torch.LongTensor, scores: torch.FloatTensor - ) -> torch.FloatTensor: - if ( - input_ids.ndim != 2 - or scores.ndim != 2 - or input_ids.shape[0] != scores.shape[0] - ): - raise ValueError( - "expected input_ids(B,L) and scores(B,V) with the same batch size" - ) + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + if input_ids.ndim != 2 or scores.ndim != 2 or input_ids.shape[0] != scores.shape[0]: + raise ValueError("expected input_ids(B,L) and scores(B,V) with the same batch size") if input_ids.shape[1] < self.prompt_length: raise ValueError("prompt_length exceeds the supplied input length") required = max( @@ -103,18 +79,15 @@ class ActionCodec2LogitsProcessor(LogitsProcessor): 0 if self.pad_token_id is None else self.pad_token_id + 1, ) if scores.shape[1] < required: - raise ValueError( - "model vocabulary does not cover configured action/EOS/padding IDs" - ) + raise ValueError("model vocabulary does not cover configured action/EOS/padding IDs") + self.grammar.reserve_states(int(input_ids.shape[0])) rows = input_ids[:, self.prompt_length :].detach().cpu().tolist() output = scores.clone() groups = {} for index, row in enumerate(rows): groups.setdefault(self._state(row), []).append(index) for state, indices in groups.items(): - output[indices] = scores[indices].masked_fill( - ~self._mask(state, scores), -torch.inf - ) + output[indices] = scores[indices].masked_fill(~self._mask(state, scores), -torch.inf) if not torch.isfinite(output).any(dim=1).all(): raise ValueError( "all legal action logits were suppressed; check other generation processors" diff --git a/runtime/frontend/actioncodec2/loading.py b/runtime/frontend/actioncodec2/loading.py new file mode 100644 index 0000000000000000000000000000000000000000..83caa1e6f8a2112d8525809557cef214ed127820 --- /dev/null +++ b/runtime/frontend/actioncodec2/loading.py @@ -0,0 +1,6 @@ +"""Shared release loader bindings.""" +from functools import partial +from ..loading import load_release_router as _load, describe_release as _describe + +load_release_router = partial(_load, tokenizer='actioncodec2') +describe_release = partial(_describe, tokenizer='actioncodec2') diff --git a/runtime/processing_actioncodec2.py b/runtime/frontend/actioncodec2/processor.py similarity index 63% rename from runtime/processing_actioncodec2.py rename to runtime/frontend/actioncodec2/processor.py index e7b971d5b54a08123a13503905a38debcd7c6b2a..6233f744a37bc88b6120b6d3e523dc864a02cdd8 100644 --- a/runtime/processing_actioncodec2.py +++ b/runtime/frontend/actioncodec2/processor.py @@ -12,26 +12,34 @@ import torch from transformers.feature_extraction_utils import BatchFeature from transformers.processing_utils import ProcessorMixin -from .routing.defaults import CodecBuilder, ProfileBundleBuilder, builtin_action_spaces -from .integration.hf import ( +from ...backends.actioncodec2 import ActionCodec2Router, PresetConfig +from ...backends.actioncodec2.defaults import ( + CodecBuilder, + ProfileBundleBuilder, + builtin_action_spaces, +) +from ...backends.actioncodec2.hf import ( PROCESSOR_CONFIG_NAME, ROUTER_ALLOW_PATTERNS, + ROUTER_MANIFEST_PATTERNS, ActionCodec2FrontendHFConfig, resolve_pretrained_directory, save_huggingface_metadata, save_model_card, upload_pretrained_directory, ) -from .routing.presets import PresetConfig -from .routing.routing import ActionCodec2Router -from .frontend.tokenizer import ActionCodec2Tokenizer +from ...backends.actioncodec2.preprocessing import PreprocessingSpec +from ...backends.actioncodec2.release import MANIFEST_NAME +from ...exporting import save_runtime +from .loading import describe_release, load_release_router +from .tokenizer import ActionCodec2Tokenizer +from ..training import TrainingMixin +from ...backends.actioncodec2.training import ProfileTrainer -def _saved_metadata(directory: Path) -> dict[str, Any]: +def _saved_metadata(directory: Path) -> dict: metadata = directory / PROCESSOR_CONFIG_NAME - return ( - json.loads(metadata.read_text(encoding="utf-8")) if metadata.is_file() else {} - ) + return json.loads(metadata.read_text(encoding="utf-8")) if metadata.is_file() else {} def _fitted_status(profiles) -> str: @@ -39,9 +47,10 @@ def _fitted_status(profiles) -> str: return f"Fitted profiles: {status}\n" -class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): - "Action-space-bound processor with lossless token serialization." +class ActionCodec2(TrainingMixin, ActionCodec2Tokenizer, ProcessorMixin): + 'Action-space-bound processor with lossless token serialization.' + trainer_class = ProfileTrainer model_type = ActionCodec2FrontendHFConfig.model_type model_input_names = ["input_ids"] @@ -63,50 +72,26 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): bpe_scheme=bpe_scheme, profile_configs=profile_configs, ).build() - elif ( - primitive_order != 1 - or bpe_scheme is not None - or profile_configs is not None - ): - raise ValueError( - "profile construction options cannot accompany an existing backend" - ) + elif primitive_order != 1 or bpe_scheme is not None or profile_configs is not None: + raise ValueError("profile construction options cannot accompany an existing backend") super().__init__(backend, action_space=action_space) ProcessorMixin.__init__(self) self._fitted_profiles = frozenset() if fresh else frozenset(backend.profiles) self.training_report = None - self._source_directory = Path(__file__).parent + self.preprocessing: dict[str, PreprocessingSpec] = {} + self.release_metadata: dict[str, Any] | None = None def __dir__(self): inapplicable = { - "action_tokenizer", - "attributes", "audio_tokenizer", "chat_template", - "check_argument_for_proper_class", - "encode_kwargs", "feature_extractor_class", - "from_args_and_dict", - "get_possibly_dynamic_module", - "get_processor_dict", - "model_input_names", - "model_type", - "optional_attributes", - "optional_call_args", "apply_chat_template", "post_process_image_text_to_text", "pad_action_id", "bos_blk_id", "parts_meta", "BAR_SENTINEL_TOKENS", - "push_to_hub", - "register_for_auto_class", - "tokenizer_class", - "to_dict", - "to_json_file", - "to_json_string", - "valid_processor_kwargs", - "validate_init_kwargs", } return [name for name in super().__dir__() if name not in inapplicable] @@ -123,7 +108,7 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): @classmethod def from_profiles(cls, joint, eef, *, action_space: str, token_budgets=None): - "Bind an artifact assembled from existing joint/EEF profile directories." + 'Bind an artifact assembled from existing joint/EEF profile directories.' router = ProfileBundleBuilder(joint, eef, token_budgets=token_budgets).build() return cls(router, action_space=action_space) @@ -137,8 +122,8 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): token_offset: int = 0, pad_token_id=None, ): - "Create a Transformers LogitsProcessor for a fixed action horizon." - from .tokenization.generation import ActionCodec2LogitsProcessor + 'Create a Transformers LogitsProcessor for a fixed action horizon.' + from .generation import ActionCodec2LogitsProcessor return ActionCodec2LogitsProcessor( self, @@ -151,15 +136,9 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): ) def batch_decode( - self, - token_rows, - *, - fps=None, - current_state=None, - previous_first_order=None, - errors="raise", + self, token_rows, *, fps=None, current_state=None, previous_first_order=None, errors="raise" ): - "Decode independent token rows, including different valid horizons." + 'Decode independent token rows, including different valid horizons.' self._require_fitted() if errors not in ("raise", "return"): raise ValueError("errors must be 'raise' or 'return'") @@ -174,9 +153,7 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): ) ) if current is not None and current.shape != (len(rows), self.action_dim): - raise ValueError( - f"current_state must have shape {(len(rows), self.action_dim)}" - ) + raise ValueError(f"current_state must have shape {(len(rows), self.action_dim)}") previous = self._numpy_boundary(previous_first_order) if previous is not None and any( np.ndim(v) != 2 or len(v) != len(rows) for v in previous.values() @@ -190,9 +167,7 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): decoded = self.decode( [row], fps=fps, - current_state=None - if current is None - else current[index : index + 1], + current_state=None if current is None else current[index : index + 1], previous_first_order=None if previous is None else {k: v[index : index + 1] for k, v in previous.items()}, @@ -205,6 +180,16 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): result.append(decoded) return result + def apply_chat_template(self, *args, **kwargs): + raise NotImplementedError( + "ActionCodec2 accepts action tensors; use codec.encode(actions, fps=...) or codec(actions, fps=...)" + ) + + def post_process_image_text_to_text(self, *args, **kwargs): + raise NotImplementedError( + "ActionCodec2 returns actions; use codec.decode(token_rows, fps=...)" + ) + @property def fitted_profiles(self) -> frozenset[str]: """Names of profiles fitted on data; persisted by save_pretrained().""" @@ -213,9 +198,7 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): @property def is_fitted(self) -> bool: """Whether every profile used by the selected action space is fitted.""" - return all( - c.space in self.fitted_profiles for c in self.action_space.components - ) + return all(c.space in self.fitted_profiles for c in self.action_space.components) def _require_fitted(self): missing = {c.space for c in self.action_space.components} - self.fitted_profiles @@ -225,62 +208,17 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): ) def _describe_action_spaces(self, action_dim: int | None = None) -> str: - return _fitted_status(self.fitted_profiles) + super()._describe_action_spaces( - action_dim - ) + return _fitted_status(self.fitted_profiles) + super()._describe_action_spaces(action_dim) def for_action_space(self, name: str) -> ActionCodec2: """Share current weights with a new binding; subsequent fit replaces only that instance.""" codec = super().for_action_space(name) codec._fitted_profiles = self.fitted_profiles codec.training_report = self.training_report - codec._source_directory = self._source_directory + codec.preprocessing = dict(self.preprocessing) + codec.release_metadata = self.release_metadata return codec - def fit( - self, - episodes, - *, - fps: float | None = None, - current_state=None, - previous_first_order=None, - bootstrap_context: bool = False, - backend: str = "auto", - threads: int = 0, - batch_size: int = 256, - progress: bool = False, - max_cell_bytes: int | None = None, - work_dir: str | Path | None = None, - ) -> ActionCodec2: - "Fit physical vocabularies from actions in declared source layouts." - - - from .training.fitting import ActionCodec2Fitter - - router, report = ActionCodec2Fitter( - self, bootstrap_context=bootstrap_context - ).fit( - episodes, - work_dir=work_dir, - metadata=dict( - fps=fps, - current_state=current_state, - previous_first_order=previous_first_order, - ), - backend=backend, - threads=threads, - batch_size=batch_size, - progress=progress, - max_cell_bytes=max_cell_bytes, - ) - fitted = self.fitted_profiles | report["profiles"].keys() - replacement = type(self)(router, action_space=self.action_space.name) - replacement._fitted_profiles = frozenset(fitted) - replacement.training_report = report - replacement._source_directory = self._source_directory - replacement._warned_default_fps = self._warned_default_fps - self.__dict__.update(replacement.__dict__) - return self def _encode_action_indices(self, action, encode_kwargs=None): self._require_fitted() @@ -290,13 +228,15 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): self._require_fitted() return super()._decode_action_indices(action_indices, **kwargs) + def decode_prefix(self, action_token_ids, **kwargs): + self._require_fitted() + return super().decode_prefix(action_token_ids, **kwargs) + def grammar(self, horizon: int, *, fps: float | None = None): self._require_fitted() return super().grammar(horizon, fps=fps) - def final_first_order( - self, action_token_ids, *, previous_first_order, executed_steps=None - ): + def final_first_order(self, action_token_ids, *, previous_first_order, executed_steps=None): self._require_fitted() return super().final_first_order( action_token_ids, @@ -310,20 +250,26 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): pretrained_model_name_or_path: str | Path, *, action_dim: int | None = None, + gripper_mode: str = "2bin", + primitive_order: int = 1, **kwargs: Any, ) -> str: - "Inspect a local/Hub artifact before choosing an action space." + 'Inspect a local/Hub artifact before choosing an action space.' directory = resolve_pretrained_directory( - pretrained_model_name_or_path, - allow_patterns=ROUTER_ALLOW_PATTERNS, - **kwargs, + pretrained_model_name_or_path, allow_patterns=ROUTER_MANIFEST_PATTERNS, **kwargs ) - router = ActionCodec2Router.from_pretrained(directory) + if (directory / MANIFEST_NAME).is_file(): + return describe_release( + directory, + action_dim=action_dim, + gripper_mode=gripper_mode, + primitive_order=primitive_order, + ) + specs, _ = ActionCodec2Router.read_manifest(directory) metadata = _saved_metadata(directory) - return _fitted_status( - metadata.get("fitted_profiles", router.profiles) - ) + router.describe_action_spaces( - selected=metadata.get("action_space"), action_dim=action_dim + fitted = metadata.get("fitted_profiles", [spec.name for spec in specs]) + return _fitted_status(fitted) + ActionCodec2Router.describe_pretrained( + directory, selected=metadata.get("action_space"), action_dim=action_dim ) @classmethod @@ -332,13 +278,18 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): pretrained_model_name_or_path: str | Path, *, action_space: str | Path | PresetConfig | Mapping[str, object] | None = None, + gripper_mode: str | None = None, + primitive_order: int | None = None, + verify_gates: bool = False, **kwargs: Any, ) -> ActionCodec2: - "Load a local/Hub artifact and restore or override its action space." + 'Load a local/Hub artifact and restore or override its action space.' + if cls is ActionCodec2 and ("variant" in kwargs or (Path(pretrained_model_name_or_path) / "variants.json").is_file() + or (Path(pretrained_model_name_or_path) / "artifact_manifest.json").is_file()): + from ...catalog import ActionCodec2 as Catalog + return Catalog.from_pretrained(pretrained_model_name_or_path, action_space=action_space, **kwargs) directory = resolve_pretrained_directory( - pretrained_model_name_or_path, - allow_patterns=ROUTER_ALLOW_PATTERNS, - **kwargs, + pretrained_model_name_or_path, allow_patterns=ROUTER_ALLOW_PATTERNS, **kwargs ) if action_space is None: action_space = _saved_metadata(directory).get("action_space") @@ -348,6 +299,20 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): "First inspect its layouts with print(ActionCodec2.describe_pretrained(path)), " "then pass action_space='NAME'; shape alone cannot identify physical meaning." ) + if (directory / MANIFEST_NAME).is_file(): + router, preprocessing, metadata = load_release_router( + directory, + gripper_mode="2bin" if gripper_mode is None else gripper_mode, + primitive_order=1 if primitive_order is None else primitive_order, + verify_gates=verify_gates, + ) + codec = cls._from_router(router, action_space=action_space) + codec.preprocessing, codec.release_metadata = preprocessing, metadata + return codec + if gripper_mode is not None or primitive_order is not None or verify_gates: + raise ValueError( + "gripper_mode, primitive_order and verify_gates select release variants only" + ) codec = super().from_pretrained(directory, action_space=action_space) metadata = _saved_metadata(directory) fitted = metadata.get("fitted_profiles", list(codec.action_tokenizer.profiles)) @@ -357,53 +322,59 @@ class ActionCodec2(ActionCodec2Tokenizer, ProcessorMixin): ): raise ValueError("invalid fitted_profiles in processor_config.json") codec._fitted_profiles = frozenset(fitted) - codec._source_directory = directory + policies = metadata.get("preprocessing", {}) + if ( + not isinstance(policies, dict) + or policies.keys() - codec.action_tokenizer.profiles.keys() + ): + raise ValueError("invalid preprocessing profiles in processor_config.json") + codec.preprocessing = { + name: PreprocessingSpec.from_dict(spec) for name, spec in policies.items() + } + codec.release_metadata = metadata.get("release") report_path = directory / "fit_report.json" if report_path.is_file(): codec.training_report = json.loads(report_path.read_text(encoding="utf-8")) return codec def to_dict(self, legacy_serialization: bool = True) -> dict[str, object]: - "Return lightweight discovery metadata." + 'Return lightweight discovery metadata.' del legacy_serialization - return { + payload = { "processor_class": type(self).__name__, "model_type": self.model_type, "action_space": self.action_space.name, "fitted_profiles": sorted(self.fitted_profiles), } + if self.preprocessing: + payload["preprocessing"] = { + name: spec.to_dict() for name, spec in self.preprocessing.items() + } + return payload def save_pretrained( - self, save_directory: str | Path, push_to_hub: bool = False, **kwargs: Any + self, save_directory: str | Path, push_to_hub: bool = False, *, include_training_report=False, **kwargs: Any ) -> list[str]: """Save the complete router and the selected action-space binding.""" if not push_to_hub and kwargs: - raise TypeError( - f"unused save_pretrained keyword(s): {', '.join(sorted(kwargs))}" - ) - from .integration.exporting import ArtifactExporter - + raise TypeError(f"unused save_pretrained keyword(s): {', '.join(sorted(kwargs))}") directory = Path(save_directory) + files = self.action_tokenizer.save_pretrained(directory) + save_model_card(directory, str(self)) - files = self.action_tokenizer.save_pretrained(directory, include_code=False) - files.extend( - ArtifactExporter( - directory, source_directory=self._source_directory - ).export() - ) save_huggingface_metadata( directory, **self.to_dict(), - auto_map={"AutoProcessor": "processing_actioncodec2.ActionCodec2"}, ) report_path = directory / "fit_report.json" - if self.training_report is not None: + if include_training_report and self.training_report is not None: report_path.write_text( json.dumps(self.training_report, indent=2) + "\n", encoding="utf-8" ) files.append(str(report_path)) elif report_path.exists(): report_path.unlink() + files.extend(save_runtime(directory)) if push_to_hub: upload_pretrained_directory(directory, **kwargs) return files diff --git a/runtime/frontend/tokenizer.py b/runtime/frontend/actioncodec2/tokenizer.py similarity index 65% rename from runtime/frontend/tokenizer.py rename to runtime/frontend/actioncodec2/tokenizer.py index 9542aa334f63ef6db8409eeaf28620637bb0ea02..328ee4ac724c8fcdea1c8cd6e2dddc2408324727 100644 --- a/runtime/frontend/tokenizer.py +++ b/runtime/frontend/actioncodec2/tokenizer.py @@ -11,24 +11,20 @@ from typing import TextIO import numpy as np import torch -from ..common._frontend_base import BaseActionTokenizer -from ..common._types import ActionIdxBatch, TokenIds -from ..routing.presets import PresetConfig -from ..routing.routing import ActionCodec2Router -from ..physical.semantic import resampled_horizon +from ...backends.actioncodec2 import ( + ActionCodec2Router, + PresetConfig, +) +from ...backends.actioncodec2.native_backend import native_kernel +from ...backends.actioncodec2.semantic import resampled_horizon +from .._types import ActionIdxBatch, TokenIds +from ..base_action_tokenizer import BaseActionTokenizer +from ..layout import ActionSpaceMixin +from ..conversion import _numpy, _numpy_token_rows, restore_source_layout -def _numpy(value): - - return ( - value.detach().cpu().float().numpy() - if isinstance(value, torch.Tensor) - else value - ) - - -class ActionCodec2Tokenizer(BaseActionTokenizer): - "ActionCodec2 frontend bound to physical tensor semantics, not a horizon." +class ActionCodec2Tokenizer(ActionSpaceMixin, BaseActionTokenizer): + 'ActionCodec2 frontend bound to physical tensor semantics, not a horizon.' encode_kwargs = frozenset({"fps", "current_state", "previous_first_order"}) @@ -38,23 +34,25 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): f"ActionCodec2Tokenizer requires ActionCodec2Router, got {type(backend).__name__}" ) preset = backend.preset(action_space) + if preset.target_hz != 15.0: + raise ValueError( + f"ActionCodec2 frontend artifacts require target_hz=15; got {preset.target_hz}. " + "Pass the source data rate via fps; use a physical profile calibrated at 15 Hz. " + "Changing target_hz alone does not recalibrate physical bounds." + ) self.action_tokenizer = backend self._action_space = preset self._action_vocab_size = int(backend.vocab_size) self._new_action_tokens = list(backend.new_action_tokens) self.action_dim = preset.input_dim self._warned_default_fps = False - self.requires_previous_first_order = any( - physical.primitive_order == 2 - and set(component.active_dims).intersection(physical.dims) - for component in preset.components - for physical in backend.profiles[ - component.space - ].processor.config.physical.components.values() - ) + self.requires_previous_first_order = bool(backend.second_order_boundaries(preset)) self._encoded_action_dim = sum( len(component.active_dims) for component in preset.components ) + self.max_action_token_len = None + self.fixed_action_token_len = None + super().__init__(append_bar_sentinels=False) @classmethod def from_pretrained( @@ -64,10 +62,13 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): action_space: str | Path | PresetConfig | Mapping[str, object], **kwargs: object, ) -> ActionCodec2Tokenizer: - "Load a local/Hub router and bind one explicit physical action space." - router = ActionCodec2Router.from_pretrained( - pretrained_model_name_or_path, **kwargs - ) + 'Load a local/Hub router and bind one explicit physical action space.' + router = ActionCodec2Router.from_pretrained(pretrained_model_name_or_path, **kwargs) + return cls._from_router(router, action_space=action_space) + + @classmethod + def _from_router(cls, router: ActionCodec2Router, *, action_space): + if isinstance(action_space, (PresetConfig, Mapping, Path)): name = router.register_action_space(action_space).name elif isinstance(action_space, str): @@ -83,24 +84,29 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): ) return cls(router, action_space=name) - def __str__(self) -> str: - - return self._describe_action_spaces() + def configure_encoding( + self, + *, + spatial_search: bool = False, + temporal_search: bool = False, + search_window: int = 32, + search_beam: int = 4, + ) -> ActionCodec2Tokenizer: + 'Opt into native packing search; both independent stages default off.' + self.action_tokenizer.configure_encoding( + spatial_search=spatial_search, + temporal_search=temporal_search, + search_window=search_window, + search_beam=search_beam, + ) + return self + def _describe_action_spaces(self, action_dim: int | None = None) -> str: return self.action_tokenizer.describe_action_spaces( selected=self.action_space.name, action_dim=action_dim ) - @property - def action_space(self) -> PresetConfig: - """The immutable tensor semantics selected for this tokenizer.""" - return self._action_space - - @property - def action_spaces(self) -> Mapping[str, PresetConfig]: - """Every built-in or user-registered option in the loaded artifact.""" - return self.action_tokenizer.action_spaces def print_action_spaces( self, *, action_dim: int | None = None, file: TextIO | None = None @@ -109,12 +115,6 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): description = self._describe_action_spaces(action_dim) print(description, file=sys.stdout if file is None else file) - def register_action_space( - self, - preset: PresetConfig | Mapping[str, object] | str | Path, - ) -> PresetConfig: - """Register a custom action space without changing this instance's binding.""" - return self.action_tokenizer.register_action_space(preset) def for_action_space(self, name: str) -> ActionCodec2Tokenizer: """Return a new tokenizer sharing weights but bound to another option.""" @@ -134,23 +134,9 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): return preset.source_hz return fps - def first_order_template(self, batch_size: int) -> dict[str, np.ndarray]: - "Explicit zero boundary templates, shaped {component: (B,D_active)}." - if type(batch_size) is not int or batch_size < 1: - raise ValueError("batch_size must be a positive integer") - return { - c.name: np.zeros((batch_size, len(c.active_dims)), dtype=np.float32) - for c in self.action_space.components - if any( - p.primitive_order == 2 and set(c.active_dims).intersection(p.dims) - for p in self.action_tokenizer.profiles[ - c.space - ].processor.config.physical.components.values() - ) - } def max_tokens_for_horizon(self, horizon: int, *, fps: float | None = None) -> int: - "Return the token bound after converting a source chunk to the codec clock." + 'Return the token bound after converting a source chunk to the codec clock.' source_fps = self._source_fps(fps) internal = resampled_horizon( horizon, source_hz=source_fps, target_hz=self.action_space.target_hz @@ -158,14 +144,12 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): return internal * self._encoded_action_dim def grammar(self, horizon: int, *, fps: float | None = None): - "Build a grammar for the codec steps implied by source chunk geometry." + 'Build a grammar for the codec steps implied by source chunk geometry.' source_fps = self._source_fps(fps) internal = resampled_horizon( horizon, source_hz=source_fps, target_hz=self.action_space.target_hz ) - return self.action_tokenizer.grammar( - preset=self.action_space.name, horizon=internal - ) + return self.action_tokenizer.grammar(preset=self.action_space.name, horizon=internal) def __call__( self, @@ -188,9 +172,7 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): ) if duplicates: raise ValueError(f"encode arguments provided twice: {duplicates}") - kwargs.update( - {key: value for key, value in direct.items() if value is not None} - ) + kwargs.update({key: value for key, value in direct.items() if value is not None}) reference = kwargs.get("current_state") if self.action_space.input == "absolute" and reference is None: raise ValueError( @@ -216,8 +198,8 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): current_state: torch.Tensor | np.ndarray | None = None, previous_first_order: Mapping[str, torch.Tensor | np.ndarray] | None = None, ) -> torch.Tensor: - "Decode a batch, deriving sequence length from tokens and output rate." - return self._decode_token_ids_to_actions_batch( + 'Decode a batch, deriving sequence length from tokens and output rate.' + return self.decode_token_ids_to_actions_batch( action_token_ids, action_dim=self.action_dim, decode_kwargs={ @@ -227,15 +209,56 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): }, ) - @staticmethod - def _numpy_boundary(previous_first_order): - if previous_first_order is None: - return None - if not isinstance(previous_first_order, Mapping): - raise ValueError( - "previous_first_order must map component names to [B,D_active] arrays" + def decode_token_ids_to_actions_batch( + self, + action_token_ids: Sequence[TokenIds], + *, + time_horizon: int | None = None, + action_dim: int | None = None, + decode_kwargs: dict | None = None, + ) -> torch.Tensor: + 'Decode integer rows to ``(B,T,D)``; the native router validates ranges.' + if native_kernel("route_decode_batch") is None: + return super().decode_token_ids_to_actions_batch( + action_token_ids, + time_horizon=time_horizon, + action_dim=action_dim, + decode_kwargs=decode_kwargs, ) - return {name: _numpy(value) for name, value in previous_first_order.items()} + actions, _ = self._decode_action_indices( + _numpy_token_rows(action_token_ids), + time_horizon=time_horizon, + action_dim=action_dim, + decode_kwargs=decode_kwargs, + ) + return torch.from_numpy(actions) + + + def decode_prefix( + self, + action_token_ids, + *, + horizon: int, + steps: int, + fps: float | None = None, + current_state=None, + previous_first_order=None, + ) -> torch.Tensor: + 'Decode a covered streaming prefix to ``(B,steps,D)`` on the 15 Hz grid.' + if self.action_space.input == "absolute" and current_state is None: + raise ValueError("absolute prefix decode requires current_state") + if self.action_space.input == "delta" and current_state is not None: + raise ValueError("delta prefix decode must omit current_state") + decoded = self.action_tokenizer.decode_prefix_batch( + [self._checked_decode_row(row).tolist() for row in action_token_ids], + preset=self.action_space.name, + horizon=horizon, + steps=steps, + fps=float(self._source_fps(fps)), + current_state=_numpy(current_state), + previous_first_order=self._numpy_boundary(previous_first_order), + ) + return torch.from_numpy(self._restore_source_layout(decoded)) def final_first_order( self, @@ -244,7 +267,7 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): previous_first_order: Mapping[str, torch.Tensor | np.ndarray], executed_steps: int | None = None, ) -> dict[str, np.ndarray]: - "Return reconstructed component states after a canonical-step prefix." + 'Return reconstructed component states after a canonical-step prefix.' return self.action_tokenizer.final_first_order( [self._checked_decode_row(row).tolist() for row in action_token_ids], preset=self.action_space.name, @@ -269,9 +292,7 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): preset=self.action_space.name, fps=fps, current_state=current_state, - previous_first_order=self._numpy_boundary( - kwargs.get("previous_first_order") - ), + previous_first_order=self._numpy_boundary(kwargs.get("previous_first_order")), ) def _decode_action_indices( @@ -296,9 +317,7 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): kwargs = dict(decode_kwargs or {}) unknown = sorted(set(kwargs) - self.encode_kwargs) if unknown: - raise ValueError( - f"ActionCodec2Tokenizer does not consume decode_kwargs {unknown}" - ) + raise ValueError(f"ActionCodec2Tokenizer does not consume decode_kwargs {unknown}") raw_fps = kwargs.get("fps") fps = float(self._source_fps(raw_fps)) current_state = _numpy(kwargs.get("current_state")) @@ -317,26 +336,10 @@ class ActionCodec2Tokenizer(BaseActionTokenizer): preset=self.action_space.name, fps=fps, current_state=current_state, - previous_first_order=self._numpy_boundary( - kwargs.get("previous_first_order") - ), + previous_first_order=self._numpy_boundary(kwargs.get("previous_first_order")), ) actions = self._restore_source_layout(decoded) return actions, [set() for _ in range(actions.shape[0])] def _restore_source_layout(self, decoded: Mapping[str, np.ndarray]) -> np.ndarray: - - first = next(iter(decoded.values())) - batch, steps = first.shape[:2] - if any(values.shape[:2] != (batch, steps) for values in decoded.values()): - raise RuntimeError( - "decoded components disagree on batch or sequence length" - ) - actions = np.empty((batch, steps, self.action_dim), dtype=np.float32) - for component in self.action_space.components: - values = decoded[component.name] - motion_width = len(component.source_dims) - actions[:, :, component.source_dims] = values[:, :, :motion_width] - if component.gripper_dim is not None: - actions[:, :, component.gripper_dim] = values[:, :, motion_width] - return actions + return restore_source_layout(self.action_space, decoded) diff --git a/runtime/frontend/actioncodec2_sparse/__init__.py b/runtime/frontend/actioncodec2_sparse/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f29e9686501fa748fd38739c5b41d2d0298b11d9 --- /dev/null +++ b/runtime/frontend/actioncodec2_sparse/__init__.py @@ -0,0 +1,22 @@ +"""ActionCodec2Sparse frontend: action-space binding, release loading and generation constraints.""" + +from transformers import AutoConfig, AutoProcessor, PretrainedConfig + +from .generation import ActionCodec2SparseLogitsProcessor +from .processor import ActionCodec2Sparse + + +class ActionCodec2SparseHFConfig(PretrainedConfig): + """AutoConfig discovery key for :class:`ActionCodec2Sparse` artifacts.""" + + model_type = ActionCodec2Sparse.model_type + + def __init__(self, **kwargs): + kwargs.setdefault("processor_class", "ActionCodec2Sparse") + super().__init__(**kwargs) + + +AutoConfig.register(ActionCodec2Sparse.model_type, ActionCodec2SparseHFConfig, exist_ok=True) +AutoProcessor.register(ActionCodec2SparseHFConfig, ActionCodec2Sparse, exist_ok=True) + +__all__ = ["ActionCodec2Sparse", "ActionCodec2SparseLogitsProcessor"] diff --git a/runtime/frontend/actioncodec2_sparse/generation.py b/runtime/frontend/actioncodec2_sparse/generation.py new file mode 100644 index 0000000000000000000000000000000000000000..7e0050501d551bc5fa57b749f27b5f5b8cefa9ae --- /dev/null +++ b/runtime/frontend/actioncodec2_sparse/generation.py @@ -0,0 +1,92 @@ +"""Explicit ActionCodec2Sparse token constraints for Hugging Face generate().""" + +from __future__ import annotations + +import torch +from transformers import LogitsProcessor + +from ...backends.actioncodec2.cache import BoundedCache + + +class ActionCodec2SparseLogitsProcessor(LogitsProcessor): + """Constrain generated action IDs to the sparse grammar; allow EOS once complete.""" + + def __init__( + self, codec, horizon, *, fps, prompt_length, eos_token_id, token_offset=0, pad_token_id=None + ): + for name, value in { + "prompt_length": prompt_length, + "eos_token_id": eos_token_id, + "token_offset": token_offset, + }.items(): + if type(value) is not int or value < 0: + raise ValueError(f"{name} must be a nonnegative integer") + if pad_token_id is not None and (type(pad_token_id) is not int or pad_token_id < 0): + raise ValueError("pad_token_id must be a nonnegative integer") + self.grammar = codec.grammar(horizon, fps=fps) + self.prompt_length, self.token_offset = prompt_length, token_offset + self.eos_token_id, self.pad_token_id = eos_token_id, pad_token_id + stop = token_offset + self.grammar.vocab_size + if token_offset <= eos_token_id < stop: + raise ValueError("eos_token_id must be outside the action token interval") + if pad_token_id is not None and token_offset <= pad_token_id < stop: + raise ValueError("pad_token_id must be outside the action token interval") + self._mask_cache = BoundedCache(64) + + def _state(self, row): + if self.eos_token_id in row: + end = row.index(self.eos_token_id) + if any(t not in (self.eos_token_id, self.pad_token_id) for t in row[end:]): + raise ValueError("only EOS/padding may follow completed action generation") + if not self.grammar.is_complete([t - self.token_offset for t in row[:end]]): + raise ValueError("EOS occurred before the action chunk was complete") + return "done" + state = self.grammar._consume([t - self.token_offset for t in row]) + if state is None: + raise ValueError( + "generated prefix violates the action grammar; check prompt_length and token_offset" + ) + return state + + def _mask(self, state, scores): + key = (state, str(scores.device), scores.shape[-1]) + mask = self._mask_cache.get(key) + if mask is None: + mask = torch.zeros(scores.shape[-1], device=scores.device, dtype=torch.bool) + if state == "done": + mask[self.eos_token_id] = True + if self.pad_token_id is not None: + mask[self.pad_token_id] = True + else: + allowed = self.grammar._mask_from_state(state) + stop = self.token_offset + len(allowed) + mask[self.token_offset : stop] = torch.as_tensor(allowed, device=scores.device) + mask[self.eos_token_id] = self.grammar._state_complete(state) + self._mask_cache[key] = mask + return mask + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + if input_ids.ndim != 2 or scores.ndim != 2 or input_ids.shape[0] != scores.shape[0]: + raise ValueError("expected input_ids(B,L) and scores(B,V) with the same batch size") + if input_ids.shape[1] < self.prompt_length: + raise ValueError("prompt_length exceeds the supplied input length") + required = max( + self.token_offset + self.grammar.vocab_size, + self.eos_token_id + 1, + 0 if self.pad_token_id is None else self.pad_token_id + 1, + ) + if scores.shape[1] < required: + raise ValueError("model vocabulary does not cover configured action/EOS/padding IDs") + self.grammar.reserve_states(int(input_ids.shape[0])) + rows = input_ids[:, self.prompt_length :].detach().cpu().tolist() + output = scores.clone() + groups = {} + for index, row in enumerate(rows): + groups.setdefault(self._state(row), []).append(index) + for state, indices in groups.items(): + output[indices] = scores[indices].masked_fill(~self._mask(state, scores), -torch.inf) + if not torch.isfinite(output).any(dim=1).all(): + raise ValueError( + "all legal action logits were suppressed; check other generation processors" + ) + return output diff --git a/runtime/frontend/actioncodec2_sparse/loading.py b/runtime/frontend/actioncodec2_sparse/loading.py new file mode 100644 index 0000000000000000000000000000000000000000..cfa87f06e88e300be18da30eaa5aa1490394b147 --- /dev/null +++ b/runtime/frontend/actioncodec2_sparse/loading.py @@ -0,0 +1,6 @@ +"""Shared release loader bindings.""" +from functools import partial +from ..loading import load_release_router as _load, describe_release as _describe + +load_release_router = partial(_load, tokenizer='actioncodec2_sparse') +describe_release = partial(_describe, tokenizer='actioncodec2_sparse') diff --git a/runtime/frontend/actioncodec2_sparse/processor.py b/runtime/frontend/actioncodec2_sparse/processor.py new file mode 100644 index 0000000000000000000000000000000000000000..cb4240119f6e83e2c06578f17e166f09fd4e238a --- /dev/null +++ b/runtime/frontend/actioncodec2_sparse/processor.py @@ -0,0 +1,629 @@ +"""Action-space-bound ActionCodec2Sparse frontend for independent action chunks.""" + +from __future__ import annotations + +import json +import sys +import warnings +from collections.abc import Mapping +from pathlib import Path +from typing import Any, TextIO + +import numpy as np +import torch +from transformers.feature_extraction_utils import BatchFeature + +from ...backends.actioncodec2 import ActionCodec2Config, PresetConfig +from ...backends.actioncodec2.defaults import builtin_action_spaces +from ...backends.actioncodec2.hf import ( + GENERATED_CARD_MARKER, + PROCESSOR_CONFIG_NAME, + resolve_pretrained_directory, +) +from ...backends.actioncodec2.preprocessing import PreprocessingSpec +from ...backends.actioncodec2.release import MANIFEST_NAME +from ...exporting import save_runtime +from ...backends.actioncodec2.semantic import resampled_horizon +from ...backends.actioncodec2.sparse import ( + ActionCodec2SparseProcessor, + ActionCodec2SparseRouter, + SparseLayout, + SparseProfileTrainer, + SparseVocabulary, + sparse_profile_config, +) +from ...backends.actioncodec2.sparse.routing import SPARSE_ROUTER_CONFIG_NAME, save_router_metadata +from ...backends.actioncodec2.training import build_primitives +from ..conversion import ( + _numpy, + _numpy_token_rows, + restore_source_layout, +) +from ..base_action_tokenizer import BaseActionTokenizer +from ..layout import ActionSpaceMixin +from ..training import TrainingMixin +from .loading import describe_release, load_release_router + +ALLOW_PATTERNS = [ + SPARSE_ROUTER_CONFIG_NAME, + PROCESSOR_CONFIG_NAME, + "config.json", + MANIFEST_NAME, + "profiles/**", + "joint/**", + "eef/**", + "fit_report.json", + "README.md", +] +_ASSETS = Path(__file__).absolute().parents[2] / "backends" / "actioncodec2" / "assets" + + +def _profile_config(raw) -> ActionCodec2Config: + if isinstance(raw, ActionCodec2Config): + return raw + if isinstance(raw, Mapping): + return ActionCodec2Config.from_dict(raw) + return ActionCodec2Config.from_yaml(raw) + + +def build_fresh_router( + profile_configs=None, primitive_order: int = 1, vocab_size: int = 4096 +) -> ActionCodec2SparseRouter: + """Unfitted joint/EEF profiles; defaults derive from the packaged profiles of that order.""" + if type(primitive_order) is not int or primitive_order not in (1, 2): + raise ValueError("primitive_order must be 1 or 2") + if type(vocab_size) is not int or vocab_size < 1: + raise ValueError("vocab_size must be a positive integer") + if profile_configs is not None and vocab_size != 4096: + raise ValueError("set vocabulary budgets in profile_configs when providing custom profiles") + configs = dict(profile_configs or {}) + if configs.keys() - {"joint", "eef"}: + raise ValueError("profile_configs keys must be 'joint' or 'eef'") + suffix = "" if primitive_order == 1 else "_second_order" + processors, budgets = {}, {} + for name in ("joint", "eef"): + if name in configs: + config = _profile_config(configs[name]) + else: + default = ActionCodec2Config.from_yaml(_ASSETS / "profiles" / f"{name}{suffix}.yaml") + config = sparse_profile_config(default, vocab_size=vocab_size) + if config.train is None or config.train.sparse is None: + raise ValueError(f"{name} profile config requires train.sparse") + primitives = build_primitives(config) + layout = SparseLayout.from_config(config, primitives) + vocabulary = SparseVocabulary(layout, (), (), config.set_bpe.lookahead) + processors[name] = ActionCodec2SparseProcessor(config, primitives, vocabulary) + budgets[name] = config.train.bpe.vocab_size + return ActionCodec2SparseRouter.from_processors( + processors, token_budgets=budgets, presets=list(builtin_action_spaces().values()) + ) + + +class ActionCodec2Sparse(ActionSpaceMixin, TrainingMixin, BaseActionTokenizer): + """ActionCodec2 physics with a zero-free token layer, bound to one action space.""" + + trainer_class = SparseProfileTrainer + model_type = "actioncodec2_sparse" + encode_kwargs = frozenset({"fps", "current_state", "previous_first_order"}) + + def __init__( + self, + backend: ActionCodec2SparseRouter | None = None, + *, + action_space: str, + primitive_order: int = 1, + vocab_size: int = 4096, + profile_configs: Mapping[str, object] | None = None, + ) -> None: + fresh = backend is None + if fresh: + backend = build_fresh_router(profile_configs, primitive_order, vocab_size) + elif profile_configs is not None or primitive_order != 1 or vocab_size != 4096: + raise ValueError("profile construction options cannot accompany an existing backend") + if not isinstance(backend, ActionCodec2SparseRouter): + raise TypeError( + f"ActionCodec2Sparse requires ActionCodec2SparseRouter, got {type(backend).__name__}" + ) + preset = backend.preset(action_space) + if preset.target_hz != 15.0: + raise ValueError("ActionCodec2Sparse artifacts require target_hz=15") + self.action_tokenizer = backend + self._action_space = preset + self._action_vocab_size = int(backend.vocab_size) + self._new_action_tokens = backend.new_action_tokens + self.action_dim = preset.input_dim + self.requires_previous_first_order = bool(backend.second_order_boundaries(preset)) + self.max_action_token_len = None + self.fixed_action_token_len = None + self._warned_default_fps = False + super().__init__(append_bar_sentinels=False) + self._fitted_profiles = frozenset() if fresh else frozenset(backend.profiles) + self.training_report = None + self.preprocessing: dict[str, PreprocessingSpec] = {} + self.release_metadata: dict[str, Any] | None = None + + def __repr__(self) -> str: + return ( + f"ActionCodec2Sparse(action_space={self.action_space.name!r}, " + f"D={self.action_dim}, vocab={self.vocab_size})" + ) + + + def _describe_action_spaces(self, action_dim: int | None = None) -> str: + fitted = ", ".join(sorted(self.fitted_profiles)) or "none; call codec.fit(episodes)" + layouts = self.action_tokenizer.describe_action_spaces( + selected=self.action_space.name, action_dim=action_dim + ) + return f"Fitted profiles: {fitted}\n{layouts}" + + @staticmethod + def builtin_action_spaces(): + """Return the immutable named layout definitions shipped in the package.""" + return builtin_action_spaces() + + + def print_action_spaces(self, *, action_dim: int | None = None, file: TextIO | None = None): + """Print all layouts or candidates matching ``action_dim``.""" + print(self._describe_action_spaces(action_dim), file=sys.stdout if file is None else file) + + + def for_action_space(self, name: str) -> ActionCodec2Sparse: + """Share current weights with a new binding.""" + codec = type(self)(self.action_tokenizer, action_space=name) + codec._fitted_profiles = self.fitted_profiles + codec.training_report = self.training_report + codec.preprocessing = dict(self.preprocessing) + codec.release_metadata = self.release_metadata + return codec + + @property + def fitted_profiles(self) -> frozenset[str]: + """Names of profiles fitted on data; persisted by save_pretrained().""" + return self._fitted_profiles + + @property + def is_fitted(self) -> bool: + """Whether every profile used by the selected action space is fitted.""" + return all(c.space in self.fitted_profiles for c in self.action_space.components) + + def _require_fitted(self) -> None: + missing = {c.space for c in self.action_space.components} - self.fitted_profiles + if missing: + raise RuntimeError( + f"Unfitted profiles {sorted(missing)}; call codec.fit(episodes) first" + ) + + def _source_fps(self, fps, preset=None) -> float: + preset = self.action_space if preset is None else preset + if fps is None: + if not self._warned_default_fps: + warnings.warn( + f"fps was omitted; assuming {preset.source_hz:g} Hz from action_space " + f"{preset.name!r}. Pass the actual fps explicitly to avoid changing action timing.", + UserWarning, + stacklevel=3, + ) + self._warned_default_fps = True + return float(preset.source_hz) + return float(fps) + + + def codec_horizon(self, horizon: int, *, fps: float | None = None) -> int: + """Codec frames (15 Hz) of a ``horizon``-frame source chunk at ``fps``.""" + if isinstance(horizon, bool) or not isinstance(horizon, int) or horizon < 1: + raise ValueError("horizon must be a positive integer") + return resampled_horizon( + horizon, source_hz=self._source_fps(fps), target_hz=self.action_space.target_hz + ) + + def max_tokens_for_horizon(self, horizon: int, *, fps: float | None = None) -> int: + """Upper bound on the tokens of one encoded ``horizon``-frame source chunk.""" + frames = self.codec_horizon(horizon, fps=fps) + components = self.action_space.components + width = sum(len(c.active_dims) + 1 for c in components) + return frames * width + len(components) - 1 + + def grammar(self, horizon: int, *, fps: float | None = None): + """Constrained-generation grammar for one ``horizon``-frame source chunk.""" + self._require_fitted() + return self.action_tokenizer.grammar( + preset=self.action_space.name, horizon=self.codec_horizon(horizon, fps=fps) + ) + + def logits_processor( + self, horizon, *, fps, prompt_length, eos_token_id, token_offset=0, pad_token_id=None + ): + """Create a Transformers LogitsProcessor for one ``horizon``-frame chunk.""" + from .generation import ActionCodec2SparseLogitsProcessor + + return ActionCodec2SparseLogitsProcessor( + self, + horizon, + fps=fps, + prompt_length=prompt_length, + eos_token_id=eos_token_id, + token_offset=token_offset, + pad_token_id=pad_token_id, + ) + + def _check_state(self, current_state, action: str): + name = self.action_space.name + if self.action_space.input == "absolute" and current_state is None: + raise ValueError( + f"action space {name!r} is absolute; {action} requires current_state with shape [B, D]" + ) + if self.action_space.input == "delta" and current_state is not None: + raise ValueError(f"action space {name!r} is delta; omit current_state") + return _numpy(current_state) + + def encode( + self, action, *, fps=None, current_state=None, previous_first_order=None, encode_kwargs=None + ) -> list[list[int]]: + """Encode ``(B,T,D)`` or ``(T,D)`` source chunks into ragged token rows.""" + kwargs = self._check_encode_kwargs(encode_kwargs) + direct = { + "fps": fps, + "current_state": current_state, + "previous_first_order": previous_first_order, + } + duplicates = sorted(k for k, v in direct.items() if v is not None and k in kwargs) + if duplicates: + raise ValueError(f"encode arguments provided twice: {duplicates}") + kwargs.update({k: v for k, v in direct.items() if v is not None}) + values = torch.as_tensor(action) + if values.ndim == 2: + values = values.unsqueeze(0) + return self._encode_action_indices(values, encode_kwargs=kwargs) + + def __call__( + self, + action, + *, + fps=None, + current_state=None, + previous_first_order=None, + encode_kwargs=None, + return_tensors=None, + ) -> BatchFeature: + rows = self.encode( + action, + fps=fps, + current_state=current_state, + previous_first_order=previous_first_order, + encode_kwargs=encode_kwargs, + ) + return BatchFeature({"input_ids": rows}, tensor_type=return_tensors) + + def _encode_action_indices(self, action, encode_kwargs=None): + self._require_fitted() + kwargs = dict(encode_kwargs or {}) + current_state = self._check_state(kwargs.get("current_state"), "encode") + values = _numpy(action) + if values.ndim != 3 or values.shape[2] != self.action_dim: + raise ValueError(f"actions must have shape [B, T_source, {self.action_dim}]") + return self.action_tokenizer.encode_batch( + values, + preset=self.action_space.name, + fps=self._source_fps(kwargs.get("fps")), + current_state=current_state, + previous_first_order=self._numpy_boundary(kwargs.get("previous_first_order")), + ) + + def decode( + self, + action_token_ids, + *, + horizon: int, + fps=None, + current_state=None, + previous_first_order=None, + ) -> torch.Tensor: + """Decode rows of one ``horizon``-frame source chunk to a CPU ``(B,T,D)`` tensor.""" + return self.decode_token_ids_to_actions_batch( + action_token_ids, + time_horizon=horizon, + decode_kwargs={ + "fps": fps, + "current_state": current_state, + "previous_first_order": previous_first_order, + }, + ) + + def decode_token_ids_to_actions_batch( + self, action_token_ids, *, time_horizon=None, action_dim=None, decode_kwargs=None + ) -> torch.Tensor: + """Decode integer rows (ragged or ``(B,L)``) of one source ``time_horizon``.""" + rows = [ + self._checked_decode_row(row).tolist() for row in _numpy_token_rows(action_token_ids) + ] + actions, _ = self._decode_action_indices( + rows, time_horizon=time_horizon, action_dim=action_dim, decode_kwargs=decode_kwargs + ) + return torch.from_numpy(actions) + + def _decode_action_indices( + self, action_indices, *, time_horizon=None, action_dim=None, decode_kwargs=None + ): + self._require_fitted() + if time_horizon is None: + raise ValueError("ActionCodec2Sparse decode requires the chunk horizon") + if action_dim is not None and int(action_dim) != self.action_dim: + raise ValueError( + f"action_dim={action_dim} disagrees with action space D={self.action_dim}" + ) + kwargs = dict(decode_kwargs or {}) + unknown = sorted(set(kwargs) - self.encode_kwargs) + if unknown: + raise ValueError(f"ActionCodec2Sparse does not consume decode_kwargs {unknown}") + fps = self._source_fps(kwargs.get("fps")) + decoded = self.action_tokenizer.decode_batch( + action_indices, + preset=self.action_space.name, + horizon=self.codec_horizon(time_horizon, fps=fps), + fps=fps, + current_state=self._check_state(kwargs.get("current_state"), "decode"), + previous_first_order=self._numpy_boundary(kwargs.get("previous_first_order")), + ) + actions = restore_source_layout(self.action_space, decoded) + return actions, [set() for _ in range(len(actions))] + + def batch_decode( + self, + token_rows, + *, + horizon: int, + fps=None, + current_state=None, + previous_first_order=None, + errors="raise", + ): + """Decode independent rows of one horizon, isolating invalid rows.""" + if errors not in ("raise", "return"): + raise ValueError("errors must be 'raise' or 'return'") + rows = list(token_rows) + current = _numpy(current_state) + if current is not None and np.shape(current) != (len(rows), self.action_dim): + raise ValueError(f"current_state must have shape {(len(rows), self.action_dim)}") + previous = self._numpy_boundary(previous_first_order) + if previous is not None and any(len(v) != len(rows) for v in previous.values()): + raise ValueError( + "previous_first_order arrays must have batch dimension equal to token rows" + ) + result = [] + for index, row in enumerate(rows): + try: + state = None if current is None else current[index : index + 1] + boundary = ( + None + if previous is None + else {k: v[index : index + 1] for k, v in previous.items()} + ) + result.append( + self.decode( + [row], + horizon=horizon, + fps=fps, + current_state=state, + previous_first_order=boundary, + ) + ) + except ValueError as error: + error = ValueError(f"token row {index}: {error}") + if errors == "raise": + raise error from None + result.append(error) + return result + + def decode_prefix( + self, + action_token_ids, + *, + horizon: int, + steps: int, + fps=None, + current_state=None, + previous_first_order=None, + ): + """Decode the first ``steps`` 15 Hz frames of streaming prefixes to ``(B,steps,D)``.""" + self._require_fitted() + fps = self._source_fps(fps) + if fps != self.action_space.target_hz: + raise ValueError("prefix decode requires fps equal to the 15 Hz codec clock") + frames = self.codec_horizon(horizon, fps=fps) + if isinstance(steps, bool) or not isinstance(steps, int) or not 1 <= steps <= frames: + raise ValueError("steps must be an integer within the chunk horizon") + rows = [self._checked_decode_row(row).tolist() for row in action_token_ids] + grammar = self.action_tokenizer.grammar(preset=self.action_space.name, horizon=frames) + if any(grammar.covered_steps(row) < steps for row in rows): + raise ValueError(f"action prefix does not fix the first {steps} frames") + decoded = self.action_tokenizer.decode_batch( + rows, + preset=self.action_space.name, + horizon=frames, + fps=fps, + current_state=self._check_state(_numpy(current_state), "decode"), + previous_first_order=self._numpy_boundary(previous_first_order), + ) + return torch.from_numpy(restore_source_layout(self.action_space, decoded)[:, :steps]) + + def final_first_order( + self, + action_token_ids, + *, + horizon: int, + previous_first_order, + fps=None, + executed_steps: int | None = None, + ) -> dict[str, np.ndarray]: + """Second-order component boundaries ``{component: (B,D_active)}`` for the next chunk.""" + self._require_fitted() + return self.action_tokenizer.final_first_order( + [self._checked_decode_row(row).tolist() for row in action_token_ids], + preset=self.action_space.name, + horizon=self.codec_horizon(horizon, fps=fps), + previous_first_order=self._numpy_boundary(previous_first_order), + executed_steps=executed_steps, + ) + + + @classmethod + def describe_pretrained( + cls, + pretrained_model_name_or_path, + *, + action_dim=None, + gripper_mode="2bin", + primitive_order: int = 1, + **kwargs, + ) -> str: + """Report a release's or saved artifact's layouts from manifests alone.""" + directory = resolve_pretrained_directory( + pretrained_model_name_or_path, allow_patterns=ALLOW_PATTERNS, **kwargs + ) + if (directory / MANIFEST_NAME).is_file(): + return describe_release( + directory, + action_dim=action_dim, + gripper_mode=gripper_mode, + primitive_order=primitive_order, + ) + specs, presets = ActionCodec2SparseRouter.read_manifest(directory) + metadata = _saved_metadata(directory) + fitted = ", ".join(metadata.get("fitted_profiles", [s.name for s in specs])) + from ...backends.actioncodec2.presets import format_action_spaces + + layouts = format_action_spaces( + {p.name: p for p in presets}, + selected=metadata.get("action_space"), + action_dim=action_dim, + codec_name="ActionCodec2Sparse", + chunk_horizon_decode=True, + ) + return f"Fitted profiles: {fitted}\n{layouts}" + + @classmethod + def from_pretrained( + cls, + pretrained_model_name_or_path, + *, + action_space=None, + gripper_mode: str | None = None, + primitive_order: int | None = None, + verify_gates: bool = False, + **kwargs, + ) -> ActionCodec2Sparse: + """Load a release package or saved frontend and bind an action space.""" + if cls is ActionCodec2Sparse and ("variant" in kwargs or (Path(pretrained_model_name_or_path) / "variants.json").is_file() + or (Path(pretrained_model_name_or_path) / "artifact_manifest.json").is_file()): + from ...catalog import ActionCodec2 as Catalog + return Catalog.from_pretrained(pretrained_model_name_or_path, action_space=action_space, **kwargs) + directory = resolve_pretrained_directory( + pretrained_model_name_or_path, allow_patterns=ALLOW_PATTERNS, **kwargs + ) + metadata = _saved_metadata(directory) + action_space = metadata.get("action_space") if action_space is None else action_space + if action_space is None: + raise ValueError( + "action_space is required; inspect layouts with " + "print(ActionCodec2Sparse.describe_pretrained(path))" + ) + if (directory / MANIFEST_NAME).is_file(): + router, preprocessing, release = load_release_router( + directory, + gripper_mode=gripper_mode or "2bin", + primitive_order=1 if primitive_order is None else primitive_order, + verify_gates=verify_gates, + ) + codec = cls(router, action_space=_register(router, action_space)) + codec.preprocessing, codec.release_metadata = preprocessing, release + return codec + if gripper_mode is not None or primitive_order is not None or verify_gates: + raise ValueError( + "gripper_mode, primitive_order and verify_gates select release variants only" + ) + router = ActionCodec2SparseRouter.from_pretrained(directory) + codec = cls(router, action_space=_register(router, action_space)) + fitted = metadata.get("fitted_profiles", list(router.profiles)) + if not isinstance(fitted, list) or set(fitted) - router.profiles.keys(): + raise ValueError("invalid fitted_profiles in processor_config.json") + codec._fitted_profiles = frozenset(fitted) + codec.preprocessing = { + name: PreprocessingSpec.from_dict(spec) + for name, spec in metadata.get("preprocessing", {}).items() + } + codec.release_metadata = metadata.get("release") + report = directory / "fit_report.json" + if report.is_file(): + codec.training_report = json.loads(report.read_text(encoding="utf-8")) + return codec + + def to_dict(self) -> dict[str, object]: + """Lightweight discovery metadata saved as ``processor_config.json``.""" + payload = { + "action_space": self.action_space.name, + "fitted_profiles": sorted(self.fitted_profiles), + } + if self.preprocessing: + payload["preprocessing"] = {k: v.to_dict() for k, v in self.preprocessing.items()} + return payload + + def save_pretrained( + self, save_directory: str | Path, *, include_training_report=False + ) -> list[str]: + """Save inference assets; include the local fit report only when explicitly requested.""" + directory = Path(save_directory) + files = self.action_tokenizer.save_pretrained(directory) + files.extend(map(str, save_router_metadata(directory, **self.to_dict()))) + files.append(str(_save_model_card(directory, self))) + report = directory / "fit_report.json" + if include_training_report and self.training_report is not None: + report.write_text(json.dumps(self.training_report, indent=2) + "\n", encoding="utf-8") + files.append(str(report)) + elif report.exists(): + report.unlink() + files.extend(save_runtime(directory)) + return files + + def eval(self) -> ActionCodec2Sparse: + return self + + +def _save_model_card(directory: Path, codec: ActionCodec2Sparse) -> Path: + path = directory / "README.md" + if path.exists() and GENERATED_CARD_MARKER not in path.read_text(encoding="utf-8"): + return path + context = 'context = {"fps": 15.0}\n' + if codec.action_space.input == "absolute": + context += 'context["current_state"] = current_state # observed (B, D) source state\n' + if codec.requires_previous_first_order: + context += 'context["previous_first_order"] = previous_first_order # canonical 15 Hz increments by component\n' + path.write_text( + "---\nlibrary_name: actioncodec2\nlicense: apache-2.0\ntags:\n- robotics\n- action-tokenizer\n---\n\n" + f"{GENERATED_CARD_MARKER}\n\n# ActionCodec2Sparse\n\n" + "Install actioncodec2 >= 0.3.0 before loading this artifact.\n\n" + "```python\nfrom actioncodec2 import ActionCodec2Sparse\n\n" + "codec = ActionCodec2Sparse.from_pretrained('./my_codec')\n" + + context + + "rows = codec.encode(actions, **context)\n" + "restored = codec.decode(rows, horizon=actions.shape[-2], **context)\n```\n\n" + "Supply actions and any required boundary observations in the declared layout.\n" + "Rows are independent chunks; decode and grammar take the chunk horizon.\n\n" + "## Layouts\n\n```text\n" + str(codec) + "\n```\n", + encoding="utf-8", + ) + return path + + +def _saved_metadata(directory: Path) -> dict: + path = directory / PROCESSOR_CONFIG_NAME + return json.loads(path.read_text(encoding="utf-8")) if path.is_file() else {} + + +def _register(router: ActionCodec2SparseRouter, action_space) -> str: + if isinstance(action_space, (PresetConfig, Mapping, Path)): + return router.register_action_space(action_space).name + if isinstance(action_space, str): + if Path(action_space).is_file(): + return router.register_action_space(Path(action_space)).name + return action_space + raise TypeError("action_space must be a registered name, PresetConfig, mapping, or YAML path") diff --git a/runtime/frontend/base_action_tokenizer.py b/runtime/frontend/base_action_tokenizer.py new file mode 100644 index 0000000000000000000000000000000000000000..adb7c2870b18414753bd5440930c917cbaceb312 --- /dev/null +++ b/runtime/frontend/base_action_tokenizer.py @@ -0,0 +1,200 @@ +"""Abstract base for frontend action tokenizers.""" + +from __future__ import annotations + +import logging +from abc import ABC, abstractmethod +from collections.abc import Sequence + +import numpy as np +import torch + +from ._types import ActionIdxBatch, DecodeResult, TokenIds + +logger = logging.getLogger(__name__) + + +class BaseActionTokenizer(ABC): + """Base action tokenizer: maps actions ↔ discrete action-token ids.""" + + BAR_SENTINEL_TOKENS = ("", "", "") + + encode_kwargs: frozenset[str] = frozenset() + + drops_noop_parts: bool = False + + parts_meta: dict[str, int] | None = None + + def __init__(self, *, append_bar_sentinels: bool = True) -> None: + required = ( + "action_tokenizer", + "_action_vocab_size", + "_new_action_tokens", + "max_action_token_len", + "fixed_action_token_len", + ) + missing = [a for a in required if not hasattr(self, a)] + if missing: + raise ValueError( + f"{type(self).__name__}.__init__ must set {missing} before super().__init__()" + ) + if self.max_action_token_len is not None: + self.max_action_token_len = int(self.max_action_token_len) + if self.max_action_token_len <= 0: + raise ValueError( + f"{type(self).__name__}: max_action_token_len must be positive, " + f"got {self.max_action_token_len}" + ) + if self.fixed_action_token_len is not None: + self.fixed_action_token_len = int(self.fixed_action_token_len) + if self.max_action_token_len is None: + raise ValueError( + f"{type(self).__name__}: fixed_action_token_len requires a finite " + "max_action_token_len" + ) + if self.fixed_action_token_len != self.max_action_token_len: + raise ValueError( + f"{type(self).__name__}: fixed_action_token_len=" + f"{self.fixed_action_token_len} must equal max_action_token_len=" + f"{self.max_action_token_len} — a fixed-length row is its own maximum" + ) + base = int(self._action_vocab_size) + self._new_action_tokens = list(self._new_action_tokens) + if append_bar_sentinels: + self._new_action_tokens += list(self.BAR_SENTINEL_TOKENS) + self.bos_blk_id: int | None = base + self.eos_blk_id: int | None = base + 1 + self.pad_action_id: int | None = base + 2 + self._action_vocab_size = base + len(self.BAR_SENTINEL_TOKENS) + else: + self.bos_blk_id = self.eos_blk_id = self.pad_action_id = None + + @property + def new_action_tokens(self) -> list[str]: + """Token strings in id order — downstream registers these into its VLM vocab.""" + return list(self._new_action_tokens) + + def to_token_strs(self, token_ids: TokenIds) -> list[str]: + """Render one id row as its token strings, e.g. ```` / ````.""" + row = self._to_id_row(token_ids).tolist() + n = len(self._new_action_tokens) + bad = [i for i in row if not (0 <= i < n)] + if bad: + raise ValueError(f"token ids {bad[:5]} out of range [0, {n})") + return [self._new_action_tokens[i] for i in row] + + def to(self, device_id): + """Move the backend to ``device_id`` and record it as ``self.device``.""" + self.device = torch.device(device_id) + self.action_tokenizer = self.action_tokenizer.to(device_id) + return self + + def _check_encode_kwargs(self, encode_kwargs: dict | None) -> dict: + kw = dict(encode_kwargs or {}) + unknown = sorted(set(kw) - self.encode_kwargs) + if unknown: + raise ValueError( + f"{type(self).__name__} does not consume encode_kwargs {unknown}; " + f"it declares {sorted(self.encode_kwargs)}" + ) + return kw + + def __call__( + self, + action: torch.Tensor, + *, + encode_kwargs: dict | None = None, + ) -> ActionIdxBatch: + return self._encode_action_indices( + action, encode_kwargs=self._check_encode_kwargs(encode_kwargs) + ) + + def _strip_bar_sentinels(self, row: torch.Tensor) -> torch.Tensor: + if self.bos_blk_id is None: + return row + keep = (row != self.bos_blk_id) & (row != self.eos_blk_id) & (row != self.pad_action_id) + return row[keep] + + @staticmethod + def _to_id_row(token_ids: TokenIds) -> torch.Tensor: + if isinstance(token_ids, torch.Tensor): + row = token_ids.detach().cpu() + if row.dtype == torch.bool or row.dtype.is_floating_point or row.dtype.is_complex: + raise ValueError("token ids must be integers") + row = row.to(torch.long) + else: + values = np.asarray(token_ids) + if values.dtype.kind not in {"i", "u"} and values.size: + raise ValueError("token ids must be integers") + row = torch.from_numpy(np.asarray(values, dtype=np.int64)) + if row.ndim != 1: + raise ValueError(f"token id row must be 1D, got {tuple(row.shape)}") + return row + + def _checked_decode_row(self, token_ids: TokenIds) -> torch.Tensor: + row = self._to_id_row(token_ids) + invalid = (row < 0) | (row >= int(self._action_vocab_size)) + if torch.any(invalid): + bad = row[invalid][:5].tolist() + raise ValueError(f"token ids {bad} out of range [0, {int(self._action_vocab_size)})") + return self._strip_bar_sentinels(row) + + def decode_token_ids_to_actions( + self, + action_token_ids: TokenIds, + *, + time_horizon: int | None = None, + action_dim: int | None = None, + decode_kwargs: dict | None = None, + ) -> DecodeResult: + """Decode one action-token id row back to a ``(T, D)`` action chunk.""" + row = self._checked_decode_row(action_token_ids) + actions_np, absent_keys_list = self._decode_action_indices( + [row.tolist()], + time_horizon=time_horizon, + action_dim=action_dim, + decode_kwargs=decode_kwargs, + ) + return DecodeResult( + action=torch.from_numpy(actions_np)[0], + absent_keys=absent_keys_list[0] if absent_keys_list else set(), + ) + + def decode_token_ids_to_actions_batch( + self, + action_token_ids: Sequence[TokenIds], + *, + time_horizon: int | None = None, + action_dim: int | None = None, + decode_kwargs: dict | None = None, + ) -> torch.Tensor: + """Decode a batch of id rows to actions ``(B, T, D)``.""" + batch_action_idx: ActionIdxBatch = [ + self._checked_decode_row(a).tolist() for a in action_token_ids + ] + actions_np, _ = self._decode_action_indices( + batch_action_idx, + time_horizon=time_horizon, + action_dim=action_dim, + decode_kwargs=decode_kwargs, + ) + return torch.from_numpy(actions_np) + + @property + def vocab_size(self) -> int: + return int(self._action_vocab_size) + + @abstractmethod + def _encode_action_indices( + self, action: torch.Tensor, encode_kwargs: dict | None = None + ) -> ActionIdxBatch: ... + + @abstractmethod + def _decode_action_indices( + self, + action_indices: ActionIdxBatch, + *, + time_horizon: int | None = None, + action_dim: int | None = None, + decode_kwargs: dict | None = None, + ) -> tuple[np.ndarray, list[set[str]]]: ... diff --git a/runtime/frontend/conversion.py b/runtime/frontend/conversion.py new file mode 100644 index 0000000000000000000000000000000000000000..c8663b7429846176727b52303a440febad570cfe --- /dev/null +++ b/runtime/frontend/conversion.py @@ -0,0 +1,63 @@ +from __future__ import annotations + +from collections.abc import Mapping + +import numpy as np + +import torch + +from ..backends.actioncodec2 import ( + PresetConfig, +) + + +def _numpy(value): + return value.detach().cpu().float().numpy() if isinstance(value, torch.Tensor) else value + + +def _numpy_token_rows(token_ids): + if isinstance(token_ids, torch.Tensor): + if ( + token_ids.dtype == torch.bool + or token_ids.dtype.is_floating_point + or token_ids.dtype.is_complex + ): + raise ValueError("token ids must be integers") + values = token_ids.detach().cpu().long().numpy() + if values.ndim == 2: + return values.tolist() + elif isinstance(token_ids, np.ndarray) and token_ids.ndim == 2: + if token_ids.dtype.kind not in {"i", "u"}: + raise ValueError("token ids must be integers") + return np.asarray(token_ids, dtype=np.int64).tolist() + rows = [] + for row in token_ids: + if isinstance(row, torch.Tensor): + if row.dtype == torch.bool or row.dtype.is_floating_point or row.dtype.is_complex: + raise ValueError("token ids must be integers") + values = row.detach().cpu().long().numpy() + else: + values = np.asarray(row) + if values.dtype.kind not in {"i", "u"} and values.size: + raise ValueError("token ids must be integers") + values = np.asarray(values, dtype=np.int64) + if values.ndim != 1: + raise ValueError(f"token id row must be 1D, got {values.shape}") + rows.append(values.tolist()) + return rows + + +def restore_source_layout(preset: PresetConfig, decoded: Mapping[str, np.ndarray]) -> np.ndarray: + """Place ``{component: (B,T,D_c)}`` outputs back into the preset's ``(B,T,D)`` columns.""" + first = next(iter(decoded.values())) + batch, steps = first.shape[:2] + if any(values.shape[:2] != (batch, steps) for values in decoded.values()): + raise RuntimeError("decoded components disagree on batch or sequence length") + actions = np.empty((batch, steps, preset.input_dim), dtype=np.float32) + for component in preset.components: + values = decoded[component.name] + motion_width = len(component.source_dims) + actions[:, :, component.source_dims] = values[:, :, :motion_width] + if component.gripper_dim is not None: + actions[:, :, component.gripper_dim] = values[:, :, motion_width] + return actions diff --git a/runtime/training/fitting.py b/runtime/frontend/fitting.py similarity index 50% rename from runtime/training/fitting.py rename to runtime/frontend/fitting.py index 9ce0ca01b841ac14439d7b4bc9b14326d3dac559..ad9088988b24df3c358fadde85fc0ef26f584f22 100644 --- a/runtime/training/fitting.py +++ b/runtime/frontend/fitting.py @@ -10,15 +10,14 @@ from tempfile import TemporaryDirectory import numpy as np import torch -from ..physical.boundary import bootstrap_second_order_trajectory -from ..routing.routing import ActionCodec2Router -from ..frontend.tokenizer import _numpy -from .training import ProfileTrainer -from ..physical.trajectory import ActiveTrajectory +from ..backends.actioncodec2.boundary import bootstrap_second_order_trajectory +from ..backends.actioncodec2.trajectory import ActiveTrajectory +from ..backends.actioncodec2.preprocessing import PreprocessingSpec +from .conversion import _numpy class TrajectorySpool: - "Stage canonical episodes in two sequential files, without retaining source data." + """Stage canonical episodes as one concatenated .npy stream per profile.""" def __init__(self, directory): self.directory = Path(directory) @@ -35,39 +34,53 @@ class TrajectorySpool: def append(self, profile, trajectory): if profile not in self._writers: self._writers[profile] = self._stack.enter_context( - (self.directory / f"{profile}.npy").open("wb") + (self.directory / f"{profile}.episodes").open("wb") ) stream = self._writers[profile] for value in ( trajectory.values, trajectory.active_dims, - [] - if trajectory.previous_first_order is None - else trajectory.previous_first_order, + [] if trajectory.previous_first_order is None else trajectory.previous_first_order, ): np.save(stream, np.asarray(value), allow_pickle=False) self.counts[profile] = self.counts.get(profile, 0) + 1 def trajectories(self, profile): self._writers[profile].flush() - with (self.directory / f"{profile}.npy").open("rb") as stream: + with (self.directory / f"{profile}.episodes").open("rb") as stream: for _ in range(self.counts[profile]): values = np.load(stream, allow_pickle=False) dims = tuple(int(d) for d in np.load(stream, allow_pickle=False)) previous = np.load(stream, allow_pickle=False) yield ActiveTrajectory( - values, - dims, - previous_first_order=previous if previous.size else None, + values, dims, previous_first_order=previous if previous.size else None ) -class ActionCodec2Fitter: - "Route user layouts and fit replacement profiles without mutating the caller." +class ProfileFitter: + """Route user layouts and fit replacement profiles without mutating the caller.""" - def __init__(self, codec, *, bootstrap_context=False): + def __init__(self, codec, *, bootstrap_context=False, apply_preprocessing=False, preprocessing=None): if not isinstance(bootstrap_context, bool): raise TypeError("bootstrap_context must be a boolean") + if type(apply_preprocessing) is not bool: + raise TypeError("apply_preprocessing must be a boolean") + if preprocessing is not None and not apply_preprocessing: + raise ValueError("preprocessing requires apply_preprocessing=True during tokenizer fitting") + self.preprocessing = dict(codec.preprocessing) + if preprocessing is not None: + if not isinstance(preprocessing, Mapping) or set(preprocessing) - set(codec.action_tokenizer.profiles): + raise ValueError("preprocessing must map available physical profiles to cleaning specs") + self.preprocessing = { + name: spec if isinstance(spec, PreprocessingSpec) else PreprocessingSpec.from_dict(spec) + for name, spec in preprocessing.items() + } + self.apply_preprocessing = apply_preprocessing + if apply_preprocessing: + for name, spec in self.preprocessing.items(): + if spec.version == 2 and spec.profile != name: + raise ValueError(f"preprocessing profile {spec.profile!r} does not match {name!r}") + self.trainer_class = codec.trainer_class self.codec = codec self.router = codec.action_tokenizer self.bootstrap_context = bootstrap_context @@ -84,21 +97,15 @@ class ActionCodec2Fitter: raise ValueError(f"unknown training record fields: {sorted(unknown)}") if "actions" not in record: raise ValueError("training record requires an 'actions' array") - preset = self.router.preset( - record.get("action_space", self.codec.action_space.name) - ) + preset = self.router.preset(record.get("action_space", self.codec.action_space.name)) values = _numpy(torch.as_tensor(record["actions"])) if values.ndim == 2: values = values[None] if values.ndim != 3 or values.shape[0] == 0 or values.shape[1] == 0: - raise ValueError( - "training actions must have nonempty shape (T,D) or (B,T,D)" - ) + raise ValueError("training actions must have nonempty shape (T,D) or (B,T,D)") current = _numpy(record.get("current_state")) if preset.input == "absolute" and current is None: - raise ValueError( - f"absolute action space {preset.name!r} requires current_state(B,D)" - ) + raise ValueError(f"absolute action space {preset.name!r} requires current_state(B,D)") if preset.input == "delta" and current is not None: raise ValueError(f"delta action space {preset.name!r}: omit current_state") previous = self.codec._numpy_boundary(record.get("previous_first_order")) @@ -107,25 +114,33 @@ class ActionCodec2Fitter: fps=self.codec._source_fps(record.get("fps"), preset), current_state=current, ) - if not self.bootstrap_context: - return self.router.route_trajectories( - values, previous_first_order=previous, **kwargs - ) - if previous is not None: - raise ValueError( - "bootstrap_context and previous_first_order are mutually exclusive" - ) - canonical = preset.canonicalize( - values, source_hz=kwargs["fps"], current_state=current - ) + if not self.bootstrap_context and not self.apply_preprocessing: + return self.router.route_trajectories(values, previous_first_order=previous, **kwargs) + if self.bootstrap_context and previous is not None: + raise ValueError("bootstrap_context and previous_first_order are mutually exclusive") + canonical = preset.canonicalize(values, source_hz=kwargs["fps"], current_state=current) routed = {} for component in preset.components: processor = self.router.profiles[component.space].processor trajectories = canonical[component.name] + if self.apply_preprocessing: + if component.space not in self.preprocessing: + raise ValueError(f"no preprocessing spec for profile {component.space!r}") + spec = self.preprocessing[component.space] + if processor.requires_previous_first_order and not self.bootstrap_context: + raise ValueError("second-order cleaning requires full trajectories and bootstrap_context=True") + column = -1 if component.gripper_dim is not None else None + limits = self.codec._joint_ease_limits(component.space, len(component.active_dims), column, component.active_dims) + cleaned = [] + for trajectory in trajectories: + values = spec.apply(trajectory.values, ease_limits=limits, + gripper_column=column, active_dims=component.active_dims) + if len(values): + cleaned.append(ActiveTrajectory(values, component.active_dims)) + trajectories = cleaned if processor.requires_previous_first_order: trajectories = [ - bootstrap_second_order_trajectory(t, processor.config) - for t in trajectories + bootstrap_second_order_trajectory(t, processor.config) for t in trajectories ] routed.setdefault(component.space, []).extend(trajectories) return routed @@ -136,23 +151,15 @@ class ActionCodec2Fitter: if isinstance(episodes, (np.ndarray, torch.Tensor, Mapping)): episodes = (episodes,) reports = {} - processors = { - name: runtime.processor for name, runtime in self.router.profiles.items() - } + processors = {name: runtime.processor for name, runtime in self.router.profiles.items()} records = 0 with TemporaryDirectory(prefix="actioncodec2-fit-", dir=work_dir) as directory: with TrajectorySpool(directory) as spool: for episode in episodes: - record = ( - dict(episode) - if isinstance(episode, Mapping) - else {"actions": episode} - ) + record = dict(episode) if isinstance(episode, Mapping) else {"actions": episode} duplicates = set(record).intersection(metadata) if duplicates: - raise ValueError( - f"training arguments provided twice: {sorted(duplicates)}" - ) + raise ValueError(f"training arguments provided twice: {sorted(duplicates)}") record.update(metadata) for profile, trajectories in self._route(record).items(): for trajectory in trajectories: @@ -161,19 +168,20 @@ class ActionCodec2Fitter: if not spool.counts: raise ValueError("fit requires at least one nonempty episode") for name in spool.counts: - processors[name], reports[name] = ProfileTrainer( - processors[name].config - ).fit(spool.trajectories(name), **options) - router = ActionCodec2Router.from_processors( + trainer = self.trainer_class(processors[name].config) + processors[name], reports[name] = trainer.fit( + spool.trajectories(name), **options + ) + router = type(self.router).from_processors( processors, token_budgets={ - name: runtime.spec.token_budget - for name, runtime in self.router.profiles.items() + name: runtime.spec.token_budget for name, runtime in self.router.profiles.items() }, presets=list(self.router.action_spaces.values()), ) return router, { "records": records, "bootstrap_context": self.bootstrap_context, + "apply_preprocessing": self.apply_preprocessing, "profiles": reports, } diff --git a/runtime/frontend/layout.py b/runtime/frontend/layout.py new file mode 100644 index 0000000000000000000000000000000000000000..eacf465bfabb06bcc1f0b429cf5f181a04c35989 --- /dev/null +++ b/runtime/frontend/layout.py @@ -0,0 +1,48 @@ +"""Action-space bindings and boundary conventions shared by both codecs.""" +from __future__ import annotations +from collections.abc import Mapping +import numpy as np +from pathlib import Path +from ..backends.actioncodec2.presets import PresetConfig +from .conversion import _numpy + +class ActionSpaceMixin: + def __str__(self) -> str: + + return self._describe_action_spaces() + + @property + def action_space(self) -> PresetConfig: + """The immutable tensor semantics selected for this tokenizer.""" + return self._action_space + + @property + def action_spaces(self) -> Mapping[str, PresetConfig]: + """Every built-in or user-registered option in the loaded artifact.""" + return self.action_tokenizer.action_spaces + + def register_action_space( + self, + preset: PresetConfig | Mapping[str, object] | str | Path, + ) -> PresetConfig: + """Register a custom action space without changing this instance's binding.""" + return self.action_tokenizer.register_action_space(preset) + + def first_order_template(self, batch_size: int) -> dict[str, np.ndarray]: + 'Explicit zero boundary templates, shaped {component: (B,D_active)}.' + if type(batch_size) is not int or batch_size < 1: + raise ValueError("batch_size must be a positive integer") + return { + name: np.zeros((batch_size, width), dtype=np.float32) + for name, width in self.action_tokenizer.second_order_boundaries( + self.action_space + ).items() + } + + @staticmethod + def _numpy_boundary(previous_first_order): + if previous_first_order is None: + return None + if not isinstance(previous_first_order, Mapping): + raise ValueError("previous_first_order must map component names to [B,D_active] arrays") + return {name: _numpy(value) for name, value in previous_first_order.items()} diff --git a/runtime/frontend/loading.py b/runtime/frontend/loading.py new file mode 100644 index 0000000000000000000000000000000000000000..cea8f365718c51239d7d723cf39747a9cbed644c --- /dev/null +++ b/runtime/frontend/loading.py @@ -0,0 +1,79 @@ +"""Load ActionCodec2Sparse release packages into a router.""" + +from __future__ import annotations + +import json +from pathlib import Path + +from ..backends.actioncodec2.defaults import builtin_action_spaces +from ..backends.actioncodec2.preprocessing import PreprocessingSpec +from ..backends.actioncodec2.presets import format_action_spaces +from ..backends.actioncodec2.release import ( + check_gripper_consistency, + check_release_gates, + selected_variants, +) +from ..backends.actioncodec2.sparse import ActionCodec2SparseProcessor, ActionCodec2SparseRouter + +TOKENIZER = "actioncodec2_sparse" + + +def release_layouts(profiles): + """Built-in layouts whose components are all available in ``profiles``.""" + return { + name: preset + for name, preset in builtin_action_spaces().items() + if {component.space for component in preset.components} <= set(profiles) + } + + +def load_release_router(directory, *, gripper_mode, primitive_order=1, verify_gates, tokenizer=TOKENIZER): + """Load one gripper-mode/order vocabulary per profile with its cleaning policy.""" + manifest, mode, variants = selected_variants( + directory, gripper_mode=gripper_mode, order=primitive_order, tokenizer=tokenizer + ) + from ..backends.actioncodec2 import ActionCodec2Processor, ActionCodec2Router + + processor_class, router_class = ((ActionCodec2SparseProcessor, ActionCodec2SparseRouter) + if tokenizer == TOKENIZER else (ActionCodec2Processor, ActionCodec2Router)) + profiles, preprocessing = {}, {} + for name, variant in variants.items(): + entry = (Path(directory) / variant["path"]).resolve() + if not entry.is_relative_to(Path(directory).resolve()): + raise ValueError("release profile path escapes its artifact directory") + processor = processor_class.from_pretrained(entry) + spec = PreprocessingSpec.from_dict( + json.loads((entry / "preprocessing.json").read_text(encoding="utf-8")) + ) + check_gripper_consistency(entry, processor, spec, mode) + if verify_gates: + if variant.get("gates_passed") is False: + raise ValueError(f"{entry}: recorded release gates failed") + check_release_gates(entry) + profiles[name], preprocessing[name] = processor, spec + router = router_class.from_processors( + profiles, + token_budgets={name: manifest["codebook_size"] for name in profiles}, + presets=list(release_layouts(profiles).values()), + ) + metadata = { + "package": manifest.get("package", Path(directory).name), + "tokenizer": tokenizer, + "precision": manifest["precision"], + "codebook_size": manifest["codebook_size"], + "gripper_mode": mode, + "primitive_order": primitive_order, + "variants": list(variants.values()), + } + return router, preprocessing, metadata + + +def describe_release(directory, *, action_dim, gripper_mode, primitive_order=1, tokenizer=TOKENIZER): + """Report a release's layouts from its manifest alone.""" + _, _, variants = selected_variants( + directory, gripper_mode=gripper_mode, order=primitive_order, tokenizer=tokenizer + ) + presets = release_layouts(variants) + return format_action_spaces( + presets, action_dim=action_dim, codec_name="ActionCodec2Sparse" if tokenizer == TOKENIZER else "ActionCodec2", chunk_horizon_decode=tokenizer == TOKENIZER + ) diff --git a/runtime/frontend/training.py b/runtime/frontend/training.py new file mode 100644 index 0000000000000000000000000000000000000000..850179c08593c0e67cc15b0df7869c2300453e2d --- /dev/null +++ b/runtime/frontend/training.py @@ -0,0 +1,84 @@ +"""Explicit tokenizer pretraining and cleaning shared by both token layers.""" +from __future__ import annotations +from pathlib import Path +from typing import Any +import numpy as np +from .fitting import ProfileFitter + +class TrainingMixin: + def preprocess( + self, + values: np.ndarray, + *, + profile: str | None = None, + gripper_column: int | None = None, + **kwargs: Any, + ) -> np.ndarray: + """Clean a canonical ``(T,D_active)`` profile trajectory for explicit tokenizer pretraining.""" + if profile is None: + profiles = {component.space for component in self.action_space.components} + if len(profiles) != 1: + raise ValueError("profile is required for layouts combining joint and EEF") + profile = profiles.pop() + if profile not in self.preprocessing: + raise ValueError(f"no recorded preprocessing for profile {profile!r}") + values = np.asarray(values) + if "ease_limits" not in kwargs and values.ndim == 2: + kwargs["ease_limits"] = self._joint_ease_limits( + profile, values.shape[1], gripper_column, kwargs.get("active_dims") + ) + return self.preprocessing[profile].apply(values, gripper_column=gripper_column, **kwargs) + + def _joint_ease_limits(self, profile, width, gripper_column, active_dims): + processor = self.action_tokenizer.profiles[profile].processor + component = processor.config.physical.components.get("generalized_joint_position") + if profile != "joint" or component is None or component.primitive_order != 1: + return None + domain = component.constraints["order_1"] + limits = np.full(processor.action_dim, np.inf) + limits[list(component.dims)] = np.minimum(np.abs(domain.minimum), np.abs(domain.maximum)) + dims = tuple(range(width)) if active_dims is None else tuple(active_dims) + limits = limits[list(dims)] + if gripper_column is not None: + limits[gripper_column] = np.inf + return limits + + def fit( + self, + episodes, + *, + fps: float | None = None, + current_state=None, + previous_first_order=None, + bootstrap_context: bool = False, + apply_preprocessing: bool = False, + preprocessing=None, + backend: str = "auto", + threads: int = 0, + batch_size: int = 256, + progress: bool = False, + max_cell_bytes: int | None = None, + work_dir: str | Path | None = None, + ) -> TrainingMixin: + """Fit vocabularies from episodes in declared source layouts.""" + fitter = ProfileFitter(self, bootstrap_context=bootstrap_context, + apply_preprocessing=apply_preprocessing, preprocessing=preprocessing) + router, report = fitter.fit( + episodes, + work_dir=work_dir, + metadata=dict( + fps=fps, current_state=current_state, previous_first_order=previous_first_order + ), + backend=backend, + threads=threads, + batch_size=batch_size, + progress=progress, + max_cell_bytes=max_cell_bytes, + ) + replacement = type(self)(router, action_space=self.action_space.name) + replacement._fitted_profiles = self.fitted_profiles | report["profiles"].keys() + replacement.training_report = report + replacement.preprocessing = dict(fitter.preprocessing) + replacement._warned_default_fps = self._warned_default_fps + self.__dict__.update(replacement.__dict__) + return self diff --git a/runtime/hub_acceleration.py b/runtime/hub_acceleration.py deleted file mode 100644 index 005302c713e1d6fa5185b5639384dc7351d69c6a..0000000000000000000000000000000000000000 --- a/runtime/hub_acceleration.py +++ /dev/null @@ -1,335 +0,0 @@ -"""Install the shared C++ kernels in a portable ActionCodec2 runtime.""" - -from __future__ import annotations - -import functools -import importlib -from numbers import Integral -import os - -import numpy as np - - -def load_native(): - """Return installed portable or VLA kernels, with a fork-safe thread budget.""" - if os.environ.get("ACTIONCODEC2_NO_NATIVE"): - return None - for name in ( - "actioncodec2_kernels._actioncodec2_native", - "actioncodec2.tokenizers._actioncodec2_native", - ): - try: - native = importlib.import_module(name) - except ImportError: - continue - _configure(native) - return native - return None - - -@functools.cache -def _configure(native) -> None: - - configured = os.environ.get("ACTIONCODEC2_NUM_THREADS") - if configured is not None: - if not configured.isdigit() or int(configured) < 1: - raise ValueError("ACTIONCODEC2_NUM_THREADS must be a positive integer") - native.set_thread_budget(int(configured)) - else: - native.set_thread_budget(0) - if hasattr(os, "register_at_fork"): - os.register_at_fork(after_in_child=lambda: native.set_thread_budget(1)) - - -def install(package: str) -> None: - """Accelerate an artifact while preserving its profiles and public contracts.""" - backend = importlib.import_module(f"{package}.backend.native_backend") - - def native_now(): - return backend.native if backend.have_native() else None - - if not getattr(backend, "_portable_reconstruction_grammar", False): - numerical = importlib.import_module(f"{package}.physical.physical_codec") - grammars = importlib.import_module(f"{package}.tokenization.grammar") - for runtime_class, method, kernel in ( - (numerical._SO3Runtime, "decode_batch", "so3_reconstruct"), - (numerical._AdditiveRuntime, "_decode_second_order", "additive_reconstruct"), - ): - original = getattr(runtime_class, method) - - @functools.wraps(original) - def reconstruct(self, cells, previous_first_order=None, *, - _original=original, _kernel=kernel): - native = native_now() - if native is None or not hasattr(native, _kernel): - return _original(self, cells, previous_first_order) - if previous_first_order is None: - if self.config.primitive_order == 2: - raise ValueError("second-order reconstruction requires previous_first_order") - previous_first_order = np.zeros((len(cells), len(self.primitives)), np.float32) - if not hasattr(self, "_portable_reconstruction_table"): - self._portable_reconstruction_table = self._native_table.astype(np.float64) - args = ( - self._portable_reconstruction_table, self._native_bins, cells, - previous_first_order, numerical._scale(self.config), self.config.input_order, - ) - if _kernel == "additive_reconstruct": - return native.additive_reconstruct(*args) - return native.so3_reconstruct( - *args, self.config.primitive_order, self.left, - self.config.representation == "rotation_vector", - getattr(self, "second_order_radius", np.inf), - ) - - setattr(runtime_class, method, reconstruct) - - def compiled_grammar(grammar): - native = native_now() - kind = "SetGrammar" if hasattr(grammar, "_full") else "PlainGrammar" - if native is None or not hasattr(native, kind): - return None - compiled = getattr(grammar, "_portable_native", None) - if compiled is None: - if kind == "SetGrammar": - compiled = native.SetGrammar( - grammar.horizon, grammar._full, grammar._root_anchor.tolist(), - grammar._patterns, - ) - else: - compiled = native.PlainGrammar( - grammar.horizon, grammar._token_cells.tolist(), grammar._phase - ) - grammar._portable_native = compiled - return compiled - - for grammar_class in (grammars.ActionCodec2Grammar, grammars.ActionCodec2BPEGrammar): - original_advance = grammar_class._advance - original_mask = grammar_class._next_token_mask_from_state - - def advance(self, state, token, *, _original=original_advance): - compiled = compiled_grammar(self) - if compiled is not None: - return compiled.advance(state, token) - if hasattr(self, "_full") and 0 <= token < self.vocab_size: - if any(support & ~self._full for _, support in self._patterns[token]): - return None - return _original(self, state, token) - - def next_mask(self, state, *, _original=original_mask): - compiled = compiled_grammar(self) - if compiled is None: - mask = _original(self, state) - if hasattr(self, "_full"): - scope = getattr(self, "_portable_scope", None) - if scope is None: - scope = self._portable_scope = np.asarray([ - all(support & ~self._full == 0 for _, support in pattern) - for pattern in self._patterns - ], dtype=bool) - mask &= scope - self._mask_cache[state] = mask.copy() - return mask - key = state if hasattr(self, "_full") else state[0] - mask = self._mask_cache.get(key) - if mask is None: - mask = compiled.mask(state) - self._mask_cache[key] = mask - return mask.copy() - - grammar_class._advance = advance - grammar_class._next_token_mask_from_state = next_mask - backend._portable_reconstruction_grammar = True - - if getattr(backend, "_portable_acceleration", False): - return - backend._portable_acceleration = True - backend.native = load_native() - semantic = importlib.import_module(f"{package}.physical.semantic") - presets = importlib.import_module(f"{package}.routing.presets") - trajectory = importlib.import_module(f"{package}.physical.trajectory") - physical = importlib.import_module(f"{package}.physical.physical_processor") - validation = importlib.import_module(f"{package}.common._validation") - - def wrap_pose(name, kernel, width): - original = getattr(semantic, name) - - @functools.wraps(original) - def wrapped(values): - native = native_now() - array = np.asarray(values) - if (native is None or array.dtype != np.float32 or array.ndim != 2 - or array.shape[1] != width or len(array) < 1 - or not np.all(np.isfinite(array))): - return original(values) - return getattr(native, kernel)(array[None])[0] - - setattr(semantic, name, wrapped) - if hasattr(presets, name): - setattr(presets, name, wrapped) - - for name, kernel, width in ( - ("integrate_eef_deltas", "integrate_eef_deltas_batch", 6), - ("eef_pose_absolute", "eef_pose_absolute_batch", 7), - ("eef_pose_deltas", "eef_pose_deltas_batch", 7), - ): - wrap_pose(name, kernel, width) - - original_resample = semantic.resample_uniform - - @functools.wraps(original_resample) - def resample(values, *, source_hz, target_hz, kind="linear", target_length=None, - method="linear"): - native = native_now() - array = np.asarray(values) - if (native is None or array.dtype != np.float32 or array.ndim != 2 - or len(array) < 1 or not np.all(np.isfinite(array)) - or kind not in {"linear", "hold", "pose_xyzw"} - or (target_length is not None and ( - isinstance(target_length, bool) or not isinstance(target_length, Integral) - or target_length < 1))): - return original_resample(values, source_hz=source_hz, target_hz=target_hz, - kind=kind, target_length=target_length, method=method) - return native.resample_uniform_batch( - array[None], source_hz, target_hz, kind, - -1 if target_length is None else target_length, method, - )[0] - - semantic.resample_uniform = presets.resample_uniform = resample - original_canonicalize = presets.PresetConfig.canonicalize - - @functools.wraps(original_canonicalize) - def canonicalize(self, values, *, source_hz=None, current_state=None): - native = native_now() - array = np.asarray(values, dtype=np.float32) - if (native is None or self.input != "delta" or current_state is not None - or array.ndim != 3 or min(array.shape) < 1 - or array.shape[2] != self.input_dim or not np.all(np.isfinite(array)) - or any(c.space == "eef" and c.rotation_format != "rotation_vector" - for c in self.components)): - return original_canonicalize(self, values, source_hz=source_hz, - current_state=current_state) - rate = self.source_hz if source_hz is None else source_hz - output = {} - for component in self.components: - if component.space == "eef": - motion = np.concatenate((array[..., component.position_dims], - array[..., component.rotation_dims]), axis=2) - pose = native.integrate_eef_deltas_batch(motion) - sampled = native.resample_uniform_batch( - pose, rate, self.target_hz, "pose_xyzw", -1, self.interpolation - ) - motion = native.eef_pose_absolute_batch(sampled) - else: - motion = np.cumsum(array[..., component.joint_dims], axis=1, - dtype=np.float32) - motion = native.resample_uniform_batch( - motion, rate, self.target_hz, "linear", -1, self.interpolation - ) - if component.gripper_dim is not None: - gripper = native.resample_uniform_batch( - array[..., component.gripper_dim:component.gripper_dim + 1], - rate, self.target_hz, "hold", -1, self.interpolation, - ) - gripper = semantic.binarize_gripper_actions( - gripper.reshape(-1, 1), threshold=component.gripper_threshold, - open_is_high=component.gripper_open_is_high, - ).reshape(gripper.shape) - motion = np.concatenate((motion, gripper), axis=2) - output[component.name] = [ - trajectory.ActiveTrajectory(row, component.active_dims) for row in motion - ] - return output - - presets.PresetConfig.canonicalize = canonicalize - original_encode = physical.ActionCodec2Processor.encode_batch - original_decode = physical.ActionCodec2Processor.decode_batch - - def serializer(self): - native = native_now() - if native is None or self.serializer.scheme != "set_bpe": - return None - if not hasattr(self, "_portable_setbpe"): - saved = self.serializer - self._portable_setbpe = native.SetBPE( - saved.bins, saved.lookahead, saved.spatial_merges, saved.temporal_merges - ) - return self._portable_setbpe - - @functools.wraps(original_encode) - def encode_batch(self, actions, *, active_dims=None, previous_first_order=None): - codec = serializer(self) - if codec is None: - return original_encode(self, actions, active_dims=active_dims, - previous_first_order=previous_first_order) - values = np.asarray(actions, dtype=np.float32) - if values.ndim != 3 or min(values.shape) < 1: - raise ValueError("actions must have non-empty shape [B, T, D_active]") - dims = validation.active_dimensions(active_dims, self.action_dim) - if len(dims) != values.shape[2]: - raise ValueError("active_dims must have one entry per action coordinate") - dense = np.zeros((*values.shape[:2], self.action_dim), dtype=np.float32) - dense[..., dims] = values - previous = self._dense_previous_first_order(previous_first_order, dims, len(values)) - cells = self.quantize_batch(dense, previous_first_order=previous) - absent = np.ones(self.action_dim, dtype=bool) - absent[list(dims)] = False - cells[..., absent] = -1 - return codec.encode_batch(cells) - - @functools.wraps(original_decode) - def decode_batch(self, streams, *, active_dims=None, previous_first_order=None): - codec = serializer(self) - if codec is None: - return original_decode(self, streams, active_dims=active_dims, - previous_first_order=previous_first_order) - dims = validation.active_dimensions(active_dims, self.action_dim) - rows = list(streams) - decoder = getattr(codec, "decode_checked_batch", None) - if decoder is None: - for index, stream in enumerate(rows): - checked = [] - for token in stream: - if isinstance(token, bool) or not isinstance(token, Integral): - raise ValueError("tokens must be integers") - if not 0 <= int(token) < self.vocab_size: - raise ValueError("token is outside the vocabulary") - checked.append(int(token)) - rows[index] = checked - decoder = codec.decode_batch - cells = decoder(rows, self.action_dim, sum(1 << d for d in dims)) - previous = self._dense_previous_first_order(previous_first_order, dims, len(rows)) - decoded = self.physical.decode_batch( - self._fill_inactive_cells(cells), previous_first_order=previous - ) - return np.take(decoded, dims, axis=2) - - physical.ActionCodec2Processor.encode_batch = encode_batch - physical.ActionCodec2Processor.decode_batch = decode_batch - - exporting = importlib.import_module(f"{package}.integration.exporting") - for name in ("hub_acceleration.py", "hub_entry.py"): - if name not in exporting.MODULE_FILES: - exporting.MODULE_FILES.append(name) - original_export = exporting.ArtifactExporter.export - - @functools.wraps(original_export) - def export(self): - import shutil - from pathlib import Path - - self.package_root = Path(exporting.__file__).absolute().parent.parent - files = original_export(self) - source = self.package_root.parent - for name in ("setup.py", "pyproject.toml", "LICENSE"): - path = source / name - target = self.output / name - if path.is_file() and path.resolve() != target.resolve(): - shutil.copyfile(path, target) - files.append(str(target)) - kernels = source / "actioncodec2_kernels" - if kernels.is_dir() and kernels.resolve() != (self.output / kernels.name).resolve(): - shutil.copytree(kernels, self.output / kernels.name, dirs_exist_ok=True, - ignore=shutil.ignore_patterns("__pycache__", "*.so", "*.pyc")) - return files - - exporting.ArtifactExporter.export = export diff --git a/runtime/integration/__init__.py b/runtime/integration/__init__.py deleted file mode 100644 index 3dfc34f876e95750bbb267c77ddc798e1782421a..0000000000000000000000000000000000000000 --- a/runtime/integration/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Internal integration components for ActionCodec2.""" diff --git a/runtime/integration/exporting.py b/runtime/integration/exporting.py deleted file mode 100644 index feacb74730f54fdcfcfe8be818f6969bc0a75c31..0000000000000000000000000000000000000000 --- a/runtime/integration/exporting.py +++ /dev/null @@ -1,48 +0,0 @@ -"""Write the portable runtime and user guide for a saved ActionCodec2 artifact.""" -import shutil -from pathlib import Path -MODULE_FILES: list[str] -SUPPORT_FILES: dict[str, str] -USER_GUIDE: str - -class ArtifactExporter: - """Copy portable code alongside numerical artifacts.""" - - def __init__(self, directory: str | Path, *, source_directory: str | Path | None=None) -> None: - self.output = Path(directory) - self.package_root = Path(__file__).resolve().parent.parent - self.source = Path(source_directory) if source_directory else self.package_root - - def export(self) -> list[str]: - self.output.mkdir(parents=True, exist_ok=True) - files = [] - runtime = self.output / 'runtime' - runtime.mkdir(parents=True, exist_ok=True) - for name in MODULE_FILES: - source = self.package_root / name - if not source.is_file(): - source = self.source / name - target = runtime / name - target.parent.mkdir(parents=True, exist_ok=True) - if source.resolve() != target.resolve(): - shutil.copyfile(source, target) - files.append(str(target)) - (runtime / '__init__.py').write_text('"""Private inference runtime bundled with this ActionCodec2 artifact."""\n', encoding='utf-8') - entry = self.package_root / 'hub_entry.py' - if not entry.is_file(): - entry = self.source / 'runtime' / 'hub_entry.py' - target = self.output / 'processing_actioncodec2.py' - if entry.resolve() != target.resolve(): - shutil.copyfile(entry, target) - files.append(str(target)) - for name in ('requirements.txt',): - content = SUPPORT_FILES[name] - target = self.output / name - target.write_text(content, encoding='utf-8') - files.append(str(target)) - if not (self.output / 'README.md').exists(): - (self.output / 'README.md').write_text(USER_GUIDE, encoding='utf-8') - return files -USER_GUIDE = '# Saved ActionCodec2 processor\n\nLoad this directory with `AutoProcessor.from_pretrained(path, trust_remote_code=True, local_files_only=True)`. Keep all files together.\nThe action-space binding and selected fitted assets are preserved.\nSecond-order motion requires `previous_first_order`; absolute layouts require `current_state`.\n' -SUPPORT_FILES = {'requirements.txt': 'numpy\nscipy\ntorch>=2.3\ntransformers>=4.57,<6\nhuggingface-hub\npyyaml\n'} -MODULE_FILES = ['backend/__init__.py', 'backend/native_backend.py', 'common/__init__.py', 'common/_frontend_base.py', 'common/_types.py', 'common/_validation.py', 'frontend/__init__.py', 'frontend/tokenizer.py', 'integration/__init__.py', 'integration/exporting.py', 'integration/hf.py', 'physical/__init__.py', 'physical/_so3.py', 'physical/boundary.py', 'physical/configuration.py', 'physical/physical_codec.py', 'physical/physical_processor.py', 'physical/primitives.py', 'physical/semantic.py', 'physical/trajectory.py', 'routing/__init__.py', 'routing/cache.py', 'routing/defaults.py', 'routing/presets.py', 'routing/routing.py', 'tokenization/__init__.py', 'tokenization/bpe.py', 'tokenization/bpe_training.py', 'tokenization/bpe_vocabulary.py', 'tokenization/generation.py', 'tokenization/grammar.py', 'tokenization/setbpe_spatial.py', 'tokenization/setbpe_spatial_training.py', 'tokenization/setbpe_temporal.py', 'tokenization/setbpe_temporal_training.py', 'training/__init__.py', 'training/fitting.py', 'training/training.py', 'processing_actioncodec2.py'] diff --git a/runtime/physical/__init__.py b/runtime/physical/__init__.py deleted file mode 100644 index c6eb6a1f9be6571d42b792c32c4a04a12ccdb793..0000000000000000000000000000000000000000 --- a/runtime/physical/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Internal physical components for ActionCodec2.""" diff --git a/runtime/routing/__init__.py b/runtime/routing/__init__.py deleted file mode 100644 index 7cb6b89d66b1e8d01e229067c0c6a1adf3976690..0000000000000000000000000000000000000000 --- a/runtime/routing/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Internal routing components for ActionCodec2.""" diff --git a/runtime/routing/defaults.py b/runtime/routing/defaults.py deleted file mode 100644 index af6a630406a649ba641e397ff19fd8528d292d6c..0000000000000000000000000000000000000000 --- a/runtime/routing/defaults.py +++ /dev/null @@ -1,609 +0,0 @@ -"""Package-owned configuration templates for fresh ActionCodec2 instances.""" - -from __future__ import annotations - -from collections.abc import Mapping - -from ..tokenization.bpe import BPESerializer, SetBPESerializer -from ..physical.configuration import ActionCodec2Config -from ..physical.physical_processor import ActionCodec2Processor -from .presets import PresetConfig -from .routing import ActionCodec2Router - - -class CodecBuilder: - "Build unfitted physical profiles from packaged defaults or explicit configs." - - def __init__(self, *, primitive_order=1, bpe_scheme=None, profile_configs=None): - if type(primitive_order) is not int or primitive_order not in (1, 2): - raise ValueError("primitive_order must be 1 or 2") - if bpe_scheme not in (None, "set_bpe", "bpe"): - raise ValueError("bpe_scheme must be 'set_bpe' or 'bpe'") - if profile_configs is not None and not isinstance(profile_configs, Mapping): - raise TypeError( - "profile_configs must map 'joint'/'eef' to physical configurations" - ) - self.profile_configs = dict(profile_configs or {}) - if set(self.profile_configs) - {"joint", "eef"}: - raise ValueError("profile_configs keys must be 'joint' or 'eef'") - self.primitive_order = primitive_order - self.bpe_scheme = bpe_scheme - - def _config(self, name: str) -> ActionCodec2Config: - suffix = "" if self.primitive_order == 1 else "_second_order_pretrain_v2" - raw = self.profile_configs.get(name, _PROFILE_DEFAULTS[f"{name}{suffix}"]) - if isinstance(raw, ActionCodec2Config): - config = raw - elif isinstance(raw, Mapping): - config = ActionCodec2Config.from_dict(raw) - else: - config = ActionCodec2Config.from_yaml(raw) - if config.train is None: - raise ValueError(f"{name} profile config requires a train section") - if self.bpe_scheme is not None: - payload = config.to_dict() - payload["set_bpe"]["scheme"] = self.bpe_scheme - if self.bpe_scheme == "bpe": - payload["train"]["bpe"]["spatial_vocab_size"] = payload["train"]["bpe"][ - "vocab_size" - ] - config = ActionCodec2Config.from_dict(payload) - return config - - def build(self) -> ActionCodec2Router: - """Create primitive-only profiles; the public facade tracks fitted state.""" - processors = {} - budgets = {} - for name in ("joint", "eef"): - config = self._config(name) - - - from ..training.training import build_primitives - - primitives = build_primitives(config) - if config.set_bpe.scheme == "bpe": - serializer = BPESerializer( - bins=primitives.bins, lookahead=config.set_bpe.lookahead, merges=() - ) - else: - serializer = SetBPESerializer( - bins=primitives.bins, - lookahead=config.set_bpe.lookahead, - spatial_merges=(), - temporal_merges=(), - ) - processors[name] = ActionCodec2Processor(config, primitives, serializer) - budgets[name] = config.train.bpe.vocab_size - presets = list(builtin_action_spaces().values()) - return ActionCodec2Router.from_processors( - processors, token_budgets=budgets, presets=presets - ) - - -def builtin_action_spaces(): - """Return a read-only name-to-preset mapping shipped in the installed package.""" - from types import MappingProxyType - - presets = [PresetConfig.from_dict(value) for value in _PRESET_DEFAULTS.values()] - return MappingProxyType({preset.name: preset for preset in presets}) - - -class ProfileBundleBuilder: - "Assemble two existing physical artifacts using their recorded vocabulary budgets." - - def __init__(self, joint, eef, *, token_budgets=None): - self.paths = {"joint": joint, "eef": eef} - self.budgets = dict(token_budgets or {}) - if self.budgets.keys() - self.paths.keys(): - raise ValueError("token_budgets accepts only 'joint' and 'eef'") - - def build(self): - processors = { - name: ActionCodec2Processor.from_pretrained(path) - for name, path in self.paths.items() - } - budgets = { - name: self.budgets.get( - name, - processor.config.train.bpe.vocab_size - if processor.config.train is not None - else processor.vocab_size, - ) - for name, processor in processors.items() - } - return ActionCodec2Router.from_processors( - processors, - token_budgets=budgets, - presets=list(builtin_action_spaces().values()), - ) - - -_PROFILE_DEFAULTS = { - "eef": { - "model_type": "actioncodec2_unified", - "config_version": 1, - "physical": { - "input_dim": 7, - "components": { - "translation_m": { - "dims": {"start": 0, "stop": 3}, - "space": "additive", - "input_order": 0, - "primitive_order": 1, - "input_transform": {"scale": 1.0, "clip": False}, - "constraints": { - "order_0": {"min": -2.0, "max": 2.0}, - "order_1": {"min": -0.08, "max": 0.08}, - }, - "distortion_limit": 0.005, - "primitive_selection": "smooth", - }, - "orientation_so3": { - "dims": {"start": 3, "stop": 6}, - "space": "so3", - "input_order": 0, - "primitive_order": 1, - "input_transform": {"scale": 1.0, "clip": False}, - "constraints": { - "order_0": { - "min": -3.141592653589793, - "max": 3.141592653589793, - }, - "order_1": {"min": -0.25, "max": 0.25}, - }, - "distortion_limit": 0.02, - "primitive_selection": "smooth", - "representation": "rotation_vector", - "multiplication": "right", - }, - "gripper_open_command": { - "dims": [6], - "space": "additive", - "input_order": 0, - "primitive_order": 0, - "input_transform": {"scale": 1.0, "clip": True}, - "constraints": {"order_0": {"min": 0.0, "max": 1.0}}, - "distortion_limit": 0.5, - "primitive_selection": "nearest", - }, - }, - }, - "set_bpe": {"lookahead": 8, "allow_cross_component_merge": False}, - "train": { - "primitives": { - "zero_primitive_components": ["translation_m", "orientation_so3"] - }, - "bpe": {"spatial_vocab_size": 2048, "vocab_size": 4096}, - "quality_control": {"hard_order_1_scale": 3.0, "min_segment_length": 2}, - }, - }, - "eef_second_order_pretrain_v2": { - "model_type": "actioncodec2_unified", - "config_version": 1, - "physical": { - "input_dim": 7, - "components": { - "translation_m": { - "dims": {"start": 0, "stop": 3}, - "space": "additive", - "input_order": 0, - "primitive_order": 2, - "input_transform": {"scale": 1.0, "clip": False}, - "constraints": { - "order_0": {"min": -2.0, "max": 2.0}, - "order_2": {"min": -0.025, "max": 0.025}, - "order_1": {"min": -0.08, "max": 0.08}, - }, - "distortion_limit": 0.005, - "primitive_selection": "smooth", - }, - "orientation_so3": { - "dims": {"start": 3, "stop": 6}, - "space": "so3", - "input_order": 0, - "primitive_order": 2, - "input_transform": {"scale": 1.0, "clip": False}, - "constraints": { - "order_0": { - "min": -3.141592653589793, - "max": 3.141592653589793, - }, - "order_2": {"min": -0.08, "max": 0.08}, - "order_1": {"min": -0.25, "max": 0.25}, - }, - "distortion_limit": 0.02, - "primitive_selection": "smooth", - "representation": "rotation_vector", - "multiplication": "right", - }, - "gripper_open_command": { - "dims": [6], - "space": "additive", - "input_order": 0, - "primitive_order": 0, - "input_transform": {"scale": 1.0, "clip": True}, - "constraints": {"order_0": {"min": 0.0, "max": 1.0}}, - "distortion_limit": 0.5, - "primitive_selection": "nearest", - }, - }, - }, - "set_bpe": {"lookahead": 8, "allow_cross_component_merge": False}, - "train": { - "primitives": { - "zero_primitive_components": ["translation_m", "orientation_so3"] - }, - "bpe": {"spatial_vocab_size": 2048, "vocab_size": 4096}, - "quality_control": {"hard_order_1_scale": 3.0, "min_segment_length": 2}, - }, - }, - "joint": { - "model_type": "actioncodec2_unified", - "config_version": 1, - "physical": { - "input_dim": 8, - "components": { - "generalized_joint_position": { - "dims": {"start": 0, "stop": 7}, - "space": "additive", - "input_order": 0, - "primitive_order": 1, - "input_transform": {"scale": 1.0, "clip": False}, - "constraints": { - "order_0": { - "min": -6.283185307179586, - "max": 6.283185307179586, - }, - "order_1": {"min": -0.35, "max": 0.35}, - }, - "distortion_limit": [ - 0.004, - 0.004, - 0.006, - 0.0075, - 0.015, - 0.02, - 0.02, - ], - "primitive_selection": "smooth", - }, - "gripper_open_command": { - "dims": [7], - "space": "additive", - "input_order": 0, - "primitive_order": 0, - "input_transform": {"scale": 1.0, "clip": True}, - "constraints": {"order_0": {"min": 0.0, "max": 1.0}}, - "distortion_limit": 0.5, - "primitive_selection": "nearest", - }, - }, - }, - "set_bpe": {"lookahead": 8, "allow_cross_component_merge": False}, - "train": { - "primitives": {"zero_primitive_components": ["generalized_joint_position"]}, - "bpe": {"spatial_vocab_size": 2048, "vocab_size": 4096}, - "quality_control": {"hard_order_1_scale": 3.0, "min_segment_length": 2}, - }, - }, - "joint_second_order_pretrain_v2": { - "model_type": "actioncodec2_unified", - "config_version": 1, - "physical": { - "input_dim": 8, - "components": { - "generalized_joint_position": { - "dims": {"start": 0, "stop": 7}, - "space": "additive", - "input_order": 0, - "primitive_order": 2, - "input_transform": {"scale": 1.0, "clip": False}, - "constraints": { - "order_0": { - "min": -6.283185307179586, - "max": 6.283185307179586, - }, - "order_2": {"min": -0.25, "max": 0.25}, - "order_1": {"min": -0.35, "max": 0.35}, - }, - "distortion_limit": [ - 0.004, - 0.004, - 0.006, - 0.0075, - 0.015, - 0.02, - 0.02, - ], - "primitive_selection": "smooth", - }, - "gripper_open_command": { - "dims": [7], - "space": "additive", - "input_order": 0, - "primitive_order": 0, - "input_transform": {"scale": 1.0, "clip": True}, - "constraints": {"order_0": {"min": 0.0, "max": 1.0}}, - "distortion_limit": 0.5, - "primitive_selection": "nearest", - }, - }, - }, - "set_bpe": {"lookahead": 8, "allow_cross_component_merge": False}, - "train": { - "primitives": {"zero_primitive_components": ["generalized_joint_position"]}, - "bpe": {"spatial_vocab_size": 2048, "vocab_size": 4096}, - "quality_control": {"hard_order_1_scale": 3.0, "min_segment_length": 2}, - }, - }, -} - -_PRESET_DEFAULTS = { - "dual_eef_abs": { - "name": "dual_eef_abs", - "input_dim": 14, - "input": "absolute", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "left_arm": { - "space": "eef", - "position_dims": [0, 1, 2], - "rotation_dims": [3, 4, 5], - "rotation_format": "rotation_vector", - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - "right_arm": { - "space": "eef", - "position_dims": [7, 8, 9], - "rotation_dims": [10, 11, 12], - "rotation_format": "rotation_vector", - "gripper_dim": 13, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - }, - }, - "dual_eef_delta": { - "name": "dual_eef_delta", - "input_dim": 14, - "input": "delta", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "left_arm": { - "space": "eef", - "position_dims": [0, 1, 2], - "rotation_dims": [3, 4, 5], - "rotation_format": "rotation_vector", - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - "right_arm": { - "space": "eef", - "position_dims": [7, 8, 9], - "rotation_dims": [10, 11, 12], - "rotation_format": "rotation_vector", - "gripper_dim": 13, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - }, - }, - "dual_joint6_abs": { - "name": "dual_joint6_abs", - "input_dim": 14, - "input": "absolute", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "left_arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5], - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - "right_arm": { - "space": "joint", - "joint_dims": [7, 8, 9, 10, 11, 12], - "gripper_dim": 13, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - }, - }, - "dual_joint6_delta": { - "name": "dual_joint6_delta", - "input_dim": 14, - "input": "delta", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "left_arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5], - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - "right_arm": { - "space": "joint", - "joint_dims": [7, 8, 9, 10, 11, 12], - "gripper_dim": 13, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - }, - }, - "dual_joint7_abs": { - "name": "dual_joint7_abs", - "input_dim": 16, - "input": "absolute", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "left_arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5, 6], - "gripper_dim": 7, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - "right_arm": { - "space": "joint", - "joint_dims": [8, 9, 10, 11, 12, 13, 14], - "gripper_dim": 15, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - }, - }, - "dual_joint7_delta": { - "name": "dual_joint7_delta", - "input_dim": 16, - "input": "delta", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "left_arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5, 6], - "gripper_dim": 7, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - "right_arm": { - "space": "joint", - "joint_dims": [8, 9, 10, 11, 12, 13, 14], - "gripper_dim": 15, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - }, - }, - }, - "single_eef_abs": { - "name": "single_eef_abs", - "input_dim": 7, - "input": "absolute", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "arm": { - "space": "eef", - "position_dims": [0, 1, 2], - "rotation_dims": [3, 4, 5], - "rotation_format": "rotation_vector", - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - } - }, - }, - "single_eef_delta": { - "name": "single_eef_delta", - "input_dim": 7, - "input": "delta", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "arm": { - "space": "eef", - "position_dims": [0, 1, 2], - "rotation_dims": [3, 4, 5], - "rotation_format": "rotation_vector", - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - } - }, - }, - "single_joint6_abs": { - "name": "single_joint6_abs", - "input_dim": 7, - "input": "absolute", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5], - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - } - }, - }, - "single_joint6_abs_continuous_gripper": { - "name": "single_joint6_abs_continuous_gripper", - "input_dim": 6, - "input": "absolute", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": {"arm": {"space": "joint", "joint_dims": [0, 1, 2, 3, 4, 5]}}, - }, - "single_joint6_delta": { - "name": "single_joint6_delta", - "input_dim": 7, - "input": "delta", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5], - "gripper_dim": 6, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - } - }, - }, - "single_joint7_abs": { - "name": "single_joint7_abs", - "input_dim": 8, - "input": "absolute", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5, 6], - "gripper_dim": 7, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - } - }, - }, - "single_joint7_delta": { - "name": "single_joint7_delta", - "input_dim": 8, - "input": "delta", - "source_hz": 15.0, - "target_hz": 15.0, - "interpolation": "cubic", - "components": { - "arm": { - "space": "joint", - "joint_dims": [0, 1, 2, 3, 4, 5, 6], - "gripper_dim": 7, - "gripper_threshold": 0.8, - "gripper_open_is_high": True, - } - }, - }, -} diff --git a/runtime/routing/routing.py b/runtime/routing/routing.py deleted file mode 100644 index 07c9e5cc67e90309e648b0c399d68f076fc6ce53..0000000000000000000000000000000000000000 --- a/runtime/routing/routing.py +++ /dev/null @@ -1,745 +0,0 @@ -"Required-preset routing over the two shared ActionCodec2 processors." - -from __future__ import annotations - -import re -from collections.abc import Mapping, Sequence -from dataclasses import asdict, dataclass -from pathlib import Path -from types import MappingProxyType -from typing import TYPE_CHECKING - -import numpy as np -import yaml - -from ..common._validation import optional_finite_array -from .cache import BoundedCache -from ..physical.configuration import ( - ConfigError, - _integer, - _mapping, - _reject_unknown, - _required, - _UniqueKeyLoader, -) -from ..integration.hf import ( - ROUTER_ALLOW_PATTERNS, - ROUTER_CONFIG_NAME, - ROUTER_MODEL_TYPE, - resolve_pretrained_directory, - save_huggingface_metadata, - save_model_card, -) -from ..physical.physical_processor import ActionCodec2Processor -from .presets import ( - ComponentSpec, - PresetConfig, - externalize_canonical_trajectory, - format_action_spaces, - resample_canonical_trajectory, -) -from ..physical.semantic import resampled_horizon -from ..physical.trajectory import ActiveTrajectory - -if TYPE_CHECKING: - from .processing_actioncodec2 import ActionCodec2 - - -ROUTER_CONFIG_VERSION = 3 -_NAME = re.compile(r"[a-z][a-z0-9_]*\Z") -_PROFILES = {"eef", "joint"} -_PROFILE_WIDTHS = {"eef": 7, "joint": 8} - - -def _current_state_rows( - current_state: np.ndarray | None, *, count: int, input_dim: int -) -> list[np.ndarray | None]: - if current_state is None: - return [None] * count - values = optional_finite_array(current_state, shape=(count, input_dim)) - assert values is not None - return list(values) - - -@dataclass(frozen=True) -class ProfileSpec: - """Token namespace metadata for one shared physical processor.""" - - name: str - token_offset: int - token_budget: int - artifact_fingerprint: str - - def __post_init__(self) -> None: - if _NAME.fullmatch(self.name) is None: - raise ConfigError(f"profile.name must match {_NAME.pattern!r}") - _integer(self.token_offset, "profile.token_offset") - _integer(self.token_budget, "profile.token_budget", positive=True) - if re.fullmatch(r"[0-9a-f]{64}", self.artifact_fingerprint) is None: - raise ConfigError( - "profile.artifact_fingerprint must be a SHA-256 hex digest" - ) - - @classmethod - def from_dict(cls, payload: object, *, path: str) -> ProfileSpec: - values = _mapping(payload, path) - allowed = {"name", "token_offset", "token_budget", "artifact_fingerprint"} - _reject_unknown(values, allowed, path) - return cls( - name=str(_required(values, "name", path)), - token_offset=_integer( - _required(values, "token_offset", path), f"{path}.token_offset" - ), - token_budget=_integer( - _required(values, "token_budget", path), - f"{path}.token_budget", - positive=True, - ), - artifact_fingerprint=str(_required(values, "artifact_fingerprint", path)), - ) - - def to_dict(self) -> dict[str, object]: - return asdict(self) - - -@dataclass(frozen=True) -class _ProfileRuntime: - spec: ProfileSpec - processor: ActionCodec2Processor - - -@dataclass(frozen=True) -class _Segment: - component: ComponentSpec - profile: _ProfileRuntime - - -class RoutedActionCodec2Grammar: - """Constrained grammar over a preset's ordered, namespaced segments.""" - - def __init__( - self, router: ActionCodec2Router, *, preset: str, horizon: int - ) -> None: - horizon = _integer(horizon, "horizon", positive=True) - self.segments = router._segments(router.preset(preset)) - self.vocab_size = router.vocab_size - self._grammars = tuple( - segment.profile.processor.grammar( - horizon, active_dims=segment.component.active_dims - ) - for segment in self.segments - ) - initial = self._normalize_state(0, self._grammars[0]._initial_state()) - self._initial_state = initial - self._state_cache = BoundedCache(256) - self._state_cache[()] = initial - - def _normalize_state( - self, segment_index: int, state: tuple[int, ...] - ) -> tuple[int, tuple[int, ...]]: - while segment_index < len(self.segments) and self._grammars[ - segment_index - ]._state_is_complete(state): - segment_index += 1 - if segment_index < len(self.segments): - state = self._grammars[segment_index]._initial_state() - return segment_index, state - - def _advance_routed_state( - self, - routed_state: tuple[int, tuple[int, ...]], - token: int, - ) -> tuple[int, tuple[int, ...]] | None: - segment_index, state = routed_state - if segment_index == len(self.segments): - return None - segment = self.segments[segment_index] - local_token = token - segment.profile.spec.token_offset - if not 0 <= local_token < segment.profile.processor.vocab_size: - return None - next_state = self._grammars[segment_index]._advance(state, local_token) - if next_state is None: - return None - return self._normalize_state(segment_index, next_state) - - def _consume(self, tokens: Sequence[int]) -> tuple[int, tuple[int, ...]] | None: - checked: list[int] = [] - for raw_token in tokens: - if isinstance(raw_token, bool) or not isinstance( - raw_token, (int, np.integer) - ): - return None - checked.append(int(raw_token)) - key = tuple(checked) - if not key: - return self._initial_state - missing = object() - cached = self._state_cache.get(key, missing) - if cached is not missing: - return cached - parent = key[:-1] - state = self._state_cache.get(parent, missing) - if state is missing: - state = self._initial_state - for token in parent: - if state is None: - break - state = self._advance_routed_state(state, token) - self._state_cache[parent] = state - if state is not None: - state = self._advance_routed_state(state, key[-1]) - self._state_cache[key] = state - return state - - def next_token_mask(self, tokens: Sequence[int]) -> np.ndarray: - """Return a global namespace mask for the next preset token.""" - state = self._consume(tokens) - if state is None: - raise ValueError("token prefix is not legal for this routed preset") - segment_index, local_state = state - output = np.zeros(self.vocab_size, dtype=bool) - if segment_index == len(self.segments): - return output - segment = self.segments[segment_index] - mask = self._grammars[segment_index]._next_token_mask_from_state(local_state) - start = segment.profile.spec.token_offset - output[start : start + len(mask)] = mask - return output - - def is_complete(self, tokens: Sequence[int]) -> bool: - """Whether the prefix completes every segment exactly once.""" - state = self._consume(tokens) - return state is not None and state[0] == len(self.segments) - - -class ActionCodec2Router: - "Route heterogeneous dataset states into physical token namespaces." - - model_type = ROUTER_MODEL_TYPE - - def __init__( - self, - profiles: Sequence[tuple[ProfileSpec, ActionCodec2Processor]], - presets: Sequence[PresetConfig], - ) -> None: - runtimes: dict[str, _ProfileRuntime] = {} - expected_offset = 0 - for spec, processor in profiles: - if spec.name in runtimes: - raise ConfigError(f"duplicate physical profile {spec.name!r}") - if spec.token_offset != expected_offset: - raise ConfigError( - "profile token namespaces must be contiguous and ordered" - ) - if processor.vocab_size > spec.token_budget: - raise ConfigError( - f"profile {spec.name!r} uses {processor.vocab_size} tokens, " - f"exceeding budget {spec.token_budget}" - ) - if processor.artifact_fingerprint != spec.artifact_fingerprint: - raise ConfigError( - f"profile {spec.name!r} artifact fingerprint does not match its processor" - ) - if processor.config.set_bpe.allow_cross_component_merge: - raise ConfigError( - "allow_cross_component_merge=true is not supported by the v1 router; " - "a component-aware Set-BPE serializer and grammar are required" - ) - runtimes[spec.name] = _ProfileRuntime(spec, processor) - expected_offset += spec.token_budget - if not runtimes or not set(runtimes) <= _PROFILES: - raise ConfigError( - "router requires joint and/or eef physical profiles" - ) - for name, runtime in runtimes.items(): - if runtime.processor.action_dim != _PROFILE_WIDTHS[name]: - raise ConfigError( - f"profile {name!r} must have width {_PROFILE_WIDTHS[name]}, " - f"got {runtime.processor.action_dim}" - ) - self.profiles = MappingProxyType(runtimes) - self._source_directory = Path(__file__).resolve().parent.parent - self._grammar_cache = BoundedCache(8) - self._action_spaces: dict[str, PresetConfig] = {} - for preset in presets: - self.register_action_space(preset) - self.vocab_size = expected_offset - - @property - def action_spaces(self) -> Mapping[str, PresetConfig]: - """Read-only registered built-in and user-created action spaces.""" - return MappingProxyType(self._action_spaces) - - def __str__(self) -> str: - return self.describe_action_spaces() - - def describe_action_spaces( - self, *, selected: str | None = None, action_dim: int | None = None - ) -> str: - """Explain all layouts, or source-width candidates, using this artifact's state requirements.""" - second_order_dims = { - name: tuple( - dimension - for component in runtime.processor.config.physical.components.values() - if component.primitive_order == 2 - for dimension in component.dims - ) - for name, runtime in self.profiles.items() - } - return format_action_spaces( - self.action_spaces, - selected=selected, - action_dim=action_dim, - second_order_dims=second_order_dims, - ) - - @classmethod - def from_processors( - cls, - processors: Mapping[str, ActionCodec2Processor], - *, - token_budgets: Mapping[str, int], - presets: Sequence[PresetConfig], - ) -> ActionCodec2Router: - """Assign stable contiguous namespaces in canonical joint/eef order.""" - if set(processors) != set(token_budgets): - raise ConfigError("processors and token_budgets must share keys") - if set(processors) != _PROFILES: - raise ConfigError( - "processors must contain exactly the joint and eef profiles" - ) - offset = 0 - entries = [] - for name in ("joint", "eef"): - processor = processors[name] - budget = _integer( - token_budgets[name], f"token_budgets.{name}", positive=True - ) - spec = ProfileSpec( - name, - offset, - budget, - processor.artifact_fingerprint, - ) - entries.append((spec, processor)) - offset += budget - return cls(entries, presets) - - def preset(self, name: str) -> PresetConfig: - """Resolve one preset or fail with the available names.""" - try: - return self._action_spaces[name] - except KeyError as error: - raise KeyError( - f"unknown preset {name!r}; available: {sorted(self._action_spaces)}" - ) from error - - def register_action_space( - self, - preset: PresetConfig | Mapping[str, object] | str | Path, - ) -> PresetConfig: - "Register a validated action-space config, mapping, or YAML file." - if isinstance(preset, Mapping): - preset = PresetConfig.from_dict(preset) - elif isinstance(preset, (str, Path)): - preset = PresetConfig.from_yaml(preset) - if not isinstance(preset, PresetConfig): - raise TypeError( - "register_action_space expects PresetConfig, a mapping, or a preset YAML path" - ) - existing = self._action_spaces.get(preset.name) - if existing is not None and existing != preset: - raise ConfigError( - f"action-space name {preset.name!r} is already registered differently" - ) - self._action_spaces[preset.name] = preset - return preset - - def _segments(self, preset: PresetConfig) -> tuple[_Segment, ...]: - return tuple( - _Segment(component, self.profiles[component.space]) - for component in preset.components - ) - - def encode_batch( - self, - inputs: np.ndarray, - *, - preset: str, - fps: float | None = None, - current_state: np.ndarray | None = None, - previous_first_order: Mapping[str, np.ndarray] | None = None, - ) -> list[list[int]]: - "Encode one regular-rate ``[B,T,D]`` tensor at ``fps``." - preset_config = self.preset(preset) - self._validate_boundary_keys(previous_first_order, preset_config) - canonical = preset_config.canonicalize( - inputs, source_hz=fps, current_state=current_state - ) - batch = len(next(iter(canonical.values()))) - rows: list[list[int]] = [[] for _ in range(batch)] - for segment in self._segments(preset_config): - values = canonical[segment.component.name] - streams = segment.profile.processor.encode_batch( - np.stack([trajectory.values for trajectory in values]), - active_dims=segment.component.active_dims, - previous_first_order=None - if previous_first_order is None - else previous_first_order.get(segment.component.name), - ) - offset = segment.profile.spec.token_offset - for row, stream in zip(rows, streams, strict=True): - row.extend(offset + token for token in stream) - return rows - - def route_trajectories( - self, - inputs: np.ndarray, - *, - preset: str, - current_state: np.ndarray | None = None, - fps: float | None = None, - previous_first_order: Mapping[str, np.ndarray] | None = None, - ) -> dict[str, list[ActiveTrajectory]]: - "Expose canonical complete trajectories grouped by physical profile." - preset_config = self.preset(preset) - self._validate_boundary_keys(previous_first_order, preset_config) - canonical = preset_config.canonicalize( - inputs, current_state=current_state, source_hz=fps - ) - output: dict[str, list[ActiveTrajectory]] = {} - for component in preset_config.components: - trajectories = canonical[component.name] - processor = self.profiles[component.space].processor - previous = ( - None - if previous_first_order is None - else previous_first_order.get(component.name) - ) - dense = processor._dense_previous_first_order( - previous, component.active_dims, len(trajectories) - ) - rows = ( - [None] * len(trajectories) - if dense is None - else np.take(dense, component.active_dims, axis=1) - ) - output.setdefault(component.space, []).extend( - ActiveTrajectory(t.values, t.active_dims, previous_first_order=p) - for t, p in zip(trajectories, rows, strict=True) - ) - return output - - def _validate_boundary_keys( - self, - previous_first_order: Mapping[str, np.ndarray] | None, - preset: PresetConfig, - ) -> None: - if previous_first_order is None: - previous_first_order = {} - if not isinstance(previous_first_order, Mapping): - raise ValueError( - "previous_first_order must map component names to canonical [B,D_active] boundaries" - ) - unknown = set(previous_first_order) - {c.name for c in preset.components} - if unknown: - raise ValueError( - f"unknown previous_first_order component(s): {sorted(unknown)}" - ) - required = { - c.name: f"(B, {len(c.active_dims)})" - for c in preset.components - if any( - p.primitive_order == 2 and set(c.active_dims).intersection(p.dims) - for p in self.profiles[ - c.space - ].processor.config.physical.components.values() - ) - } - missing = set(required) - previous_first_order.keys() - if missing: - raise ValueError( - "second-order tokenization requires previous_first_order with arrays " - f"{required}; missing {sorted(missing)}. Use canonical {preset.target_hz:g} Hz " - "reconstructed increments. codec.first_order_template(batch_size) explicitly " - "creates zeros; use zeros only if the preceding increment is known to be zero." - ) - - def final_first_order( - self, - streams: Sequence[Sequence[int]], - *, - preset: str, - previous_first_order: Mapping[str, np.ndarray], - executed_steps: int | None = None, - ) -> dict[str, np.ndarray]: - "Return component ``[B,D_active]`` boundaries at the canonical clock." - preset_config = self.preset(preset) - if previous_first_order is None: - raise ValueError("final_first_order requires previous_first_order") - self._validate_boundary_keys(previous_first_order, preset_config) - segments = self._segments(preset_config) - steps = self._batch_steps(streams, segments) - split = [self._split_stream(stream, segments, steps) for stream in streams] - output = {} - for index, segment in enumerate(segments): - processor = segment.profile.processor - if not processor.requires_previous_first_order: - continue - output[segment.component.name] = processor.final_first_order( - [row[index] for row in split], - previous_first_order=previous_first_order.get(segment.component.name), - active_dims=segment.component.active_dims, - executed_steps=executed_steps, - ) - return output - - def _split_stream( - self, tokens: Sequence[int], segments: Sequence[_Segment], steps: int - ) -> list[list[int]]: - cursor = 0 - output = [] - for segment in segments: - grammar = segment.profile.processor.grammar( - steps, active_dims=segment.component.active_dims - ) - state = grammar._initial_state() - local: list[int] = [] - while cursor < len(tokens) and not grammar._state_is_complete(state): - raw_token = tokens[cursor] - if isinstance(raw_token, bool) or not isinstance( - raw_token, (int, np.integer) - ): - raise ValueError(f"tokens[{cursor}] must be an integer") - token = int(raw_token) - segment.profile.spec.token_offset - if not 0 <= token < segment.profile.processor.vocab_size: - raise ValueError( - "token belongs to the wrong routed profile namespace" - ) - next_state = grammar._advance(state, token) - if next_state is None: - raise ValueError( - f"Action token stream has invalid coverage for component {segment.component.name!r}. Constrain generation with codec.grammar(H, fps=...).next_token_mask(prefix)." - ) - state = next_state - local.append(token) - cursor += 1 - if not grammar._state_is_complete(state): - raise ValueError( - f"Incomplete action token stream for component {segment.component.name!r}. Check codec.grammar(H, fps=...).is_complete(tokens); discard or regenerate this row." - ) - output.append(local) - if cursor != len(tokens): - raise ValueError( - "Action token stream has extra tokens after complete coverage; remove model prompt/EOS/padding before codec.decode()." - ) - return output - - def _token_cell_count(self, raw_token: object, *, index: int) -> int: - - if isinstance(raw_token, bool) or not isinstance(raw_token, (int, np.integer)): - raise ValueError(f"tokens[{index}] must be an integer") - token = int(raw_token) - for runtime in self.profiles.values(): - local = token - runtime.spec.token_offset - if 0 <= local < runtime.processor.vocab_size: - return int(runtime.processor.serializer.token_cell_counts[local]) - raise ValueError(f"tokens[{index}] is outside the routed profile vocabularies") - - def _decoded_steps( - self, tokens: Sequence[int], segments: Sequence[_Segment] - ) -> int: - - if not tokens: - raise ValueError("token stream must not be empty") - cells_per_step = sum(len(segment.component.active_dims) for segment in segments) - represented_cells = sum( - self._token_cell_count(token, index=index) - for index, token in enumerate(tokens) - ) - steps, remainder = divmod(represented_cells, cells_per_step) - if steps < 1 or remainder: - raise ValueError( - "Incomplete action token stream: " - f"{cells_per_step - remainder} more coordinate values are needed to finish a step. " - "Constrain generation with codec.grammar(H, fps=...).next_token_mask(prefix) " - "and check is_complete(tokens) for the intended H before decoding. " - "Use codec.batch_decode(..., errors='return') to isolate invalid rows; " - "do not pad truncated tokens with zeros." - ) - return steps - - def _batch_steps( - self, - streams: Sequence[Sequence[int]], - segments: Sequence[_Segment], - ) -> int: - - if not streams: - raise ValueError("streams must not be empty") - lengths = [self._decoded_steps(stream, segments) for stream in streams] - if len(set(lengths)) != 1: - raise ValueError( - f"all token streams must decode to the same length, got {lengths}; use codec.batch_decode(...) for independent variable-length outputs" - ) - return lengths[0] - - def decode_batch( - self, - streams: Sequence[Sequence[int]], - *, - preset: str, - fps: float | None = None, - current_state: np.ndarray | None = None, - previous_first_order: Mapping[str, np.ndarray] | None = None, - ) -> dict[str, np.ndarray]: - "Decode rows to deltas, or absolute components with ``current_state``." - preset_config = self.preset(preset) - self._validate_boundary_keys(previous_first_order, preset_config) - segments = self._segments(preset_config) - internal_steps = self._batch_steps(streams, segments) - states = _current_state_rows( - current_state, count=len(streams), input_dim=preset_config.input_dim - ) - output_fps = preset_config.source_hz if fps is None else fps - output_steps = resampled_horizon( - internal_steps, - source_hz=preset_config.target_hz, - target_hz=output_fps, - ) - output: dict[str, list[np.ndarray]] = { - component.name: [] for component in preset_config.components - } - split_streams = [ - self._split_stream(stream, segments, internal_steps) for stream in streams - ] - for segment_index, segment in enumerate(segments): - decoded_batch = segment.profile.processor.decode_batch( - [split[segment_index] for split in split_streams], - active_dims=segment.component.active_dims, - previous_first_order=None - if previous_first_order is None - else previous_first_order.get(segment.component.name), - ) - for decoded, state in zip(decoded_batch, states, strict=True): - restored = resample_canonical_trajectory( - ActiveTrajectory(decoded, segment.component.active_dims), - segment.component, - source_hz=preset_config.target_hz, - target_hz=output_fps, - target_length=output_steps, - method=preset_config.interpolation, - ) - output[segment.component.name].append( - externalize_canonical_trajectory( - restored, segment.component, current_state=state - ) - ) - return {name: np.stack(values) for name, values in output.items()} - - def grammar(self, *, preset: str, horizon: int) -> RoutedActionCodec2Grammar: - """Build the global constrained grammar for one preset and target horizon.""" - horizon = _integer(horizon, "horizon", positive=True) - self.preset(preset) - key = (preset, horizon) - grammar = self._grammar_cache.get(key) - if grammar is None: - grammar = RoutedActionCodec2Grammar(self, preset=preset, horizon=horizon) - self._grammar_cache[key] = grammar - return grammar - - @property - def new_action_tokens(self) -> list[str]: - """Stable physical token names, including reserved profile budget slots.""" - return [ - f"" - for name, runtime in self.profiles.items() - for index in range(runtime.spec.token_budget) - ] - - def save_pretrained( - self, directory: str | Path, *, include_code: bool = True - ) -> list[str]: - """Save one manifest plus isolated physical processor subdirectories.""" - root = Path(directory) - files = [] - for runtime in self.profiles.values(): - files.extend( - runtime.processor.save_pretrained(root / "profiles" / runtime.spec.name) - ) - manifest = { - "model_type": self.model_type, - "config_version": ROUTER_CONFIG_VERSION, - "profiles": [runtime.spec.to_dict() for runtime in self.profiles.values()], - "presets": [preset.to_dict() for preset in self.action_spaces.values()], - } - path = root / ROUTER_CONFIG_NAME - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(yaml.safe_dump(manifest, sort_keys=False), encoding="utf-8") - metadata = save_huggingface_metadata( - root, - model_type=self.model_type, - processor_class=type(self).__name__, - **( - {"auto_map": {"AutoProcessor": "processing_actioncodec2.ActionCodec2"}} - if include_code - else {} - ), - ) - card = save_model_card(root, str(self)) - if include_code: - from ..integration.exporting import ArtifactExporter - - files.extend( - ArtifactExporter(root, source_directory=self._source_directory).export() - ) - return [str(path), str(card), *map(str, metadata), *files] - - @classmethod - def from_pretrained( - cls, - pretrained_model_name_or_path: str | Path, - **kwargs: object, - ) -> ActionCodec2Router | ActionCodec2: - "Load a router, or bind its public processor when given ``action_space``." - if "action_space" in kwargs: - from .processing_actioncodec2 import ActionCodec2 - - return ActionCodec2.from_pretrained(pretrained_model_name_or_path, **kwargs) - root = resolve_pretrained_directory( - pretrained_model_name_or_path, - allow_patterns=ROUTER_ALLOW_PATTERNS, - **kwargs, - ) - path = root / ROUTER_CONFIG_NAME - payload = _mapping( - yaml.load(path.read_text(encoding="utf-8"), Loader=_UniqueKeyLoader), - "router", - ) - _reject_unknown( - payload, {"model_type", "config_version", "profiles", "presets"}, "router" - ) - if payload.get("model_type") != ROUTER_MODEL_TYPE: - raise ConfigError(f"router.model_type must be {ROUTER_MODEL_TYPE!r}") - if payload.get("config_version") != ROUTER_CONFIG_VERSION: - raise ConfigError( - f"unsupported router config_version {payload.get('config_version')!r}" - ) - raw_profiles = payload.get("profiles") - raw_presets = payload.get("presets") - if not isinstance(raw_profiles, list) or not isinstance(raw_presets, list): - raise ConfigError("router.profiles and router.presets must be lists") - profiles = [] - for index, raw in enumerate(raw_profiles): - spec = ProfileSpec.from_dict(raw, path=f"router.profiles[{index}]") - processor = ActionCodec2Processor.from_pretrained( - root / "profiles" / spec.name - ) - profiles.append((spec, processor)) - presets = [ - PresetConfig.from_dict(raw, path=f"router.presets[{index}]") - for index, raw in enumerate(raw_presets) - ] - router = cls(profiles, presets) - router._source_directory = root - return router diff --git a/runtime/tokenization/__init__.py b/runtime/tokenization/__init__.py deleted file mode 100644 index 5a9900849a39d438961bf79d9755bfa2d434e072..0000000000000000000000000000000000000000 --- a/runtime/tokenization/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Internal tokenization components for ActionCodec2.""" diff --git a/runtime/training/__init__.py b/runtime/training/__init__.py deleted file mode 100644 index 1fa83db71f8531e6f9ee6d53c9a026cce3f96508..0000000000000000000000000000000000000000 --- a/runtime/training/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Internal training components for ActionCodec2.""" diff --git a/setup.py b/setup.py index 59eea5a860588a6d0441380ae30b319cfd297652..239c59deb41a4622057637964465951159e97644 100644 --- a/setup.py +++ b/setup.py @@ -1,17 +1,12 @@ +import sys from setuptools import setup from pybind11.setup_helpers import Pybind11Extension, build_ext - -native = "actioncodec2_kernels" -setup( - ext_modules=[Pybind11Extension( - "actioncodec2_kernels._actioncodec2_native", - sources=[f"{native}/{name}.cpp" for name in ( - "module", "physical", "so3", "setbpe", "resample", "reconstruct", "grammar" - )], - include_dirs=[native], - depends=[f"{native}/{name}.hpp" for name in ("parallel", "quaternion")], - extra_compile_args=["-O3", "-fvisibility=hidden", "-ffp-contract=off"], - cxx_std=17, - )], - cmdclass={"build_ext": build_ext}, -) +from pathlib import Path +native = 'actioncodec2_kernels' +openmp = ['-fopenmp'] if sys.platform.startswith('linux') else [] +setup(name='actioncodec2-kernels', version='0.3.0', packages=['actioncodec2_kernels'], + ext_modules=[Pybind11Extension('actioncodec2_kernels._native', + sources=sorted(str(p) for p in Path(native).glob('*.cpp')), + include_dirs=[native], cxx_std=17, + extra_compile_args=['-O3', '-fvisibility=hidden', '-ffp-contract=off', *openmp], + extra_link_args=openmp)], cmdclass={'build_ext': build_ext}) diff --git a/variants.json b/variants.json index 60acd9fd70973f9f882482e000adb701fe971c46..5db2db7dcc842aff87cbe63fcc7862b506401715 100644 --- a/variants.json +++ b/variants.json @@ -12,21 +12,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-1st-order", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "1bb09ac4f580b1e2de5fbea138c8ed94ebd3e27a9a4c6bead4f25a8e1fcf2820", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "64618710222c973bc5723a0913c5e66c0424c53ba621ea77b70202db679b5780", - "profiles/eef/primitives.npz": "94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072", + "profiles/eef/primitives.npz": "0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "61fa3a6c5e215adcf1f23f000e3268d97829cf97b16848cab58b70482417e5d3", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "9554ec4e0ebec08a57d5cfb6d729d5b9940a33a13a471593cb6585e42431c0cf", - "profiles/joint/primitives.npz": "0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa", + "profiles/joint/primitives.npz": "926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "2f6628cfaa64ef735b6477f575d27fb80a80663cea64017de6f965405cc52283" + "router_config.yaml": "f4fde450b76ef40b49da287b16204d73161af31a40471c8b8cbb74f4e09633dd" }, - "fingerprint": "7b33be67dbd26354a34441351070358ecbdf9cc883083f73a55049de125f317f" + "fingerprint": "800d30570a3b350517596e3099c1bb79be6bdba0e65db0244fb612f0b055bf3b" }, "paper-2nd": { "edition": "Paper", @@ -39,21 +39,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-2nd-order", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "c8071462ee451a84d6ce833ccaa5e55858cad4b9a92a2f6ba5033c6bb0fa6596", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "23e779f4fc4a0631fcd23b5012c7a003cd58620022fe03aa80c920a0f5507801", - "profiles/eef/primitives.npz": "9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537", + "profiles/eef/primitives.npz": "fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "08125cd32957f99f2c685f739cee0564641db13f5f605bcb6a0099f4e4411f1a", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "901b51e6f463f0af72584987c3ce46d964173627ea2b69fd55e26e22cc86353a", - "profiles/joint/primitives.npz": "d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf", + "profiles/joint/primitives.npz": "74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "40f08f0131e5e87cb0db6c12ed9d75af75fb4a7538cb9f4ca05206eadc17a82a" + "router_config.yaml": "735ed0597a88f3ae15b71626deacc178270419a58e237fa404cde9c5e0010d60" }, - "fingerprint": "92bd2538e5085d3bd65ba2e1255b13bae529826dbc4afbab823acaefa4a06d94" + "fingerprint": "ecd9fc036f81b21be7ea80938a930182db9c3036fb399bd453cb360f8c359e7b" }, "extended-1st-1mm-2k": { "edition": "Extended", @@ -65,16 +65,16 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-1mm-2k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "fb09bc11fe6e8fd56f555d51af06a9fd74b93ac659fefaa08531be0fddff07a2", "profiles/eef/bpe.json": "647f6cd7025f298f65fe79d77a96d59e916a36e330f0acf08d91f6b5b5114b3a", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "997b2aa95f5d70917c654401c521b2e0050c2db6cac700b6a71ea2958c60edba", - "profiles/eef/primitives.npz": "b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b", + "profiles/eef/primitives.npz": "562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "2d41b80eb7b421e8849a5446a113f207ecd5a28d57bd2f26888cc6643346302c" + "router_config.yaml": "20b52ea5515f40813fc2e65d14d6b56c03c45323359792a8daccc812289641e4" }, - "fingerprint": "ed87052d4c53265d47763e8ba212791337dc5b59b13640cc99d7661a5f8d0aab" + "fingerprint": "f4483c5f68f0c063e2f0d9c490e8a951af4de2998ab6dc14808640b9c0ff4498" }, "extended-1st-1mm-4k": { "edition": "Extended", @@ -87,21 +87,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-1mm-4k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "46b4c5b74a86a3813463e42cc1a943d73fda840f8e487f37a236a1449c6074ed", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "87f9fec7a984999dd85b719c97231b280f6baf9ba1f5ad6b1c45a984066ff852", - "profiles/eef/primitives.npz": "b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b", + "profiles/eef/primitives.npz": "562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "3a961b58db496fe9162c25b6bd652fbaafa69272b5223ddb1dea4c6cfb23ce57", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "668800dc48c316f20e8dfda49e64d0d67a66b8adb944b7e16833aeb117816688", - "profiles/joint/primitives.npz": "47222b9b4172f82899756a90757c3b7b679fc9ef8d54984d736518e9cc5cb3d0", + "profiles/joint/primitives.npz": "06226ceadec064c2b1c8b8ad3cf6fc71174e2ea63ab82cd08e63b86b380769f5", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "95ad335a243b2b7b2cbb7d089c1bb7d53769bba941ca00834b470c23d6812397" + "router_config.yaml": "4f7801ac3debdf93e6a6ede9164f1c04715e01fa7c0b54a5bf824577a9c50cb3" }, - "fingerprint": "4ee94d331adc1b8e2e874071bbb114e625988bf068d61e91ccde349eaad0db34" + "fingerprint": "f28b6495634d9dc45db3b0d461141d787c1d0896ae7dd3f752f08a3cb043c786" }, "extended-1st-1mm-8k": { "edition": "Extended", @@ -114,21 +114,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-1mm-8k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "fafaf7ca13888001e68bbc287b1b28978fc1cd67101482ee014028979bc4d2d4", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "e773874317875e8a091022f563ad3e3c5cb2cd4389472509722ac82058848c71", - "profiles/eef/primitives.npz": "b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b", + "profiles/eef/primitives.npz": "562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "71681217cc5bd2468da2d8998cb9c22925d8d7f74e1fcf7c82ba969cdb278800", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "a6e566b3cbc420b22088c1139b1a199a74edefc0c2996d3660c99a22f32ded5a", - "profiles/joint/primitives.npz": "47222b9b4172f82899756a90757c3b7b679fc9ef8d54984d736518e9cc5cb3d0", + "profiles/joint/primitives.npz": "06226ceadec064c2b1c8b8ad3cf6fc71174e2ea63ab82cd08e63b86b380769f5", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "a5ceecba1c1f2052ebd1ed472a7ad00a2bf132871f42a1c6f91f134419b395cb" + "router_config.yaml": "412ffb8a0c4903110495a540da1f4164cb8e4d6d82820d22ee8f6a940b0e6241" }, - "fingerprint": "d205dd1e31fb51e85130ed173da59365db9d9c9d02b00a72eef5542017f0b87c" + "fingerprint": "4d1a1e108eaa1dc48e158167892f3622d741246ecc41eac9f727d8d068073e2a" }, "extended-1st-1mm-16k": { "edition": "Extended", @@ -141,21 +141,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-1mm-16k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "dca82ccdad42191e28f1eeaa153727acdffa06ef8dddcbd06c163cdd98c0dc25", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "e5f12a562fdf1a891b46781a1a209b51ad4bb1b976348487109d8c0f2a633034", - "profiles/eef/primitives.npz": "b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b", + "profiles/eef/primitives.npz": "562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "149f59939e409125ee09c6aa2ef85d40071979fbdbfa4716a4c5229975749237", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "831a47c493957e1e98f9a16bcc15913ac1e17cd7b16159b4be485b637bf9f1c4", - "profiles/joint/primitives.npz": "47222b9b4172f82899756a90757c3b7b679fc9ef8d54984d736518e9cc5cb3d0", + "profiles/joint/primitives.npz": "06226ceadec064c2b1c8b8ad3cf6fc71174e2ea63ab82cd08e63b86b380769f5", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "6aa94b432a650331ebaa5ee07b9bbe1fdc4c670a0b44eef7abf6577146415032" + "router_config.yaml": "3150eea6b0b64541fdc4046a277a086160a23a0574d76b23bfaaddcff4acc817" }, - "fingerprint": "3a54ba37b726e352860a8bcd8e2c4620733aa2279d2460c9f94519756d8dac67" + "fingerprint": "6c8972135e7d44a01c27d18f07019cfed12895461e10e97609452e9cac640f59" }, "extended-1st-5mm-1k": { "edition": "Extended", @@ -168,21 +168,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-5mm-1k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "18724f4e6be5a0c399d97ad5c9f22199ae811271ffc9eaf9f8f886aab4a19175", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "f13d8cb3b184d8b2c063cf3e273460e95b5d1bd530b368e99a801bce241b82e5", - "profiles/eef/primitives.npz": "94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072", + "profiles/eef/primitives.npz": "0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "8d415429c8a737688339e75a3ba09df070bd668a2afbcad997a5a1e960fe9272", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "604e47072d764bfa9d73406035ef26f41d879008a0924e8e98321b24df9bc11f", - "profiles/joint/primitives.npz": "0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa", + "profiles/joint/primitives.npz": "926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "29b4e470037bee8b5dd44b576cce32aca5708433426a810ce8e30fda6793f70b" + "router_config.yaml": "e47ab18379b48ae575f5b7b19f367e7920b695f653db00c90386d0a8cab69308" }, - "fingerprint": "c628758141896c2ccf6e22f0c1b8fdbe3a2b074ca5f1ec93411fc9f163dce9e3" + "fingerprint": "042c7de354edd4c7b7f2055e53ba19d7064d232be54beac670a26c510cdd69c1" }, "extended-1st-5mm-2k": { "edition": "Extended", @@ -195,21 +195,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-5mm-2k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "889006700048602995fa6396a3f2ab2316078e5639721f101240013f47a6981d", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "e688fb9f2bdff4f109fd7e81c6af6db5128a0e97069c7ccc8ac0670b0e8dfe4d", - "profiles/eef/primitives.npz": "94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072", + "profiles/eef/primitives.npz": "0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "1909774e3f92900919b7ce8eea1ca26d8d8b0d3177ab90028ccf2a1b464abe3c", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "deef820716355f815c72963c3e502c4842196432d0058a5e828f20834f75a221", - "profiles/joint/primitives.npz": "0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa", + "profiles/joint/primitives.npz": "926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "b348690aa897d6b4a30ad1e3109d074675ffc01752e98b1ed423792ff4a82ccb" + "router_config.yaml": "7d42b86effb525fd1cac632116d7ecc63a0a05268a3120a613066b48d8d5f862" }, - "fingerprint": "3630a2de86b04976d003bddcf61f6229212cee77f85cfa67d13c51ca2d0b3e34" + "fingerprint": "716fe8a36e628dc0faf5f0df92ef4c0f5ec1a2e1a899d9daa3214b34b9236a80" }, "extended-1st-5mm-4k": { "edition": "Extended", @@ -222,21 +222,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-5mm-4k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "870ef41b44fcc1d0e87d6040a0c964b1710d6af2758b065ca11654187f9e788b", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "64618710222c973bc5723a0913c5e66c0424c53ba621ea77b70202db679b5780", - "profiles/eef/primitives.npz": "94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072", + "profiles/eef/primitives.npz": "0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "bd435c48536d83006dc4910717a602df045839496d5d1fa10de63e9156f8ff64", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "9554ec4e0ebec08a57d5cfb6d729d5b9940a33a13a471593cb6585e42431c0cf", - "profiles/joint/primitives.npz": "0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa", + "profiles/joint/primitives.npz": "926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "4556337f98569c2e59a9cef7cc5dbeb344c822a98a4c65810d24cb4948a0e468" + "router_config.yaml": "d368e0b8ea6f8a00f621e100c40e5aa64e9813a6601355fca52207bff5fe6258" }, - "fingerprint": "1b471d90d7bd9db2423fb949c3b89c0cf2eab023eab2c8a6fe952a3ed06997f1" + "fingerprint": "eb8ea2aa97006095e6a885fcbd83857f75d8991dcfe39f453e174b7b5ba041e1" }, "extended-1st-5mm-8k": { "edition": "Extended", @@ -249,21 +249,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-5mm-8k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "60dd61b1fc7d0c5fb79bd385ecd8b50e3f8b8cd4161183b9d6c81d547a2cdcb1", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "23f23ec6b35e6dda921501e94e078818a9b12c1b0c724a4e03ed14827467a509", - "profiles/eef/primitives.npz": "94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072", + "profiles/eef/primitives.npz": "0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "dfd65d13c7c53caff9dbe48256366a12df9868fe5a848a16a76ae5b833f97bfe", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "65c5c2616b8b1363c2aca7b382e0304fbcf393cf3643d15a917819ec29c34467", - "profiles/joint/primitives.npz": "0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa", + "profiles/joint/primitives.npz": "926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "d11c6ee9ea234d69827ed71f5cfea5b9a1dfd469aff2cef39dcac4a5086045a2" + "router_config.yaml": "04c86494d5e2f366edefd5e8fda17301b87046f8c9b35ac85d2b23d90b12fc55" }, - "fingerprint": "bf1e9e4cdbf4f520f0dd99cedf51e05286f79ece2df15598e9368cc75a23da4d" + "fingerprint": "b4327f6f1d7c8ec3a15b95026836d4acf1af2a45cbe74a9482bceda5dc4af020" }, "extended-1st-5mm-16k": { "edition": "Extended", @@ -276,21 +276,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-5mm-16k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "ebd81734dc8242981785ec2979ca378a6b73de6eee659d65e7905d4c84263169", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "afa5fc0560e4d8b66bb7ed5029fabf6e46e2c5b1026dbf15a1e62e0f4823d165", - "profiles/eef/primitives.npz": "94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072", + "profiles/eef/primitives.npz": "0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "523e97cdb6a95e592b15771d7b1990577bcabbe7e7609df03b422420a3771b4e", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "a9cc646c06e6f790b2fc9f0077a476c2912b01bcc598abea55872a062f046937", - "profiles/joint/primitives.npz": "0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa", + "profiles/joint/primitives.npz": "926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "beea9ad5164f1e962bc6f3b78b65d494a82dff30af846896583d3d741fed8d15" + "router_config.yaml": "65e05c830978f0d81fbfa483f9b3bf42e7235647dbc0f4521480b07e287dbf21" }, - "fingerprint": "ff9ec4e80a28bf62e747746febf3027e134ff369eb2cf500437a6c4dd80212e5" + "fingerprint": "7bb43c32dce0d2150c0e5c1ec28ff19a8ebedd529e439b3fde89eb325a203d2f" }, "extended-1st-10mm-1k": { "edition": "Extended", @@ -303,21 +303,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-10mm-1k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "56eb4d03f766f62f8a12453f4f5477ef7fcfdb1413f3e690d48259e52d40dae5", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "d4e36c468e9d0341a93aff0b0e11a32e0b8b8649812224cefdc755d9e5bd985c", - "profiles/eef/primitives.npz": "6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf", + "profiles/eef/primitives.npz": "ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "5abb0f20177d6c2ecc1bbd50913c21273ce9dd3083eb29ec4ee5c69f1aed74a9", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "3e67af8794e1d2b833717273aec5b2b00f5ae17749e77e885db10629262a34d1", - "profiles/joint/primitives.npz": "7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7", + "profiles/joint/primitives.npz": "8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "92a584d919f0914ba9ecee92147a2788f087e83735d388a22027517472270b24" + "router_config.yaml": "0b91abd016934431146f548fecbfe2d94f8ee075e49fa7b61ddd92592c710a4d" }, - "fingerprint": "6c66f689a0fd28816b1d7eed8198ca29f122545e8fa699c0d6344d044a57996b" + "fingerprint": "c630c8d51a809b83769ae8c9cf1fee31d15ad81414bdf0130089c3238d342979" }, "extended-1st-10mm-2k": { "edition": "Extended", @@ -330,21 +330,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-10mm-2k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", - "profiles/eef/bpe.json": "2f6f59af1c8ebecc8cb822245e5cb015c034025d1a4c697b0696d7bb287f4d09", + "profiles/eef/bpe.json": "8867cabd4add49539176aba4274ebd04690b75cee9fb563326ee34d51356b8d3", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "2a826a9a5cb5a5bacd8c2a3e27bc0a14b119c5fe8976b6507887965afce4e615", - "profiles/eef/primitives.npz": "6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf", + "profiles/eef/primitives.npz": "ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "profiles/joint/bpe.json": "c7580148a2b923fa519cc1551dbbd4517ed2c92fe8ce3ac95493428c1f13b958", + "profiles/joint/bpe.json": "404e91b9199c32c677c3173b0ee6d731ce021cc6bb6c4fa46e565b5404069a3a", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "c2074c90a4ce11542c07aeec0d67789464762002323b48ab11d525a93ce7a872", - "profiles/joint/primitives.npz": "7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7", + "profiles/joint/primitives.npz": "8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "6c8892a08a71ec2c88a0e5bad9a76da3c47b73d5b5c0520febaace5944c81e5b" + "router_config.yaml": "ed75aaec51f893a78b4d2b0cc2e4ff1f5071f1980ddeccd8017a2bbf608c25ef" }, - "fingerprint": "40fa4aff9480f38ed8a30528301c2b9bf6c4c297fc376c7904c5290eab10d501" + "fingerprint": "b2733df22f2e059b1e0edb702cc220f5eb880ca2536de25978fb6980cd02889a" }, "extended-1st-10mm-4k": { "edition": "Extended", @@ -357,21 +357,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-10mm-4k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", - "profiles/eef/bpe.json": "542ecd952624e61404c7f8a099986c94bb59c01ca8a30b543d35ebf373c9ca7c", + "profiles/eef/bpe.json": "fff71315fa1bf608b6df5c14ed95954c7206787e8efe5e194ada407a2a9c258f", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "11187f2f4e094da9122350696872d8dd8e3d5278d7f9c983da4dc96b92d5cdc2", - "profiles/eef/primitives.npz": "6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf", + "profiles/eef/primitives.npz": "ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "profiles/joint/bpe.json": "97018243ada941210587a9c14f2a792f0b5e96f688364f364c688b27dfed496b", + "profiles/joint/bpe.json": "19bfceddd997383825c143907d88c7c3a6a0f3f12240d84fd8d756bbeacc8316", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "72f8e19fc0b6909fdcdc40f226bd01fc2f825cdc0730a2dde33257b470cb5fc1", - "profiles/joint/primitives.npz": "7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7", + "profiles/joint/primitives.npz": "8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "ffee841229a440871021e90283e552ac6e2a94b267475d6846250bb8de6b6d4e" + "router_config.yaml": "5b3ead63c0b617422782adc8a46f6e856c53c92439a5d5b87c432c0665b2bf15" }, - "fingerprint": "db90b6a8bfdc0cd58d25c0ea4377a0a44ea692e77ce893530eddea1aa70820d4" + "fingerprint": "d939cec77338935f379a30bcaa6596c0e48a706ebc3e2dc4c69b9e9ac0ec77dd" }, "extended-1st-10mm-8k": { "edition": "Extended", @@ -384,21 +384,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-10mm-8k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", - "profiles/eef/bpe.json": "b81db60a7985b30dc915ba20d35e7eef8618bb01a18b8060f7efada408a3309f", + "profiles/eef/bpe.json": "ba68e6dd26b78146f512bb24b9ff5ac8cd65116a48c0f89963e876ff35d5ea4b", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "afcc9ba00748db3247ce23d4326d2eea62e64c11f4c75a83680e978f36937f9c", - "profiles/eef/primitives.npz": "6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf", + "profiles/eef/primitives.npz": "ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "profiles/joint/bpe.json": "fb588a296ba7e080fbe938723ddbfd837f892b618afa0cf7f25d5b65b5ac6ffb", + "profiles/joint/bpe.json": "845d64c741aad50fde5ede52d78864d8ce73a53e797e551149b01987ecf3e0f3", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "166daf44e5189e1c5bb61b4a491b3d90c3d7f7ee1c09609a95ec3eba7d45a03f", - "profiles/joint/primitives.npz": "7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7", + "profiles/joint/primitives.npz": "8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "08922e9a2b3ad86f8b4612f7b55a1e18fb59dec9e018d4758e95310112dd2508" + "router_config.yaml": "6faebd37dea24a2a3e47e76f5da74f1c4fc153f742b75d69c7c6d8228a8708de" }, - "fingerprint": "2d618b0491a33e012026ea5eb718b35948b79520be008519cce02213d39da81f" + "fingerprint": "1751b6bf2efd0d0203d53593bbe4209a8b1385eed7813dab8cfd1eb2bf8cd9bc" }, "extended-1st-10mm-16k": { "edition": "Extended", @@ -411,21 +411,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-10mm-16k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "398b2fbc9f4ee6279d1cb93a530c37da29044eaeeb0181f2ee3560097237b0c1", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "c1ee914f2b3d5f804e0ccc58e8696dce859a97e6af93b7b53f20e70c0f2b3c81", - "profiles/eef/primitives.npz": "6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf", + "profiles/eef/primitives.npz": "ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "eec1a3765cbe51e379a8179e94b865b27822e195dd0e19176b0edf271c21eeed", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "30f62dc0de4309fd42ef96715fb933cebf582ce31b03ea732aaa30c07935f1bc", - "profiles/joint/primitives.npz": "7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7", + "profiles/joint/primitives.npz": "8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "c7e06c30acb85779af000a3999c267be0653c176e7707fd201378f17be367b96" + "router_config.yaml": "4e47169fff9445fecfb302bd53d35e2e7bb473fd8e775f6d32a349ffc131cecc" }, - "fingerprint": "dea124a1621ab9f8d9016da320ebbadefff0695f472f674681d648fb646a0776" + "fingerprint": "adc01bf6b9c36fa3b08828174946f00acb7410bfeb47cb6228534c23d227599c" }, "extended-2nd-1mm-2k": { "edition": "Extended", @@ -437,16 +437,16 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-1mm-2k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "fb09bc11fe6e8fd56f555d51af06a9fd74b93ac659fefaa08531be0fddff07a2", "profiles/eef/bpe.json": "a992d62357018dcf00fc3c0d06232c73712757dcce3877beb94fe73c8cc68b70", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "cb3bab8ffef2d12f9f57c8a1657d2813d7fe20c9d033e8e770b33ce516649d85", - "profiles/eef/primitives.npz": "e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378", + "profiles/eef/primitives.npz": "e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "8edd9f25be127dd07014b5c3942523c43dc2990362a899f327bc1df128088f87" + "router_config.yaml": "d0f16fe1a7fcb145756740ec5ea0c21b41012a5b8ac138c70626cc6ff715cec2" }, - "fingerprint": "70a220c3c11ac51f0afa164b02cee7f496aa6ca9992aab800371a5851328d3b0" + "fingerprint": "d9a478abf3405d0fe8cfea787e7560152e47ad307f2e4e46d92770562d827e4f" }, "extended-2nd-1mm-4k": { "edition": "Extended", @@ -459,21 +459,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-1mm-4k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "16044439fd07d9362680f3e8352e9090fef15221af70ccc7de9c59e811f84737", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "d519bc487a5f4c887e320d29be260faa18a689737c4d0b480bd43b8b8d1dc477", - "profiles/eef/primitives.npz": "e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378", + "profiles/eef/primitives.npz": "e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "bb6ea3ad584a4b1650549d4957a0042776e565a96ea7e98f4ba9af35b6093526", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "f55bf08659f79e6a306b2528a9a5e918e2931d59f9ed813e1d3aad3b4e39cba5", - "profiles/joint/primitives.npz": "b53d754ac5d71978ae8756380b2be58fa1ca53f7c281123e52f8ede281be1fd8", + "profiles/joint/primitives.npz": "54a2f0c8fb757b0feb9638cd9871b07ca79a204518ef9c461dedf865485ee083", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "dcfd8664233e9760f748d5ab5e451e34cf451db0dc0f86508afe83d438d9d090" + "router_config.yaml": "97d3d26eb7c984a2ad99b1a62437fb6a45375f2ca9331ab2a4fe8ce34b70474b" }, - "fingerprint": "763a384542c38c2bdb5da0dbfa5bdc258761b7ffb943a735f9ea80b25e02b22d" + "fingerprint": "62e01e6b2d72a30c01516766873b921f8b210e2e8cd7f79f38c482489c25005e" }, "extended-2nd-1mm-8k": { "edition": "Extended", @@ -486,21 +486,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-1mm-8k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "c201467e721b7c7554887b0511049ffcb86df7c592538d2b07e9fc3f8c41eaa6", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "b7e24e7909d0e98f6a72b8ee1beca5ac5c14a0ea3d9d3792bb067ec7bfb8a3dc", - "profiles/eef/primitives.npz": "e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378", + "profiles/eef/primitives.npz": "e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "c950c67ab82551df5385bcd01f4658a453442c1a6931108aaf6187cc29f15d68", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "3ee2e89367ecedcaff928aac081cf69ba615d6cf89bd07e011815119a60ff825", - "profiles/joint/primitives.npz": "b53d754ac5d71978ae8756380b2be58fa1ca53f7c281123e52f8ede281be1fd8", + "profiles/joint/primitives.npz": "54a2f0c8fb757b0feb9638cd9871b07ca79a204518ef9c461dedf865485ee083", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "0389ff89955937d56310baabfd23b16845077ba2a7508d734182474d31194e70" + "router_config.yaml": "4c3a2d413ae03f93b2cf13fcc48a2d900e79020052804929094ff056bc97241c" }, - "fingerprint": "18abd631e8537207ff43775320c3c8b7542555bf5f80cb917173e98017dfc0a6" + "fingerprint": "8ff5ecebade23b83a37db7978ac56bd7be1d7a013a67ee095777f9f47973c741" }, "extended-2nd-1mm-16k": { "edition": "Extended", @@ -513,21 +513,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-1mm-16k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "f7d2fa1605d2f4a106be3a98519d8af88ec840e093781fc0ac054ee521a91783", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "76ab787a33b6af06661e1d8d356204a290a1283aa1cba1f829074c9f3cc802b5", - "profiles/eef/primitives.npz": "e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378", + "profiles/eef/primitives.npz": "e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "13b5b311261e5303d12ad075fd67bbfc42f9381a25e3b215b604e40baecacc99", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "cab446c1017ead5015a9508b16c239a6aa91feb69157e0489c78357b40a63715", - "profiles/joint/primitives.npz": "b53d754ac5d71978ae8756380b2be58fa1ca53f7c281123e52f8ede281be1fd8", + "profiles/joint/primitives.npz": "54a2f0c8fb757b0feb9638cd9871b07ca79a204518ef9c461dedf865485ee083", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "352373876fc16b10723b6df430d5658213d78f06b077072aa1e7a4238e9c9b89" + "router_config.yaml": "1eec34a8b62a64a3240df05eb8faa115f7f4bfa6c5d627245b83f694b9882b7b" }, - "fingerprint": "b6e8306633ac9da69c31092274ebf455518100dffd439b9270d0a5988a2052c9" + "fingerprint": "35f2db9161a29f5723f8ace61525a7552dc371ce818701b0903cd1fcc24d1144" }, "extended-2nd-5mm-1k": { "edition": "Extended", @@ -540,21 +540,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-5mm-1k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "365e8dd8406d790038113bff1286839dcdc6b40537a6794da44bd649b9933124", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "8cefc5b2ae8a35f5b5594faa2f63a13c812002874ad271637e810d24b88bf97b", - "profiles/eef/primitives.npz": "9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537", + "profiles/eef/primitives.npz": "fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "0a58259bfdf50963c84372e68b8a4f3cdca7e97ae5e3d83cb48ad2fb4e0e9918", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "2fa78e103cece81d78c08b86263ff66229373a185e2edd90defc003116c0eba3", - "profiles/joint/primitives.npz": "d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf", + "profiles/joint/primitives.npz": "74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "474fb910973970807b4700af521677a15a74c5bf458eb3aaf16aa54981074b53" + "router_config.yaml": "d1e72ebad343e99c1e1eff6d853ac8d89e46fb0b1d0f53501a9885799c0f31ea" }, - "fingerprint": "849d89278131d7b176bca6a71ef6a4f8e0f7be759115fcd7978ff2649226f029" + "fingerprint": "e8d67583157595fc33f2da296e9597bfcba93da09d8a197dde08989d1d7f5123" }, "extended-2nd-5mm-2k": { "edition": "Extended", @@ -567,21 +567,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-5mm-2k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "49dccf2d5dd29962d7ff018e58a31648caeda80cce40dc8aad82d1e089590613", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "814c30751d1e3d1d46ab62367c8cfb05038a23490130694668299788f7389392", - "profiles/eef/primitives.npz": "9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537", + "profiles/eef/primitives.npz": "fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "5e04dd9902577462a561a8c6b2c2c986bf0cbc29aec62b6233b825859020371c", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "a2da651a51e98b43e49e905de68f922f20cc4f269ee601c237f752f4c45da7ff", - "profiles/joint/primitives.npz": "d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf", + "profiles/joint/primitives.npz": "74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "acce6e3d40f192661b24dd54933b943be1974ef54f9fe1819f1e3f68192ad6fe" + "router_config.yaml": "2505583d75d92e4ead181da481d767ed3e40dadc54f9fb722f076465be051163" }, - "fingerprint": "3a8e05ce0cfc515cafadf5e60b6ecb67fe873971744b4f5994740036a23c5545" + "fingerprint": "2d6b7eabe50d0d54a4f817e0fcdb18ccc0240a61ca026f7e81f41e3182278c69" }, "extended-2nd-5mm-4k": { "edition": "Extended", @@ -594,21 +594,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-5mm-4k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "14863530382496df2d7eefa7eff10a86e26e50fde48cc12ecb623cc98f9581d2", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "4ff511f5ee108b1b439b4120371821e13f9237d99ea21892bcd5a57cff1a55a3", - "profiles/eef/primitives.npz": "9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537", + "profiles/eef/primitives.npz": "fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "8f7047c6453e4fc4ecc169f447ec706fb807e9639938f8791cbeaca7feb19f56", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "9fb211a9fc111356ad300459ed95fd62c1b4b87471978d255d11b407729b1817", - "profiles/joint/primitives.npz": "d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf", + "profiles/joint/primitives.npz": "74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "83a08cf23344da328b97a9001aa697f53dec688fa54e2c7fbb32b4ae6e2797b4" + "router_config.yaml": "14ce2a187f12a9a9736a209991d03d82619f3aa8b112d343335b514bf8da9abe" }, - "fingerprint": "06f00f5aa9124dbe266579f3a7de599b526335498ceaa380101a654aaca59386" + "fingerprint": "55e0841768b5102f4501d38610bf6c4c65e9164557309e9371d81291009ecd2e" }, "extended-2nd-5mm-8k": { "edition": "Extended", @@ -621,21 +621,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-5mm-8k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "15c601a24cac98c2551aff79432b14ec63ce11990262f8c51af1f3b1ac5d83ef", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "31d287b966b7d5be1ba93117322706d9425de9f1a2fadec16cb42f5d2efdd498", - "profiles/eef/primitives.npz": "9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537", + "profiles/eef/primitives.npz": "fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "03ee510f1602367bfb12b296df58cf04dab06ab38773494800a2652ff8c0e5f9", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "df1ccbbff7048156a0ea9b1a75695ae16e3e18025cfb83eba958b74a2444bc87", - "profiles/joint/primitives.npz": "d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf", + "profiles/joint/primitives.npz": "74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "f5a47c35c6578aa0d8cdf1cb2a9b0f37e6b97a8b4ea1f09a0c2347fde8655f7d" + "router_config.yaml": "33f3f3241e8a5a0c0aaf99ddf31015bfaed27d9ac15d0ae65f77e16b376826c0" }, - "fingerprint": "772129185f4fc598d53644cb1883ee3fa269ea9e088e2412b3bf643df40a5dfc" + "fingerprint": "de90003b6704fdecf6d9e9b3659a62118f30faf8e8df97c561be5b9242949413" }, "extended-2nd-5mm-16k": { "edition": "Extended", @@ -648,21 +648,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-5mm-16k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "0adc5e404714e1d19bd93a6dc2956fbe9b85147f233fcd726a5b28a8a9bacd47", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "3ddc821bec54a076b113e29c4b3ac52dbb95719c137ca5062843a169a379b62b", - "profiles/eef/primitives.npz": "9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537", + "profiles/eef/primitives.npz": "fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "d4e1fe056654291aa9085842a10c4d9bd3ee8da81778da076bc1fc986d68922e", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "d7044f4acd60a9f2d59e89128b75dc2d62f5de42a4da99c3419b3c859999fb7f", - "profiles/joint/primitives.npz": "d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf", + "profiles/joint/primitives.npz": "74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "c60728883e0c77643a3f9446c4d493383a1025184f358eb16a50adde9c633ee6" + "router_config.yaml": "2cbbedb34948c6dbd0096f15d6a0c1285dea9502c4b1d8bf3eabbb1eefae50dc" }, - "fingerprint": "9992452f2f1e117624df8784aeeeb81a8492511ca283a206b37f8b302a06785e" + "fingerprint": "597a15294cfcb765cbb3854d31597b5efeab0f5c4344b7abe5a185cdd3465e90" }, "extended-2nd-10mm-1k": { "edition": "Extended", @@ -675,21 +675,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-10mm-1k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "7325c615de175cc38f31ab7f10e2b7505ff532f3a5cb2c4bb4dc5b1690c2cb1d", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "874fc21efcaafdb7fa52ddf11602916f30fc15733e35205204345c8b4089b3b8", - "profiles/eef/primitives.npz": "9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7", + "profiles/eef/primitives.npz": "cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "3370cb3798f0d37b23c3309c1049a494d658352591e41e3820c97d8252abe587", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "bc9d7716af263f409efe501b49aaf8d771cbedc10fa739428a55002cd86f2bb2", - "profiles/joint/primitives.npz": "5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2", + "profiles/joint/primitives.npz": "5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "6731f82807949b292ba1a99426e6611ab78773e3d7a042405a0c1843a5f21ffd" + "router_config.yaml": "51c95787262f06a389b0b3dc3f5ebd39af4172c4d8f8e560fd9710826822ac81" }, - "fingerprint": "787da94deae5743c2d53dbe424d38a6919db63ec6c571beeaa1bf46d9471fedd" + "fingerprint": "6f40b9bfa57d8981677aec202e3b8ba94ae4b7a46d5a386a22252eea780f1749" }, "extended-2nd-10mm-2k": { "edition": "Extended", @@ -702,21 +702,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-10mm-2k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "c09235f189580f948b103daa95074404cce82a1a22fe9cda76be880df8497eba", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "10a34647064e59b457cfa6f4cead1d19e7094569ae6e716588343e7eea0686e6", - "profiles/eef/primitives.npz": "9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7", + "profiles/eef/primitives.npz": "cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "86f8fe57d6efda1ddcea6aaadb63ec007b70f87076a74d6931fe3f1ed2947edb", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "6b12dc078037d3e0bd057940567dc2b4766bcb18111000c26ef72f947810d6c2", - "profiles/joint/primitives.npz": "5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2", + "profiles/joint/primitives.npz": "5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "b195bb5b6d725a35332f34d16db5f1341b3a271d8050f8a5c00f566ef2c536d0" + "router_config.yaml": "a3b52b48d761e06960fd1d53826ec68e09451d026fb03a74d75ad29c76655b40" }, - "fingerprint": "131daf011a6211d09930b4db529f5cfeb0babe9f92938c551e370909a914b48b" + "fingerprint": "b0ac1af3a366d1b77363a2269c9577a78e69b71535fdf9352d65f2cf967ff503" }, "extended-2nd-10mm-4k": { "edition": "Extended", @@ -729,21 +729,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-10mm-4k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "fc388b428d3518f4d6a24e157f07b5da12933153dea0c64a5080409b74a54101", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "313bf8fbb7067732e97b9afb7736005677b76f014237dc479aace10b95d34a1b", - "profiles/eef/primitives.npz": "9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7", + "profiles/eef/primitives.npz": "cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "4878fdfb074d53091fce63fd723354cf168c04986d9bdf0bf6af0ba6b7589f35", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "c797cde0c170a6a012704e6be555c101e45db7da03b13c5de657a712e27037c7", - "profiles/joint/primitives.npz": "5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2", + "profiles/joint/primitives.npz": "5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "e31cfb5499324f8aef8a8516ce33b1f9f8f3bec468931c5aa53d4f7f83529336" + "router_config.yaml": "d5652ff31d039e79bbbaad021ae8dda881d4b9dfc83ae93dd533156e33967753" }, - "fingerprint": "17a0f927d4bbf5a39e83f5a1bf5fa81fe45203de4e8f7679554bec2fd2769592" + "fingerprint": "76eb6c3280e083f4b97c5abf88e93e7c2226c25cc2e2f7d547e78ebc43404b04" }, "extended-2nd-10mm-8k": { "edition": "Extended", @@ -756,21 +756,21 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-10mm-8k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "0609d4b09ee3ffa7e9c53bd752120229f3f463d17ee2a41a430ffeea74058274", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "0bf8d20c4a7abcd56f2ba5c351714cef3aef29c1dfb6172b5353d3f010d91109", - "profiles/eef/primitives.npz": "9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7", + "profiles/eef/primitives.npz": "cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "d8296142d5c1045b6bb56ccb72bf45f240219c6c94cd48787c26623e71a29866", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "6de75a0d5db33f2ee81070852c4383a3284aa7365c50e152256f0d26522eb922", - "profiles/joint/primitives.npz": "5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2", + "profiles/joint/primitives.npz": "5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "21f7119e080a82af8337179719937b09f1c7fdce53bcd8a829cfc0d1a6021529" + "router_config.yaml": "2777cc1df9a0ce6b9b79162e6bb7bfca074d25a2fa7beb77b49de83fbaf65bc1" }, - "fingerprint": "a1b7cc4281aad787e39c22c6e5e597c556c6fda41742be132320dbe2bae94d5d" + "fingerprint": "ee89bbf1be75f6ad2e6e9c6194176a1af805f07d55d65b2b05e419db5c95c394" }, "extended-2nd-10mm-16k": { "edition": "Extended", @@ -783,21 +783,137 @@ ], "legacy_repo_id": "ZibinDong/ActionCodec2-Extended-2nd-order-10mm-16k", "files": { - "config.json": "5fd7c83d569c5e90f3aed25e3a5232e099060abeca2db58eaacea52a3e52ef5d", + "config.json": "5ade106053473d58add5eb8b3dca896eeabd8ca596720fd0a397ce28867c8ba4", "processor_config.json": "1fc325c763d1083b579fc6130ca04f1ce83dc2d4493030034c5abf0d9539b5bb", "profiles/eef/bpe.json": "9fdbbd26a02fc3a7586ba5d1743260e461ebe5be69557d6c69f2c0ff4d0a4722", "profiles/eef/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/eef/config.yaml": "3da32332ef1a5f221626e1ac22346c15de58bbd2d29b0c9e0abce88e8bd2c15d", - "profiles/eef/primitives.npz": "9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7", + "profiles/eef/primitives.npz": "cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b", "profiles/eef/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", "profiles/joint/bpe.json": "b503a4266854a177ff70e08527ed67e656f17401484e3863552999f2dfe36f8f", "profiles/joint/config.json": "44d412ad057ba03aadefcf0880883dd19f3d12aafc3e6d10e1a06b56b46bb896", "profiles/joint/config.yaml": "d8f616a442a5d555c5d356bba012abf2e99e58d048a2abd3099407e60ed3daac", - "profiles/joint/primitives.npz": "5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2", + "profiles/joint/primitives.npz": "5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a", "profiles/joint/processor_config.json": "f5c0800e6cfdcb7adb8b11f428239cc28e0e407efb2d67c95fef0467ee39b701", - "router_config.yaml": "e5b621a52369cdf85d6d3f33cee23fb880f0d47ff287752d77ff6d07bf18caee" + "router_config.yaml": "5a4443b0ade47ea8242810e43b6ded38789960e148b60151cc299842871b7563" }, - "fingerprint": "772b889e35df84232f330917453497bcd1073c54e0ef1d5d28898fe79e6f4599" + "fingerprint": "ac914168fbf09e17005ac1a89001e3a761739c5d8fe0107335ad220596bdad3c" + }, + "sparse-standard-2bin": { + "edition": "Sparse", + "tokenizer": "actioncodec2_sparse", + "dynamics": "standard", + "encoding_order": 1, + "precision": "5mm", + "codebook_size": 4096, + "gripper_mode": "2bin", + "profiles": [ + "eef", + "joint" + ], + "files": { + "config.json": "973824aed15c453583e8d0b6647bad910db22b8b4411f9e997cd76b8d69ada79", + "processor_config.json": "9c82aaf367b23a1e1e1d9aa157a921006ce645f9405b91a589d69f59e310f07f", + "profiles/eef/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/eef/config.yaml": "caf78aef0a8f4a0ee902f68ee3b00c368bb39ee8f54c088e94d55a727e606a31", + "profiles/eef/primitives.npz": "0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322", + "profiles/eef/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/eef/sparse_bpe.json": "ad46da7075936a5166c82dc9173e28344f4108121d2295ecc4b416ef29e3168d", + "profiles/joint/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/joint/config.yaml": "211949e1e76f323b8947936d186ea95410d4e95848b2ba5c02ac58ca0a6b4e28", + "profiles/joint/primitives.npz": "926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191", + "profiles/joint/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/joint/sparse_bpe.json": "acec081f7603e372ee855b0168d4a53250393d078f0e5c0b8d1a51123a893caf", + "sparse_router_config.yaml": "23c2a321bc975f60b5e0b7bf82a6e38de3d6472dcb53f61ebeedbdb71f58ef79" + }, + "fingerprint": "32d447437592a920679f966dc807b493551461ab9878b6ecac5b704e09073076" + }, + "sparse-standard-21bin": { + "edition": "Sparse", + "tokenizer": "actioncodec2_sparse", + "dynamics": "standard", + "encoding_order": 1, + "precision": "5mm", + "codebook_size": 4096, + "gripper_mode": "21bin", + "profiles": [ + "eef", + "joint" + ], + "files": { + "config.json": "973824aed15c453583e8d0b6647bad910db22b8b4411f9e997cd76b8d69ada79", + "processor_config.json": "46a9a92d4f9f89dfeb7b7a4e3c9ec07a859ce46acbc9ec8cc1e81d221010132b", + "profiles/eef/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/eef/config.yaml": "f430a2c010f602f323a257732aa34c83747f6dc80c6b3bfcea160f4a7c348650", + "profiles/eef/primitives.npz": "a58825a293cc387275a83005b84d7ff652c918449d40987e50ce2ed472ba7177", + "profiles/eef/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/eef/sparse_bpe.json": "c086e996eea918c1715371aa89e95896079a65c88d49cd585480998608fbef71", + "profiles/joint/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/joint/config.yaml": "eb1679ae589f99a5e91ecddb2e38302911edb01a630a333a65f09767e60374f1", + "profiles/joint/primitives.npz": "f8e8c49ca932fb18a9edd59e54153b3cc26aee37c78d486bdf28a4231ee355c4", + "profiles/joint/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/joint/sparse_bpe.json": "a070e8beab1af8ff2882eb564252a1f15c72aa04d32827b320f82fd52cf5479e", + "sparse_router_config.yaml": "756052f7ad274157de160a961ac48c4cdb4ee5bf5c57d0cd7c36761dab97563b" + }, + "fingerprint": "4eaea94a4f8b138498c3f402b4d20ae801b868f22134ff09025907480b312107" + }, + "sparse-high-dynamic-2bin": { + "edition": "Sparse", + "tokenizer": "actioncodec2_sparse", + "dynamics": "high-dynamic", + "encoding_order": 1, + "precision": "5mm", + "codebook_size": 4096, + "gripper_mode": "2bin", + "profiles": [ + "eef", + "joint" + ], + "files": { + "config.json": "973824aed15c453583e8d0b6647bad910db22b8b4411f9e997cd76b8d69ada79", + "processor_config.json": "9c82aaf367b23a1e1e1d9aa157a921006ce645f9405b91a589d69f59e310f07f", + "profiles/eef/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/eef/config.yaml": "f0ef34e580b76e9bfbe36646e86805f3a64e86c38a2f2897b638ea150fbcfd03", + "profiles/eef/primitives.npz": "8ffa50a3dcb13ab27c6c4b47f1ad542ae184e86658dbcec23a8199e42aefdb99", + "profiles/eef/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/eef/sparse_bpe.json": "e068b55a0dd55b3d68f4d3c4f945a4797fd74db63fe896d3b20ca37e958e0b7a", + "profiles/joint/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/joint/config.yaml": "1011216cb8d4557d1511ac67986755beacaee37d82e8940632e02dc3d6200dd6", + "profiles/joint/primitives.npz": "c23ddcbe09fbe08c0cf46defd81af6b22f9891ec174cb486284dc59c202f689d", + "profiles/joint/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/joint/sparse_bpe.json": "cb359122eb62fa1bce084cb522d90c1644d9d7c9550c13fe46bfe3e92eb7a0d1", + "sparse_router_config.yaml": "6d211a9fb5310ef3c954c0ae02761a3c6a90cac598892d9a8fa26959bda96ad9" + }, + "fingerprint": "6fc4c403750bee2bad686bdc17e206a34e3e489728a4c6922e33a34abef9525b" + }, + "sparse-high-dynamic-21bin": { + "edition": "Sparse", + "tokenizer": "actioncodec2_sparse", + "dynamics": "high-dynamic", + "encoding_order": 1, + "precision": "5mm", + "codebook_size": 4096, + "gripper_mode": "21bin", + "profiles": [ + "eef", + "joint" + ], + "files": { + "config.json": "973824aed15c453583e8d0b6647bad910db22b8b4411f9e997cd76b8d69ada79", + "processor_config.json": "46a9a92d4f9f89dfeb7b7a4e3c9ec07a859ce46acbc9ec8cc1e81d221010132b", + "profiles/eef/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/eef/config.yaml": "74b6f9b0c013badcdb6e896eaadc08005111d3e4ba5e11f5c1070bc6f1af21fd", + "profiles/eef/primitives.npz": "4a2c15f170af85cabcd51ae6b330ae7692cccdd02766957958482440212ccd24", + "profiles/eef/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/eef/sparse_bpe.json": "0d3e4ecd29da0bbdbd6b0dcab39822d5e8e38b96e9f3bc6d74e6aa6662f09df6", + "profiles/joint/config.json": "0d914f30843f0b9644d8708fa7417e5183b7f92ff2648d8695b5b7f2fa550bac", + "profiles/joint/config.yaml": "92b67484efd7d6dc041a17956564cd3fa7acc20804ce76c6fdca61c1155458e9", + "profiles/joint/primitives.npz": "90ca4e7791af583c4bcaddfce14186da3b22fe69e7bbe14b139eb26a172c8c25", + "profiles/joint/processor_config.json": "66c4e679d07100d56529ed14faa42c44724b89f4846da91e1cf595fa7488da8f", + "profiles/joint/sparse_bpe.json": "edfe8d106b3d8d9c315a7da95b6e99adf1977448397ba445f50197f791fcfd25", + "sparse_router_config.yaml": "069244cff732182dd57440a5d1373773bb96d2aad87a005bc518687f28cbde31" + }, + "fingerprint": "0e23aa03bcec1331b314c46a4760de8bb02d649d04a8fc175129bc494dd43fb2" } } } diff --git a/variants/extended-1st-10mm-16k/config.json b/variants/extended-1st-10mm-16k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-10mm-16k/config.json +++ b/variants/extended-1st-10mm-16k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-10mm-16k/profiles/eef/primitives.npz b/variants/extended-1st-10mm-16k/profiles/eef/primitives.npz index 66719fba16ebeb8e9f7e6e3f808d41541553b163..8026380a50507523f798198eee1451587ad14c9c 100644 --- a/variants/extended-1st-10mm-16k/profiles/eef/primitives.npz +++ b/variants/extended-1st-10mm-16k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf +oid sha256:ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9 size 2510 diff --git a/variants/extended-1st-10mm-16k/profiles/joint/primitives.npz b/variants/extended-1st-10mm-16k/profiles/joint/primitives.npz index 1bfcb546b8dfda088eefb623ab59fa79ebfed288..fca3682bc570414725b0be9cf5578ee0df57f06a 100644 --- a/variants/extended-1st-10mm-16k/profiles/joint/primitives.npz +++ b/variants/extended-1st-10mm-16k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7 +oid sha256:8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1 size 2834 diff --git a/variants/extended-1st-10mm-16k/router_config.yaml b/variants/extended-1st-10mm-16k/router_config.yaml index 902afdd4d8802e32fe8c628d3fbe3e3dbccf4ad3..01e73d7564bc46d0e188ae98984b09d2ef9bc463 100644 --- a/variants/extended-1st-10mm-16k/router_config.yaml +++ b/variants/extended-1st-10mm-16k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-10mm-1k/config.json b/variants/extended-1st-10mm-1k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-10mm-1k/config.json +++ b/variants/extended-1st-10mm-1k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-10mm-1k/profiles/eef/primitives.npz b/variants/extended-1st-10mm-1k/profiles/eef/primitives.npz index 66719fba16ebeb8e9f7e6e3f808d41541553b163..8026380a50507523f798198eee1451587ad14c9c 100644 --- a/variants/extended-1st-10mm-1k/profiles/eef/primitives.npz +++ b/variants/extended-1st-10mm-1k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf +oid sha256:ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9 size 2510 diff --git a/variants/extended-1st-10mm-1k/profiles/joint/primitives.npz b/variants/extended-1st-10mm-1k/profiles/joint/primitives.npz index 1bfcb546b8dfda088eefb623ab59fa79ebfed288..fca3682bc570414725b0be9cf5578ee0df57f06a 100644 --- a/variants/extended-1st-10mm-1k/profiles/joint/primitives.npz +++ b/variants/extended-1st-10mm-1k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7 +oid sha256:8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1 size 2834 diff --git a/variants/extended-1st-10mm-1k/router_config.yaml b/variants/extended-1st-10mm-1k/router_config.yaml index 57eb147ec01d82e4698392ac51660c8420253ed8..d5fccd1e66f96712884dc8c8baa812890aa6aa58 100644 --- a/variants/extended-1st-10mm-1k/router_config.yaml +++ b/variants/extended-1st-10mm-1k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-10mm-2k/config.json b/variants/extended-1st-10mm-2k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-10mm-2k/config.json +++ b/variants/extended-1st-10mm-2k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-10mm-2k/profiles/eef/bpe.json b/variants/extended-1st-10mm-2k/profiles/eef/bpe.json index 4bece4476d2d16c79677fdbe593b760074ffd305..69cdcd874593ce007bec82a52ff7271a46575645 100644 --- a/variants/extended-1st-10mm-2k/profiles/eef/bpe.json +++ b/variants/extended-1st-10mm-2k/profiles/eef/bpe.json @@ -1 +1,8830 @@ -{"spatial_merges": [[4, 13], [22, 84], [38, 61], [98, 99], [100, 101], [96, 102], [97, 102], [96, 100], [61, 96], [38, 96], [22, 98], [84, 98], [97, 100], [13, 99], [4, 99], [62, 107], [37, 106], [39, 106], [97, 101], [60, 107], [83, 108], [85, 108], [21, 109], [5, 111], [23, 109], [3, 111], [14, 112], [12, 112], [61, 97], [62, 96], [38, 60], [61, 116], [3, 13], [5, 13], [101, 113], [101, 117], [60, 96], [22, 83], [101, 114], [22, 85], [101, 115], [23, 84], [4, 14], [4, 12], [21, 84], [38, 62], [105, 120], [105, 122], [105, 118], [105, 119], [105, 121], [105, 123], [105, 125], [105, 124], [116, 128], [37, 126], [97, 128], [39, 126], [37, 129], [37, 127], [39, 129], [39, 127], [23, 98], [21, 98], [39, 134], [110, 120], [37, 134], [110, 119], [110, 118], [97, 143], [116, 143], [3, 99], [110, 121], [5, 99], [110, 125], [110, 124], [60, 97], [105, 130], [113, 122], [115, 124], [105, 131], [114, 125], [110, 122], [110, 123], [105, 140], [83, 160], [135, 141], [62, 97], [85, 160], [85, 161], [83, 161], [117, 120], [23, 85], [14, 169], [12, 171], [12, 169], [23, 83], [137, 141], [14, 171], [137, 140], [21, 85], [3, 12], [3, 14], [139, 141], [21, 83], [130, 139], [131, 142], [5, 12], [130, 142], [131, 139], [141, 142], [131, 135], [5, 14], [131, 137], [130, 137], [135, 140], [101, 159], [101, 157], [37, 174], [114, 118], [130, 135], [115, 119], [113, 123], [39, 174], [117, 121], [113, 118], [101, 162], [60, 116], [101, 164], [139, 140], [113, 119], [140, 142], [117, 119], [115, 123], [39, 185], [114, 121], [40, 106], [117, 118], [113, 121], [37, 185], [62, 116], [36, 106], [117, 123], [114, 123], [125, 153], [115, 118], [114, 119], [120, 154], [124, 155], [63, 107], [139, 175], [115, 121], [142, 178], [59, 107], [114, 122], [63, 96], [115, 122], [115, 120], [59, 96], [105, 183], [114, 120], [119, 155], [118, 153], [105, 186], [105, 187], [105, 188], [113, 124], [122, 167], [105, 184], [113, 125], [119, 154], [137, 182], [37, 225], [39, 225], [118, 154], [139, 178], [117, 125], [113, 203], [135, 178], [117, 124], [142, 175], [135, 182], [105, 193], [137, 175], [137, 178], [39, 238], [105, 191], [135, 175], [105, 196], [118, 167], [105, 195], [105, 201], [82, 108], [105, 192], [119, 167], [37, 238], [86, 108], [139, 182], [113, 183], [119, 153], [118, 155], [121, 154], [142, 182], [121, 153], [113, 186], [114, 184], [115, 197], [124, 159], [117, 122], [122, 157], [115, 191], [105, 208], [59, 97], [125, 157], [139, 199], [40, 127], [36, 127], [122, 159], [22, 82], [141, 194], [120, 155], [110, 187], [114, 193], [120, 153], [110, 188], [22, 86], [110, 204], [114, 192], [110, 184], [121, 155], [40, 134], [123, 155], [110, 197], [124, 162], [141, 202], [117, 204], [115, 213], [115, 196], [130, 198], [139, 200], [125, 164], [37, 253], [137, 200], [135, 205], [131, 194], [137, 199], [113, 120], [4, 15], [121, 167], [114, 195], [117, 206], [37, 256], [135, 199], [120, 162], [140, 198], [123, 167], [113, 190], [117, 187], [130, 202], [135, 210], [113, 207], [117, 188], [137, 210], [36, 126], [36, 134], [110, 209], [142, 205], [135, 200], [40, 126], [39, 253], [110, 211], [114, 201], [142, 200], [124, 154], [125, 154], [120, 164], [139, 205], [118, 157], [123, 154], [115, 227], [123, 153], [119, 159], [2, 13], [130, 194], [39, 256], [137, 205], [142, 210], [131, 202], [119, 162], [140, 190], [6, 13], [122, 153], [131, 198], [4, 11], [122, 155], [118, 164], [63, 97], [131, 190], [123, 157], [110, 183], [110, 208], [123, 159], [110, 192], [141, 190], [123, 162], [142, 199], [24, 84], [121, 157], [115, 229], [110, 229], [110, 186], [121, 164], [125, 167], [113, 201], [140, 194], [124, 167], [118, 159], [139, 210], [110, 196], [113, 227], [110, 218], [15, 112], [110, 195], [123, 164], [110, 206], [110, 212], [119, 157], [110, 213], [141, 198], [11, 112], [130, 190], [119, 164], [121, 159], [118, 162], [121, 162], [110, 203], [114, 208], [155, 197], [110, 193], [153, 184], [2, 12], [20, 84], [140, 202], [110, 207], [157, 201], [110, 191], [120, 167], [159, 227], [117, 207], [38, 310], [124, 234], [24, 85], [114, 209], [114, 124], [114, 183], [113, 212], [117, 212], [115, 212], [115, 125], [110, 201], [125, 239], [2, 111], [110, 227], [113, 218], [115, 186], [113, 209], [119, 221], [114, 218], [122, 154], [117, 229], [117, 211], [115, 211], [117, 209], [117, 208], [6, 111], [115, 187], [114, 207], [117, 218], [114, 188], [101, 234], [125, 216], [154, 187], [101, 239], [118, 216], [114, 203], [113, 211], [23, 86], [115, 203], [118, 237], [120, 221], [120, 216], [24, 83], [124, 221], [36, 174], [154, 188], [119, 232], [115, 206], [115, 204], [20, 85], [162, 229], [157, 183], [114, 204], [86, 160], [153, 192], [124, 232], [24, 109], [38, 394], [159, 186], [115, 218], [40, 174], [122, 247], [114, 211], [113, 193], [113, 213], [125, 237], [141, 316], [114, 212], [113, 184], [115, 183], [115, 209], [6, 12], [114, 186], [155, 191], [82, 160], [115, 207], [154, 204], [113, 197], [117, 197], [3, 15], [115, 188], [40, 185], [114, 206], [153, 195], [23, 82], [20, 83], [167, 183], [117, 184], [119, 216], [113, 191], [157, 203], [114, 187], [120, 251], [175, 190], [105, 290], [155, 213], [3, 11], [117, 195], [157, 193], [159, 203], [113, 195], [105, 294], [122, 232], [198, 200], [167, 186], [155, 229], [118, 221], [105, 312], [130, 354], [113, 196], [155, 196], [117, 193], [164, 208], [153, 193], [37, 310], [117, 213], [162, 191], [175, 194], [162, 206], [117, 192], [154, 206], [117, 191], [153, 208], [21, 86], [140, 323], [157, 184], [118, 232], [157, 207], [36, 185], [21, 82], [190, 199], [159, 191], [178, 202], [178, 198], [115, 419], [135, 345], [162, 187], [113, 192], [101, 247], [122, 237], [39, 310], [202, 205], [110, 290], [37, 96], [159, 197], [101, 251], [119, 237], [194, 205], [124, 153], [121, 216], [125, 155], [110, 294], [157, 192], [5, 15], [105, 337], [105, 317], [159, 213], [113, 381], [41, 106], [122, 164], [164, 206], [162, 197], [194, 199], [182, 190], [2, 14], [117, 196], [137, 391], [182, 198], [164, 193], [82, 161], [114, 427], [164, 188], [155, 187], [164, 192], [35, 106], [199, 202], [190, 200], [159, 196], [154, 208], [164, 184], [113, 312], [105, 332], [153, 209], [167, 203], [178, 194], [159, 183], [105, 384], [153, 201], [113, 206], [154, 229], [153, 188], [164, 195], [157, 195], [130, 404], [157, 186], [39, 96], [159, 207], [105, 357], [155, 227], [182, 194], [194, 200], [198, 210], [64, 107], [155, 212], [86, 161], [162, 213], [105, 343], [117, 183], [157, 209], [121, 221], [162, 212], [154, 209], [175, 198], [167, 207], [113, 342], [5, 11], [20, 109], [140, 316], [123, 232], [154, 211], [117, 186], [155, 211], [114, 317], [113, 204], [122, 162], [117, 336], [141, 323], [131, 354], [115, 340], [105, 364], [121, 237], [162, 204], [36, 253], [37, 394], [58, 107], [190, 210], [105, 350], [6, 14], [123, 221], [105, 360], [175, 202], [114, 350], [105, 401], [105, 365], [178, 190], [11, 169], [157, 312], [115, 387], [105, 341], [117, 356], [164, 204], [114, 374], [162, 196], [105, 340], [142, 380], [114, 341], [40, 253], [154, 197], [114, 343], [99, 438], [121, 232], [114, 312], [113, 337], [120, 159], [121, 251], [130, 439], [164, 218], [115, 352], [115, 365], [153, 218], [154, 184], [130, 323], [159, 211], [162, 188], [155, 186], [167, 218], [115, 360], [113, 317], [131, 316], [200, 202], [113, 188], [142, 388], [120, 157], [191, 234], [140, 354], [153, 183], [139, 380], [123, 237], [123, 216], [119, 234], [117, 390], [130, 316], [113, 187], [164, 187], [157, 317], [194, 210], [203, 247], [198, 199], [40, 256], [153, 204], [202, 210], [118, 239], [155, 206], [115, 357], [115, 370], [167, 184], [159, 387], [139, 388], [153, 211], [117, 203], [153, 187], [105, 383], [206, 251], [117, 385], [167, 212], [113, 412], [124, 366], [115, 337], [155, 188], [157, 342], [41, 127], [198, 205], [15, 169], [36, 256], [154, 212], [167, 201], [167, 197], [114, 332], [182, 202], [131, 323], [193, 239], [115, 415], [11, 171], [105, 374], [157, 212], [164, 207], [15, 171], [115, 412], [38, 116], [35, 126], [221, 229], [98, 449], [159, 337], [164, 209], [167, 227], [155, 209], [141, 354], [208, 216], [114, 213], [162, 352], [167, 209], [159, 218], [114, 383], [39, 394], [58, 97], [167, 211], [110, 352], [162, 211], [154, 195], [164, 211], [105, 426], [125, 361], [115, 345], [155, 218], [105, 370], [98, 489], [113, 503], [110, 332], [124, 313], [159, 212], [154, 213], [105, 415], [197, 234], [157, 218], [159, 395], [41, 134], [115, 195], [190, 205], [139, 391], [157, 374], [114, 401], [154, 192], [110, 385], [155, 204], [162, 336], [192, 239], [105, 403], [114, 342], [35, 127], [99, 518], [184, 239], [154, 218], [123, 234], [114, 403], [196, 234], [164, 212], [162, 209], [117, 352], [204, 251], [117, 332], [186, 247], [101, 314], [123, 239], [101, 313], [40, 129], [159, 412], [197, 221], [187, 221], [139, 438], [184, 216], [234, 419], [213, 234], [110, 390], [110, 341], [125, 314], [162, 370], [137, 380], [227, 232], [154, 196], [164, 356], [115, 384], [153, 206], [153, 212], [197, 232], [110, 364], [117, 364], [167, 195], [131, 439], [184, 237], [188, 216], [183, 247], [36, 129], [110, 360], [22, 81], [64, 590], [110, 336], [114, 196], [201, 237], [114, 197], [58, 590], [195, 239], [115, 336], [239, 427], [153, 207], [155, 183], [153, 186], [115, 184], [35, 134], [142, 345], [121, 239], [124, 157], [101, 328], [135, 391], [115, 440], [157, 401], [124, 328], [167, 213], [192, 216], [110, 350], [125, 162], [207, 247], [20, 86], [114, 364], [117, 343], [157, 211], [162, 207], [115, 395], [22, 87], [113, 404], [154, 207], [164, 332], [113, 374], [135, 388], [159, 209], [117, 384], [155, 203], [110, 317], [114, 356], [162, 218], [186, 232], [121, 247], [130, 449], [110, 340], [40, 310], [41, 126], [110, 387], [114, 428], [206, 221], [110, 356], [58, 642], [105, 500], [124, 164], [167, 187], [247, 404], [114, 290], [101, 362], [114, 426], [167, 188], [115, 192], [125, 159], [183, 237], [167, 193], [159, 415], [110, 384], [105, 521], [117, 370], [135, 380], [155, 352], [123, 247], [113, 357], [64, 642], [114, 390], [154, 186], [115, 385], [139, 345], [167, 192], [113, 415], [81, 108], [154, 193], [154, 183], [99, 611], [121, 234], [125, 362], [137, 543], [119, 239], [115, 294], [110, 357], [117, 294], [153, 341], [122, 216], [117, 403], [115, 381], [167, 191], [164, 403], [137, 388], [247, 503], [98, 532], [117, 290], [130, 532], [123, 251], [120, 232], [115, 582], [118, 234], [98, 496], [154, 191], [157, 428], [155, 207], [113, 294], [195, 216], [87, 108], [113, 290], [113, 640], [115, 193], [119, 251], [155, 340], [114, 294], [167, 196], [142, 391], [198, 345], [153, 290], [164, 364], [115, 290], [114, 191], [117, 342], [117, 426], [159, 381], [118, 247], [153, 332], [23, 87], [63, 785], [117, 440], [110, 383], [110, 426], [113, 350], [120, 237], [153, 203], [117, 365]], "temporal_merges": [[103, 103, 2], [104, 104, 1], [1024, 1024, 4], [1025, 1025, 2], [1026, 1026, 1], [1024, 103, 4], [1027, 1027, 4], [103, 103, 4], [1025, 104, 2], [104, 104, 2], [103, 1024, 4], [103, 103, 6], [1024, 103, 6], [1027, 104, 4], [1025, 104, 3], [1027, 1025, 4], [104, 104, 3], [103, 133, 2], [103, 132, 2], [103, 136, 2], [1027, 1032, 4], [103, 138, 2], [103, 144, 2], [104, 1025, 2], [1024, 132, 4], [1024, 133, 4], [103, 145, 2], [103, 146, 2], [103, 147, 2], [1026, 1029, 1], [103, 148, 2], [1024, 136, 4], [138, 138, 3], [1024, 144, 4], [103, 149, 2], [1026, 1029, 3], [1024, 145, 4], [150, 136, 1], [132, 132, 2], [1024, 138, 4], [1024, 147, 4], [1024, 146, 4], [103, 151, 2], [133, 133, 3], [1029, 1026, 1], [103, 150, 2], [136, 136, 3], [1024, 149, 4], [1025, 1025, 3], [1024, 148, 4], [1032, 104, 4], [145, 132, 1], [151, 138, 1], [104, 152, 1], [144, 133, 1], [132, 145, 1], [1024, 150, 4], [104, 156, 1], [1024, 151, 4], [146, 146, 2], [104, 158, 1], [147, 147, 2], [163, 152, 1], [1029, 132, 6], [149, 149, 4], [136, 136, 4], [1029, 133, 6], [138, 138, 4], [144, 133, 2], [172, 156, 1], [148, 148, 4], [1025, 152, 2], [104, 165, 1], [104, 166, 1], [1031, 144, 2], [173, 158, 1], [1029, 147, 6], [1029, 136, 6], [1029, 138, 6], [1029, 146, 6], [1025, 156, 2], [104, 163, 1], [104, 168, 1], [103, 103, 1], [1031, 132, 2], [1029, 145, 6], [177, 177, 2], [133, 133, 2], [104, 170, 1], [1025, 158, 2], [1029, 144, 6], [1031, 133, 2], [179, 179, 2], [145, 132, 2], [149, 149, 5], [1025, 168, 2], [1032, 152, 3], [1027, 1033, 4], [132, 132, 3], [1029, 148, 6], [1031, 146, 2], [1031, 147, 2], [138, 151, 1], [136, 150, 1], [1025, 163, 2], [1032, 156, 3], [1031, 145, 2], [1029, 149, 6], [176, 176, 2], [1025, 170, 2], [1032, 158, 3], [133, 144, 1], [148, 148, 5], [152, 163, 1], [1025, 165, 2], [180, 168, 1], [133, 144, 2], [1025, 166, 2], [156, 156, 3], [1032, 168, 3], [136, 136, 2], [1032, 163, 3], [158, 158, 3], [138, 138, 2], [132, 145, 2], [1031, 136, 2], [1031, 138, 2], [150, 136, 2], [166, 166, 2], [1031, 148, 2], [1032, 170, 3], [145, 145, 2], [165, 165, 2], [104, 172, 1], [146, 146, 3], [1026, 144, 1], [147, 147, 3], [151, 138, 2], [104, 173, 1], [132, 103, 2], [104, 181, 1], [1031, 149, 2], [1031, 151, 2], [1029, 150, 6], [1031, 150, 2], [1033, 152, 1], [1029, 151, 6], [144, 103, 2], [1032, 165, 3], [133, 103, 2], [146, 103, 2], [136, 103, 2], [147, 103, 2], [1032, 166, 3], [138, 103, 2], [1027, 156, 4], [149, 103, 2], [145, 103, 2], [148, 103, 2], [1026, 144, 3], [104, 180, 1], [1027, 152, 4], [1033, 152, 3], [136, 150, 2], [1025, 172, 2], [1027, 158, 4], [1026, 133, 1], [1025, 173, 2], [1027, 163, 4], [138, 151, 2], [1026, 1024, 5], [1025, 181, 2], [156, 172, 1], [144, 144, 3], [151, 151, 3], [177, 177, 3], [158, 158, 4], [152, 152, 3], [132, 132, 4], [1027, 170, 4], [179, 179, 3], [1032, 172, 3], [1033, 156, 3], [1027, 1038, 4], [1026, 144, 5], [1025, 180, 2], [1027, 168, 4], [1032, 173, 3], [149, 149, 3], [1026, 133, 3], [150, 103, 2], [168, 168, 3], [1032, 181, 3], [148, 148, 3], [1032, 180, 3], [1033, 170, 3], [176, 176, 3], [158, 173, 1], [1027, 165, 4], [146, 146, 4], [1033, 168, 3], [133, 133, 4], [166, 166, 3], [151, 103, 2], [165, 165, 3], [1026, 132, 1], [1027, 166, 4], [147, 147, 4], [1033, 163, 3], [145, 145, 3], [150, 150, 3], [1026, 133, 5], [1024, 1024, 1], [189, 189, 2], [1024, 103, 1], [152, 163, 2], [1033, 158, 3], [156, 156, 4], [1026, 1024, 3], [1034, 132, 2], [144, 144, 4], [1027, 172, 4], [1029, 1029, 1], [1034, 136, 2], [170, 170, 5], [1027, 173, 4], [1034, 147, 2], [103, 176, 2], [1034, 146, 2], [1034, 133, 2], [1034, 138, 2], [1026, 145, 5], [1027, 180, 4], [1033, 165, 3], [1026, 148, 1], [1033, 166, 3], [163, 152, 2], [136, 136, 5], [168, 180, 1], [1034, 144, 2], [1029, 1024, 1], [1027, 181, 4], [132, 132, 5], [1026, 149, 1], [151, 151, 4], [1026, 146, 1], [1026, 147, 1], [1026, 136, 1], [156, 172, 2], [138, 138, 5], [149, 149, 2], [1026, 138, 1], [152, 152, 2], [158, 165, 1], [1024, 176, 4], [1026, 132, 5], [148, 148, 6], [104, 104, 4], [156, 166, 1], [1026, 149, 5], [103, 189, 2], [150, 150, 4], [146, 146, 5], [1037, 152, 5], [165, 158, 1], [177, 177, 4], [170, 170, 6], [147, 147, 5], [1026, 148, 5], [1034, 145, 2], [179, 136, 2], [1037, 156, 5], [1033, 173, 3], [166, 156, 1], [133, 133, 5], [158, 168, 1], [148, 148, 2], [1026, 138, 5], [145, 145, 4], [1026, 136, 5], [1037, 163, 5], [222, 222, 2], [1033, 181, 3], [1026, 1024, 1], [152, 104, 1], [166, 168, 1], [165, 168, 1], [1026, 147, 5], [104, 152, 2], [1026, 146, 5], [149, 149, 6], [1026, 151, 1], [1033, 180, 3], [144, 144, 2], [1037, 158, 5], [172, 156, 2], [1026, 145, 1], [1034, 148, 2], [1026, 150, 1], [103, 179, 2], [163, 104, 1], [165, 152, 1], [166, 152, 1], [144, 1024, 2], [220, 220, 2], [177, 138, 2], [156, 168, 1], [132, 1024, 2], [133, 1024, 2], [1037, 168, 5], [1026, 150, 5], [1037, 170, 5], [158, 152, 1], [1026, 151, 5], [132, 176, 2], [1033, 172, 3], [147, 1024, 2], [148, 144, 2], [1034, 149, 2], [103, 136, 4], [173, 158, 2], [146, 1024, 2], [165, 104, 1], [103, 132, 4], [103, 138, 4], [144, 148, 2], [166, 104, 1], [156, 152, 1], [179, 179, 4], [1031, 132, 6], [145, 145, 5], [189, 189, 3], [1039, 152, 6], [1036, 132, 4], [1031, 148, 6], [1034, 151, 2], [1034, 150, 2], [1026, 103, 5], [163, 170, 1], [1031, 144, 6], [138, 1024, 2], [1031, 136, 6], [156, 104, 1], [181, 181, 3], [103, 177, 2], [158, 104, 1], [151, 151, 5], [1031, 133, 6], [148, 1024, 2], [136, 1024, 2], [103, 133, 4], [176, 132, 2], [168, 168, 2], [1031, 149, 6], [1031, 146, 6], [1037, 172, 5], [1038, 163, 2], [1033, 104, 4], [136, 136, 6], [170, 170, 4], [1036, 133, 4], [1031, 147, 6], [1037, 165, 5], [1037, 173, 5], [138, 138, 6], [166, 158, 1], [1039, 156, 6], [1036, 147, 4], [240, 240, 2], [149, 1024, 2], [103, 146, 4], [1037, 180, 5], [163, 1025, 1], [1031, 138, 6], [150, 150, 5], [1036, 146, 4], [1044, 152, 7], [189, 133, 2], [132, 146, 2], [1036, 145, 4], [163, 152, 3], [1037, 181, 5], [217, 217, 2], [156, 156, 2], [1036, 144, 4], [146, 132, 2], [147, 133, 2], [157, 157, 2], [1026, 132, 3], [158, 173, 2], [145, 149, 2], [242, 242, 2], [251, 251, 2], [1039, 163, 6], [219, 219, 2], [103, 147, 4], [236, 236, 2], [1026, 136, 3], [1038, 168, 2], [132, 149, 2], [151, 151, 2], [1039, 158, 6], [132, 147, 2], [148, 133, 2], [1026, 138, 3], [1039, 168, 6], [1037, 166, 5], [170, 104, 1], [176, 145, 2], [1031, 145, 6], [146, 136, 2], [132, 136, 2], [1039, 170, 6], [180, 168, 2], [146, 133, 2], [165, 165, 4], [246, 246, 2], [132, 138, 2], [1044, 156, 7], [147, 144, 2], [158, 158, 2], [104, 168, 2], [1026, 148, 3], [1038, 170, 2], [1026, 149, 3], [147, 138, 2], [1029, 1024, 3], [247, 247, 2], [163, 163, 5], [1026, 150, 3], [223, 223, 2], [166, 166, 4], [1035, 147, 4], [136, 146, 2], [1038, 152, 2], [132, 148, 2], [165, 156, 1], [168, 104, 1], [1036, 136, 4], [1026, 145, 3], [1031, 151, 6], [136, 133, 2], [222, 222, 3], [1035, 132, 4], [1036, 138, 4], [170, 152, 1], [181, 181, 4], [173, 173, 3], [145, 1024, 2], [1029, 103, 3], [1026, 1057, 1], [1038, 156, 2], [150, 150, 2], [180, 104, 1], [1029, 176, 6], [216, 216, 2], [1026, 146, 3], [146, 144, 2], [138, 177, 2], [149, 149, 7], [103, 103, 3], [1031, 150, 6], [1044, 163, 7], [1044, 158, 7], [1026, 151, 3], [138, 147, 2], [172, 104, 1], [138, 133, 2], [1026, 147, 3], [1044, 168, 7], [136, 179, 2], [170, 163, 1], [144, 146, 2], [1024, 189, 4], [1039, 172, 6], [144, 147, 2], [214, 214, 2], [1039, 180, 6], [215, 215, 2], [1038, 158, 2], [349, 349, 2], [339, 339, 2], [149, 145, 2], [133, 148, 2], [151, 1024, 2], [176, 176, 4], [166, 1025, 1], [133, 146, 2], [1026, 1049, 1], [220, 220, 3], [150, 1024, 2], [228, 228, 2], [1039, 181, 6], [165, 1025, 1], [1039, 173, 6], [147, 132, 2], [133, 136, 2], [138, 132, 2], [149, 132, 2], [1033, 163, 1], [164, 164, 2], [1044, 170, 7], [148, 136, 2], [181, 104, 1], [133, 147, 2], [103, 215, 2], [1035, 147, 2], [152, 156, 1], [103, 226, 2], [1038, 165, 2], [313, 313, 2], [133, 138, 2], [1044, 173, 7], [103, 224, 2], [1036, 148, 4], [144, 138, 2], [1038, 166, 2], [144, 136, 2], [103, 214, 2], [1035, 146, 2], [152, 158, 1], [361, 361, 2], [173, 104, 1], [1044, 172, 7], [177, 177, 5], [133, 189, 2], [103, 217, 2], [103, 219, 2], [231, 231, 2], [152, 165, 1], [1039, 165, 6], [162, 162, 2], [136, 132, 2], [179, 179, 5], [1044, 180, 7], [145, 176, 2], [1026, 1060, 1], [314, 314, 2], [152, 166, 1], [148, 132, 2], [103, 223, 2], [138, 144, 2], [1033, 156, 1], [230, 230, 2], [168, 158, 1], [104, 163, 2], [1035, 146, 4], [136, 144, 2], [1044, 181, 7], [168, 165, 1], [152, 1025, 1], [168, 156, 1], [168, 166, 1], [1036, 149, 4], [1057, 1026, 1], [136, 148, 2], [1047, 152, 1], [1039, 166, 6], [138, 151, 3], [180, 180, 3], [224, 224, 2], [113, 113, 2], [1068, 144, 6], [103, 228, 2], [1035, 132, 2], [104, 245, 1], [156, 165, 1], [156, 1025, 1], [235, 235, 2], [170, 1025, 1], [1053, 133, 7], [1033, 158, 1], [145, 146, 2], [1038, 172, 2], [1044, 165, 7], [1033, 170, 1], [328, 328, 2], [233, 233, 3], [217, 217, 3], [149, 138, 2], [158, 166, 1], [1036, 150, 4], [1024, 1026, 1], [181, 181, 5], [221, 221, 2], [149, 133, 2], [242, 242, 3], [103, 230, 2], [147, 136, 2], [1053, 144, 7], [146, 148, 2], [234, 234, 2], [146, 145, 2], [1047, 163, 1], [1038, 173, 2], [151, 151, 6], [146, 138, 2], [1053, 145, 7], [1049, 1026, 1], [367, 367, 2], [1026, 1046, 1], [366, 366, 2], [226, 226, 2], [172, 172, 3], [1033, 166, 1], [1033, 165, 1], [382, 382, 2], [144, 144, 5], [1033, 168, 1], [1044, 166, 7], [165, 163, 1], [1026, 1048, 1], [117, 117, 2], [104, 166, 2], [219, 219, 3], [158, 1025, 1], [136, 150, 3], [147, 148, 2], [246, 246, 3], [114, 114, 2], [103, 235, 2], [154, 154, 2], [138, 148, 2], [1047, 170, 1], [259, 259, 2], [243, 243, 2], [1053, 132, 7], [239, 239, 2], [145, 136, 2], [1024, 179, 4], [244, 244, 2], [1035, 145, 4], [1036, 151, 4], [1024, 177, 4], [159, 159, 2], [236, 236, 3], [150, 146, 2], [104, 156, 2], [149, 136, 2], [148, 146, 2], [1026, 1064, 1], [1026, 1055, 1], [144, 1029, 2], [170, 156, 1], [240, 240, 3], [148, 147, 2], [104, 158, 2], [1068, 133, 6], [260, 260, 2], [1038, 181, 2], [148, 138, 2], [163, 165, 1], [241, 241, 3], [151, 147, 2], [1031, 189, 2], [214, 214, 3], [1053, 147, 7], [1038, 180, 2], [138, 149, 2], [103, 233, 2], [104, 165, 2], [1026, 1063, 1], [144, 189, 2], [146, 132, 1], [1035, 133, 2], [1026, 1065, 1], [150, 133, 2], [145, 147, 2], [136, 147, 2], [1026, 1071, 1], [166, 163, 1], [1031, 176, 2], [1026, 1041, 1], [155, 155, 2], [1035, 145, 2], [103, 222, 2], [133, 1029, 2], [138, 146, 2], [103, 220, 2], [1062, 132, 4], [168, 1025, 1], [215, 215, 3], [152, 170, 1], [1033, 173, 1], [149, 147, 2], [1035, 136, 2], [231, 231, 3], [163, 166, 1], [149, 146, 2], [172, 1025, 1], [103, 248, 2], [176, 145, 3], [1046, 133, 4], [220, 132, 2], [1047, 156, 1], [1029, 189, 6], [1046, 1026, 1], [151, 144, 2], [179, 150, 3], [1068, 145, 6], [138, 177, 3], [173, 1025, 1], [223, 223, 3], [1032, 245, 3], [237, 237, 2], [110, 110, 2], [156, 170, 1], [151, 132, 2], [1053, 146, 7], [1053, 136, 7], [1053, 138, 7], [1035, 133, 4], [104, 172, 2], [1041, 1026, 1], [151, 148, 2], [103, 148, 4], [173, 165, 1], [146, 150, 2], [232, 232, 2], [133, 222, 2], [153, 153, 2], [1047, 158, 1], [1035, 148, 2], [147, 1029, 2], [103, 243, 2], [1033, 172, 1], [245, 245, 3], [103, 244, 2], [166, 172, 1], [180, 180, 4], [1035, 144, 2], [132, 1029, 2], [149, 144, 2], [249, 249, 3], [224, 224, 3], [147, 145, 2], [104, 170, 2], [233, 233, 2], [146, 1029, 2], [1026, 1073, 1], [165, 173, 1], [136, 179, 3], [181, 181, 6], [362, 362, 2], [151, 177, 3], [150, 144, 2], [150, 132, 2], [158, 163, 1], [104, 173, 2], [103, 231, 2], [147, 149, 2], [1047, 165, 1], [1072, 163, 2], [176, 275, 2], [1024, 223, 4], [1035, 136, 4], [1053, 149, 7], [1072, 152, 2], [150, 148, 2], [151, 133, 2], [103, 250, 2], [145, 138, 2], [103, 252, 2], [1026, 1049, 3], [168, 180, 2], [133, 1067, 2], [226, 226, 3], [1035, 138, 4], [1068, 132, 6], [150, 179, 2], [1047, 166, 1], [1026, 1057, 3], [172, 166, 1], [163, 158, 1], [1035, 149, 2], [228, 228, 3], [1024, 214, 4], [1050, 132, 4], [156, 163, 1], [103, 241, 2], [268, 268, 2], [103, 249, 2], [148, 1029, 2], [170, 168, 1], [1024, 215, 4], [265, 265, 2], [146, 149, 2], [189, 189, 4], [177, 151, 2], [1048, 1026, 1], [147, 151, 2], [1042, 145, 4], [177, 138, 3], [103, 254, 2], [1026, 1060, 3], [136, 149, 2], [133, 149, 2], [1083, 146, 4], [1026, 1080, 1], [163, 156, 1], [1042, 132, 4], [180, 1025, 1], [1041, 144, 4], [1055, 1026, 1], [136, 1029, 2], [1068, 149, 6], [1035, 144, 4], [136, 145, 2], [1035, 138, 2], [1047, 173, 1], [138, 145, 2], [230, 230, 3], [181, 1025, 1], [1040, 170, 2], [1047, 168, 1], [1064, 1026, 1], [132, 151, 2], [179, 150, 2], [241, 241, 2], [275, 275, 2], [158, 158, 5], [1033, 180, 1], [1026, 1048, 3], [1026, 1082, 1], [1047, 172, 1], [1068, 147, 6], [132, 1031, 2], [1060, 1026, 1], [103, 236, 2], [138, 1029, 2], [1056, 151, 2], [148, 144, 1], [1024, 219, 4], [1035, 149, 4], [1072, 156, 2], [172, 163, 1], [215, 132, 2], [179, 136, 3], [223, 132, 2], [1024, 217, 4], [103, 255, 2], [150, 147, 2], [103, 240, 2], [103, 257, 2], [220, 220, 4], [1063, 1026, 1], [1085, 147, 4], [1035, 148, 4], [1024, 224, 4], [1031, 177, 2], [151, 177, 2], [152, 104, 2], [1065, 1026, 1], [1071, 1026, 1], [166, 166, 5], [1024, 228, 4], [103, 258, 2], [214, 132, 2], [173, 163, 1], [222, 222, 4], [1024, 226, 4], [145, 148, 2], [1025, 245, 2], [133, 147, 1], [1074, 152, 3], [1031, 179, 2], [165, 165, 5], [1072, 170, 2], [235, 235, 3], [1074, 163, 3], [1091, 138, 2], [1068, 146, 6], [147, 133, 1], [217, 217, 4], [104, 181, 2], [170, 158, 1], [150, 179, 3], [1074, 170, 3], [104, 180, 2], [1026, 1042, 1], [248, 248, 2], [103, 261, 2], [242, 242, 4], [133, 1041, 2], [219, 147, 2], [1026, 1043, 1], [132, 150, 2], [1089, 136, 2], [1026, 1041, 5], [189, 144, 2], [1072, 158, 2], [1068, 136, 6], [163, 172, 1], [167, 167, 2], [1040, 170, 4], [1034, 189, 2], [1033, 181, 1], [1024, 230, 4], [163, 1032, 1], [149, 1029, 2], [146, 136, 1], [177, 151, 3], [1026, 1045, 1], [148, 148, 7], [228, 132, 2], [1068, 138, 6], [1074, 168, 3], [146, 133, 1], [181, 168, 1], [219, 138, 2], [215, 136, 2], [243, 243, 3], [214, 138, 2], [1026, 1051, 1], [145, 1031, 2], [150, 149, 2], [173, 152, 1], [133, 146, 1], [246, 246, 4], [1024, 248, 4], [1026, 1063, 3], [105, 105, 2], [136, 146, 1], [144, 148, 1], [103, 262, 2], [172, 152, 1], [1073, 1026, 1], [176, 176, 5], [1042, 1026, 1], [1026, 1055, 3], [1186, 163, 1], [147, 150, 2], [168, 170, 1], [1026, 1046, 3], [1026, 1046, 5], [1024, 222, 4], [259, 259, 3], [1026, 1052, 1], [1024, 235, 4], [249, 249, 2], [172, 170, 1], [149, 150, 2], [132, 144, 2], [163, 173, 1], [1053, 148, 7], [1072, 168, 2], [145, 150, 2], [156, 104, 2], [1040, 152, 1], [179, 103, 2], [147, 1031, 2], [244, 244, 3], [1043, 150, 4], [151, 1029, 2], [177, 103, 2], [176, 103, 2], [158, 170, 1], [132, 1042, 2], [1040, 152, 4], [231, 138, 2], [165, 170, 1], [1051, 1026, 1], [145, 1029, 2], [1068, 148, 6], [163, 1077, 1], [1024, 220, 4], [181, 158, 1], [144, 133, 3], [1034, 1026, 1], [228, 147, 2], [151, 146, 2], [166, 170, 1], [250, 250, 3], [245, 245, 2], [189, 103, 2], [149, 1031, 2], [1026, 1042, 5], [173, 170, 1], [296, 296, 2], [136, 133, 1], [166, 104, 2], [1043, 1026, 1], [260, 260, 3], [1110, 177, 4], [146, 151, 2], [1056, 138, 5], [1040, 163, 2], [1026, 1034, 1], [146, 1031, 2], [1052, 1026, 1], [1026, 1064, 3], [115, 115, 2], [236, 132, 2], [1053, 150, 7], [1032, 1025, 4], [145, 176, 3], [133, 136, 1], [224, 138, 2], [1068, 150, 6], [1026, 1050, 1], [447, 447, 2], [1072, 173, 2], [1026, 1058, 1], [1026, 1071, 3], [144, 1031, 2], [223, 146, 2], [168, 104, 2], [1045, 1026, 1], [1035, 150, 2], [1024, 233, 4], [133, 150, 2], [181, 152, 1], [1053, 151, 7], [1026, 1050, 5], [165, 104, 2], [217, 146, 2], [1074, 156, 3], [217, 136, 2], [1025, 152, 3], [157, 157, 3], [1035, 150, 4], [1072, 172, 2], [138, 147, 1], [1047, 180, 1]]} \ No newline at end of file +{ + "spatial_merges": [ + [ + 4, + 13 + ], + [ + 22, + 84 + ], + [ + 38, + 61 + ], + [ + 98, + 99 + ], + [ + 100, + 101 + ], + [ + 96, + 102 + ], + [ + 97, + 102 + ], + [ + 96, + 100 + ], + [ + 61, + 96 + ], + [ + 38, + 96 + ], + [ + 22, + 98 + ], + [ + 84, + 98 + ], + [ + 97, + 100 + ], + [ + 13, + 99 + ], + [ + 4, + 99 + ], + [ + 62, + 107 + ], + [ + 37, + 106 + ], + [ + 39, + 106 + ], + [ + 97, + 101 + ], + [ + 60, + 107 + ], + [ + 83, + 108 + ], + [ + 85, + 108 + ], + [ + 21, + 109 + ], + [ + 5, + 111 + ], + [ + 23, + 109 + ], + [ + 3, + 111 + ], + [ + 14, + 112 + ], + [ + 12, + 112 + ], + [ + 61, + 97 + ], + [ + 62, + 96 + ], + [ + 38, + 60 + ], + [ + 61, + 116 + ], + [ + 3, + 13 + ], + [ + 5, + 13 + ], + [ + 101, + 113 + ], + [ + 101, + 117 + ], + [ + 60, + 96 + ], + [ + 22, + 83 + ], + [ + 101, + 114 + ], + [ + 22, + 85 + ], + [ + 101, + 115 + ], + [ + 23, + 84 + ], + [ + 4, + 14 + ], + [ + 4, + 12 + ], + [ + 21, + 84 + ], + [ + 38, + 62 + ], + [ + 105, + 120 + ], + [ + 105, + 122 + ], + [ + 105, + 118 + ], + [ + 105, + 119 + ], + [ + 105, + 121 + ], + [ + 105, + 123 + ], + [ + 105, + 125 + ], + [ + 105, + 124 + ], + [ + 116, + 128 + ], + [ + 37, + 126 + ], + [ + 97, + 128 + ], + [ + 39, + 126 + ], + [ + 37, + 129 + ], + [ + 37, + 127 + ], + [ + 39, + 129 + ], + [ + 39, + 127 + ], + [ + 23, + 98 + ], + [ + 21, + 98 + ], + [ + 39, + 134 + ], + [ + 110, + 120 + ], + [ + 37, + 134 + ], + [ + 110, + 119 + ], + [ + 110, + 118 + ], + [ + 97, + 143 + ], + [ + 116, + 143 + ], + [ + 3, + 99 + ], + [ + 110, + 121 + ], + [ + 5, + 99 + ], + [ + 110, + 125 + ], + [ + 110, + 124 + ], + [ + 60, + 97 + ], + [ + 105, + 130 + ], + [ + 113, + 122 + ], + [ + 115, + 124 + ], + [ + 105, + 131 + ], + [ + 114, + 125 + ], + [ + 110, + 122 + ], + [ + 110, + 123 + ], + [ + 105, + 140 + ], + [ + 83, + 160 + ], + [ + 135, + 141 + ], + [ + 62, + 97 + ], + [ + 85, + 160 + ], + [ + 85, + 161 + ], + [ + 83, + 161 + ], + [ + 117, + 120 + ], + [ + 23, + 85 + ], + [ + 14, + 169 + ], + [ + 12, + 171 + ], + [ + 12, + 169 + ], + [ + 23, + 83 + ], + [ + 137, + 141 + ], + [ + 14, + 171 + ], + [ + 137, + 140 + ], + [ + 21, + 85 + ], + [ + 3, + 12 + ], + [ + 3, + 14 + ], + [ + 139, + 141 + ], + [ + 21, + 83 + ], + [ + 130, + 139 + ], + [ + 131, + 142 + ], + [ + 5, + 12 + ], + [ + 130, + 142 + ], + [ + 131, + 139 + ], + [ + 141, + 142 + ], + [ + 131, + 135 + ], + [ + 5, + 14 + ], + [ + 131, + 137 + ], + [ + 130, + 137 + ], + [ + 135, + 140 + ], + [ + 101, + 159 + ], + [ + 101, + 157 + ], + [ + 37, + 174 + ], + [ + 114, + 118 + ], + [ + 130, + 135 + ], + [ + 115, + 119 + ], + [ + 113, + 123 + ], + [ + 39, + 174 + ], + [ + 117, + 121 + ], + [ + 113, + 118 + ], + [ + 101, + 162 + ], + [ + 60, + 116 + ], + [ + 101, + 164 + ], + [ + 139, + 140 + ], + [ + 113, + 119 + ], + [ + 140, + 142 + ], + [ + 117, + 119 + ], + [ + 115, + 123 + ], + [ + 39, + 185 + ], + [ + 114, + 121 + ], + [ + 40, + 106 + ], + [ + 117, + 118 + ], + [ + 113, + 121 + ], + [ + 37, + 185 + ], + [ + 62, + 116 + ], + [ + 36, + 106 + ], + [ + 117, + 123 + ], + [ + 114, + 123 + ], + [ + 125, + 153 + ], + [ + 115, + 118 + ], + [ + 114, + 119 + ], + [ + 120, + 154 + ], + [ + 124, + 155 + ], + [ + 63, + 107 + ], + [ + 139, + 175 + ], + [ + 115, + 121 + ], + [ + 142, + 178 + ], + [ + 59, + 107 + ], + [ + 114, + 122 + ], + [ + 63, + 96 + ], + [ + 115, + 122 + ], + [ + 115, + 120 + ], + [ + 59, + 96 + ], + [ + 105, + 183 + ], + [ + 114, + 120 + ], + [ + 119, + 155 + ], + [ + 118, + 153 + ], + [ + 105, + 186 + ], + [ + 105, + 187 + ], + [ + 105, + 188 + ], + [ + 113, + 124 + ], + [ + 122, + 167 + ], + [ + 105, + 184 + ], + [ + 113, + 125 + ], + [ + 119, + 154 + ], + [ + 137, + 182 + ], + [ + 37, + 225 + ], + [ + 39, + 225 + ], + [ + 118, + 154 + ], + [ + 139, + 178 + ], + [ + 117, + 125 + ], + [ + 113, + 203 + ], + [ + 135, + 178 + ], + [ + 117, + 124 + ], + [ + 142, + 175 + ], + [ + 135, + 182 + ], + [ + 105, + 193 + ], + [ + 137, + 175 + ], + [ + 137, + 178 + ], + [ + 39, + 238 + ], + [ + 105, + 191 + ], + [ + 135, + 175 + ], + [ + 105, + 196 + ], + [ + 118, + 167 + ], + [ + 105, + 195 + ], + [ + 105, + 201 + ], + [ + 82, + 108 + ], + [ + 105, + 192 + ], + [ + 119, + 167 + ], + [ + 37, + 238 + ], + [ + 86, + 108 + ], + [ + 139, + 182 + ], + [ + 113, + 183 + ], + [ + 119, + 153 + ], + [ + 118, + 155 + ], + [ + 121, + 154 + ], + [ + 142, + 182 + ], + [ + 121, + 153 + ], + [ + 113, + 186 + ], + [ + 114, + 184 + ], + [ + 115, + 197 + ], + [ + 124, + 159 + ], + [ + 117, + 122 + ], + [ + 122, + 157 + ], + [ + 115, + 191 + ], + [ + 105, + 208 + ], + [ + 59, + 97 + ], + [ + 125, + 157 + ], + [ + 139, + 199 + ], + [ + 40, + 127 + ], + [ + 36, + 127 + ], + [ + 122, + 159 + ], + [ + 22, + 82 + ], + [ + 141, + 194 + ], + [ + 120, + 155 + ], + [ + 110, + 187 + ], + [ + 114, + 193 + ], + [ + 120, + 153 + ], + [ + 110, + 188 + ], + [ + 22, + 86 + ], + [ + 110, + 204 + ], + [ + 114, + 192 + ], + [ + 110, + 184 + ], + [ + 121, + 155 + ], + [ + 40, + 134 + ], + [ + 123, + 155 + ], + [ + 110, + 197 + ], + [ + 124, + 162 + ], + [ + 141, + 202 + ], + [ + 117, + 204 + ], + [ + 115, + 213 + ], + [ + 115, + 196 + ], + [ + 130, + 198 + ], + [ + 139, + 200 + ], + [ + 125, + 164 + ], + [ + 37, + 253 + ], + [ + 137, + 200 + ], + [ + 135, + 205 + ], + [ + 131, + 194 + ], + [ + 137, + 199 + ], + [ + 113, + 120 + ], + [ + 4, + 15 + ], + [ + 121, + 167 + ], + [ + 114, + 195 + ], + [ + 117, + 206 + ], + [ + 37, + 256 + ], + [ + 135, + 199 + ], + [ + 120, + 162 + ], + [ + 140, + 198 + ], + [ + 123, + 167 + ], + [ + 113, + 190 + ], + [ + 117, + 187 + ], + [ + 130, + 202 + ], + [ + 135, + 210 + ], + [ + 113, + 207 + ], + [ + 117, + 188 + ], + [ + 137, + 210 + ], + [ + 36, + 126 + ], + [ + 36, + 134 + ], + [ + 110, + 209 + ], + [ + 142, + 205 + ], + [ + 135, + 200 + ], + [ + 40, + 126 + ], + [ + 39, + 253 + ], + [ + 110, + 211 + ], + [ + 114, + 201 + ], + [ + 142, + 200 + ], + [ + 124, + 154 + ], + [ + 125, + 154 + ], + [ + 120, + 164 + ], + [ + 139, + 205 + ], + [ + 118, + 157 + ], + [ + 123, + 154 + ], + [ + 115, + 227 + ], + [ + 123, + 153 + ], + [ + 119, + 159 + ], + [ + 2, + 13 + ], + [ + 130, + 194 + ], + [ + 39, + 256 + ], + [ + 137, + 205 + ], + [ + 142, + 210 + ], + [ + 131, + 202 + ], + [ + 119, + 162 + ], + [ + 140, + 190 + ], + [ + 6, + 13 + ], + [ + 122, + 153 + ], + [ + 131, + 198 + ], + [ + 4, + 11 + ], + [ + 122, + 155 + ], + [ + 118, + 164 + ], + [ + 63, + 97 + ], + [ + 131, + 190 + ], + [ + 123, + 157 + ], + [ + 110, + 183 + ], + [ + 110, + 208 + ], + [ + 123, + 159 + ], + [ + 110, + 192 + ], + [ + 141, + 190 + ], + [ + 123, + 162 + ], + [ + 142, + 199 + ], + [ + 24, + 84 + ], + [ + 121, + 157 + ], + [ + 115, + 229 + ], + [ + 110, + 229 + ], + [ + 110, + 186 + ], + [ + 121, + 164 + ], + [ + 125, + 167 + ], + [ + 113, + 201 + ], + [ + 140, + 194 + ], + [ + 124, + 167 + ], + [ + 118, + 159 + ], + [ + 139, + 210 + ], + [ + 110, + 196 + ], + [ + 113, + 227 + ], + [ + 110, + 218 + ], + [ + 15, + 112 + ], + [ + 110, + 195 + ], + [ + 123, + 164 + ], + [ + 110, + 206 + ], + [ + 110, + 212 + ], + [ + 119, + 157 + ], + [ + 110, + 213 + ], + [ + 141, + 198 + ], + [ + 11, + 112 + ], + [ + 130, + 190 + ], + [ + 119, + 164 + ], + [ + 121, + 159 + ], + [ + 118, + 162 + ], + [ + 121, + 162 + ], + [ + 110, + 203 + ], + [ + 114, + 208 + ], + [ + 155, + 197 + ], + [ + 110, + 193 + ], + [ + 153, + 184 + ], + [ + 2, + 12 + ], + [ + 20, + 84 + ], + [ + 140, + 202 + ], + [ + 110, + 207 + ], + [ + 157, + 201 + ], + [ + 110, + 191 + ], + [ + 120, + 167 + ], + [ + 159, + 227 + ], + [ + 117, + 207 + ], + [ + 38, + 310 + ], + [ + 124, + 234 + ], + [ + 24, + 85 + ], + [ + 114, + 209 + ], + [ + 114, + 124 + ], + [ + 114, + 183 + ], + [ + 113, + 212 + ], + [ + 117, + 212 + ], + [ + 115, + 212 + ], + [ + 115, + 125 + ], + [ + 110, + 201 + ], + [ + 125, + 239 + ], + [ + 2, + 111 + ], + [ + 110, + 227 + ], + [ + 113, + 218 + ], + [ + 115, + 186 + ], + [ + 113, + 209 + ], + [ + 119, + 221 + ], + [ + 114, + 218 + ], + [ + 122, + 154 + ], + [ + 117, + 229 + ], + [ + 117, + 211 + ], + [ + 115, + 211 + ], + [ + 117, + 209 + ], + [ + 117, + 208 + ], + [ + 6, + 111 + ], + [ + 115, + 187 + ], + [ + 114, + 207 + ], + [ + 117, + 218 + ], + [ + 114, + 188 + ], + [ + 101, + 234 + ], + [ + 125, + 216 + ], + [ + 154, + 187 + ], + [ + 101, + 239 + ], + [ + 118, + 216 + ], + [ + 114, + 203 + ], + [ + 113, + 211 + ], + [ + 23, + 86 + ], + [ + 115, + 203 + ], + [ + 118, + 237 + ], + [ + 120, + 221 + ], + [ + 120, + 216 + ], + [ + 24, + 83 + ], + [ + 124, + 221 + ], + [ + 36, + 174 + ], + [ + 154, + 188 + ], + [ + 119, + 232 + ], + [ + 115, + 206 + ], + [ + 115, + 204 + ], + [ + 20, + 85 + ], + [ + 162, + 229 + ], + [ + 157, + 183 + ], + [ + 114, + 204 + ], + [ + 86, + 160 + ], + [ + 153, + 192 + ], + [ + 124, + 232 + ], + [ + 24, + 109 + ], + [ + 38, + 394 + ], + [ + 159, + 186 + ], + [ + 115, + 218 + ], + [ + 40, + 174 + ], + [ + 122, + 247 + ], + [ + 114, + 211 + ], + [ + 113, + 193 + ], + [ + 113, + 213 + ], + [ + 125, + 237 + ], + [ + 141, + 316 + ], + [ + 114, + 212 + ], + [ + 113, + 184 + ], + [ + 115, + 183 + ], + [ + 115, + 209 + ], + [ + 6, + 12 + ], + [ + 114, + 186 + ], + [ + 155, + 191 + ], + [ + 82, + 160 + ], + [ + 115, + 207 + ], + [ + 154, + 204 + ], + [ + 113, + 197 + ], + [ + 117, + 197 + ], + [ + 3, + 15 + ], + [ + 115, + 188 + ], + [ + 40, + 185 + ], + [ + 114, + 206 + ], + [ + 153, + 195 + ], + [ + 23, + 82 + ], + [ + 20, + 83 + ], + [ + 167, + 183 + ], + [ + 117, + 184 + ], + [ + 119, + 216 + ], + [ + 113, + 191 + ], + [ + 157, + 203 + ], + [ + 114, + 187 + ], + [ + 120, + 251 + ], + [ + 175, + 190 + ], + [ + 105, + 290 + ], + [ + 155, + 213 + ], + [ + 3, + 11 + ], + [ + 117, + 195 + ], + [ + 157, + 193 + ], + [ + 159, + 203 + ], + [ + 113, + 195 + ], + [ + 105, + 294 + ], + [ + 122, + 232 + ], + [ + 198, + 200 + ], + [ + 167, + 186 + ], + [ + 155, + 229 + ], + [ + 118, + 221 + ], + [ + 105, + 312 + ], + [ + 130, + 354 + ], + [ + 113, + 196 + ], + [ + 155, + 196 + ], + [ + 117, + 193 + ], + [ + 164, + 208 + ], + [ + 153, + 193 + ], + [ + 37, + 310 + ], + [ + 117, + 213 + ], + [ + 162, + 191 + ], + [ + 175, + 194 + ], + [ + 162, + 206 + ], + [ + 117, + 192 + ], + [ + 154, + 206 + ], + [ + 117, + 191 + ], + [ + 153, + 208 + ], + [ + 21, + 86 + ], + [ + 140, + 323 + ], + [ + 157, + 184 + ], + [ + 118, + 232 + ], + [ + 157, + 207 + ], + [ + 36, + 185 + ], + [ + 21, + 82 + ], + [ + 190, + 199 + ], + [ + 159, + 191 + ], + [ + 178, + 202 + ], + [ + 178, + 198 + ], + [ + 115, + 419 + ], + [ + 135, + 345 + ], + [ + 162, + 187 + ], + [ + 113, + 192 + ], + [ + 101, + 247 + ], + [ + 122, + 237 + ], + [ + 39, + 310 + ], + [ + 202, + 205 + ], + [ + 110, + 290 + ], + [ + 37, + 96 + ], + [ + 159, + 197 + ], + [ + 101, + 251 + ], + [ + 119, + 237 + ], + [ + 194, + 205 + ], + [ + 124, + 153 + ], + [ + 121, + 216 + ], + [ + 125, + 155 + ], + [ + 110, + 294 + ], + [ + 157, + 192 + ], + [ + 5, + 15 + ], + [ + 105, + 337 + ], + [ + 105, + 317 + ], + [ + 159, + 213 + ], + [ + 113, + 381 + ], + [ + 41, + 106 + ], + [ + 122, + 164 + ], + [ + 164, + 206 + ], + [ + 162, + 197 + ], + [ + 194, + 199 + ], + [ + 182, + 190 + ], + [ + 2, + 14 + ], + [ + 117, + 196 + ], + [ + 137, + 391 + ], + [ + 182, + 198 + ], + [ + 164, + 193 + ], + [ + 82, + 161 + ], + [ + 114, + 427 + ], + [ + 164, + 188 + ], + [ + 155, + 187 + ], + [ + 164, + 192 + ], + [ + 35, + 106 + ], + [ + 199, + 202 + ], + [ + 190, + 200 + ], + [ + 159, + 196 + ], + [ + 154, + 208 + ], + [ + 164, + 184 + ], + [ + 113, + 312 + ], + [ + 105, + 332 + ], + [ + 153, + 209 + ], + [ + 167, + 203 + ], + [ + 178, + 194 + ], + [ + 159, + 183 + ], + [ + 105, + 384 + ], + [ + 153, + 201 + ], + [ + 113, + 206 + ], + [ + 154, + 229 + ], + [ + 153, + 188 + ], + [ + 164, + 195 + ], + [ + 157, + 195 + ], + [ + 130, + 404 + ], + [ + 157, + 186 + ], + [ + 39, + 96 + ], + [ + 159, + 207 + ], + [ + 105, + 357 + ], + [ + 155, + 227 + ], + [ + 182, + 194 + ], + [ + 194, + 200 + ], + [ + 198, + 210 + ], + [ + 64, + 107 + ], + [ + 155, + 212 + ], + [ + 86, + 161 + ], + [ + 162, + 213 + ], + [ + 105, + 343 + ], + [ + 117, + 183 + ], + [ + 157, + 209 + ], + [ + 121, + 221 + ], + [ + 162, + 212 + ], + [ + 154, + 209 + ], + [ + 175, + 198 + ], + [ + 167, + 207 + ], + [ + 113, + 342 + ], + [ + 5, + 11 + ], + [ + 20, + 109 + ], + [ + 140, + 316 + ], + [ + 123, + 232 + ], + [ + 154, + 211 + ], + [ + 117, + 186 + ], + [ + 155, + 211 + ], + [ + 114, + 317 + ], + [ + 113, + 204 + ], + [ + 122, + 162 + ], + [ + 117, + 336 + ], + [ + 141, + 323 + ], + [ + 131, + 354 + ], + [ + 115, + 340 + ], + [ + 105, + 364 + ], + [ + 121, + 237 + ], + [ + 162, + 204 + ], + [ + 36, + 253 + ], + [ + 37, + 394 + ], + [ + 58, + 107 + ], + [ + 190, + 210 + ], + [ + 105, + 350 + ], + [ + 6, + 14 + ], + [ + 123, + 221 + ], + [ + 105, + 360 + ], + [ + 175, + 202 + ], + [ + 114, + 350 + ], + [ + 105, + 401 + ], + [ + 105, + 365 + ], + [ + 178, + 190 + ], + [ + 11, + 169 + ], + [ + 157, + 312 + ], + [ + 115, + 387 + ], + [ + 105, + 341 + ], + [ + 117, + 356 + ], + [ + 164, + 204 + ], + [ + 114, + 374 + ], + [ + 162, + 196 + ], + [ + 105, + 340 + ], + [ + 142, + 380 + ], + [ + 114, + 341 + ], + [ + 40, + 253 + ], + [ + 154, + 197 + ], + [ + 114, + 343 + ], + [ + 99, + 438 + ], + [ + 121, + 232 + ], + [ + 114, + 312 + ], + [ + 113, + 337 + ], + [ + 120, + 159 + ], + [ + 121, + 251 + ], + [ + 130, + 439 + ], + [ + 164, + 218 + ], + [ + 115, + 352 + ], + [ + 115, + 365 + ], + [ + 153, + 218 + ], + [ + 154, + 184 + ], + [ + 130, + 323 + ], + [ + 159, + 211 + ], + [ + 162, + 188 + ], + [ + 155, + 186 + ], + [ + 167, + 218 + ], + [ + 115, + 360 + ], + [ + 113, + 317 + ], + [ + 131, + 316 + ], + [ + 200, + 202 + ], + [ + 113, + 188 + ], + [ + 142, + 388 + ], + [ + 120, + 157 + ], + [ + 191, + 234 + ], + [ + 140, + 354 + ], + [ + 153, + 183 + ], + [ + 139, + 380 + ], + [ + 123, + 237 + ], + [ + 123, + 216 + ], + [ + 119, + 234 + ], + [ + 117, + 390 + ], + [ + 130, + 316 + ], + [ + 113, + 187 + ], + [ + 164, + 187 + ], + [ + 157, + 317 + ], + [ + 194, + 210 + ], + [ + 203, + 247 + ], + [ + 198, + 199 + ], + [ + 40, + 256 + ], + [ + 153, + 204 + ], + [ + 202, + 210 + ], + [ + 118, + 239 + ], + [ + 155, + 206 + ], + [ + 115, + 357 + ], + [ + 115, + 370 + ], + [ + 167, + 184 + ], + [ + 159, + 387 + ], + [ + 139, + 388 + ], + [ + 153, + 211 + ], + [ + 117, + 203 + ], + [ + 153, + 187 + ], + [ + 105, + 383 + ], + [ + 206, + 251 + ], + [ + 117, + 385 + ], + [ + 167, + 212 + ], + [ + 113, + 412 + ], + [ + 124, + 366 + ], + [ + 115, + 337 + ], + [ + 155, + 188 + ], + [ + 157, + 342 + ], + [ + 41, + 127 + ], + [ + 198, + 205 + ], + [ + 15, + 169 + ], + [ + 36, + 256 + ], + [ + 154, + 212 + ], + [ + 167, + 201 + ], + [ + 167, + 197 + ], + [ + 114, + 332 + ], + [ + 182, + 202 + ], + [ + 131, + 323 + ], + [ + 193, + 239 + ], + [ + 115, + 415 + ], + [ + 11, + 171 + ], + [ + 105, + 374 + ], + [ + 157, + 212 + ], + [ + 164, + 207 + ], + [ + 15, + 171 + ], + [ + 115, + 412 + ], + [ + 38, + 116 + ], + [ + 35, + 126 + ], + [ + 221, + 229 + ], + [ + 98, + 449 + ], + [ + 159, + 337 + ], + [ + 164, + 209 + ], + [ + 167, + 227 + ], + [ + 155, + 209 + ], + [ + 141, + 354 + ], + [ + 208, + 216 + ], + [ + 114, + 213 + ], + [ + 162, + 352 + ], + [ + 167, + 209 + ], + [ + 159, + 218 + ], + [ + 114, + 383 + ], + [ + 39, + 394 + ], + [ + 58, + 97 + ], + [ + 167, + 211 + ], + [ + 110, + 352 + ], + [ + 162, + 211 + ], + [ + 154, + 195 + ], + [ + 164, + 211 + ], + [ + 105, + 426 + ], + [ + 125, + 361 + ], + [ + 115, + 345 + ], + [ + 155, + 218 + ], + [ + 105, + 370 + ], + [ + 98, + 489 + ], + [ + 113, + 503 + ], + [ + 110, + 332 + ], + [ + 124, + 313 + ], + [ + 159, + 212 + ], + [ + 154, + 213 + ], + [ + 105, + 415 + ], + [ + 197, + 234 + ], + [ + 157, + 218 + ], + [ + 159, + 395 + ], + [ + 41, + 134 + ], + [ + 115, + 195 + ], + [ + 190, + 205 + ], + [ + 139, + 391 + ], + [ + 157, + 374 + ], + [ + 114, + 401 + ], + [ + 154, + 192 + ], + [ + 110, + 385 + ], + [ + 155, + 204 + ], + [ + 162, + 336 + ], + [ + 192, + 239 + ], + [ + 105, + 403 + ], + [ + 114, + 342 + ], + [ + 35, + 127 + ], + [ + 99, + 518 + ], + [ + 184, + 239 + ], + [ + 154, + 218 + ], + [ + 123, + 234 + ], + [ + 114, + 403 + ], + [ + 196, + 234 + ], + [ + 164, + 212 + ], + [ + 162, + 209 + ], + [ + 117, + 352 + ], + [ + 204, + 251 + ], + [ + 117, + 332 + ], + [ + 186, + 247 + ], + [ + 101, + 314 + ], + [ + 123, + 239 + ], + [ + 101, + 313 + ], + [ + 40, + 129 + ], + [ + 159, + 412 + ], + [ + 197, + 221 + ], + [ + 187, + 221 + ], + [ + 139, + 438 + ], + [ + 184, + 216 + ], + [ + 234, + 419 + ], + [ + 213, + 234 + ], + [ + 110, + 390 + ], + [ + 110, + 341 + ], + [ + 125, + 314 + ], + [ + 162, + 370 + ], + [ + 137, + 380 + ], + [ + 227, + 232 + ], + [ + 154, + 196 + ], + [ + 164, + 356 + ], + [ + 115, + 384 + ], + [ + 153, + 206 + ], + [ + 153, + 212 + ], + [ + 197, + 232 + ], + [ + 110, + 364 + ], + [ + 117, + 364 + ], + [ + 167, + 195 + ], + [ + 131, + 439 + ], + [ + 184, + 237 + ], + [ + 188, + 216 + ], + [ + 183, + 247 + ], + [ + 36, + 129 + ], + [ + 110, + 360 + ], + [ + 22, + 81 + ], + [ + 64, + 590 + ], + [ + 110, + 336 + ], + [ + 114, + 196 + ], + [ + 201, + 237 + ], + [ + 114, + 197 + ], + [ + 58, + 590 + ], + [ + 195, + 239 + ], + [ + 115, + 336 + ], + [ + 239, + 427 + ], + [ + 153, + 207 + ], + [ + 155, + 183 + ], + [ + 153, + 186 + ], + [ + 115, + 184 + ], + [ + 35, + 134 + ], + [ + 142, + 345 + ], + [ + 121, + 239 + ], + [ + 124, + 157 + ], + [ + 101, + 328 + ], + [ + 135, + 391 + ], + [ + 115, + 440 + ], + [ + 157, + 401 + ], + [ + 124, + 328 + ], + [ + 167, + 213 + ], + [ + 192, + 216 + ], + [ + 110, + 350 + ], + [ + 125, + 162 + ], + [ + 207, + 247 + ], + [ + 20, + 86 + ], + [ + 114, + 364 + ], + [ + 117, + 343 + ], + [ + 157, + 211 + ], + [ + 162, + 207 + ], + [ + 115, + 395 + ], + [ + 22, + 87 + ], + [ + 113, + 404 + ], + [ + 154, + 207 + ], + [ + 164, + 332 + ], + [ + 113, + 374 + ], + [ + 135, + 388 + ], + [ + 159, + 209 + ], + [ + 117, + 384 + ], + [ + 155, + 203 + ], + [ + 110, + 317 + ], + [ + 114, + 356 + ], + [ + 162, + 218 + ], + [ + 186, + 232 + ], + [ + 121, + 247 + ], + [ + 130, + 449 + ], + [ + 110, + 340 + ], + [ + 40, + 310 + ], + [ + 41, + 126 + ], + [ + 110, + 387 + ], + [ + 114, + 428 + ], + [ + 206, + 221 + ], + [ + 110, + 356 + ], + [ + 58, + 642 + ], + [ + 105, + 500 + ], + [ + 124, + 164 + ], + [ + 167, + 187 + ], + [ + 247, + 404 + ], + [ + 114, + 290 + ], + [ + 101, + 362 + ], + [ + 114, + 426 + ], + [ + 167, + 188 + ], + [ + 115, + 192 + ], + [ + 125, + 159 + ], + [ + 183, + 237 + ], + [ + 167, + 193 + ], + [ + 159, + 415 + ], + [ + 110, + 384 + ], + [ + 105, + 521 + ], + [ + 117, + 370 + ], + [ + 135, + 380 + ], + [ + 155, + 352 + ], + [ + 123, + 247 + ], + [ + 113, + 357 + ], + [ + 64, + 642 + ], + [ + 114, + 390 + ], + [ + 154, + 186 + ], + [ + 115, + 385 + ], + [ + 139, + 345 + ], + [ + 167, + 192 + ], + [ + 113, + 415 + ], + [ + 81, + 108 + ], + [ + 154, + 193 + ], + [ + 154, + 183 + ], + [ + 99, + 611 + ], + [ + 121, + 234 + ], + [ + 125, + 362 + ], + [ + 137, + 543 + ], + [ + 119, + 239 + ], + [ + 115, + 294 + ], + [ + 110, + 357 + ], + [ + 117, + 294 + ], + [ + 153, + 341 + ], + [ + 122, + 216 + ], + [ + 117, + 403 + ], + [ + 115, + 381 + ], + [ + 167, + 191 + ], + [ + 164, + 403 + ], + [ + 137, + 388 + ], + [ + 247, + 503 + ], + [ + 98, + 532 + ], + [ + 117, + 290 + ], + [ + 130, + 532 + ], + [ + 123, + 251 + ], + [ + 120, + 232 + ], + [ + 115, + 582 + ], + [ + 118, + 234 + ], + [ + 98, + 496 + ], + [ + 154, + 191 + ], + [ + 157, + 428 + ], + [ + 155, + 207 + ], + [ + 113, + 294 + ], + [ + 195, + 216 + ], + [ + 87, + 108 + ], + [ + 113, + 290 + ], + [ + 113, + 640 + ], + [ + 115, + 193 + ], + [ + 119, + 251 + ], + [ + 155, + 340 + ], + [ + 114, + 294 + ], + [ + 167, + 196 + ], + [ + 142, + 391 + ], + [ + 198, + 345 + ], + [ + 153, + 290 + ], + [ + 164, + 364 + ], + [ + 115, + 290 + ], + [ + 114, + 191 + ], + [ + 117, + 342 + ], + [ + 117, + 426 + ], + [ + 159, + 381 + ], + [ + 118, + 247 + ], + [ + 153, + 332 + ], + [ + 23, + 87 + ], + [ + 63, + 785 + ], + [ + 117, + 440 + ], + [ + 110, + 383 + ], + [ + 110, + 426 + ], + [ + 113, + 350 + ], + [ + 120, + 237 + ], + [ + 153, + 203 + ], + [ + 117, + 365 + ] + ], + "temporal_merges": [ + [ + 103, + 103, + 2 + ], + [ + 104, + 104, + 1 + ], + [ + 1024, + 1024, + 4 + ], + [ + 1025, + 1025, + 2 + ], + [ + 1026, + 1026, + 1 + ], + [ + 1024, + 103, + 4 + ], + [ + 1027, + 1027, + 4 + ], + [ + 103, + 103, + 4 + ], + [ + 1025, + 104, + 2 + ], + [ + 104, + 104, + 2 + ], + [ + 103, + 1024, + 4 + ], + [ + 103, + 103, + 6 + ], + [ + 1024, + 103, + 6 + ], + [ + 1027, + 104, + 4 + ], + [ + 1025, + 104, + 3 + ], + [ + 1027, + 1025, + 4 + ], + [ + 104, + 104, + 3 + ], + [ + 103, + 133, + 2 + ], + [ + 103, + 132, + 2 + ], + [ + 103, + 136, + 2 + ], + [ + 1027, + 1032, + 4 + ], + [ + 103, + 138, + 2 + ], + [ + 103, + 144, + 2 + ], + [ + 104, + 1025, + 2 + ], + [ + 1024, + 132, + 4 + ], + [ + 1024, + 133, + 4 + ], + [ + 103, + 145, + 2 + ], + [ + 103, + 146, + 2 + ], + [ + 103, + 147, + 2 + ], + [ + 1026, + 1029, + 1 + ], + [ + 103, + 148, + 2 + ], + [ + 1024, + 136, + 4 + ], + [ + 138, + 138, + 3 + ], + [ + 1024, + 144, + 4 + ], + [ + 103, + 149, + 2 + ], + [ + 1026, + 1029, + 3 + ], + [ + 1024, + 145, + 4 + ], + [ + 150, + 136, + 1 + ], + [ + 132, + 132, + 2 + ], + [ + 1024, + 138, + 4 + ], + [ + 1024, + 147, + 4 + ], + [ + 1024, + 146, + 4 + ], + [ + 103, + 151, + 2 + ], + [ + 133, + 133, + 3 + ], + [ + 1029, + 1026, + 1 + ], + [ + 103, + 150, + 2 + ], + [ + 136, + 136, + 3 + ], + [ + 1024, + 149, + 4 + ], + [ + 1025, + 1025, + 3 + ], + [ + 1024, + 148, + 4 + ], + [ + 1032, + 104, + 4 + ], + [ + 145, + 132, + 1 + ], + [ + 151, + 138, + 1 + ], + [ + 104, + 152, + 1 + ], + [ + 144, + 133, + 1 + ], + [ + 132, + 145, + 1 + ], + [ + 1024, + 150, + 4 + ], + [ + 104, + 156, + 1 + ], + [ + 1024, + 151, + 4 + ], + [ + 146, + 146, + 2 + ], + [ + 104, + 158, + 1 + ], + [ + 147, + 147, + 2 + ], + [ + 163, + 152, + 1 + ], + [ + 1029, + 132, + 6 + ], + [ + 149, + 149, + 4 + ], + [ + 136, + 136, + 4 + ], + [ + 1029, + 133, + 6 + ], + [ + 138, + 138, + 4 + ], + [ + 144, + 133, + 2 + ], + [ + 172, + 156, + 1 + ], + [ + 148, + 148, + 4 + ], + [ + 1025, + 152, + 2 + ], + [ + 104, + 165, + 1 + ], + [ + 104, + 166, + 1 + ], + [ + 1031, + 144, + 2 + ], + [ + 173, + 158, + 1 + ], + [ + 1029, + 147, + 6 + ], + [ + 1029, + 136, + 6 + ], + [ + 1029, + 138, + 6 + ], + [ + 1029, + 146, + 6 + ], + [ + 1025, + 156, + 2 + ], + [ + 104, + 163, + 1 + ], + [ + 104, + 168, + 1 + ], + [ + 103, + 103, + 1 + ], + [ + 1031, + 132, + 2 + ], + [ + 1029, + 145, + 6 + ], + [ + 177, + 177, + 2 + ], + [ + 133, + 133, + 2 + ], + [ + 104, + 170, + 1 + ], + [ + 1025, + 158, + 2 + ], + [ + 1029, + 144, + 6 + ], + [ + 1031, + 133, + 2 + ], + [ + 179, + 179, + 2 + ], + [ + 145, + 132, + 2 + ], + [ + 149, + 149, + 5 + ], + [ + 1025, + 168, + 2 + ], + [ + 1032, + 152, + 3 + ], + [ + 1027, + 1033, + 4 + ], + [ + 132, + 132, + 3 + ], + [ + 1029, + 148, + 6 + ], + [ + 1031, + 146, + 2 + ], + [ + 1031, + 147, + 2 + ], + [ + 138, + 151, + 1 + ], + [ + 136, + 150, + 1 + ], + [ + 1025, + 163, + 2 + ], + [ + 1032, + 156, + 3 + ], + [ + 1031, + 145, + 2 + ], + [ + 1029, + 149, + 6 + ], + [ + 176, + 176, + 2 + ], + [ + 1025, + 170, + 2 + ], + [ + 1032, + 158, + 3 + ], + [ + 133, + 144, + 1 + ], + [ + 148, + 148, + 5 + ], + [ + 152, + 163, + 1 + ], + [ + 1025, + 165, + 2 + ], + [ + 180, + 168, + 1 + ], + [ + 133, + 144, + 2 + ], + [ + 1025, + 166, + 2 + ], + [ + 156, + 156, + 3 + ], + [ + 1032, + 168, + 3 + ], + [ + 136, + 136, + 2 + ], + [ + 1032, + 163, + 3 + ], + [ + 158, + 158, + 3 + ], + [ + 138, + 138, + 2 + ], + [ + 132, + 145, + 2 + ], + [ + 1031, + 136, + 2 + ], + [ + 1031, + 138, + 2 + ], + [ + 150, + 136, + 2 + ], + [ + 166, + 166, + 2 + ], + [ + 1031, + 148, + 2 + ], + [ + 1032, + 170, + 3 + ], + [ + 145, + 145, + 2 + ], + [ + 165, + 165, + 2 + ], + [ + 104, + 172, + 1 + ], + [ + 146, + 146, + 3 + ], + [ + 1026, + 144, + 1 + ], + [ + 147, + 147, + 3 + ], + [ + 151, + 138, + 2 + ], + [ + 104, + 173, + 1 + ], + [ + 132, + 103, + 2 + ], + [ + 104, + 181, + 1 + ], + [ + 1031, + 149, + 2 + ], + [ + 1031, + 151, + 2 + ], + [ + 1029, + 150, + 6 + ], + [ + 1031, + 150, + 2 + ], + [ + 1033, + 152, + 1 + ], + [ + 1029, + 151, + 6 + ], + [ + 144, + 103, + 2 + ], + [ + 1032, + 165, + 3 + ], + [ + 133, + 103, + 2 + ], + [ + 146, + 103, + 2 + ], + [ + 136, + 103, + 2 + ], + [ + 147, + 103, + 2 + ], + [ + 1032, + 166, + 3 + ], + [ + 138, + 103, + 2 + ], + [ + 1027, + 156, + 4 + ], + [ + 149, + 103, + 2 + ], + [ + 145, + 103, + 2 + ], + [ + 148, + 103, + 2 + ], + [ + 1026, + 144, + 3 + ], + [ + 104, + 180, + 1 + ], + [ + 1027, + 152, + 4 + ], + [ + 1033, + 152, + 3 + ], + [ + 136, + 150, + 2 + ], + [ + 1025, + 172, + 2 + ], + [ + 1027, + 158, + 4 + ], + [ + 1026, + 133, + 1 + ], + [ + 1025, + 173, + 2 + ], + [ + 1027, + 163, + 4 + ], + [ + 138, + 151, + 2 + ], + [ + 1026, + 1024, + 5 + ], + [ + 1025, + 181, + 2 + ], + [ + 156, + 172, + 1 + ], + [ + 144, + 144, + 3 + ], + [ + 151, + 151, + 3 + ], + [ + 177, + 177, + 3 + ], + [ + 158, + 158, + 4 + ], + [ + 152, + 152, + 3 + ], + [ + 132, + 132, + 4 + ], + [ + 1027, + 170, + 4 + ], + [ + 179, + 179, + 3 + ], + [ + 1032, + 172, + 3 + ], + [ + 1033, + 156, + 3 + ], + [ + 1027, + 1038, + 4 + ], + [ + 1026, + 144, + 5 + ], + [ + 1025, + 180, + 2 + ], + [ + 1027, + 168, + 4 + ], + [ + 1032, + 173, + 3 + ], + [ + 149, + 149, + 3 + ], + [ + 1026, + 133, + 3 + ], + [ + 150, + 103, + 2 + ], + [ + 168, + 168, + 3 + ], + [ + 1032, + 181, + 3 + ], + [ + 148, + 148, + 3 + ], + [ + 1032, + 180, + 3 + ], + [ + 1033, + 170, + 3 + ], + [ + 176, + 176, + 3 + ], + [ + 158, + 173, + 1 + ], + [ + 1027, + 165, + 4 + ], + [ + 146, + 146, + 4 + ], + [ + 1033, + 168, + 3 + ], + [ + 133, + 133, + 4 + ], + [ + 166, + 166, + 3 + ], + [ + 151, + 103, + 2 + ], + [ + 165, + 165, + 3 + ], + [ + 1026, + 132, + 1 + ], + [ + 1027, + 166, + 4 + ], + [ + 147, + 147, + 4 + ], + [ + 1033, + 163, + 3 + ], + [ + 145, + 145, + 3 + ], + [ + 150, + 150, + 3 + ], + [ + 1026, + 133, + 5 + ], + [ + 1024, + 1024, + 1 + ], + [ + 189, + 189, + 2 + ], + [ + 1024, + 103, + 1 + ], + [ + 152, + 163, + 2 + ], + [ + 1033, + 158, + 3 + ], + [ + 156, + 156, + 4 + ], + [ + 1026, + 1024, + 3 + ], + [ + 1034, + 132, + 2 + ], + [ + 144, + 144, + 4 + ], + [ + 1027, + 172, + 4 + ], + [ + 1029, + 1029, + 1 + ], + [ + 1034, + 136, + 2 + ], + [ + 170, + 170, + 5 + ], + [ + 1027, + 173, + 4 + ], + [ + 1034, + 147, + 2 + ], + [ + 103, + 176, + 2 + ], + [ + 1034, + 146, + 2 + ], + [ + 1034, + 133, + 2 + ], + [ + 1034, + 138, + 2 + ], + [ + 1026, + 145, + 5 + ], + [ + 1027, + 180, + 4 + ], + [ + 1033, + 165, + 3 + ], + [ + 1026, + 148, + 1 + ], + [ + 1033, + 166, + 3 + ], + [ + 163, + 152, + 2 + ], + [ + 136, + 136, + 5 + ], + [ + 168, + 180, + 1 + ], + [ + 1034, + 144, + 2 + ], + [ + 1029, + 1024, + 1 + ], + [ + 1027, + 181, + 4 + ], + [ + 132, + 132, + 5 + ], + [ + 1026, + 149, + 1 + ], + [ + 151, + 151, + 4 + ], + [ + 1026, + 146, + 1 + ], + [ + 1026, + 147, + 1 + ], + [ + 1026, + 136, + 1 + ], + [ + 156, + 172, + 2 + ], + [ + 138, + 138, + 5 + ], + [ + 149, + 149, + 2 + ], + [ + 1026, + 138, + 1 + ], + [ + 152, + 152, + 2 + ], + [ + 158, + 165, + 1 + ], + [ + 1024, + 176, + 4 + ], + [ + 1026, + 132, + 5 + ], + [ + 148, + 148, + 6 + ], + [ + 104, + 104, + 4 + ], + [ + 156, + 166, + 1 + ], + [ + 1026, + 149, + 5 + ], + [ + 103, + 189, + 2 + ], + [ + 150, + 150, + 4 + ], + [ + 146, + 146, + 5 + ], + [ + 1037, + 152, + 5 + ], + [ + 165, + 158, + 1 + ], + [ + 177, + 177, + 4 + ], + [ + 170, + 170, + 6 + ], + [ + 147, + 147, + 5 + ], + [ + 1026, + 148, + 5 + ], + [ + 1034, + 145, + 2 + ], + [ + 179, + 136, + 2 + ], + [ + 1037, + 156, + 5 + ], + [ + 1033, + 173, + 3 + ], + [ + 166, + 156, + 1 + ], + [ + 133, + 133, + 5 + ], + [ + 158, + 168, + 1 + ], + [ + 148, + 148, + 2 + ], + [ + 1026, + 138, + 5 + ], + [ + 145, + 145, + 4 + ], + [ + 1026, + 136, + 5 + ], + [ + 1037, + 163, + 5 + ], + [ + 222, + 222, + 2 + ], + [ + 1033, + 181, + 3 + ], + [ + 1026, + 1024, + 1 + ], + [ + 152, + 104, + 1 + ], + [ + 166, + 168, + 1 + ], + [ + 165, + 168, + 1 + ], + [ + 1026, + 147, + 5 + ], + [ + 104, + 152, + 2 + ], + [ + 1026, + 146, + 5 + ], + [ + 149, + 149, + 6 + ], + [ + 1026, + 151, + 1 + ], + [ + 1033, + 180, + 3 + ], + [ + 144, + 144, + 2 + ], + [ + 1037, + 158, + 5 + ], + [ + 172, + 156, + 2 + ], + [ + 1026, + 145, + 1 + ], + [ + 1034, + 148, + 2 + ], + [ + 1026, + 150, + 1 + ], + [ + 103, + 179, + 2 + ], + [ + 163, + 104, + 1 + ], + [ + 165, + 152, + 1 + ], + [ + 166, + 152, + 1 + ], + [ + 144, + 1024, + 2 + ], + [ + 220, + 220, + 2 + ], + [ + 177, + 138, + 2 + ], + [ + 156, + 168, + 1 + ], + [ + 132, + 1024, + 2 + ], + [ + 133, + 1024, + 2 + ], + [ + 1037, + 168, + 5 + ], + [ + 1026, + 150, + 5 + ], + [ + 1037, + 170, + 5 + ], + [ + 158, + 152, + 1 + ], + [ + 1026, + 151, + 5 + ], + [ + 132, + 176, + 2 + ], + [ + 1033, + 172, + 3 + ], + [ + 147, + 1024, + 2 + ], + [ + 148, + 144, + 2 + ], + [ + 1034, + 149, + 2 + ], + [ + 103, + 136, + 4 + ], + [ + 173, + 158, + 2 + ], + [ + 146, + 1024, + 2 + ], + [ + 165, + 104, + 1 + ], + [ + 103, + 132, + 4 + ], + [ + 103, + 138, + 4 + ], + [ + 144, + 148, + 2 + ], + [ + 166, + 104, + 1 + ], + [ + 156, + 152, + 1 + ], + [ + 179, + 179, + 4 + ], + [ + 1031, + 132, + 6 + ], + [ + 145, + 145, + 5 + ], + [ + 189, + 189, + 3 + ], + [ + 1039, + 152, + 6 + ], + [ + 1036, + 132, + 4 + ], + [ + 1031, + 148, + 6 + ], + [ + 1034, + 151, + 2 + ], + [ + 1034, + 150, + 2 + ], + [ + 1026, + 103, + 5 + ], + [ + 163, + 170, + 1 + ], + [ + 1031, + 144, + 6 + ], + [ + 138, + 1024, + 2 + ], + [ + 1031, + 136, + 6 + ], + [ + 156, + 104, + 1 + ], + [ + 181, + 181, + 3 + ], + [ + 103, + 177, + 2 + ], + [ + 158, + 104, + 1 + ], + [ + 151, + 151, + 5 + ], + [ + 1031, + 133, + 6 + ], + [ + 148, + 1024, + 2 + ], + [ + 136, + 1024, + 2 + ], + [ + 103, + 133, + 4 + ], + [ + 176, + 132, + 2 + ], + [ + 168, + 168, + 2 + ], + [ + 1031, + 149, + 6 + ], + [ + 1031, + 146, + 6 + ], + [ + 1037, + 172, + 5 + ], + [ + 1038, + 163, + 2 + ], + [ + 1033, + 104, + 4 + ], + [ + 136, + 136, + 6 + ], + [ + 170, + 170, + 4 + ], + [ + 1036, + 133, + 4 + ], + [ + 1031, + 147, + 6 + ], + [ + 1037, + 165, + 5 + ], + [ + 1037, + 173, + 5 + ], + [ + 138, + 138, + 6 + ], + [ + 166, + 158, + 1 + ], + [ + 1039, + 156, + 6 + ], + [ + 1036, + 147, + 4 + ], + [ + 240, + 240, + 2 + ], + [ + 149, + 1024, + 2 + ], + [ + 103, + 146, + 4 + ], + [ + 1037, + 180, + 5 + ], + [ + 163, + 1025, + 1 + ], + [ + 1031, + 138, + 6 + ], + [ + 150, + 150, + 5 + ], + [ + 1036, + 146, + 4 + ], + [ + 1044, + 152, + 7 + ], + [ + 189, + 133, + 2 + ], + [ + 132, + 146, + 2 + ], + [ + 1036, + 145, + 4 + ], + [ + 163, + 152, + 3 + ], + [ + 1037, + 181, + 5 + ], + [ + 217, + 217, + 2 + ], + [ + 156, + 156, + 2 + ], + [ + 1036, + 144, + 4 + ], + [ + 146, + 132, + 2 + ], + [ + 147, + 133, + 2 + ], + [ + 157, + 157, + 2 + ], + [ + 1026, + 132, + 3 + ], + [ + 158, + 173, + 2 + ], + [ + 145, + 149, + 2 + ], + [ + 242, + 242, + 2 + ], + [ + 251, + 251, + 2 + ], + [ + 1039, + 163, + 6 + ], + [ + 219, + 219, + 2 + ], + [ + 103, + 147, + 4 + ], + [ + 236, + 236, + 2 + ], + [ + 1026, + 136, + 3 + ], + [ + 1038, + 168, + 2 + ], + [ + 132, + 149, + 2 + ], + [ + 151, + 151, + 2 + ], + [ + 1039, + 158, + 6 + ], + [ + 132, + 147, + 2 + ], + [ + 148, + 133, + 2 + ], + [ + 1026, + 138, + 3 + ], + [ + 1039, + 168, + 6 + ], + [ + 1037, + 166, + 5 + ], + [ + 170, + 104, + 1 + ], + [ + 176, + 145, + 2 + ], + [ + 1031, + 145, + 6 + ], + [ + 146, + 136, + 2 + ], + [ + 132, + 136, + 2 + ], + [ + 1039, + 170, + 6 + ], + [ + 180, + 168, + 2 + ], + [ + 146, + 133, + 2 + ], + [ + 165, + 165, + 4 + ], + [ + 246, + 246, + 2 + ], + [ + 132, + 138, + 2 + ], + [ + 1044, + 156, + 7 + ], + [ + 147, + 144, + 2 + ], + [ + 158, + 158, + 2 + ], + [ + 104, + 168, + 2 + ], + [ + 1026, + 148, + 3 + ], + [ + 1038, + 170, + 2 + ], + [ + 1026, + 149, + 3 + ], + [ + 147, + 138, + 2 + ], + [ + 1029, + 1024, + 3 + ], + [ + 247, + 247, + 2 + ], + [ + 163, + 163, + 5 + ], + [ + 1026, + 150, + 3 + ], + [ + 223, + 223, + 2 + ], + [ + 166, + 166, + 4 + ], + [ + 1035, + 147, + 4 + ], + [ + 136, + 146, + 2 + ], + [ + 1038, + 152, + 2 + ], + [ + 132, + 148, + 2 + ], + [ + 165, + 156, + 1 + ], + [ + 168, + 104, + 1 + ], + [ + 1036, + 136, + 4 + ], + [ + 1026, + 145, + 3 + ], + [ + 1031, + 151, + 6 + ], + [ + 136, + 133, + 2 + ], + [ + 222, + 222, + 3 + ], + [ + 1035, + 132, + 4 + ], + [ + 1036, + 138, + 4 + ], + [ + 170, + 152, + 1 + ], + [ + 181, + 181, + 4 + ], + [ + 173, + 173, + 3 + ], + [ + 145, + 1024, + 2 + ], + [ + 1029, + 103, + 3 + ], + [ + 1026, + 1057, + 1 + ], + [ + 1038, + 156, + 2 + ], + [ + 150, + 150, + 2 + ], + [ + 180, + 104, + 1 + ], + [ + 1029, + 176, + 6 + ], + [ + 216, + 216, + 2 + ], + [ + 1026, + 146, + 3 + ], + [ + 146, + 144, + 2 + ], + [ + 138, + 177, + 2 + ], + [ + 149, + 149, + 7 + ], + [ + 103, + 103, + 3 + ], + [ + 1031, + 150, + 6 + ], + [ + 1044, + 163, + 7 + ], + [ + 1044, + 158, + 7 + ], + [ + 1026, + 151, + 3 + ], + [ + 138, + 147, + 2 + ], + [ + 172, + 104, + 1 + ], + [ + 138, + 133, + 2 + ], + [ + 1026, + 147, + 3 + ], + [ + 1044, + 168, + 7 + ], + [ + 136, + 179, + 2 + ], + [ + 170, + 163, + 1 + ], + [ + 144, + 146, + 2 + ], + [ + 1024, + 189, + 4 + ], + [ + 1039, + 172, + 6 + ], + [ + 144, + 147, + 2 + ], + [ + 214, + 214, + 2 + ], + [ + 1039, + 180, + 6 + ], + [ + 215, + 215, + 2 + ], + [ + 1038, + 158, + 2 + ], + [ + 349, + 349, + 2 + ], + [ + 339, + 339, + 2 + ], + [ + 149, + 145, + 2 + ], + [ + 133, + 148, + 2 + ], + [ + 151, + 1024, + 2 + ], + [ + 176, + 176, + 4 + ], + [ + 166, + 1025, + 1 + ], + [ + 133, + 146, + 2 + ], + [ + 1026, + 1049, + 1 + ], + [ + 220, + 220, + 3 + ], + [ + 150, + 1024, + 2 + ], + [ + 228, + 228, + 2 + ], + [ + 1039, + 181, + 6 + ], + [ + 165, + 1025, + 1 + ], + [ + 1039, + 173, + 6 + ], + [ + 147, + 132, + 2 + ], + [ + 133, + 136, + 2 + ], + [ + 138, + 132, + 2 + ], + [ + 149, + 132, + 2 + ], + [ + 1033, + 163, + 1 + ], + [ + 164, + 164, + 2 + ], + [ + 1044, + 170, + 7 + ], + [ + 148, + 136, + 2 + ], + [ + 181, + 104, + 1 + ], + [ + 133, + 147, + 2 + ], + [ + 103, + 215, + 2 + ], + [ + 1035, + 147, + 2 + ], + [ + 152, + 156, + 1 + ], + [ + 103, + 226, + 2 + ], + [ + 1038, + 165, + 2 + ], + [ + 313, + 313, + 2 + ], + [ + 133, + 138, + 2 + ], + [ + 1044, + 173, + 7 + ], + [ + 103, + 224, + 2 + ], + [ + 1036, + 148, + 4 + ], + [ + 144, + 138, + 2 + ], + [ + 1038, + 166, + 2 + ], + [ + 144, + 136, + 2 + ], + [ + 103, + 214, + 2 + ], + [ + 1035, + 146, + 2 + ], + [ + 152, + 158, + 1 + ], + [ + 361, + 361, + 2 + ], + [ + 173, + 104, + 1 + ], + [ + 1044, + 172, + 7 + ], + [ + 177, + 177, + 5 + ], + [ + 133, + 189, + 2 + ], + [ + 103, + 217, + 2 + ], + [ + 103, + 219, + 2 + ], + [ + 231, + 231, + 2 + ], + [ + 152, + 165, + 1 + ], + [ + 1039, + 165, + 6 + ], + [ + 162, + 162, + 2 + ], + [ + 136, + 132, + 2 + ], + [ + 179, + 179, + 5 + ], + [ + 1044, + 180, + 7 + ], + [ + 145, + 176, + 2 + ], + [ + 1026, + 1060, + 1 + ], + [ + 314, + 314, + 2 + ], + [ + 152, + 166, + 1 + ], + [ + 148, + 132, + 2 + ], + [ + 103, + 223, + 2 + ], + [ + 138, + 144, + 2 + ], + [ + 1033, + 156, + 1 + ], + [ + 230, + 230, + 2 + ], + [ + 168, + 158, + 1 + ], + [ + 104, + 163, + 2 + ], + [ + 1035, + 146, + 4 + ], + [ + 136, + 144, + 2 + ], + [ + 1044, + 181, + 7 + ], + [ + 168, + 165, + 1 + ], + [ + 152, + 1025, + 1 + ], + [ + 168, + 156, + 1 + ], + [ + 168, + 166, + 1 + ], + [ + 1036, + 149, + 4 + ], + [ + 1057, + 1026, + 1 + ], + [ + 136, + 148, + 2 + ], + [ + 1047, + 152, + 1 + ], + [ + 1039, + 166, + 6 + ], + [ + 138, + 151, + 3 + ], + [ + 180, + 180, + 3 + ], + [ + 224, + 224, + 2 + ], + [ + 113, + 113, + 2 + ], + [ + 1068, + 144, + 6 + ], + [ + 103, + 228, + 2 + ], + [ + 1035, + 132, + 2 + ], + [ + 104, + 245, + 1 + ], + [ + 156, + 165, + 1 + ], + [ + 156, + 1025, + 1 + ], + [ + 235, + 235, + 2 + ], + [ + 170, + 1025, + 1 + ], + [ + 1053, + 133, + 7 + ], + [ + 1033, + 158, + 1 + ], + [ + 145, + 146, + 2 + ], + [ + 1038, + 172, + 2 + ], + [ + 1044, + 165, + 7 + ], + [ + 1033, + 170, + 1 + ], + [ + 328, + 328, + 2 + ], + [ + 233, + 233, + 3 + ], + [ + 217, + 217, + 3 + ], + [ + 149, + 138, + 2 + ], + [ + 158, + 166, + 1 + ], + [ + 1036, + 150, + 4 + ], + [ + 1024, + 1026, + 1 + ], + [ + 181, + 181, + 5 + ], + [ + 221, + 221, + 2 + ], + [ + 149, + 133, + 2 + ], + [ + 242, + 242, + 3 + ], + [ + 103, + 230, + 2 + ], + [ + 147, + 136, + 2 + ], + [ + 1053, + 144, + 7 + ], + [ + 146, + 148, + 2 + ], + [ + 234, + 234, + 2 + ], + [ + 146, + 145, + 2 + ], + [ + 1047, + 163, + 1 + ], + [ + 1038, + 173, + 2 + ], + [ + 151, + 151, + 6 + ], + [ + 146, + 138, + 2 + ], + [ + 1053, + 145, + 7 + ], + [ + 1049, + 1026, + 1 + ], + [ + 367, + 367, + 2 + ], + [ + 1026, + 1046, + 1 + ], + [ + 366, + 366, + 2 + ], + [ + 226, + 226, + 2 + ], + [ + 172, + 172, + 3 + ], + [ + 1033, + 166, + 1 + ], + [ + 1033, + 165, + 1 + ], + [ + 382, + 382, + 2 + ], + [ + 144, + 144, + 5 + ], + [ + 1033, + 168, + 1 + ], + [ + 1044, + 166, + 7 + ], + [ + 165, + 163, + 1 + ], + [ + 1026, + 1048, + 1 + ], + [ + 117, + 117, + 2 + ], + [ + 104, + 166, + 2 + ], + [ + 219, + 219, + 3 + ], + [ + 158, + 1025, + 1 + ], + [ + 136, + 150, + 3 + ], + [ + 147, + 148, + 2 + ], + [ + 246, + 246, + 3 + ], + [ + 114, + 114, + 2 + ], + [ + 103, + 235, + 2 + ], + [ + 154, + 154, + 2 + ], + [ + 138, + 148, + 2 + ], + [ + 1047, + 170, + 1 + ], + [ + 259, + 259, + 2 + ], + [ + 243, + 243, + 2 + ], + [ + 1053, + 132, + 7 + ], + [ + 239, + 239, + 2 + ], + [ + 145, + 136, + 2 + ], + [ + 1024, + 179, + 4 + ], + [ + 244, + 244, + 2 + ], + [ + 1035, + 145, + 4 + ], + [ + 1036, + 151, + 4 + ], + [ + 1024, + 177, + 4 + ], + [ + 159, + 159, + 2 + ], + [ + 236, + 236, + 3 + ], + [ + 150, + 146, + 2 + ], + [ + 104, + 156, + 2 + ], + [ + 149, + 136, + 2 + ], + [ + 148, + 146, + 2 + ], + [ + 1026, + 1064, + 1 + ], + [ + 1026, + 1055, + 1 + ], + [ + 144, + 1029, + 2 + ], + [ + 170, + 156, + 1 + ], + [ + 240, + 240, + 3 + ], + [ + 148, + 147, + 2 + ], + [ + 104, + 158, + 2 + ], + [ + 1068, + 133, + 6 + ], + [ + 260, + 260, + 2 + ], + [ + 1038, + 181, + 2 + ], + [ + 148, + 138, + 2 + ], + [ + 163, + 165, + 1 + ], + [ + 241, + 241, + 3 + ], + [ + 151, + 147, + 2 + ], + [ + 1031, + 189, + 2 + ], + [ + 214, + 214, + 3 + ], + [ + 1053, + 147, + 7 + ], + [ + 1038, + 180, + 2 + ], + [ + 138, + 149, + 2 + ], + [ + 103, + 233, + 2 + ], + [ + 104, + 165, + 2 + ], + [ + 1026, + 1063, + 1 + ], + [ + 144, + 189, + 2 + ], + [ + 146, + 132, + 1 + ], + [ + 1035, + 133, + 2 + ], + [ + 1026, + 1065, + 1 + ], + [ + 150, + 133, + 2 + ], + [ + 145, + 147, + 2 + ], + [ + 136, + 147, + 2 + ], + [ + 1026, + 1071, + 1 + ], + [ + 166, + 163, + 1 + ], + [ + 1031, + 176, + 2 + ], + [ + 1026, + 1041, + 1 + ], + [ + 155, + 155, + 2 + ], + [ + 1035, + 145, + 2 + ], + [ + 103, + 222, + 2 + ], + [ + 133, + 1029, + 2 + ], + [ + 138, + 146, + 2 + ], + [ + 103, + 220, + 2 + ], + [ + 1062, + 132, + 4 + ], + [ + 168, + 1025, + 1 + ], + [ + 215, + 215, + 3 + ], + [ + 152, + 170, + 1 + ], + [ + 1033, + 173, + 1 + ], + [ + 149, + 147, + 2 + ], + [ + 1035, + 136, + 2 + ], + [ + 231, + 231, + 3 + ], + [ + 163, + 166, + 1 + ], + [ + 149, + 146, + 2 + ], + [ + 172, + 1025, + 1 + ], + [ + 103, + 248, + 2 + ], + [ + 176, + 145, + 3 + ], + [ + 1046, + 133, + 4 + ], + [ + 220, + 132, + 2 + ], + [ + 1047, + 156, + 1 + ], + [ + 1029, + 189, + 6 + ], + [ + 1046, + 1026, + 1 + ], + [ + 151, + 144, + 2 + ], + [ + 179, + 150, + 3 + ], + [ + 1068, + 145, + 6 + ], + [ + 138, + 177, + 3 + ], + [ + 173, + 1025, + 1 + ], + [ + 223, + 223, + 3 + ], + [ + 1032, + 245, + 3 + ], + [ + 237, + 237, + 2 + ], + [ + 110, + 110, + 2 + ], + [ + 156, + 170, + 1 + ], + [ + 151, + 132, + 2 + ], + [ + 1053, + 146, + 7 + ], + [ + 1053, + 136, + 7 + ], + [ + 1053, + 138, + 7 + ], + [ + 1035, + 133, + 4 + ], + [ + 104, + 172, + 2 + ], + [ + 1041, + 1026, + 1 + ], + [ + 151, + 148, + 2 + ], + [ + 103, + 148, + 4 + ], + [ + 173, + 165, + 1 + ], + [ + 146, + 150, + 2 + ], + [ + 232, + 232, + 2 + ], + [ + 133, + 222, + 2 + ], + [ + 153, + 153, + 2 + ], + [ + 1047, + 158, + 1 + ], + [ + 1035, + 148, + 2 + ], + [ + 147, + 1029, + 2 + ], + [ + 103, + 243, + 2 + ], + [ + 1033, + 172, + 1 + ], + [ + 245, + 245, + 3 + ], + [ + 103, + 244, + 2 + ], + [ + 166, + 172, + 1 + ], + [ + 180, + 180, + 4 + ], + [ + 1035, + 144, + 2 + ], + [ + 132, + 1029, + 2 + ], + [ + 149, + 144, + 2 + ], + [ + 249, + 249, + 3 + ], + [ + 224, + 224, + 3 + ], + [ + 147, + 145, + 2 + ], + [ + 104, + 170, + 2 + ], + [ + 233, + 233, + 2 + ], + [ + 146, + 1029, + 2 + ], + [ + 1026, + 1073, + 1 + ], + [ + 165, + 173, + 1 + ], + [ + 136, + 179, + 3 + ], + [ + 181, + 181, + 6 + ], + [ + 362, + 362, + 2 + ], + [ + 151, + 177, + 3 + ], + [ + 150, + 144, + 2 + ], + [ + 150, + 132, + 2 + ], + [ + 158, + 163, + 1 + ], + [ + 104, + 173, + 2 + ], + [ + 103, + 231, + 2 + ], + [ + 147, + 149, + 2 + ], + [ + 1047, + 165, + 1 + ], + [ + 1072, + 163, + 2 + ], + [ + 176, + 275, + 2 + ], + [ + 1024, + 223, + 4 + ], + [ + 1035, + 136, + 4 + ], + [ + 1053, + 149, + 7 + ], + [ + 1072, + 152, + 2 + ], + [ + 150, + 148, + 2 + ], + [ + 151, + 133, + 2 + ], + [ + 103, + 250, + 2 + ], + [ + 145, + 138, + 2 + ], + [ + 103, + 252, + 2 + ], + [ + 1026, + 1049, + 3 + ], + [ + 168, + 180, + 2 + ], + [ + 133, + 1067, + 2 + ], + [ + 226, + 226, + 3 + ], + [ + 1035, + 138, + 4 + ], + [ + 1068, + 132, + 6 + ], + [ + 150, + 179, + 2 + ], + [ + 1047, + 166, + 1 + ], + [ + 1026, + 1057, + 3 + ], + [ + 172, + 166, + 1 + ], + [ + 163, + 158, + 1 + ], + [ + 1035, + 149, + 2 + ], + [ + 228, + 228, + 3 + ], + [ + 1024, + 214, + 4 + ], + [ + 1050, + 132, + 4 + ], + [ + 156, + 163, + 1 + ], + [ + 103, + 241, + 2 + ], + [ + 268, + 268, + 2 + ], + [ + 103, + 249, + 2 + ], + [ + 148, + 1029, + 2 + ], + [ + 170, + 168, + 1 + ], + [ + 1024, + 215, + 4 + ], + [ + 265, + 265, + 2 + ], + [ + 146, + 149, + 2 + ], + [ + 189, + 189, + 4 + ], + [ + 177, + 151, + 2 + ], + [ + 1048, + 1026, + 1 + ], + [ + 147, + 151, + 2 + ], + [ + 1042, + 145, + 4 + ], + [ + 177, + 138, + 3 + ], + [ + 103, + 254, + 2 + ], + [ + 1026, + 1060, + 3 + ], + [ + 136, + 149, + 2 + ], + [ + 133, + 149, + 2 + ], + [ + 1083, + 146, + 4 + ], + [ + 1026, + 1080, + 1 + ], + [ + 163, + 156, + 1 + ], + [ + 1042, + 132, + 4 + ], + [ + 180, + 1025, + 1 + ], + [ + 1041, + 144, + 4 + ], + [ + 1055, + 1026, + 1 + ], + [ + 136, + 1029, + 2 + ], + [ + 1068, + 149, + 6 + ], + [ + 1035, + 144, + 4 + ], + [ + 136, + 145, + 2 + ], + [ + 1035, + 138, + 2 + ], + [ + 1047, + 173, + 1 + ], + [ + 138, + 145, + 2 + ], + [ + 230, + 230, + 3 + ], + [ + 181, + 1025, + 1 + ], + [ + 1040, + 170, + 2 + ], + [ + 1047, + 168, + 1 + ], + [ + 1064, + 1026, + 1 + ], + [ + 132, + 151, + 2 + ], + [ + 179, + 150, + 2 + ], + [ + 241, + 241, + 2 + ], + [ + 275, + 275, + 2 + ], + [ + 158, + 158, + 5 + ], + [ + 1033, + 180, + 1 + ], + [ + 1026, + 1048, + 3 + ], + [ + 1026, + 1082, + 1 + ], + [ + 1047, + 172, + 1 + ], + [ + 1068, + 147, + 6 + ], + [ + 132, + 1031, + 2 + ], + [ + 1060, + 1026, + 1 + ], + [ + 103, + 236, + 2 + ], + [ + 138, + 1029, + 2 + ], + [ + 1056, + 151, + 2 + ], + [ + 148, + 144, + 1 + ], + [ + 1024, + 219, + 4 + ], + [ + 1035, + 149, + 4 + ], + [ + 1072, + 156, + 2 + ], + [ + 172, + 163, + 1 + ], + [ + 215, + 132, + 2 + ], + [ + 179, + 136, + 3 + ], + [ + 223, + 132, + 2 + ], + [ + 1024, + 217, + 4 + ], + [ + 103, + 255, + 2 + ], + [ + 150, + 147, + 2 + ], + [ + 103, + 240, + 2 + ], + [ + 103, + 257, + 2 + ], + [ + 220, + 220, + 4 + ], + [ + 1063, + 1026, + 1 + ], + [ + 1085, + 147, + 4 + ], + [ + 1035, + 148, + 4 + ], + [ + 1024, + 224, + 4 + ], + [ + 1031, + 177, + 2 + ], + [ + 151, + 177, + 2 + ], + [ + 152, + 104, + 2 + ], + [ + 1065, + 1026, + 1 + ], + [ + 1071, + 1026, + 1 + ], + [ + 166, + 166, + 5 + ], + [ + 1024, + 228, + 4 + ], + [ + 103, + 258, + 2 + ], + [ + 214, + 132, + 2 + ], + [ + 173, + 163, + 1 + ], + [ + 222, + 222, + 4 + ], + [ + 1024, + 226, + 4 + ], + [ + 145, + 148, + 2 + ], + [ + 1025, + 245, + 2 + ], + [ + 133, + 147, + 1 + ], + [ + 1074, + 152, + 3 + ], + [ + 1031, + 179, + 2 + ], + [ + 165, + 165, + 5 + ], + [ + 1072, + 170, + 2 + ], + [ + 235, + 235, + 3 + ], + [ + 1074, + 163, + 3 + ], + [ + 1091, + 138, + 2 + ], + [ + 1068, + 146, + 6 + ], + [ + 147, + 133, + 1 + ], + [ + 217, + 217, + 4 + ], + [ + 104, + 181, + 2 + ], + [ + 170, + 158, + 1 + ], + [ + 150, + 179, + 3 + ], + [ + 1074, + 170, + 3 + ], + [ + 104, + 180, + 2 + ], + [ + 1026, + 1042, + 1 + ], + [ + 248, + 248, + 2 + ], + [ + 103, + 261, + 2 + ], + [ + 242, + 242, + 4 + ], + [ + 133, + 1041, + 2 + ], + [ + 219, + 147, + 2 + ], + [ + 1026, + 1043, + 1 + ], + [ + 132, + 150, + 2 + ], + [ + 1089, + 136, + 2 + ], + [ + 1026, + 1041, + 5 + ], + [ + 189, + 144, + 2 + ], + [ + 1072, + 158, + 2 + ], + [ + 1068, + 136, + 6 + ], + [ + 163, + 172, + 1 + ], + [ + 167, + 167, + 2 + ], + [ + 1040, + 170, + 4 + ], + [ + 1034, + 189, + 2 + ], + [ + 1033, + 181, + 1 + ], + [ + 1024, + 230, + 4 + ], + [ + 163, + 1032, + 1 + ], + [ + 149, + 1029, + 2 + ], + [ + 146, + 136, + 1 + ], + [ + 177, + 151, + 3 + ], + [ + 1026, + 1045, + 1 + ], + [ + 148, + 148, + 7 + ], + [ + 228, + 132, + 2 + ], + [ + 1068, + 138, + 6 + ], + [ + 1074, + 168, + 3 + ], + [ + 146, + 133, + 1 + ], + [ + 181, + 168, + 1 + ], + [ + 219, + 138, + 2 + ], + [ + 215, + 136, + 2 + ], + [ + 243, + 243, + 3 + ], + [ + 214, + 138, + 2 + ], + [ + 1026, + 1051, + 1 + ], + [ + 145, + 1031, + 2 + ], + [ + 150, + 149, + 2 + ], + [ + 173, + 152, + 1 + ], + [ + 133, + 146, + 1 + ], + [ + 246, + 246, + 4 + ], + [ + 1024, + 248, + 4 + ], + [ + 1026, + 1063, + 3 + ], + [ + 105, + 105, + 2 + ], + [ + 136, + 146, + 1 + ], + [ + 144, + 148, + 1 + ], + [ + 103, + 262, + 2 + ], + [ + 172, + 152, + 1 + ], + [ + 1073, + 1026, + 1 + ], + [ + 176, + 176, + 5 + ], + [ + 1042, + 1026, + 1 + ], + [ + 1026, + 1055, + 3 + ], + [ + 1186, + 163, + 1 + ], + [ + 147, + 150, + 2 + ], + [ + 168, + 170, + 1 + ], + [ + 1026, + 1046, + 3 + ], + [ + 1026, + 1046, + 5 + ], + [ + 1024, + 222, + 4 + ], + [ + 259, + 259, + 3 + ], + [ + 1026, + 1052, + 1 + ], + [ + 1024, + 235, + 4 + ], + [ + 249, + 249, + 2 + ], + [ + 172, + 170, + 1 + ], + [ + 149, + 150, + 2 + ], + [ + 132, + 144, + 2 + ], + [ + 163, + 173, + 1 + ], + [ + 1053, + 148, + 7 + ], + [ + 1072, + 168, + 2 + ], + [ + 145, + 150, + 2 + ], + [ + 156, + 104, + 2 + ], + [ + 1040, + 152, + 1 + ], + [ + 179, + 103, + 2 + ], + [ + 147, + 1031, + 2 + ], + [ + 244, + 244, + 3 + ], + [ + 1043, + 150, + 4 + ], + [ + 151, + 1029, + 2 + ], + [ + 177, + 103, + 2 + ], + [ + 176, + 103, + 2 + ], + [ + 158, + 170, + 1 + ], + [ + 132, + 1042, + 2 + ], + [ + 1040, + 152, + 4 + ], + [ + 231, + 138, + 2 + ], + [ + 165, + 170, + 1 + ], + [ + 1051, + 1026, + 1 + ], + [ + 145, + 1029, + 2 + ], + [ + 1068, + 148, + 6 + ], + [ + 163, + 1077, + 1 + ], + [ + 1024, + 220, + 4 + ], + [ + 181, + 158, + 1 + ], + [ + 144, + 133, + 3 + ], + [ + 1034, + 1026, + 1 + ], + [ + 228, + 147, + 2 + ], + [ + 151, + 146, + 2 + ], + [ + 166, + 170, + 1 + ], + [ + 250, + 250, + 3 + ], + [ + 245, + 245, + 2 + ], + [ + 189, + 103, + 2 + ], + [ + 149, + 1031, + 2 + ], + [ + 1026, + 1042, + 5 + ], + [ + 173, + 170, + 1 + ], + [ + 296, + 296, + 2 + ], + [ + 136, + 133, + 1 + ], + [ + 166, + 104, + 2 + ], + [ + 1043, + 1026, + 1 + ], + [ + 260, + 260, + 3 + ], + [ + 1110, + 177, + 4 + ], + [ + 146, + 151, + 2 + ], + [ + 1056, + 138, + 5 + ], + [ + 1040, + 163, + 2 + ], + [ + 1026, + 1034, + 1 + ], + [ + 146, + 1031, + 2 + ], + [ + 1052, + 1026, + 1 + ], + [ + 1026, + 1064, + 3 + ], + [ + 115, + 115, + 2 + ], + [ + 236, + 132, + 2 + ], + [ + 1053, + 150, + 7 + ], + [ + 1032, + 1025, + 4 + ], + [ + 145, + 176, + 3 + ], + [ + 133, + 136, + 1 + ], + [ + 224, + 138, + 2 + ], + [ + 1068, + 150, + 6 + ], + [ + 1026, + 1050, + 1 + ], + [ + 447, + 447, + 2 + ], + [ + 1072, + 173, + 2 + ], + [ + 1026, + 1058, + 1 + ], + [ + 1026, + 1071, + 3 + ], + [ + 144, + 1031, + 2 + ], + [ + 223, + 146, + 2 + ], + [ + 168, + 104, + 2 + ], + [ + 1045, + 1026, + 1 + ], + [ + 1035, + 150, + 2 + ], + [ + 1024, + 233, + 4 + ], + [ + 133, + 150, + 2 + ], + [ + 181, + 152, + 1 + ], + [ + 1053, + 151, + 7 + ], + [ + 1026, + 1050, + 5 + ], + [ + 165, + 104, + 2 + ], + [ + 217, + 146, + 2 + ], + [ + 1074, + 156, + 3 + ], + [ + 217, + 136, + 2 + ], + [ + 1025, + 152, + 3 + ], + [ + 157, + 157, + 3 + ], + [ + 1035, + 150, + 4 + ], + [ + 1072, + 172, + 2 + ], + [ + 138, + 147, + 1 + ], + [ + 1047, + 180, + 1 + ] + ] +} diff --git a/variants/extended-1st-10mm-2k/profiles/eef/primitives.npz b/variants/extended-1st-10mm-2k/profiles/eef/primitives.npz index 66719fba16ebeb8e9f7e6e3f808d41541553b163..8026380a50507523f798198eee1451587ad14c9c 100644 --- a/variants/extended-1st-10mm-2k/profiles/eef/primitives.npz +++ b/variants/extended-1st-10mm-2k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf +oid sha256:ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9 size 2510 diff --git a/variants/extended-1st-10mm-2k/profiles/joint/bpe.json b/variants/extended-1st-10mm-2k/profiles/joint/bpe.json index b7af4ed22b9864af07a0cb1a7a7ca05db769c973..a230bf5e9e126c85af9d1e18b8a2c14ccb04870f 100644 --- a/variants/extended-1st-10mm-2k/profiles/joint/bpe.json +++ b/variants/extended-1st-10mm-2k/profiles/joint/bpe.json @@ -1 +1,8490 @@ -{"spatial_merges": [[152, 164], [133, 183], [22, 105], [67, 184], [185, 186], [181, 187], [175, 182], [187, 189], [181, 184], [181, 183], [175, 188], [181, 186], [21, 105], [67, 185], [133, 181], [23, 105], [22, 104], [22, 106], [68, 185], [182, 187], [134, 192], [132, 192], [66, 191], [153, 164], [151, 164], [152, 165], [152, 163], [182, 184], [183, 189], [68, 191], [186, 189], [191, 201], [175, 194], [66, 185], [185, 205], [182, 183], [184, 189], [67, 175], [134, 181], [175, 196], [132, 181], [133, 189], [21, 104], [21, 106], [23, 104], [134, 211], [197, 207], [197, 206], [23, 106], [65, 191], [133, 182], [197, 208], [197, 209], [132, 211], [69, 191], [182, 186], [22, 107], [67, 195], [132, 218], [22, 103], [24, 105], [20, 105], [67, 198], [194, 200], [194, 195], [194, 198], [201, 210], [67, 200], [195, 213], [134, 218], [68, 195], [194, 199], [68, 199], [198, 213], [67, 199], [68, 198], [199, 212], [195, 215], [66, 198], [200, 205], [196, 224], [135, 192], [196, 204], [131, 192], [196, 203], [66, 200], [196, 228], [175, 203], [66, 195], [216, 219], [201, 219], [203, 220], [198, 215], [68, 200], [175, 214], [175, 204], [66, 199], [203, 222], [204, 222], [204, 220], [64, 191], [175, 217], [65, 185], [153, 163], [151, 165], [69, 185], [210, 216], [131, 181], [175, 212], [135, 181], [132, 182], [199, 215], [196, 236], [200, 215], [151, 163], [175, 205], [206, 221], [24, 104], [207, 223], [153, 165], [134, 189], [207, 221], [70, 191], [134, 182], [206, 223], [20, 106], [20, 104], [24, 106], [132, 189], [199, 213], [209, 221], [200, 213], [21, 103], [206, 233], [207, 233], [208, 223], [22, 108], [208, 221], [23, 103], [185, 232], [21, 107], [209, 223], [201, 204], [22, 102], [198, 212], [195, 212], [200, 232], [23, 107], [25, 105], [228, 240], [69, 199], [195, 205], [67, 204], [19, 105], [65, 203], [198, 205], [199, 237], [208, 233], [206, 224], [209, 233], [195, 274], [207, 224], [196, 230], [67, 203], [204, 250], [200, 212], [199, 238], [196, 229], [208, 224], [210, 255], [209, 224], [195, 238], [68, 226], [66, 227], [185, 237], [198, 238], [203, 216], [198, 282], [68, 225], [199, 205], [65, 200], [68, 227], [196, 234], [196, 235], [196, 241], [66, 204], [203, 257], [236, 245], [69, 203], [195, 220], [64, 203], [68, 231], [201, 203], [200, 238], [67, 226], [63, 191], [206, 263], [67, 227], [67, 243], [65, 204], [66, 225], [67, 225], [198, 220], [69, 204], [67, 231], [207, 263], [197, 286], [69, 210], [197, 287], [71, 191], [66, 231], [67, 244], [66, 226], [212, 225], [196, 252], [24, 103], [131, 218], [175, 201], [208, 263], [212, 227], [222, 229], [205, 226], [204, 216], [66, 243], [68, 203], [130, 181], [222, 230], [22, 109], [197, 297], [201, 241], [20, 103], [209, 263], [197, 302], [64, 185], [205, 231], [25, 104], [25, 106], [136, 181], [194, 226], [20, 107], [194, 225], [194, 231], [175, 216], [174, 202], [131, 182], [136, 192], [65, 199], [19, 104], [176, 202], [70, 185], [24, 107], [68, 244], [176, 188], [210, 268], [67, 239], [130, 192], [194, 227], [19, 106], [174, 188], [68, 243], [195, 291], [21, 102], [201, 270], [21, 108], [222, 235], [203, 285], [219, 261], [199, 220], [135, 218], [135, 182], [219, 253], [26, 105], [200, 220], [201, 228], [23, 102], [222, 234], [203, 255], [216, 278], [66, 244], [215, 225], [207, 293], [65, 198], [23, 108], [22, 101], [209, 303], [215, 226], [210, 253], [69, 195], [206, 293], [69, 200], [206, 303], [200, 291], [70, 203], [194, 243], [216, 236], [18, 105], [219, 258], [131, 211], [70, 204], [199, 298], [69, 198], [195, 298], [194, 244], [206, 306], [232, 239], [175, 230], [208, 311], [204, 268], [219, 271], [207, 306], [206, 290], [175, 229], [210, 258], [207, 311], [66, 239], [209, 292], [198, 298], [208, 290], [207, 303], [65, 210], [207, 292], [64, 204], [207, 290], [150, 164], [204, 245], [70, 210], [154, 164], [199, 305], [204, 276], [206, 292], [203, 240], [226, 232], [203, 279], [204, 288], [228, 253], [209, 311], [208, 292], [215, 231], [215, 227], [198, 291], [213, 227], [66, 203], [213, 226], [63, 203], [206, 311], [225, 237], [208, 303], [65, 195], [209, 293], [208, 293], [175, 234], [195, 232], [200, 283], [231, 232], [227, 237], [209, 290], [196, 316], [253, 270], [236, 261], [201, 230], [68, 242], [209, 306], [196, 317], [174, 252], [198, 232], [67, 242], [204, 240], [237, 242], [64, 210], [213, 231], [205, 239], [208, 306], [201, 278], [175, 235], [176, 252], [201, 229], [176, 241], [213, 225], [25, 103], [219, 279], [199, 232], [216, 228], [216, 270], [261, 278], [219, 276], [200, 237], [62, 191], [72, 191], [210, 288], [199, 282], [203, 245], [204, 258], [174, 241], [185, 283], [210, 333], [239, 335], [63, 185], [66, 300], [200, 274], [25, 107], [216, 229], [19, 107], [20, 108], [24, 102], [195, 237], [19, 103], [64, 199], [223, 287], [210, 276], [71, 204], [65, 239], [223, 286], [216, 230], [20, 102], [22, 110], [212, 242], [68, 308], [221, 286], [66, 242], [198, 237], [175, 266], [68, 239], [64, 200], [67, 300], [175, 259], [69, 242], [135, 211], [221, 297], [67, 331], [204, 253], [26, 106], [201, 234], [69, 225], [200, 282], [210, 261], [201, 236], [70, 199], [131, 189], [67, 319], [205, 243], [201, 235], [210, 279], [69, 227], [270, 271], [210, 285], [205, 244], [221, 302], [199, 274], [210, 271], [67, 310], [221, 287], [27, 105], [129, 181], [26, 104], [21, 109], [195, 282], [175, 262], [228, 271], [240, 351], [68, 310], [220, 226], [203, 271], [24, 108], [239, 283], [18, 104], [216, 235], [67, 308], [212, 226], [196, 340], [236, 258], [196, 342], [212, 231], [216, 234], [67, 309], [220, 225], [223, 297], [18, 106], [137, 181], [69, 226], [71, 203], [66, 310], [205, 225], [65, 227], [223, 302], [21, 101], [17, 105], [68, 300], [245, 353], [242, 305], [228, 257], [226, 291], [220, 227], [203, 288], [258, 278], [203, 250], [204, 255], [130, 182], [23, 109], [229, 450], [228, 250], [65, 231], [239, 368], [67, 336], [205, 227], [64, 264], [68, 309], [66, 309], [201, 252], [65, 242], [194, 239], [226, 274], [65, 226], [71, 210], [216, 252], [185, 373], [242, 407], [203, 261], [175, 264], [204, 285], [152, 166], [230, 455], [225, 274], [228, 245], [200, 337], [204, 257], [220, 231], [230, 240], [210, 363], [225, 346], [212, 243], [69, 231], [210, 361], [241, 250], [70, 200], [203, 268], [203, 333], [175, 299], [66, 308], [229, 245], [136, 182], [23, 101], [65, 243], [175, 301], [212, 244], [233, 297], [229, 240], [63, 199], [196, 299], [231, 335], [152, 162], [230, 245], [198, 274], [233, 302], [233, 286], [22, 100], [252, 257], [227, 282], [196, 304], [266, 437], [69, 244], [203, 253], [230, 250], [129, 192], [176, 246], [66, 331], [225, 298], [233, 287], [219, 268], [234, 372], [174, 254], [231, 282], [219, 255], [174, 316], [185, 305], [69, 243], [176, 317], [235, 240], [137, 192], [228, 377], [234, 245], [175, 313], [65, 225], [66, 319], [205, 310], [242, 346], [219, 356], [236, 257], [210, 364], [228, 384], [62, 203], [204, 333], [196, 301], [73, 191], [199, 337], [196, 307], [242, 371], [236, 250], [70, 242], [175, 318], [68, 331], [227, 298], [227, 238], [220, 244], [63, 204], [229, 257], [25, 102], [225, 238], [227, 346], [250, 266], [135, 189], [205, 308], [130, 218], [240, 341], [69, 239], [71, 185], [226, 335], [244, 274], [226, 238], [196, 320], [195, 337], [196, 313], [70, 195], [72, 204], [232, 323], [63, 264], [175, 304], [64, 235], [68, 336], [229, 250], [175, 307], [194, 242], [204, 363], [216, 241], [241, 288], [19, 108], [174, 214], [154, 163], [26, 103], [245, 344], [236, 381], [70, 198], [65, 235], [64, 229], [230, 372], [136, 218], [232, 330], [203, 258], [201, 341], [176, 217], [64, 230], [150, 165], [236, 380], [270, 276], [150, 163], [270, 355], [198, 337], [196, 318], [212, 300], [224, 286], [239, 382], [62, 185], [231, 238], [236, 387], [235, 385], [237, 321], [215, 244], [194, 309], [154, 165], [204, 261], [194, 310], [196, 324], [19, 102], [68, 204], [26, 107], [250, 341], [174, 247], [237, 315], [216, 344], [194, 300], [219, 355], [194, 331], [235, 250], [203, 361], [207, 427], [174, 249], [278, 279], [236, 240], [65, 234], [230, 257], [65, 266], [212, 309], [174, 354], [228, 394], [245, 341], [224, 287], [196, 467], [230, 400], [201, 316], [64, 234], [220, 243], [65, 229], [20, 109], [206, 427], [213, 243], [208, 408], [240, 344], [61, 191], [28, 105], [257, 344], [18, 103], [175, 320], [231, 291], [66, 336], [18, 107], [196, 264], [63, 210], [229, 372], [234, 240], [235, 245], [206, 408], [25, 108], [209, 420], [67, 229], [222, 313], [176, 289], [27, 106], [234, 250], [234, 257], [67, 234], [65, 230], [201, 317], [198, 386], [176, 358], [66, 323], [252, 255], [175, 324], [66, 330], [69, 234], [216, 351], [194, 308], [197, 509], [194, 336], [229, 255], [176, 210], [224, 302], [69, 230], [67, 230], [64, 242], [20, 101], [68, 321], [235, 257], [224, 297], [230, 268], [229, 425], [278, 356], [226, 283], [197, 506], [203, 276], [68, 315], [22, 111], [229, 385], [222, 318], [176, 247], [69, 229], [70, 230], [203, 364], [70, 229], [176, 354], [71, 199], [286, 290], [67, 264], [16, 105], [207, 420], [66, 321], [230, 255], [174, 358], [225, 305], [205, 323], [199, 392], [219, 374], [242, 392], [207, 452], [229, 268], [200, 373], [64, 198], [204, 432], [176, 342], [208, 420], [67, 410], [27, 104], [241, 276], [207, 408], [200, 386], [204, 279], [195, 386], [235, 400], [209, 408], [204, 271], [65, 264], [222, 301], [176, 248], [205, 330], [208, 427], [234, 255], [287, 290], [206, 452], [174, 340], [201, 353], [69, 264], [196, 489], [232, 310], [231, 283], [203, 383], [17, 104], [199, 283], [209, 427], [231, 368], [196, 473], [236, 356], [24, 101], [72, 210], [63, 200], [174, 317], [227, 305], [72, 203], [67, 235], [64, 195], [66, 315], [70, 239], [210, 395], [212, 315], [232, 308], [21, 110], [226, 368], [206, 420], [235, 255], [212, 321], [228, 355], [176, 316], [232, 243], [232, 244]], "temporal_merges": [[188, 188, 2], [190, 190, 2], [193, 193, 2], [1024, 1024, 4], [1025, 1025, 4], [202, 202, 2], [1026, 1026, 4], [1029, 1029, 4], [1027, 1027, 1], [1024, 188, 4], [1028, 1028, 1], [1025, 190, 4], [214, 214, 2], [1030, 1030, 1], [1026, 193, 4], [217, 217, 2], [188, 188, 4], [190, 190, 4], [193, 193, 4], [1031, 1031, 1], [188, 214, 2], [1029, 202, 4], [188, 217, 2], [174, 174, 3], [176, 176, 3], [249, 249, 2], [1024, 214, 4], [1024, 217, 4], [190, 1025, 4], [214, 188, 2], [188, 246, 2], [248, 248, 2], [247, 247, 2], [262, 262, 2], [259, 259, 2], [249, 202, 2], [193, 1026, 4], [190, 251, 2], [190, 256, 2], [188, 254, 2], [266, 266, 2], [1033, 217, 6], [1024, 246, 4], [188, 247, 2], [264, 264, 2], [188, 248, 2], [241, 241, 2], [193, 193, 6], [188, 265, 2], [214, 214, 3], [252, 252, 2], [1025, 190, 6], [289, 289, 2], [67, 67, 1], [174, 174, 4], [1024, 254, 4], [188, 267, 2], [176, 176, 4], [246, 246, 2], [260, 260, 3], [190, 269, 2], [66, 66, 1], [1025, 251, 4], [1024, 247, 4], [1026, 193, 6], [1025, 256, 4], [1024, 248, 4], [190, 272, 2], [190, 273, 2], [326, 326, 1], [1039, 217, 4], [1033, 214, 6], [251, 251, 2], [1024, 265, 4], [202, 202, 4], [230, 230, 2], [68, 68, 1], [1035, 256, 6], [229, 229, 2], [71, 71, 1], [190, 295, 2], [242, 242, 2], [65, 65, 1], [254, 254, 2], [1035, 251, 6], [256, 256, 2], [1036, 214, 4], [70, 70, 1], [202, 249, 2], [267, 267, 2], [193, 275, 2], [1033, 246, 6], [64, 64, 1], [262, 217, 2], [281, 281, 3], [329, 329, 2], [235, 235, 3], [62, 62, 1], [193, 277, 2], [319, 319, 1], [63, 63, 1], [234, 234, 3], [1024, 267, 4], [193, 280, 2], [193, 260, 2], [1025, 272, 4], [1025, 273, 4], [190, 312, 2], [1025, 269, 4], [193, 284, 2], [214, 214, 4], [190, 314, 2], [69, 69, 1], [1027, 1033, 3], [322, 322, 2], [73, 73, 1], [339, 339, 2], [239, 239, 2], [277, 277, 3], [265, 265, 2], [193, 294, 2], [217, 217, 3], [1025, 295, 4], [196, 196, 2], [72, 72, 1], [193, 296, 2], [275, 275, 3], [193, 281, 2], [1027, 1033, 1], [202, 289, 2], [283, 283, 2], [210, 210, 2], [315, 315, 2], [249, 1029, 2], [175, 175, 2], [1035, 273, 6], [1035, 272, 6], [280, 280, 3], [352, 352, 2], [61, 61, 1], [259, 259, 3], [1035, 269, 6], [325, 325, 2], [332, 332, 2], [1026, 275, 4], [1025, 312, 4], [260, 260, 2], [188, 1039, 2], [284, 284, 3], [1025, 314, 4], [321, 321, 2], [323, 323, 2], [251, 251, 3], [285, 285, 2], [304, 304, 2], [1035, 295, 6], [188, 345, 2], [1033, 254, 6], [237, 237, 2], [307, 307, 2], [1033, 247, 6], [188, 350, 2], [1033, 248, 6], [1026, 277, 4], [1026, 260, 4], [272, 272, 2], [299, 299, 2], [378, 378, 2], [236, 236, 2], [288, 288, 2], [269, 269, 2], [347, 347, 2], [301, 301, 2], [273, 273, 2], [66, 67, 1], [330, 330, 2], [1026, 281, 4], [230, 230, 3], [1040, 217, 2], [1026, 284, 4], [334, 334, 2], [1026, 280, 4], [343, 343, 2], [327, 327, 2], [259, 214, 2], [216, 216, 2], [229, 229, 3], [309, 309, 2], [305, 305, 2], [270, 270, 2], [201, 201, 2], [1030, 1038, 3], [1040, 214, 2], [256, 256, 3], [1030, 1038, 1], [1035, 312, 6], [1029, 289, 4], [225, 225, 2], [328, 328, 2], [235, 235, 2], [200, 200, 2], [244, 244, 2], [1035, 314, 6], [188, 365, 2], [338, 338, 2], [174, 174, 5], [188, 1036, 2], [300, 300, 2], [234, 234, 2], [188, 366, 2], [1026, 294, 4], [247, 247, 3], [248, 248, 3], [1026, 296, 4], [176, 176, 5], [1027, 1024, 5], [232, 232, 2], [258, 258, 2], [266, 266, 1], [1033, 265, 6], [64, 65, 1], [262, 262, 3], [253, 253, 2], [246, 246, 3], [360, 360, 2], [199, 199, 2], [243, 243, 2], [68, 69, 1], [1038, 1030, 1], [202, 349, 2], [195, 195, 2], [294, 294, 2], [399, 399, 2], [296, 296, 2], [281, 281, 2], [188, 188, 1], [428, 428, 2], [357, 357, 2], [174, 174, 2], [269, 190, 2], [62, 63, 1], [1027, 1024, 3], [176, 176, 2], [398, 398, 2], [277, 277, 4], [245, 245, 2], [326, 326, 2], [275, 275, 2], [227, 227, 2], [254, 254, 3], [1029, 249, 4], [70, 71, 1], [261, 261, 2], [264, 264, 1], [251, 251, 4], [278, 278, 2], [228, 228, 2], [205, 205, 2], [74, 74, 1], [280, 280, 2], [240, 240, 2], [317, 317, 2], [313, 313, 2], [217, 188, 2], [1033, 267, 6], [241, 241, 3], [410, 410, 1], [316, 316, 2], [1040, 246, 2], [320, 320, 2], [308, 308, 2], [359, 359, 2], [1041, 256, 2], [249, 352, 2], [413, 413, 2], [348, 348, 2], [390, 390, 2], [251, 190, 2], [217, 322, 2], [438, 438, 2], [226, 226, 2], [1036, 1036, 4], [1024, 345, 4], [370, 370, 2], [454, 454, 1], [279, 279, 2], [60, 60, 1], [1024, 350, 4], [466, 466, 1], [419, 419, 2], [273, 190, 2], [1041, 269, 2], [257, 257, 2], [260, 260, 4], [202, 367, 2], [418, 418, 2], [65, 66, 1], [272, 190, 2], [284, 284, 4], [242, 242, 1], [451, 451, 2], [72, 71, 1], [256, 190, 2], [202, 354, 2], [204, 204, 2], [406, 406, 2], [198, 198, 2], [430, 430, 2], [369, 369, 2], [271, 271, 2], [202, 358, 2], [268, 268, 2], [1049, 249, 4], [331, 331, 1], [422, 422, 2], [252, 252, 3], [246, 188, 2], [480, 480, 2], [193, 193, 1], [319, 319, 2], [202, 376, 2], [214, 214, 1], [1040, 247, 2], [1041, 272, 2], [444, 444, 2], [433, 433, 2], [1041, 273, 2], [174, 174, 6], [324, 324, 2], [440, 440, 2], [1045, 289, 6], [318, 318, 2], [1040, 248, 2], [217, 262, 2], [1027, 214, 3], [336, 336, 1], [1024, 365, 4], [185, 185, 2], [310, 310, 2], [1024, 366, 4], [219, 219, 2], [436, 436, 2], [1027, 214, 1], [67, 68, 1], [234, 234, 4], [231, 231, 2], [235, 235, 4], [1038, 275, 6], [176, 176, 6], [276, 276, 2], [1040, 254, 2], [247, 188, 2], [1024, 1039, 4], [248, 188, 2], [1047, 1047, 2], [1041, 251, 2], [266, 266, 3], [254, 188, 2], [478, 478, 1], [265, 265, 3], [181, 181, 1], [412, 412, 2], [371, 371, 2], [362, 362, 2], [446, 446, 2], [230, 230, 4], [70, 69, 1], [250, 250, 2], [448, 448, 2], [62, 61, 1], [262, 329, 2], [1028, 256, 3], [1029, 349, 4], [332, 332, 3], [229, 229, 4], [396, 396, 2], [64, 63, 1], [217, 217, 4], [190, 379, 2], [286, 286, 2], [1028, 256, 1], [269, 269, 3], [416, 416, 2], [260, 193, 2], [1048, 1048, 2], [294, 193, 2], [241, 241, 1], [267, 267, 3], [194, 194, 2], [402, 402, 2], [325, 214, 2], [457, 457, 2], [264, 264, 3], [239, 239, 1], [296, 193, 2], [404, 404, 2], [280, 193, 2], [255, 255, 2], [287, 287, 2], [295, 295, 2], [1028, 251, 3], [272, 272, 3], [340, 340, 2], [1039, 1039, 4], [220, 220, 2], [354, 354, 2], [442, 442, 2], [190, 388, 2], [1027, 214, 5], [304, 304, 3], [1028, 256, 5], [1038, 277, 6], [1038, 281, 6], [434, 434, 2], [417, 417, 2], [273, 273, 3], [297, 297, 2], [342, 342, 2], [299, 299, 3], [182, 182, 1], [1041, 295, 2], [214, 259, 2], [315, 315, 1], [1045, 249, 6], [382, 382, 2], [1025, 379, 4], [72, 73, 1], [1028, 251, 1], [1028, 251, 5], [307, 307, 3], [1027, 217, 5], [381, 381, 2], [1027, 217, 3], [358, 358, 2], [374, 374, 2], [1038, 284, 6], [109, 109, 1], [1040, 265, 2], [210, 210, 1], [283, 283, 1], [275, 275, 4], [277, 277, 2], [1056, 247, 4], [323, 323, 1], [252, 252, 1], [1038, 260, 6], [375, 375, 2], [465, 465, 2], [1055, 248, 4], [301, 301, 3], [1042, 280, 2], [294, 294, 3], [343, 343, 3], [392, 392, 2], [1025, 388, 4], [202, 397, 2], [174, 174, 7], [296, 296, 3], [1076, 289, 4], [1040, 267, 2], [302, 302, 2], [373, 373, 2], [265, 188, 2], [328, 214, 2], [212, 212, 2], [432, 432, 2], [281, 281, 4], [327, 327, 3], [190, 401, 2], [202, 1059, 2], [1041, 312, 2], [259, 254, 2], [267, 188, 2], [510, 510, 2], [201, 201, 3], [176, 176, 7], [217, 217, 1], [352, 249, 2], [262, 246, 2], [17, 17, 1], [321, 321, 1], [253, 253, 3], [1027, 217, 1], [66, 66, 2], [1038, 280, 6], [208, 208, 2], [1041, 314, 2], [347, 246, 2], [1033, 1027, 1], [106, 106, 1], [259, 1036, 2], [236, 236, 3], [237, 237, 1], [259, 339, 2], [256, 256, 4], [275, 193, 2], [314, 190, 2], [258, 258, 3], [322, 329, 2], [349, 349, 2], [214, 1024, 2], [292, 292, 2], [1029, 367, 4], [277, 193, 2], [295, 190, 2], [100, 100, 1], [393, 393, 2], [232, 205, 2], [330, 330, 1], [312, 190, 2], [383, 383, 2], [175, 175, 3], [313, 313, 3], [244, 244, 1], [284, 193, 2], [1029, 376, 4], [508, 508, 2], [325, 325, 3], [1044, 1027, 1], [216, 216, 3], [334, 334, 3], [1028, 1035, 1], [202, 1049, 2], [70, 70, 2], [337, 337, 2], [1027, 1044, 3], [67, 67, 2], [68, 68, 2], [1025, 401, 4], [389, 389, 2], [1028, 1035, 3], [391, 391, 2], [305, 305, 1], [357, 214, 2], [209, 209, 2], [320, 320, 3], [394, 394, 2], [476, 476, 2], [1042, 260, 2], [203, 203, 2], [328, 328, 3], [60, 61, 1], [429, 429, 2], [461, 461, 2], [487, 487, 2], [1029, 354, 4], [284, 284, 2], [360, 360, 3], [475, 475, 2], [338, 338, 3], [285, 285, 1], [367, 367, 2], [327, 214, 2], [348, 214, 2], [1038, 296, 6], [502, 502, 2], [270, 270, 3], [281, 193, 2], [355, 355, 2], [1038, 294, 6], [411, 411, 2], [74, 73, 1], [22, 22, 1], [234, 234, 5], [1042, 275, 2], [1027, 1044, 1], [1029, 358, 4], [243, 243, 1], [261, 261, 3], [75, 75, 1], [485, 485, 2], [1047, 174, 6], [346, 346, 2], [356, 356, 2], [322, 217, 2], [481, 481, 2], [65, 65, 2], [269, 269, 4], [551, 551, 2], [378, 378, 1], [188, 188, 3], [248, 248, 4], [1025, 414, 4], [272, 272, 4], [247, 247, 4], [235, 235, 5], [1042, 294, 2], [240, 240, 3], [1027, 246, 3], [1042, 277, 2], [1024, 1036, 4], [359, 217, 2], [190, 414, 2], [105, 105, 1], [1042, 296, 2], [102, 102, 1], [1027, 246, 5], [339, 339, 3], [309, 309, 1], [1059, 249, 4], [228, 228, 3], [464, 464, 2], [415, 415, 2], [364, 364, 2], [506, 506, 2], [1077, 1077, 2], [329, 329, 3], [273, 273, 4], [108, 108, 1], [597, 597, 1], [1050, 1027, 1], [1048, 176, 6], [335, 335, 2], [197, 197, 2], [245, 245, 3], [324, 324, 3], [318, 318, 3], [1093, 326, 2], [1027, 1050, 1], [69, 69, 2], [280, 280, 4], [333, 333, 2], [200, 200, 1], [28, 28, 1], [188, 262, 2], [1042, 284, 2], [110, 110, 1], [1035, 1028, 1], [249, 249, 4], [1027, 1051, 3], [300, 300, 1], [251, 251, 5], [260, 260, 5], [363, 363, 2], [225, 225, 1], [368, 368, 2], [1103, 71, 2], [1031, 1045, 1], [230, 230, 5], [190, 426, 2], [1057, 262, 4], [1027, 1051, 1], [509, 509, 2], [398, 398, 1], [1030, 1026, 5], [288, 288, 3], [452, 452, 2], [361, 361, 2], [202, 202, 1], [63, 64, 1], [278, 278, 3], [229, 229, 5], [190, 431, 2], [463, 463, 2], [370, 370, 3], [1028, 273, 3], [1025, 426, 4], [65, 1085, 1], [395, 395, 2], [1033, 345, 6], [1028, 273, 1], [334, 217, 2], [1024, 1024, 1], [271, 271, 3], [1033, 350, 6], [1049, 1049, 4], [1029, 397, 4], [317, 317, 3], [353, 353, 3], [59, 59, 1], [1028, 273, 5], [1058, 259, 4], [1024, 188, 1], [1042, 281, 2], [493, 493, 2], [316, 316, 3], [498, 498, 2], [232, 232, 1], [196, 196, 3], [1027, 246, 1], [1025, 431, 4], [1031, 1045, 3], [470, 470, 2], [103, 103, 1], [436, 289, 2], [561, 561, 1], [312, 312, 2], [471, 471, 2], [422, 422, 1], [459, 459, 2], [332, 332, 4], [238, 238, 2], [1028, 272, 5], [18, 18, 1], [27, 27, 1], [1028, 272, 1], [195, 195, 1], [445, 445, 2], [101, 101, 1], [338, 217, 2], [503, 503, 2], [380, 380, 2], [107, 107, 1], [279, 279, 3], [1027, 1046, 3], [1028, 269, 1], [336, 336, 2], [331, 331, 2], [351, 351, 3], [483, 483, 2], [269, 251, 1], [413, 413, 1], [635, 635, 1], [486, 486, 2], [256, 256, 5], [516, 516, 2], [1139, 73, 2], [295, 295, 3], [526, 526, 2], [1028, 269, 5], [569, 569, 2], [319, 410, 1], [266, 438, 2], [570, 570, 2], [199, 199, 1], [437, 437, 2], [314, 314, 2], [64, 1106, 1], [504, 504, 2], [1027, 1050, 3], [1028, 272, 3], [1027, 188, 5], [246, 217, 2], [1026, 409, 4], [327, 248, 2], [193, 403, 2], [276, 276, 3], [535, 535, 2], [26, 26, 1], [214, 1044, 2], [23, 23, 1], [328, 247, 2], [500, 500, 2], [322, 322, 3], [377, 377, 2], [193, 409, 2], [405, 405, 2], [242, 242, 3], [433, 433, 1], [194, 212, 2], [241, 241, 4], [1028, 269, 3], [492, 492, 2], [505, 505, 2], [1026, 403, 4], [254, 259, 2], [262, 1039, 2], [285, 285, 3], [16, 16, 1], [1036, 188, 4], [407, 407, 2], [210, 210, 3], [219, 219, 3], [308, 308, 1], [69, 70, 1], [251, 269, 1], [349, 202, 2], [362, 217, 2], [191, 191, 2], [634, 634, 1], [227, 227, 1], [347, 265, 2], [387, 387, 2], [294, 294, 4], [480, 620, 2], [1077, 67, 2], [71, 71, 2], [226, 226, 1], [1027, 1065, 1], [293, 293, 2], [268, 268, 3], [216, 216, 1], [497, 497, 2], [1027, 1046, 5], [466, 326, 1], [609, 609, 2], [418, 418, 1], [375, 214, 2], [128, 128, 1], [660, 660, 1], [341, 341, 3], [514, 514, 2], [260, 280, 1], [384, 384, 2], [222, 222, 2], [621, 621, 1], [1033, 366, 6], [1033, 365, 6], [64, 64, 2], [419, 419, 1], [296, 296, 4], [1030, 275, 3], [299, 299, 4], [264, 428, 2], [376, 376, 2], [24, 24, 1], [1030, 275, 1], [1027, 247, 1], [528, 528, 2], [1074, 252, 4], [1035, 379, 6], [519, 519, 2], [325, 265, 2], [1030, 275, 5], [202, 1076, 2], [340, 340, 3], [1027, 248, 1], [446, 446, 1], [512, 512, 2], [586, 586, 1], [104, 104, 1], [19, 19, 1], [304, 304, 4], [254, 214, 2], [423, 423, 2], [339, 259, 2], [198, 198, 1], [472, 472, 2], [359, 359, 3], [66, 67, 2], [307, 307, 4], [196, 196, 1], [1064, 266, 4], [288, 288, 1], [62, 1124, 1], [390, 390, 1], [424, 424, 2], [1065, 1027, 1], [585, 585, 1], [306, 306, 2], [280, 260, 1], [584, 584, 1], [582, 582, 1], [412, 249, 2], [310, 310, 1], [255, 255, 3], [444, 444, 1], [430, 430, 1], [603, 603, 2], [1030, 280, 1], [193, 447, 2], [315, 315, 3], [1070, 241, 4], [1040, 345, 2], [325, 1036, 2], [234, 234, 6], [1027, 1044, 5], [62, 1163, 1], [99, 99, 1], [357, 357, 3], [348, 348, 3], [416, 416, 1], [257, 257, 3], [201, 201, 4], [205, 205, 1], [343, 343, 4], [342, 342, 3], [536, 536, 2], [63, 63, 2], [1026, 447, 4], [138, 138, 1], [460, 460, 2], [537, 537, 2], [253, 253, 4], [1033, 1024, 1], [456, 456, 2], [369, 254, 2], [440, 440, 1], [1027, 247, 5], [1035, 388, 6], [477, 477, 2], [1027, 248, 5], [596, 596, 1], [421, 421, 2], [301, 301, 4], [588, 588, 1], [577, 577, 2], [188, 259, 2], [1040, 350, 2], [246, 262, 2], [399, 399, 1], [223, 223, 2], [1030, 260, 1], [1068, 264, 4], [289, 289, 3], [212, 237, 2], [235, 235, 6], [277, 277, 5], [469, 469, 2], [1045, 1031, 1], [344, 344, 3], [193, 435, 2], [1027, 1024, 1], [231, 231, 1], [439, 439, 2], [193, 174, 2], [193, 441, 2], [166, 166, 2], [322, 322, 1], [548, 548, 2], [443, 443, 2], [702, 702, 2], [1078, 174, 2], [1026, 441, 4], [214, 254, 2], [679, 679, 1], [1028, 256, 7], [668, 668, 1], [352, 352, 3], [449, 449, 2], [1100, 68, 2], [578, 578, 2], [1027, 247, 3], [258, 258, 4], [313, 313, 4], [1033, 1024, 3], [490, 490, 2], [162, 162, 2], [1026, 435, 4], [457, 457, 1], [1082, 246, 4], [1051, 1027, 1], [206, 206, 2], [579, 579, 1], [207, 207, 2], [193, 176, 2], [1027, 1046, 1], [1027, 248, 3], [215, 215, 2], [517, 517, 2], [321, 321, 3], [1030, 277, 1], [283, 232, 2], [1028, 312, 1], [252, 252, 4], [236, 236, 4], [1081, 176, 2], [250, 250, 3], [386, 386, 2], [338, 248, 2], [1085, 66, 2], [202, 539, 2], [201, 201, 1], [269, 251, 2], [334, 247, 2], [1119, 329, 4], [465, 465, 1], [225, 225, 3], [1028, 314, 1], [175, 175, 4], [221, 221, 2], [272, 272, 5], [538, 538, 2], [454, 454, 2], [190, 174, 2], [320, 320, 4], [204, 204, 1], [1030, 260, 5], [259, 259, 4], [360, 385, 2], [230, 230, 6], [347, 347, 3], [214, 327, 2], [1026, 458, 4], [281, 281, 5], [396, 396, 3], [1028, 295, 5], [214, 328, 2], [239, 239, 3], [1095, 1027, 1], [323, 323, 3], [613, 613, 1], [345, 188, 2], [267, 267, 4], [592, 592, 2], [229, 229, 6], [240, 332, 2], [1046, 1027, 1], [202, 545, 2], [1030, 284, 1], [68, 69, 2], [1028, 312, 5], [290, 290, 2], [541, 541, 2], [722, 722, 1], [21, 21, 1], [249, 349, 2], [309, 309, 3], [402, 402, 3], [1035, 401, 6], [251, 269, 2], [1033, 1033, 1], [348, 246, 2], [244, 244, 3], [1040, 366, 2], [261, 261, 4], [174, 1047, 2], [1027, 188, 3], [1098, 289, 2], [65, 66, 2], [129, 129, 1], [71, 70, 1], [410, 319, 1], [637, 637, 1], [392, 305, 2], [193, 458, 2], [275, 275, 5], [188, 217, 1], [273, 273, 5], [370, 245, 2], [1040, 1134, 2], [1028, 314, 5], [214, 325, 2], [176, 1048, 2]]} \ No newline at end of file +{ + "spatial_merges": [ + [ + 152, + 164 + ], + [ + 133, + 183 + ], + [ + 22, + 105 + ], + [ + 67, + 184 + ], + [ + 185, + 186 + ], + [ + 181, + 187 + ], + [ + 175, + 182 + ], + [ + 187, + 189 + ], + [ + 181, + 184 + ], + [ + 181, + 183 + ], + [ + 175, + 188 + ], + [ + 181, + 186 + ], + [ + 21, + 105 + ], + [ + 67, + 185 + ], + [ + 133, + 181 + ], + [ + 23, + 105 + ], + [ + 22, + 104 + ], + [ + 22, + 106 + ], + [ + 68, + 185 + ], + [ + 182, + 187 + ], + [ + 134, + 192 + ], + [ + 132, + 192 + ], + [ + 66, + 191 + ], + [ + 153, + 164 + ], + [ + 151, + 164 + ], + [ + 152, + 165 + ], + [ + 152, + 163 + ], + [ + 182, + 184 + ], + [ + 183, + 189 + ], + [ + 68, + 191 + ], + [ + 186, + 189 + ], + [ + 191, + 201 + ], + [ + 175, + 194 + ], + [ + 66, + 185 + ], + [ + 185, + 205 + ], + [ + 182, + 183 + ], + [ + 184, + 189 + ], + [ + 67, + 175 + ], + [ + 134, + 181 + ], + [ + 175, + 196 + ], + [ + 132, + 181 + ], + [ + 133, + 189 + ], + [ + 21, + 104 + ], + [ + 21, + 106 + ], + [ + 23, + 104 + ], + [ + 134, + 211 + ], + [ + 197, + 207 + ], + [ + 197, + 206 + ], + [ + 23, + 106 + ], + [ + 65, + 191 + ], + [ + 133, + 182 + ], + [ + 197, + 208 + ], + [ + 197, + 209 + ], + [ + 132, + 211 + ], + [ + 69, + 191 + ], + [ + 182, + 186 + ], + [ + 22, + 107 + ], + [ + 67, + 195 + ], + [ + 132, + 218 + ], + [ + 22, + 103 + ], + [ + 24, + 105 + ], + [ + 20, + 105 + ], + [ + 67, + 198 + ], + [ + 194, + 200 + ], + [ + 194, + 195 + ], + [ + 194, + 198 + ], + [ + 201, + 210 + ], + [ + 67, + 200 + ], + [ + 195, + 213 + ], + [ + 134, + 218 + ], + [ + 68, + 195 + ], + [ + 194, + 199 + ], + [ + 68, + 199 + ], + [ + 198, + 213 + ], + [ + 67, + 199 + ], + [ + 68, + 198 + ], + [ + 199, + 212 + ], + [ + 195, + 215 + ], + [ + 66, + 198 + ], + [ + 200, + 205 + ], + [ + 196, + 224 + ], + [ + 135, + 192 + ], + [ + 196, + 204 + ], + [ + 131, + 192 + ], + [ + 196, + 203 + ], + [ + 66, + 200 + ], + [ + 196, + 228 + ], + [ + 175, + 203 + ], + [ + 66, + 195 + ], + [ + 216, + 219 + ], + [ + 201, + 219 + ], + [ + 203, + 220 + ], + [ + 198, + 215 + ], + [ + 68, + 200 + ], + [ + 175, + 214 + ], + [ + 175, + 204 + ], + [ + 66, + 199 + ], + [ + 203, + 222 + ], + [ + 204, + 222 + ], + [ + 204, + 220 + ], + [ + 64, + 191 + ], + [ + 175, + 217 + ], + [ + 65, + 185 + ], + [ + 153, + 163 + ], + [ + 151, + 165 + ], + [ + 69, + 185 + ], + [ + 210, + 216 + ], + [ + 131, + 181 + ], + [ + 175, + 212 + ], + [ + 135, + 181 + ], + [ + 132, + 182 + ], + [ + 199, + 215 + ], + [ + 196, + 236 + ], + [ + 200, + 215 + ], + [ + 151, + 163 + ], + [ + 175, + 205 + ], + [ + 206, + 221 + ], + [ + 24, + 104 + ], + [ + 207, + 223 + ], + [ + 153, + 165 + ], + [ + 134, + 189 + ], + [ + 207, + 221 + ], + [ + 70, + 191 + ], + [ + 134, + 182 + ], + [ + 206, + 223 + ], + [ + 20, + 106 + ], + [ + 20, + 104 + ], + [ + 24, + 106 + ], + [ + 132, + 189 + ], + [ + 199, + 213 + ], + [ + 209, + 221 + ], + [ + 200, + 213 + ], + [ + 21, + 103 + ], + [ + 206, + 233 + ], + [ + 207, + 233 + ], + [ + 208, + 223 + ], + [ + 22, + 108 + ], + [ + 208, + 221 + ], + [ + 23, + 103 + ], + [ + 185, + 232 + ], + [ + 21, + 107 + ], + [ + 209, + 223 + ], + [ + 201, + 204 + ], + [ + 22, + 102 + ], + [ + 198, + 212 + ], + [ + 195, + 212 + ], + [ + 200, + 232 + ], + [ + 23, + 107 + ], + [ + 25, + 105 + ], + [ + 228, + 240 + ], + [ + 69, + 199 + ], + [ + 195, + 205 + ], + [ + 67, + 204 + ], + [ + 19, + 105 + ], + [ + 65, + 203 + ], + [ + 198, + 205 + ], + [ + 199, + 237 + ], + [ + 208, + 233 + ], + [ + 206, + 224 + ], + [ + 209, + 233 + ], + [ + 195, + 274 + ], + [ + 207, + 224 + ], + [ + 196, + 230 + ], + [ + 67, + 203 + ], + [ + 204, + 250 + ], + [ + 200, + 212 + ], + [ + 199, + 238 + ], + [ + 196, + 229 + ], + [ + 208, + 224 + ], + [ + 210, + 255 + ], + [ + 209, + 224 + ], + [ + 195, + 238 + ], + [ + 68, + 226 + ], + [ + 66, + 227 + ], + [ + 185, + 237 + ], + [ + 198, + 238 + ], + [ + 203, + 216 + ], + [ + 198, + 282 + ], + [ + 68, + 225 + ], + [ + 199, + 205 + ], + [ + 65, + 200 + ], + [ + 68, + 227 + ], + [ + 196, + 234 + ], + [ + 196, + 235 + ], + [ + 196, + 241 + ], + [ + 66, + 204 + ], + [ + 203, + 257 + ], + [ + 236, + 245 + ], + [ + 69, + 203 + ], + [ + 195, + 220 + ], + [ + 64, + 203 + ], + [ + 68, + 231 + ], + [ + 201, + 203 + ], + [ + 200, + 238 + ], + [ + 67, + 226 + ], + [ + 63, + 191 + ], + [ + 206, + 263 + ], + [ + 67, + 227 + ], + [ + 67, + 243 + ], + [ + 65, + 204 + ], + [ + 66, + 225 + ], + [ + 67, + 225 + ], + [ + 198, + 220 + ], + [ + 69, + 204 + ], + [ + 67, + 231 + ], + [ + 207, + 263 + ], + [ + 197, + 286 + ], + [ + 69, + 210 + ], + [ + 197, + 287 + ], + [ + 71, + 191 + ], + [ + 66, + 231 + ], + [ + 67, + 244 + ], + [ + 66, + 226 + ], + [ + 212, + 225 + ], + [ + 196, + 252 + ], + [ + 24, + 103 + ], + [ + 131, + 218 + ], + [ + 175, + 201 + ], + [ + 208, + 263 + ], + [ + 212, + 227 + ], + [ + 222, + 229 + ], + [ + 205, + 226 + ], + [ + 204, + 216 + ], + [ + 66, + 243 + ], + [ + 68, + 203 + ], + [ + 130, + 181 + ], + [ + 222, + 230 + ], + [ + 22, + 109 + ], + [ + 197, + 297 + ], + [ + 201, + 241 + ], + [ + 20, + 103 + ], + [ + 209, + 263 + ], + [ + 197, + 302 + ], + [ + 64, + 185 + ], + [ + 205, + 231 + ], + [ + 25, + 104 + ], + [ + 25, + 106 + ], + [ + 136, + 181 + ], + [ + 194, + 226 + ], + [ + 20, + 107 + ], + [ + 194, + 225 + ], + [ + 194, + 231 + ], + [ + 175, + 216 + ], + [ + 174, + 202 + ], + [ + 131, + 182 + ], + [ + 136, + 192 + ], + [ + 65, + 199 + ], + [ + 19, + 104 + ], + [ + 176, + 202 + ], + [ + 70, + 185 + ], + [ + 24, + 107 + ], + [ + 68, + 244 + ], + [ + 176, + 188 + ], + [ + 210, + 268 + ], + [ + 67, + 239 + ], + [ + 130, + 192 + ], + [ + 194, + 227 + ], + [ + 19, + 106 + ], + [ + 174, + 188 + ], + [ + 68, + 243 + ], + [ + 195, + 291 + ], + [ + 21, + 102 + ], + [ + 201, + 270 + ], + [ + 21, + 108 + ], + [ + 222, + 235 + ], + [ + 203, + 285 + ], + [ + 219, + 261 + ], + [ + 199, + 220 + ], + [ + 135, + 218 + ], + [ + 135, + 182 + ], + [ + 219, + 253 + ], + [ + 26, + 105 + ], + [ + 200, + 220 + ], + [ + 201, + 228 + ], + [ + 23, + 102 + ], + [ + 222, + 234 + ], + [ + 203, + 255 + ], + [ + 216, + 278 + ], + [ + 66, + 244 + ], + [ + 215, + 225 + ], + [ + 207, + 293 + ], + [ + 65, + 198 + ], + [ + 23, + 108 + ], + [ + 22, + 101 + ], + [ + 209, + 303 + ], + [ + 215, + 226 + ], + [ + 210, + 253 + ], + [ + 69, + 195 + ], + [ + 206, + 293 + ], + [ + 69, + 200 + ], + [ + 206, + 303 + ], + [ + 200, + 291 + ], + [ + 70, + 203 + ], + [ + 194, + 243 + ], + [ + 216, + 236 + ], + [ + 18, + 105 + ], + [ + 219, + 258 + ], + [ + 131, + 211 + ], + [ + 70, + 204 + ], + [ + 199, + 298 + ], + [ + 69, + 198 + ], + [ + 195, + 298 + ], + [ + 194, + 244 + ], + [ + 206, + 306 + ], + [ + 232, + 239 + ], + [ + 175, + 230 + ], + [ + 208, + 311 + ], + [ + 204, + 268 + ], + [ + 219, + 271 + ], + [ + 207, + 306 + ], + [ + 206, + 290 + ], + [ + 175, + 229 + ], + [ + 210, + 258 + ], + [ + 207, + 311 + ], + [ + 66, + 239 + ], + [ + 209, + 292 + ], + [ + 198, + 298 + ], + [ + 208, + 290 + ], + [ + 207, + 303 + ], + [ + 65, + 210 + ], + [ + 207, + 292 + ], + [ + 64, + 204 + ], + [ + 207, + 290 + ], + [ + 150, + 164 + ], + [ + 204, + 245 + ], + [ + 70, + 210 + ], + [ + 154, + 164 + ], + [ + 199, + 305 + ], + [ + 204, + 276 + ], + [ + 206, + 292 + ], + [ + 203, + 240 + ], + [ + 226, + 232 + ], + [ + 203, + 279 + ], + [ + 204, + 288 + ], + [ + 228, + 253 + ], + [ + 209, + 311 + ], + [ + 208, + 292 + ], + [ + 215, + 231 + ], + [ + 215, + 227 + ], + [ + 198, + 291 + ], + [ + 213, + 227 + ], + [ + 66, + 203 + ], + [ + 213, + 226 + ], + [ + 63, + 203 + ], + [ + 206, + 311 + ], + [ + 225, + 237 + ], + [ + 208, + 303 + ], + [ + 65, + 195 + ], + [ + 209, + 293 + ], + [ + 208, + 293 + ], + [ + 175, + 234 + ], + [ + 195, + 232 + ], + [ + 200, + 283 + ], + [ + 231, + 232 + ], + [ + 227, + 237 + ], + [ + 209, + 290 + ], + [ + 196, + 316 + ], + [ + 253, + 270 + ], + [ + 236, + 261 + ], + [ + 201, + 230 + ], + [ + 68, + 242 + ], + [ + 209, + 306 + ], + [ + 196, + 317 + ], + [ + 174, + 252 + ], + [ + 198, + 232 + ], + [ + 67, + 242 + ], + [ + 204, + 240 + ], + [ + 237, + 242 + ], + [ + 64, + 210 + ], + [ + 213, + 231 + ], + [ + 205, + 239 + ], + [ + 208, + 306 + ], + [ + 201, + 278 + ], + [ + 175, + 235 + ], + [ + 176, + 252 + ], + [ + 201, + 229 + ], + [ + 176, + 241 + ], + [ + 213, + 225 + ], + [ + 25, + 103 + ], + [ + 219, + 279 + ], + [ + 199, + 232 + ], + [ + 216, + 228 + ], + [ + 216, + 270 + ], + [ + 261, + 278 + ], + [ + 219, + 276 + ], + [ + 200, + 237 + ], + [ + 62, + 191 + ], + [ + 72, + 191 + ], + [ + 210, + 288 + ], + [ + 199, + 282 + ], + [ + 203, + 245 + ], + [ + 204, + 258 + ], + [ + 174, + 241 + ], + [ + 185, + 283 + ], + [ + 210, + 333 + ], + [ + 239, + 335 + ], + [ + 63, + 185 + ], + [ + 66, + 300 + ], + [ + 200, + 274 + ], + [ + 25, + 107 + ], + [ + 216, + 229 + ], + [ + 19, + 107 + ], + [ + 20, + 108 + ], + [ + 24, + 102 + ], + [ + 195, + 237 + ], + [ + 19, + 103 + ], + [ + 64, + 199 + ], + [ + 223, + 287 + ], + [ + 210, + 276 + ], + [ + 71, + 204 + ], + [ + 65, + 239 + ], + [ + 223, + 286 + ], + [ + 216, + 230 + ], + [ + 20, + 102 + ], + [ + 22, + 110 + ], + [ + 212, + 242 + ], + [ + 68, + 308 + ], + [ + 221, + 286 + ], + [ + 66, + 242 + ], + [ + 198, + 237 + ], + [ + 175, + 266 + ], + [ + 68, + 239 + ], + [ + 64, + 200 + ], + [ + 67, + 300 + ], + [ + 175, + 259 + ], + [ + 69, + 242 + ], + [ + 135, + 211 + ], + [ + 221, + 297 + ], + [ + 67, + 331 + ], + [ + 204, + 253 + ], + [ + 26, + 106 + ], + [ + 201, + 234 + ], + [ + 69, + 225 + ], + [ + 200, + 282 + ], + [ + 210, + 261 + ], + [ + 201, + 236 + ], + [ + 70, + 199 + ], + [ + 131, + 189 + ], + [ + 67, + 319 + ], + [ + 205, + 243 + ], + [ + 201, + 235 + ], + [ + 210, + 279 + ], + [ + 69, + 227 + ], + [ + 270, + 271 + ], + [ + 210, + 285 + ], + [ + 205, + 244 + ], + [ + 221, + 302 + ], + [ + 199, + 274 + ], + [ + 210, + 271 + ], + [ + 67, + 310 + ], + [ + 221, + 287 + ], + [ + 27, + 105 + ], + [ + 129, + 181 + ], + [ + 26, + 104 + ], + [ + 21, + 109 + ], + [ + 195, + 282 + ], + [ + 175, + 262 + ], + [ + 228, + 271 + ], + [ + 240, + 351 + ], + [ + 68, + 310 + ], + [ + 220, + 226 + ], + [ + 203, + 271 + ], + [ + 24, + 108 + ], + [ + 239, + 283 + ], + [ + 18, + 104 + ], + [ + 216, + 235 + ], + [ + 67, + 308 + ], + [ + 212, + 226 + ], + [ + 196, + 340 + ], + [ + 236, + 258 + ], + [ + 196, + 342 + ], + [ + 212, + 231 + ], + [ + 216, + 234 + ], + [ + 67, + 309 + ], + [ + 220, + 225 + ], + [ + 223, + 297 + ], + [ + 18, + 106 + ], + [ + 137, + 181 + ], + [ + 69, + 226 + ], + [ + 71, + 203 + ], + [ + 66, + 310 + ], + [ + 205, + 225 + ], + [ + 65, + 227 + ], + [ + 223, + 302 + ], + [ + 21, + 101 + ], + [ + 17, + 105 + ], + [ + 68, + 300 + ], + [ + 245, + 353 + ], + [ + 242, + 305 + ], + [ + 228, + 257 + ], + [ + 226, + 291 + ], + [ + 220, + 227 + ], + [ + 203, + 288 + ], + [ + 258, + 278 + ], + [ + 203, + 250 + ], + [ + 204, + 255 + ], + [ + 130, + 182 + ], + [ + 23, + 109 + ], + [ + 229, + 450 + ], + [ + 228, + 250 + ], + [ + 65, + 231 + ], + [ + 239, + 368 + ], + [ + 67, + 336 + ], + [ + 205, + 227 + ], + [ + 64, + 264 + ], + [ + 68, + 309 + ], + [ + 66, + 309 + ], + [ + 201, + 252 + ], + [ + 65, + 242 + ], + [ + 194, + 239 + ], + [ + 226, + 274 + ], + [ + 65, + 226 + ], + [ + 71, + 210 + ], + [ + 216, + 252 + ], + [ + 185, + 373 + ], + [ + 242, + 407 + ], + [ + 203, + 261 + ], + [ + 175, + 264 + ], + [ + 204, + 285 + ], + [ + 152, + 166 + ], + [ + 230, + 455 + ], + [ + 225, + 274 + ], + [ + 228, + 245 + ], + [ + 200, + 337 + ], + [ + 204, + 257 + ], + [ + 220, + 231 + ], + [ + 230, + 240 + ], + [ + 210, + 363 + ], + [ + 225, + 346 + ], + [ + 212, + 243 + ], + [ + 69, + 231 + ], + [ + 210, + 361 + ], + [ + 241, + 250 + ], + [ + 70, + 200 + ], + [ + 203, + 268 + ], + [ + 203, + 333 + ], + [ + 175, + 299 + ], + [ + 66, + 308 + ], + [ + 229, + 245 + ], + [ + 136, + 182 + ], + [ + 23, + 101 + ], + [ + 65, + 243 + ], + [ + 175, + 301 + ], + [ + 212, + 244 + ], + [ + 233, + 297 + ], + [ + 229, + 240 + ], + [ + 63, + 199 + ], + [ + 196, + 299 + ], + [ + 231, + 335 + ], + [ + 152, + 162 + ], + [ + 230, + 245 + ], + [ + 198, + 274 + ], + [ + 233, + 302 + ], + [ + 233, + 286 + ], + [ + 22, + 100 + ], + [ + 252, + 257 + ], + [ + 227, + 282 + ], + [ + 196, + 304 + ], + [ + 266, + 437 + ], + [ + 69, + 244 + ], + [ + 203, + 253 + ], + [ + 230, + 250 + ], + [ + 129, + 192 + ], + [ + 176, + 246 + ], + [ + 66, + 331 + ], + [ + 225, + 298 + ], + [ + 233, + 287 + ], + [ + 219, + 268 + ], + [ + 234, + 372 + ], + [ + 174, + 254 + ], + [ + 231, + 282 + ], + [ + 219, + 255 + ], + [ + 174, + 316 + ], + [ + 185, + 305 + ], + [ + 69, + 243 + ], + [ + 176, + 317 + ], + [ + 235, + 240 + ], + [ + 137, + 192 + ], + [ + 228, + 377 + ], + [ + 234, + 245 + ], + [ + 175, + 313 + ], + [ + 65, + 225 + ], + [ + 66, + 319 + ], + [ + 205, + 310 + ], + [ + 242, + 346 + ], + [ + 219, + 356 + ], + [ + 236, + 257 + ], + [ + 210, + 364 + ], + [ + 228, + 384 + ], + [ + 62, + 203 + ], + [ + 204, + 333 + ], + [ + 196, + 301 + ], + [ + 73, + 191 + ], + [ + 199, + 337 + ], + [ + 196, + 307 + ], + [ + 242, + 371 + ], + [ + 236, + 250 + ], + [ + 70, + 242 + ], + [ + 175, + 318 + ], + [ + 68, + 331 + ], + [ + 227, + 298 + ], + [ + 227, + 238 + ], + [ + 220, + 244 + ], + [ + 63, + 204 + ], + [ + 229, + 257 + ], + [ + 25, + 102 + ], + [ + 225, + 238 + ], + [ + 227, + 346 + ], + [ + 250, + 266 + ], + [ + 135, + 189 + ], + [ + 205, + 308 + ], + [ + 130, + 218 + ], + [ + 240, + 341 + ], + [ + 69, + 239 + ], + [ + 71, + 185 + ], + [ + 226, + 335 + ], + [ + 244, + 274 + ], + [ + 226, + 238 + ], + [ + 196, + 320 + ], + [ + 195, + 337 + ], + [ + 196, + 313 + ], + [ + 70, + 195 + ], + [ + 72, + 204 + ], + [ + 232, + 323 + ], + [ + 63, + 264 + ], + [ + 175, + 304 + ], + [ + 64, + 235 + ], + [ + 68, + 336 + ], + [ + 229, + 250 + ], + [ + 175, + 307 + ], + [ + 194, + 242 + ], + [ + 204, + 363 + ], + [ + 216, + 241 + ], + [ + 241, + 288 + ], + [ + 19, + 108 + ], + [ + 174, + 214 + ], + [ + 154, + 163 + ], + [ + 26, + 103 + ], + [ + 245, + 344 + ], + [ + 236, + 381 + ], + [ + 70, + 198 + ], + [ + 65, + 235 + ], + [ + 64, + 229 + ], + [ + 230, + 372 + ], + [ + 136, + 218 + ], + [ + 232, + 330 + ], + [ + 203, + 258 + ], + [ + 201, + 341 + ], + [ + 176, + 217 + ], + [ + 64, + 230 + ], + [ + 150, + 165 + ], + [ + 236, + 380 + ], + [ + 270, + 276 + ], + [ + 150, + 163 + ], + [ + 270, + 355 + ], + [ + 198, + 337 + ], + [ + 196, + 318 + ], + [ + 212, + 300 + ], + [ + 224, + 286 + ], + [ + 239, + 382 + ], + [ + 62, + 185 + ], + [ + 231, + 238 + ], + [ + 236, + 387 + ], + [ + 235, + 385 + ], + [ + 237, + 321 + ], + [ + 215, + 244 + ], + [ + 194, + 309 + ], + [ + 154, + 165 + ], + [ + 204, + 261 + ], + [ + 194, + 310 + ], + [ + 196, + 324 + ], + [ + 19, + 102 + ], + [ + 68, + 204 + ], + [ + 26, + 107 + ], + [ + 250, + 341 + ], + [ + 174, + 247 + ], + [ + 237, + 315 + ], + [ + 216, + 344 + ], + [ + 194, + 300 + ], + [ + 219, + 355 + ], + [ + 194, + 331 + ], + [ + 235, + 250 + ], + [ + 203, + 361 + ], + [ + 207, + 427 + ], + [ + 174, + 249 + ], + [ + 278, + 279 + ], + [ + 236, + 240 + ], + [ + 65, + 234 + ], + [ + 230, + 257 + ], + [ + 65, + 266 + ], + [ + 212, + 309 + ], + [ + 174, + 354 + ], + [ + 228, + 394 + ], + [ + 245, + 341 + ], + [ + 224, + 287 + ], + [ + 196, + 467 + ], + [ + 230, + 400 + ], + [ + 201, + 316 + ], + [ + 64, + 234 + ], + [ + 220, + 243 + ], + [ + 65, + 229 + ], + [ + 20, + 109 + ], + [ + 206, + 427 + ], + [ + 213, + 243 + ], + [ + 208, + 408 + ], + [ + 240, + 344 + ], + [ + 61, + 191 + ], + [ + 28, + 105 + ], + [ + 257, + 344 + ], + [ + 18, + 103 + ], + [ + 175, + 320 + ], + [ + 231, + 291 + ], + [ + 66, + 336 + ], + [ + 18, + 107 + ], + [ + 196, + 264 + ], + [ + 63, + 210 + ], + [ + 229, + 372 + ], + [ + 234, + 240 + ], + [ + 235, + 245 + ], + [ + 206, + 408 + ], + [ + 25, + 108 + ], + [ + 209, + 420 + ], + [ + 67, + 229 + ], + [ + 222, + 313 + ], + [ + 176, + 289 + ], + [ + 27, + 106 + ], + [ + 234, + 250 + ], + [ + 234, + 257 + ], + [ + 67, + 234 + ], + [ + 65, + 230 + ], + [ + 201, + 317 + ], + [ + 198, + 386 + ], + [ + 176, + 358 + ], + [ + 66, + 323 + ], + [ + 252, + 255 + ], + [ + 175, + 324 + ], + [ + 66, + 330 + ], + [ + 69, + 234 + ], + [ + 216, + 351 + ], + [ + 194, + 308 + ], + [ + 197, + 509 + ], + [ + 194, + 336 + ], + [ + 229, + 255 + ], + [ + 176, + 210 + ], + [ + 224, + 302 + ], + [ + 69, + 230 + ], + [ + 67, + 230 + ], + [ + 64, + 242 + ], + [ + 20, + 101 + ], + [ + 68, + 321 + ], + [ + 235, + 257 + ], + [ + 224, + 297 + ], + [ + 230, + 268 + ], + [ + 229, + 425 + ], + [ + 278, + 356 + ], + [ + 226, + 283 + ], + [ + 197, + 506 + ], + [ + 203, + 276 + ], + [ + 68, + 315 + ], + [ + 22, + 111 + ], + [ + 229, + 385 + ], + [ + 222, + 318 + ], + [ + 176, + 247 + ], + [ + 69, + 229 + ], + [ + 70, + 230 + ], + [ + 203, + 364 + ], + [ + 70, + 229 + ], + [ + 176, + 354 + ], + [ + 71, + 199 + ], + [ + 286, + 290 + ], + [ + 67, + 264 + ], + [ + 16, + 105 + ], + [ + 207, + 420 + ], + [ + 66, + 321 + ], + [ + 230, + 255 + ], + [ + 174, + 358 + ], + [ + 225, + 305 + ], + [ + 205, + 323 + ], + [ + 199, + 392 + ], + [ + 219, + 374 + ], + [ + 242, + 392 + ], + [ + 207, + 452 + ], + [ + 229, + 268 + ], + [ + 200, + 373 + ], + [ + 64, + 198 + ], + [ + 204, + 432 + ], + [ + 176, + 342 + ], + [ + 208, + 420 + ], + [ + 67, + 410 + ], + [ + 27, + 104 + ], + [ + 241, + 276 + ], + [ + 207, + 408 + ], + [ + 200, + 386 + ], + [ + 204, + 279 + ], + [ + 195, + 386 + ], + [ + 235, + 400 + ], + [ + 209, + 408 + ], + [ + 204, + 271 + ], + [ + 65, + 264 + ], + [ + 222, + 301 + ], + [ + 176, + 248 + ], + [ + 205, + 330 + ], + [ + 208, + 427 + ], + [ + 234, + 255 + ], + [ + 287, + 290 + ], + [ + 206, + 452 + ], + [ + 174, + 340 + ], + [ + 201, + 353 + ], + [ + 69, + 264 + ], + [ + 196, + 489 + ], + [ + 232, + 310 + ], + [ + 231, + 283 + ], + [ + 203, + 383 + ], + [ + 17, + 104 + ], + [ + 199, + 283 + ], + [ + 209, + 427 + ], + [ + 231, + 368 + ], + [ + 196, + 473 + ], + [ + 236, + 356 + ], + [ + 24, + 101 + ], + [ + 72, + 210 + ], + [ + 63, + 200 + ], + [ + 174, + 317 + ], + [ + 227, + 305 + ], + [ + 72, + 203 + ], + [ + 67, + 235 + ], + [ + 64, + 195 + ], + [ + 66, + 315 + ], + [ + 70, + 239 + ], + [ + 210, + 395 + ], + [ + 212, + 315 + ], + [ + 232, + 308 + ], + [ + 21, + 110 + ], + [ + 226, + 368 + ], + [ + 206, + 420 + ], + [ + 235, + 255 + ], + [ + 212, + 321 + ], + [ + 228, + 355 + ], + [ + 176, + 316 + ], + [ + 232, + 243 + ], + [ + 232, + 244 + ] + ], + "temporal_merges": [ + [ + 188, + 188, + 2 + ], + [ + 190, + 190, + 2 + ], + [ + 193, + 193, + 2 + ], + [ + 1024, + 1024, + 4 + ], + [ + 1025, + 1025, + 4 + ], + [ + 202, + 202, + 2 + ], + [ + 1026, + 1026, + 4 + ], + [ + 1029, + 1029, + 4 + ], + [ + 1027, + 1027, + 1 + ], + [ + 1024, + 188, + 4 + ], + [ + 1028, + 1028, + 1 + ], + [ + 1025, + 190, + 4 + ], + [ + 214, + 214, + 2 + ], + [ + 1030, + 1030, + 1 + ], + [ + 1026, + 193, + 4 + ], + [ + 217, + 217, + 2 + ], + [ + 188, + 188, + 4 + ], + [ + 190, + 190, + 4 + ], + [ + 193, + 193, + 4 + ], + [ + 1031, + 1031, + 1 + ], + [ + 188, + 214, + 2 + ], + [ + 1029, + 202, + 4 + ], + [ + 188, + 217, + 2 + ], + [ + 174, + 174, + 3 + ], + [ + 176, + 176, + 3 + ], + [ + 249, + 249, + 2 + ], + [ + 1024, + 214, + 4 + ], + [ + 1024, + 217, + 4 + ], + [ + 190, + 1025, + 4 + ], + [ + 214, + 188, + 2 + ], + [ + 188, + 246, + 2 + ], + [ + 248, + 248, + 2 + ], + [ + 247, + 247, + 2 + ], + [ + 262, + 262, + 2 + ], + [ + 259, + 259, + 2 + ], + [ + 249, + 202, + 2 + ], + [ + 193, + 1026, + 4 + ], + [ + 190, + 251, + 2 + ], + [ + 190, + 256, + 2 + ], + [ + 188, + 254, + 2 + ], + [ + 266, + 266, + 2 + ], + [ + 1033, + 217, + 6 + ], + [ + 1024, + 246, + 4 + ], + [ + 188, + 247, + 2 + ], + [ + 264, + 264, + 2 + ], + [ + 188, + 248, + 2 + ], + [ + 241, + 241, + 2 + ], + [ + 193, + 193, + 6 + ], + [ + 188, + 265, + 2 + ], + [ + 214, + 214, + 3 + ], + [ + 252, + 252, + 2 + ], + [ + 1025, + 190, + 6 + ], + [ + 289, + 289, + 2 + ], + [ + 67, + 67, + 1 + ], + [ + 174, + 174, + 4 + ], + [ + 1024, + 254, + 4 + ], + [ + 188, + 267, + 2 + ], + [ + 176, + 176, + 4 + ], + [ + 246, + 246, + 2 + ], + [ + 260, + 260, + 3 + ], + [ + 190, + 269, + 2 + ], + [ + 66, + 66, + 1 + ], + [ + 1025, + 251, + 4 + ], + [ + 1024, + 247, + 4 + ], + [ + 1026, + 193, + 6 + ], + [ + 1025, + 256, + 4 + ], + [ + 1024, + 248, + 4 + ], + [ + 190, + 272, + 2 + ], + [ + 190, + 273, + 2 + ], + [ + 326, + 326, + 1 + ], + [ + 1039, + 217, + 4 + ], + [ + 1033, + 214, + 6 + ], + [ + 251, + 251, + 2 + ], + [ + 1024, + 265, + 4 + ], + [ + 202, + 202, + 4 + ], + [ + 230, + 230, + 2 + ], + [ + 68, + 68, + 1 + ], + [ + 1035, + 256, + 6 + ], + [ + 229, + 229, + 2 + ], + [ + 71, + 71, + 1 + ], + [ + 190, + 295, + 2 + ], + [ + 242, + 242, + 2 + ], + [ + 65, + 65, + 1 + ], + [ + 254, + 254, + 2 + ], + [ + 1035, + 251, + 6 + ], + [ + 256, + 256, + 2 + ], + [ + 1036, + 214, + 4 + ], + [ + 70, + 70, + 1 + ], + [ + 202, + 249, + 2 + ], + [ + 267, + 267, + 2 + ], + [ + 193, + 275, + 2 + ], + [ + 1033, + 246, + 6 + ], + [ + 64, + 64, + 1 + ], + [ + 262, + 217, + 2 + ], + [ + 281, + 281, + 3 + ], + [ + 329, + 329, + 2 + ], + [ + 235, + 235, + 3 + ], + [ + 62, + 62, + 1 + ], + [ + 193, + 277, + 2 + ], + [ + 319, + 319, + 1 + ], + [ + 63, + 63, + 1 + ], + [ + 234, + 234, + 3 + ], + [ + 1024, + 267, + 4 + ], + [ + 193, + 280, + 2 + ], + [ + 193, + 260, + 2 + ], + [ + 1025, + 272, + 4 + ], + [ + 1025, + 273, + 4 + ], + [ + 190, + 312, + 2 + ], + [ + 1025, + 269, + 4 + ], + [ + 193, + 284, + 2 + ], + [ + 214, + 214, + 4 + ], + [ + 190, + 314, + 2 + ], + [ + 69, + 69, + 1 + ], + [ + 1027, + 1033, + 3 + ], + [ + 322, + 322, + 2 + ], + [ + 73, + 73, + 1 + ], + [ + 339, + 339, + 2 + ], + [ + 239, + 239, + 2 + ], + [ + 277, + 277, + 3 + ], + [ + 265, + 265, + 2 + ], + [ + 193, + 294, + 2 + ], + [ + 217, + 217, + 3 + ], + [ + 1025, + 295, + 4 + ], + [ + 196, + 196, + 2 + ], + [ + 72, + 72, + 1 + ], + [ + 193, + 296, + 2 + ], + [ + 275, + 275, + 3 + ], + [ + 193, + 281, + 2 + ], + [ + 1027, + 1033, + 1 + ], + [ + 202, + 289, + 2 + ], + [ + 283, + 283, + 2 + ], + [ + 210, + 210, + 2 + ], + [ + 315, + 315, + 2 + ], + [ + 249, + 1029, + 2 + ], + [ + 175, + 175, + 2 + ], + [ + 1035, + 273, + 6 + ], + [ + 1035, + 272, + 6 + ], + [ + 280, + 280, + 3 + ], + [ + 352, + 352, + 2 + ], + [ + 61, + 61, + 1 + ], + [ + 259, + 259, + 3 + ], + [ + 1035, + 269, + 6 + ], + [ + 325, + 325, + 2 + ], + [ + 332, + 332, + 2 + ], + [ + 1026, + 275, + 4 + ], + [ + 1025, + 312, + 4 + ], + [ + 260, + 260, + 2 + ], + [ + 188, + 1039, + 2 + ], + [ + 284, + 284, + 3 + ], + [ + 1025, + 314, + 4 + ], + [ + 321, + 321, + 2 + ], + [ + 323, + 323, + 2 + ], + [ + 251, + 251, + 3 + ], + [ + 285, + 285, + 2 + ], + [ + 304, + 304, + 2 + ], + [ + 1035, + 295, + 6 + ], + [ + 188, + 345, + 2 + ], + [ + 1033, + 254, + 6 + ], + [ + 237, + 237, + 2 + ], + [ + 307, + 307, + 2 + ], + [ + 1033, + 247, + 6 + ], + [ + 188, + 350, + 2 + ], + [ + 1033, + 248, + 6 + ], + [ + 1026, + 277, + 4 + ], + [ + 1026, + 260, + 4 + ], + [ + 272, + 272, + 2 + ], + [ + 299, + 299, + 2 + ], + [ + 378, + 378, + 2 + ], + [ + 236, + 236, + 2 + ], + [ + 288, + 288, + 2 + ], + [ + 269, + 269, + 2 + ], + [ + 347, + 347, + 2 + ], + [ + 301, + 301, + 2 + ], + [ + 273, + 273, + 2 + ], + [ + 66, + 67, + 1 + ], + [ + 330, + 330, + 2 + ], + [ + 1026, + 281, + 4 + ], + [ + 230, + 230, + 3 + ], + [ + 1040, + 217, + 2 + ], + [ + 1026, + 284, + 4 + ], + [ + 334, + 334, + 2 + ], + [ + 1026, + 280, + 4 + ], + [ + 343, + 343, + 2 + ], + [ + 327, + 327, + 2 + ], + [ + 259, + 214, + 2 + ], + [ + 216, + 216, + 2 + ], + [ + 229, + 229, + 3 + ], + [ + 309, + 309, + 2 + ], + [ + 305, + 305, + 2 + ], + [ + 270, + 270, + 2 + ], + [ + 201, + 201, + 2 + ], + [ + 1030, + 1038, + 3 + ], + [ + 1040, + 214, + 2 + ], + [ + 256, + 256, + 3 + ], + [ + 1030, + 1038, + 1 + ], + [ + 1035, + 312, + 6 + ], + [ + 1029, + 289, + 4 + ], + [ + 225, + 225, + 2 + ], + [ + 328, + 328, + 2 + ], + [ + 235, + 235, + 2 + ], + [ + 200, + 200, + 2 + ], + [ + 244, + 244, + 2 + ], + [ + 1035, + 314, + 6 + ], + [ + 188, + 365, + 2 + ], + [ + 338, + 338, + 2 + ], + [ + 174, + 174, + 5 + ], + [ + 188, + 1036, + 2 + ], + [ + 300, + 300, + 2 + ], + [ + 234, + 234, + 2 + ], + [ + 188, + 366, + 2 + ], + [ + 1026, + 294, + 4 + ], + [ + 247, + 247, + 3 + ], + [ + 248, + 248, + 3 + ], + [ + 1026, + 296, + 4 + ], + [ + 176, + 176, + 5 + ], + [ + 1027, + 1024, + 5 + ], + [ + 232, + 232, + 2 + ], + [ + 258, + 258, + 2 + ], + [ + 266, + 266, + 1 + ], + [ + 1033, + 265, + 6 + ], + [ + 64, + 65, + 1 + ], + [ + 262, + 262, + 3 + ], + [ + 253, + 253, + 2 + ], + [ + 246, + 246, + 3 + ], + [ + 360, + 360, + 2 + ], + [ + 199, + 199, + 2 + ], + [ + 243, + 243, + 2 + ], + [ + 68, + 69, + 1 + ], + [ + 1038, + 1030, + 1 + ], + [ + 202, + 349, + 2 + ], + [ + 195, + 195, + 2 + ], + [ + 294, + 294, + 2 + ], + [ + 399, + 399, + 2 + ], + [ + 296, + 296, + 2 + ], + [ + 281, + 281, + 2 + ], + [ + 188, + 188, + 1 + ], + [ + 428, + 428, + 2 + ], + [ + 357, + 357, + 2 + ], + [ + 174, + 174, + 2 + ], + [ + 269, + 190, + 2 + ], + [ + 62, + 63, + 1 + ], + [ + 1027, + 1024, + 3 + ], + [ + 176, + 176, + 2 + ], + [ + 398, + 398, + 2 + ], + [ + 277, + 277, + 4 + ], + [ + 245, + 245, + 2 + ], + [ + 326, + 326, + 2 + ], + [ + 275, + 275, + 2 + ], + [ + 227, + 227, + 2 + ], + [ + 254, + 254, + 3 + ], + [ + 1029, + 249, + 4 + ], + [ + 70, + 71, + 1 + ], + [ + 261, + 261, + 2 + ], + [ + 264, + 264, + 1 + ], + [ + 251, + 251, + 4 + ], + [ + 278, + 278, + 2 + ], + [ + 228, + 228, + 2 + ], + [ + 205, + 205, + 2 + ], + [ + 74, + 74, + 1 + ], + [ + 280, + 280, + 2 + ], + [ + 240, + 240, + 2 + ], + [ + 317, + 317, + 2 + ], + [ + 313, + 313, + 2 + ], + [ + 217, + 188, + 2 + ], + [ + 1033, + 267, + 6 + ], + [ + 241, + 241, + 3 + ], + [ + 410, + 410, + 1 + ], + [ + 316, + 316, + 2 + ], + [ + 1040, + 246, + 2 + ], + [ + 320, + 320, + 2 + ], + [ + 308, + 308, + 2 + ], + [ + 359, + 359, + 2 + ], + [ + 1041, + 256, + 2 + ], + [ + 249, + 352, + 2 + ], + [ + 413, + 413, + 2 + ], + [ + 348, + 348, + 2 + ], + [ + 390, + 390, + 2 + ], + [ + 251, + 190, + 2 + ], + [ + 217, + 322, + 2 + ], + [ + 438, + 438, + 2 + ], + [ + 226, + 226, + 2 + ], + [ + 1036, + 1036, + 4 + ], + [ + 1024, + 345, + 4 + ], + [ + 370, + 370, + 2 + ], + [ + 454, + 454, + 1 + ], + [ + 279, + 279, + 2 + ], + [ + 60, + 60, + 1 + ], + [ + 1024, + 350, + 4 + ], + [ + 466, + 466, + 1 + ], + [ + 419, + 419, + 2 + ], + [ + 273, + 190, + 2 + ], + [ + 1041, + 269, + 2 + ], + [ + 257, + 257, + 2 + ], + [ + 260, + 260, + 4 + ], + [ + 202, + 367, + 2 + ], + [ + 418, + 418, + 2 + ], + [ + 65, + 66, + 1 + ], + [ + 272, + 190, + 2 + ], + [ + 284, + 284, + 4 + ], + [ + 242, + 242, + 1 + ], + [ + 451, + 451, + 2 + ], + [ + 72, + 71, + 1 + ], + [ + 256, + 190, + 2 + ], + [ + 202, + 354, + 2 + ], + [ + 204, + 204, + 2 + ], + [ + 406, + 406, + 2 + ], + [ + 198, + 198, + 2 + ], + [ + 430, + 430, + 2 + ], + [ + 369, + 369, + 2 + ], + [ + 271, + 271, + 2 + ], + [ + 202, + 358, + 2 + ], + [ + 268, + 268, + 2 + ], + [ + 1049, + 249, + 4 + ], + [ + 331, + 331, + 1 + ], + [ + 422, + 422, + 2 + ], + [ + 252, + 252, + 3 + ], + [ + 246, + 188, + 2 + ], + [ + 480, + 480, + 2 + ], + [ + 193, + 193, + 1 + ], + [ + 319, + 319, + 2 + ], + [ + 202, + 376, + 2 + ], + [ + 214, + 214, + 1 + ], + [ + 1040, + 247, + 2 + ], + [ + 1041, + 272, + 2 + ], + [ + 444, + 444, + 2 + ], + [ + 433, + 433, + 2 + ], + [ + 1041, + 273, + 2 + ], + [ + 174, + 174, + 6 + ], + [ + 324, + 324, + 2 + ], + [ + 440, + 440, + 2 + ], + [ + 1045, + 289, + 6 + ], + [ + 318, + 318, + 2 + ], + [ + 1040, + 248, + 2 + ], + [ + 217, + 262, + 2 + ], + [ + 1027, + 214, + 3 + ], + [ + 336, + 336, + 1 + ], + [ + 1024, + 365, + 4 + ], + [ + 185, + 185, + 2 + ], + [ + 310, + 310, + 2 + ], + [ + 1024, + 366, + 4 + ], + [ + 219, + 219, + 2 + ], + [ + 436, + 436, + 2 + ], + [ + 1027, + 214, + 1 + ], + [ + 67, + 68, + 1 + ], + [ + 234, + 234, + 4 + ], + [ + 231, + 231, + 2 + ], + [ + 235, + 235, + 4 + ], + [ + 1038, + 275, + 6 + ], + [ + 176, + 176, + 6 + ], + [ + 276, + 276, + 2 + ], + [ + 1040, + 254, + 2 + ], + [ + 247, + 188, + 2 + ], + [ + 1024, + 1039, + 4 + ], + [ + 248, + 188, + 2 + ], + [ + 1047, + 1047, + 2 + ], + [ + 1041, + 251, + 2 + ], + [ + 266, + 266, + 3 + ], + [ + 254, + 188, + 2 + ], + [ + 478, + 478, + 1 + ], + [ + 265, + 265, + 3 + ], + [ + 181, + 181, + 1 + ], + [ + 412, + 412, + 2 + ], + [ + 371, + 371, + 2 + ], + [ + 362, + 362, + 2 + ], + [ + 446, + 446, + 2 + ], + [ + 230, + 230, + 4 + ], + [ + 70, + 69, + 1 + ], + [ + 250, + 250, + 2 + ], + [ + 448, + 448, + 2 + ], + [ + 62, + 61, + 1 + ], + [ + 262, + 329, + 2 + ], + [ + 1028, + 256, + 3 + ], + [ + 1029, + 349, + 4 + ], + [ + 332, + 332, + 3 + ], + [ + 229, + 229, + 4 + ], + [ + 396, + 396, + 2 + ], + [ + 64, + 63, + 1 + ], + [ + 217, + 217, + 4 + ], + [ + 190, + 379, + 2 + ], + [ + 286, + 286, + 2 + ], + [ + 1028, + 256, + 1 + ], + [ + 269, + 269, + 3 + ], + [ + 416, + 416, + 2 + ], + [ + 260, + 193, + 2 + ], + [ + 1048, + 1048, + 2 + ], + [ + 294, + 193, + 2 + ], + [ + 241, + 241, + 1 + ], + [ + 267, + 267, + 3 + ], + [ + 194, + 194, + 2 + ], + [ + 402, + 402, + 2 + ], + [ + 325, + 214, + 2 + ], + [ + 457, + 457, + 2 + ], + [ + 264, + 264, + 3 + ], + [ + 239, + 239, + 1 + ], + [ + 296, + 193, + 2 + ], + [ + 404, + 404, + 2 + ], + [ + 280, + 193, + 2 + ], + [ + 255, + 255, + 2 + ], + [ + 287, + 287, + 2 + ], + [ + 295, + 295, + 2 + ], + [ + 1028, + 251, + 3 + ], + [ + 272, + 272, + 3 + ], + [ + 340, + 340, + 2 + ], + [ + 1039, + 1039, + 4 + ], + [ + 220, + 220, + 2 + ], + [ + 354, + 354, + 2 + ], + [ + 442, + 442, + 2 + ], + [ + 190, + 388, + 2 + ], + [ + 1027, + 214, + 5 + ], + [ + 304, + 304, + 3 + ], + [ + 1028, + 256, + 5 + ], + [ + 1038, + 277, + 6 + ], + [ + 1038, + 281, + 6 + ], + [ + 434, + 434, + 2 + ], + [ + 417, + 417, + 2 + ], + [ + 273, + 273, + 3 + ], + [ + 297, + 297, + 2 + ], + [ + 342, + 342, + 2 + ], + [ + 299, + 299, + 3 + ], + [ + 182, + 182, + 1 + ], + [ + 1041, + 295, + 2 + ], + [ + 214, + 259, + 2 + ], + [ + 315, + 315, + 1 + ], + [ + 1045, + 249, + 6 + ], + [ + 382, + 382, + 2 + ], + [ + 1025, + 379, + 4 + ], + [ + 72, + 73, + 1 + ], + [ + 1028, + 251, + 1 + ], + [ + 1028, + 251, + 5 + ], + [ + 307, + 307, + 3 + ], + [ + 1027, + 217, + 5 + ], + [ + 381, + 381, + 2 + ], + [ + 1027, + 217, + 3 + ], + [ + 358, + 358, + 2 + ], + [ + 374, + 374, + 2 + ], + [ + 1038, + 284, + 6 + ], + [ + 109, + 109, + 1 + ], + [ + 1040, + 265, + 2 + ], + [ + 210, + 210, + 1 + ], + [ + 283, + 283, + 1 + ], + [ + 275, + 275, + 4 + ], + [ + 277, + 277, + 2 + ], + [ + 1056, + 247, + 4 + ], + [ + 323, + 323, + 1 + ], + [ + 252, + 252, + 1 + ], + [ + 1038, + 260, + 6 + ], + [ + 375, + 375, + 2 + ], + [ + 465, + 465, + 2 + ], + [ + 1055, + 248, + 4 + ], + [ + 301, + 301, + 3 + ], + [ + 1042, + 280, + 2 + ], + [ + 294, + 294, + 3 + ], + [ + 343, + 343, + 3 + ], + [ + 392, + 392, + 2 + ], + [ + 1025, + 388, + 4 + ], + [ + 202, + 397, + 2 + ], + [ + 174, + 174, + 7 + ], + [ + 296, + 296, + 3 + ], + [ + 1076, + 289, + 4 + ], + [ + 1040, + 267, + 2 + ], + [ + 302, + 302, + 2 + ], + [ + 373, + 373, + 2 + ], + [ + 265, + 188, + 2 + ], + [ + 328, + 214, + 2 + ], + [ + 212, + 212, + 2 + ], + [ + 432, + 432, + 2 + ], + [ + 281, + 281, + 4 + ], + [ + 327, + 327, + 3 + ], + [ + 190, + 401, + 2 + ], + [ + 202, + 1059, + 2 + ], + [ + 1041, + 312, + 2 + ], + [ + 259, + 254, + 2 + ], + [ + 267, + 188, + 2 + ], + [ + 510, + 510, + 2 + ], + [ + 201, + 201, + 3 + ], + [ + 176, + 176, + 7 + ], + [ + 217, + 217, + 1 + ], + [ + 352, + 249, + 2 + ], + [ + 262, + 246, + 2 + ], + [ + 17, + 17, + 1 + ], + [ + 321, + 321, + 1 + ], + [ + 253, + 253, + 3 + ], + [ + 1027, + 217, + 1 + ], + [ + 66, + 66, + 2 + ], + [ + 1038, + 280, + 6 + ], + [ + 208, + 208, + 2 + ], + [ + 1041, + 314, + 2 + ], + [ + 347, + 246, + 2 + ], + [ + 1033, + 1027, + 1 + ], + [ + 106, + 106, + 1 + ], + [ + 259, + 1036, + 2 + ], + [ + 236, + 236, + 3 + ], + [ + 237, + 237, + 1 + ], + [ + 259, + 339, + 2 + ], + [ + 256, + 256, + 4 + ], + [ + 275, + 193, + 2 + ], + [ + 314, + 190, + 2 + ], + [ + 258, + 258, + 3 + ], + [ + 322, + 329, + 2 + ], + [ + 349, + 349, + 2 + ], + [ + 214, + 1024, + 2 + ], + [ + 292, + 292, + 2 + ], + [ + 1029, + 367, + 4 + ], + [ + 277, + 193, + 2 + ], + [ + 295, + 190, + 2 + ], + [ + 100, + 100, + 1 + ], + [ + 393, + 393, + 2 + ], + [ + 232, + 205, + 2 + ], + [ + 330, + 330, + 1 + ], + [ + 312, + 190, + 2 + ], + [ + 383, + 383, + 2 + ], + [ + 175, + 175, + 3 + ], + [ + 313, + 313, + 3 + ], + [ + 244, + 244, + 1 + ], + [ + 284, + 193, + 2 + ], + [ + 1029, + 376, + 4 + ], + [ + 508, + 508, + 2 + ], + [ + 325, + 325, + 3 + ], + [ + 1044, + 1027, + 1 + ], + [ + 216, + 216, + 3 + ], + [ + 334, + 334, + 3 + ], + [ + 1028, + 1035, + 1 + ], + [ + 202, + 1049, + 2 + ], + [ + 70, + 70, + 2 + ], + [ + 337, + 337, + 2 + ], + [ + 1027, + 1044, + 3 + ], + [ + 67, + 67, + 2 + ], + [ + 68, + 68, + 2 + ], + [ + 1025, + 401, + 4 + ], + [ + 389, + 389, + 2 + ], + [ + 1028, + 1035, + 3 + ], + [ + 391, + 391, + 2 + ], + [ + 305, + 305, + 1 + ], + [ + 357, + 214, + 2 + ], + [ + 209, + 209, + 2 + ], + [ + 320, + 320, + 3 + ], + [ + 394, + 394, + 2 + ], + [ + 476, + 476, + 2 + ], + [ + 1042, + 260, + 2 + ], + [ + 203, + 203, + 2 + ], + [ + 328, + 328, + 3 + ], + [ + 60, + 61, + 1 + ], + [ + 429, + 429, + 2 + ], + [ + 461, + 461, + 2 + ], + [ + 487, + 487, + 2 + ], + [ + 1029, + 354, + 4 + ], + [ + 284, + 284, + 2 + ], + [ + 360, + 360, + 3 + ], + [ + 475, + 475, + 2 + ], + [ + 338, + 338, + 3 + ], + [ + 285, + 285, + 1 + ], + [ + 367, + 367, + 2 + ], + [ + 327, + 214, + 2 + ], + [ + 348, + 214, + 2 + ], + [ + 1038, + 296, + 6 + ], + [ + 502, + 502, + 2 + ], + [ + 270, + 270, + 3 + ], + [ + 281, + 193, + 2 + ], + [ + 355, + 355, + 2 + ], + [ + 1038, + 294, + 6 + ], + [ + 411, + 411, + 2 + ], + [ + 74, + 73, + 1 + ], + [ + 22, + 22, + 1 + ], + [ + 234, + 234, + 5 + ], + [ + 1042, + 275, + 2 + ], + [ + 1027, + 1044, + 1 + ], + [ + 1029, + 358, + 4 + ], + [ + 243, + 243, + 1 + ], + [ + 261, + 261, + 3 + ], + [ + 75, + 75, + 1 + ], + [ + 485, + 485, + 2 + ], + [ + 1047, + 174, + 6 + ], + [ + 346, + 346, + 2 + ], + [ + 356, + 356, + 2 + ], + [ + 322, + 217, + 2 + ], + [ + 481, + 481, + 2 + ], + [ + 65, + 65, + 2 + ], + [ + 269, + 269, + 4 + ], + [ + 551, + 551, + 2 + ], + [ + 378, + 378, + 1 + ], + [ + 188, + 188, + 3 + ], + [ + 248, + 248, + 4 + ], + [ + 1025, + 414, + 4 + ], + [ + 272, + 272, + 4 + ], + [ + 247, + 247, + 4 + ], + [ + 235, + 235, + 5 + ], + [ + 1042, + 294, + 2 + ], + [ + 240, + 240, + 3 + ], + [ + 1027, + 246, + 3 + ], + [ + 1042, + 277, + 2 + ], + [ + 1024, + 1036, + 4 + ], + [ + 359, + 217, + 2 + ], + [ + 190, + 414, + 2 + ], + [ + 105, + 105, + 1 + ], + [ + 1042, + 296, + 2 + ], + [ + 102, + 102, + 1 + ], + [ + 1027, + 246, + 5 + ], + [ + 339, + 339, + 3 + ], + [ + 309, + 309, + 1 + ], + [ + 1059, + 249, + 4 + ], + [ + 228, + 228, + 3 + ], + [ + 464, + 464, + 2 + ], + [ + 415, + 415, + 2 + ], + [ + 364, + 364, + 2 + ], + [ + 506, + 506, + 2 + ], + [ + 1077, + 1077, + 2 + ], + [ + 329, + 329, + 3 + ], + [ + 273, + 273, + 4 + ], + [ + 108, + 108, + 1 + ], + [ + 597, + 597, + 1 + ], + [ + 1050, + 1027, + 1 + ], + [ + 1048, + 176, + 6 + ], + [ + 335, + 335, + 2 + ], + [ + 197, + 197, + 2 + ], + [ + 245, + 245, + 3 + ], + [ + 324, + 324, + 3 + ], + [ + 318, + 318, + 3 + ], + [ + 1093, + 326, + 2 + ], + [ + 1027, + 1050, + 1 + ], + [ + 69, + 69, + 2 + ], + [ + 280, + 280, + 4 + ], + [ + 333, + 333, + 2 + ], + [ + 200, + 200, + 1 + ], + [ + 28, + 28, + 1 + ], + [ + 188, + 262, + 2 + ], + [ + 1042, + 284, + 2 + ], + [ + 110, + 110, + 1 + ], + [ + 1035, + 1028, + 1 + ], + [ + 249, + 249, + 4 + ], + [ + 1027, + 1051, + 3 + ], + [ + 300, + 300, + 1 + ], + [ + 251, + 251, + 5 + ], + [ + 260, + 260, + 5 + ], + [ + 363, + 363, + 2 + ], + [ + 225, + 225, + 1 + ], + [ + 368, + 368, + 2 + ], + [ + 1103, + 71, + 2 + ], + [ + 1031, + 1045, + 1 + ], + [ + 230, + 230, + 5 + ], + [ + 190, + 426, + 2 + ], + [ + 1057, + 262, + 4 + ], + [ + 1027, + 1051, + 1 + ], + [ + 509, + 509, + 2 + ], + [ + 398, + 398, + 1 + ], + [ + 1030, + 1026, + 5 + ], + [ + 288, + 288, + 3 + ], + [ + 452, + 452, + 2 + ], + [ + 361, + 361, + 2 + ], + [ + 202, + 202, + 1 + ], + [ + 63, + 64, + 1 + ], + [ + 278, + 278, + 3 + ], + [ + 229, + 229, + 5 + ], + [ + 190, + 431, + 2 + ], + [ + 463, + 463, + 2 + ], + [ + 370, + 370, + 3 + ], + [ + 1028, + 273, + 3 + ], + [ + 1025, + 426, + 4 + ], + [ + 65, + 1085, + 1 + ], + [ + 395, + 395, + 2 + ], + [ + 1033, + 345, + 6 + ], + [ + 1028, + 273, + 1 + ], + [ + 334, + 217, + 2 + ], + [ + 1024, + 1024, + 1 + ], + [ + 271, + 271, + 3 + ], + [ + 1033, + 350, + 6 + ], + [ + 1049, + 1049, + 4 + ], + [ + 1029, + 397, + 4 + ], + [ + 317, + 317, + 3 + ], + [ + 353, + 353, + 3 + ], + [ + 59, + 59, + 1 + ], + [ + 1028, + 273, + 5 + ], + [ + 1058, + 259, + 4 + ], + [ + 1024, + 188, + 1 + ], + [ + 1042, + 281, + 2 + ], + [ + 493, + 493, + 2 + ], + [ + 316, + 316, + 3 + ], + [ + 498, + 498, + 2 + ], + [ + 232, + 232, + 1 + ], + [ + 196, + 196, + 3 + ], + [ + 1027, + 246, + 1 + ], + [ + 1025, + 431, + 4 + ], + [ + 1031, + 1045, + 3 + ], + [ + 470, + 470, + 2 + ], + [ + 103, + 103, + 1 + ], + [ + 436, + 289, + 2 + ], + [ + 561, + 561, + 1 + ], + [ + 312, + 312, + 2 + ], + [ + 471, + 471, + 2 + ], + [ + 422, + 422, + 1 + ], + [ + 459, + 459, + 2 + ], + [ + 332, + 332, + 4 + ], + [ + 238, + 238, + 2 + ], + [ + 1028, + 272, + 5 + ], + [ + 18, + 18, + 1 + ], + [ + 27, + 27, + 1 + ], + [ + 1028, + 272, + 1 + ], + [ + 195, + 195, + 1 + ], + [ + 445, + 445, + 2 + ], + [ + 101, + 101, + 1 + ], + [ + 338, + 217, + 2 + ], + [ + 503, + 503, + 2 + ], + [ + 380, + 380, + 2 + ], + [ + 107, + 107, + 1 + ], + [ + 279, + 279, + 3 + ], + [ + 1027, + 1046, + 3 + ], + [ + 1028, + 269, + 1 + ], + [ + 336, + 336, + 2 + ], + [ + 331, + 331, + 2 + ], + [ + 351, + 351, + 3 + ], + [ + 483, + 483, + 2 + ], + [ + 269, + 251, + 1 + ], + [ + 413, + 413, + 1 + ], + [ + 635, + 635, + 1 + ], + [ + 486, + 486, + 2 + ], + [ + 256, + 256, + 5 + ], + [ + 516, + 516, + 2 + ], + [ + 1139, + 73, + 2 + ], + [ + 295, + 295, + 3 + ], + [ + 526, + 526, + 2 + ], + [ + 1028, + 269, + 5 + ], + [ + 569, + 569, + 2 + ], + [ + 319, + 410, + 1 + ], + [ + 266, + 438, + 2 + ], + [ + 570, + 570, + 2 + ], + [ + 199, + 199, + 1 + ], + [ + 437, + 437, + 2 + ], + [ + 314, + 314, + 2 + ], + [ + 64, + 1106, + 1 + ], + [ + 504, + 504, + 2 + ], + [ + 1027, + 1050, + 3 + ], + [ + 1028, + 272, + 3 + ], + [ + 1027, + 188, + 5 + ], + [ + 246, + 217, + 2 + ], + [ + 1026, + 409, + 4 + ], + [ + 327, + 248, + 2 + ], + [ + 193, + 403, + 2 + ], + [ + 276, + 276, + 3 + ], + [ + 535, + 535, + 2 + ], + [ + 26, + 26, + 1 + ], + [ + 214, + 1044, + 2 + ], + [ + 23, + 23, + 1 + ], + [ + 328, + 247, + 2 + ], + [ + 500, + 500, + 2 + ], + [ + 322, + 322, + 3 + ], + [ + 377, + 377, + 2 + ], + [ + 193, + 409, + 2 + ], + [ + 405, + 405, + 2 + ], + [ + 242, + 242, + 3 + ], + [ + 433, + 433, + 1 + ], + [ + 194, + 212, + 2 + ], + [ + 241, + 241, + 4 + ], + [ + 1028, + 269, + 3 + ], + [ + 492, + 492, + 2 + ], + [ + 505, + 505, + 2 + ], + [ + 1026, + 403, + 4 + ], + [ + 254, + 259, + 2 + ], + [ + 262, + 1039, + 2 + ], + [ + 285, + 285, + 3 + ], + [ + 16, + 16, + 1 + ], + [ + 1036, + 188, + 4 + ], + [ + 407, + 407, + 2 + ], + [ + 210, + 210, + 3 + ], + [ + 219, + 219, + 3 + ], + [ + 308, + 308, + 1 + ], + [ + 69, + 70, + 1 + ], + [ + 251, + 269, + 1 + ], + [ + 349, + 202, + 2 + ], + [ + 362, + 217, + 2 + ], + [ + 191, + 191, + 2 + ], + [ + 634, + 634, + 1 + ], + [ + 227, + 227, + 1 + ], + [ + 347, + 265, + 2 + ], + [ + 387, + 387, + 2 + ], + [ + 294, + 294, + 4 + ], + [ + 480, + 620, + 2 + ], + [ + 1077, + 67, + 2 + ], + [ + 71, + 71, + 2 + ], + [ + 226, + 226, + 1 + ], + [ + 1027, + 1065, + 1 + ], + [ + 293, + 293, + 2 + ], + [ + 268, + 268, + 3 + ], + [ + 216, + 216, + 1 + ], + [ + 497, + 497, + 2 + ], + [ + 1027, + 1046, + 5 + ], + [ + 466, + 326, + 1 + ], + [ + 609, + 609, + 2 + ], + [ + 418, + 418, + 1 + ], + [ + 375, + 214, + 2 + ], + [ + 128, + 128, + 1 + ], + [ + 660, + 660, + 1 + ], + [ + 341, + 341, + 3 + ], + [ + 514, + 514, + 2 + ], + [ + 260, + 280, + 1 + ], + [ + 384, + 384, + 2 + ], + [ + 222, + 222, + 2 + ], + [ + 621, + 621, + 1 + ], + [ + 1033, + 366, + 6 + ], + [ + 1033, + 365, + 6 + ], + [ + 64, + 64, + 2 + ], + [ + 419, + 419, + 1 + ], + [ + 296, + 296, + 4 + ], + [ + 1030, + 275, + 3 + ], + [ + 299, + 299, + 4 + ], + [ + 264, + 428, + 2 + ], + [ + 376, + 376, + 2 + ], + [ + 24, + 24, + 1 + ], + [ + 1030, + 275, + 1 + ], + [ + 1027, + 247, + 1 + ], + [ + 528, + 528, + 2 + ], + [ + 1074, + 252, + 4 + ], + [ + 1035, + 379, + 6 + ], + [ + 519, + 519, + 2 + ], + [ + 325, + 265, + 2 + ], + [ + 1030, + 275, + 5 + ], + [ + 202, + 1076, + 2 + ], + [ + 340, + 340, + 3 + ], + [ + 1027, + 248, + 1 + ], + [ + 446, + 446, + 1 + ], + [ + 512, + 512, + 2 + ], + [ + 586, + 586, + 1 + ], + [ + 104, + 104, + 1 + ], + [ + 19, + 19, + 1 + ], + [ + 304, + 304, + 4 + ], + [ + 254, + 214, + 2 + ], + [ + 423, + 423, + 2 + ], + [ + 339, + 259, + 2 + ], + [ + 198, + 198, + 1 + ], + [ + 472, + 472, + 2 + ], + [ + 359, + 359, + 3 + ], + [ + 66, + 67, + 2 + ], + [ + 307, + 307, + 4 + ], + [ + 196, + 196, + 1 + ], + [ + 1064, + 266, + 4 + ], + [ + 288, + 288, + 1 + ], + [ + 62, + 1124, + 1 + ], + [ + 390, + 390, + 1 + ], + [ + 424, + 424, + 2 + ], + [ + 1065, + 1027, + 1 + ], + [ + 585, + 585, + 1 + ], + [ + 306, + 306, + 2 + ], + [ + 280, + 260, + 1 + ], + [ + 584, + 584, + 1 + ], + [ + 582, + 582, + 1 + ], + [ + 412, + 249, + 2 + ], + [ + 310, + 310, + 1 + ], + [ + 255, + 255, + 3 + ], + [ + 444, + 444, + 1 + ], + [ + 430, + 430, + 1 + ], + [ + 603, + 603, + 2 + ], + [ + 1030, + 280, + 1 + ], + [ + 193, + 447, + 2 + ], + [ + 315, + 315, + 3 + ], + [ + 1070, + 241, + 4 + ], + [ + 1040, + 345, + 2 + ], + [ + 325, + 1036, + 2 + ], + [ + 234, + 234, + 6 + ], + [ + 1027, + 1044, + 5 + ], + [ + 62, + 1163, + 1 + ], + [ + 99, + 99, + 1 + ], + [ + 357, + 357, + 3 + ], + [ + 348, + 348, + 3 + ], + [ + 416, + 416, + 1 + ], + [ + 257, + 257, + 3 + ], + [ + 201, + 201, + 4 + ], + [ + 205, + 205, + 1 + ], + [ + 343, + 343, + 4 + ], + [ + 342, + 342, + 3 + ], + [ + 536, + 536, + 2 + ], + [ + 63, + 63, + 2 + ], + [ + 1026, + 447, + 4 + ], + [ + 138, + 138, + 1 + ], + [ + 460, + 460, + 2 + ], + [ + 537, + 537, + 2 + ], + [ + 253, + 253, + 4 + ], + [ + 1033, + 1024, + 1 + ], + [ + 456, + 456, + 2 + ], + [ + 369, + 254, + 2 + ], + [ + 440, + 440, + 1 + ], + [ + 1027, + 247, + 5 + ], + [ + 1035, + 388, + 6 + ], + [ + 477, + 477, + 2 + ], + [ + 1027, + 248, + 5 + ], + [ + 596, + 596, + 1 + ], + [ + 421, + 421, + 2 + ], + [ + 301, + 301, + 4 + ], + [ + 588, + 588, + 1 + ], + [ + 577, + 577, + 2 + ], + [ + 188, + 259, + 2 + ], + [ + 1040, + 350, + 2 + ], + [ + 246, + 262, + 2 + ], + [ + 399, + 399, + 1 + ], + [ + 223, + 223, + 2 + ], + [ + 1030, + 260, + 1 + ], + [ + 1068, + 264, + 4 + ], + [ + 289, + 289, + 3 + ], + [ + 212, + 237, + 2 + ], + [ + 235, + 235, + 6 + ], + [ + 277, + 277, + 5 + ], + [ + 469, + 469, + 2 + ], + [ + 1045, + 1031, + 1 + ], + [ + 344, + 344, + 3 + ], + [ + 193, + 435, + 2 + ], + [ + 1027, + 1024, + 1 + ], + [ + 231, + 231, + 1 + ], + [ + 439, + 439, + 2 + ], + [ + 193, + 174, + 2 + ], + [ + 193, + 441, + 2 + ], + [ + 166, + 166, + 2 + ], + [ + 322, + 322, + 1 + ], + [ + 548, + 548, + 2 + ], + [ + 443, + 443, + 2 + ], + [ + 702, + 702, + 2 + ], + [ + 1078, + 174, + 2 + ], + [ + 1026, + 441, + 4 + ], + [ + 214, + 254, + 2 + ], + [ + 679, + 679, + 1 + ], + [ + 1028, + 256, + 7 + ], + [ + 668, + 668, + 1 + ], + [ + 352, + 352, + 3 + ], + [ + 449, + 449, + 2 + ], + [ + 1100, + 68, + 2 + ], + [ + 578, + 578, + 2 + ], + [ + 1027, + 247, + 3 + ], + [ + 258, + 258, + 4 + ], + [ + 313, + 313, + 4 + ], + [ + 1033, + 1024, + 3 + ], + [ + 490, + 490, + 2 + ], + [ + 162, + 162, + 2 + ], + [ + 1026, + 435, + 4 + ], + [ + 457, + 457, + 1 + ], + [ + 1082, + 246, + 4 + ], + [ + 1051, + 1027, + 1 + ], + [ + 206, + 206, + 2 + ], + [ + 579, + 579, + 1 + ], + [ + 207, + 207, + 2 + ], + [ + 193, + 176, + 2 + ], + [ + 1027, + 1046, + 1 + ], + [ + 1027, + 248, + 3 + ], + [ + 215, + 215, + 2 + ], + [ + 517, + 517, + 2 + ], + [ + 321, + 321, + 3 + ], + [ + 1030, + 277, + 1 + ], + [ + 283, + 232, + 2 + ], + [ + 1028, + 312, + 1 + ], + [ + 252, + 252, + 4 + ], + [ + 236, + 236, + 4 + ], + [ + 1081, + 176, + 2 + ], + [ + 250, + 250, + 3 + ], + [ + 386, + 386, + 2 + ], + [ + 338, + 248, + 2 + ], + [ + 1085, + 66, + 2 + ], + [ + 202, + 539, + 2 + ], + [ + 201, + 201, + 1 + ], + [ + 269, + 251, + 2 + ], + [ + 334, + 247, + 2 + ], + [ + 1119, + 329, + 4 + ], + [ + 465, + 465, + 1 + ], + [ + 225, + 225, + 3 + ], + [ + 1028, + 314, + 1 + ], + [ + 175, + 175, + 4 + ], + [ + 221, + 221, + 2 + ], + [ + 272, + 272, + 5 + ], + [ + 538, + 538, + 2 + ], + [ + 454, + 454, + 2 + ], + [ + 190, + 174, + 2 + ], + [ + 320, + 320, + 4 + ], + [ + 204, + 204, + 1 + ], + [ + 1030, + 260, + 5 + ], + [ + 259, + 259, + 4 + ], + [ + 360, + 385, + 2 + ], + [ + 230, + 230, + 6 + ], + [ + 347, + 347, + 3 + ], + [ + 214, + 327, + 2 + ], + [ + 1026, + 458, + 4 + ], + [ + 281, + 281, + 5 + ], + [ + 396, + 396, + 3 + ], + [ + 1028, + 295, + 5 + ], + [ + 214, + 328, + 2 + ], + [ + 239, + 239, + 3 + ], + [ + 1095, + 1027, + 1 + ], + [ + 323, + 323, + 3 + ], + [ + 613, + 613, + 1 + ], + [ + 345, + 188, + 2 + ], + [ + 267, + 267, + 4 + ], + [ + 592, + 592, + 2 + ], + [ + 229, + 229, + 6 + ], + [ + 240, + 332, + 2 + ], + [ + 1046, + 1027, + 1 + ], + [ + 202, + 545, + 2 + ], + [ + 1030, + 284, + 1 + ], + [ + 68, + 69, + 2 + ], + [ + 1028, + 312, + 5 + ], + [ + 290, + 290, + 2 + ], + [ + 541, + 541, + 2 + ], + [ + 722, + 722, + 1 + ], + [ + 21, + 21, + 1 + ], + [ + 249, + 349, + 2 + ], + [ + 309, + 309, + 3 + ], + [ + 402, + 402, + 3 + ], + [ + 1035, + 401, + 6 + ], + [ + 251, + 269, + 2 + ], + [ + 1033, + 1033, + 1 + ], + [ + 348, + 246, + 2 + ], + [ + 244, + 244, + 3 + ], + [ + 1040, + 366, + 2 + ], + [ + 261, + 261, + 4 + ], + [ + 174, + 1047, + 2 + ], + [ + 1027, + 188, + 3 + ], + [ + 1098, + 289, + 2 + ], + [ + 65, + 66, + 2 + ], + [ + 129, + 129, + 1 + ], + [ + 71, + 70, + 1 + ], + [ + 410, + 319, + 1 + ], + [ + 637, + 637, + 1 + ], + [ + 392, + 305, + 2 + ], + [ + 193, + 458, + 2 + ], + [ + 275, + 275, + 5 + ], + [ + 188, + 217, + 1 + ], + [ + 273, + 273, + 5 + ], + [ + 370, + 245, + 2 + ], + [ + 1040, + 1134, + 2 + ], + [ + 1028, + 314, + 5 + ], + [ + 214, + 325, + 2 + ], + [ + 176, + 1048, + 2 + ] + ] +} diff --git a/variants/extended-1st-10mm-2k/profiles/joint/primitives.npz b/variants/extended-1st-10mm-2k/profiles/joint/primitives.npz index 1bfcb546b8dfda088eefb623ab59fa79ebfed288..fca3682bc570414725b0be9cf5578ee0df57f06a 100644 --- a/variants/extended-1st-10mm-2k/profiles/joint/primitives.npz +++ b/variants/extended-1st-10mm-2k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7 +oid sha256:8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1 size 2834 diff --git a/variants/extended-1st-10mm-2k/router_config.yaml b/variants/extended-1st-10mm-2k/router_config.yaml index aed73e17a2de8d98004a556182c945cbeaace14d..8612573a5cb11b6f4b4cf2713b7ad51ac4dbd7a5 100644 --- a/variants/extended-1st-10mm-2k/router_config.yaml +++ b/variants/extended-1st-10mm-2k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-10mm-4k/config.json b/variants/extended-1st-10mm-4k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-10mm-4k/config.json +++ b/variants/extended-1st-10mm-4k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-10mm-4k/profiles/eef/bpe.json b/variants/extended-1st-10mm-4k/profiles/eef/bpe.json index 3cbe0ddbe3fb2fe14b8bf5dd2ab9f2b73670192c..d6e00b74168fb3f83ff33e2833622b378c4e9ab0 100644 --- a/variants/extended-1st-10mm-4k/profiles/eef/bpe.json +++ b/variants/extended-1st-10mm-4k/profiles/eef/bpe.json @@ -1 +1,19070 @@ -{"spatial_merges": [[4, 13], [22, 84], [38, 61], [98, 99], [100, 101], [96, 102], [97, 102], [96, 100], [61, 96], [38, 96], [22, 98], [84, 98], [97, 100], [13, 99], [4, 99], [62, 107], [37, 106], [39, 106], [97, 101], [60, 107], [83, 108], [85, 108], [21, 109], [5, 111], [23, 109], [3, 111], [14, 112], [12, 112], [61, 97], [62, 96], [38, 60], [61, 116], [3, 13], [5, 13], [101, 113], [101, 117], [60, 96], [22, 83], [101, 114], [22, 85], [101, 115], [23, 84], [4, 14], [4, 12], [21, 84], [38, 62], [105, 120], [105, 122], [105, 118], [105, 119], [105, 121], [105, 123], [105, 125], [105, 124], [116, 128], [37, 126], [97, 128], [39, 126], [37, 129], [37, 127], [39, 129], [39, 127], [23, 98], [21, 98], [39, 134], [110, 120], [37, 134], [110, 119], [110, 118], [97, 143], [116, 143], [3, 99], [110, 121], [5, 99], [110, 125], [110, 124], [60, 97], [105, 130], [113, 122], [115, 124], [105, 131], [114, 125], [110, 122], [110, 123], [105, 140], [83, 160], [135, 141], [62, 97], [85, 160], [85, 161], [83, 161], [117, 120], [23, 85], [14, 169], [12, 171], [12, 169], [23, 83], [137, 141], [14, 171], [137, 140], [21, 85], [3, 12], [3, 14], [139, 141], [21, 83], [130, 139], [131, 142], [5, 12], [130, 142], [131, 139], [141, 142], [131, 135], [5, 14], [131, 137], [130, 137], [135, 140], [101, 159], [101, 157], [37, 174], [114, 118], [130, 135], [115, 119], [113, 123], [39, 174], [117, 121], [113, 118], [101, 162], [60, 116], [101, 164], [139, 140], [113, 119], [140, 142], [117, 119], [115, 123], [39, 185], [114, 121], [40, 106], [117, 118], [113, 121], [37, 185], [62, 116], [36, 106], [117, 123], [114, 123], [125, 153], [115, 118], [114, 119], [120, 154], [124, 155], [63, 107], [139, 175], [115, 121], [142, 178], [59, 107], [114, 122], [63, 96], [115, 122], [115, 120], [59, 96], [105, 183], [114, 120], [119, 155], [118, 153], [105, 186], [105, 187], [105, 188], [113, 124], [122, 167], [105, 184], [113, 125], [119, 154], [137, 182], [37, 225], [39, 225], [118, 154], [139, 178], [117, 125], [113, 203], [135, 178], [117, 124], [142, 175], [135, 182], [105, 193], [137, 175], [137, 178], [39, 238], [105, 191], [135, 175], [105, 196], [118, 167], [105, 195], [105, 201], [82, 108], [105, 192], [119, 167], [37, 238], [86, 108], [139, 182], [113, 183], [119, 153], [118, 155], [121, 154], [142, 182], [121, 153], [113, 186], [114, 184], [115, 197], [124, 159], [117, 122], [122, 157], [115, 191], [105, 208], [59, 97], [125, 157], [139, 199], [40, 127], [36, 127], [122, 159], [22, 82], [141, 194], [120, 155], [110, 187], [114, 193], [120, 153], [110, 188], [22, 86], [110, 204], [114, 192], [110, 184], [121, 155], [40, 134], [123, 155], [110, 197], [124, 162], [141, 202], [117, 204], [115, 213], [115, 196], [130, 198], [139, 200], [125, 164], [37, 253], [137, 200], [135, 205], [131, 194], [137, 199], [113, 120], [4, 15], [121, 167], [114, 195], [117, 206], [37, 256], [135, 199], [120, 162], [140, 198], [123, 167], [113, 190], [117, 187], [130, 202], [135, 210], [113, 207], [117, 188], [137, 210], [36, 126], [36, 134], [110, 209], [142, 205], [135, 200], [40, 126], [39, 253], [110, 211], [114, 201], [142, 200], [124, 154], [125, 154], [120, 164], [139, 205], [118, 157], [123, 154], [115, 227], [123, 153], [119, 159], [2, 13], [130, 194], [39, 256], [137, 205], [142, 210], [131, 202], [119, 162], [140, 190], [6, 13], [122, 153], [131, 198], [4, 11], [122, 155], [118, 164], [63, 97], [131, 190], [123, 157], [110, 183], [110, 208], [123, 159], [110, 192], [141, 190], [123, 162], [142, 199], [24, 84], [121, 157], [115, 229], [110, 229], [110, 186], [121, 164], [125, 167], [113, 201], [140, 194], [124, 167], [118, 159], [139, 210], [110, 196], [113, 227], [110, 218], [15, 112], [110, 195], [123, 164], [110, 206], [110, 212], [119, 157], [110, 213], [141, 198], [11, 112], [130, 190], [119, 164], [121, 159], [118, 162], [121, 162], [110, 203], [114, 208], [155, 197], [110, 193], [153, 184], [2, 12], [20, 84], [140, 202], [110, 207], [157, 201], [110, 191], [120, 167], [159, 227], [117, 207], [38, 310], [124, 234], [24, 85], [114, 209], [114, 124], [114, 183], [113, 212], [117, 212], [115, 212], [115, 125], [110, 201], [125, 239], [2, 111], [110, 227], [113, 218], [115, 186], [113, 209], [119, 221], [114, 218], [122, 154], [117, 229], [117, 211], [115, 211], [117, 209], [117, 208], [6, 111], [115, 187], [114, 207], [117, 218], [114, 188], [101, 234], [125, 216], [154, 187], [101, 239], [118, 216], [114, 203], [113, 211], [23, 86], [115, 203], [118, 237], [120, 221], [120, 216], [24, 83], [124, 221], [36, 174], [154, 188], [119, 232], [115, 206], [115, 204], [20, 85], [162, 229], [157, 183], [114, 204], [86, 160], [153, 192], [124, 232], [24, 109], [38, 394], [159, 186], [115, 218], [40, 174], [122, 247], [114, 211], [113, 193], [113, 213], [125, 237], [141, 316], [114, 212], [113, 184], [115, 183], [115, 209], [6, 12], [114, 186], [155, 191], [82, 160], [115, 207], [154, 204], [113, 197], [117, 197], [3, 15], [115, 188], [40, 185], [114, 206], [153, 195], [23, 82], [20, 83], [167, 183], [117, 184], [119, 216], [113, 191], [157, 203], [114, 187], [120, 251], [175, 190], [105, 290], [155, 213], [3, 11], [117, 195], [157, 193], [159, 203], [113, 195], [105, 294], [122, 232], [198, 200], [167, 186], [155, 229], [118, 221], [105, 312], [130, 354], [113, 196], [155, 196], [117, 193], [164, 208], [153, 193], [37, 310], [117, 213], [162, 191], [175, 194], [162, 206], [117, 192], [154, 206], [117, 191], [153, 208], [21, 86], [140, 323], [157, 184], [118, 232], [157, 207], [36, 185], [21, 82], [190, 199], [159, 191], [178, 202], [178, 198], [115, 419], [135, 345], [162, 187], [113, 192], [101, 247], [122, 237], [39, 310], [202, 205], [110, 290], [37, 96], [159, 197], [101, 251], [119, 237], [194, 205], [124, 153], [121, 216], [125, 155], [110, 294], [157, 192], [5, 15], [105, 337], [105, 317], [159, 213], [113, 381], [41, 106], [122, 164], [164, 206], [162, 197], [194, 199], [182, 190], [2, 14], [117, 196], [137, 391], [182, 198], [164, 193], [82, 161], [114, 427], [164, 188], [155, 187], [164, 192], [35, 106], [199, 202], [190, 200], [159, 196], [154, 208], [164, 184], [113, 312], [105, 332], [153, 209], [167, 203], [178, 194], [159, 183], [105, 384], [153, 201], [113, 206], [154, 229], [153, 188], [164, 195], [157, 195], [130, 404], [157, 186], [39, 96], [159, 207], [105, 357], [155, 227], [182, 194], [194, 200], [198, 210], [64, 107], [155, 212], [86, 161], [162, 213], [105, 343], [117, 183], [157, 209], [121, 221], [162, 212], [154, 209], [175, 198], [167, 207], [113, 342], [5, 11], [20, 109], [140, 316], [123, 232], [154, 211], [117, 186], [155, 211], [114, 317], [113, 204], [122, 162], [117, 336], [141, 323], [131, 354], [115, 340], [105, 364], [121, 237], [162, 204], [36, 253], [37, 394], [58, 107], [190, 210], [105, 350], [6, 14], [123, 221], [105, 360], [175, 202], [114, 350], [105, 401], [105, 365], [178, 190], [11, 169], [157, 312], [115, 387], [105, 341], [117, 356], [164, 204], [114, 374], [162, 196], [105, 340], [142, 380], [114, 341], [40, 253], [154, 197], [114, 343], [99, 438], [121, 232], [114, 312], [113, 337], [120, 159], [121, 251], [130, 439], [164, 218], [115, 352], [115, 365], [153, 218], [154, 184], [130, 323], [159, 211], [162, 188], [155, 186], [167, 218], [115, 360], [113, 317], [131, 316], [200, 202], [113, 188], [142, 388], [120, 157], [191, 234], [140, 354], [153, 183], [139, 380], [123, 237], [123, 216], [119, 234], [117, 390], [130, 316], [113, 187], [164, 187], [157, 317], [194, 210], [203, 247], [198, 199], [40, 256], [153, 204], [202, 210], [118, 239], [155, 206], [115, 357], [115, 370], [167, 184], [159, 387], [139, 388], [153, 211], [117, 203], [153, 187], [105, 383], [206, 251], [117, 385], [167, 212], [113, 412], [124, 366], [115, 337], [155, 188], [157, 342], [41, 127], [198, 205], [15, 169], [36, 256], [154, 212], [167, 201], [167, 197], [114, 332], [182, 202], [131, 323], [193, 239], [115, 415], [11, 171], [105, 374], [157, 212], [164, 207], [15, 171], [115, 412], [38, 116], [35, 126], [221, 229], [98, 449], [159, 337], [164, 209], [167, 227], [155, 209], [141, 354], [208, 216], [114, 213], [162, 352], [167, 209], [159, 218], [114, 383], [39, 394], [58, 97], [167, 211], [110, 352], [162, 211], [154, 195], [164, 211], [105, 426], [125, 361], [115, 345], [155, 218], [105, 370], [98, 489], [113, 503], [110, 332], [124, 313], [159, 212], [154, 213], [105, 415], [197, 234], [157, 218], [159, 395], [41, 134], [115, 195], [190, 205], [139, 391], [157, 374], [114, 401], [154, 192], [110, 385], [155, 204], [162, 336], [192, 239], [105, 403], [114, 342], [35, 127], [99, 518], [184, 239], [154, 218], [123, 234], [114, 403], [196, 234], [164, 212], [162, 209], [117, 352], [204, 251], [117, 332], [186, 247], [101, 314], [123, 239], [101, 313], [40, 129], [159, 412], [197, 221], [187, 221], [139, 438], [184, 216], [234, 419], [213, 234], [110, 390], [110, 341], [125, 314], [162, 370], [137, 380], [227, 232], [154, 196], [164, 356], [115, 384], [153, 206], [153, 212], [197, 232], [110, 364], [117, 364], [167, 195], [131, 439], [184, 237], [188, 216], [183, 247], [36, 129], [110, 360], [22, 81], [64, 590], [110, 336], [114, 196], [201, 237], [114, 197], [58, 590], [195, 239], [115, 336], [239, 427], [153, 207], [155, 183], [153, 186], [115, 184], [35, 134], [142, 345], [121, 239], [124, 157], [101, 328], [135, 391], [115, 440], [157, 401], [124, 328], [167, 213], [192, 216], [110, 350], [125, 162], [207, 247], [20, 86], [114, 364], [117, 343], [157, 211], [162, 207], [115, 395], [22, 87], [113, 404], [154, 207], [164, 332], [113, 374], [135, 388], [159, 209], [117, 384], [155, 203], [110, 317], [114, 356], [162, 218], [186, 232], [121, 247], [130, 449], [110, 340], [40, 310], [41, 126], [110, 387], [114, 428], [206, 221], [110, 356], [58, 642], [105, 500], [124, 164], [167, 187], [247, 404], [114, 290], [101, 362], [114, 426], [167, 188], [115, 192], [125, 159], [183, 237], [167, 193], [159, 415], [110, 384], [105, 521], [117, 370], [135, 380], [155, 352], [123, 247], [113, 357], [64, 642], [114, 390], [154, 186], [115, 385], [139, 345], [167, 192], [113, 415], [81, 108], [154, 193], [154, 183], [99, 611], [121, 234], [125, 362], [137, 543], [119, 239], [115, 294], [110, 357], [117, 294], [153, 341], [122, 216], [117, 403], [115, 381], [167, 191], [164, 403], [137, 388], [247, 503], [98, 532], [117, 290], [130, 532], [123, 251], [120, 232], [115, 582], [118, 234], [98, 496], [154, 191], [157, 428], [155, 207], [113, 294], [195, 216], [87, 108], [113, 290], [113, 640], [115, 193], [119, 251], [155, 340], [114, 294], [167, 196], [142, 391], [198, 345], [153, 290], [164, 364], [115, 290], [114, 191], [117, 342], [117, 426], [159, 381], [118, 247], [153, 332], [23, 87], [63, 785], [117, 440], [110, 383], [110, 426], [113, 350], [120, 237], [153, 203], [117, 365]], "temporal_merges": [[103, 103, 2], [104, 104, 1], [1024, 1024, 4], [1025, 1025, 2], [1026, 1026, 1], [1024, 103, 4], [1027, 1027, 4], [103, 103, 4], [1025, 104, 2], [104, 104, 2], [103, 1024, 4], [103, 103, 6], [1024, 103, 6], [1027, 104, 4], [1025, 104, 3], [1027, 1025, 4], [104, 104, 3], [103, 133, 2], [103, 132, 2], [103, 136, 2], [1027, 1032, 4], [103, 138, 2], [103, 144, 2], [104, 1025, 2], [1024, 132, 4], [1024, 133, 4], [103, 145, 2], [103, 146, 2], [103, 147, 2], [1026, 1029, 1], [103, 148, 2], [1024, 136, 4], [138, 138, 3], [1024, 144, 4], [103, 149, 2], [1026, 1029, 3], [1024, 145, 4], [150, 136, 1], [132, 132, 2], [1024, 138, 4], [1024, 147, 4], [1024, 146, 4], [103, 151, 2], [133, 133, 3], [1029, 1026, 1], [103, 150, 2], [136, 136, 3], [1024, 149, 4], [1025, 1025, 3], [1024, 148, 4], [1032, 104, 4], [145, 132, 1], [151, 138, 1], [104, 152, 1], [144, 133, 1], [132, 145, 1], [1024, 150, 4], [104, 156, 1], [1024, 151, 4], [146, 146, 2], [104, 158, 1], [147, 147, 2], [163, 152, 1], [1029, 132, 6], [149, 149, 4], [136, 136, 4], [1029, 133, 6], [138, 138, 4], [144, 133, 2], [172, 156, 1], [148, 148, 4], [1025, 152, 2], [104, 165, 1], [104, 166, 1], [1031, 144, 2], [173, 158, 1], [1029, 147, 6], [1029, 136, 6], [1029, 138, 6], [1029, 146, 6], [1025, 156, 2], [104, 163, 1], [104, 168, 1], [103, 103, 1], [1031, 132, 2], [1029, 145, 6], [177, 177, 2], [133, 133, 2], [104, 170, 1], [1025, 158, 2], [1029, 144, 6], [1031, 133, 2], [179, 179, 2], [145, 132, 2], [149, 149, 5], [1025, 168, 2], [1032, 152, 3], [1027, 1033, 4], [132, 132, 3], [1029, 148, 6], [1031, 146, 2], [1031, 147, 2], [138, 151, 1], [136, 150, 1], [1025, 163, 2], [1032, 156, 3], [1031, 145, 2], [1029, 149, 6], [176, 176, 2], [1025, 170, 2], [1032, 158, 3], [133, 144, 1], [148, 148, 5], [152, 163, 1], [1025, 165, 2], [180, 168, 1], [133, 144, 2], [1025, 166, 2], [156, 156, 3], [1032, 168, 3], [136, 136, 2], [1032, 163, 3], [158, 158, 3], [138, 138, 2], [132, 145, 2], [1031, 136, 2], [1031, 138, 2], [150, 136, 2], [166, 166, 2], [1031, 148, 2], [1032, 170, 3], [145, 145, 2], [165, 165, 2], [104, 172, 1], [146, 146, 3], [1026, 144, 1], [147, 147, 3], [151, 138, 2], [104, 173, 1], [132, 103, 2], [104, 181, 1], [1031, 149, 2], [1031, 151, 2], [1029, 150, 6], [1031, 150, 2], [1033, 152, 1], [1029, 151, 6], [144, 103, 2], [1032, 165, 3], [133, 103, 2], [146, 103, 2], [136, 103, 2], [147, 103, 2], [1032, 166, 3], [138, 103, 2], [1027, 156, 4], [149, 103, 2], [145, 103, 2], [148, 103, 2], [1026, 144, 3], [104, 180, 1], [1027, 152, 4], [1033, 152, 3], [136, 150, 2], [1025, 172, 2], [1027, 158, 4], [1026, 133, 1], [1025, 173, 2], [1027, 163, 4], [138, 151, 2], [1026, 1024, 5], [1025, 181, 2], [156, 172, 1], [144, 144, 3], [151, 151, 3], [177, 177, 3], [158, 158, 4], [152, 152, 3], [132, 132, 4], [1027, 170, 4], [179, 179, 3], [1032, 172, 3], [1033, 156, 3], [1027, 1038, 4], [1026, 144, 5], [1025, 180, 2], [1027, 168, 4], [1032, 173, 3], [149, 149, 3], [1026, 133, 3], [150, 103, 2], [168, 168, 3], [1032, 181, 3], [148, 148, 3], [1032, 180, 3], [1033, 170, 3], [176, 176, 3], [158, 173, 1], [1027, 165, 4], [146, 146, 4], [1033, 168, 3], [133, 133, 4], [166, 166, 3], [151, 103, 2], [165, 165, 3], [1026, 132, 1], [1027, 166, 4], [147, 147, 4], [1033, 163, 3], [145, 145, 3], [150, 150, 3], [1026, 133, 5], [1024, 1024, 1], [189, 189, 2], [1024, 103, 1], [152, 163, 2], [1033, 158, 3], [156, 156, 4], [1026, 1024, 3], [1034, 132, 2], [144, 144, 4], [1027, 172, 4], [1029, 1029, 1], [1034, 136, 2], [170, 170, 5], [1027, 173, 4], [1034, 147, 2], [103, 176, 2], [1034, 146, 2], [1034, 133, 2], [1034, 138, 2], [1026, 145, 5], [1027, 180, 4], [1033, 165, 3], [1026, 148, 1], [1033, 166, 3], [163, 152, 2], [136, 136, 5], [168, 180, 1], [1034, 144, 2], [1029, 1024, 1], [1027, 181, 4], [132, 132, 5], [1026, 149, 1], [151, 151, 4], [1026, 146, 1], [1026, 147, 1], [1026, 136, 1], [156, 172, 2], [138, 138, 5], [149, 149, 2], [1026, 138, 1], [152, 152, 2], [158, 165, 1], [1024, 176, 4], [1026, 132, 5], [148, 148, 6], [104, 104, 4], [156, 166, 1], [1026, 149, 5], [103, 189, 2], [150, 150, 4], [146, 146, 5], [1037, 152, 5], [165, 158, 1], [177, 177, 4], [170, 170, 6], [147, 147, 5], [1026, 148, 5], [1034, 145, 2], [179, 136, 2], [1037, 156, 5], [1033, 173, 3], [166, 156, 1], [133, 133, 5], [158, 168, 1], [148, 148, 2], [1026, 138, 5], [145, 145, 4], [1026, 136, 5], [1037, 163, 5], [222, 222, 2], [1033, 181, 3], [1026, 1024, 1], [152, 104, 1], [166, 168, 1], [165, 168, 1], [1026, 147, 5], [104, 152, 2], [1026, 146, 5], [149, 149, 6], [1026, 151, 1], [1033, 180, 3], [144, 144, 2], [1037, 158, 5], [172, 156, 2], [1026, 145, 1], [1034, 148, 2], [1026, 150, 1], [103, 179, 2], [163, 104, 1], [165, 152, 1], [166, 152, 1], [144, 1024, 2], [220, 220, 2], [177, 138, 2], [156, 168, 1], [132, 1024, 2], [133, 1024, 2], [1037, 168, 5], [1026, 150, 5], [1037, 170, 5], [158, 152, 1], [1026, 151, 5], [132, 176, 2], [1033, 172, 3], [147, 1024, 2], [148, 144, 2], [1034, 149, 2], [103, 136, 4], [173, 158, 2], [146, 1024, 2], [165, 104, 1], [103, 132, 4], [103, 138, 4], [144, 148, 2], [166, 104, 1], [156, 152, 1], [179, 179, 4], [1031, 132, 6], [145, 145, 5], [189, 189, 3], [1039, 152, 6], [1036, 132, 4], [1031, 148, 6], [1034, 151, 2], [1034, 150, 2], [1026, 103, 5], [163, 170, 1], [1031, 144, 6], [138, 1024, 2], [1031, 136, 6], [156, 104, 1], [181, 181, 3], [103, 177, 2], [158, 104, 1], [151, 151, 5], [1031, 133, 6], [148, 1024, 2], [136, 1024, 2], [103, 133, 4], [176, 132, 2], [168, 168, 2], [1031, 149, 6], [1031, 146, 6], [1037, 172, 5], [1038, 163, 2], [1033, 104, 4], [136, 136, 6], [170, 170, 4], [1036, 133, 4], [1031, 147, 6], [1037, 165, 5], [1037, 173, 5], [138, 138, 6], [166, 158, 1], [1039, 156, 6], [1036, 147, 4], [240, 240, 2], [149, 1024, 2], [103, 146, 4], [1037, 180, 5], [163, 1025, 1], [1031, 138, 6], [150, 150, 5], [1036, 146, 4], [1044, 152, 7], [189, 133, 2], [132, 146, 2], [1036, 145, 4], [163, 152, 3], [1037, 181, 5], [217, 217, 2], [156, 156, 2], [1036, 144, 4], [146, 132, 2], [147, 133, 2], [157, 157, 2], [1026, 132, 3], [158, 173, 2], [145, 149, 2], [242, 242, 2], [251, 251, 2], [1039, 163, 6], [219, 219, 2], [103, 147, 4], [236, 236, 2], [1026, 136, 3], [1038, 168, 2], [132, 149, 2], [151, 151, 2], [1039, 158, 6], [132, 147, 2], [148, 133, 2], [1026, 138, 3], [1039, 168, 6], [1037, 166, 5], [170, 104, 1], [176, 145, 2], [1031, 145, 6], [146, 136, 2], [132, 136, 2], [1039, 170, 6], [180, 168, 2], [146, 133, 2], [165, 165, 4], [246, 246, 2], [132, 138, 2], [1044, 156, 7], [147, 144, 2], [158, 158, 2], [104, 168, 2], [1026, 148, 3], [1038, 170, 2], [1026, 149, 3], [147, 138, 2], [1029, 1024, 3], [247, 247, 2], [163, 163, 5], [1026, 150, 3], [223, 223, 2], [166, 166, 4], [1035, 147, 4], [136, 146, 2], [1038, 152, 2], [132, 148, 2], [165, 156, 1], [168, 104, 1], [1036, 136, 4], [1026, 145, 3], [1031, 151, 6], [136, 133, 2], [222, 222, 3], [1035, 132, 4], [1036, 138, 4], [170, 152, 1], [181, 181, 4], [173, 173, 3], [145, 1024, 2], [1029, 103, 3], [1026, 1057, 1], [1038, 156, 2], [150, 150, 2], [180, 104, 1], [1029, 176, 6], [216, 216, 2], [1026, 146, 3], [146, 144, 2], [138, 177, 2], [149, 149, 7], [103, 103, 3], [1031, 150, 6], [1044, 163, 7], [1044, 158, 7], [1026, 151, 3], [138, 147, 2], [172, 104, 1], [138, 133, 2], [1026, 147, 3], [1044, 168, 7], [136, 179, 2], [170, 163, 1], [144, 146, 2], [1024, 189, 4], [1039, 172, 6], [144, 147, 2], [214, 214, 2], [1039, 180, 6], [215, 215, 2], [1038, 158, 2], [349, 349, 2], [339, 339, 2], [149, 145, 2], [133, 148, 2], [151, 1024, 2], [176, 176, 4], [166, 1025, 1], [133, 146, 2], [1026, 1049, 1], [220, 220, 3], [150, 1024, 2], [228, 228, 2], [1039, 181, 6], [165, 1025, 1], [1039, 173, 6], [147, 132, 2], [133, 136, 2], [138, 132, 2], [149, 132, 2], [1033, 163, 1], [164, 164, 2], [1044, 170, 7], [148, 136, 2], [181, 104, 1], [133, 147, 2], [103, 215, 2], [1035, 147, 2], [152, 156, 1], [103, 226, 2], [1038, 165, 2], [313, 313, 2], [133, 138, 2], [1044, 173, 7], [103, 224, 2], [1036, 148, 4], [144, 138, 2], [1038, 166, 2], [144, 136, 2], [103, 214, 2], [1035, 146, 2], [152, 158, 1], [361, 361, 2], [173, 104, 1], [1044, 172, 7], [177, 177, 5], [133, 189, 2], [103, 217, 2], [103, 219, 2], [231, 231, 2], [152, 165, 1], [1039, 165, 6], [162, 162, 2], [136, 132, 2], [179, 179, 5], [1044, 180, 7], [145, 176, 2], [1026, 1060, 1], [314, 314, 2], [152, 166, 1], [148, 132, 2], [103, 223, 2], [138, 144, 2], [1033, 156, 1], [230, 230, 2], [168, 158, 1], [104, 163, 2], [1035, 146, 4], [136, 144, 2], [1044, 181, 7], [168, 165, 1], [152, 1025, 1], [168, 156, 1], [168, 166, 1], [1036, 149, 4], [1057, 1026, 1], [136, 148, 2], [1047, 152, 1], [1039, 166, 6], [138, 151, 3], [180, 180, 3], [224, 224, 2], [113, 113, 2], [1068, 144, 6], [103, 228, 2], [1035, 132, 2], [104, 245, 1], [156, 165, 1], [156, 1025, 1], [235, 235, 2], [170, 1025, 1], [1053, 133, 7], [1033, 158, 1], [145, 146, 2], [1038, 172, 2], [1044, 165, 7], [1033, 170, 1], [328, 328, 2], [233, 233, 3], [217, 217, 3], [149, 138, 2], [158, 166, 1], [1036, 150, 4], [1024, 1026, 1], [181, 181, 5], [221, 221, 2], [149, 133, 2], [242, 242, 3], [103, 230, 2], [147, 136, 2], [1053, 144, 7], [146, 148, 2], [234, 234, 2], [146, 145, 2], [1047, 163, 1], [1038, 173, 2], [151, 151, 6], [146, 138, 2], [1053, 145, 7], [1049, 1026, 1], [367, 367, 2], [1026, 1046, 1], [366, 366, 2], [226, 226, 2], [172, 172, 3], [1033, 166, 1], [1033, 165, 1], [382, 382, 2], [144, 144, 5], [1033, 168, 1], [1044, 166, 7], [165, 163, 1], [1026, 1048, 1], [117, 117, 2], [104, 166, 2], [219, 219, 3], [158, 1025, 1], [136, 150, 3], [147, 148, 2], [246, 246, 3], [114, 114, 2], [103, 235, 2], [154, 154, 2], [138, 148, 2], [1047, 170, 1], [259, 259, 2], [243, 243, 2], [1053, 132, 7], [239, 239, 2], [145, 136, 2], [1024, 179, 4], [244, 244, 2], [1035, 145, 4], [1036, 151, 4], [1024, 177, 4], [159, 159, 2], [236, 236, 3], [150, 146, 2], [104, 156, 2], [149, 136, 2], [148, 146, 2], [1026, 1064, 1], [1026, 1055, 1], [144, 1029, 2], [170, 156, 1], [240, 240, 3], [148, 147, 2], [104, 158, 2], [1068, 133, 6], [260, 260, 2], [1038, 181, 2], [148, 138, 2], [163, 165, 1], [241, 241, 3], [151, 147, 2], [1031, 189, 2], [214, 214, 3], [1053, 147, 7], [1038, 180, 2], [138, 149, 2], [103, 233, 2], [104, 165, 2], [1026, 1063, 1], [144, 189, 2], [146, 132, 1], [1035, 133, 2], [1026, 1065, 1], [150, 133, 2], [145, 147, 2], [136, 147, 2], [1026, 1071, 1], [166, 163, 1], [1031, 176, 2], [1026, 1041, 1], [155, 155, 2], [1035, 145, 2], [103, 222, 2], [133, 1029, 2], [138, 146, 2], [103, 220, 2], [1062, 132, 4], [168, 1025, 1], [215, 215, 3], [152, 170, 1], [1033, 173, 1], [149, 147, 2], [1035, 136, 2], [231, 231, 3], [163, 166, 1], [149, 146, 2], [172, 1025, 1], [103, 248, 2], [176, 145, 3], [1046, 133, 4], [220, 132, 2], [1047, 156, 1], [1029, 189, 6], [1046, 1026, 1], [151, 144, 2], [179, 150, 3], [1068, 145, 6], [138, 177, 3], [173, 1025, 1], [223, 223, 3], [1032, 245, 3], [237, 237, 2], [110, 110, 2], [156, 170, 1], [151, 132, 2], [1053, 146, 7], [1053, 136, 7], [1053, 138, 7], [1035, 133, 4], [104, 172, 2], [1041, 1026, 1], [151, 148, 2], [103, 148, 4], [173, 165, 1], [146, 150, 2], [232, 232, 2], [133, 222, 2], [153, 153, 2], [1047, 158, 1], [1035, 148, 2], [147, 1029, 2], [103, 243, 2], [1033, 172, 1], [245, 245, 3], [103, 244, 2], [166, 172, 1], [180, 180, 4], [1035, 144, 2], [132, 1029, 2], [149, 144, 2], [249, 249, 3], [224, 224, 3], [147, 145, 2], [104, 170, 2], [233, 233, 2], [146, 1029, 2], [1026, 1073, 1], [165, 173, 1], [136, 179, 3], [181, 181, 6], [362, 362, 2], [151, 177, 3], [150, 144, 2], [150, 132, 2], [158, 163, 1], [104, 173, 2], [103, 231, 2], [147, 149, 2], [1047, 165, 1], [1072, 163, 2], [176, 275, 2], [1024, 223, 4], [1035, 136, 4], [1053, 149, 7], [1072, 152, 2], [150, 148, 2], [151, 133, 2], [103, 250, 2], [145, 138, 2], [103, 252, 2], [1026, 1049, 3], [168, 180, 2], [133, 1067, 2], [226, 226, 3], [1035, 138, 4], [1068, 132, 6], [150, 179, 2], [1047, 166, 1], [1026, 1057, 3], [172, 166, 1], [163, 158, 1], [1035, 149, 2], [228, 228, 3], [1024, 214, 4], [1050, 132, 4], [156, 163, 1], [103, 241, 2], [268, 268, 2], [103, 249, 2], [148, 1029, 2], [170, 168, 1], [1024, 215, 4], [265, 265, 2], [146, 149, 2], [189, 189, 4], [177, 151, 2], [1048, 1026, 1], [147, 151, 2], [1042, 145, 4], [177, 138, 3], [103, 254, 2], [1026, 1060, 3], [136, 149, 2], [133, 149, 2], [1083, 146, 4], [1026, 1080, 1], [163, 156, 1], [1042, 132, 4], [180, 1025, 1], [1041, 144, 4], [1055, 1026, 1], [136, 1029, 2], [1068, 149, 6], [1035, 144, 4], [136, 145, 2], [1035, 138, 2], [1047, 173, 1], [138, 145, 2], [230, 230, 3], [181, 1025, 1], [1040, 170, 2], [1047, 168, 1], [1064, 1026, 1], [132, 151, 2], [179, 150, 2], [241, 241, 2], [275, 275, 2], [158, 158, 5], [1033, 180, 1], [1026, 1048, 3], [1026, 1082, 1], [1047, 172, 1], [1068, 147, 6], [132, 1031, 2], [1060, 1026, 1], [103, 236, 2], [138, 1029, 2], [1056, 151, 2], [148, 144, 1], [1024, 219, 4], [1035, 149, 4], [1072, 156, 2], [172, 163, 1], [215, 132, 2], [179, 136, 3], [223, 132, 2], [1024, 217, 4], [103, 255, 2], [150, 147, 2], [103, 240, 2], [103, 257, 2], [220, 220, 4], [1063, 1026, 1], [1085, 147, 4], [1035, 148, 4], [1024, 224, 4], [1031, 177, 2], [151, 177, 2], [152, 104, 2], [1065, 1026, 1], [1071, 1026, 1], [166, 166, 5], [1024, 228, 4], [103, 258, 2], [214, 132, 2], [173, 163, 1], [222, 222, 4], [1024, 226, 4], [145, 148, 2], [1025, 245, 2], [133, 147, 1], [1074, 152, 3], [1031, 179, 2], [165, 165, 5], [1072, 170, 2], [235, 235, 3], [1074, 163, 3], [1091, 138, 2], [1068, 146, 6], [147, 133, 1], [217, 217, 4], [104, 181, 2], [170, 158, 1], [150, 179, 3], [1074, 170, 3], [104, 180, 2], [1026, 1042, 1], [248, 248, 2], [103, 261, 2], [242, 242, 4], [133, 1041, 2], [219, 147, 2], [1026, 1043, 1], [132, 150, 2], [1089, 136, 2], [1026, 1041, 5], [189, 144, 2], [1072, 158, 2], [1068, 136, 6], [163, 172, 1], [167, 167, 2], [1040, 170, 4], [1034, 189, 2], [1033, 181, 1], [1024, 230, 4], [163, 1032, 1], [149, 1029, 2], [146, 136, 1], [177, 151, 3], [1026, 1045, 1], [148, 148, 7], [228, 132, 2], [1068, 138, 6], [1074, 168, 3], [146, 133, 1], [181, 168, 1], [219, 138, 2], [215, 136, 2], [243, 243, 3], [214, 138, 2], [1026, 1051, 1], [145, 1031, 2], [150, 149, 2], [173, 152, 1], [133, 146, 1], [246, 246, 4], [1024, 248, 4], [1026, 1063, 3], [105, 105, 2], [136, 146, 1], [144, 148, 1], [103, 262, 2], [172, 152, 1], [1073, 1026, 1], [176, 176, 5], [1042, 1026, 1], [1026, 1055, 3], [1186, 163, 1], [147, 150, 2], [168, 170, 1], [1026, 1046, 3], [1026, 1046, 5], [1024, 222, 4], [259, 259, 3], [1026, 1052, 1], [1024, 235, 4], [249, 249, 2], [172, 170, 1], [149, 150, 2], [132, 144, 2], [163, 173, 1], [1053, 148, 7], [1072, 168, 2], [145, 150, 2], [156, 104, 2], [1040, 152, 1], [179, 103, 2], [147, 1031, 2], [244, 244, 3], [1043, 150, 4], [151, 1029, 2], [177, 103, 2], [176, 103, 2], [158, 170, 1], [132, 1042, 2], [1040, 152, 4], [231, 138, 2], [165, 170, 1], [1051, 1026, 1], [145, 1029, 2], [1068, 148, 6], [163, 1077, 1], [1024, 220, 4], [181, 158, 1], [144, 133, 3], [1034, 1026, 1], [228, 147, 2], [151, 146, 2], [166, 170, 1], [250, 250, 3], [245, 245, 2], [189, 103, 2], [149, 1031, 2], [1026, 1042, 5], [173, 170, 1], [296, 296, 2], [136, 133, 1], [166, 104, 2], [1043, 1026, 1], [260, 260, 3], [1110, 177, 4], [146, 151, 2], [1056, 138, 5], [1040, 163, 2], [1026, 1034, 1], [146, 1031, 2], [1052, 1026, 1], [1026, 1064, 3], [115, 115, 2], [236, 132, 2], [1053, 150, 7], [1032, 1025, 4], [145, 176, 3], [133, 136, 1], [224, 138, 2], [1068, 150, 6], [1026, 1050, 1], [447, 447, 2], [1072, 173, 2], [1026, 1058, 1], [1026, 1071, 3], [144, 1031, 2], [223, 146, 2], [168, 104, 2], [1045, 1026, 1], [1035, 150, 2], [1024, 233, 4], [133, 150, 2], [181, 152, 1], [1053, 151, 7], [1026, 1050, 5], [165, 104, 2], [217, 146, 2], [1074, 156, 3], [217, 136, 2], [1025, 152, 3], [157, 157, 3], [1035, 150, 4], [1072, 172, 2], [138, 147, 1], [1047, 180, 1], [1077, 163, 2], [1024, 250, 4], [148, 150, 2], [103, 263, 2], [133, 1031, 2], [148, 1031, 2], [1068, 151, 6], [1026, 1065, 3], [147, 138, 1], [156, 156, 5], [1045, 151, 4], [144, 151, 2], [1040, 163, 4], [1024, 252, 4], [132, 146, 1], [133, 151, 2], [306, 306, 2], [1026, 1041, 3], [272, 272, 2], [254, 264, 1], [180, 180, 5], [1029, 223, 6], [1116, 179, 4], [144, 150, 2], [222, 133, 2], [1080, 1026, 1], [138, 132, 1], [145, 151, 2], [240, 240, 4], [103, 267, 2], [1081, 172, 2], [158, 181, 1], [1051, 146, 4], [235, 146, 2], [1031, 1088, 2], [148, 151, 2], [170, 173, 1], [214, 214, 4], [219, 219, 4], [168, 181, 1], [149, 151, 2], [1047, 181, 1], [170, 172, 1], [1026, 1045, 5], [136, 1061, 1], [1024, 243, 4], [1072, 165, 2], [1026, 1054, 1], [132, 147, 1], [302, 302, 2], [1026, 1043, 5], [158, 104, 2], [1032, 246, 3], [144, 189, 3], [1024, 254, 4], [1032, 242, 3], [103, 264, 2], [1024, 244, 4], [1040, 166, 2], [1074, 158, 3], [287, 287, 2], [1084, 173, 2], [1029, 228, 6], [230, 147, 2], [1088, 149, 2], [233, 233, 4], [136, 132, 1], [170, 165, 1], [1082, 1026, 1], [150, 145, 2], [226, 226, 4], [103, 266, 2], [1040, 152, 2], [1045, 138, 4], [1024, 257, 4], [1024, 231, 4], [147, 132, 1], [1035, 151, 2], [144, 149, 2], [1029, 177, 6], [1029, 179, 6], [294, 294, 2], [132, 220, 2], [103, 269, 2], [1072, 166, 2], [1029, 214, 6], [260, 172, 1], [1032, 1086, 3], [180, 181, 1], [224, 133, 2], [1024, 236, 4], [1031, 1094, 2], [215, 215, 4], [141, 141, 2], [231, 231, 4], [265, 265, 3], [1052, 147, 4], [145, 248, 2], [152, 173, 1], [1027, 245, 4], [164, 164, 3], [1058, 1026, 1], [103, 1061, 2], [145, 1050, 2], [138, 133, 1], [177, 177, 6], [1025, 168, 3], [1026, 1052, 5], [166, 180, 1], [1024, 261, 4], [151, 149, 2], [1024, 258, 4], [251, 251, 1], [1026, 1051, 5], [148, 145, 2], [1074, 165, 3], [163, 181, 1], [103, 274, 2], [176, 248, 2], [292, 292, 2], [257, 257, 2], [152, 172, 1], [1035, 151, 4], [103, 277, 2], [241, 241, 4], [1074, 166, 3], [165, 172, 1], [1029, 215, 6], [1026, 1058, 5], [1032, 265, 3], [149, 240, 2], [136, 217, 2], [168, 168, 4], [136, 1031, 2], [113, 113, 3], [140, 140, 2], [1026, 144, 7], [1029, 1075, 5], [250, 250, 2], [181, 180, 1], [104, 242, 1], [1040, 173, 2], [138, 1031, 2], [1024, 255, 4], [132, 236, 2], [252, 267, 1], [136, 1070, 2], [1026, 1069, 1], [149, 1058, 2], [151, 145, 2], [1025, 1086, 2], [132, 215, 2], [103, 276, 2], [146, 223, 2], [1024, 240, 4], [104, 1086, 1], [1040, 165, 2], [133, 138, 1], [144, 1046, 2], [179, 179, 6], [132, 223, 2], [150, 1029, 2], [1024, 249, 4], [1026, 1066, 1], [1040, 163, 1], [156, 181, 1], [296, 176, 2], [165, 180, 1], [1026, 1073, 3], [144, 1041, 2], [220, 220, 5], [1072, 180, 2], [1025, 242, 2], [1026, 1050, 3], [236, 236, 4], [271, 271, 3], [117, 117, 3], [348, 348, 2], [1066, 138, 4], [133, 224, 2], [132, 228, 2], [146, 217, 2], [132, 214, 2], [162, 162, 3], [170, 166, 1], [1026, 1042, 3], [147, 219, 2], [1024, 241, 4], [270, 270, 3], [189, 189, 5], [133, 230, 2], [136, 1043, 2], [1024, 1056, 4], [136, 215, 2], [151, 1031, 2], [244, 147, 2], [103, 282, 2], [1029, 248, 6], [259, 173, 1], [303, 303, 2], [150, 1031, 2], [1040, 156, 2], [133, 226, 2], [216, 216, 3], [1095, 163, 3], [1104, 172, 3], [148, 1054, 2], [176, 302, 2], [1026, 1058, 3], [247, 247, 3], [146, 1051, 2], [166, 1032, 1], [1024, 1061, 4], [308, 308, 2], [103, 281, 2], [268, 268, 3], [104, 246, 1], [261, 261, 2], [145, 149, 1], [103, 273, 2], [249, 138, 2], [136, 226, 2], [144, 132, 2], [130, 130, 2], [1094, 148, 2], [222, 222, 5], [243, 138, 2], [1074, 173, 3], [133, 235, 2], [1025, 246, 2], [103, 280, 2], [103, 285, 2], [1024, 262, 4], [243, 146, 2], [1069, 136, 4], [173, 168, 1], [290, 290, 2], [181, 163, 1], [103, 284, 2], [264, 254, 1], [103, 278, 2], [103, 279, 2], [1029, 230, 6], [1050, 1026, 1], [1026, 1043, 3], [156, 180, 1], [114, 114, 3], [103, 286, 2], [173, 1084, 1], [103, 289, 2], [297, 297, 2], [224, 224, 4], [1132, 176, 4], [304, 304, 2], [1206, 172, 1], [152, 181, 1], [158, 158, 6], [1041, 144, 1], [1054, 1026, 1], [270, 172, 1], [1074, 172, 3], [147, 1052, 2], [1029, 219, 6], [110, 110, 3], [1029, 217, 6], [333, 333, 2], [298, 298, 2], [163, 104, 2], [138, 1045, 2], [165, 1032, 1], [170, 1032, 1], [1024, 263, 4], [1026, 1036, 1], [166, 181, 1], [1031, 1089, 2], [491, 491, 2], [1069, 1026, 1], [1029, 1079, 5], [267, 252, 1], [168, 172, 1], [152, 1032, 1], [132, 136, 1], [159, 159, 3], [132, 138, 1], [1074, 180, 3], [176, 296, 2], [1034, 176, 2], [1029, 226, 6], [248, 248, 3], [200, 200, 2], [173, 259, 1], [266, 266, 3], [145, 220, 1], [275, 275, 3], [1025, 156, 3], [1070, 150, 1], [1040, 165, 1], [313, 234, 2], [177, 151, 4], [221, 221, 3], [226, 133, 2], [270, 163, 1], [1040, 168, 2], [154, 154, 3], [320, 320, 2], [147, 230, 2], [1072, 181, 2], [1024, 1076, 4], [138, 219, 2], [181, 172, 1], [1029, 224, 6], [233, 136, 2], [283, 283, 2], [1026, 1045, 3], [103, 300, 2], [166, 173, 1], [149, 145, 1], [103, 291, 2], [152, 152, 5], [268, 163, 1], [251, 349, 2], [1026, 1054, 5], [155, 155, 3], [136, 147, 1], [1026, 1080, 3], [1062, 1062, 4], [1067, 133, 5], [153, 153, 3], [271, 163, 1], [1026, 1051, 3], [459, 459, 2], [1066, 1026, 1], [1031, 1091, 2], [103, 288, 2], [147, 136, 1], [156, 156, 6], [269, 269, 3], [146, 138, 1], [236, 148, 2], [223, 223, 4], [1029, 1075, 6], [272, 163, 1], [1026, 1054, 3], [1040, 170, 1], [166, 166, 1], [1041, 133, 4], [136, 233, 2], [179, 150, 4], [1040, 158, 2], [1074, 181, 3], [1169, 163, 3], [103, 295, 2], [245, 245, 4], [249, 249, 4], [145, 306, 2], [1029, 257, 6], [146, 235, 2], [1029, 235, 6], [156, 1032, 1], [1240, 173, 1], [1067, 144, 2], [1026, 1052, 3], [230, 133, 2], [176, 149, 2], [1040, 166, 1], [145, 273, 2], [240, 149, 2], [1056, 151, 1], [319, 152, 1], [1040, 168, 1], [1026, 1082, 3], [1113, 173, 3], [165, 165, 1], [314, 239, 2], [138, 214, 2], [145, 133, 2], [1025, 265, 2], [104, 259, 1], [145, 1042, 2], [226, 136, 2], [1043, 136, 4], [299, 163, 1], [1038, 152, 4], [1121, 170, 5], [158, 1032, 1], [1024, 103, 3], [147, 228, 2], [246, 246, 5], [1067, 144, 1], [301, 172, 1], [242, 242, 5], [104, 265, 1], [1024, 267, 4], [138, 1056, 2], [158, 180, 1], [1031, 250, 2], [144, 1057, 2], [1036, 1026, 1], [1029, 1079, 6], [1024, 264, 4], [293, 172, 1], [325, 325, 2], [1025, 1093, 2], [138, 146, 1], [168, 168, 5], [189, 133, 3], [305, 177, 2], [1033, 1272, 1], [1061, 179, 3], [1121, 163, 5], [1042, 145, 1], [1060, 132, 6], [279, 279, 3], [334, 177, 2], [1026, 1066, 5], [1059, 144, 1], [165, 181, 1], [170, 104, 2], [1038, 1260, 2], [1119, 163, 3], [1024, 266, 4], [1029, 252, 6], [138, 231, 2], [180, 166, 1], [138, 224, 2], [335, 335, 2], [1029, 220, 6], [302, 176, 2], [248, 149, 2], [1029, 254, 6], [1048, 145, 6], [339, 339, 3], [103, 309, 2], [275, 176, 2], [1046, 148, 4], [1043, 150, 1], [1027, 265, 4], [322, 152, 1], [235, 133, 2], [104, 1093, 1], [217, 217, 5], [308, 177, 2], [199, 199, 2], [168, 173, 1], [526, 526, 2], [244, 244, 4], [271, 173, 1], [241, 136, 2], [1024, 269, 4], [170, 180, 1], [260, 260, 4], [146, 243, 2], [321, 152, 1], [507, 507, 2], [1029, 261, 6], [144, 189, 4], [496, 496, 2], [326, 156, 1], [132, 133, 2], [1027, 242, 4], [504, 504, 2], [181, 156, 1], [1024, 277, 4], [318, 152, 1], [1026, 1098, 1], [150, 179, 4], [1024, 274, 4], [1111, 133, 4], [1040, 172, 1], [104, 1099, 1], [1040, 156, 1], [228, 228, 4], [1029, 1061, 5], [234, 328, 2], [1025, 158, 3], [147, 144, 1], [166, 166, 6], [172, 1081, 1], [1040, 172, 2], [1029, 244, 6], [214, 214, 5], [345, 345, 2], [176, 307, 2], [148, 1041, 2], [215, 215, 5], [132, 145, 3], [165, 165, 6], [151, 151, 7], [247, 247, 1], [273, 273, 2], [1025, 1099, 2], [172, 168, 1], [1121, 152, 5], [219, 219, 5], [230, 230, 4], [150, 150, 7], [1121, 156, 5], [1026, 1069, 3], [152, 1105, 1], [181, 104, 2], [148, 1073, 2], [118, 118, 2], [119, 119, 2], [1031, 176, 6], [231, 231, 5], [311, 179, 2], [103, 306, 2], [148, 236, 2], [163, 1095, 1], [1040, 173, 1], [1029, 1078, 5], [272, 272, 3], [263, 146, 2], [1040, 158, 1], [1038, 1239, 2], [1024, 278, 4], [145, 223, 1], [259, 259, 4], [232, 232, 3], [237, 237, 3], [293, 293, 2], [484, 484, 2], [214, 295, 1], [257, 257, 3], [1026, 1069, 5], [180, 104, 2], [251, 251, 3], [1026, 1066, 3], [287, 287, 3], [528, 528, 2], [1024, 273, 4], [1024, 291, 4], [145, 132, 3], [240, 133, 2], [176, 1062, 2], [325, 179, 2], [449, 449, 2], [1057, 133, 6], [144, 146, 1], [177, 151, 5], [1029, 236, 6], [243, 243, 4], [181, 173, 1], [1024, 289, 4], [241, 241, 5], [220, 149, 2], [233, 233, 5], [148, 189, 2], [222, 222, 6], [1024, 276, 4], [1027, 246, 4], [252, 252, 2], [270, 270, 2], [1029, 250, 6], [1031, 248, 2], [1024, 282, 4], [261, 147, 2], [144, 230, 1], [1070, 136, 5], [180, 173, 1], [299, 299, 3], [176, 315, 2], [168, 1032, 1], [156, 1033, 1], [220, 149, 5], [295, 214, 1], [1029, 243, 6], [1024, 286, 4], [132, 1048, 2], [255, 138, 2], [1024, 281, 4], [1038, 156, 4], [1045, 151, 1], [144, 147, 1], [1089, 150, 2], [177, 1110, 3], [172, 181, 1], [472, 472, 2], [235, 235, 4], [271, 165, 1], [1062, 145, 1], [262, 147, 2], [1083, 1083, 4], [1031, 189, 6], [1038, 158, 4], [103, 144, 1], [1034, 179, 2], [1026, 132, 7], [361, 361, 1], [180, 156, 1], [172, 104, 2], [1085, 1085, 4], [180, 170, 1], [244, 136, 2], [289, 215, 1], [133, 240, 2], [347, 179, 2], [223, 145, 1], [330, 158, 1], [148, 250, 2], [1038, 168, 4], [146, 144, 1], [176, 132, 3], [149, 1042, 2], [149, 1071, 2], [1038, 163, 4], [239, 362, 2], [245, 165, 1], [1121, 158, 5], [283, 173, 1], [1034, 177, 2], [228, 145, 1], [292, 292, 3], [138, 249, 2], [303, 303, 3], [105, 105, 3], [1033, 245, 1], [157, 113, 2], [1043, 146, 4], [388, 388, 2], [131, 131, 2], [1036, 176, 4], [242, 166, 1], [277, 255, 1], [304, 177, 2], [150, 217, 1], [1042, 149, 4], [1032, 168, 4], [104, 271, 1], [216, 216, 1], [246, 158, 3], [147, 146, 2], [1035, 1092, 2], [320, 179, 2], [1026, 189, 1], [1031, 179, 6], [288, 288, 3], [1024, 1056, 1], [278, 278, 3], [173, 166, 1], [138, 136, 2], [254, 254, 3], [404, 404, 2], [1024, 280, 4], [1045, 147, 4], [1120, 163, 4], [104, 268, 1], [132, 148, 1], [220, 1062, 2], [1121, 165, 5], [1029, 222, 6], [189, 148, 2], [263, 263, 2], [1029, 231, 6], [1075, 176, 3], [446, 446, 2], [1025, 166, 3], [151, 219, 1], [144, 103, 1], [150, 215, 1], [181, 166, 1], [1029, 240, 6], [144, 235, 1], [157, 114, 2], [324, 152, 1], [167, 167, 3], [1094, 1031, 2], [149, 240, 4], [150, 136, 3], [170, 1027, 1], [1024, 285, 4], [133, 1049, 2], [147, 244, 2], [258, 274, 1], [104, 270, 1], [149, 176, 2], [180, 158, 1], [180, 172, 1], [1025, 165, 3], [1024, 279, 4], [221, 221, 1], [245, 166, 1], [257, 146, 2], [331, 177, 2], [180, 165, 1], [220, 145, 1], [329, 329, 3], [1121, 168, 5], [333, 189, 2], [335, 177, 2], [1024, 295, 4], [306, 306, 3], [367, 367, 3], [146, 147, 2], [308, 308, 3], [132, 1050, 2], [266, 146, 2], [349, 349, 3], [1029, 233, 6], [262, 262, 2], [1088, 1031, 2], [1025, 1032, 3], [1024, 309, 4], [151, 138, 3], [1121, 180, 5], [1038, 165, 4], [1024, 288, 4], [1046, 147, 4], [172, 165, 1], [224, 224, 5], [307, 307, 2], [215, 145, 1], [215, 289, 1], [1024, 284, 4], [1033, 246, 1], [1038, 170, 4], [226, 226, 5], [269, 269, 2], [1042, 146, 4], [136, 138, 2], [334, 334, 2], [1031, 219, 2], [242, 156, 3], [1024, 300, 4], [144, 222, 1], [150, 1043, 2], [246, 165, 1], [231, 149, 2], [1026, 145, 7], [301, 301, 3], [1032, 1093, 3], [168, 163, 1], [358, 358, 2], [1224, 180, 1], [181, 165, 1], [1296, 158, 1], [41, 41, 1], [283, 283, 3], [314, 314, 1], [133, 132, 2], [261, 261, 3], [561, 561, 2], [136, 241, 2], [177, 1056, 2], [173, 104, 2], [489, 489, 2], [1031, 214, 2], [1088, 1088, 2], [1121, 166, 5], [148, 133, 1], [298, 298, 3], [369, 179, 2], [305, 305, 2], [1041, 147, 4], [152, 152, 4], [1026, 149, 7], [145, 228, 1], [1025, 170, 3], [250, 250, 4], [117, 164, 2], [104, 260, 1], [219, 103, 2], [1032, 1099, 3], [236, 148, 3], [1031, 217, 2], [266, 266, 2], [132, 149, 1], [366, 366, 3], [1038, 172, 4], [144, 144, 7], [146, 1043, 2], [1031, 220, 2], [255, 133, 2], [377, 177, 2], [1081, 166, 2], [318, 173, 1], [245, 170, 1], [303, 179, 2], [115, 115, 3], [279, 279, 2], [1032, 1139, 3], [157, 339, 2], [1183, 1034, 1], [328, 328, 1], [245, 158, 1], [103, 296, 2], [1031, 226, 2], [245, 156, 1], [1046, 146, 4], [144, 224, 1], [176, 275, 3], [269, 147, 2], [326, 326, 3], [1059, 133, 1], [180, 1106, 1], [1118, 149, 2], [104, 272, 1], [252, 136, 2], [311, 311, 2], [1029, 241, 6], [271, 271, 2], [1034, 250, 2], [1031, 223, 2], [162, 162, 1], [1121, 181, 5], [1027, 1086, 4], [1076, 177, 3], [255, 277, 1], [1050, 149, 4], [189, 147, 2], [1049, 144, 3], [103, 307, 2], [146, 1042, 2], [321, 172, 1], [150, 150, 6], [234, 234, 3], [133, 148, 1], [214, 145, 1], [297, 297, 3], [151, 214, 1], [170, 170, 2], [1106, 180, 2], [103, 302, 2], [163, 168, 1], [1219, 163, 1], [1040, 181, 1], [1031, 230, 2], [1038, 166, 4], [1084, 165, 2], [217, 103, 2], [240, 149, 3], [1031, 224, 2], [133, 1078, 1], [147, 1042, 2], [605, 605, 2], [136, 148, 1], [1025, 1139, 2], [132, 176, 3], [270, 166, 1], [1075, 145, 3], [103, 344, 2], [156, 242, 3], [242, 156, 2], [138, 243, 2], [236, 148, 4], [347, 347, 2], [1121, 172, 5], [189, 144, 3], [382, 382, 3], [1029, 258, 6], [146, 257, 2], [268, 268, 4], [1027, 104, 5], [1031, 215, 2], [1031, 228, 2], [1062, 176, 4], [304, 304, 3], [313, 313, 1], [145, 215, 2], [158, 246, 3], [1038, 173, 4], [287, 180, 1], [1081, 152, 2], [136, 258, 2], [138, 103, 1], [179, 1116, 3], [133, 149, 1], [147, 1041, 2], [189, 146, 2], [148, 1046, 2], [315, 315, 2], [1091, 151, 2], [1026, 1092, 1], [1026, 189, 3], [1121, 173, 5], [1031, 222, 2], [1049, 144, 6], [1034, 1078, 1], [1040, 180, 1], [273, 273, 3], [168, 1033, 1], [359, 359, 2], [1034, 1159, 1], [248, 248, 4], [133, 145, 2], [158, 1033, 1], [214, 151, 1], [1027, 1137, 4], [1041, 148, 4], [1029, 249, 6], [136, 244, 2], [172, 260, 1], [217, 217, 6], [1055, 150, 6], [239, 239, 3], [149, 132, 1], [1029, 262, 6], [1061, 150, 3], [151, 1045, 2], [1029, 255, 6], [1031, 235, 2], [1091, 177, 2], [1031, 1061, 1], [133, 1046, 2], [252, 252, 3], [1041, 146, 4], [166, 1033, 1], [336, 336, 2], [152, 1033, 1], [148, 222, 2], [320, 320, 3], [147, 1045, 2], [1042, 147, 4], [145, 223, 2], [148, 132, 1], [1089, 179, 2], [173, 181, 1], [372, 156, 1], [246, 158, 2], [1232, 170, 1], [133, 189, 3], [132, 1075, 2], [1029, 1076, 5], [251, 117, 2], [589, 589, 2], [1026, 150, 7], [1040, 181, 2], [1129, 172, 4], [138, 1076, 1], [240, 348, 2], [1042, 176, 4], [133, 144, 3], [1047, 152, 4], [249, 249, 5], [1084, 168, 2], [173, 1113, 1], [220, 220, 6], [293, 293, 3], [296, 296, 3], [338, 179, 2], [621, 621, 2], [164, 164, 1], [219, 151, 1], [104, 283, 1], [231, 177, 2], [132, 1043, 2], [148, 136, 1], [280, 280, 3], [1036, 189, 4], [163, 272, 1], [448, 448, 2], [274, 258, 1], [330, 330, 3], [146, 263, 2], [168, 168, 1], [1054, 144, 4], [136, 103, 1], [163, 1027, 1], [1031, 233, 2], [248, 145, 2], [173, 1032, 1], [587, 587, 2], [170, 170, 7], [247, 113, 2], [297, 172, 1], [371, 158, 1], [179, 1070, 2], [254, 138, 2], [1025, 180, 3], [1084, 152, 2], [1033, 242, 1], [1077, 156, 2], [147, 147, 7], [173, 180, 1], [1029, 1061, 6], [149, 231, 4], [144, 224, 2], [1104, 166, 3], [575, 575, 2], [1035, 1117, 2], [103, 315, 2], [1024, 306, 4], [217, 150, 1], [346, 346, 2], [1029, 267, 6], [1035, 1140, 2], [1040, 180, 2], [1077, 166, 2], [148, 222, 4], [223, 176, 2], [247, 339, 2], [146, 1041, 2], [1031, 1075, 1], [145, 214, 2], [146, 176, 2], [1029, 1078, 6], [103, 1132, 2], [265, 265, 4], [138, 255, 2], [145, 252, 2], [548, 548, 2], [35, 35, 2], [379, 379, 2], [1029, 263, 6], [151, 231, 1], [262, 262, 3], [307, 176, 2], [224, 144, 2], [1048, 132, 6], [179, 303, 2], [299, 299, 4], [513, 513, 2], [1026, 147, 7], [233, 233, 6], [136, 1055, 2], [1032, 293, 3], [301, 301, 4], [136, 1061, 2], [146, 1045, 2], [245, 1025, 1], [151, 214, 2], [215, 150, 1], [236, 236, 5], [1098, 133, 6], [110, 110, 4], [165, 1033, 1], [438, 438, 2], [1032, 292, 3], [145, 215, 1], [230, 144, 1], [1047, 163, 4], [216, 154, 2], [250, 133, 2], [1031, 177, 6], [1043, 133, 4], [600, 600, 2], [541, 541, 2], [1035, 1148, 2], [1054, 133, 4], [145, 220, 2], [147, 189, 2], [1029, 1076, 6], [138, 149, 1], [1042, 1062, 4], [132, 1045, 2], [680, 680, 2], [221, 154, 2], [226, 150, 1], [179, 325, 2], [1048, 145, 3], [1032, 270, 3], [1029, 264, 6], [231, 151, 1], [315, 176, 2], [355, 189, 2], [1097, 152, 2], [144, 230, 2], [157, 314, 2], [367, 367, 1], [1034, 1078, 2], [1104, 152, 3], [219, 177, 2], [232, 155, 2], [145, 214, 1], [147, 261, 2], [1077, 165, 2], [156, 1157, 1], [1025, 163, 3], [531, 531, 2], [1025, 270, 2], [1026, 148, 7], [254, 254, 2], [278, 278, 4], [149, 220, 4], [1213, 1034, 1], [1026, 138, 7], [259, 259, 5], [146, 189, 2], [151, 1066, 2], [215, 136, 3], [147, 1043, 2], [1096, 168, 2], [144, 226, 1], [1032, 272, 3], [104, 1139, 1], [149, 1050, 2], [375, 375, 2], [1031, 255, 2], [206, 206, 2], [222, 222, 7], [241, 241, 6], [396, 396, 2], [1112, 163, 2], [1032, 268, 3], [150, 226, 1], [598, 598, 2], [1056, 177, 5], [223, 223, 5], [228, 176, 2], [1155, 145, 4], [138, 219, 3], [158, 246, 2], [1081, 168, 2], [104, 293, 1], [138, 214, 3], [258, 258, 3], [216, 153, 2], [361, 361, 3], [1089, 1031, 2], [132, 1058, 2], [156, 242, 2], [1026, 136, 7], [152, 152, 1], [348, 348, 3], [103, 133, 1], [179, 217, 2], [1026, 133, 7], [300, 224, 1], [353, 353, 3], [1091, 1031, 2], [1113, 165, 3], [149, 1045, 2], [402, 402, 2], [458, 458, 2], [329, 329, 2], [395, 395, 2], [144, 1054, 2], [1050, 146, 4], [1026, 146, 7], [1040, 165, 4], [1316, 168, 1], [235, 235, 5], [1025, 272, 2], [1031, 262, 2], [1063, 151, 6], [263, 263, 3], [1031, 1079, 2], [103, 275, 2], [1040, 173, 4], [147, 1064, 2], [1026, 151, 7], [1033, 242, 3], [163, 163, 2], [217, 179, 2], [260, 260, 5], [313, 313, 3], [255, 255, 3], [1035, 1062, 2], [1043, 132, 4], [1043, 148, 4], [152, 1128, 1], [176, 1079, 2], [1032, 283, 3], [1119, 180, 3], [397, 168, 1], [1050, 145, 4], [149, 148, 2], [356, 356, 2], [391, 391, 2], [1040, 166, 4], [1061, 150, 2], [156, 326, 1], [156, 1027, 1], [288, 288, 2], [399, 399, 2], [439, 439, 2], [1031, 258, 2], [1110, 1110, 4], [144, 1049, 2], [1043, 179, 4], [1116, 1116, 4], [103, 311, 2], [136, 252, 2], [145, 1058, 2], [1025, 268, 2], [1034, 224, 2], [1034, 1190, 1], [104, 292, 1], [172, 180, 1], [298, 173, 1], [148, 236, 3], [248, 132, 2], [335, 335, 3], [244, 244, 5], [1032, 259, 3], [1104, 168, 3], [230, 230, 5], [427, 427, 2], [1038, 1319, 2], [1045, 177, 4], [147, 262, 2], [132, 248, 2], [144, 226, 2], [165, 1027, 1], [146, 1065, 2], [228, 228, 5], [355, 355, 2], [1031, 1075, 2], [1032, 324, 3], [243, 243, 5], [1025, 271, 2], [159, 159, 4], [1077, 158, 2], [104, 298, 1], [447, 154, 2], [1032, 260, 3], [220, 149, 3], [1113, 168, 3], [1045, 133, 4], [1134, 173, 4], [327, 173, 1], [1040, 168, 4], [1096, 158, 2], [366, 366, 1], [1031, 1061, 2], [146, 266, 2], [1055, 150, 3], [104, 299, 1], [214, 177, 2], [1031, 263, 2], [189, 333, 2], [1032, 271, 3], [223, 145, 2], [409, 409, 2], [114, 164, 2], [284, 284, 3], [331, 331, 2], [240, 240, 5], [302, 302, 3], [1051, 132, 4], [149, 220, 2], [166, 1027, 1], [325, 325, 3], [1025, 260, 2], [1032, 287, 3], [104, 301, 1], [114, 157, 2], [235, 144, 1], [382, 382, 1], [1031, 231, 2], [1034, 226, 2], [138, 1041, 2], [1025, 287, 2], [1029, 1067, 3], [1046, 133, 1], [224, 300, 1], [104, 287, 1], [170, 170, 3], [1025, 259, 2], [1033, 152, 4], [136, 1042, 2], [1031, 249, 2], [1034, 230, 2], [103, 351, 2], [148, 1043, 2], [258, 133, 2], [177, 308, 2], [1029, 289, 6], [1041, 138, 4], [144, 235, 2], [392, 168, 1], [166, 242, 1], [239, 239, 1], [1038, 180, 4], [145, 1079, 2], [1024, 344, 4], [1029, 1127, 5], [233, 179, 2], [294, 294, 3], [305, 305, 3], [1047, 245, 1], [1118, 149, 3], [1029, 266, 6], [190, 190, 2], [264, 132, 2], [1031, 244, 2], [1034, 223, 2], [1136, 148, 3], [149, 231, 2], [349, 349, 1], [679, 679, 2], [136, 1041, 2], [150, 233, 1], [1031, 243, 2], [221, 155, 2], [1095, 156, 3], [163, 268, 1], [408, 168, 1], [1040, 156, 4], [104, 324, 1], [150, 241, 1], [1031, 252, 2], [1096, 152, 2], [1029, 285, 6], [1031, 1078, 1], [1097, 168, 2], [1040, 158, 4], [1049, 144, 1], [176, 220, 2], [1113, 152, 3], [145, 1060, 2], [1029, 281, 6], [148, 233, 2], [703, 703, 2], [137, 137, 2], [1031, 257, 2], [1033, 245, 3], [132, 1052, 2], [226, 103, 2], [249, 177, 2], [292, 180, 1], [96, 96, 2], [649, 649, 2], [1045, 132, 4], [158, 1162, 1], [219, 219, 6], [223, 1062, 2], [362, 362, 1], [286, 286, 3], [151, 249, 1], [234, 234, 1], [380, 380, 2], [1054, 132, 4], [138, 1042, 2], [146, 276, 2], [163, 271, 1], [165, 246, 1], [786, 786, 2], [1025, 283, 2], [145, 228, 2], [164, 117, 2], [222, 144, 1], [378, 172, 1], [132, 252, 2], [147, 189, 1], [1040, 172, 4], [215, 179, 2], [414, 414, 2], [250, 250, 5], [1042, 138, 4], [150, 217, 2], [162, 162, 4], [258, 136, 2], [1026, 1092, 3], [104, 319, 1], [358, 236, 2], [1029, 276, 6], [104, 297, 1], [150, 215, 2], [16, 16, 2], [177, 231, 2], [283, 180, 1], [1038, 181, 4], [1041, 136, 4], [1042, 136, 4], [147, 269, 2], [151, 224, 1], [177, 304, 2], [421, 421, 2], [1031, 236, 2], [359, 189, 2], [1029, 1126, 5], [1061, 179, 4], [138, 224, 3], [148, 1045, 2], [393, 393, 2], [1029, 269, 6], [177, 331, 2], [1033, 246, 3], [1034, 214, 2], [103, 355, 2], [265, 168, 2], [293, 166, 1], [1108, 132, 6], [220, 149, 4], [275, 275, 4], [386, 386, 2], [279, 279, 4], [1097, 156, 2], [255, 133, 1], [220, 176, 2], [226, 226, 6], [1043, 147, 4], [146, 1046, 2], [270, 270, 4], [431, 431, 2], [1095, 165, 3], [1142, 172, 1], [280, 280, 4], [1025, 292, 2], [1034, 222, 2], [262, 133, 1], [329, 173, 1], [1029, 274, 6], [1042, 148, 4], [1045, 148, 4], [177, 334, 2], [1031, 1079, 1], [1034, 217, 2], [230, 144, 2], [240, 149, 5], [328, 328, 3], [1031, 254, 2], [132, 267, 2], [293, 180, 1], [308, 231, 2], [1066, 147, 4], [152, 318, 1], [314, 314, 3], [158, 330, 1], [179, 320, 2], [1029, 103, 5], [1034, 248, 2], [1038, 1344, 2], [103, 304, 2], [147, 1046, 2], [179, 338, 2], [189, 1067, 2], [1034, 228, 2], [1034, 235, 2], [133, 306, 2], [1080, 136, 6], [219, 138, 3], [179, 146, 2], [189, 355, 2], [1052, 1085, 4], [153, 153, 4], [176, 146, 2], [202, 202, 2], [1025, 293, 2], [226, 144, 2], [163, 1120, 1], [222, 148, 4], [152, 1027, 1], [1029, 282, 6], [165, 245, 1], [410, 156, 1], [1058, 132, 4], [158, 1027, 1], [1032, 301, 3], [1050, 147, 4], [1207, 170, 6], [285, 146, 2], [339, 339, 1], [152, 319, 1], [179, 233, 2], [1047, 170, 4], [1095, 166, 3], [149, 1043, 2], [222, 148, 2], [177, 305, 2], [271, 271, 4], [217, 150, 2], [1052, 132, 4], [138, 254, 2], [140, 200, 2], [1032, 297, 3], [258, 133, 1], [1065, 146, 6], [19, 19, 2], [215, 145, 2], [266, 266, 4], [1034, 233, 2], [1034, 1135, 1], [104, 322, 1], [248, 248, 5], [1051, 136, 4], [1081, 165, 2], [214, 214, 6], [283, 165, 1], [136, 1045, 2], [170, 1105, 1], [176, 358, 2], [1029, 277, 6], [327, 327, 3], [1038, 1272, 2], [36, 36, 2], [138, 144, 1], [191, 191, 2], [801, 801, 1], [1032, 444, 3], [1054, 147, 4], [136, 1069, 2], [273, 148, 2], [132, 264, 2], [139, 139, 2], [1031, 241, 2], [255, 255, 2], [1025, 324, 2], [1034, 1061, 1], [257, 257, 4], [1029, 280, 6], [1034, 219, 2], [1095, 158, 3], [228, 145, 2], [333, 333, 3], [1059, 136, 1], [177, 335, 2], [247, 367, 2], [176, 411, 2], [262, 133, 2], [272, 272, 4], [1033, 168, 4], [260, 152, 1], [1051, 1083, 4], [180, 152, 1], [224, 144, 1], [1031, 1078, 2], [138, 1043, 2], [242, 152, 1], [1034, 262, 2], [1046, 138, 4], [156, 1093, 1], [1026, 189, 5], [215, 215, 6], [1029, 295, 6], [149, 240, 3], [166, 245, 1], [217, 217, 7], [1027, 1093, 4], [1029, 273, 6], [353, 180, 1], [1025, 444, 2], [158, 158, 1], [269, 269, 4], [326, 326, 2], [1059, 148, 1], [159, 115, 2], [1054, 136, 4], [170, 245, 1], [309, 226, 1], [163, 1033, 1], [224, 151, 1], [1045, 146, 4], [132, 1041, 2], [10, 10, 2], [138, 1066, 2], [148, 1049, 2], [290, 290, 3], [306, 446, 2], [1029, 1056, 3], [179, 347, 2], [189, 136, 2], [334, 334, 3], [1046, 136, 4], [1051, 133, 4], [181, 181, 7], [103, 303, 2], [1034, 215, 2], [1034, 1075, 1], [1026, 1098, 3], [1141, 168, 3], [132, 254, 2], [265, 166, 1], [270, 165, 1], [1025, 297, 2], [150, 144, 1], [151, 144, 1], [146, 1050, 2], [1125, 147, 6], [113, 157, 2], [123, 123, 2], [177, 147, 2], [1027, 1139, 4], [1031, 261, 2], [1045, 149, 4], [1032, 298, 3], [150, 1069, 2], [276, 276, 3], [389, 168, 1], [1029, 284, 6], [189, 359, 2], [259, 168, 1], [432, 432, 2], [103, 305, 2], [1054, 146, 4], [1082, 138, 6], [1207, 156, 6], [1052, 133, 4], [1138, 152, 3], [214, 151, 2], [231, 231, 6], [1064, 147, 6], [117, 251, 2], [132, 1051, 2], [176, 228, 2], [1084, 166, 2], [173, 1033, 1], [1043, 149, 4], [1059, 132, 1], [1032, 299, 3], [263, 133, 2], [338, 338, 2], [1029, 288, 6], [25, 25, 2], [177, 219, 2], [445, 445, 2], [104, 110, 1], [170, 1033, 1], [429, 429, 2], [1031, 1076, 2], [1059, 147, 1], [148, 236, 4], [1186, 156, 1], [150, 138, 2], [220, 220, 7], [259, 152, 1], [291, 291, 3], [306, 133, 2], [348, 240, 2], [1038, 1413, 2], [1094, 1094, 2], [179, 241, 2], [114, 239, 2], [163, 270, 1], [252, 132, 2], [287, 287, 4], [1053, 176, 7], [1207, 163, 6], [281, 147, 2], [581, 581, 2], [164, 164, 4], [235, 144, 2], [464, 464, 2], [158, 104, 3], [351, 189, 2], [151, 243, 1], [222, 1067, 2], [1035, 103, 7], [1036, 179, 4], [1062, 257, 1], [214, 145, 2], [267, 132, 2], [424, 424, 2], [241, 149, 2], [311, 311, 3], [435, 435, 2], [1141, 152, 3], [246, 152, 1], [323, 323, 2], [172, 1104, 1], [146, 1052, 2], [243, 151, 1], [264, 264, 3], [215, 150, 2], [1138, 168, 3], [260, 168, 1], [1036, 177, 4], [1096, 156, 2], [176, 223, 2], [180, 1033, 1], [224, 224, 6], [518, 518, 2], [249, 249, 6], [1136, 148, 2], [681, 681, 2], [155, 221, 2], [1029, 286, 6], [154, 216, 2], [1029, 291, 6], [133, 1045, 2], [141, 199, 2], [144, 1043, 2], [149, 1041, 2], [1026, 1130, 3], [1034, 220, 2], [117, 162, 2], [132, 103, 1], [133, 1043, 2], [189, 138, 2], [1034, 255, 2], [121, 121, 2], [179, 1061, 2], [442, 442, 2], [233, 148, 2], [400, 156, 1], [405, 405, 2], [149, 241, 2], [254, 254, 4], [1075, 145, 2], [1206, 170, 1], [419, 419, 2], [144, 1052, 2], [176, 147, 2], [215, 103, 2], [1141, 156, 3], [172, 270, 1], [179, 226, 2], [271, 166, 1], [132, 1117, 2], [1059, 146, 1], [167, 237, 2], [437, 437, 2], [767, 767, 2], [1069, 1070, 1], [1106, 166, 2], [348, 189, 2], [1207, 158, 6], [176, 417, 2], [245, 245, 5], [1097, 158, 2], [104, 318, 1], [214, 138, 3], [263, 133, 1], [1186, 165, 1], [145, 1043, 2], [215, 136, 4], [236, 358, 2], [272, 156, 1], [148, 1057, 2], [1244, 144, 2], [303, 217, 2], [466, 466, 2], [1034, 258, 2], [113, 159, 2], [149, 241, 4], [149, 1048, 2], [242, 242, 6], [1059, 149, 1], [133, 1052, 2], [144, 250, 2], [223, 296, 2], [265, 165, 1], [268, 158, 1], [288, 147, 2], [343, 343, 2], [1186, 170, 1], [246, 246, 6], [1138, 158, 3], [1207, 152, 6], [172, 172, 2], [373, 189, 2], [376, 376, 2], [1027, 1099, 4], [1031, 291, 2], [146, 146, 7], [372, 163, 1], [284, 284, 4], [1237, 189, 4], [114, 105, 2], [138, 150, 2], [228, 302, 2], [1037, 1086, 5], [233, 103, 2], [371, 163, 1], [138, 1063, 2], [1062, 261, 1], [1029, 279, 6], [1029, 278, 6], [1050, 132, 1], [330, 330, 4], [1034, 1135, 2], [220, 145, 2], [543, 543, 2], [1040, 180, 4], [136, 1046, 2], [231, 149, 3], [297, 152, 1], [1026, 1140, 1], [1033, 1152, 1], [1106, 165, 2], [104, 321, 1], [149, 231, 3], [219, 151, 2], [278, 278, 2], [316, 316, 2], [1031, 240, 2], [1047, 168, 4], [133, 1051, 2], [136, 151, 2], [176, 1155, 2], [1025, 299, 2], [148, 250, 4], [226, 150, 2], [265, 168, 1], [138, 189, 2], [177, 1076, 2], [292, 292, 4], [1035, 189, 4], [172, 1032, 1], [251, 382, 2], [1119, 158, 3], [155, 110, 2], [193, 193, 2], [173, 271, 1], [298, 168, 1], [148, 233, 3], [413, 158, 1], [1058, 145, 4], [132, 1046, 2], [282, 147, 2], [1035, 189, 2], [1047, 156, 4], [144, 222, 2], [152, 322, 1], [1026, 176, 5], [1034, 263, 2], [151, 136, 2], [276, 146, 2], [342, 342, 2], [1059, 138, 1], [1115, 133, 6], [318, 165, 1], [1047, 1404, 1], [142, 142, 2], [181, 181, 2], [1025, 298, 2], [1031, 267, 2], [1031, 274, 2], [138, 1052, 2], [177, 249, 2], [230, 103, 2], [252, 132, 1], [275, 248, 2], [307, 307, 3], [1029, 1070, 3], [1092, 1026, 1], [110, 168, 1], [281, 281, 3], [1029, 1118, 1], [1129, 168, 4], [153, 216, 2], [181, 1032, 1], [347, 347, 3], [1031, 286, 2], [1061, 1061, 2], [1104, 165, 3], [1129, 166, 4], [1186, 158, 1], [1207, 180, 6], [152, 321, 1], [147, 176, 2], [1031, 264, 2], [1124, 146, 6], [1207, 165, 6], [167, 232, 2], [272, 158, 1], [1034, 1079, 2], [179, 148, 2], [179, 311, 2], [246, 168, 1], [219, 219, 7], [231, 103, 2], [132, 252, 1], [1038, 1437, 2], [1119, 165, 3], [351, 351, 2], [1058, 133, 4], [1186, 166, 1], [1200, 1033, 1], [144, 1051, 2], [235, 103, 2], [242, 168, 1], [136, 226, 3], [223, 103, 2], [1048, 145, 5], [1119, 166, 3], [170, 1037, 1], [358, 176, 2], [1059, 145, 1], [224, 189, 2], [283, 283, 4], [181, 1033, 1], [214, 103, 2], [1207, 181, 6], [104, 327, 1], [150, 252, 1], [159, 113, 2], [226, 309, 1], [1034, 236, 2], [1207, 166, 6], [144, 1045, 2], [1034, 1076, 2], [1078, 189, 3], [145, 267, 2], [119, 119, 3], [147, 1050, 2], [1025, 301, 2], [1034, 1061, 2], [1031, 273, 2], [254, 132, 1], [1035, 1151, 2], [576, 576, 2], [224, 177, 2], [1106, 158, 2], [1067, 1067, 2], [149, 133, 1], [230, 189, 2], [156, 156, 1], [613, 613, 2], [1077, 170, 2], [145, 264, 2], [146, 1054, 2], [261, 261, 4], [398, 152, 1], [1047, 172, 4], [151, 255, 1], [268, 156, 1], [1031, 300, 2], [149, 138, 1], [88, 88, 1], [1035, 176, 2], [148, 233, 4], [151, 219, 2], [177, 214, 2], [237, 153, 2], [1031, 1056, 2], [1138, 156, 3], [1206, 166, 1], [1219, 156, 1], [103, 132, 1], [136, 1054, 2], [150, 244, 1], [279, 146, 2], [346, 346, 3], [1081, 170, 2], [528, 366, 2], [1058, 147, 4], [117, 117, 4], [433, 168, 1], [164, 114, 2], [571, 571, 2], [145, 1045, 2], [148, 1042, 2], [1031, 266, 2], [110, 154, 2], [162, 115, 2], [662, 662, 2], [1035, 1083, 2], [1087, 1060, 1], [103, 136, 1], [179, 215, 2], [241, 149, 4], [297, 168, 1], [389, 172, 1], [1074, 1260, 3], [105, 113, 2], [1120, 156, 4], [1143, 180, 4], [103, 331, 2], [150, 146, 1], [158, 1099, 1], [1031, 276, 2], [1119, 156, 3], [132, 1054, 2], [133, 1054, 2], [136, 1051, 2], [1032, 346, 3], [104, 329, 1], [163, 1037, 1], [1029, 306, 6], [221, 221, 4], [258, 258, 2], [339, 157, 2], [1035, 1187, 2], [1040, 181, 4], [1063, 151, 3], [1156, 165, 4], [148, 222, 5], [217, 303, 2], [286, 286, 4], [459, 459, 3], [146, 223, 3], [179, 369, 2], [275, 220, 2], [1031, 269, 2], [148, 222, 3], [173, 173, 6], [243, 243, 6], [254, 132, 2], [298, 152, 1], [1134, 168, 4], [214, 214, 7], [712, 712, 2], [132, 344, 2], [398, 156, 1], [1066, 148, 4], [1113, 166, 3], [274, 274, 3], [315, 315, 3], [1026, 1247, 1], [226, 144, 1], [235, 189, 2], [282, 282, 3], [1027, 292, 4], [1052, 138, 4], [1066, 1056, 1], [170, 1077, 1], [218, 218, 2], [1259, 156, 1], [376, 163, 1], [1024, 296, 4], [1035, 1161, 2], [299, 156, 1], [1088, 240, 2], [1152, 166, 4], [285, 285, 3], [1037, 245, 5], [1041, 189, 4], [1207, 172, 6], [133, 255, 1], [147, 1054, 2], [257, 296, 2], [1106, 156, 2], [1257, 158, 1], [136, 215, 3], [224, 151, 2], [1105, 170, 2], [1134, 165, 4], [228, 1062, 2], [103, 145, 1], [147, 1051, 2], [1031, 280, 2], [1058, 146, 4], [1257, 163, 1], [138, 249, 3], [242, 170, 1], [1026, 1115, 1], [1207, 168, 6], [1038, 245, 2], [132, 254, 1], [1206, 165, 1], [136, 189, 2], [228, 103, 2], [1060, 1048, 1], [150, 226, 2], [152, 1086, 1], [211, 211, 2], [144, 151, 1], [301, 166, 1], [331, 331, 3], [420, 156, 1], [1034, 249, 2], [446, 222, 2], [1032, 327, 3], [110, 155, 2], [1029, 309, 6], [283, 166, 1], [425, 158, 1], [1031, 278, 2], [1031, 289, 2], [314, 157, 2], [1034, 1079, 1], [1035, 176, 4], [224, 103, 2], [248, 149, 5], [293, 293, 4], [159, 313, 2]]} \ No newline at end of file +{ + "spatial_merges": [ + [ + 4, + 13 + ], + [ + 22, + 84 + ], + [ + 38, + 61 + ], + [ + 98, + 99 + ], + [ + 100, + 101 + ], + [ + 96, + 102 + ], + [ + 97, + 102 + ], + [ + 96, + 100 + ], + [ + 61, + 96 + ], + [ + 38, + 96 + ], + [ + 22, + 98 + ], + [ + 84, + 98 + ], + [ + 97, + 100 + ], + [ + 13, + 99 + ], + [ + 4, + 99 + ], + [ + 62, + 107 + ], + [ + 37, + 106 + ], + [ + 39, + 106 + ], + [ + 97, + 101 + ], + [ + 60, + 107 + ], + [ + 83, + 108 + ], + [ + 85, + 108 + ], + [ + 21, + 109 + ], + [ + 5, + 111 + ], + [ + 23, + 109 + ], + [ + 3, + 111 + ], + [ + 14, + 112 + ], + [ + 12, + 112 + ], + [ + 61, + 97 + ], + [ + 62, + 96 + ], + [ + 38, + 60 + ], + [ + 61, + 116 + ], + [ + 3, + 13 + ], + [ + 5, + 13 + ], + [ + 101, + 113 + ], + [ + 101, + 117 + ], + [ + 60, + 96 + ], + [ + 22, + 83 + ], + [ + 101, + 114 + ], + [ + 22, + 85 + ], + [ + 101, + 115 + ], + [ + 23, + 84 + ], + [ + 4, + 14 + ], + [ + 4, + 12 + ], + [ + 21, + 84 + ], + [ + 38, + 62 + ], + [ + 105, + 120 + ], + [ + 105, + 122 + ], + [ + 105, + 118 + ], + [ + 105, + 119 + ], + [ + 105, + 121 + ], + [ + 105, + 123 + ], + [ + 105, + 125 + ], + [ + 105, + 124 + ], + [ + 116, + 128 + ], + [ + 37, + 126 + ], + [ + 97, + 128 + ], + [ + 39, + 126 + ], + [ + 37, + 129 + ], + [ + 37, + 127 + ], + [ + 39, + 129 + ], + [ + 39, + 127 + ], + [ + 23, + 98 + ], + [ + 21, + 98 + ], + [ + 39, + 134 + ], + [ + 110, + 120 + ], + [ + 37, + 134 + ], + [ + 110, + 119 + ], + [ + 110, + 118 + ], + [ + 97, + 143 + ], + [ + 116, + 143 + ], + [ + 3, + 99 + ], + [ + 110, + 121 + ], + [ + 5, + 99 + ], + [ + 110, + 125 + ], + [ + 110, + 124 + ], + [ + 60, + 97 + ], + [ + 105, + 130 + ], + [ + 113, + 122 + ], + [ + 115, + 124 + ], + [ + 105, + 131 + ], + [ + 114, + 125 + ], + [ + 110, + 122 + ], + [ + 110, + 123 + ], + [ + 105, + 140 + ], + [ + 83, + 160 + ], + [ + 135, + 141 + ], + [ + 62, + 97 + ], + [ + 85, + 160 + ], + [ + 85, + 161 + ], + [ + 83, + 161 + ], + [ + 117, + 120 + ], + [ + 23, + 85 + ], + [ + 14, + 169 + ], + [ + 12, + 171 + ], + [ + 12, + 169 + ], + [ + 23, + 83 + ], + [ + 137, + 141 + ], + [ + 14, + 171 + ], + [ + 137, + 140 + ], + [ + 21, + 85 + ], + [ + 3, + 12 + ], + [ + 3, + 14 + ], + [ + 139, + 141 + ], + [ + 21, + 83 + ], + [ + 130, + 139 + ], + [ + 131, + 142 + ], + [ + 5, + 12 + ], + [ + 130, + 142 + ], + [ + 131, + 139 + ], + [ + 141, + 142 + ], + [ + 131, + 135 + ], + [ + 5, + 14 + ], + [ + 131, + 137 + ], + [ + 130, + 137 + ], + [ + 135, + 140 + ], + [ + 101, + 159 + ], + [ + 101, + 157 + ], + [ + 37, + 174 + ], + [ + 114, + 118 + ], + [ + 130, + 135 + ], + [ + 115, + 119 + ], + [ + 113, + 123 + ], + [ + 39, + 174 + ], + [ + 117, + 121 + ], + [ + 113, + 118 + ], + [ + 101, + 162 + ], + [ + 60, + 116 + ], + [ + 101, + 164 + ], + [ + 139, + 140 + ], + [ + 113, + 119 + ], + [ + 140, + 142 + ], + [ + 117, + 119 + ], + [ + 115, + 123 + ], + [ + 39, + 185 + ], + [ + 114, + 121 + ], + [ + 40, + 106 + ], + [ + 117, + 118 + ], + [ + 113, + 121 + ], + [ + 37, + 185 + ], + [ + 62, + 116 + ], + [ + 36, + 106 + ], + [ + 117, + 123 + ], + [ + 114, + 123 + ], + [ + 125, + 153 + ], + [ + 115, + 118 + ], + [ + 114, + 119 + ], + [ + 120, + 154 + ], + [ + 124, + 155 + ], + [ + 63, + 107 + ], + [ + 139, + 175 + ], + [ + 115, + 121 + ], + [ + 142, + 178 + ], + [ + 59, + 107 + ], + [ + 114, + 122 + ], + [ + 63, + 96 + ], + [ + 115, + 122 + ], + [ + 115, + 120 + ], + [ + 59, + 96 + ], + [ + 105, + 183 + ], + [ + 114, + 120 + ], + [ + 119, + 155 + ], + [ + 118, + 153 + ], + [ + 105, + 186 + ], + [ + 105, + 187 + ], + [ + 105, + 188 + ], + [ + 113, + 124 + ], + [ + 122, + 167 + ], + [ + 105, + 184 + ], + [ + 113, + 125 + ], + [ + 119, + 154 + ], + [ + 137, + 182 + ], + [ + 37, + 225 + ], + [ + 39, + 225 + ], + [ + 118, + 154 + ], + [ + 139, + 178 + ], + [ + 117, + 125 + ], + [ + 113, + 203 + ], + [ + 135, + 178 + ], + [ + 117, + 124 + ], + [ + 142, + 175 + ], + [ + 135, + 182 + ], + [ + 105, + 193 + ], + [ + 137, + 175 + ], + [ + 137, + 178 + ], + [ + 39, + 238 + ], + [ + 105, + 191 + ], + [ + 135, + 175 + ], + [ + 105, + 196 + ], + [ + 118, + 167 + ], + [ + 105, + 195 + ], + [ + 105, + 201 + ], + [ + 82, + 108 + ], + [ + 105, + 192 + ], + [ + 119, + 167 + ], + [ + 37, + 238 + ], + [ + 86, + 108 + ], + [ + 139, + 182 + ], + [ + 113, + 183 + ], + [ + 119, + 153 + ], + [ + 118, + 155 + ], + [ + 121, + 154 + ], + [ + 142, + 182 + ], + [ + 121, + 153 + ], + [ + 113, + 186 + ], + [ + 114, + 184 + ], + [ + 115, + 197 + ], + [ + 124, + 159 + ], + [ + 117, + 122 + ], + [ + 122, + 157 + ], + [ + 115, + 191 + ], + [ + 105, + 208 + ], + [ + 59, + 97 + ], + [ + 125, + 157 + ], + [ + 139, + 199 + ], + [ + 40, + 127 + ], + [ + 36, + 127 + ], + [ + 122, + 159 + ], + [ + 22, + 82 + ], + [ + 141, + 194 + ], + [ + 120, + 155 + ], + [ + 110, + 187 + ], + [ + 114, + 193 + ], + [ + 120, + 153 + ], + [ + 110, + 188 + ], + [ + 22, + 86 + ], + [ + 110, + 204 + ], + [ + 114, + 192 + ], + [ + 110, + 184 + ], + [ + 121, + 155 + ], + [ + 40, + 134 + ], + [ + 123, + 155 + ], + [ + 110, + 197 + ], + [ + 124, + 162 + ], + [ + 141, + 202 + ], + [ + 117, + 204 + ], + [ + 115, + 213 + ], + [ + 115, + 196 + ], + [ + 130, + 198 + ], + [ + 139, + 200 + ], + [ + 125, + 164 + ], + [ + 37, + 253 + ], + [ + 137, + 200 + ], + [ + 135, + 205 + ], + [ + 131, + 194 + ], + [ + 137, + 199 + ], + [ + 113, + 120 + ], + [ + 4, + 15 + ], + [ + 121, + 167 + ], + [ + 114, + 195 + ], + [ + 117, + 206 + ], + [ + 37, + 256 + ], + [ + 135, + 199 + ], + [ + 120, + 162 + ], + [ + 140, + 198 + ], + [ + 123, + 167 + ], + [ + 113, + 190 + ], + [ + 117, + 187 + ], + [ + 130, + 202 + ], + [ + 135, + 210 + ], + [ + 113, + 207 + ], + [ + 117, + 188 + ], + [ + 137, + 210 + ], + [ + 36, + 126 + ], + [ + 36, + 134 + ], + [ + 110, + 209 + ], + [ + 142, + 205 + ], + [ + 135, + 200 + ], + [ + 40, + 126 + ], + [ + 39, + 253 + ], + [ + 110, + 211 + ], + [ + 114, + 201 + ], + [ + 142, + 200 + ], + [ + 124, + 154 + ], + [ + 125, + 154 + ], + [ + 120, + 164 + ], + [ + 139, + 205 + ], + [ + 118, + 157 + ], + [ + 123, + 154 + ], + [ + 115, + 227 + ], + [ + 123, + 153 + ], + [ + 119, + 159 + ], + [ + 2, + 13 + ], + [ + 130, + 194 + ], + [ + 39, + 256 + ], + [ + 137, + 205 + ], + [ + 142, + 210 + ], + [ + 131, + 202 + ], + [ + 119, + 162 + ], + [ + 140, + 190 + ], + [ + 6, + 13 + ], + [ + 122, + 153 + ], + [ + 131, + 198 + ], + [ + 4, + 11 + ], + [ + 122, + 155 + ], + [ + 118, + 164 + ], + [ + 63, + 97 + ], + [ + 131, + 190 + ], + [ + 123, + 157 + ], + [ + 110, + 183 + ], + [ + 110, + 208 + ], + [ + 123, + 159 + ], + [ + 110, + 192 + ], + [ + 141, + 190 + ], + [ + 123, + 162 + ], + [ + 142, + 199 + ], + [ + 24, + 84 + ], + [ + 121, + 157 + ], + [ + 115, + 229 + ], + [ + 110, + 229 + ], + [ + 110, + 186 + ], + [ + 121, + 164 + ], + [ + 125, + 167 + ], + [ + 113, + 201 + ], + [ + 140, + 194 + ], + [ + 124, + 167 + ], + [ + 118, + 159 + ], + [ + 139, + 210 + ], + [ + 110, + 196 + ], + [ + 113, + 227 + ], + [ + 110, + 218 + ], + [ + 15, + 112 + ], + [ + 110, + 195 + ], + [ + 123, + 164 + ], + [ + 110, + 206 + ], + [ + 110, + 212 + ], + [ + 119, + 157 + ], + [ + 110, + 213 + ], + [ + 141, + 198 + ], + [ + 11, + 112 + ], + [ + 130, + 190 + ], + [ + 119, + 164 + ], + [ + 121, + 159 + ], + [ + 118, + 162 + ], + [ + 121, + 162 + ], + [ + 110, + 203 + ], + [ + 114, + 208 + ], + [ + 155, + 197 + ], + [ + 110, + 193 + ], + [ + 153, + 184 + ], + [ + 2, + 12 + ], + [ + 20, + 84 + ], + [ + 140, + 202 + ], + [ + 110, + 207 + ], + [ + 157, + 201 + ], + [ + 110, + 191 + ], + [ + 120, + 167 + ], + [ + 159, + 227 + ], + [ + 117, + 207 + ], + [ + 38, + 310 + ], + [ + 124, + 234 + ], + [ + 24, + 85 + ], + [ + 114, + 209 + ], + [ + 114, + 124 + ], + [ + 114, + 183 + ], + [ + 113, + 212 + ], + [ + 117, + 212 + ], + [ + 115, + 212 + ], + [ + 115, + 125 + ], + [ + 110, + 201 + ], + [ + 125, + 239 + ], + [ + 2, + 111 + ], + [ + 110, + 227 + ], + [ + 113, + 218 + ], + [ + 115, + 186 + ], + [ + 113, + 209 + ], + [ + 119, + 221 + ], + [ + 114, + 218 + ], + [ + 122, + 154 + ], + [ + 117, + 229 + ], + [ + 117, + 211 + ], + [ + 115, + 211 + ], + [ + 117, + 209 + ], + [ + 117, + 208 + ], + [ + 6, + 111 + ], + [ + 115, + 187 + ], + [ + 114, + 207 + ], + [ + 117, + 218 + ], + [ + 114, + 188 + ], + [ + 101, + 234 + ], + [ + 125, + 216 + ], + [ + 154, + 187 + ], + [ + 101, + 239 + ], + [ + 118, + 216 + ], + [ + 114, + 203 + ], + [ + 113, + 211 + ], + [ + 23, + 86 + ], + [ + 115, + 203 + ], + [ + 118, + 237 + ], + [ + 120, + 221 + ], + [ + 120, + 216 + ], + [ + 24, + 83 + ], + [ + 124, + 221 + ], + [ + 36, + 174 + ], + [ + 154, + 188 + ], + [ + 119, + 232 + ], + [ + 115, + 206 + ], + [ + 115, + 204 + ], + [ + 20, + 85 + ], + [ + 162, + 229 + ], + [ + 157, + 183 + ], + [ + 114, + 204 + ], + [ + 86, + 160 + ], + [ + 153, + 192 + ], + [ + 124, + 232 + ], + [ + 24, + 109 + ], + [ + 38, + 394 + ], + [ + 159, + 186 + ], + [ + 115, + 218 + ], + [ + 40, + 174 + ], + [ + 122, + 247 + ], + [ + 114, + 211 + ], + [ + 113, + 193 + ], + [ + 113, + 213 + ], + [ + 125, + 237 + ], + [ + 141, + 316 + ], + [ + 114, + 212 + ], + [ + 113, + 184 + ], + [ + 115, + 183 + ], + [ + 115, + 209 + ], + [ + 6, + 12 + ], + [ + 114, + 186 + ], + [ + 155, + 191 + ], + [ + 82, + 160 + ], + [ + 115, + 207 + ], + [ + 154, + 204 + ], + [ + 113, + 197 + ], + [ + 117, + 197 + ], + [ + 3, + 15 + ], + [ + 115, + 188 + ], + [ + 40, + 185 + ], + [ + 114, + 206 + ], + [ + 153, + 195 + ], + [ + 23, + 82 + ], + [ + 20, + 83 + ], + [ + 167, + 183 + ], + [ + 117, + 184 + ], + [ + 119, + 216 + ], + [ + 113, + 191 + ], + [ + 157, + 203 + ], + [ + 114, + 187 + ], + [ + 120, + 251 + ], + [ + 175, + 190 + ], + [ + 105, + 290 + ], + [ + 155, + 213 + ], + [ + 3, + 11 + ], + [ + 117, + 195 + ], + [ + 157, + 193 + ], + [ + 159, + 203 + ], + [ + 113, + 195 + ], + [ + 105, + 294 + ], + [ + 122, + 232 + ], + [ + 198, + 200 + ], + [ + 167, + 186 + ], + [ + 155, + 229 + ], + [ + 118, + 221 + ], + [ + 105, + 312 + ], + [ + 130, + 354 + ], + [ + 113, + 196 + ], + [ + 155, + 196 + ], + [ + 117, + 193 + ], + [ + 164, + 208 + ], + [ + 153, + 193 + ], + [ + 37, + 310 + ], + [ + 117, + 213 + ], + [ + 162, + 191 + ], + [ + 175, + 194 + ], + [ + 162, + 206 + ], + [ + 117, + 192 + ], + [ + 154, + 206 + ], + [ + 117, + 191 + ], + [ + 153, + 208 + ], + [ + 21, + 86 + ], + [ + 140, + 323 + ], + [ + 157, + 184 + ], + [ + 118, + 232 + ], + [ + 157, + 207 + ], + [ + 36, + 185 + ], + [ + 21, + 82 + ], + [ + 190, + 199 + ], + [ + 159, + 191 + ], + [ + 178, + 202 + ], + [ + 178, + 198 + ], + [ + 115, + 419 + ], + [ + 135, + 345 + ], + [ + 162, + 187 + ], + [ + 113, + 192 + ], + [ + 101, + 247 + ], + [ + 122, + 237 + ], + [ + 39, + 310 + ], + [ + 202, + 205 + ], + [ + 110, + 290 + ], + [ + 37, + 96 + ], + [ + 159, + 197 + ], + [ + 101, + 251 + ], + [ + 119, + 237 + ], + [ + 194, + 205 + ], + [ + 124, + 153 + ], + [ + 121, + 216 + ], + [ + 125, + 155 + ], + [ + 110, + 294 + ], + [ + 157, + 192 + ], + [ + 5, + 15 + ], + [ + 105, + 337 + ], + [ + 105, + 317 + ], + [ + 159, + 213 + ], + [ + 113, + 381 + ], + [ + 41, + 106 + ], + [ + 122, + 164 + ], + [ + 164, + 206 + ], + [ + 162, + 197 + ], + [ + 194, + 199 + ], + [ + 182, + 190 + ], + [ + 2, + 14 + ], + [ + 117, + 196 + ], + [ + 137, + 391 + ], + [ + 182, + 198 + ], + [ + 164, + 193 + ], + [ + 82, + 161 + ], + [ + 114, + 427 + ], + [ + 164, + 188 + ], + [ + 155, + 187 + ], + [ + 164, + 192 + ], + [ + 35, + 106 + ], + [ + 199, + 202 + ], + [ + 190, + 200 + ], + [ + 159, + 196 + ], + [ + 154, + 208 + ], + [ + 164, + 184 + ], + [ + 113, + 312 + ], + [ + 105, + 332 + ], + [ + 153, + 209 + ], + [ + 167, + 203 + ], + [ + 178, + 194 + ], + [ + 159, + 183 + ], + [ + 105, + 384 + ], + [ + 153, + 201 + ], + [ + 113, + 206 + ], + [ + 154, + 229 + ], + [ + 153, + 188 + ], + [ + 164, + 195 + ], + [ + 157, + 195 + ], + [ + 130, + 404 + ], + [ + 157, + 186 + ], + [ + 39, + 96 + ], + [ + 159, + 207 + ], + [ + 105, + 357 + ], + [ + 155, + 227 + ], + [ + 182, + 194 + ], + [ + 194, + 200 + ], + [ + 198, + 210 + ], + [ + 64, + 107 + ], + [ + 155, + 212 + ], + [ + 86, + 161 + ], + [ + 162, + 213 + ], + [ + 105, + 343 + ], + [ + 117, + 183 + ], + [ + 157, + 209 + ], + [ + 121, + 221 + ], + [ + 162, + 212 + ], + [ + 154, + 209 + ], + [ + 175, + 198 + ], + [ + 167, + 207 + ], + [ + 113, + 342 + ], + [ + 5, + 11 + ], + [ + 20, + 109 + ], + [ + 140, + 316 + ], + [ + 123, + 232 + ], + [ + 154, + 211 + ], + [ + 117, + 186 + ], + [ + 155, + 211 + ], + [ + 114, + 317 + ], + [ + 113, + 204 + ], + [ + 122, + 162 + ], + [ + 117, + 336 + ], + [ + 141, + 323 + ], + [ + 131, + 354 + ], + [ + 115, + 340 + ], + [ + 105, + 364 + ], + [ + 121, + 237 + ], + [ + 162, + 204 + ], + [ + 36, + 253 + ], + [ + 37, + 394 + ], + [ + 58, + 107 + ], + [ + 190, + 210 + ], + [ + 105, + 350 + ], + [ + 6, + 14 + ], + [ + 123, + 221 + ], + [ + 105, + 360 + ], + [ + 175, + 202 + ], + [ + 114, + 350 + ], + [ + 105, + 401 + ], + [ + 105, + 365 + ], + [ + 178, + 190 + ], + [ + 11, + 169 + ], + [ + 157, + 312 + ], + [ + 115, + 387 + ], + [ + 105, + 341 + ], + [ + 117, + 356 + ], + [ + 164, + 204 + ], + [ + 114, + 374 + ], + [ + 162, + 196 + ], + [ + 105, + 340 + ], + [ + 142, + 380 + ], + [ + 114, + 341 + ], + [ + 40, + 253 + ], + [ + 154, + 197 + ], + [ + 114, + 343 + ], + [ + 99, + 438 + ], + [ + 121, + 232 + ], + [ + 114, + 312 + ], + [ + 113, + 337 + ], + [ + 120, + 159 + ], + [ + 121, + 251 + ], + [ + 130, + 439 + ], + [ + 164, + 218 + ], + [ + 115, + 352 + ], + [ + 115, + 365 + ], + [ + 153, + 218 + ], + [ + 154, + 184 + ], + [ + 130, + 323 + ], + [ + 159, + 211 + ], + [ + 162, + 188 + ], + [ + 155, + 186 + ], + [ + 167, + 218 + ], + [ + 115, + 360 + ], + [ + 113, + 317 + ], + [ + 131, + 316 + ], + [ + 200, + 202 + ], + [ + 113, + 188 + ], + [ + 142, + 388 + ], + [ + 120, + 157 + ], + [ + 191, + 234 + ], + [ + 140, + 354 + ], + [ + 153, + 183 + ], + [ + 139, + 380 + ], + [ + 123, + 237 + ], + [ + 123, + 216 + ], + [ + 119, + 234 + ], + [ + 117, + 390 + ], + [ + 130, + 316 + ], + [ + 113, + 187 + ], + [ + 164, + 187 + ], + [ + 157, + 317 + ], + [ + 194, + 210 + ], + [ + 203, + 247 + ], + [ + 198, + 199 + ], + [ + 40, + 256 + ], + [ + 153, + 204 + ], + [ + 202, + 210 + ], + [ + 118, + 239 + ], + [ + 155, + 206 + ], + [ + 115, + 357 + ], + [ + 115, + 370 + ], + [ + 167, + 184 + ], + [ + 159, + 387 + ], + [ + 139, + 388 + ], + [ + 153, + 211 + ], + [ + 117, + 203 + ], + [ + 153, + 187 + ], + [ + 105, + 383 + ], + [ + 206, + 251 + ], + [ + 117, + 385 + ], + [ + 167, + 212 + ], + [ + 113, + 412 + ], + [ + 124, + 366 + ], + [ + 115, + 337 + ], + [ + 155, + 188 + ], + [ + 157, + 342 + ], + [ + 41, + 127 + ], + [ + 198, + 205 + ], + [ + 15, + 169 + ], + [ + 36, + 256 + ], + [ + 154, + 212 + ], + [ + 167, + 201 + ], + [ + 167, + 197 + ], + [ + 114, + 332 + ], + [ + 182, + 202 + ], + [ + 131, + 323 + ], + [ + 193, + 239 + ], + [ + 115, + 415 + ], + [ + 11, + 171 + ], + [ + 105, + 374 + ], + [ + 157, + 212 + ], + [ + 164, + 207 + ], + [ + 15, + 171 + ], + [ + 115, + 412 + ], + [ + 38, + 116 + ], + [ + 35, + 126 + ], + [ + 221, + 229 + ], + [ + 98, + 449 + ], + [ + 159, + 337 + ], + [ + 164, + 209 + ], + [ + 167, + 227 + ], + [ + 155, + 209 + ], + [ + 141, + 354 + ], + [ + 208, + 216 + ], + [ + 114, + 213 + ], + [ + 162, + 352 + ], + [ + 167, + 209 + ], + [ + 159, + 218 + ], + [ + 114, + 383 + ], + [ + 39, + 394 + ], + [ + 58, + 97 + ], + [ + 167, + 211 + ], + [ + 110, + 352 + ], + [ + 162, + 211 + ], + [ + 154, + 195 + ], + [ + 164, + 211 + ], + [ + 105, + 426 + ], + [ + 125, + 361 + ], + [ + 115, + 345 + ], + [ + 155, + 218 + ], + [ + 105, + 370 + ], + [ + 98, + 489 + ], + [ + 113, + 503 + ], + [ + 110, + 332 + ], + [ + 124, + 313 + ], + [ + 159, + 212 + ], + [ + 154, + 213 + ], + [ + 105, + 415 + ], + [ + 197, + 234 + ], + [ + 157, + 218 + ], + [ + 159, + 395 + ], + [ + 41, + 134 + ], + [ + 115, + 195 + ], + [ + 190, + 205 + ], + [ + 139, + 391 + ], + [ + 157, + 374 + ], + [ + 114, + 401 + ], + [ + 154, + 192 + ], + [ + 110, + 385 + ], + [ + 155, + 204 + ], + [ + 162, + 336 + ], + [ + 192, + 239 + ], + [ + 105, + 403 + ], + [ + 114, + 342 + ], + [ + 35, + 127 + ], + [ + 99, + 518 + ], + [ + 184, + 239 + ], + [ + 154, + 218 + ], + [ + 123, + 234 + ], + [ + 114, + 403 + ], + [ + 196, + 234 + ], + [ + 164, + 212 + ], + [ + 162, + 209 + ], + [ + 117, + 352 + ], + [ + 204, + 251 + ], + [ + 117, + 332 + ], + [ + 186, + 247 + ], + [ + 101, + 314 + ], + [ + 123, + 239 + ], + [ + 101, + 313 + ], + [ + 40, + 129 + ], + [ + 159, + 412 + ], + [ + 197, + 221 + ], + [ + 187, + 221 + ], + [ + 139, + 438 + ], + [ + 184, + 216 + ], + [ + 234, + 419 + ], + [ + 213, + 234 + ], + [ + 110, + 390 + ], + [ + 110, + 341 + ], + [ + 125, + 314 + ], + [ + 162, + 370 + ], + [ + 137, + 380 + ], + [ + 227, + 232 + ], + [ + 154, + 196 + ], + [ + 164, + 356 + ], + [ + 115, + 384 + ], + [ + 153, + 206 + ], + [ + 153, + 212 + ], + [ + 197, + 232 + ], + [ + 110, + 364 + ], + [ + 117, + 364 + ], + [ + 167, + 195 + ], + [ + 131, + 439 + ], + [ + 184, + 237 + ], + [ + 188, + 216 + ], + [ + 183, + 247 + ], + [ + 36, + 129 + ], + [ + 110, + 360 + ], + [ + 22, + 81 + ], + [ + 64, + 590 + ], + [ + 110, + 336 + ], + [ + 114, + 196 + ], + [ + 201, + 237 + ], + [ + 114, + 197 + ], + [ + 58, + 590 + ], + [ + 195, + 239 + ], + [ + 115, + 336 + ], + [ + 239, + 427 + ], + [ + 153, + 207 + ], + [ + 155, + 183 + ], + [ + 153, + 186 + ], + [ + 115, + 184 + ], + [ + 35, + 134 + ], + [ + 142, + 345 + ], + [ + 121, + 239 + ], + [ + 124, + 157 + ], + [ + 101, + 328 + ], + [ + 135, + 391 + ], + [ + 115, + 440 + ], + [ + 157, + 401 + ], + [ + 124, + 328 + ], + [ + 167, + 213 + ], + [ + 192, + 216 + ], + [ + 110, + 350 + ], + [ + 125, + 162 + ], + [ + 207, + 247 + ], + [ + 20, + 86 + ], + [ + 114, + 364 + ], + [ + 117, + 343 + ], + [ + 157, + 211 + ], + [ + 162, + 207 + ], + [ + 115, + 395 + ], + [ + 22, + 87 + ], + [ + 113, + 404 + ], + [ + 154, + 207 + ], + [ + 164, + 332 + ], + [ + 113, + 374 + ], + [ + 135, + 388 + ], + [ + 159, + 209 + ], + [ + 117, + 384 + ], + [ + 155, + 203 + ], + [ + 110, + 317 + ], + [ + 114, + 356 + ], + [ + 162, + 218 + ], + [ + 186, + 232 + ], + [ + 121, + 247 + ], + [ + 130, + 449 + ], + [ + 110, + 340 + ], + [ + 40, + 310 + ], + [ + 41, + 126 + ], + [ + 110, + 387 + ], + [ + 114, + 428 + ], + [ + 206, + 221 + ], + [ + 110, + 356 + ], + [ + 58, + 642 + ], + [ + 105, + 500 + ], + [ + 124, + 164 + ], + [ + 167, + 187 + ], + [ + 247, + 404 + ], + [ + 114, + 290 + ], + [ + 101, + 362 + ], + [ + 114, + 426 + ], + [ + 167, + 188 + ], + [ + 115, + 192 + ], + [ + 125, + 159 + ], + [ + 183, + 237 + ], + [ + 167, + 193 + ], + [ + 159, + 415 + ], + [ + 110, + 384 + ], + [ + 105, + 521 + ], + [ + 117, + 370 + ], + [ + 135, + 380 + ], + [ + 155, + 352 + ], + [ + 123, + 247 + ], + [ + 113, + 357 + ], + [ + 64, + 642 + ], + [ + 114, + 390 + ], + [ + 154, + 186 + ], + [ + 115, + 385 + ], + [ + 139, + 345 + ], + [ + 167, + 192 + ], + [ + 113, + 415 + ], + [ + 81, + 108 + ], + [ + 154, + 193 + ], + [ + 154, + 183 + ], + [ + 99, + 611 + ], + [ + 121, + 234 + ], + [ + 125, + 362 + ], + [ + 137, + 543 + ], + [ + 119, + 239 + ], + [ + 115, + 294 + ], + [ + 110, + 357 + ], + [ + 117, + 294 + ], + [ + 153, + 341 + ], + [ + 122, + 216 + ], + [ + 117, + 403 + ], + [ + 115, + 381 + ], + [ + 167, + 191 + ], + [ + 164, + 403 + ], + [ + 137, + 388 + ], + [ + 247, + 503 + ], + [ + 98, + 532 + ], + [ + 117, + 290 + ], + [ + 130, + 532 + ], + [ + 123, + 251 + ], + [ + 120, + 232 + ], + [ + 115, + 582 + ], + [ + 118, + 234 + ], + [ + 98, + 496 + ], + [ + 154, + 191 + ], + [ + 157, + 428 + ], + [ + 155, + 207 + ], + [ + 113, + 294 + ], + [ + 195, + 216 + ], + [ + 87, + 108 + ], + [ + 113, + 290 + ], + [ + 113, + 640 + ], + [ + 115, + 193 + ], + [ + 119, + 251 + ], + [ + 155, + 340 + ], + [ + 114, + 294 + ], + [ + 167, + 196 + ], + [ + 142, + 391 + ], + [ + 198, + 345 + ], + [ + 153, + 290 + ], + [ + 164, + 364 + ], + [ + 115, + 290 + ], + [ + 114, + 191 + ], + [ + 117, + 342 + ], + [ + 117, + 426 + ], + [ + 159, + 381 + ], + [ + 118, + 247 + ], + [ + 153, + 332 + ], + [ + 23, + 87 + ], + [ + 63, + 785 + ], + [ + 117, + 440 + ], + [ + 110, + 383 + ], + [ + 110, + 426 + ], + [ + 113, + 350 + ], + [ + 120, + 237 + ], + [ + 153, + 203 + ], + [ + 117, + 365 + ] + ], + "temporal_merges": [ + [ + 103, + 103, + 2 + ], + [ + 104, + 104, + 1 + ], + [ + 1024, + 1024, + 4 + ], + [ + 1025, + 1025, + 2 + ], + [ + 1026, + 1026, + 1 + ], + [ + 1024, + 103, + 4 + ], + [ + 1027, + 1027, + 4 + ], + [ + 103, + 103, + 4 + ], + [ + 1025, + 104, + 2 + ], + [ + 104, + 104, + 2 + ], + [ + 103, + 1024, + 4 + ], + [ + 103, + 103, + 6 + ], + [ + 1024, + 103, + 6 + ], + [ + 1027, + 104, + 4 + ], + [ + 1025, + 104, + 3 + ], + [ + 1027, + 1025, + 4 + ], + [ + 104, + 104, + 3 + ], + [ + 103, + 133, + 2 + ], + [ + 103, + 132, + 2 + ], + [ + 103, + 136, + 2 + ], + [ + 1027, + 1032, + 4 + ], + [ + 103, + 138, + 2 + ], + [ + 103, + 144, + 2 + ], + [ + 104, + 1025, + 2 + ], + [ + 1024, + 132, + 4 + ], + [ + 1024, + 133, + 4 + ], + [ + 103, + 145, + 2 + ], + [ + 103, + 146, + 2 + ], + [ + 103, + 147, + 2 + ], + [ + 1026, + 1029, + 1 + ], + [ + 103, + 148, + 2 + ], + [ + 1024, + 136, + 4 + ], + [ + 138, + 138, + 3 + ], + [ + 1024, + 144, + 4 + ], + [ + 103, + 149, + 2 + ], + [ + 1026, + 1029, + 3 + ], + [ + 1024, + 145, + 4 + ], + [ + 150, + 136, + 1 + ], + [ + 132, + 132, + 2 + ], + [ + 1024, + 138, + 4 + ], + [ + 1024, + 147, + 4 + ], + [ + 1024, + 146, + 4 + ], + [ + 103, + 151, + 2 + ], + [ + 133, + 133, + 3 + ], + [ + 1029, + 1026, + 1 + ], + [ + 103, + 150, + 2 + ], + [ + 136, + 136, + 3 + ], + [ + 1024, + 149, + 4 + ], + [ + 1025, + 1025, + 3 + ], + [ + 1024, + 148, + 4 + ], + [ + 1032, + 104, + 4 + ], + [ + 145, + 132, + 1 + ], + [ + 151, + 138, + 1 + ], + [ + 104, + 152, + 1 + ], + [ + 144, + 133, + 1 + ], + [ + 132, + 145, + 1 + ], + [ + 1024, + 150, + 4 + ], + [ + 104, + 156, + 1 + ], + [ + 1024, + 151, + 4 + ], + [ + 146, + 146, + 2 + ], + [ + 104, + 158, + 1 + ], + [ + 147, + 147, + 2 + ], + [ + 163, + 152, + 1 + ], + [ + 1029, + 132, + 6 + ], + [ + 149, + 149, + 4 + ], + [ + 136, + 136, + 4 + ], + [ + 1029, + 133, + 6 + ], + [ + 138, + 138, + 4 + ], + [ + 144, + 133, + 2 + ], + [ + 172, + 156, + 1 + ], + [ + 148, + 148, + 4 + ], + [ + 1025, + 152, + 2 + ], + [ + 104, + 165, + 1 + ], + [ + 104, + 166, + 1 + ], + [ + 1031, + 144, + 2 + ], + [ + 173, + 158, + 1 + ], + [ + 1029, + 147, + 6 + ], + [ + 1029, + 136, + 6 + ], + [ + 1029, + 138, + 6 + ], + [ + 1029, + 146, + 6 + ], + [ + 1025, + 156, + 2 + ], + [ + 104, + 163, + 1 + ], + [ + 104, + 168, + 1 + ], + [ + 103, + 103, + 1 + ], + [ + 1031, + 132, + 2 + ], + [ + 1029, + 145, + 6 + ], + [ + 177, + 177, + 2 + ], + [ + 133, + 133, + 2 + ], + [ + 104, + 170, + 1 + ], + [ + 1025, + 158, + 2 + ], + [ + 1029, + 144, + 6 + ], + [ + 1031, + 133, + 2 + ], + [ + 179, + 179, + 2 + ], + [ + 145, + 132, + 2 + ], + [ + 149, + 149, + 5 + ], + [ + 1025, + 168, + 2 + ], + [ + 1032, + 152, + 3 + ], + [ + 1027, + 1033, + 4 + ], + [ + 132, + 132, + 3 + ], + [ + 1029, + 148, + 6 + ], + [ + 1031, + 146, + 2 + ], + [ + 1031, + 147, + 2 + ], + [ + 138, + 151, + 1 + ], + [ + 136, + 150, + 1 + ], + [ + 1025, + 163, + 2 + ], + [ + 1032, + 156, + 3 + ], + [ + 1031, + 145, + 2 + ], + [ + 1029, + 149, + 6 + ], + [ + 176, + 176, + 2 + ], + [ + 1025, + 170, + 2 + ], + [ + 1032, + 158, + 3 + ], + [ + 133, + 144, + 1 + ], + [ + 148, + 148, + 5 + ], + [ + 152, + 163, + 1 + ], + [ + 1025, + 165, + 2 + ], + [ + 180, + 168, + 1 + ], + [ + 133, + 144, + 2 + ], + [ + 1025, + 166, + 2 + ], + [ + 156, + 156, + 3 + ], + [ + 1032, + 168, + 3 + ], + [ + 136, + 136, + 2 + ], + [ + 1032, + 163, + 3 + ], + [ + 158, + 158, + 3 + ], + [ + 138, + 138, + 2 + ], + [ + 132, + 145, + 2 + ], + [ + 1031, + 136, + 2 + ], + [ + 1031, + 138, + 2 + ], + [ + 150, + 136, + 2 + ], + [ + 166, + 166, + 2 + ], + [ + 1031, + 148, + 2 + ], + [ + 1032, + 170, + 3 + ], + [ + 145, + 145, + 2 + ], + [ + 165, + 165, + 2 + ], + [ + 104, + 172, + 1 + ], + [ + 146, + 146, + 3 + ], + [ + 1026, + 144, + 1 + ], + [ + 147, + 147, + 3 + ], + [ + 151, + 138, + 2 + ], + [ + 104, + 173, + 1 + ], + [ + 132, + 103, + 2 + ], + [ + 104, + 181, + 1 + ], + [ + 1031, + 149, + 2 + ], + [ + 1031, + 151, + 2 + ], + [ + 1029, + 150, + 6 + ], + [ + 1031, + 150, + 2 + ], + [ + 1033, + 152, + 1 + ], + [ + 1029, + 151, + 6 + ], + [ + 144, + 103, + 2 + ], + [ + 1032, + 165, + 3 + ], + [ + 133, + 103, + 2 + ], + [ + 146, + 103, + 2 + ], + [ + 136, + 103, + 2 + ], + [ + 147, + 103, + 2 + ], + [ + 1032, + 166, + 3 + ], + [ + 138, + 103, + 2 + ], + [ + 1027, + 156, + 4 + ], + [ + 149, + 103, + 2 + ], + [ + 145, + 103, + 2 + ], + [ + 148, + 103, + 2 + ], + [ + 1026, + 144, + 3 + ], + [ + 104, + 180, + 1 + ], + [ + 1027, + 152, + 4 + ], + [ + 1033, + 152, + 3 + ], + [ + 136, + 150, + 2 + ], + [ + 1025, + 172, + 2 + ], + [ + 1027, + 158, + 4 + ], + [ + 1026, + 133, + 1 + ], + [ + 1025, + 173, + 2 + ], + [ + 1027, + 163, + 4 + ], + [ + 138, + 151, + 2 + ], + [ + 1026, + 1024, + 5 + ], + [ + 1025, + 181, + 2 + ], + [ + 156, + 172, + 1 + ], + [ + 144, + 144, + 3 + ], + [ + 151, + 151, + 3 + ], + [ + 177, + 177, + 3 + ], + [ + 158, + 158, + 4 + ], + [ + 152, + 152, + 3 + ], + [ + 132, + 132, + 4 + ], + [ + 1027, + 170, + 4 + ], + [ + 179, + 179, + 3 + ], + [ + 1032, + 172, + 3 + ], + [ + 1033, + 156, + 3 + ], + [ + 1027, + 1038, + 4 + ], + [ + 1026, + 144, + 5 + ], + [ + 1025, + 180, + 2 + ], + [ + 1027, + 168, + 4 + ], + [ + 1032, + 173, + 3 + ], + [ + 149, + 149, + 3 + ], + [ + 1026, + 133, + 3 + ], + [ + 150, + 103, + 2 + ], + [ + 168, + 168, + 3 + ], + [ + 1032, + 181, + 3 + ], + [ + 148, + 148, + 3 + ], + [ + 1032, + 180, + 3 + ], + [ + 1033, + 170, + 3 + ], + [ + 176, + 176, + 3 + ], + [ + 158, + 173, + 1 + ], + [ + 1027, + 165, + 4 + ], + [ + 146, + 146, + 4 + ], + [ + 1033, + 168, + 3 + ], + [ + 133, + 133, + 4 + ], + [ + 166, + 166, + 3 + ], + [ + 151, + 103, + 2 + ], + [ + 165, + 165, + 3 + ], + [ + 1026, + 132, + 1 + ], + [ + 1027, + 166, + 4 + ], + [ + 147, + 147, + 4 + ], + [ + 1033, + 163, + 3 + ], + [ + 145, + 145, + 3 + ], + [ + 150, + 150, + 3 + ], + [ + 1026, + 133, + 5 + ], + [ + 1024, + 1024, + 1 + ], + [ + 189, + 189, + 2 + ], + [ + 1024, + 103, + 1 + ], + [ + 152, + 163, + 2 + ], + [ + 1033, + 158, + 3 + ], + [ + 156, + 156, + 4 + ], + [ + 1026, + 1024, + 3 + ], + [ + 1034, + 132, + 2 + ], + [ + 144, + 144, + 4 + ], + [ + 1027, + 172, + 4 + ], + [ + 1029, + 1029, + 1 + ], + [ + 1034, + 136, + 2 + ], + [ + 170, + 170, + 5 + ], + [ + 1027, + 173, + 4 + ], + [ + 1034, + 147, + 2 + ], + [ + 103, + 176, + 2 + ], + [ + 1034, + 146, + 2 + ], + [ + 1034, + 133, + 2 + ], + [ + 1034, + 138, + 2 + ], + [ + 1026, + 145, + 5 + ], + [ + 1027, + 180, + 4 + ], + [ + 1033, + 165, + 3 + ], + [ + 1026, + 148, + 1 + ], + [ + 1033, + 166, + 3 + ], + [ + 163, + 152, + 2 + ], + [ + 136, + 136, + 5 + ], + [ + 168, + 180, + 1 + ], + [ + 1034, + 144, + 2 + ], + [ + 1029, + 1024, + 1 + ], + [ + 1027, + 181, + 4 + ], + [ + 132, + 132, + 5 + ], + [ + 1026, + 149, + 1 + ], + [ + 151, + 151, + 4 + ], + [ + 1026, + 146, + 1 + ], + [ + 1026, + 147, + 1 + ], + [ + 1026, + 136, + 1 + ], + [ + 156, + 172, + 2 + ], + [ + 138, + 138, + 5 + ], + [ + 149, + 149, + 2 + ], + [ + 1026, + 138, + 1 + ], + [ + 152, + 152, + 2 + ], + [ + 158, + 165, + 1 + ], + [ + 1024, + 176, + 4 + ], + [ + 1026, + 132, + 5 + ], + [ + 148, + 148, + 6 + ], + [ + 104, + 104, + 4 + ], + [ + 156, + 166, + 1 + ], + [ + 1026, + 149, + 5 + ], + [ + 103, + 189, + 2 + ], + [ + 150, + 150, + 4 + ], + [ + 146, + 146, + 5 + ], + [ + 1037, + 152, + 5 + ], + [ + 165, + 158, + 1 + ], + [ + 177, + 177, + 4 + ], + [ + 170, + 170, + 6 + ], + [ + 147, + 147, + 5 + ], + [ + 1026, + 148, + 5 + ], + [ + 1034, + 145, + 2 + ], + [ + 179, + 136, + 2 + ], + [ + 1037, + 156, + 5 + ], + [ + 1033, + 173, + 3 + ], + [ + 166, + 156, + 1 + ], + [ + 133, + 133, + 5 + ], + [ + 158, + 168, + 1 + ], + [ + 148, + 148, + 2 + ], + [ + 1026, + 138, + 5 + ], + [ + 145, + 145, + 4 + ], + [ + 1026, + 136, + 5 + ], + [ + 1037, + 163, + 5 + ], + [ + 222, + 222, + 2 + ], + [ + 1033, + 181, + 3 + ], + [ + 1026, + 1024, + 1 + ], + [ + 152, + 104, + 1 + ], + [ + 166, + 168, + 1 + ], + [ + 165, + 168, + 1 + ], + [ + 1026, + 147, + 5 + ], + [ + 104, + 152, + 2 + ], + [ + 1026, + 146, + 5 + ], + [ + 149, + 149, + 6 + ], + [ + 1026, + 151, + 1 + ], + [ + 1033, + 180, + 3 + ], + [ + 144, + 144, + 2 + ], + [ + 1037, + 158, + 5 + ], + [ + 172, + 156, + 2 + ], + [ + 1026, + 145, + 1 + ], + [ + 1034, + 148, + 2 + ], + [ + 1026, + 150, + 1 + ], + [ + 103, + 179, + 2 + ], + [ + 163, + 104, + 1 + ], + [ + 165, + 152, + 1 + ], + [ + 166, + 152, + 1 + ], + [ + 144, + 1024, + 2 + ], + [ + 220, + 220, + 2 + ], + [ + 177, + 138, + 2 + ], + [ + 156, + 168, + 1 + ], + [ + 132, + 1024, + 2 + ], + [ + 133, + 1024, + 2 + ], + [ + 1037, + 168, + 5 + ], + [ + 1026, + 150, + 5 + ], + [ + 1037, + 170, + 5 + ], + [ + 158, + 152, + 1 + ], + [ + 1026, + 151, + 5 + ], + [ + 132, + 176, + 2 + ], + [ + 1033, + 172, + 3 + ], + [ + 147, + 1024, + 2 + ], + [ + 148, + 144, + 2 + ], + [ + 1034, + 149, + 2 + ], + [ + 103, + 136, + 4 + ], + [ + 173, + 158, + 2 + ], + [ + 146, + 1024, + 2 + ], + [ + 165, + 104, + 1 + ], + [ + 103, + 132, + 4 + ], + [ + 103, + 138, + 4 + ], + [ + 144, + 148, + 2 + ], + [ + 166, + 104, + 1 + ], + [ + 156, + 152, + 1 + ], + [ + 179, + 179, + 4 + ], + [ + 1031, + 132, + 6 + ], + [ + 145, + 145, + 5 + ], + [ + 189, + 189, + 3 + ], + [ + 1039, + 152, + 6 + ], + [ + 1036, + 132, + 4 + ], + [ + 1031, + 148, + 6 + ], + [ + 1034, + 151, + 2 + ], + [ + 1034, + 150, + 2 + ], + [ + 1026, + 103, + 5 + ], + [ + 163, + 170, + 1 + ], + [ + 1031, + 144, + 6 + ], + [ + 138, + 1024, + 2 + ], + [ + 1031, + 136, + 6 + ], + [ + 156, + 104, + 1 + ], + [ + 181, + 181, + 3 + ], + [ + 103, + 177, + 2 + ], + [ + 158, + 104, + 1 + ], + [ + 151, + 151, + 5 + ], + [ + 1031, + 133, + 6 + ], + [ + 148, + 1024, + 2 + ], + [ + 136, + 1024, + 2 + ], + [ + 103, + 133, + 4 + ], + [ + 176, + 132, + 2 + ], + [ + 168, + 168, + 2 + ], + [ + 1031, + 149, + 6 + ], + [ + 1031, + 146, + 6 + ], + [ + 1037, + 172, + 5 + ], + [ + 1038, + 163, + 2 + ], + [ + 1033, + 104, + 4 + ], + [ + 136, + 136, + 6 + ], + [ + 170, + 170, + 4 + ], + [ + 1036, + 133, + 4 + ], + [ + 1031, + 147, + 6 + ], + [ + 1037, + 165, + 5 + ], + [ + 1037, + 173, + 5 + ], + [ + 138, + 138, + 6 + ], + [ + 166, + 158, + 1 + ], + [ + 1039, + 156, + 6 + ], + [ + 1036, + 147, + 4 + ], + [ + 240, + 240, + 2 + ], + [ + 149, + 1024, + 2 + ], + [ + 103, + 146, + 4 + ], + [ + 1037, + 180, + 5 + ], + [ + 163, + 1025, + 1 + ], + [ + 1031, + 138, + 6 + ], + [ + 150, + 150, + 5 + ], + [ + 1036, + 146, + 4 + ], + [ + 1044, + 152, + 7 + ], + [ + 189, + 133, + 2 + ], + [ + 132, + 146, + 2 + ], + [ + 1036, + 145, + 4 + ], + [ + 163, + 152, + 3 + ], + [ + 1037, + 181, + 5 + ], + [ + 217, + 217, + 2 + ], + [ + 156, + 156, + 2 + ], + [ + 1036, + 144, + 4 + ], + [ + 146, + 132, + 2 + ], + [ + 147, + 133, + 2 + ], + [ + 157, + 157, + 2 + ], + [ + 1026, + 132, + 3 + ], + [ + 158, + 173, + 2 + ], + [ + 145, + 149, + 2 + ], + [ + 242, + 242, + 2 + ], + [ + 251, + 251, + 2 + ], + [ + 1039, + 163, + 6 + ], + [ + 219, + 219, + 2 + ], + [ + 103, + 147, + 4 + ], + [ + 236, + 236, + 2 + ], + [ + 1026, + 136, + 3 + ], + [ + 1038, + 168, + 2 + ], + [ + 132, + 149, + 2 + ], + [ + 151, + 151, + 2 + ], + [ + 1039, + 158, + 6 + ], + [ + 132, + 147, + 2 + ], + [ + 148, + 133, + 2 + ], + [ + 1026, + 138, + 3 + ], + [ + 1039, + 168, + 6 + ], + [ + 1037, + 166, + 5 + ], + [ + 170, + 104, + 1 + ], + [ + 176, + 145, + 2 + ], + [ + 1031, + 145, + 6 + ], + [ + 146, + 136, + 2 + ], + [ + 132, + 136, + 2 + ], + [ + 1039, + 170, + 6 + ], + [ + 180, + 168, + 2 + ], + [ + 146, + 133, + 2 + ], + [ + 165, + 165, + 4 + ], + [ + 246, + 246, + 2 + ], + [ + 132, + 138, + 2 + ], + [ + 1044, + 156, + 7 + ], + [ + 147, + 144, + 2 + ], + [ + 158, + 158, + 2 + ], + [ + 104, + 168, + 2 + ], + [ + 1026, + 148, + 3 + ], + [ + 1038, + 170, + 2 + ], + [ + 1026, + 149, + 3 + ], + [ + 147, + 138, + 2 + ], + [ + 1029, + 1024, + 3 + ], + [ + 247, + 247, + 2 + ], + [ + 163, + 163, + 5 + ], + [ + 1026, + 150, + 3 + ], + [ + 223, + 223, + 2 + ], + [ + 166, + 166, + 4 + ], + [ + 1035, + 147, + 4 + ], + [ + 136, + 146, + 2 + ], + [ + 1038, + 152, + 2 + ], + [ + 132, + 148, + 2 + ], + [ + 165, + 156, + 1 + ], + [ + 168, + 104, + 1 + ], + [ + 1036, + 136, + 4 + ], + [ + 1026, + 145, + 3 + ], + [ + 1031, + 151, + 6 + ], + [ + 136, + 133, + 2 + ], + [ + 222, + 222, + 3 + ], + [ + 1035, + 132, + 4 + ], + [ + 1036, + 138, + 4 + ], + [ + 170, + 152, + 1 + ], + [ + 181, + 181, + 4 + ], + [ + 173, + 173, + 3 + ], + [ + 145, + 1024, + 2 + ], + [ + 1029, + 103, + 3 + ], + [ + 1026, + 1057, + 1 + ], + [ + 1038, + 156, + 2 + ], + [ + 150, + 150, + 2 + ], + [ + 180, + 104, + 1 + ], + [ + 1029, + 176, + 6 + ], + [ + 216, + 216, + 2 + ], + [ + 1026, + 146, + 3 + ], + [ + 146, + 144, + 2 + ], + [ + 138, + 177, + 2 + ], + [ + 149, + 149, + 7 + ], + [ + 103, + 103, + 3 + ], + [ + 1031, + 150, + 6 + ], + [ + 1044, + 163, + 7 + ], + [ + 1044, + 158, + 7 + ], + [ + 1026, + 151, + 3 + ], + [ + 138, + 147, + 2 + ], + [ + 172, + 104, + 1 + ], + [ + 138, + 133, + 2 + ], + [ + 1026, + 147, + 3 + ], + [ + 1044, + 168, + 7 + ], + [ + 136, + 179, + 2 + ], + [ + 170, + 163, + 1 + ], + [ + 144, + 146, + 2 + ], + [ + 1024, + 189, + 4 + ], + [ + 1039, + 172, + 6 + ], + [ + 144, + 147, + 2 + ], + [ + 214, + 214, + 2 + ], + [ + 1039, + 180, + 6 + ], + [ + 215, + 215, + 2 + ], + [ + 1038, + 158, + 2 + ], + [ + 349, + 349, + 2 + ], + [ + 339, + 339, + 2 + ], + [ + 149, + 145, + 2 + ], + [ + 133, + 148, + 2 + ], + [ + 151, + 1024, + 2 + ], + [ + 176, + 176, + 4 + ], + [ + 166, + 1025, + 1 + ], + [ + 133, + 146, + 2 + ], + [ + 1026, + 1049, + 1 + ], + [ + 220, + 220, + 3 + ], + [ + 150, + 1024, + 2 + ], + [ + 228, + 228, + 2 + ], + [ + 1039, + 181, + 6 + ], + [ + 165, + 1025, + 1 + ], + [ + 1039, + 173, + 6 + ], + [ + 147, + 132, + 2 + ], + [ + 133, + 136, + 2 + ], + [ + 138, + 132, + 2 + ], + [ + 149, + 132, + 2 + ], + [ + 1033, + 163, + 1 + ], + [ + 164, + 164, + 2 + ], + [ + 1044, + 170, + 7 + ], + [ + 148, + 136, + 2 + ], + [ + 181, + 104, + 1 + ], + [ + 133, + 147, + 2 + ], + [ + 103, + 215, + 2 + ], + [ + 1035, + 147, + 2 + ], + [ + 152, + 156, + 1 + ], + [ + 103, + 226, + 2 + ], + [ + 1038, + 165, + 2 + ], + [ + 313, + 313, + 2 + ], + [ + 133, + 138, + 2 + ], + [ + 1044, + 173, + 7 + ], + [ + 103, + 224, + 2 + ], + [ + 1036, + 148, + 4 + ], + [ + 144, + 138, + 2 + ], + [ + 1038, + 166, + 2 + ], + [ + 144, + 136, + 2 + ], + [ + 103, + 214, + 2 + ], + [ + 1035, + 146, + 2 + ], + [ + 152, + 158, + 1 + ], + [ + 361, + 361, + 2 + ], + [ + 173, + 104, + 1 + ], + [ + 1044, + 172, + 7 + ], + [ + 177, + 177, + 5 + ], + [ + 133, + 189, + 2 + ], + [ + 103, + 217, + 2 + ], + [ + 103, + 219, + 2 + ], + [ + 231, + 231, + 2 + ], + [ + 152, + 165, + 1 + ], + [ + 1039, + 165, + 6 + ], + [ + 162, + 162, + 2 + ], + [ + 136, + 132, + 2 + ], + [ + 179, + 179, + 5 + ], + [ + 1044, + 180, + 7 + ], + [ + 145, + 176, + 2 + ], + [ + 1026, + 1060, + 1 + ], + [ + 314, + 314, + 2 + ], + [ + 152, + 166, + 1 + ], + [ + 148, + 132, + 2 + ], + [ + 103, + 223, + 2 + ], + [ + 138, + 144, + 2 + ], + [ + 1033, + 156, + 1 + ], + [ + 230, + 230, + 2 + ], + [ + 168, + 158, + 1 + ], + [ + 104, + 163, + 2 + ], + [ + 1035, + 146, + 4 + ], + [ + 136, + 144, + 2 + ], + [ + 1044, + 181, + 7 + ], + [ + 168, + 165, + 1 + ], + [ + 152, + 1025, + 1 + ], + [ + 168, + 156, + 1 + ], + [ + 168, + 166, + 1 + ], + [ + 1036, + 149, + 4 + ], + [ + 1057, + 1026, + 1 + ], + [ + 136, + 148, + 2 + ], + [ + 1047, + 152, + 1 + ], + [ + 1039, + 166, + 6 + ], + [ + 138, + 151, + 3 + ], + [ + 180, + 180, + 3 + ], + [ + 224, + 224, + 2 + ], + [ + 113, + 113, + 2 + ], + [ + 1068, + 144, + 6 + ], + [ + 103, + 228, + 2 + ], + [ + 1035, + 132, + 2 + ], + [ + 104, + 245, + 1 + ], + [ + 156, + 165, + 1 + ], + [ + 156, + 1025, + 1 + ], + [ + 235, + 235, + 2 + ], + [ + 170, + 1025, + 1 + ], + [ + 1053, + 133, + 7 + ], + [ + 1033, + 158, + 1 + ], + [ + 145, + 146, + 2 + ], + [ + 1038, + 172, + 2 + ], + [ + 1044, + 165, + 7 + ], + [ + 1033, + 170, + 1 + ], + [ + 328, + 328, + 2 + ], + [ + 233, + 233, + 3 + ], + [ + 217, + 217, + 3 + ], + [ + 149, + 138, + 2 + ], + [ + 158, + 166, + 1 + ], + [ + 1036, + 150, + 4 + ], + [ + 1024, + 1026, + 1 + ], + [ + 181, + 181, + 5 + ], + [ + 221, + 221, + 2 + ], + [ + 149, + 133, + 2 + ], + [ + 242, + 242, + 3 + ], + [ + 103, + 230, + 2 + ], + [ + 147, + 136, + 2 + ], + [ + 1053, + 144, + 7 + ], + [ + 146, + 148, + 2 + ], + [ + 234, + 234, + 2 + ], + [ + 146, + 145, + 2 + ], + [ + 1047, + 163, + 1 + ], + [ + 1038, + 173, + 2 + ], + [ + 151, + 151, + 6 + ], + [ + 146, + 138, + 2 + ], + [ + 1053, + 145, + 7 + ], + [ + 1049, + 1026, + 1 + ], + [ + 367, + 367, + 2 + ], + [ + 1026, + 1046, + 1 + ], + [ + 366, + 366, + 2 + ], + [ + 226, + 226, + 2 + ], + [ + 172, + 172, + 3 + ], + [ + 1033, + 166, + 1 + ], + [ + 1033, + 165, + 1 + ], + [ + 382, + 382, + 2 + ], + [ + 144, + 144, + 5 + ], + [ + 1033, + 168, + 1 + ], + [ + 1044, + 166, + 7 + ], + [ + 165, + 163, + 1 + ], + [ + 1026, + 1048, + 1 + ], + [ + 117, + 117, + 2 + ], + [ + 104, + 166, + 2 + ], + [ + 219, + 219, + 3 + ], + [ + 158, + 1025, + 1 + ], + [ + 136, + 150, + 3 + ], + [ + 147, + 148, + 2 + ], + [ + 246, + 246, + 3 + ], + [ + 114, + 114, + 2 + ], + [ + 103, + 235, + 2 + ], + [ + 154, + 154, + 2 + ], + [ + 138, + 148, + 2 + ], + [ + 1047, + 170, + 1 + ], + [ + 259, + 259, + 2 + ], + [ + 243, + 243, + 2 + ], + [ + 1053, + 132, + 7 + ], + [ + 239, + 239, + 2 + ], + [ + 145, + 136, + 2 + ], + [ + 1024, + 179, + 4 + ], + [ + 244, + 244, + 2 + ], + [ + 1035, + 145, + 4 + ], + [ + 1036, + 151, + 4 + ], + [ + 1024, + 177, + 4 + ], + [ + 159, + 159, + 2 + ], + [ + 236, + 236, + 3 + ], + [ + 150, + 146, + 2 + ], + [ + 104, + 156, + 2 + ], + [ + 149, + 136, + 2 + ], + [ + 148, + 146, + 2 + ], + [ + 1026, + 1064, + 1 + ], + [ + 1026, + 1055, + 1 + ], + [ + 144, + 1029, + 2 + ], + [ + 170, + 156, + 1 + ], + [ + 240, + 240, + 3 + ], + [ + 148, + 147, + 2 + ], + [ + 104, + 158, + 2 + ], + [ + 1068, + 133, + 6 + ], + [ + 260, + 260, + 2 + ], + [ + 1038, + 181, + 2 + ], + [ + 148, + 138, + 2 + ], + [ + 163, + 165, + 1 + ], + [ + 241, + 241, + 3 + ], + [ + 151, + 147, + 2 + ], + [ + 1031, + 189, + 2 + ], + [ + 214, + 214, + 3 + ], + [ + 1053, + 147, + 7 + ], + [ + 1038, + 180, + 2 + ], + [ + 138, + 149, + 2 + ], + [ + 103, + 233, + 2 + ], + [ + 104, + 165, + 2 + ], + [ + 1026, + 1063, + 1 + ], + [ + 144, + 189, + 2 + ], + [ + 146, + 132, + 1 + ], + [ + 1035, + 133, + 2 + ], + [ + 1026, + 1065, + 1 + ], + [ + 150, + 133, + 2 + ], + [ + 145, + 147, + 2 + ], + [ + 136, + 147, + 2 + ], + [ + 1026, + 1071, + 1 + ], + [ + 166, + 163, + 1 + ], + [ + 1031, + 176, + 2 + ], + [ + 1026, + 1041, + 1 + ], + [ + 155, + 155, + 2 + ], + [ + 1035, + 145, + 2 + ], + [ + 103, + 222, + 2 + ], + [ + 133, + 1029, + 2 + ], + [ + 138, + 146, + 2 + ], + [ + 103, + 220, + 2 + ], + [ + 1062, + 132, + 4 + ], + [ + 168, + 1025, + 1 + ], + [ + 215, + 215, + 3 + ], + [ + 152, + 170, + 1 + ], + [ + 1033, + 173, + 1 + ], + [ + 149, + 147, + 2 + ], + [ + 1035, + 136, + 2 + ], + [ + 231, + 231, + 3 + ], + [ + 163, + 166, + 1 + ], + [ + 149, + 146, + 2 + ], + [ + 172, + 1025, + 1 + ], + [ + 103, + 248, + 2 + ], + [ + 176, + 145, + 3 + ], + [ + 1046, + 133, + 4 + ], + [ + 220, + 132, + 2 + ], + [ + 1047, + 156, + 1 + ], + [ + 1029, + 189, + 6 + ], + [ + 1046, + 1026, + 1 + ], + [ + 151, + 144, + 2 + ], + [ + 179, + 150, + 3 + ], + [ + 1068, + 145, + 6 + ], + [ + 138, + 177, + 3 + ], + [ + 173, + 1025, + 1 + ], + [ + 223, + 223, + 3 + ], + [ + 1032, + 245, + 3 + ], + [ + 237, + 237, + 2 + ], + [ + 110, + 110, + 2 + ], + [ + 156, + 170, + 1 + ], + [ + 151, + 132, + 2 + ], + [ + 1053, + 146, + 7 + ], + [ + 1053, + 136, + 7 + ], + [ + 1053, + 138, + 7 + ], + [ + 1035, + 133, + 4 + ], + [ + 104, + 172, + 2 + ], + [ + 1041, + 1026, + 1 + ], + [ + 151, + 148, + 2 + ], + [ + 103, + 148, + 4 + ], + [ + 173, + 165, + 1 + ], + [ + 146, + 150, + 2 + ], + [ + 232, + 232, + 2 + ], + [ + 133, + 222, + 2 + ], + [ + 153, + 153, + 2 + ], + [ + 1047, + 158, + 1 + ], + [ + 1035, + 148, + 2 + ], + [ + 147, + 1029, + 2 + ], + [ + 103, + 243, + 2 + ], + [ + 1033, + 172, + 1 + ], + [ + 245, + 245, + 3 + ], + [ + 103, + 244, + 2 + ], + [ + 166, + 172, + 1 + ], + [ + 180, + 180, + 4 + ], + [ + 1035, + 144, + 2 + ], + [ + 132, + 1029, + 2 + ], + [ + 149, + 144, + 2 + ], + [ + 249, + 249, + 3 + ], + [ + 224, + 224, + 3 + ], + [ + 147, + 145, + 2 + ], + [ + 104, + 170, + 2 + ], + [ + 233, + 233, + 2 + ], + [ + 146, + 1029, + 2 + ], + [ + 1026, + 1073, + 1 + ], + [ + 165, + 173, + 1 + ], + [ + 136, + 179, + 3 + ], + [ + 181, + 181, + 6 + ], + [ + 362, + 362, + 2 + ], + [ + 151, + 177, + 3 + ], + [ + 150, + 144, + 2 + ], + [ + 150, + 132, + 2 + ], + [ + 158, + 163, + 1 + ], + [ + 104, + 173, + 2 + ], + [ + 103, + 231, + 2 + ], + [ + 147, + 149, + 2 + ], + [ + 1047, + 165, + 1 + ], + [ + 1072, + 163, + 2 + ], + [ + 176, + 275, + 2 + ], + [ + 1024, + 223, + 4 + ], + [ + 1035, + 136, + 4 + ], + [ + 1053, + 149, + 7 + ], + [ + 1072, + 152, + 2 + ], + [ + 150, + 148, + 2 + ], + [ + 151, + 133, + 2 + ], + [ + 103, + 250, + 2 + ], + [ + 145, + 138, + 2 + ], + [ + 103, + 252, + 2 + ], + [ + 1026, + 1049, + 3 + ], + [ + 168, + 180, + 2 + ], + [ + 133, + 1067, + 2 + ], + [ + 226, + 226, + 3 + ], + [ + 1035, + 138, + 4 + ], + [ + 1068, + 132, + 6 + ], + [ + 150, + 179, + 2 + ], + [ + 1047, + 166, + 1 + ], + [ + 1026, + 1057, + 3 + ], + [ + 172, + 166, + 1 + ], + [ + 163, + 158, + 1 + ], + [ + 1035, + 149, + 2 + ], + [ + 228, + 228, + 3 + ], + [ + 1024, + 214, + 4 + ], + [ + 1050, + 132, + 4 + ], + [ + 156, + 163, + 1 + ], + [ + 103, + 241, + 2 + ], + [ + 268, + 268, + 2 + ], + [ + 103, + 249, + 2 + ], + [ + 148, + 1029, + 2 + ], + [ + 170, + 168, + 1 + ], + [ + 1024, + 215, + 4 + ], + [ + 265, + 265, + 2 + ], + [ + 146, + 149, + 2 + ], + [ + 189, + 189, + 4 + ], + [ + 177, + 151, + 2 + ], + [ + 1048, + 1026, + 1 + ], + [ + 147, + 151, + 2 + ], + [ + 1042, + 145, + 4 + ], + [ + 177, + 138, + 3 + ], + [ + 103, + 254, + 2 + ], + [ + 1026, + 1060, + 3 + ], + [ + 136, + 149, + 2 + ], + [ + 133, + 149, + 2 + ], + [ + 1083, + 146, + 4 + ], + [ + 1026, + 1080, + 1 + ], + [ + 163, + 156, + 1 + ], + [ + 1042, + 132, + 4 + ], + [ + 180, + 1025, + 1 + ], + [ + 1041, + 144, + 4 + ], + [ + 1055, + 1026, + 1 + ], + [ + 136, + 1029, + 2 + ], + [ + 1068, + 149, + 6 + ], + [ + 1035, + 144, + 4 + ], + [ + 136, + 145, + 2 + ], + [ + 1035, + 138, + 2 + ], + [ + 1047, + 173, + 1 + ], + [ + 138, + 145, + 2 + ], + [ + 230, + 230, + 3 + ], + [ + 181, + 1025, + 1 + ], + [ + 1040, + 170, + 2 + ], + [ + 1047, + 168, + 1 + ], + [ + 1064, + 1026, + 1 + ], + [ + 132, + 151, + 2 + ], + [ + 179, + 150, + 2 + ], + [ + 241, + 241, + 2 + ], + [ + 275, + 275, + 2 + ], + [ + 158, + 158, + 5 + ], + [ + 1033, + 180, + 1 + ], + [ + 1026, + 1048, + 3 + ], + [ + 1026, + 1082, + 1 + ], + [ + 1047, + 172, + 1 + ], + [ + 1068, + 147, + 6 + ], + [ + 132, + 1031, + 2 + ], + [ + 1060, + 1026, + 1 + ], + [ + 103, + 236, + 2 + ], + [ + 138, + 1029, + 2 + ], + [ + 1056, + 151, + 2 + ], + [ + 148, + 144, + 1 + ], + [ + 1024, + 219, + 4 + ], + [ + 1035, + 149, + 4 + ], + [ + 1072, + 156, + 2 + ], + [ + 172, + 163, + 1 + ], + [ + 215, + 132, + 2 + ], + [ + 179, + 136, + 3 + ], + [ + 223, + 132, + 2 + ], + [ + 1024, + 217, + 4 + ], + [ + 103, + 255, + 2 + ], + [ + 150, + 147, + 2 + ], + [ + 103, + 240, + 2 + ], + [ + 103, + 257, + 2 + ], + [ + 220, + 220, + 4 + ], + [ + 1063, + 1026, + 1 + ], + [ + 1085, + 147, + 4 + ], + [ + 1035, + 148, + 4 + ], + [ + 1024, + 224, + 4 + ], + [ + 1031, + 177, + 2 + ], + [ + 151, + 177, + 2 + ], + [ + 152, + 104, + 2 + ], + [ + 1065, + 1026, + 1 + ], + [ + 1071, + 1026, + 1 + ], + [ + 166, + 166, + 5 + ], + [ + 1024, + 228, + 4 + ], + [ + 103, + 258, + 2 + ], + [ + 214, + 132, + 2 + ], + [ + 173, + 163, + 1 + ], + [ + 222, + 222, + 4 + ], + [ + 1024, + 226, + 4 + ], + [ + 145, + 148, + 2 + ], + [ + 1025, + 245, + 2 + ], + [ + 133, + 147, + 1 + ], + [ + 1074, + 152, + 3 + ], + [ + 1031, + 179, + 2 + ], + [ + 165, + 165, + 5 + ], + [ + 1072, + 170, + 2 + ], + [ + 235, + 235, + 3 + ], + [ + 1074, + 163, + 3 + ], + [ + 1091, + 138, + 2 + ], + [ + 1068, + 146, + 6 + ], + [ + 147, + 133, + 1 + ], + [ + 217, + 217, + 4 + ], + [ + 104, + 181, + 2 + ], + [ + 170, + 158, + 1 + ], + [ + 150, + 179, + 3 + ], + [ + 1074, + 170, + 3 + ], + [ + 104, + 180, + 2 + ], + [ + 1026, + 1042, + 1 + ], + [ + 248, + 248, + 2 + ], + [ + 103, + 261, + 2 + ], + [ + 242, + 242, + 4 + ], + [ + 133, + 1041, + 2 + ], + [ + 219, + 147, + 2 + ], + [ + 1026, + 1043, + 1 + ], + [ + 132, + 150, + 2 + ], + [ + 1089, + 136, + 2 + ], + [ + 1026, + 1041, + 5 + ], + [ + 189, + 144, + 2 + ], + [ + 1072, + 158, + 2 + ], + [ + 1068, + 136, + 6 + ], + [ + 163, + 172, + 1 + ], + [ + 167, + 167, + 2 + ], + [ + 1040, + 170, + 4 + ], + [ + 1034, + 189, + 2 + ], + [ + 1033, + 181, + 1 + ], + [ + 1024, + 230, + 4 + ], + [ + 163, + 1032, + 1 + ], + [ + 149, + 1029, + 2 + ], + [ + 146, + 136, + 1 + ], + [ + 177, + 151, + 3 + ], + [ + 1026, + 1045, + 1 + ], + [ + 148, + 148, + 7 + ], + [ + 228, + 132, + 2 + ], + [ + 1068, + 138, + 6 + ], + [ + 1074, + 168, + 3 + ], + [ + 146, + 133, + 1 + ], + [ + 181, + 168, + 1 + ], + [ + 219, + 138, + 2 + ], + [ + 215, + 136, + 2 + ], + [ + 243, + 243, + 3 + ], + [ + 214, + 138, + 2 + ], + [ + 1026, + 1051, + 1 + ], + [ + 145, + 1031, + 2 + ], + [ + 150, + 149, + 2 + ], + [ + 173, + 152, + 1 + ], + [ + 133, + 146, + 1 + ], + [ + 246, + 246, + 4 + ], + [ + 1024, + 248, + 4 + ], + [ + 1026, + 1063, + 3 + ], + [ + 105, + 105, + 2 + ], + [ + 136, + 146, + 1 + ], + [ + 144, + 148, + 1 + ], + [ + 103, + 262, + 2 + ], + [ + 172, + 152, + 1 + ], + [ + 1073, + 1026, + 1 + ], + [ + 176, + 176, + 5 + ], + [ + 1042, + 1026, + 1 + ], + [ + 1026, + 1055, + 3 + ], + [ + 1186, + 163, + 1 + ], + [ + 147, + 150, + 2 + ], + [ + 168, + 170, + 1 + ], + [ + 1026, + 1046, + 3 + ], + [ + 1026, + 1046, + 5 + ], + [ + 1024, + 222, + 4 + ], + [ + 259, + 259, + 3 + ], + [ + 1026, + 1052, + 1 + ], + [ + 1024, + 235, + 4 + ], + [ + 249, + 249, + 2 + ], + [ + 172, + 170, + 1 + ], + [ + 149, + 150, + 2 + ], + [ + 132, + 144, + 2 + ], + [ + 163, + 173, + 1 + ], + [ + 1053, + 148, + 7 + ], + [ + 1072, + 168, + 2 + ], + [ + 145, + 150, + 2 + ], + [ + 156, + 104, + 2 + ], + [ + 1040, + 152, + 1 + ], + [ + 179, + 103, + 2 + ], + [ + 147, + 1031, + 2 + ], + [ + 244, + 244, + 3 + ], + [ + 1043, + 150, + 4 + ], + [ + 151, + 1029, + 2 + ], + [ + 177, + 103, + 2 + ], + [ + 176, + 103, + 2 + ], + [ + 158, + 170, + 1 + ], + [ + 132, + 1042, + 2 + ], + [ + 1040, + 152, + 4 + ], + [ + 231, + 138, + 2 + ], + [ + 165, + 170, + 1 + ], + [ + 1051, + 1026, + 1 + ], + [ + 145, + 1029, + 2 + ], + [ + 1068, + 148, + 6 + ], + [ + 163, + 1077, + 1 + ], + [ + 1024, + 220, + 4 + ], + [ + 181, + 158, + 1 + ], + [ + 144, + 133, + 3 + ], + [ + 1034, + 1026, + 1 + ], + [ + 228, + 147, + 2 + ], + [ + 151, + 146, + 2 + ], + [ + 166, + 170, + 1 + ], + [ + 250, + 250, + 3 + ], + [ + 245, + 245, + 2 + ], + [ + 189, + 103, + 2 + ], + [ + 149, + 1031, + 2 + ], + [ + 1026, + 1042, + 5 + ], + [ + 173, + 170, + 1 + ], + [ + 296, + 296, + 2 + ], + [ + 136, + 133, + 1 + ], + [ + 166, + 104, + 2 + ], + [ + 1043, + 1026, + 1 + ], + [ + 260, + 260, + 3 + ], + [ + 1110, + 177, + 4 + ], + [ + 146, + 151, + 2 + ], + [ + 1056, + 138, + 5 + ], + [ + 1040, + 163, + 2 + ], + [ + 1026, + 1034, + 1 + ], + [ + 146, + 1031, + 2 + ], + [ + 1052, + 1026, + 1 + ], + [ + 1026, + 1064, + 3 + ], + [ + 115, + 115, + 2 + ], + [ + 236, + 132, + 2 + ], + [ + 1053, + 150, + 7 + ], + [ + 1032, + 1025, + 4 + ], + [ + 145, + 176, + 3 + ], + [ + 133, + 136, + 1 + ], + [ + 224, + 138, + 2 + ], + [ + 1068, + 150, + 6 + ], + [ + 1026, + 1050, + 1 + ], + [ + 447, + 447, + 2 + ], + [ + 1072, + 173, + 2 + ], + [ + 1026, + 1058, + 1 + ], + [ + 1026, + 1071, + 3 + ], + [ + 144, + 1031, + 2 + ], + [ + 223, + 146, + 2 + ], + [ + 168, + 104, + 2 + ], + [ + 1045, + 1026, + 1 + ], + [ + 1035, + 150, + 2 + ], + [ + 1024, + 233, + 4 + ], + [ + 133, + 150, + 2 + ], + [ + 181, + 152, + 1 + ], + [ + 1053, + 151, + 7 + ], + [ + 1026, + 1050, + 5 + ], + [ + 165, + 104, + 2 + ], + [ + 217, + 146, + 2 + ], + [ + 1074, + 156, + 3 + ], + [ + 217, + 136, + 2 + ], + [ + 1025, + 152, + 3 + ], + [ + 157, + 157, + 3 + ], + [ + 1035, + 150, + 4 + ], + [ + 1072, + 172, + 2 + ], + [ + 138, + 147, + 1 + ], + [ + 1047, + 180, + 1 + ], + [ + 1077, + 163, + 2 + ], + [ + 1024, + 250, + 4 + ], + [ + 148, + 150, + 2 + ], + [ + 103, + 263, + 2 + ], + [ + 133, + 1031, + 2 + ], + [ + 148, + 1031, + 2 + ], + [ + 1068, + 151, + 6 + ], + [ + 1026, + 1065, + 3 + ], + [ + 147, + 138, + 1 + ], + [ + 156, + 156, + 5 + ], + [ + 1045, + 151, + 4 + ], + [ + 144, + 151, + 2 + ], + [ + 1040, + 163, + 4 + ], + [ + 1024, + 252, + 4 + ], + [ + 132, + 146, + 1 + ], + [ + 133, + 151, + 2 + ], + [ + 306, + 306, + 2 + ], + [ + 1026, + 1041, + 3 + ], + [ + 272, + 272, + 2 + ], + [ + 254, + 264, + 1 + ], + [ + 180, + 180, + 5 + ], + [ + 1029, + 223, + 6 + ], + [ + 1116, + 179, + 4 + ], + [ + 144, + 150, + 2 + ], + [ + 222, + 133, + 2 + ], + [ + 1080, + 1026, + 1 + ], + [ + 138, + 132, + 1 + ], + [ + 145, + 151, + 2 + ], + [ + 240, + 240, + 4 + ], + [ + 103, + 267, + 2 + ], + [ + 1081, + 172, + 2 + ], + [ + 158, + 181, + 1 + ], + [ + 1051, + 146, + 4 + ], + [ + 235, + 146, + 2 + ], + [ + 1031, + 1088, + 2 + ], + [ + 148, + 151, + 2 + ], + [ + 170, + 173, + 1 + ], + [ + 214, + 214, + 4 + ], + [ + 219, + 219, + 4 + ], + [ + 168, + 181, + 1 + ], + [ + 149, + 151, + 2 + ], + [ + 1047, + 181, + 1 + ], + [ + 170, + 172, + 1 + ], + [ + 1026, + 1045, + 5 + ], + [ + 136, + 1061, + 1 + ], + [ + 1024, + 243, + 4 + ], + [ + 1072, + 165, + 2 + ], + [ + 1026, + 1054, + 1 + ], + [ + 132, + 147, + 1 + ], + [ + 302, + 302, + 2 + ], + [ + 1026, + 1043, + 5 + ], + [ + 158, + 104, + 2 + ], + [ + 1032, + 246, + 3 + ], + [ + 144, + 189, + 3 + ], + [ + 1024, + 254, + 4 + ], + [ + 1032, + 242, + 3 + ], + [ + 103, + 264, + 2 + ], + [ + 1024, + 244, + 4 + ], + [ + 1040, + 166, + 2 + ], + [ + 1074, + 158, + 3 + ], + [ + 287, + 287, + 2 + ], + [ + 1084, + 173, + 2 + ], + [ + 1029, + 228, + 6 + ], + [ + 230, + 147, + 2 + ], + [ + 1088, + 149, + 2 + ], + [ + 233, + 233, + 4 + ], + [ + 136, + 132, + 1 + ], + [ + 170, + 165, + 1 + ], + [ + 1082, + 1026, + 1 + ], + [ + 150, + 145, + 2 + ], + [ + 226, + 226, + 4 + ], + [ + 103, + 266, + 2 + ], + [ + 1040, + 152, + 2 + ], + [ + 1045, + 138, + 4 + ], + [ + 1024, + 257, + 4 + ], + [ + 1024, + 231, + 4 + ], + [ + 147, + 132, + 1 + ], + [ + 1035, + 151, + 2 + ], + [ + 144, + 149, + 2 + ], + [ + 1029, + 177, + 6 + ], + [ + 1029, + 179, + 6 + ], + [ + 294, + 294, + 2 + ], + [ + 132, + 220, + 2 + ], + [ + 103, + 269, + 2 + ], + [ + 1072, + 166, + 2 + ], + [ + 1029, + 214, + 6 + ], + [ + 260, + 172, + 1 + ], + [ + 1032, + 1086, + 3 + ], + [ + 180, + 181, + 1 + ], + [ + 224, + 133, + 2 + ], + [ + 1024, + 236, + 4 + ], + [ + 1031, + 1094, + 2 + ], + [ + 215, + 215, + 4 + ], + [ + 141, + 141, + 2 + ], + [ + 231, + 231, + 4 + ], + [ + 265, + 265, + 3 + ], + [ + 1052, + 147, + 4 + ], + [ + 145, + 248, + 2 + ], + [ + 152, + 173, + 1 + ], + [ + 1027, + 245, + 4 + ], + [ + 164, + 164, + 3 + ], + [ + 1058, + 1026, + 1 + ], + [ + 103, + 1061, + 2 + ], + [ + 145, + 1050, + 2 + ], + [ + 138, + 133, + 1 + ], + [ + 177, + 177, + 6 + ], + [ + 1025, + 168, + 3 + ], + [ + 1026, + 1052, + 5 + ], + [ + 166, + 180, + 1 + ], + [ + 1024, + 261, + 4 + ], + [ + 151, + 149, + 2 + ], + [ + 1024, + 258, + 4 + ], + [ + 251, + 251, + 1 + ], + [ + 1026, + 1051, + 5 + ], + [ + 148, + 145, + 2 + ], + [ + 1074, + 165, + 3 + ], + [ + 163, + 181, + 1 + ], + [ + 103, + 274, + 2 + ], + [ + 176, + 248, + 2 + ], + [ + 292, + 292, + 2 + ], + [ + 257, + 257, + 2 + ], + [ + 152, + 172, + 1 + ], + [ + 1035, + 151, + 4 + ], + [ + 103, + 277, + 2 + ], + [ + 241, + 241, + 4 + ], + [ + 1074, + 166, + 3 + ], + [ + 165, + 172, + 1 + ], + [ + 1029, + 215, + 6 + ], + [ + 1026, + 1058, + 5 + ], + [ + 1032, + 265, + 3 + ], + [ + 149, + 240, + 2 + ], + [ + 136, + 217, + 2 + ], + [ + 168, + 168, + 4 + ], + [ + 136, + 1031, + 2 + ], + [ + 113, + 113, + 3 + ], + [ + 140, + 140, + 2 + ], + [ + 1026, + 144, + 7 + ], + [ + 1029, + 1075, + 5 + ], + [ + 250, + 250, + 2 + ], + [ + 181, + 180, + 1 + ], + [ + 104, + 242, + 1 + ], + [ + 1040, + 173, + 2 + ], + [ + 138, + 1031, + 2 + ], + [ + 1024, + 255, + 4 + ], + [ + 132, + 236, + 2 + ], + [ + 252, + 267, + 1 + ], + [ + 136, + 1070, + 2 + ], + [ + 1026, + 1069, + 1 + ], + [ + 149, + 1058, + 2 + ], + [ + 151, + 145, + 2 + ], + [ + 1025, + 1086, + 2 + ], + [ + 132, + 215, + 2 + ], + [ + 103, + 276, + 2 + ], + [ + 146, + 223, + 2 + ], + [ + 1024, + 240, + 4 + ], + [ + 104, + 1086, + 1 + ], + [ + 1040, + 165, + 2 + ], + [ + 133, + 138, + 1 + ], + [ + 144, + 1046, + 2 + ], + [ + 179, + 179, + 6 + ], + [ + 132, + 223, + 2 + ], + [ + 150, + 1029, + 2 + ], + [ + 1024, + 249, + 4 + ], + [ + 1026, + 1066, + 1 + ], + [ + 1040, + 163, + 1 + ], + [ + 156, + 181, + 1 + ], + [ + 296, + 176, + 2 + ], + [ + 165, + 180, + 1 + ], + [ + 1026, + 1073, + 3 + ], + [ + 144, + 1041, + 2 + ], + [ + 220, + 220, + 5 + ], + [ + 1072, + 180, + 2 + ], + [ + 1025, + 242, + 2 + ], + [ + 1026, + 1050, + 3 + ], + [ + 236, + 236, + 4 + ], + [ + 271, + 271, + 3 + ], + [ + 117, + 117, + 3 + ], + [ + 348, + 348, + 2 + ], + [ + 1066, + 138, + 4 + ], + [ + 133, + 224, + 2 + ], + [ + 132, + 228, + 2 + ], + [ + 146, + 217, + 2 + ], + [ + 132, + 214, + 2 + ], + [ + 162, + 162, + 3 + ], + [ + 170, + 166, + 1 + ], + [ + 1026, + 1042, + 3 + ], + [ + 147, + 219, + 2 + ], + [ + 1024, + 241, + 4 + ], + [ + 270, + 270, + 3 + ], + [ + 189, + 189, + 5 + ], + [ + 133, + 230, + 2 + ], + [ + 136, + 1043, + 2 + ], + [ + 1024, + 1056, + 4 + ], + [ + 136, + 215, + 2 + ], + [ + 151, + 1031, + 2 + ], + [ + 244, + 147, + 2 + ], + [ + 103, + 282, + 2 + ], + [ + 1029, + 248, + 6 + ], + [ + 259, + 173, + 1 + ], + [ + 303, + 303, + 2 + ], + [ + 150, + 1031, + 2 + ], + [ + 1040, + 156, + 2 + ], + [ + 133, + 226, + 2 + ], + [ + 216, + 216, + 3 + ], + [ + 1095, + 163, + 3 + ], + [ + 1104, + 172, + 3 + ], + [ + 148, + 1054, + 2 + ], + [ + 176, + 302, + 2 + ], + [ + 1026, + 1058, + 3 + ], + [ + 247, + 247, + 3 + ], + [ + 146, + 1051, + 2 + ], + [ + 166, + 1032, + 1 + ], + [ + 1024, + 1061, + 4 + ], + [ + 308, + 308, + 2 + ], + [ + 103, + 281, + 2 + ], + [ + 268, + 268, + 3 + ], + [ + 104, + 246, + 1 + ], + [ + 261, + 261, + 2 + ], + [ + 145, + 149, + 1 + ], + [ + 103, + 273, + 2 + ], + [ + 249, + 138, + 2 + ], + [ + 136, + 226, + 2 + ], + [ + 144, + 132, + 2 + ], + [ + 130, + 130, + 2 + ], + [ + 1094, + 148, + 2 + ], + [ + 222, + 222, + 5 + ], + [ + 243, + 138, + 2 + ], + [ + 1074, + 173, + 3 + ], + [ + 133, + 235, + 2 + ], + [ + 1025, + 246, + 2 + ], + [ + 103, + 280, + 2 + ], + [ + 103, + 285, + 2 + ], + [ + 1024, + 262, + 4 + ], + [ + 243, + 146, + 2 + ], + [ + 1069, + 136, + 4 + ], + [ + 173, + 168, + 1 + ], + [ + 290, + 290, + 2 + ], + [ + 181, + 163, + 1 + ], + [ + 103, + 284, + 2 + ], + [ + 264, + 254, + 1 + ], + [ + 103, + 278, + 2 + ], + [ + 103, + 279, + 2 + ], + [ + 1029, + 230, + 6 + ], + [ + 1050, + 1026, + 1 + ], + [ + 1026, + 1043, + 3 + ], + [ + 156, + 180, + 1 + ], + [ + 114, + 114, + 3 + ], + [ + 103, + 286, + 2 + ], + [ + 173, + 1084, + 1 + ], + [ + 103, + 289, + 2 + ], + [ + 297, + 297, + 2 + ], + [ + 224, + 224, + 4 + ], + [ + 1132, + 176, + 4 + ], + [ + 304, + 304, + 2 + ], + [ + 1206, + 172, + 1 + ], + [ + 152, + 181, + 1 + ], + [ + 158, + 158, + 6 + ], + [ + 1041, + 144, + 1 + ], + [ + 1054, + 1026, + 1 + ], + [ + 270, + 172, + 1 + ], + [ + 1074, + 172, + 3 + ], + [ + 147, + 1052, + 2 + ], + [ + 1029, + 219, + 6 + ], + [ + 110, + 110, + 3 + ], + [ + 1029, + 217, + 6 + ], + [ + 333, + 333, + 2 + ], + [ + 298, + 298, + 2 + ], + [ + 163, + 104, + 2 + ], + [ + 138, + 1045, + 2 + ], + [ + 165, + 1032, + 1 + ], + [ + 170, + 1032, + 1 + ], + [ + 1024, + 263, + 4 + ], + [ + 1026, + 1036, + 1 + ], + [ + 166, + 181, + 1 + ], + [ + 1031, + 1089, + 2 + ], + [ + 491, + 491, + 2 + ], + [ + 1069, + 1026, + 1 + ], + [ + 1029, + 1079, + 5 + ], + [ + 267, + 252, + 1 + ], + [ + 168, + 172, + 1 + ], + [ + 152, + 1032, + 1 + ], + [ + 132, + 136, + 1 + ], + [ + 159, + 159, + 3 + ], + [ + 132, + 138, + 1 + ], + [ + 1074, + 180, + 3 + ], + [ + 176, + 296, + 2 + ], + [ + 1034, + 176, + 2 + ], + [ + 1029, + 226, + 6 + ], + [ + 248, + 248, + 3 + ], + [ + 200, + 200, + 2 + ], + [ + 173, + 259, + 1 + ], + [ + 266, + 266, + 3 + ], + [ + 145, + 220, + 1 + ], + [ + 275, + 275, + 3 + ], + [ + 1025, + 156, + 3 + ], + [ + 1070, + 150, + 1 + ], + [ + 1040, + 165, + 1 + ], + [ + 313, + 234, + 2 + ], + [ + 177, + 151, + 4 + ], + [ + 221, + 221, + 3 + ], + [ + 226, + 133, + 2 + ], + [ + 270, + 163, + 1 + ], + [ + 1040, + 168, + 2 + ], + [ + 154, + 154, + 3 + ], + [ + 320, + 320, + 2 + ], + [ + 147, + 230, + 2 + ], + [ + 1072, + 181, + 2 + ], + [ + 1024, + 1076, + 4 + ], + [ + 138, + 219, + 2 + ], + [ + 181, + 172, + 1 + ], + [ + 1029, + 224, + 6 + ], + [ + 233, + 136, + 2 + ], + [ + 283, + 283, + 2 + ], + [ + 1026, + 1045, + 3 + ], + [ + 103, + 300, + 2 + ], + [ + 166, + 173, + 1 + ], + [ + 149, + 145, + 1 + ], + [ + 103, + 291, + 2 + ], + [ + 152, + 152, + 5 + ], + [ + 268, + 163, + 1 + ], + [ + 251, + 349, + 2 + ], + [ + 1026, + 1054, + 5 + ], + [ + 155, + 155, + 3 + ], + [ + 136, + 147, + 1 + ], + [ + 1026, + 1080, + 3 + ], + [ + 1062, + 1062, + 4 + ], + [ + 1067, + 133, + 5 + ], + [ + 153, + 153, + 3 + ], + [ + 271, + 163, + 1 + ], + [ + 1026, + 1051, + 3 + ], + [ + 459, + 459, + 2 + ], + [ + 1066, + 1026, + 1 + ], + [ + 1031, + 1091, + 2 + ], + [ + 103, + 288, + 2 + ], + [ + 147, + 136, + 1 + ], + [ + 156, + 156, + 6 + ], + [ + 269, + 269, + 3 + ], + [ + 146, + 138, + 1 + ], + [ + 236, + 148, + 2 + ], + [ + 223, + 223, + 4 + ], + [ + 1029, + 1075, + 6 + ], + [ + 272, + 163, + 1 + ], + [ + 1026, + 1054, + 3 + ], + [ + 1040, + 170, + 1 + ], + [ + 166, + 166, + 1 + ], + [ + 1041, + 133, + 4 + ], + [ + 136, + 233, + 2 + ], + [ + 179, + 150, + 4 + ], + [ + 1040, + 158, + 2 + ], + [ + 1074, + 181, + 3 + ], + [ + 1169, + 163, + 3 + ], + [ + 103, + 295, + 2 + ], + [ + 245, + 245, + 4 + ], + [ + 249, + 249, + 4 + ], + [ + 145, + 306, + 2 + ], + [ + 1029, + 257, + 6 + ], + [ + 146, + 235, + 2 + ], + [ + 1029, + 235, + 6 + ], + [ + 156, + 1032, + 1 + ], + [ + 1240, + 173, + 1 + ], + [ + 1067, + 144, + 2 + ], + [ + 1026, + 1052, + 3 + ], + [ + 230, + 133, + 2 + ], + [ + 176, + 149, + 2 + ], + [ + 1040, + 166, + 1 + ], + [ + 145, + 273, + 2 + ], + [ + 240, + 149, + 2 + ], + [ + 1056, + 151, + 1 + ], + [ + 319, + 152, + 1 + ], + [ + 1040, + 168, + 1 + ], + [ + 1026, + 1082, + 3 + ], + [ + 1113, + 173, + 3 + ], + [ + 165, + 165, + 1 + ], + [ + 314, + 239, + 2 + ], + [ + 138, + 214, + 2 + ], + [ + 145, + 133, + 2 + ], + [ + 1025, + 265, + 2 + ], + [ + 104, + 259, + 1 + ], + [ + 145, + 1042, + 2 + ], + [ + 226, + 136, + 2 + ], + [ + 1043, + 136, + 4 + ], + [ + 299, + 163, + 1 + ], + [ + 1038, + 152, + 4 + ], + [ + 1121, + 170, + 5 + ], + [ + 158, + 1032, + 1 + ], + [ + 1024, + 103, + 3 + ], + [ + 147, + 228, + 2 + ], + [ + 246, + 246, + 5 + ], + [ + 1067, + 144, + 1 + ], + [ + 301, + 172, + 1 + ], + [ + 242, + 242, + 5 + ], + [ + 104, + 265, + 1 + ], + [ + 1024, + 267, + 4 + ], + [ + 138, + 1056, + 2 + ], + [ + 158, + 180, + 1 + ], + [ + 1031, + 250, + 2 + ], + [ + 144, + 1057, + 2 + ], + [ + 1036, + 1026, + 1 + ], + [ + 1029, + 1079, + 6 + ], + [ + 1024, + 264, + 4 + ], + [ + 293, + 172, + 1 + ], + [ + 325, + 325, + 2 + ], + [ + 1025, + 1093, + 2 + ], + [ + 138, + 146, + 1 + ], + [ + 168, + 168, + 5 + ], + [ + 189, + 133, + 3 + ], + [ + 305, + 177, + 2 + ], + [ + 1033, + 1272, + 1 + ], + [ + 1061, + 179, + 3 + ], + [ + 1121, + 163, + 5 + ], + [ + 1042, + 145, + 1 + ], + [ + 1060, + 132, + 6 + ], + [ + 279, + 279, + 3 + ], + [ + 334, + 177, + 2 + ], + [ + 1026, + 1066, + 5 + ], + [ + 1059, + 144, + 1 + ], + [ + 165, + 181, + 1 + ], + [ + 170, + 104, + 2 + ], + [ + 1038, + 1260, + 2 + ], + [ + 1119, + 163, + 3 + ], + [ + 1024, + 266, + 4 + ], + [ + 1029, + 252, + 6 + ], + [ + 138, + 231, + 2 + ], + [ + 180, + 166, + 1 + ], + [ + 138, + 224, + 2 + ], + [ + 335, + 335, + 2 + ], + [ + 1029, + 220, + 6 + ], + [ + 302, + 176, + 2 + ], + [ + 248, + 149, + 2 + ], + [ + 1029, + 254, + 6 + ], + [ + 1048, + 145, + 6 + ], + [ + 339, + 339, + 3 + ], + [ + 103, + 309, + 2 + ], + [ + 275, + 176, + 2 + ], + [ + 1046, + 148, + 4 + ], + [ + 1043, + 150, + 1 + ], + [ + 1027, + 265, + 4 + ], + [ + 322, + 152, + 1 + ], + [ + 235, + 133, + 2 + ], + [ + 104, + 1093, + 1 + ], + [ + 217, + 217, + 5 + ], + [ + 308, + 177, + 2 + ], + [ + 199, + 199, + 2 + ], + [ + 168, + 173, + 1 + ], + [ + 526, + 526, + 2 + ], + [ + 244, + 244, + 4 + ], + [ + 271, + 173, + 1 + ], + [ + 241, + 136, + 2 + ], + [ + 1024, + 269, + 4 + ], + [ + 170, + 180, + 1 + ], + [ + 260, + 260, + 4 + ], + [ + 146, + 243, + 2 + ], + [ + 321, + 152, + 1 + ], + [ + 507, + 507, + 2 + ], + [ + 1029, + 261, + 6 + ], + [ + 144, + 189, + 4 + ], + [ + 496, + 496, + 2 + ], + [ + 326, + 156, + 1 + ], + [ + 132, + 133, + 2 + ], + [ + 1027, + 242, + 4 + ], + [ + 504, + 504, + 2 + ], + [ + 181, + 156, + 1 + ], + [ + 1024, + 277, + 4 + ], + [ + 318, + 152, + 1 + ], + [ + 1026, + 1098, + 1 + ], + [ + 150, + 179, + 4 + ], + [ + 1024, + 274, + 4 + ], + [ + 1111, + 133, + 4 + ], + [ + 1040, + 172, + 1 + ], + [ + 104, + 1099, + 1 + ], + [ + 1040, + 156, + 1 + ], + [ + 228, + 228, + 4 + ], + [ + 1029, + 1061, + 5 + ], + [ + 234, + 328, + 2 + ], + [ + 1025, + 158, + 3 + ], + [ + 147, + 144, + 1 + ], + [ + 166, + 166, + 6 + ], + [ + 172, + 1081, + 1 + ], + [ + 1040, + 172, + 2 + ], + [ + 1029, + 244, + 6 + ], + [ + 214, + 214, + 5 + ], + [ + 345, + 345, + 2 + ], + [ + 176, + 307, + 2 + ], + [ + 148, + 1041, + 2 + ], + [ + 215, + 215, + 5 + ], + [ + 132, + 145, + 3 + ], + [ + 165, + 165, + 6 + ], + [ + 151, + 151, + 7 + ], + [ + 247, + 247, + 1 + ], + [ + 273, + 273, + 2 + ], + [ + 1025, + 1099, + 2 + ], + [ + 172, + 168, + 1 + ], + [ + 1121, + 152, + 5 + ], + [ + 219, + 219, + 5 + ], + [ + 230, + 230, + 4 + ], + [ + 150, + 150, + 7 + ], + [ + 1121, + 156, + 5 + ], + [ + 1026, + 1069, + 3 + ], + [ + 152, + 1105, + 1 + ], + [ + 181, + 104, + 2 + ], + [ + 148, + 1073, + 2 + ], + [ + 118, + 118, + 2 + ], + [ + 119, + 119, + 2 + ], + [ + 1031, + 176, + 6 + ], + [ + 231, + 231, + 5 + ], + [ + 311, + 179, + 2 + ], + [ + 103, + 306, + 2 + ], + [ + 148, + 236, + 2 + ], + [ + 163, + 1095, + 1 + ], + [ + 1040, + 173, + 1 + ], + [ + 1029, + 1078, + 5 + ], + [ + 272, + 272, + 3 + ], + [ + 263, + 146, + 2 + ], + [ + 1040, + 158, + 1 + ], + [ + 1038, + 1239, + 2 + ], + [ + 1024, + 278, + 4 + ], + [ + 145, + 223, + 1 + ], + [ + 259, + 259, + 4 + ], + [ + 232, + 232, + 3 + ], + [ + 237, + 237, + 3 + ], + [ + 293, + 293, + 2 + ], + [ + 484, + 484, + 2 + ], + [ + 214, + 295, + 1 + ], + [ + 257, + 257, + 3 + ], + [ + 1026, + 1069, + 5 + ], + [ + 180, + 104, + 2 + ], + [ + 251, + 251, + 3 + ], + [ + 1026, + 1066, + 3 + ], + [ + 287, + 287, + 3 + ], + [ + 528, + 528, + 2 + ], + [ + 1024, + 273, + 4 + ], + [ + 1024, + 291, + 4 + ], + [ + 145, + 132, + 3 + ], + [ + 240, + 133, + 2 + ], + [ + 176, + 1062, + 2 + ], + [ + 325, + 179, + 2 + ], + [ + 449, + 449, + 2 + ], + [ + 1057, + 133, + 6 + ], + [ + 144, + 146, + 1 + ], + [ + 177, + 151, + 5 + ], + [ + 1029, + 236, + 6 + ], + [ + 243, + 243, + 4 + ], + [ + 181, + 173, + 1 + ], + [ + 1024, + 289, + 4 + ], + [ + 241, + 241, + 5 + ], + [ + 220, + 149, + 2 + ], + [ + 233, + 233, + 5 + ], + [ + 148, + 189, + 2 + ], + [ + 222, + 222, + 6 + ], + [ + 1024, + 276, + 4 + ], + [ + 1027, + 246, + 4 + ], + [ + 252, + 252, + 2 + ], + [ + 270, + 270, + 2 + ], + [ + 1029, + 250, + 6 + ], + [ + 1031, + 248, + 2 + ], + [ + 1024, + 282, + 4 + ], + [ + 261, + 147, + 2 + ], + [ + 144, + 230, + 1 + ], + [ + 1070, + 136, + 5 + ], + [ + 180, + 173, + 1 + ], + [ + 299, + 299, + 3 + ], + [ + 176, + 315, + 2 + ], + [ + 168, + 1032, + 1 + ], + [ + 156, + 1033, + 1 + ], + [ + 220, + 149, + 5 + ], + [ + 295, + 214, + 1 + ], + [ + 1029, + 243, + 6 + ], + [ + 1024, + 286, + 4 + ], + [ + 132, + 1048, + 2 + ], + [ + 255, + 138, + 2 + ], + [ + 1024, + 281, + 4 + ], + [ + 1038, + 156, + 4 + ], + [ + 1045, + 151, + 1 + ], + [ + 144, + 147, + 1 + ], + [ + 1089, + 150, + 2 + ], + [ + 177, + 1110, + 3 + ], + [ + 172, + 181, + 1 + ], + [ + 472, + 472, + 2 + ], + [ + 235, + 235, + 4 + ], + [ + 271, + 165, + 1 + ], + [ + 1062, + 145, + 1 + ], + [ + 262, + 147, + 2 + ], + [ + 1083, + 1083, + 4 + ], + [ + 1031, + 189, + 6 + ], + [ + 1038, + 158, + 4 + ], + [ + 103, + 144, + 1 + ], + [ + 1034, + 179, + 2 + ], + [ + 1026, + 132, + 7 + ], + [ + 361, + 361, + 1 + ], + [ + 180, + 156, + 1 + ], + [ + 172, + 104, + 2 + ], + [ + 1085, + 1085, + 4 + ], + [ + 180, + 170, + 1 + ], + [ + 244, + 136, + 2 + ], + [ + 289, + 215, + 1 + ], + [ + 133, + 240, + 2 + ], + [ + 347, + 179, + 2 + ], + [ + 223, + 145, + 1 + ], + [ + 330, + 158, + 1 + ], + [ + 148, + 250, + 2 + ], + [ + 1038, + 168, + 4 + ], + [ + 146, + 144, + 1 + ], + [ + 176, + 132, + 3 + ], + [ + 149, + 1042, + 2 + ], + [ + 149, + 1071, + 2 + ], + [ + 1038, + 163, + 4 + ], + [ + 239, + 362, + 2 + ], + [ + 245, + 165, + 1 + ], + [ + 1121, + 158, + 5 + ], + [ + 283, + 173, + 1 + ], + [ + 1034, + 177, + 2 + ], + [ + 228, + 145, + 1 + ], + [ + 292, + 292, + 3 + ], + [ + 138, + 249, + 2 + ], + [ + 303, + 303, + 3 + ], + [ + 105, + 105, + 3 + ], + [ + 1033, + 245, + 1 + ], + [ + 157, + 113, + 2 + ], + [ + 1043, + 146, + 4 + ], + [ + 388, + 388, + 2 + ], + [ + 131, + 131, + 2 + ], + [ + 1036, + 176, + 4 + ], + [ + 242, + 166, + 1 + ], + [ + 277, + 255, + 1 + ], + [ + 304, + 177, + 2 + ], + [ + 150, + 217, + 1 + ], + [ + 1042, + 149, + 4 + ], + [ + 1032, + 168, + 4 + ], + [ + 104, + 271, + 1 + ], + [ + 216, + 216, + 1 + ], + [ + 246, + 158, + 3 + ], + [ + 147, + 146, + 2 + ], + [ + 1035, + 1092, + 2 + ], + [ + 320, + 179, + 2 + ], + [ + 1026, + 189, + 1 + ], + [ + 1031, + 179, + 6 + ], + [ + 288, + 288, + 3 + ], + [ + 1024, + 1056, + 1 + ], + [ + 278, + 278, + 3 + ], + [ + 173, + 166, + 1 + ], + [ + 138, + 136, + 2 + ], + [ + 254, + 254, + 3 + ], + [ + 404, + 404, + 2 + ], + [ + 1024, + 280, + 4 + ], + [ + 1045, + 147, + 4 + ], + [ + 1120, + 163, + 4 + ], + [ + 104, + 268, + 1 + ], + [ + 132, + 148, + 1 + ], + [ + 220, + 1062, + 2 + ], + [ + 1121, + 165, + 5 + ], + [ + 1029, + 222, + 6 + ], + [ + 189, + 148, + 2 + ], + [ + 263, + 263, + 2 + ], + [ + 1029, + 231, + 6 + ], + [ + 1075, + 176, + 3 + ], + [ + 446, + 446, + 2 + ], + [ + 1025, + 166, + 3 + ], + [ + 151, + 219, + 1 + ], + [ + 144, + 103, + 1 + ], + [ + 150, + 215, + 1 + ], + [ + 181, + 166, + 1 + ], + [ + 1029, + 240, + 6 + ], + [ + 144, + 235, + 1 + ], + [ + 157, + 114, + 2 + ], + [ + 324, + 152, + 1 + ], + [ + 167, + 167, + 3 + ], + [ + 1094, + 1031, + 2 + ], + [ + 149, + 240, + 4 + ], + [ + 150, + 136, + 3 + ], + [ + 170, + 1027, + 1 + ], + [ + 1024, + 285, + 4 + ], + [ + 133, + 1049, + 2 + ], + [ + 147, + 244, + 2 + ], + [ + 258, + 274, + 1 + ], + [ + 104, + 270, + 1 + ], + [ + 149, + 176, + 2 + ], + [ + 180, + 158, + 1 + ], + [ + 180, + 172, + 1 + ], + [ + 1025, + 165, + 3 + ], + [ + 1024, + 279, + 4 + ], + [ + 221, + 221, + 1 + ], + [ + 245, + 166, + 1 + ], + [ + 257, + 146, + 2 + ], + [ + 331, + 177, + 2 + ], + [ + 180, + 165, + 1 + ], + [ + 220, + 145, + 1 + ], + [ + 329, + 329, + 3 + ], + [ + 1121, + 168, + 5 + ], + [ + 333, + 189, + 2 + ], + [ + 335, + 177, + 2 + ], + [ + 1024, + 295, + 4 + ], + [ + 306, + 306, + 3 + ], + [ + 367, + 367, + 3 + ], + [ + 146, + 147, + 2 + ], + [ + 308, + 308, + 3 + ], + [ + 132, + 1050, + 2 + ], + [ + 266, + 146, + 2 + ], + [ + 349, + 349, + 3 + ], + [ + 1029, + 233, + 6 + ], + [ + 262, + 262, + 2 + ], + [ + 1088, + 1031, + 2 + ], + [ + 1025, + 1032, + 3 + ], + [ + 1024, + 309, + 4 + ], + [ + 151, + 138, + 3 + ], + [ + 1121, + 180, + 5 + ], + [ + 1038, + 165, + 4 + ], + [ + 1024, + 288, + 4 + ], + [ + 1046, + 147, + 4 + ], + [ + 172, + 165, + 1 + ], + [ + 224, + 224, + 5 + ], + [ + 307, + 307, + 2 + ], + [ + 215, + 145, + 1 + ], + [ + 215, + 289, + 1 + ], + [ + 1024, + 284, + 4 + ], + [ + 1033, + 246, + 1 + ], + [ + 1038, + 170, + 4 + ], + [ + 226, + 226, + 5 + ], + [ + 269, + 269, + 2 + ], + [ + 1042, + 146, + 4 + ], + [ + 136, + 138, + 2 + ], + [ + 334, + 334, + 2 + ], + [ + 1031, + 219, + 2 + ], + [ + 242, + 156, + 3 + ], + [ + 1024, + 300, + 4 + ], + [ + 144, + 222, + 1 + ], + [ + 150, + 1043, + 2 + ], + [ + 246, + 165, + 1 + ], + [ + 231, + 149, + 2 + ], + [ + 1026, + 145, + 7 + ], + [ + 301, + 301, + 3 + ], + [ + 1032, + 1093, + 3 + ], + [ + 168, + 163, + 1 + ], + [ + 358, + 358, + 2 + ], + [ + 1224, + 180, + 1 + ], + [ + 181, + 165, + 1 + ], + [ + 1296, + 158, + 1 + ], + [ + 41, + 41, + 1 + ], + [ + 283, + 283, + 3 + ], + [ + 314, + 314, + 1 + ], + [ + 133, + 132, + 2 + ], + [ + 261, + 261, + 3 + ], + [ + 561, + 561, + 2 + ], + [ + 136, + 241, + 2 + ], + [ + 177, + 1056, + 2 + ], + [ + 173, + 104, + 2 + ], + [ + 489, + 489, + 2 + ], + [ + 1031, + 214, + 2 + ], + [ + 1088, + 1088, + 2 + ], + [ + 1121, + 166, + 5 + ], + [ + 148, + 133, + 1 + ], + [ + 298, + 298, + 3 + ], + [ + 369, + 179, + 2 + ], + [ + 305, + 305, + 2 + ], + [ + 1041, + 147, + 4 + ], + [ + 152, + 152, + 4 + ], + [ + 1026, + 149, + 7 + ], + [ + 145, + 228, + 1 + ], + [ + 1025, + 170, + 3 + ], + [ + 250, + 250, + 4 + ], + [ + 117, + 164, + 2 + ], + [ + 104, + 260, + 1 + ], + [ + 219, + 103, + 2 + ], + [ + 1032, + 1099, + 3 + ], + [ + 236, + 148, + 3 + ], + [ + 1031, + 217, + 2 + ], + [ + 266, + 266, + 2 + ], + [ + 132, + 149, + 1 + ], + [ + 366, + 366, + 3 + ], + [ + 1038, + 172, + 4 + ], + [ + 144, + 144, + 7 + ], + [ + 146, + 1043, + 2 + ], + [ + 1031, + 220, + 2 + ], + [ + 255, + 133, + 2 + ], + [ + 377, + 177, + 2 + ], + [ + 1081, + 166, + 2 + ], + [ + 318, + 173, + 1 + ], + [ + 245, + 170, + 1 + ], + [ + 303, + 179, + 2 + ], + [ + 115, + 115, + 3 + ], + [ + 279, + 279, + 2 + ], + [ + 1032, + 1139, + 3 + ], + [ + 157, + 339, + 2 + ], + [ + 1183, + 1034, + 1 + ], + [ + 328, + 328, + 1 + ], + [ + 245, + 158, + 1 + ], + [ + 103, + 296, + 2 + ], + [ + 1031, + 226, + 2 + ], + [ + 245, + 156, + 1 + ], + [ + 1046, + 146, + 4 + ], + [ + 144, + 224, + 1 + ], + [ + 176, + 275, + 3 + ], + [ + 269, + 147, + 2 + ], + [ + 326, + 326, + 3 + ], + [ + 1059, + 133, + 1 + ], + [ + 180, + 1106, + 1 + ], + [ + 1118, + 149, + 2 + ], + [ + 104, + 272, + 1 + ], + [ + 252, + 136, + 2 + ], + [ + 311, + 311, + 2 + ], + [ + 1029, + 241, + 6 + ], + [ + 271, + 271, + 2 + ], + [ + 1034, + 250, + 2 + ], + [ + 1031, + 223, + 2 + ], + [ + 162, + 162, + 1 + ], + [ + 1121, + 181, + 5 + ], + [ + 1027, + 1086, + 4 + ], + [ + 1076, + 177, + 3 + ], + [ + 255, + 277, + 1 + ], + [ + 1050, + 149, + 4 + ], + [ + 189, + 147, + 2 + ], + [ + 1049, + 144, + 3 + ], + [ + 103, + 307, + 2 + ], + [ + 146, + 1042, + 2 + ], + [ + 321, + 172, + 1 + ], + [ + 150, + 150, + 6 + ], + [ + 234, + 234, + 3 + ], + [ + 133, + 148, + 1 + ], + [ + 214, + 145, + 1 + ], + [ + 297, + 297, + 3 + ], + [ + 151, + 214, + 1 + ], + [ + 170, + 170, + 2 + ], + [ + 1106, + 180, + 2 + ], + [ + 103, + 302, + 2 + ], + [ + 163, + 168, + 1 + ], + [ + 1219, + 163, + 1 + ], + [ + 1040, + 181, + 1 + ], + [ + 1031, + 230, + 2 + ], + [ + 1038, + 166, + 4 + ], + [ + 1084, + 165, + 2 + ], + [ + 217, + 103, + 2 + ], + [ + 240, + 149, + 3 + ], + [ + 1031, + 224, + 2 + ], + [ + 133, + 1078, + 1 + ], + [ + 147, + 1042, + 2 + ], + [ + 605, + 605, + 2 + ], + [ + 136, + 148, + 1 + ], + [ + 1025, + 1139, + 2 + ], + [ + 132, + 176, + 3 + ], + [ + 270, + 166, + 1 + ], + [ + 1075, + 145, + 3 + ], + [ + 103, + 344, + 2 + ], + [ + 156, + 242, + 3 + ], + [ + 242, + 156, + 2 + ], + [ + 138, + 243, + 2 + ], + [ + 236, + 148, + 4 + ], + [ + 347, + 347, + 2 + ], + [ + 1121, + 172, + 5 + ], + [ + 189, + 144, + 3 + ], + [ + 382, + 382, + 3 + ], + [ + 1029, + 258, + 6 + ], + [ + 146, + 257, + 2 + ], + [ + 268, + 268, + 4 + ], + [ + 1027, + 104, + 5 + ], + [ + 1031, + 215, + 2 + ], + [ + 1031, + 228, + 2 + ], + [ + 1062, + 176, + 4 + ], + [ + 304, + 304, + 3 + ], + [ + 313, + 313, + 1 + ], + [ + 145, + 215, + 2 + ], + [ + 158, + 246, + 3 + ], + [ + 1038, + 173, + 4 + ], + [ + 287, + 180, + 1 + ], + [ + 1081, + 152, + 2 + ], + [ + 136, + 258, + 2 + ], + [ + 138, + 103, + 1 + ], + [ + 179, + 1116, + 3 + ], + [ + 133, + 149, + 1 + ], + [ + 147, + 1041, + 2 + ], + [ + 189, + 146, + 2 + ], + [ + 148, + 1046, + 2 + ], + [ + 315, + 315, + 2 + ], + [ + 1091, + 151, + 2 + ], + [ + 1026, + 1092, + 1 + ], + [ + 1026, + 189, + 3 + ], + [ + 1121, + 173, + 5 + ], + [ + 1031, + 222, + 2 + ], + [ + 1049, + 144, + 6 + ], + [ + 1034, + 1078, + 1 + ], + [ + 1040, + 180, + 1 + ], + [ + 273, + 273, + 3 + ], + [ + 168, + 1033, + 1 + ], + [ + 359, + 359, + 2 + ], + [ + 1034, + 1159, + 1 + ], + [ + 248, + 248, + 4 + ], + [ + 133, + 145, + 2 + ], + [ + 158, + 1033, + 1 + ], + [ + 214, + 151, + 1 + ], + [ + 1027, + 1137, + 4 + ], + [ + 1041, + 148, + 4 + ], + [ + 1029, + 249, + 6 + ], + [ + 136, + 244, + 2 + ], + [ + 172, + 260, + 1 + ], + [ + 217, + 217, + 6 + ], + [ + 1055, + 150, + 6 + ], + [ + 239, + 239, + 3 + ], + [ + 149, + 132, + 1 + ], + [ + 1029, + 262, + 6 + ], + [ + 1061, + 150, + 3 + ], + [ + 151, + 1045, + 2 + ], + [ + 1029, + 255, + 6 + ], + [ + 1031, + 235, + 2 + ], + [ + 1091, + 177, + 2 + ], + [ + 1031, + 1061, + 1 + ], + [ + 133, + 1046, + 2 + ], + [ + 252, + 252, + 3 + ], + [ + 1041, + 146, + 4 + ], + [ + 166, + 1033, + 1 + ], + [ + 336, + 336, + 2 + ], + [ + 152, + 1033, + 1 + ], + [ + 148, + 222, + 2 + ], + [ + 320, + 320, + 3 + ], + [ + 147, + 1045, + 2 + ], + [ + 1042, + 147, + 4 + ], + [ + 145, + 223, + 2 + ], + [ + 148, + 132, + 1 + ], + [ + 1089, + 179, + 2 + ], + [ + 173, + 181, + 1 + ], + [ + 372, + 156, + 1 + ], + [ + 246, + 158, + 2 + ], + [ + 1232, + 170, + 1 + ], + [ + 133, + 189, + 3 + ], + [ + 132, + 1075, + 2 + ], + [ + 1029, + 1076, + 5 + ], + [ + 251, + 117, + 2 + ], + [ + 589, + 589, + 2 + ], + [ + 1026, + 150, + 7 + ], + [ + 1040, + 181, + 2 + ], + [ + 1129, + 172, + 4 + ], + [ + 138, + 1076, + 1 + ], + [ + 240, + 348, + 2 + ], + [ + 1042, + 176, + 4 + ], + [ + 133, + 144, + 3 + ], + [ + 1047, + 152, + 4 + ], + [ + 249, + 249, + 5 + ], + [ + 1084, + 168, + 2 + ], + [ + 173, + 1113, + 1 + ], + [ + 220, + 220, + 6 + ], + [ + 293, + 293, + 3 + ], + [ + 296, + 296, + 3 + ], + [ + 338, + 179, + 2 + ], + [ + 621, + 621, + 2 + ], + [ + 164, + 164, + 1 + ], + [ + 219, + 151, + 1 + ], + [ + 104, + 283, + 1 + ], + [ + 231, + 177, + 2 + ], + [ + 132, + 1043, + 2 + ], + [ + 148, + 136, + 1 + ], + [ + 280, + 280, + 3 + ], + [ + 1036, + 189, + 4 + ], + [ + 163, + 272, + 1 + ], + [ + 448, + 448, + 2 + ], + [ + 274, + 258, + 1 + ], + [ + 330, + 330, + 3 + ], + [ + 146, + 263, + 2 + ], + [ + 168, + 168, + 1 + ], + [ + 1054, + 144, + 4 + ], + [ + 136, + 103, + 1 + ], + [ + 163, + 1027, + 1 + ], + [ + 1031, + 233, + 2 + ], + [ + 248, + 145, + 2 + ], + [ + 173, + 1032, + 1 + ], + [ + 587, + 587, + 2 + ], + [ + 170, + 170, + 7 + ], + [ + 247, + 113, + 2 + ], + [ + 297, + 172, + 1 + ], + [ + 371, + 158, + 1 + ], + [ + 179, + 1070, + 2 + ], + [ + 254, + 138, + 2 + ], + [ + 1025, + 180, + 3 + ], + [ + 1084, + 152, + 2 + ], + [ + 1033, + 242, + 1 + ], + [ + 1077, + 156, + 2 + ], + [ + 147, + 147, + 7 + ], + [ + 173, + 180, + 1 + ], + [ + 1029, + 1061, + 6 + ], + [ + 149, + 231, + 4 + ], + [ + 144, + 224, + 2 + ], + [ + 1104, + 166, + 3 + ], + [ + 575, + 575, + 2 + ], + [ + 1035, + 1117, + 2 + ], + [ + 103, + 315, + 2 + ], + [ + 1024, + 306, + 4 + ], + [ + 217, + 150, + 1 + ], + [ + 346, + 346, + 2 + ], + [ + 1029, + 267, + 6 + ], + [ + 1035, + 1140, + 2 + ], + [ + 1040, + 180, + 2 + ], + [ + 1077, + 166, + 2 + ], + [ + 148, + 222, + 4 + ], + [ + 223, + 176, + 2 + ], + [ + 247, + 339, + 2 + ], + [ + 146, + 1041, + 2 + ], + [ + 1031, + 1075, + 1 + ], + [ + 145, + 214, + 2 + ], + [ + 146, + 176, + 2 + ], + [ + 1029, + 1078, + 6 + ], + [ + 103, + 1132, + 2 + ], + [ + 265, + 265, + 4 + ], + [ + 138, + 255, + 2 + ], + [ + 145, + 252, + 2 + ], + [ + 548, + 548, + 2 + ], + [ + 35, + 35, + 2 + ], + [ + 379, + 379, + 2 + ], + [ + 1029, + 263, + 6 + ], + [ + 151, + 231, + 1 + ], + [ + 262, + 262, + 3 + ], + [ + 307, + 176, + 2 + ], + [ + 224, + 144, + 2 + ], + [ + 1048, + 132, + 6 + ], + [ + 179, + 303, + 2 + ], + [ + 299, + 299, + 4 + ], + [ + 513, + 513, + 2 + ], + [ + 1026, + 147, + 7 + ], + [ + 233, + 233, + 6 + ], + [ + 136, + 1055, + 2 + ], + [ + 1032, + 293, + 3 + ], + [ + 301, + 301, + 4 + ], + [ + 136, + 1061, + 2 + ], + [ + 146, + 1045, + 2 + ], + [ + 245, + 1025, + 1 + ], + [ + 151, + 214, + 2 + ], + [ + 215, + 150, + 1 + ], + [ + 236, + 236, + 5 + ], + [ + 1098, + 133, + 6 + ], + [ + 110, + 110, + 4 + ], + [ + 165, + 1033, + 1 + ], + [ + 438, + 438, + 2 + ], + [ + 1032, + 292, + 3 + ], + [ + 145, + 215, + 1 + ], + [ + 230, + 144, + 1 + ], + [ + 1047, + 163, + 4 + ], + [ + 216, + 154, + 2 + ], + [ + 250, + 133, + 2 + ], + [ + 1031, + 177, + 6 + ], + [ + 1043, + 133, + 4 + ], + [ + 600, + 600, + 2 + ], + [ + 541, + 541, + 2 + ], + [ + 1035, + 1148, + 2 + ], + [ + 1054, + 133, + 4 + ], + [ + 145, + 220, + 2 + ], + [ + 147, + 189, + 2 + ], + [ + 1029, + 1076, + 6 + ], + [ + 138, + 149, + 1 + ], + [ + 1042, + 1062, + 4 + ], + [ + 132, + 1045, + 2 + ], + [ + 680, + 680, + 2 + ], + [ + 221, + 154, + 2 + ], + [ + 226, + 150, + 1 + ], + [ + 179, + 325, + 2 + ], + [ + 1048, + 145, + 3 + ], + [ + 1032, + 270, + 3 + ], + [ + 1029, + 264, + 6 + ], + [ + 231, + 151, + 1 + ], + [ + 315, + 176, + 2 + ], + [ + 355, + 189, + 2 + ], + [ + 1097, + 152, + 2 + ], + [ + 144, + 230, + 2 + ], + [ + 157, + 314, + 2 + ], + [ + 367, + 367, + 1 + ], + [ + 1034, + 1078, + 2 + ], + [ + 1104, + 152, + 3 + ], + [ + 219, + 177, + 2 + ], + [ + 232, + 155, + 2 + ], + [ + 145, + 214, + 1 + ], + [ + 147, + 261, + 2 + ], + [ + 1077, + 165, + 2 + ], + [ + 156, + 1157, + 1 + ], + [ + 1025, + 163, + 3 + ], + [ + 531, + 531, + 2 + ], + [ + 1025, + 270, + 2 + ], + [ + 1026, + 148, + 7 + ], + [ + 254, + 254, + 2 + ], + [ + 278, + 278, + 4 + ], + [ + 149, + 220, + 4 + ], + [ + 1213, + 1034, + 1 + ], + [ + 1026, + 138, + 7 + ], + [ + 259, + 259, + 5 + ], + [ + 146, + 189, + 2 + ], + [ + 151, + 1066, + 2 + ], + [ + 215, + 136, + 3 + ], + [ + 147, + 1043, + 2 + ], + [ + 1096, + 168, + 2 + ], + [ + 144, + 226, + 1 + ], + [ + 1032, + 272, + 3 + ], + [ + 104, + 1139, + 1 + ], + [ + 149, + 1050, + 2 + ], + [ + 375, + 375, + 2 + ], + [ + 1031, + 255, + 2 + ], + [ + 206, + 206, + 2 + ], + [ + 222, + 222, + 7 + ], + [ + 241, + 241, + 6 + ], + [ + 396, + 396, + 2 + ], + [ + 1112, + 163, + 2 + ], + [ + 1032, + 268, + 3 + ], + [ + 150, + 226, + 1 + ], + [ + 598, + 598, + 2 + ], + [ + 1056, + 177, + 5 + ], + [ + 223, + 223, + 5 + ], + [ + 228, + 176, + 2 + ], + [ + 1155, + 145, + 4 + ], + [ + 138, + 219, + 3 + ], + [ + 158, + 246, + 2 + ], + [ + 1081, + 168, + 2 + ], + [ + 104, + 293, + 1 + ], + [ + 138, + 214, + 3 + ], + [ + 258, + 258, + 3 + ], + [ + 216, + 153, + 2 + ], + [ + 361, + 361, + 3 + ], + [ + 1089, + 1031, + 2 + ], + [ + 132, + 1058, + 2 + ], + [ + 156, + 242, + 2 + ], + [ + 1026, + 136, + 7 + ], + [ + 152, + 152, + 1 + ], + [ + 348, + 348, + 3 + ], + [ + 103, + 133, + 1 + ], + [ + 179, + 217, + 2 + ], + [ + 1026, + 133, + 7 + ], + [ + 300, + 224, + 1 + ], + [ + 353, + 353, + 3 + ], + [ + 1091, + 1031, + 2 + ], + [ + 1113, + 165, + 3 + ], + [ + 149, + 1045, + 2 + ], + [ + 402, + 402, + 2 + ], + [ + 458, + 458, + 2 + ], + [ + 329, + 329, + 2 + ], + [ + 395, + 395, + 2 + ], + [ + 144, + 1054, + 2 + ], + [ + 1050, + 146, + 4 + ], + [ + 1026, + 146, + 7 + ], + [ + 1040, + 165, + 4 + ], + [ + 1316, + 168, + 1 + ], + [ + 235, + 235, + 5 + ], + [ + 1025, + 272, + 2 + ], + [ + 1031, + 262, + 2 + ], + [ + 1063, + 151, + 6 + ], + [ + 263, + 263, + 3 + ], + [ + 1031, + 1079, + 2 + ], + [ + 103, + 275, + 2 + ], + [ + 1040, + 173, + 4 + ], + [ + 147, + 1064, + 2 + ], + [ + 1026, + 151, + 7 + ], + [ + 1033, + 242, + 3 + ], + [ + 163, + 163, + 2 + ], + [ + 217, + 179, + 2 + ], + [ + 260, + 260, + 5 + ], + [ + 313, + 313, + 3 + ], + [ + 255, + 255, + 3 + ], + [ + 1035, + 1062, + 2 + ], + [ + 1043, + 132, + 4 + ], + [ + 1043, + 148, + 4 + ], + [ + 152, + 1128, + 1 + ], + [ + 176, + 1079, + 2 + ], + [ + 1032, + 283, + 3 + ], + [ + 1119, + 180, + 3 + ], + [ + 397, + 168, + 1 + ], + [ + 1050, + 145, + 4 + ], + [ + 149, + 148, + 2 + ], + [ + 356, + 356, + 2 + ], + [ + 391, + 391, + 2 + ], + [ + 1040, + 166, + 4 + ], + [ + 1061, + 150, + 2 + ], + [ + 156, + 326, + 1 + ], + [ + 156, + 1027, + 1 + ], + [ + 288, + 288, + 2 + ], + [ + 399, + 399, + 2 + ], + [ + 439, + 439, + 2 + ], + [ + 1031, + 258, + 2 + ], + [ + 1110, + 1110, + 4 + ], + [ + 144, + 1049, + 2 + ], + [ + 1043, + 179, + 4 + ], + [ + 1116, + 1116, + 4 + ], + [ + 103, + 311, + 2 + ], + [ + 136, + 252, + 2 + ], + [ + 145, + 1058, + 2 + ], + [ + 1025, + 268, + 2 + ], + [ + 1034, + 224, + 2 + ], + [ + 1034, + 1190, + 1 + ], + [ + 104, + 292, + 1 + ], + [ + 172, + 180, + 1 + ], + [ + 298, + 173, + 1 + ], + [ + 148, + 236, + 3 + ], + [ + 248, + 132, + 2 + ], + [ + 335, + 335, + 3 + ], + [ + 244, + 244, + 5 + ], + [ + 1032, + 259, + 3 + ], + [ + 1104, + 168, + 3 + ], + [ + 230, + 230, + 5 + ], + [ + 427, + 427, + 2 + ], + [ + 1038, + 1319, + 2 + ], + [ + 1045, + 177, + 4 + ], + [ + 147, + 262, + 2 + ], + [ + 132, + 248, + 2 + ], + [ + 144, + 226, + 2 + ], + [ + 165, + 1027, + 1 + ], + [ + 146, + 1065, + 2 + ], + [ + 228, + 228, + 5 + ], + [ + 355, + 355, + 2 + ], + [ + 1031, + 1075, + 2 + ], + [ + 1032, + 324, + 3 + ], + [ + 243, + 243, + 5 + ], + [ + 1025, + 271, + 2 + ], + [ + 159, + 159, + 4 + ], + [ + 1077, + 158, + 2 + ], + [ + 104, + 298, + 1 + ], + [ + 447, + 154, + 2 + ], + [ + 1032, + 260, + 3 + ], + [ + 220, + 149, + 3 + ], + [ + 1113, + 168, + 3 + ], + [ + 1045, + 133, + 4 + ], + [ + 1134, + 173, + 4 + ], + [ + 327, + 173, + 1 + ], + [ + 1040, + 168, + 4 + ], + [ + 1096, + 158, + 2 + ], + [ + 366, + 366, + 1 + ], + [ + 1031, + 1061, + 2 + ], + [ + 146, + 266, + 2 + ], + [ + 1055, + 150, + 3 + ], + [ + 104, + 299, + 1 + ], + [ + 214, + 177, + 2 + ], + [ + 1031, + 263, + 2 + ], + [ + 189, + 333, + 2 + ], + [ + 1032, + 271, + 3 + ], + [ + 223, + 145, + 2 + ], + [ + 409, + 409, + 2 + ], + [ + 114, + 164, + 2 + ], + [ + 284, + 284, + 3 + ], + [ + 331, + 331, + 2 + ], + [ + 240, + 240, + 5 + ], + [ + 302, + 302, + 3 + ], + [ + 1051, + 132, + 4 + ], + [ + 149, + 220, + 2 + ], + [ + 166, + 1027, + 1 + ], + [ + 325, + 325, + 3 + ], + [ + 1025, + 260, + 2 + ], + [ + 1032, + 287, + 3 + ], + [ + 104, + 301, + 1 + ], + [ + 114, + 157, + 2 + ], + [ + 235, + 144, + 1 + ], + [ + 382, + 382, + 1 + ], + [ + 1031, + 231, + 2 + ], + [ + 1034, + 226, + 2 + ], + [ + 138, + 1041, + 2 + ], + [ + 1025, + 287, + 2 + ], + [ + 1029, + 1067, + 3 + ], + [ + 1046, + 133, + 1 + ], + [ + 224, + 300, + 1 + ], + [ + 104, + 287, + 1 + ], + [ + 170, + 170, + 3 + ], + [ + 1025, + 259, + 2 + ], + [ + 1033, + 152, + 4 + ], + [ + 136, + 1042, + 2 + ], + [ + 1031, + 249, + 2 + ], + [ + 1034, + 230, + 2 + ], + [ + 103, + 351, + 2 + ], + [ + 148, + 1043, + 2 + ], + [ + 258, + 133, + 2 + ], + [ + 177, + 308, + 2 + ], + [ + 1029, + 289, + 6 + ], + [ + 1041, + 138, + 4 + ], + [ + 144, + 235, + 2 + ], + [ + 392, + 168, + 1 + ], + [ + 166, + 242, + 1 + ], + [ + 239, + 239, + 1 + ], + [ + 1038, + 180, + 4 + ], + [ + 145, + 1079, + 2 + ], + [ + 1024, + 344, + 4 + ], + [ + 1029, + 1127, + 5 + ], + [ + 233, + 179, + 2 + ], + [ + 294, + 294, + 3 + ], + [ + 305, + 305, + 3 + ], + [ + 1047, + 245, + 1 + ], + [ + 1118, + 149, + 3 + ], + [ + 1029, + 266, + 6 + ], + [ + 190, + 190, + 2 + ], + [ + 264, + 132, + 2 + ], + [ + 1031, + 244, + 2 + ], + [ + 1034, + 223, + 2 + ], + [ + 1136, + 148, + 3 + ], + [ + 149, + 231, + 2 + ], + [ + 349, + 349, + 1 + ], + [ + 679, + 679, + 2 + ], + [ + 136, + 1041, + 2 + ], + [ + 150, + 233, + 1 + ], + [ + 1031, + 243, + 2 + ], + [ + 221, + 155, + 2 + ], + [ + 1095, + 156, + 3 + ], + [ + 163, + 268, + 1 + ], + [ + 408, + 168, + 1 + ], + [ + 1040, + 156, + 4 + ], + [ + 104, + 324, + 1 + ], + [ + 150, + 241, + 1 + ], + [ + 1031, + 252, + 2 + ], + [ + 1096, + 152, + 2 + ], + [ + 1029, + 285, + 6 + ], + [ + 1031, + 1078, + 1 + ], + [ + 1097, + 168, + 2 + ], + [ + 1040, + 158, + 4 + ], + [ + 1049, + 144, + 1 + ], + [ + 176, + 220, + 2 + ], + [ + 1113, + 152, + 3 + ], + [ + 145, + 1060, + 2 + ], + [ + 1029, + 281, + 6 + ], + [ + 148, + 233, + 2 + ], + [ + 703, + 703, + 2 + ], + [ + 137, + 137, + 2 + ], + [ + 1031, + 257, + 2 + ], + [ + 1033, + 245, + 3 + ], + [ + 132, + 1052, + 2 + ], + [ + 226, + 103, + 2 + ], + [ + 249, + 177, + 2 + ], + [ + 292, + 180, + 1 + ], + [ + 96, + 96, + 2 + ], + [ + 649, + 649, + 2 + ], + [ + 1045, + 132, + 4 + ], + [ + 158, + 1162, + 1 + ], + [ + 219, + 219, + 6 + ], + [ + 223, + 1062, + 2 + ], + [ + 362, + 362, + 1 + ], + [ + 286, + 286, + 3 + ], + [ + 151, + 249, + 1 + ], + [ + 234, + 234, + 1 + ], + [ + 380, + 380, + 2 + ], + [ + 1054, + 132, + 4 + ], + [ + 138, + 1042, + 2 + ], + [ + 146, + 276, + 2 + ], + [ + 163, + 271, + 1 + ], + [ + 165, + 246, + 1 + ], + [ + 786, + 786, + 2 + ], + [ + 1025, + 283, + 2 + ], + [ + 145, + 228, + 2 + ], + [ + 164, + 117, + 2 + ], + [ + 222, + 144, + 1 + ], + [ + 378, + 172, + 1 + ], + [ + 132, + 252, + 2 + ], + [ + 147, + 189, + 1 + ], + [ + 1040, + 172, + 4 + ], + [ + 215, + 179, + 2 + ], + [ + 414, + 414, + 2 + ], + [ + 250, + 250, + 5 + ], + [ + 1042, + 138, + 4 + ], + [ + 150, + 217, + 2 + ], + [ + 162, + 162, + 4 + ], + [ + 258, + 136, + 2 + ], + [ + 1026, + 1092, + 3 + ], + [ + 104, + 319, + 1 + ], + [ + 358, + 236, + 2 + ], + [ + 1029, + 276, + 6 + ], + [ + 104, + 297, + 1 + ], + [ + 150, + 215, + 2 + ], + [ + 16, + 16, + 2 + ], + [ + 177, + 231, + 2 + ], + [ + 283, + 180, + 1 + ], + [ + 1038, + 181, + 4 + ], + [ + 1041, + 136, + 4 + ], + [ + 1042, + 136, + 4 + ], + [ + 147, + 269, + 2 + ], + [ + 151, + 224, + 1 + ], + [ + 177, + 304, + 2 + ], + [ + 421, + 421, + 2 + ], + [ + 1031, + 236, + 2 + ], + [ + 359, + 189, + 2 + ], + [ + 1029, + 1126, + 5 + ], + [ + 1061, + 179, + 4 + ], + [ + 138, + 224, + 3 + ], + [ + 148, + 1045, + 2 + ], + [ + 393, + 393, + 2 + ], + [ + 1029, + 269, + 6 + ], + [ + 177, + 331, + 2 + ], + [ + 1033, + 246, + 3 + ], + [ + 1034, + 214, + 2 + ], + [ + 103, + 355, + 2 + ], + [ + 265, + 168, + 2 + ], + [ + 293, + 166, + 1 + ], + [ + 1108, + 132, + 6 + ], + [ + 220, + 149, + 4 + ], + [ + 275, + 275, + 4 + ], + [ + 386, + 386, + 2 + ], + [ + 279, + 279, + 4 + ], + [ + 1097, + 156, + 2 + ], + [ + 255, + 133, + 1 + ], + [ + 220, + 176, + 2 + ], + [ + 226, + 226, + 6 + ], + [ + 1043, + 147, + 4 + ], + [ + 146, + 1046, + 2 + ], + [ + 270, + 270, + 4 + ], + [ + 431, + 431, + 2 + ], + [ + 1095, + 165, + 3 + ], + [ + 1142, + 172, + 1 + ], + [ + 280, + 280, + 4 + ], + [ + 1025, + 292, + 2 + ], + [ + 1034, + 222, + 2 + ], + [ + 262, + 133, + 1 + ], + [ + 329, + 173, + 1 + ], + [ + 1029, + 274, + 6 + ], + [ + 1042, + 148, + 4 + ], + [ + 1045, + 148, + 4 + ], + [ + 177, + 334, + 2 + ], + [ + 1031, + 1079, + 1 + ], + [ + 1034, + 217, + 2 + ], + [ + 230, + 144, + 2 + ], + [ + 240, + 149, + 5 + ], + [ + 328, + 328, + 3 + ], + [ + 1031, + 254, + 2 + ], + [ + 132, + 267, + 2 + ], + [ + 293, + 180, + 1 + ], + [ + 308, + 231, + 2 + ], + [ + 1066, + 147, + 4 + ], + [ + 152, + 318, + 1 + ], + [ + 314, + 314, + 3 + ], + [ + 158, + 330, + 1 + ], + [ + 179, + 320, + 2 + ], + [ + 1029, + 103, + 5 + ], + [ + 1034, + 248, + 2 + ], + [ + 1038, + 1344, + 2 + ], + [ + 103, + 304, + 2 + ], + [ + 147, + 1046, + 2 + ], + [ + 179, + 338, + 2 + ], + [ + 189, + 1067, + 2 + ], + [ + 1034, + 228, + 2 + ], + [ + 1034, + 235, + 2 + ], + [ + 133, + 306, + 2 + ], + [ + 1080, + 136, + 6 + ], + [ + 219, + 138, + 3 + ], + [ + 179, + 146, + 2 + ], + [ + 189, + 355, + 2 + ], + [ + 1052, + 1085, + 4 + ], + [ + 153, + 153, + 4 + ], + [ + 176, + 146, + 2 + ], + [ + 202, + 202, + 2 + ], + [ + 1025, + 293, + 2 + ], + [ + 226, + 144, + 2 + ], + [ + 163, + 1120, + 1 + ], + [ + 222, + 148, + 4 + ], + [ + 152, + 1027, + 1 + ], + [ + 1029, + 282, + 6 + ], + [ + 165, + 245, + 1 + ], + [ + 410, + 156, + 1 + ], + [ + 1058, + 132, + 4 + ], + [ + 158, + 1027, + 1 + ], + [ + 1032, + 301, + 3 + ], + [ + 1050, + 147, + 4 + ], + [ + 1207, + 170, + 6 + ], + [ + 285, + 146, + 2 + ], + [ + 339, + 339, + 1 + ], + [ + 152, + 319, + 1 + ], + [ + 179, + 233, + 2 + ], + [ + 1047, + 170, + 4 + ], + [ + 1095, + 166, + 3 + ], + [ + 149, + 1043, + 2 + ], + [ + 222, + 148, + 2 + ], + [ + 177, + 305, + 2 + ], + [ + 271, + 271, + 4 + ], + [ + 217, + 150, + 2 + ], + [ + 1052, + 132, + 4 + ], + [ + 138, + 254, + 2 + ], + [ + 140, + 200, + 2 + ], + [ + 1032, + 297, + 3 + ], + [ + 258, + 133, + 1 + ], + [ + 1065, + 146, + 6 + ], + [ + 19, + 19, + 2 + ], + [ + 215, + 145, + 2 + ], + [ + 266, + 266, + 4 + ], + [ + 1034, + 233, + 2 + ], + [ + 1034, + 1135, + 1 + ], + [ + 104, + 322, + 1 + ], + [ + 248, + 248, + 5 + ], + [ + 1051, + 136, + 4 + ], + [ + 1081, + 165, + 2 + ], + [ + 214, + 214, + 6 + ], + [ + 283, + 165, + 1 + ], + [ + 136, + 1045, + 2 + ], + [ + 170, + 1105, + 1 + ], + [ + 176, + 358, + 2 + ], + [ + 1029, + 277, + 6 + ], + [ + 327, + 327, + 3 + ], + [ + 1038, + 1272, + 2 + ], + [ + 36, + 36, + 2 + ], + [ + 138, + 144, + 1 + ], + [ + 191, + 191, + 2 + ], + [ + 801, + 801, + 1 + ], + [ + 1032, + 444, + 3 + ], + [ + 1054, + 147, + 4 + ], + [ + 136, + 1069, + 2 + ], + [ + 273, + 148, + 2 + ], + [ + 132, + 264, + 2 + ], + [ + 139, + 139, + 2 + ], + [ + 1031, + 241, + 2 + ], + [ + 255, + 255, + 2 + ], + [ + 1025, + 324, + 2 + ], + [ + 1034, + 1061, + 1 + ], + [ + 257, + 257, + 4 + ], + [ + 1029, + 280, + 6 + ], + [ + 1034, + 219, + 2 + ], + [ + 1095, + 158, + 3 + ], + [ + 228, + 145, + 2 + ], + [ + 333, + 333, + 3 + ], + [ + 1059, + 136, + 1 + ], + [ + 177, + 335, + 2 + ], + [ + 247, + 367, + 2 + ], + [ + 176, + 411, + 2 + ], + [ + 262, + 133, + 2 + ], + [ + 272, + 272, + 4 + ], + [ + 1033, + 168, + 4 + ], + [ + 260, + 152, + 1 + ], + [ + 1051, + 1083, + 4 + ], + [ + 180, + 152, + 1 + ], + [ + 224, + 144, + 1 + ], + [ + 1031, + 1078, + 2 + ], + [ + 138, + 1043, + 2 + ], + [ + 242, + 152, + 1 + ], + [ + 1034, + 262, + 2 + ], + [ + 1046, + 138, + 4 + ], + [ + 156, + 1093, + 1 + ], + [ + 1026, + 189, + 5 + ], + [ + 215, + 215, + 6 + ], + [ + 1029, + 295, + 6 + ], + [ + 149, + 240, + 3 + ], + [ + 166, + 245, + 1 + ], + [ + 217, + 217, + 7 + ], + [ + 1027, + 1093, + 4 + ], + [ + 1029, + 273, + 6 + ], + [ + 353, + 180, + 1 + ], + [ + 1025, + 444, + 2 + ], + [ + 158, + 158, + 1 + ], + [ + 269, + 269, + 4 + ], + [ + 326, + 326, + 2 + ], + [ + 1059, + 148, + 1 + ], + [ + 159, + 115, + 2 + ], + [ + 1054, + 136, + 4 + ], + [ + 170, + 245, + 1 + ], + [ + 309, + 226, + 1 + ], + [ + 163, + 1033, + 1 + ], + [ + 224, + 151, + 1 + ], + [ + 1045, + 146, + 4 + ], + [ + 132, + 1041, + 2 + ], + [ + 10, + 10, + 2 + ], + [ + 138, + 1066, + 2 + ], + [ + 148, + 1049, + 2 + ], + [ + 290, + 290, + 3 + ], + [ + 306, + 446, + 2 + ], + [ + 1029, + 1056, + 3 + ], + [ + 179, + 347, + 2 + ], + [ + 189, + 136, + 2 + ], + [ + 334, + 334, + 3 + ], + [ + 1046, + 136, + 4 + ], + [ + 1051, + 133, + 4 + ], + [ + 181, + 181, + 7 + ], + [ + 103, + 303, + 2 + ], + [ + 1034, + 215, + 2 + ], + [ + 1034, + 1075, + 1 + ], + [ + 1026, + 1098, + 3 + ], + [ + 1141, + 168, + 3 + ], + [ + 132, + 254, + 2 + ], + [ + 265, + 166, + 1 + ], + [ + 270, + 165, + 1 + ], + [ + 1025, + 297, + 2 + ], + [ + 150, + 144, + 1 + ], + [ + 151, + 144, + 1 + ], + [ + 146, + 1050, + 2 + ], + [ + 1125, + 147, + 6 + ], + [ + 113, + 157, + 2 + ], + [ + 123, + 123, + 2 + ], + [ + 177, + 147, + 2 + ], + [ + 1027, + 1139, + 4 + ], + [ + 1031, + 261, + 2 + ], + [ + 1045, + 149, + 4 + ], + [ + 1032, + 298, + 3 + ], + [ + 150, + 1069, + 2 + ], + [ + 276, + 276, + 3 + ], + [ + 389, + 168, + 1 + ], + [ + 1029, + 284, + 6 + ], + [ + 189, + 359, + 2 + ], + [ + 259, + 168, + 1 + ], + [ + 432, + 432, + 2 + ], + [ + 103, + 305, + 2 + ], + [ + 1054, + 146, + 4 + ], + [ + 1082, + 138, + 6 + ], + [ + 1207, + 156, + 6 + ], + [ + 1052, + 133, + 4 + ], + [ + 1138, + 152, + 3 + ], + [ + 214, + 151, + 2 + ], + [ + 231, + 231, + 6 + ], + [ + 1064, + 147, + 6 + ], + [ + 117, + 251, + 2 + ], + [ + 132, + 1051, + 2 + ], + [ + 176, + 228, + 2 + ], + [ + 1084, + 166, + 2 + ], + [ + 173, + 1033, + 1 + ], + [ + 1043, + 149, + 4 + ], + [ + 1059, + 132, + 1 + ], + [ + 1032, + 299, + 3 + ], + [ + 263, + 133, + 2 + ], + [ + 338, + 338, + 2 + ], + [ + 1029, + 288, + 6 + ], + [ + 25, + 25, + 2 + ], + [ + 177, + 219, + 2 + ], + [ + 445, + 445, + 2 + ], + [ + 104, + 110, + 1 + ], + [ + 170, + 1033, + 1 + ], + [ + 429, + 429, + 2 + ], + [ + 1031, + 1076, + 2 + ], + [ + 1059, + 147, + 1 + ], + [ + 148, + 236, + 4 + ], + [ + 1186, + 156, + 1 + ], + [ + 150, + 138, + 2 + ], + [ + 220, + 220, + 7 + ], + [ + 259, + 152, + 1 + ], + [ + 291, + 291, + 3 + ], + [ + 306, + 133, + 2 + ], + [ + 348, + 240, + 2 + ], + [ + 1038, + 1413, + 2 + ], + [ + 1094, + 1094, + 2 + ], + [ + 179, + 241, + 2 + ], + [ + 114, + 239, + 2 + ], + [ + 163, + 270, + 1 + ], + [ + 252, + 132, + 2 + ], + [ + 287, + 287, + 4 + ], + [ + 1053, + 176, + 7 + ], + [ + 1207, + 163, + 6 + ], + [ + 281, + 147, + 2 + ], + [ + 581, + 581, + 2 + ], + [ + 164, + 164, + 4 + ], + [ + 235, + 144, + 2 + ], + [ + 464, + 464, + 2 + ], + [ + 158, + 104, + 3 + ], + [ + 351, + 189, + 2 + ], + [ + 151, + 243, + 1 + ], + [ + 222, + 1067, + 2 + ], + [ + 1035, + 103, + 7 + ], + [ + 1036, + 179, + 4 + ], + [ + 1062, + 257, + 1 + ], + [ + 214, + 145, + 2 + ], + [ + 267, + 132, + 2 + ], + [ + 424, + 424, + 2 + ], + [ + 241, + 149, + 2 + ], + [ + 311, + 311, + 3 + ], + [ + 435, + 435, + 2 + ], + [ + 1141, + 152, + 3 + ], + [ + 246, + 152, + 1 + ], + [ + 323, + 323, + 2 + ], + [ + 172, + 1104, + 1 + ], + [ + 146, + 1052, + 2 + ], + [ + 243, + 151, + 1 + ], + [ + 264, + 264, + 3 + ], + [ + 215, + 150, + 2 + ], + [ + 1138, + 168, + 3 + ], + [ + 260, + 168, + 1 + ], + [ + 1036, + 177, + 4 + ], + [ + 1096, + 156, + 2 + ], + [ + 176, + 223, + 2 + ], + [ + 180, + 1033, + 1 + ], + [ + 224, + 224, + 6 + ], + [ + 518, + 518, + 2 + ], + [ + 249, + 249, + 6 + ], + [ + 1136, + 148, + 2 + ], + [ + 681, + 681, + 2 + ], + [ + 155, + 221, + 2 + ], + [ + 1029, + 286, + 6 + ], + [ + 154, + 216, + 2 + ], + [ + 1029, + 291, + 6 + ], + [ + 133, + 1045, + 2 + ], + [ + 141, + 199, + 2 + ], + [ + 144, + 1043, + 2 + ], + [ + 149, + 1041, + 2 + ], + [ + 1026, + 1130, + 3 + ], + [ + 1034, + 220, + 2 + ], + [ + 117, + 162, + 2 + ], + [ + 132, + 103, + 1 + ], + [ + 133, + 1043, + 2 + ], + [ + 189, + 138, + 2 + ], + [ + 1034, + 255, + 2 + ], + [ + 121, + 121, + 2 + ], + [ + 179, + 1061, + 2 + ], + [ + 442, + 442, + 2 + ], + [ + 233, + 148, + 2 + ], + [ + 400, + 156, + 1 + ], + [ + 405, + 405, + 2 + ], + [ + 149, + 241, + 2 + ], + [ + 254, + 254, + 4 + ], + [ + 1075, + 145, + 2 + ], + [ + 1206, + 170, + 1 + ], + [ + 419, + 419, + 2 + ], + [ + 144, + 1052, + 2 + ], + [ + 176, + 147, + 2 + ], + [ + 215, + 103, + 2 + ], + [ + 1141, + 156, + 3 + ], + [ + 172, + 270, + 1 + ], + [ + 179, + 226, + 2 + ], + [ + 271, + 166, + 1 + ], + [ + 132, + 1117, + 2 + ], + [ + 1059, + 146, + 1 + ], + [ + 167, + 237, + 2 + ], + [ + 437, + 437, + 2 + ], + [ + 767, + 767, + 2 + ], + [ + 1069, + 1070, + 1 + ], + [ + 1106, + 166, + 2 + ], + [ + 348, + 189, + 2 + ], + [ + 1207, + 158, + 6 + ], + [ + 176, + 417, + 2 + ], + [ + 245, + 245, + 5 + ], + [ + 1097, + 158, + 2 + ], + [ + 104, + 318, + 1 + ], + [ + 214, + 138, + 3 + ], + [ + 263, + 133, + 1 + ], + [ + 1186, + 165, + 1 + ], + [ + 145, + 1043, + 2 + ], + [ + 215, + 136, + 4 + ], + [ + 236, + 358, + 2 + ], + [ + 272, + 156, + 1 + ], + [ + 148, + 1057, + 2 + ], + [ + 1244, + 144, + 2 + ], + [ + 303, + 217, + 2 + ], + [ + 466, + 466, + 2 + ], + [ + 1034, + 258, + 2 + ], + [ + 113, + 159, + 2 + ], + [ + 149, + 241, + 4 + ], + [ + 149, + 1048, + 2 + ], + [ + 242, + 242, + 6 + ], + [ + 1059, + 149, + 1 + ], + [ + 133, + 1052, + 2 + ], + [ + 144, + 250, + 2 + ], + [ + 223, + 296, + 2 + ], + [ + 265, + 165, + 1 + ], + [ + 268, + 158, + 1 + ], + [ + 288, + 147, + 2 + ], + [ + 343, + 343, + 2 + ], + [ + 1186, + 170, + 1 + ], + [ + 246, + 246, + 6 + ], + [ + 1138, + 158, + 3 + ], + [ + 1207, + 152, + 6 + ], + [ + 172, + 172, + 2 + ], + [ + 373, + 189, + 2 + ], + [ + 376, + 376, + 2 + ], + [ + 1027, + 1099, + 4 + ], + [ + 1031, + 291, + 2 + ], + [ + 146, + 146, + 7 + ], + [ + 372, + 163, + 1 + ], + [ + 284, + 284, + 4 + ], + [ + 1237, + 189, + 4 + ], + [ + 114, + 105, + 2 + ], + [ + 138, + 150, + 2 + ], + [ + 228, + 302, + 2 + ], + [ + 1037, + 1086, + 5 + ], + [ + 233, + 103, + 2 + ], + [ + 371, + 163, + 1 + ], + [ + 138, + 1063, + 2 + ], + [ + 1062, + 261, + 1 + ], + [ + 1029, + 279, + 6 + ], + [ + 1029, + 278, + 6 + ], + [ + 1050, + 132, + 1 + ], + [ + 330, + 330, + 4 + ], + [ + 1034, + 1135, + 2 + ], + [ + 220, + 145, + 2 + ], + [ + 543, + 543, + 2 + ], + [ + 1040, + 180, + 4 + ], + [ + 136, + 1046, + 2 + ], + [ + 231, + 149, + 3 + ], + [ + 297, + 152, + 1 + ], + [ + 1026, + 1140, + 1 + ], + [ + 1033, + 1152, + 1 + ], + [ + 1106, + 165, + 2 + ], + [ + 104, + 321, + 1 + ], + [ + 149, + 231, + 3 + ], + [ + 219, + 151, + 2 + ], + [ + 278, + 278, + 2 + ], + [ + 316, + 316, + 2 + ], + [ + 1031, + 240, + 2 + ], + [ + 1047, + 168, + 4 + ], + [ + 133, + 1051, + 2 + ], + [ + 136, + 151, + 2 + ], + [ + 176, + 1155, + 2 + ], + [ + 1025, + 299, + 2 + ], + [ + 148, + 250, + 4 + ], + [ + 226, + 150, + 2 + ], + [ + 265, + 168, + 1 + ], + [ + 138, + 189, + 2 + ], + [ + 177, + 1076, + 2 + ], + [ + 292, + 292, + 4 + ], + [ + 1035, + 189, + 4 + ], + [ + 172, + 1032, + 1 + ], + [ + 251, + 382, + 2 + ], + [ + 1119, + 158, + 3 + ], + [ + 155, + 110, + 2 + ], + [ + 193, + 193, + 2 + ], + [ + 173, + 271, + 1 + ], + [ + 298, + 168, + 1 + ], + [ + 148, + 233, + 3 + ], + [ + 413, + 158, + 1 + ], + [ + 1058, + 145, + 4 + ], + [ + 132, + 1046, + 2 + ], + [ + 282, + 147, + 2 + ], + [ + 1035, + 189, + 2 + ], + [ + 1047, + 156, + 4 + ], + [ + 144, + 222, + 2 + ], + [ + 152, + 322, + 1 + ], + [ + 1026, + 176, + 5 + ], + [ + 1034, + 263, + 2 + ], + [ + 151, + 136, + 2 + ], + [ + 276, + 146, + 2 + ], + [ + 342, + 342, + 2 + ], + [ + 1059, + 138, + 1 + ], + [ + 1115, + 133, + 6 + ], + [ + 318, + 165, + 1 + ], + [ + 1047, + 1404, + 1 + ], + [ + 142, + 142, + 2 + ], + [ + 181, + 181, + 2 + ], + [ + 1025, + 298, + 2 + ], + [ + 1031, + 267, + 2 + ], + [ + 1031, + 274, + 2 + ], + [ + 138, + 1052, + 2 + ], + [ + 177, + 249, + 2 + ], + [ + 230, + 103, + 2 + ], + [ + 252, + 132, + 1 + ], + [ + 275, + 248, + 2 + ], + [ + 307, + 307, + 3 + ], + [ + 1029, + 1070, + 3 + ], + [ + 1092, + 1026, + 1 + ], + [ + 110, + 168, + 1 + ], + [ + 281, + 281, + 3 + ], + [ + 1029, + 1118, + 1 + ], + [ + 1129, + 168, + 4 + ], + [ + 153, + 216, + 2 + ], + [ + 181, + 1032, + 1 + ], + [ + 347, + 347, + 3 + ], + [ + 1031, + 286, + 2 + ], + [ + 1061, + 1061, + 2 + ], + [ + 1104, + 165, + 3 + ], + [ + 1129, + 166, + 4 + ], + [ + 1186, + 158, + 1 + ], + [ + 1207, + 180, + 6 + ], + [ + 152, + 321, + 1 + ], + [ + 147, + 176, + 2 + ], + [ + 1031, + 264, + 2 + ], + [ + 1124, + 146, + 6 + ], + [ + 1207, + 165, + 6 + ], + [ + 167, + 232, + 2 + ], + [ + 272, + 158, + 1 + ], + [ + 1034, + 1079, + 2 + ], + [ + 179, + 148, + 2 + ], + [ + 179, + 311, + 2 + ], + [ + 246, + 168, + 1 + ], + [ + 219, + 219, + 7 + ], + [ + 231, + 103, + 2 + ], + [ + 132, + 252, + 1 + ], + [ + 1038, + 1437, + 2 + ], + [ + 1119, + 165, + 3 + ], + [ + 351, + 351, + 2 + ], + [ + 1058, + 133, + 4 + ], + [ + 1186, + 166, + 1 + ], + [ + 1200, + 1033, + 1 + ], + [ + 144, + 1051, + 2 + ], + [ + 235, + 103, + 2 + ], + [ + 242, + 168, + 1 + ], + [ + 136, + 226, + 3 + ], + [ + 223, + 103, + 2 + ], + [ + 1048, + 145, + 5 + ], + [ + 1119, + 166, + 3 + ], + [ + 170, + 1037, + 1 + ], + [ + 358, + 176, + 2 + ], + [ + 1059, + 145, + 1 + ], + [ + 224, + 189, + 2 + ], + [ + 283, + 283, + 4 + ], + [ + 181, + 1033, + 1 + ], + [ + 214, + 103, + 2 + ], + [ + 1207, + 181, + 6 + ], + [ + 104, + 327, + 1 + ], + [ + 150, + 252, + 1 + ], + [ + 159, + 113, + 2 + ], + [ + 226, + 309, + 1 + ], + [ + 1034, + 236, + 2 + ], + [ + 1207, + 166, + 6 + ], + [ + 144, + 1045, + 2 + ], + [ + 1034, + 1076, + 2 + ], + [ + 1078, + 189, + 3 + ], + [ + 145, + 267, + 2 + ], + [ + 119, + 119, + 3 + ], + [ + 147, + 1050, + 2 + ], + [ + 1025, + 301, + 2 + ], + [ + 1034, + 1061, + 2 + ], + [ + 1031, + 273, + 2 + ], + [ + 254, + 132, + 1 + ], + [ + 1035, + 1151, + 2 + ], + [ + 576, + 576, + 2 + ], + [ + 224, + 177, + 2 + ], + [ + 1106, + 158, + 2 + ], + [ + 1067, + 1067, + 2 + ], + [ + 149, + 133, + 1 + ], + [ + 230, + 189, + 2 + ], + [ + 156, + 156, + 1 + ], + [ + 613, + 613, + 2 + ], + [ + 1077, + 170, + 2 + ], + [ + 145, + 264, + 2 + ], + [ + 146, + 1054, + 2 + ], + [ + 261, + 261, + 4 + ], + [ + 398, + 152, + 1 + ], + [ + 1047, + 172, + 4 + ], + [ + 151, + 255, + 1 + ], + [ + 268, + 156, + 1 + ], + [ + 1031, + 300, + 2 + ], + [ + 149, + 138, + 1 + ], + [ + 88, + 88, + 1 + ], + [ + 1035, + 176, + 2 + ], + [ + 148, + 233, + 4 + ], + [ + 151, + 219, + 2 + ], + [ + 177, + 214, + 2 + ], + [ + 237, + 153, + 2 + ], + [ + 1031, + 1056, + 2 + ], + [ + 1138, + 156, + 3 + ], + [ + 1206, + 166, + 1 + ], + [ + 1219, + 156, + 1 + ], + [ + 103, + 132, + 1 + ], + [ + 136, + 1054, + 2 + ], + [ + 150, + 244, + 1 + ], + [ + 279, + 146, + 2 + ], + [ + 346, + 346, + 3 + ], + [ + 1081, + 170, + 2 + ], + [ + 528, + 366, + 2 + ], + [ + 1058, + 147, + 4 + ], + [ + 117, + 117, + 4 + ], + [ + 433, + 168, + 1 + ], + [ + 164, + 114, + 2 + ], + [ + 571, + 571, + 2 + ], + [ + 145, + 1045, + 2 + ], + [ + 148, + 1042, + 2 + ], + [ + 1031, + 266, + 2 + ], + [ + 110, + 154, + 2 + ], + [ + 162, + 115, + 2 + ], + [ + 662, + 662, + 2 + ], + [ + 1035, + 1083, + 2 + ], + [ + 1087, + 1060, + 1 + ], + [ + 103, + 136, + 1 + ], + [ + 179, + 215, + 2 + ], + [ + 241, + 149, + 4 + ], + [ + 297, + 168, + 1 + ], + [ + 389, + 172, + 1 + ], + [ + 1074, + 1260, + 3 + ], + [ + 105, + 113, + 2 + ], + [ + 1120, + 156, + 4 + ], + [ + 1143, + 180, + 4 + ], + [ + 103, + 331, + 2 + ], + [ + 150, + 146, + 1 + ], + [ + 158, + 1099, + 1 + ], + [ + 1031, + 276, + 2 + ], + [ + 1119, + 156, + 3 + ], + [ + 132, + 1054, + 2 + ], + [ + 133, + 1054, + 2 + ], + [ + 136, + 1051, + 2 + ], + [ + 1032, + 346, + 3 + ], + [ + 104, + 329, + 1 + ], + [ + 163, + 1037, + 1 + ], + [ + 1029, + 306, + 6 + ], + [ + 221, + 221, + 4 + ], + [ + 258, + 258, + 2 + ], + [ + 339, + 157, + 2 + ], + [ + 1035, + 1187, + 2 + ], + [ + 1040, + 181, + 4 + ], + [ + 1063, + 151, + 3 + ], + [ + 1156, + 165, + 4 + ], + [ + 148, + 222, + 5 + ], + [ + 217, + 303, + 2 + ], + [ + 286, + 286, + 4 + ], + [ + 459, + 459, + 3 + ], + [ + 146, + 223, + 3 + ], + [ + 179, + 369, + 2 + ], + [ + 275, + 220, + 2 + ], + [ + 1031, + 269, + 2 + ], + [ + 148, + 222, + 3 + ], + [ + 173, + 173, + 6 + ], + [ + 243, + 243, + 6 + ], + [ + 254, + 132, + 2 + ], + [ + 298, + 152, + 1 + ], + [ + 1134, + 168, + 4 + ], + [ + 214, + 214, + 7 + ], + [ + 712, + 712, + 2 + ], + [ + 132, + 344, + 2 + ], + [ + 398, + 156, + 1 + ], + [ + 1066, + 148, + 4 + ], + [ + 1113, + 166, + 3 + ], + [ + 274, + 274, + 3 + ], + [ + 315, + 315, + 3 + ], + [ + 1026, + 1247, + 1 + ], + [ + 226, + 144, + 1 + ], + [ + 235, + 189, + 2 + ], + [ + 282, + 282, + 3 + ], + [ + 1027, + 292, + 4 + ], + [ + 1052, + 138, + 4 + ], + [ + 1066, + 1056, + 1 + ], + [ + 170, + 1077, + 1 + ], + [ + 218, + 218, + 2 + ], + [ + 1259, + 156, + 1 + ], + [ + 376, + 163, + 1 + ], + [ + 1024, + 296, + 4 + ], + [ + 1035, + 1161, + 2 + ], + [ + 299, + 156, + 1 + ], + [ + 1088, + 240, + 2 + ], + [ + 1152, + 166, + 4 + ], + [ + 285, + 285, + 3 + ], + [ + 1037, + 245, + 5 + ], + [ + 1041, + 189, + 4 + ], + [ + 1207, + 172, + 6 + ], + [ + 133, + 255, + 1 + ], + [ + 147, + 1054, + 2 + ], + [ + 257, + 296, + 2 + ], + [ + 1106, + 156, + 2 + ], + [ + 1257, + 158, + 1 + ], + [ + 136, + 215, + 3 + ], + [ + 224, + 151, + 2 + ], + [ + 1105, + 170, + 2 + ], + [ + 1134, + 165, + 4 + ], + [ + 228, + 1062, + 2 + ], + [ + 103, + 145, + 1 + ], + [ + 147, + 1051, + 2 + ], + [ + 1031, + 280, + 2 + ], + [ + 1058, + 146, + 4 + ], + [ + 1257, + 163, + 1 + ], + [ + 138, + 249, + 3 + ], + [ + 242, + 170, + 1 + ], + [ + 1026, + 1115, + 1 + ], + [ + 1207, + 168, + 6 + ], + [ + 1038, + 245, + 2 + ], + [ + 132, + 254, + 1 + ], + [ + 1206, + 165, + 1 + ], + [ + 136, + 189, + 2 + ], + [ + 228, + 103, + 2 + ], + [ + 1060, + 1048, + 1 + ], + [ + 150, + 226, + 2 + ], + [ + 152, + 1086, + 1 + ], + [ + 211, + 211, + 2 + ], + [ + 144, + 151, + 1 + ], + [ + 301, + 166, + 1 + ], + [ + 331, + 331, + 3 + ], + [ + 420, + 156, + 1 + ], + [ + 1034, + 249, + 2 + ], + [ + 446, + 222, + 2 + ], + [ + 1032, + 327, + 3 + ], + [ + 110, + 155, + 2 + ], + [ + 1029, + 309, + 6 + ], + [ + 283, + 166, + 1 + ], + [ + 425, + 158, + 1 + ], + [ + 1031, + 278, + 2 + ], + [ + 1031, + 289, + 2 + ], + [ + 314, + 157, + 2 + ], + [ + 1034, + 1079, + 1 + ], + [ + 1035, + 176, + 4 + ], + [ + 224, + 103, + 2 + ], + [ + 248, + 149, + 5 + ], + [ + 293, + 293, + 4 + ], + [ + 159, + 313, + 2 + ] + ] +} diff --git a/variants/extended-1st-10mm-4k/profiles/eef/primitives.npz b/variants/extended-1st-10mm-4k/profiles/eef/primitives.npz index 66719fba16ebeb8e9f7e6e3f808d41541553b163..8026380a50507523f798198eee1451587ad14c9c 100644 --- a/variants/extended-1st-10mm-4k/profiles/eef/primitives.npz +++ b/variants/extended-1st-10mm-4k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf +oid sha256:ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9 size 2510 diff --git a/variants/extended-1st-10mm-4k/profiles/joint/bpe.json b/variants/extended-1st-10mm-4k/profiles/joint/bpe.json index 1a23799ca3a81164a80ce1cf1aab2b2b8572baf2..74dbec1613eace477e61c090c0537e61fb67b86e 100644 --- a/variants/extended-1st-10mm-4k/profiles/joint/bpe.json +++ b/variants/extended-1st-10mm-4k/profiles/joint/bpe.json @@ -1 +1,18730 @@ -{"spatial_merges": [[152, 164], [133, 183], [22, 105], [67, 184], [185, 186], [181, 187], [175, 182], [187, 189], [181, 184], [181, 183], [175, 188], [181, 186], [21, 105], [67, 185], [133, 181], [23, 105], [22, 104], [22, 106], [68, 185], [182, 187], [134, 192], [132, 192], [66, 191], [153, 164], [151, 164], [152, 165], [152, 163], [182, 184], [183, 189], [68, 191], [186, 189], [191, 201], [175, 194], [66, 185], [185, 205], [182, 183], [184, 189], [67, 175], [134, 181], [175, 196], [132, 181], [133, 189], [21, 104], [21, 106], [23, 104], [134, 211], [197, 207], [197, 206], [23, 106], [65, 191], [133, 182], [197, 208], [197, 209], [132, 211], [69, 191], [182, 186], [22, 107], [67, 195], [132, 218], [22, 103], [24, 105], [20, 105], [67, 198], [194, 200], [194, 195], [194, 198], [201, 210], [67, 200], [195, 213], [134, 218], [68, 195], [194, 199], [68, 199], [198, 213], [67, 199], [68, 198], [199, 212], [195, 215], [66, 198], [200, 205], [196, 224], [135, 192], [196, 204], [131, 192], [196, 203], [66, 200], [196, 228], [175, 203], [66, 195], [216, 219], [201, 219], [203, 220], [198, 215], [68, 200], [175, 214], [175, 204], [66, 199], [203, 222], [204, 222], [204, 220], [64, 191], [175, 217], [65, 185], [153, 163], [151, 165], [69, 185], [210, 216], [131, 181], [175, 212], [135, 181], [132, 182], [199, 215], [196, 236], [200, 215], [151, 163], [175, 205], [206, 221], [24, 104], [207, 223], [153, 165], [134, 189], [207, 221], [70, 191], [134, 182], [206, 223], [20, 106], [20, 104], [24, 106], [132, 189], [199, 213], [209, 221], [200, 213], [21, 103], [206, 233], [207, 233], [208, 223], [22, 108], [208, 221], [23, 103], [185, 232], [21, 107], [209, 223], [201, 204], [22, 102], [198, 212], [195, 212], [200, 232], [23, 107], [25, 105], [228, 240], [69, 199], [195, 205], [67, 204], [19, 105], [65, 203], [198, 205], [199, 237], [208, 233], [206, 224], [209, 233], [195, 274], [207, 224], [196, 230], [67, 203], [204, 250], [200, 212], [199, 238], [196, 229], [208, 224], [210, 255], [209, 224], [195, 238], [68, 226], [66, 227], [185, 237], [198, 238], [203, 216], [198, 282], [68, 225], [199, 205], [65, 200], [68, 227], [196, 234], [196, 235], [196, 241], [66, 204], [203, 257], [236, 245], [69, 203], [195, 220], [64, 203], [68, 231], [201, 203], [200, 238], [67, 226], [63, 191], [206, 263], [67, 227], [67, 243], [65, 204], [66, 225], [67, 225], [198, 220], [69, 204], [67, 231], [207, 263], [197, 286], [69, 210], [197, 287], [71, 191], [66, 231], [67, 244], [66, 226], [212, 225], [196, 252], [24, 103], [131, 218], [175, 201], [208, 263], [212, 227], [222, 229], [205, 226], [204, 216], [66, 243], [68, 203], [130, 181], [222, 230], [22, 109], [197, 297], [201, 241], [20, 103], [209, 263], [197, 302], [64, 185], [205, 231], [25, 104], [25, 106], [136, 181], [194, 226], [20, 107], [194, 225], [194, 231], [175, 216], [174, 202], [131, 182], [136, 192], [65, 199], [19, 104], [176, 202], [70, 185], [24, 107], [68, 244], [176, 188], [210, 268], [67, 239], [130, 192], [194, 227], [19, 106], [174, 188], [68, 243], [195, 291], [21, 102], [201, 270], [21, 108], [222, 235], [203, 285], [219, 261], [199, 220], [135, 218], [135, 182], [219, 253], [26, 105], [200, 220], [201, 228], [23, 102], [222, 234], [203, 255], [216, 278], [66, 244], [215, 225], [207, 293], [65, 198], [23, 108], [22, 101], [209, 303], [215, 226], [210, 253], [69, 195], [206, 293], [69, 200], [206, 303], [200, 291], [70, 203], [194, 243], [216, 236], [18, 105], [219, 258], [131, 211], [70, 204], [199, 298], [69, 198], [195, 298], [194, 244], [206, 306], [232, 239], [175, 230], [208, 311], [204, 268], [219, 271], [207, 306], [206, 290], [175, 229], [210, 258], [207, 311], [66, 239], [209, 292], [198, 298], [208, 290], [207, 303], [65, 210], [207, 292], [64, 204], [207, 290], [150, 164], [204, 245], [70, 210], [154, 164], [199, 305], [204, 276], [206, 292], [203, 240], [226, 232], [203, 279], [204, 288], [228, 253], [209, 311], [208, 292], [215, 231], [215, 227], [198, 291], [213, 227], [66, 203], [213, 226], [63, 203], [206, 311], [225, 237], [208, 303], [65, 195], [209, 293], [208, 293], [175, 234], [195, 232], [200, 283], [231, 232], [227, 237], [209, 290], [196, 316], [253, 270], [236, 261], [201, 230], [68, 242], [209, 306], [196, 317], [174, 252], [198, 232], [67, 242], [204, 240], [237, 242], [64, 210], [213, 231], [205, 239], [208, 306], [201, 278], [175, 235], [176, 252], [201, 229], [176, 241], [213, 225], [25, 103], [219, 279], [199, 232], [216, 228], [216, 270], [261, 278], [219, 276], [200, 237], [62, 191], [72, 191], [210, 288], [199, 282], [203, 245], [204, 258], [174, 241], [185, 283], [210, 333], [239, 335], [63, 185], [66, 300], [200, 274], [25, 107], [216, 229], [19, 107], [20, 108], [24, 102], [195, 237], [19, 103], [64, 199], [223, 287], [210, 276], [71, 204], [65, 239], [223, 286], [216, 230], [20, 102], [22, 110], [212, 242], [68, 308], [221, 286], [66, 242], [198, 237], [175, 266], [68, 239], [64, 200], [67, 300], [175, 259], [69, 242], [135, 211], [221, 297], [67, 331], [204, 253], [26, 106], [201, 234], [69, 225], [200, 282], [210, 261], [201, 236], [70, 199], [131, 189], [67, 319], [205, 243], [201, 235], [210, 279], [69, 227], [270, 271], [210, 285], [205, 244], [221, 302], [199, 274], [210, 271], [67, 310], [221, 287], [27, 105], [129, 181], [26, 104], [21, 109], [195, 282], [175, 262], [228, 271], [240, 351], [68, 310], [220, 226], [203, 271], [24, 108], [239, 283], [18, 104], [216, 235], [67, 308], [212, 226], [196, 340], [236, 258], [196, 342], [212, 231], [216, 234], [67, 309], [220, 225], [223, 297], [18, 106], [137, 181], [69, 226], [71, 203], [66, 310], [205, 225], [65, 227], [223, 302], [21, 101], [17, 105], [68, 300], [245, 353], [242, 305], [228, 257], [226, 291], [220, 227], [203, 288], [258, 278], [203, 250], [204, 255], [130, 182], [23, 109], [229, 450], [228, 250], [65, 231], [239, 368], [67, 336], [205, 227], [64, 264], [68, 309], [66, 309], [201, 252], [65, 242], [194, 239], [226, 274], [65, 226], [71, 210], [216, 252], [185, 373], [242, 407], [203, 261], [175, 264], [204, 285], [152, 166], [230, 455], [225, 274], [228, 245], [200, 337], [204, 257], [220, 231], [230, 240], [210, 363], [225, 346], [212, 243], [69, 231], [210, 361], [241, 250], [70, 200], [203, 268], [203, 333], [175, 299], [66, 308], [229, 245], [136, 182], [23, 101], [65, 243], [175, 301], [212, 244], [233, 297], [229, 240], [63, 199], [196, 299], [231, 335], [152, 162], [230, 245], [198, 274], [233, 302], [233, 286], [22, 100], [252, 257], [227, 282], [196, 304], [266, 437], [69, 244], [203, 253], [230, 250], [129, 192], [176, 246], [66, 331], [225, 298], [233, 287], [219, 268], [234, 372], [174, 254], [231, 282], [219, 255], [174, 316], [185, 305], [69, 243], [176, 317], [235, 240], [137, 192], [228, 377], [234, 245], [175, 313], [65, 225], [66, 319], [205, 310], [242, 346], [219, 356], [236, 257], [210, 364], [228, 384], [62, 203], [204, 333], [196, 301], [73, 191], [199, 337], [196, 307], [242, 371], [236, 250], [70, 242], [175, 318], [68, 331], [227, 298], [227, 238], [220, 244], [63, 204], [229, 257], [25, 102], [225, 238], [227, 346], [250, 266], [135, 189], [205, 308], [130, 218], [240, 341], [69, 239], [71, 185], [226, 335], [244, 274], [226, 238], [196, 320], [195, 337], [196, 313], [70, 195], [72, 204], [232, 323], [63, 264], [175, 304], [64, 235], [68, 336], [229, 250], [175, 307], [194, 242], [204, 363], [216, 241], [241, 288], [19, 108], [174, 214], [154, 163], [26, 103], [245, 344], [236, 381], [70, 198], [65, 235], [64, 229], [230, 372], [136, 218], [232, 330], [203, 258], [201, 341], [176, 217], [64, 230], [150, 165], [236, 380], [270, 276], [150, 163], [270, 355], [198, 337], [196, 318], [212, 300], [224, 286], [239, 382], [62, 185], [231, 238], [236, 387], [235, 385], [237, 321], [215, 244], [194, 309], [154, 165], [204, 261], [194, 310], [196, 324], [19, 102], [68, 204], [26, 107], [250, 341], [174, 247], [237, 315], [216, 344], [194, 300], [219, 355], [194, 331], [235, 250], [203, 361], [207, 427], [174, 249], [278, 279], [236, 240], [65, 234], [230, 257], [65, 266], [212, 309], [174, 354], [228, 394], [245, 341], [224, 287], [196, 467], [230, 400], [201, 316], [64, 234], [220, 243], [65, 229], [20, 109], [206, 427], [213, 243], [208, 408], [240, 344], [61, 191], [28, 105], [257, 344], [18, 103], [175, 320], [231, 291], [66, 336], [18, 107], [196, 264], [63, 210], [229, 372], [234, 240], [235, 245], [206, 408], [25, 108], [209, 420], [67, 229], [222, 313], [176, 289], [27, 106], [234, 250], [234, 257], [67, 234], [65, 230], [201, 317], [198, 386], [176, 358], [66, 323], [252, 255], [175, 324], [66, 330], [69, 234], [216, 351], [194, 308], [197, 509], [194, 336], [229, 255], [176, 210], [224, 302], [69, 230], [67, 230], [64, 242], [20, 101], [68, 321], [235, 257], [224, 297], [230, 268], [229, 425], [278, 356], [226, 283], [197, 506], [203, 276], [68, 315], [22, 111], [229, 385], [222, 318], [176, 247], [69, 229], [70, 230], [203, 364], [70, 229], [176, 354], [71, 199], [286, 290], [67, 264], [16, 105], [207, 420], [66, 321], [230, 255], [174, 358], [225, 305], [205, 323], [199, 392], [219, 374], [242, 392], [207, 452], [229, 268], [200, 373], [64, 198], [204, 432], [176, 342], [208, 420], [67, 410], [27, 104], [241, 276], [207, 408], [200, 386], [204, 279], [195, 386], [235, 400], [209, 408], [204, 271], [65, 264], [222, 301], [176, 248], [205, 330], [208, 427], [234, 255], [287, 290], [206, 452], [174, 340], [201, 353], [69, 264], [196, 489], [232, 310], [231, 283], [203, 383], [17, 104], [199, 283], [209, 427], [231, 368], [196, 473], [236, 356], [24, 101], [72, 210], [63, 200], [174, 317], [227, 305], [72, 203], [67, 235], [64, 195], [66, 315], [70, 239], [210, 395], [212, 315], [232, 308], [21, 110], [226, 368], [206, 420], [235, 255], [212, 321], [228, 355], [176, 316], [232, 243], [232, 244]], "temporal_merges": [[188, 188, 2], [190, 190, 2], [193, 193, 2], [1024, 1024, 4], [1025, 1025, 4], [202, 202, 2], [1026, 1026, 4], [1029, 1029, 4], [1027, 1027, 1], [1024, 188, 4], [1028, 1028, 1], [1025, 190, 4], [214, 214, 2], [1030, 1030, 1], [1026, 193, 4], [217, 217, 2], [188, 188, 4], [190, 190, 4], [193, 193, 4], [1031, 1031, 1], [188, 214, 2], [1029, 202, 4], [188, 217, 2], [174, 174, 3], [176, 176, 3], [249, 249, 2], [1024, 214, 4], [1024, 217, 4], [190, 1025, 4], [214, 188, 2], [188, 246, 2], [248, 248, 2], [247, 247, 2], [262, 262, 2], [259, 259, 2], [249, 202, 2], [193, 1026, 4], [190, 251, 2], [190, 256, 2], [188, 254, 2], [266, 266, 2], [1033, 217, 6], [1024, 246, 4], [188, 247, 2], [264, 264, 2], [188, 248, 2], [241, 241, 2], [193, 193, 6], [188, 265, 2], [214, 214, 3], [252, 252, 2], [1025, 190, 6], [289, 289, 2], [67, 67, 1], [174, 174, 4], [1024, 254, 4], [188, 267, 2], [176, 176, 4], [246, 246, 2], [260, 260, 3], [190, 269, 2], [66, 66, 1], [1025, 251, 4], [1024, 247, 4], [1026, 193, 6], [1025, 256, 4], [1024, 248, 4], [190, 272, 2], [190, 273, 2], [326, 326, 1], [1039, 217, 4], [1033, 214, 6], [251, 251, 2], [1024, 265, 4], [202, 202, 4], [230, 230, 2], [68, 68, 1], [1035, 256, 6], [229, 229, 2], [71, 71, 1], [190, 295, 2], [242, 242, 2], [65, 65, 1], [254, 254, 2], [1035, 251, 6], [256, 256, 2], [1036, 214, 4], [70, 70, 1], [202, 249, 2], [267, 267, 2], [193, 275, 2], [1033, 246, 6], [64, 64, 1], [262, 217, 2], [281, 281, 3], [329, 329, 2], [235, 235, 3], [62, 62, 1], [193, 277, 2], [319, 319, 1], [63, 63, 1], [234, 234, 3], [1024, 267, 4], [193, 280, 2], [193, 260, 2], [1025, 272, 4], [1025, 273, 4], [190, 312, 2], [1025, 269, 4], [193, 284, 2], [214, 214, 4], [190, 314, 2], [69, 69, 1], [1027, 1033, 3], [322, 322, 2], [73, 73, 1], [339, 339, 2], [239, 239, 2], [277, 277, 3], [265, 265, 2], [193, 294, 2], [217, 217, 3], [1025, 295, 4], [196, 196, 2], [72, 72, 1], [193, 296, 2], [275, 275, 3], [193, 281, 2], [1027, 1033, 1], [202, 289, 2], [283, 283, 2], [210, 210, 2], [315, 315, 2], [249, 1029, 2], [175, 175, 2], [1035, 273, 6], [1035, 272, 6], [280, 280, 3], [352, 352, 2], [61, 61, 1], [259, 259, 3], [1035, 269, 6], [325, 325, 2], [332, 332, 2], [1026, 275, 4], [1025, 312, 4], [260, 260, 2], [188, 1039, 2], [284, 284, 3], [1025, 314, 4], [321, 321, 2], [323, 323, 2], [251, 251, 3], [285, 285, 2], [304, 304, 2], [1035, 295, 6], [188, 345, 2], [1033, 254, 6], [237, 237, 2], [307, 307, 2], [1033, 247, 6], [188, 350, 2], [1033, 248, 6], [1026, 277, 4], [1026, 260, 4], [272, 272, 2], [299, 299, 2], [378, 378, 2], [236, 236, 2], [288, 288, 2], [269, 269, 2], [347, 347, 2], [301, 301, 2], [273, 273, 2], [66, 67, 1], [330, 330, 2], [1026, 281, 4], [230, 230, 3], [1040, 217, 2], [1026, 284, 4], [334, 334, 2], [1026, 280, 4], [343, 343, 2], [327, 327, 2], [259, 214, 2], [216, 216, 2], [229, 229, 3], [309, 309, 2], [305, 305, 2], [270, 270, 2], [201, 201, 2], [1030, 1038, 3], [1040, 214, 2], [256, 256, 3], [1030, 1038, 1], [1035, 312, 6], [1029, 289, 4], [225, 225, 2], [328, 328, 2], [235, 235, 2], [200, 200, 2], [244, 244, 2], [1035, 314, 6], [188, 365, 2], [338, 338, 2], [174, 174, 5], [188, 1036, 2], [300, 300, 2], [234, 234, 2], [188, 366, 2], [1026, 294, 4], [247, 247, 3], [248, 248, 3], [1026, 296, 4], [176, 176, 5], [1027, 1024, 5], [232, 232, 2], [258, 258, 2], [266, 266, 1], [1033, 265, 6], [64, 65, 1], [262, 262, 3], [253, 253, 2], [246, 246, 3], [360, 360, 2], [199, 199, 2], [243, 243, 2], [68, 69, 1], [1038, 1030, 1], [202, 349, 2], [195, 195, 2], [294, 294, 2], [399, 399, 2], [296, 296, 2], [281, 281, 2], [188, 188, 1], [428, 428, 2], [357, 357, 2], [174, 174, 2], [269, 190, 2], [62, 63, 1], [1027, 1024, 3], [176, 176, 2], [398, 398, 2], [277, 277, 4], [245, 245, 2], [326, 326, 2], [275, 275, 2], [227, 227, 2], [254, 254, 3], [1029, 249, 4], [70, 71, 1], [261, 261, 2], [264, 264, 1], [251, 251, 4], [278, 278, 2], [228, 228, 2], [205, 205, 2], [74, 74, 1], [280, 280, 2], [240, 240, 2], [317, 317, 2], [313, 313, 2], [217, 188, 2], [1033, 267, 6], [241, 241, 3], [410, 410, 1], [316, 316, 2], [1040, 246, 2], [320, 320, 2], [308, 308, 2], [359, 359, 2], [1041, 256, 2], [249, 352, 2], [413, 413, 2], [348, 348, 2], [390, 390, 2], [251, 190, 2], [217, 322, 2], [438, 438, 2], [226, 226, 2], [1036, 1036, 4], [1024, 345, 4], [370, 370, 2], [454, 454, 1], [279, 279, 2], [60, 60, 1], [1024, 350, 4], [466, 466, 1], [419, 419, 2], [273, 190, 2], [1041, 269, 2], [257, 257, 2], [260, 260, 4], [202, 367, 2], [418, 418, 2], [65, 66, 1], [272, 190, 2], [284, 284, 4], [242, 242, 1], [451, 451, 2], [72, 71, 1], [256, 190, 2], [202, 354, 2], [204, 204, 2], [406, 406, 2], [198, 198, 2], [430, 430, 2], [369, 369, 2], [271, 271, 2], [202, 358, 2], [268, 268, 2], [1049, 249, 4], [331, 331, 1], [422, 422, 2], [252, 252, 3], [246, 188, 2], [480, 480, 2], [193, 193, 1], [319, 319, 2], [202, 376, 2], [214, 214, 1], [1040, 247, 2], [1041, 272, 2], [444, 444, 2], [433, 433, 2], [1041, 273, 2], [174, 174, 6], [324, 324, 2], [440, 440, 2], [1045, 289, 6], [318, 318, 2], [1040, 248, 2], [217, 262, 2], [1027, 214, 3], [336, 336, 1], [1024, 365, 4], [185, 185, 2], [310, 310, 2], [1024, 366, 4], [219, 219, 2], [436, 436, 2], [1027, 214, 1], [67, 68, 1], [234, 234, 4], [231, 231, 2], [235, 235, 4], [1038, 275, 6], [176, 176, 6], [276, 276, 2], [1040, 254, 2], [247, 188, 2], [1024, 1039, 4], [248, 188, 2], [1047, 1047, 2], [1041, 251, 2], [266, 266, 3], [254, 188, 2], [478, 478, 1], [265, 265, 3], [181, 181, 1], [412, 412, 2], [371, 371, 2], [362, 362, 2], [446, 446, 2], [230, 230, 4], [70, 69, 1], [250, 250, 2], [448, 448, 2], [62, 61, 1], [262, 329, 2], [1028, 256, 3], [1029, 349, 4], [332, 332, 3], [229, 229, 4], [396, 396, 2], [64, 63, 1], [217, 217, 4], [190, 379, 2], [286, 286, 2], [1028, 256, 1], [269, 269, 3], [416, 416, 2], [260, 193, 2], [1048, 1048, 2], [294, 193, 2], [241, 241, 1], [267, 267, 3], [194, 194, 2], [402, 402, 2], [325, 214, 2], [457, 457, 2], [264, 264, 3], [239, 239, 1], [296, 193, 2], [404, 404, 2], [280, 193, 2], [255, 255, 2], [287, 287, 2], [295, 295, 2], [1028, 251, 3], [272, 272, 3], [340, 340, 2], [1039, 1039, 4], [220, 220, 2], [354, 354, 2], [442, 442, 2], [190, 388, 2], [1027, 214, 5], [304, 304, 3], [1028, 256, 5], [1038, 277, 6], [1038, 281, 6], [434, 434, 2], [417, 417, 2], [273, 273, 3], [297, 297, 2], [342, 342, 2], [299, 299, 3], [182, 182, 1], [1041, 295, 2], [214, 259, 2], [315, 315, 1], [1045, 249, 6], [382, 382, 2], [1025, 379, 4], [72, 73, 1], [1028, 251, 1], [1028, 251, 5], [307, 307, 3], [1027, 217, 5], [381, 381, 2], [1027, 217, 3], [358, 358, 2], [374, 374, 2], [1038, 284, 6], [109, 109, 1], [1040, 265, 2], [210, 210, 1], [283, 283, 1], [275, 275, 4], [277, 277, 2], [1056, 247, 4], [323, 323, 1], [252, 252, 1], [1038, 260, 6], [375, 375, 2], [465, 465, 2], [1055, 248, 4], [301, 301, 3], [1042, 280, 2], [294, 294, 3], [343, 343, 3], [392, 392, 2], [1025, 388, 4], [202, 397, 2], [174, 174, 7], [296, 296, 3], [1076, 289, 4], [1040, 267, 2], [302, 302, 2], [373, 373, 2], [265, 188, 2], [328, 214, 2], [212, 212, 2], [432, 432, 2], [281, 281, 4], [327, 327, 3], [190, 401, 2], [202, 1059, 2], [1041, 312, 2], [259, 254, 2], [267, 188, 2], [510, 510, 2], [201, 201, 3], [176, 176, 7], [217, 217, 1], [352, 249, 2], [262, 246, 2], [17, 17, 1], [321, 321, 1], [253, 253, 3], [1027, 217, 1], [66, 66, 2], [1038, 280, 6], [208, 208, 2], [1041, 314, 2], [347, 246, 2], [1033, 1027, 1], [106, 106, 1], [259, 1036, 2], [236, 236, 3], [237, 237, 1], [259, 339, 2], [256, 256, 4], [275, 193, 2], [314, 190, 2], [258, 258, 3], [322, 329, 2], [349, 349, 2], [214, 1024, 2], [292, 292, 2], [1029, 367, 4], [277, 193, 2], [295, 190, 2], [100, 100, 1], [393, 393, 2], [232, 205, 2], [330, 330, 1], [312, 190, 2], [383, 383, 2], [175, 175, 3], [313, 313, 3], [244, 244, 1], [284, 193, 2], [1029, 376, 4], [508, 508, 2], [325, 325, 3], [1044, 1027, 1], [216, 216, 3], [334, 334, 3], [1028, 1035, 1], [202, 1049, 2], [70, 70, 2], [337, 337, 2], [1027, 1044, 3], [67, 67, 2], [68, 68, 2], [1025, 401, 4], [389, 389, 2], [1028, 1035, 3], [391, 391, 2], [305, 305, 1], [357, 214, 2], [209, 209, 2], [320, 320, 3], [394, 394, 2], [476, 476, 2], [1042, 260, 2], [203, 203, 2], [328, 328, 3], [60, 61, 1], [429, 429, 2], [461, 461, 2], [487, 487, 2], [1029, 354, 4], [284, 284, 2], [360, 360, 3], [475, 475, 2], [338, 338, 3], [285, 285, 1], [367, 367, 2], [327, 214, 2], [348, 214, 2], [1038, 296, 6], [502, 502, 2], [270, 270, 3], [281, 193, 2], [355, 355, 2], [1038, 294, 6], [411, 411, 2], [74, 73, 1], [22, 22, 1], [234, 234, 5], [1042, 275, 2], [1027, 1044, 1], [1029, 358, 4], [243, 243, 1], [261, 261, 3], [75, 75, 1], [485, 485, 2], [1047, 174, 6], [346, 346, 2], [356, 356, 2], [322, 217, 2], [481, 481, 2], [65, 65, 2], [269, 269, 4], [551, 551, 2], [378, 378, 1], [188, 188, 3], [248, 248, 4], [1025, 414, 4], [272, 272, 4], [247, 247, 4], [235, 235, 5], [1042, 294, 2], [240, 240, 3], [1027, 246, 3], [1042, 277, 2], [1024, 1036, 4], [359, 217, 2], [190, 414, 2], [105, 105, 1], [1042, 296, 2], [102, 102, 1], [1027, 246, 5], [339, 339, 3], [309, 309, 1], [1059, 249, 4], [228, 228, 3], [464, 464, 2], [415, 415, 2], [364, 364, 2], [506, 506, 2], [1077, 1077, 2], [329, 329, 3], [273, 273, 4], [108, 108, 1], [597, 597, 1], [1050, 1027, 1], [1048, 176, 6], [335, 335, 2], [197, 197, 2], [245, 245, 3], [324, 324, 3], [318, 318, 3], [1093, 326, 2], [1027, 1050, 1], [69, 69, 2], [280, 280, 4], [333, 333, 2], [200, 200, 1], [28, 28, 1], [188, 262, 2], [1042, 284, 2], [110, 110, 1], [1035, 1028, 1], [249, 249, 4], [1027, 1051, 3], [300, 300, 1], [251, 251, 5], [260, 260, 5], [363, 363, 2], [225, 225, 1], [368, 368, 2], [1103, 71, 2], [1031, 1045, 1], [230, 230, 5], [190, 426, 2], [1057, 262, 4], [1027, 1051, 1], [509, 509, 2], [398, 398, 1], [1030, 1026, 5], [288, 288, 3], [452, 452, 2], [361, 361, 2], [202, 202, 1], [63, 64, 1], [278, 278, 3], [229, 229, 5], [190, 431, 2], [463, 463, 2], [370, 370, 3], [1028, 273, 3], [1025, 426, 4], [65, 1085, 1], [395, 395, 2], [1033, 345, 6], [1028, 273, 1], [334, 217, 2], [1024, 1024, 1], [271, 271, 3], [1033, 350, 6], [1049, 1049, 4], [1029, 397, 4], [317, 317, 3], [353, 353, 3], [59, 59, 1], [1028, 273, 5], [1058, 259, 4], [1024, 188, 1], [1042, 281, 2], [493, 493, 2], [316, 316, 3], [498, 498, 2], [232, 232, 1], [196, 196, 3], [1027, 246, 1], [1025, 431, 4], [1031, 1045, 3], [470, 470, 2], [103, 103, 1], [436, 289, 2], [561, 561, 1], [312, 312, 2], [471, 471, 2], [422, 422, 1], [459, 459, 2], [332, 332, 4], [238, 238, 2], [1028, 272, 5], [18, 18, 1], [27, 27, 1], [1028, 272, 1], [195, 195, 1], [445, 445, 2], [101, 101, 1], [338, 217, 2], [503, 503, 2], [380, 380, 2], [107, 107, 1], [279, 279, 3], [1027, 1046, 3], [1028, 269, 1], [336, 336, 2], [331, 331, 2], [351, 351, 3], [483, 483, 2], [269, 251, 1], [413, 413, 1], [635, 635, 1], [486, 486, 2], [256, 256, 5], [516, 516, 2], [1139, 73, 2], [295, 295, 3], [526, 526, 2], [1028, 269, 5], [569, 569, 2], [319, 410, 1], [266, 438, 2], [570, 570, 2], [199, 199, 1], [437, 437, 2], [314, 314, 2], [64, 1106, 1], [504, 504, 2], [1027, 1050, 3], [1028, 272, 3], [1027, 188, 5], [246, 217, 2], [1026, 409, 4], [327, 248, 2], [193, 403, 2], [276, 276, 3], [535, 535, 2], [26, 26, 1], [214, 1044, 2], [23, 23, 1], [328, 247, 2], [500, 500, 2], [322, 322, 3], [377, 377, 2], [193, 409, 2], [405, 405, 2], [242, 242, 3], [433, 433, 1], [194, 212, 2], [241, 241, 4], [1028, 269, 3], [492, 492, 2], [505, 505, 2], [1026, 403, 4], [254, 259, 2], [262, 1039, 2], [285, 285, 3], [16, 16, 1], [1036, 188, 4], [407, 407, 2], [210, 210, 3], [219, 219, 3], [308, 308, 1], [69, 70, 1], [251, 269, 1], [349, 202, 2], [362, 217, 2], [191, 191, 2], [634, 634, 1], [227, 227, 1], [347, 265, 2], [387, 387, 2], [294, 294, 4], [480, 620, 2], [1077, 67, 2], [71, 71, 2], [226, 226, 1], [1027, 1065, 1], [293, 293, 2], [268, 268, 3], [216, 216, 1], [497, 497, 2], [1027, 1046, 5], [466, 326, 1], [609, 609, 2], [418, 418, 1], [375, 214, 2], [128, 128, 1], [660, 660, 1], [341, 341, 3], [514, 514, 2], [260, 280, 1], [384, 384, 2], [222, 222, 2], [621, 621, 1], [1033, 366, 6], [1033, 365, 6], [64, 64, 2], [419, 419, 1], [296, 296, 4], [1030, 275, 3], [299, 299, 4], [264, 428, 2], [376, 376, 2], [24, 24, 1], [1030, 275, 1], [1027, 247, 1], [528, 528, 2], [1074, 252, 4], [1035, 379, 6], [519, 519, 2], [325, 265, 2], [1030, 275, 5], [202, 1076, 2], [340, 340, 3], [1027, 248, 1], [446, 446, 1], [512, 512, 2], [586, 586, 1], [104, 104, 1], [19, 19, 1], [304, 304, 4], [254, 214, 2], [423, 423, 2], [339, 259, 2], [198, 198, 1], [472, 472, 2], [359, 359, 3], [66, 67, 2], [307, 307, 4], [196, 196, 1], [1064, 266, 4], [288, 288, 1], [62, 1124, 1], [390, 390, 1], [424, 424, 2], [1065, 1027, 1], [585, 585, 1], [306, 306, 2], [280, 260, 1], [584, 584, 1], [582, 582, 1], [412, 249, 2], [310, 310, 1], [255, 255, 3], [444, 444, 1], [430, 430, 1], [603, 603, 2], [1030, 280, 1], [193, 447, 2], [315, 315, 3], [1070, 241, 4], [1040, 345, 2], [325, 1036, 2], [234, 234, 6], [1027, 1044, 5], [62, 1163, 1], [99, 99, 1], [357, 357, 3], [348, 348, 3], [416, 416, 1], [257, 257, 3], [201, 201, 4], [205, 205, 1], [343, 343, 4], [342, 342, 3], [536, 536, 2], [63, 63, 2], [1026, 447, 4], [138, 138, 1], [460, 460, 2], [537, 537, 2], [253, 253, 4], [1033, 1024, 1], [456, 456, 2], [369, 254, 2], [440, 440, 1], [1027, 247, 5], [1035, 388, 6], [477, 477, 2], [1027, 248, 5], [596, 596, 1], [421, 421, 2], [301, 301, 4], [588, 588, 1], [577, 577, 2], [188, 259, 2], [1040, 350, 2], [246, 262, 2], [399, 399, 1], [223, 223, 2], [1030, 260, 1], [1068, 264, 4], [289, 289, 3], [212, 237, 2], [235, 235, 6], [277, 277, 5], [469, 469, 2], [1045, 1031, 1], [344, 344, 3], [193, 435, 2], [1027, 1024, 1], [231, 231, 1], [439, 439, 2], [193, 174, 2], [193, 441, 2], [166, 166, 2], [322, 322, 1], [548, 548, 2], [443, 443, 2], [702, 702, 2], [1078, 174, 2], [1026, 441, 4], [214, 254, 2], [679, 679, 1], [1028, 256, 7], [668, 668, 1], [352, 352, 3], [449, 449, 2], [1100, 68, 2], [578, 578, 2], [1027, 247, 3], [258, 258, 4], [313, 313, 4], [1033, 1024, 3], [490, 490, 2], [162, 162, 2], [1026, 435, 4], [457, 457, 1], [1082, 246, 4], [1051, 1027, 1], [206, 206, 2], [579, 579, 1], [207, 207, 2], [193, 176, 2], [1027, 1046, 1], [1027, 248, 3], [215, 215, 2], [517, 517, 2], [321, 321, 3], [1030, 277, 1], [283, 232, 2], [1028, 312, 1], [252, 252, 4], [236, 236, 4], [1081, 176, 2], [250, 250, 3], [386, 386, 2], [338, 248, 2], [1085, 66, 2], [202, 539, 2], [201, 201, 1], [269, 251, 2], [334, 247, 2], [1119, 329, 4], [465, 465, 1], [225, 225, 3], [1028, 314, 1], [175, 175, 4], [221, 221, 2], [272, 272, 5], [538, 538, 2], [454, 454, 2], [190, 174, 2], [320, 320, 4], [204, 204, 1], [1030, 260, 5], [259, 259, 4], [360, 385, 2], [230, 230, 6], [347, 347, 3], [214, 327, 2], [1026, 458, 4], [281, 281, 5], [396, 396, 3], [1028, 295, 5], [214, 328, 2], [239, 239, 3], [1095, 1027, 1], [323, 323, 3], [613, 613, 1], [345, 188, 2], [267, 267, 4], [592, 592, 2], [229, 229, 6], [240, 332, 2], [1046, 1027, 1], [202, 545, 2], [1030, 284, 1], [68, 69, 2], [1028, 312, 5], [290, 290, 2], [541, 541, 2], [722, 722, 1], [21, 21, 1], [249, 349, 2], [309, 309, 3], [402, 402, 3], [1035, 401, 6], [251, 269, 2], [1033, 1033, 1], [348, 246, 2], [244, 244, 3], [1040, 366, 2], [261, 261, 4], [174, 1047, 2], [1027, 188, 3], [1098, 289, 2], [65, 66, 2], [129, 129, 1], [71, 70, 1], [410, 319, 1], [637, 637, 1], [392, 305, 2], [193, 458, 2], [275, 275, 5], [188, 217, 1], [273, 273, 5], [370, 245, 2], [1040, 1134, 2], [1028, 314, 5], [214, 325, 2], [176, 1048, 2], [1040, 365, 2], [495, 495, 2], [515, 515, 2], [1024, 262, 4], [249, 1045, 2], [74, 1139, 1], [283, 378, 2], [295, 256, 1], [438, 266, 2], [466, 737, 1], [214, 246, 2], [216, 216, 4], [218, 218, 2], [71, 72, 1], [249, 412, 2], [1123, 319, 2], [1030, 280, 5], [284, 284, 5], [580, 580, 2], [237, 237, 3], [1052, 251, 2], [190, 176, 2], [1024, 188, 3], [1028, 295, 1], [357, 1036, 2], [1057, 1057, 4], [205, 194, 2], [329, 262, 2], [406, 406, 3], [362, 254, 2], [1136, 69, 2], [645, 645, 1], [636, 636, 1], [74, 75, 1], [1028, 295, 3], [330, 330, 3], [1027, 1095, 1], [428, 428, 1], [300, 300, 3], [451, 451, 1], [369, 369, 3], [1028, 1089, 1], [462, 462, 2], [1033, 188, 3], [397, 397, 2], [1029, 1059, 4], [371, 371, 1], [550, 550, 2], [1030, 280, 3], [1028, 1101, 1], [1101, 1028, 1], [312, 312, 3], [266, 266, 4], [404, 404, 3], [270, 270, 4], [1035, 414, 6], [243, 243, 3], [242, 326, 1], [732, 732, 2], [453, 453, 2], [1028, 312, 3], [190, 332, 2], [214, 265, 2], [174, 176, 7], [217, 246, 2], [350, 188, 2], [228, 228, 4], [353, 353, 4], [234, 234, 7], [511, 511, 2], [190, 370, 2], [318, 318, 4], [324, 324, 4], [540, 540, 2], [1030, 277, 5], [217, 1046, 2], [374, 374, 3], [339, 339, 1], [60, 59, 1], [647, 647, 1], [68, 67, 1], [468, 468, 2], [1028, 314, 3], [382, 382, 1], [351, 351, 4], [264, 264, 4], [25, 25, 1], [294, 294, 5], [260, 280, 2], [327, 1036, 2], [354, 202, 2], [417, 417, 3], [1030, 284, 5], [1052, 269, 2], [1028, 1086, 1], [314, 314, 3], [227, 227, 3], [543, 543, 2], [1045, 349, 6], [137, 137, 1], [611, 611, 2], [530, 530, 2], [265, 246, 2], [1113, 267, 4], [214, 247, 2], [328, 1036, 2], [275, 281, 1], [389, 389, 3], [375, 375, 3], [1052, 256, 2], [1053, 254, 4], [329, 487, 2], [240, 240, 4], [391, 391, 3], [1108, 1028, 1], [29, 29, 1], [185, 185, 1], [1028, 1108, 1], [1027, 265, 1], [1027, 1066, 1], [478, 478, 2], [534, 534, 2], [257, 257, 1], [235, 235, 7], [1052, 273, 2], [438, 745, 2], [245, 245, 1], [282, 282, 2], [64, 65, 2], [659, 659, 1], [1105, 242, 1], [1100, 69, 2], [174, 1047, 4], [279, 279, 1], [667, 667, 1], [280, 260, 2], [296, 296, 5], [599, 599, 2], [214, 248, 2], [474, 474, 2], [1035, 426, 6], [20, 20, 1], [271, 271, 4], [1031, 1029, 5], [256, 295, 2], [1058, 1058, 4], [1056, 1056, 4], [358, 202, 2], [1030, 260, 3], [1041, 379, 2], [1163, 61, 2], [1099, 230, 4], [700, 700, 2], [479, 479, 2], [1111, 70, 2], [424, 248, 2], [281, 275, 1], [367, 202, 2], [429, 429, 1], [1052, 272, 2], [1027, 254, 1], [217, 334, 2], [1124, 63, 2], [695, 508, 2], [1055, 1055, 4], [383, 383, 3], [571, 571, 2], [188, 369, 2], [408, 408, 1], [151, 151, 2], [352, 1049, 2], [1102, 229, 4], [280, 1026, 2], [1035, 431, 6], [373, 373, 1], [1085, 67, 2], [251, 332, 2], [385, 385, 2], [524, 524, 2], [214, 348, 2], [432, 432, 1], [420, 420, 1], [322, 576, 2], [360, 360, 4], [72, 1103, 1], [760, 760, 1], [1024, 1024, 3], [226, 226, 3], [66, 1077, 1], [233, 233, 2], [217, 359, 2], [256, 295, 1], [1028, 1025, 5], [322, 285, 2], [308, 308, 3], [376, 202, 2], [775, 73, 1], [381, 381, 3], [278, 278, 4], [1107, 254, 4], [250, 250, 1], [411, 411, 3], [1093, 1093, 2], [289, 202, 2], [188, 362, 2], [566, 566, 2], [1027, 267, 1], [1098, 349, 2], [482, 482, 2], [1030, 277, 3], [1121, 63, 2], [553, 553, 2], [350, 350, 2], [345, 345, 2], [176, 1048, 4], [445, 445, 3], [304, 229, 3], [286, 286, 3], [237, 305, 2], [283, 283, 3], [217, 338, 2], [230, 299, 3], [393, 393, 3], [680, 680, 1], [295, 256, 2], [423, 247, 2], [476, 248, 2], [421, 247, 2], [240, 240, 1], [1027, 265, 5], [547, 547, 2], [415, 415, 3], [434, 434, 3], [1030, 281, 5], [1028, 1025, 1], [268, 268, 1], [193, 222, 2], [190, 190, 1], [410, 597, 1], [332, 251, 2], [484, 484, 2], [1041, 388, 2], [352, 349, 2], [436, 710, 2], [1027, 254, 5], [355, 355, 3], [1074, 1074, 4], [153, 153, 2], [287, 287, 3], [1029, 1076, 4], [230, 235, 1], [1039, 262, 4], [276, 276, 4], [1038, 409, 6], [378, 63, 1], [301, 229, 3], [364, 364, 3], [531, 531, 2], [1158, 175, 4], [620, 620, 2], [297, 297, 3], [260, 260, 6], [568, 568, 2], [266, 1064, 1], [253, 253, 1], [235, 230, 1], [76, 76, 1], [444, 315, 2], [291, 291, 2], [1147, 1147, 1], [316, 316, 4], [442, 442, 3], [1038, 403, 6], [258, 258, 1], [188, 334, 2], [269, 1025, 2], [1053, 246, 4], [1030, 284, 3], [341, 341, 4], [317, 317, 4], [217, 362, 2], [448, 448, 3], [1027, 1066, 3], [68, 1136, 1], [195, 195, 3], [1089, 1028, 1], [242, 1105, 1], [1029, 539, 4], [646, 646, 2], [294, 1026, 2], [245, 245, 4], [111, 111, 1], [194, 194, 1], [337, 337, 1], [192, 192, 1], [1064, 266, 1], [449, 449, 3], [622, 622, 2], [1041, 401, 2], [356, 356, 3], [1027, 254, 3], [241, 1070, 1], [1052, 295, 2], [299, 230, 3], [15, 15, 1], [1052, 312, 2], [307, 230, 3], [443, 443, 3], [642, 642, 2], [737, 737, 1], [229, 304, 3], [277, 277, 6], [340, 340, 4], [544, 544, 2], [279, 279, 4], [339, 357, 2], [219, 219, 4], [267, 254, 2], [371, 371, 3], [1086, 1028, 1], [200, 200, 3], [296, 1026, 2], [488, 488, 3], [188, 1055, 2], [249, 249, 3], [1027, 1054, 3], [1052, 314, 2], [363, 329, 2], [213, 213, 2], [188, 338, 2], [188, 1056, 2], [260, 1026, 2], [532, 532, 2], [332, 240, 2], [354, 354, 3], [589, 589, 2], [554, 554, 2], [392, 392, 1], [347, 250, 2], [199, 199, 3], [262, 262, 4], [628, 628, 2], [188, 1094, 2], [439, 248, 2], [1029, 545, 4], [210, 210, 4], [499, 499, 2], [1028, 1062, 1], [302, 302, 3], [1053, 265, 4], [361, 361, 3], [485, 247, 2], [204, 204, 3], [201, 201, 5], [1036, 1036, 3], [366, 366, 2], [343, 280, 2], [277, 1026, 2], [344, 344, 4], [275, 281, 2], [508, 390, 2], [174, 176, 6], [269, 269, 5], [1384, 1384, 2], [246, 1054, 2], [234, 229, 1], [466, 1093, 1], [367, 367, 3], [405, 217, 2], [264, 1068, 1], [196, 196, 4], [298, 298, 2], [1039, 322, 4], [333, 333, 3], [342, 342, 4], [1045, 376, 6], [313, 313, 5], [1027, 1087, 1], [285, 416, 2], [723, 723, 1], [518, 518, 3], [253, 253, 5], [1027, 1090, 1], [232, 205, 1], [230, 307, 3], [292, 292, 1], [229, 234, 1], [188, 327, 2], [1024, 259, 4], [231, 231, 3], [1027, 1115, 1], [382, 368, 2], [188, 328, 2], [1028, 1061, 1], [188, 348, 2], [110, 109, 1], [214, 1033, 2], [502, 502, 1], [369, 267, 2], [1027, 265, 3], [66, 65, 1], [1053, 247, 4], [456, 456, 3], [190, 190, 3], [627, 627, 2], [346, 407, 2], [193, 193, 3], [1063, 254, 4], [460, 460, 3], [1060, 280, 2], [246, 1024, 2], [496, 496, 3], [819, 819, 2], [1041, 414, 2], [214, 357, 2], [1038, 447, 6], [1078, 1078, 2], [375, 267, 2], [229, 301, 3], [370, 256, 2], [1028, 1025, 3], [425, 425, 2], [188, 359, 2], [399, 241, 2], [248, 327, 2], [563, 563, 2], [254, 217, 2], [358, 358, 3], [62, 569, 1], [343, 372, 2], [741, 741, 2], [310, 310, 3], [576, 576, 2], [239, 319, 2], [412, 412, 3], [394, 394, 3], [323, 446, 2], [1068, 264, 1], [1029, 1049, 4], [288, 357, 2], [606, 606, 2], [312, 312, 4], [188, 325, 2], [396, 259, 2], [284, 1026, 2], [1116, 65, 2], [1028, 1062, 3], [475, 475, 1], [239, 319, 1], [1115, 1027, 1], [402, 259, 2], [365, 365, 2], [362, 362, 3], [237, 305, 1], [561, 561, 2], [246, 265, 2], [1081, 1081, 2], [1106, 65, 2], [1066, 1027, 1], [299, 299, 5], [304, 304, 5], [67, 68, 2], [255, 255, 4], [491, 491, 3], [1060, 294, 2], [453, 453, 3], [381, 381, 1], [1030, 281, 1], [1134, 1040, 2], [1028, 1089, 3], [249, 469, 2], [343, 260, 2], [261, 261, 1], [188, 347, 2], [413, 315, 2], [395, 395, 3], [1064, 266, 3], [481, 481, 1], [212, 212, 1], [329, 535, 2], [494, 494, 3], [1047, 174, 5], [276, 276, 1], [1042, 403, 2], [320, 320, 5], [1028, 1061, 3], [380, 380, 3], [1048, 176, 5], [295, 295, 4], [314, 273, 2], [1053, 248, 4], [477, 477, 3], [1042, 409, 2], [457, 321, 2], [398, 321, 2], [687, 687, 2], [1062, 1028, 1], [190, 351, 2], [246, 347, 2], [697, 697, 2], [1060, 296, 2], [214, 375, 2], [1061, 1028, 1], [349, 349, 3], [377, 377, 3], [461, 461, 3], [1025, 174, 4], [1028, 1086, 3], [275, 1026, 2], [284, 284, 6], [190, 196, 2], [216, 285, 2], [307, 307, 5], [459, 259, 2], [70, 305, 1], [258, 258, 5], [335, 335, 1], [188, 405, 2], [1039, 1039, 3], [890, 890, 1], [334, 404, 2], [1072, 265, 4], [326, 242, 1], [328, 328, 4], [454, 331, 1], [1030, 281, 3], [710, 710, 2], [1053, 1036, 4], [268, 268, 4], [745, 745, 2], [58, 58, 1], [289, 289, 1], [1038, 441, 6], [942, 942, 1], [254, 369, 2], [262, 404, 2], [437, 437, 1], [480, 236, 2], [788, 788, 1], [72, 71, 2], [1041, 426, 2], [662, 662, 2], [463, 463, 3], [72, 1139, 1], [833, 833, 2], [520, 520, 2], [794, 794, 2], [632, 632, 2], [203, 203, 1], [1045, 367, 6], [254, 1024, 2], [1096, 251, 4], [1047, 174, 7], [1041, 431, 2], [247, 217, 2], [462, 462, 3], [283, 232, 1], [1109, 256, 4], [400, 400, 2], [70, 1103, 1], [62, 772, 1], [176, 296, 2], [325, 325, 4], [1027, 1054, 1], [489, 489, 3], [574, 574, 2], [16, 17, 1], [1068, 264, 3], [1038, 435, 6], [1028, 251, 7], [262, 417, 2], [348, 1036, 2], [1027, 1054, 5], [214, 267, 2], [1049, 202, 4], [336, 244, 1], [1027, 267, 5], [225, 315, 2], [685, 685, 2], [850, 850, 2], [313, 235, 3], [247, 328, 2], [230, 234, 1], [272, 272, 7], [827, 827, 1], [1025, 176, 4], [323, 446, 1], [220, 220, 3], [836, 836, 2], [501, 501, 3], [288, 201, 2], [265, 347, 2], [1048, 176, 7], [471, 471, 3], [60, 1163, 1], [333, 339, 2], [269, 273, 2], [1027, 1087, 3], [174, 294, 2], [301, 301, 5], [314, 314, 4], [526, 526, 1], [671, 671, 2], [601, 601, 2], [1121, 61, 2], [331, 454, 1], [390, 390, 3], [360, 281, 2], [378, 63, 2], [626, 626, 2], [1027, 1090, 3], [387, 387, 3], [570, 570, 1], [247, 334, 2], [1027, 267, 3], [214, 1050, 2], [402, 327, 2], [244, 336, 1], [174, 193, 2], [1025, 370, 4], [217, 329, 2], [555, 555, 2], [594, 594, 2], [246, 248, 2], [551, 551, 1], [285, 216, 2], [107, 106, 1], [379, 190, 2], [198, 198, 3], [234, 230, 1], [176, 193, 2], [521, 521, 2], [217, 1024, 2], [1060, 275, 2], [479, 479, 3], [280, 280, 5], [265, 265, 4], [338, 417, 2], [70, 305, 2], [619, 619, 2], [249, 495, 2], [1045, 354, 6], [468, 468, 3], [366, 188, 2], [652, 652, 2], [1070, 241, 1], [608, 608, 2], [1030, 294, 1], [235, 313, 3], [1038, 458, 6], [1045, 397, 6], [1028, 1061, 5], [322, 448, 2], [1030, 296, 1], [369, 257, 2], [1027, 1069, 3], [695, 695, 2], [522, 522, 2], [1027, 1067, 3], [427, 427, 2], [1443, 1443, 2], [1141, 239, 1], [238, 238, 1], [99, 100, 1], [1042, 447, 2], [326, 242, 2], [1098, 376, 2], [1116, 64, 2], [1028, 1062, 5], [320, 234, 3], [430, 309, 2], [1140, 339, 4], [267, 267, 1], [559, 559, 3], [384, 384, 3], [649, 649, 2], [604, 604, 2], [281, 275, 2], [277, 277, 7], [1045, 358, 6], [319, 239, 1], [225, 309, 2], [175, 175, 1], [304, 229, 2], [365, 188, 2], [493, 307, 2], [285, 416, 1], [1162, 352, 4], [247, 1024, 2], [372, 343, 2], [473, 473, 3], [66, 205, 1], [523, 523, 2], [586, 586, 2], [474, 474, 3], [889, 61, 1], [1047, 1047, 1], [504, 504, 1], [261, 261, 5], [469, 249, 2], [596, 596, 2], [235, 324, 3], [359, 448, 2], [466, 667, 1], [260, 1083, 2], [363, 363, 1], [190, 353, 2], [817, 817, 1], [590, 590, 2], [112, 112, 1], [399, 399, 3], [1026, 193, 1], [1148, 71, 2], [593, 593, 2], [273, 314, 2], [312, 272, 2], [318, 318, 5], [246, 246, 1], [451, 252, 2], [1121, 62, 2], [577, 352, 2], [517, 517, 3], [610, 610, 2], [260, 343, 2], [1042, 435, 2], [247, 1067, 2], [254, 254, 4], [272, 312, 2], [1025, 332, 4], [1098, 354, 2], [259, 396, 2], [1143, 265, 4], [229, 304, 2], [330, 433, 2], [684, 684, 2], [266, 500, 2], [262, 553, 2], [1060, 260, 2], [256, 370, 2], [582, 582, 2], [248, 338, 2], [428, 264, 2], [422, 323, 1], [464, 464, 3], [820, 820, 1], [236, 236, 5], [1030, 294, 5], [1042, 441, 2], [210, 252, 2], [497, 497, 1], [598, 598, 2], [1026, 174, 4], [248, 1024, 2], [336, 244, 2], [72, 805, 1], [394, 394, 1], [486, 486, 3], [498, 498, 3], [271, 271, 1], [410, 637, 1], [228, 228, 5], [1090, 1027, 1], [656, 656, 2], [376, 289, 2], [954, 954, 1], [234, 320, 3], [267, 217, 2], [248, 217, 2], [1027, 1079, 1], [1033, 1073, 3], [527, 527, 3], [1111, 1111, 2], [216, 289, 2], [484, 484, 3], [492, 492, 3], [378, 569, 2], [359, 1039, 2], [258, 327, 2], [418, 300, 2], [668, 478, 1], [273, 269, 2], [1105, 1105, 1], [267, 1024, 2], [423, 423, 3], [262, 490, 2], [510, 510, 3], [1028, 1159, 1], [230, 230, 7], [248, 1069, 2], [1060, 277, 2], [245, 370, 2], [373, 337, 2], [605, 605, 2], [1282, 73, 2], [388, 190, 2], [201, 288, 2], [612, 612, 2], [482, 482, 3], [792, 609, 2], [254, 1063, 2], [689, 689, 2], [1030, 296, 5], [229, 235, 1], [1030, 1026, 3], [424, 424, 3], [326, 444, 1], [565, 565, 2], [640, 640, 2], [1087, 1027, 1], [235, 229, 1], [109, 108, 1], [406, 406, 1], [584, 584, 2], [1310, 61, 2], [385, 360, 2], [588, 588, 2], [585, 585, 2], [663, 663, 2], [1048, 1048, 1], [368, 368, 1], [319, 465, 1], [348, 276, 2], [696, 696, 2], [1184, 1027, 1], [775, 775, 1], [467, 467, 3], [346, 346, 1], [1036, 259, 4], [323, 422, 1], [1186, 1027, 1], [459, 459, 3], [1042, 458, 2], [28, 27, 1], [240, 251, 2], [227, 321, 2], [407, 371, 2], [421, 421, 3], [329, 363, 2], [587, 587, 2], [324, 324, 5], [1054, 1027, 1], [470, 470, 3], [265, 325, 2], [1028, 1160, 1], [1029, 202, 1], [398, 300, 2], [1156, 315, 4], [548, 548, 1], [71, 392, 1], [273, 1025, 2], [1075, 251, 4], [294, 284, 2], [1060, 284, 2], [262, 268, 2], [413, 309, 2], [546, 546, 3], [332, 269, 2], [600, 600, 2], [419, 419, 3], [235, 230, 2], [102, 101, 1], [533, 533, 3], [661, 661, 2], [246, 246, 4], [270, 270, 5], [1098, 367, 2], [208, 208, 3], [1024, 1027, 1], [176, 174, 7], [432, 288, 2], [505, 301, 2], [1075, 256, 4], [216, 216, 5], [724, 724, 2], [251, 1025, 2], [1057, 217, 4], [669, 669, 2], [396, 328, 2], [277, 296, 2], [247, 485, 2], [507, 507, 2], [1027, 1097, 1], [234, 229, 2], [330, 433, 1], [1064, 1064, 1], [1098, 358, 2], [305, 237, 2], [257, 257, 4], [254, 362, 2], [1123, 1123, 2], [410, 680, 1], [1157, 249, 6], [571, 249, 2], [284, 294, 2], [634, 454, 1], [624, 624, 2], [205, 66, 1], [439, 439, 3], [323, 422, 2], [1085, 1085, 2], [629, 629, 2], [444, 326, 1], [254, 267, 2], [503, 304, 2], [193, 360, 2], [438, 438, 1], [247, 214, 2], [65, 64, 1], [1070, 241, 3], [480, 480, 3], [307, 493, 2], [266, 493, 2], [579, 579, 2], [591, 591, 2], [353, 353, 2], [265, 214, 2], [256, 1062, 2], [296, 277, 2], [227, 300, 2], [130, 130, 2], [251, 1061, 2], [232, 283, 2], [295, 295, 5], [854, 854, 1], [401, 190, 2], [1054, 246, 4], [68, 212, 1], [28, 29, 1], [1028, 1130, 1], [797, 797, 2], [265, 1024, 2], [1031, 1029, 3], [299, 230, 2], [541, 541, 3], [472, 472, 1], [201, 214, 2], [372, 372, 2], [269, 332, 2], [557, 557, 3], [128, 635, 1], [259, 188, 2], [67, 1100, 1], [253, 253, 6], [202, 653, 2], [440, 308, 2], [248, 214, 2], [476, 476, 3], [414, 190, 2], [230, 299, 2], [63, 62, 1], [1202, 217, 6], [272, 1025, 2], [341, 341, 2], [1028, 1165, 1], [334, 271, 2], [229, 234, 2], [442, 442, 1], [495, 249, 2], [232, 283, 1], [923, 923, 2], [1026, 176, 4], [256, 1025, 2], [568, 348, 2], [483, 483, 3], [322, 1039, 2], [433, 330, 1], [412, 1049, 2], [229, 301, 2], [382, 382, 3], [1027, 1067, 1], [665, 665, 2], [436, 436, 3], [357, 339, 2], [1028, 1129, 1], [529, 529, 3], [202, 651, 2], [747, 747, 2], [18, 17, 1], [1159, 1028, 1], [252, 451, 2], [1060, 281, 2], [175, 175, 5], [971, 971, 1], [234, 318, 3], [564, 564, 2], [505, 266, 2], [434, 434, 1], [217, 405, 2], [625, 625, 2], [67, 66, 1], [1160, 1028, 1], [499, 499, 3], [212, 68, 1], [445, 445, 4], [26, 27, 1], [615, 615, 2], [884, 884, 1], [324, 235, 3], [676, 676, 2], [1058, 214, 4], [255, 255, 1], [1027, 1069, 1], [375, 1036, 2], [193, 343, 2], [344, 344, 2], [259, 402, 2], [307, 230, 2], [281, 360, 2], [392, 71, 1], [247, 246, 2], [500, 266, 2], [275, 275, 6], [321, 398, 1], [250, 250, 4], [466, 723, 1], [525, 525, 3], [239, 200, 2], [519, 320, 2], [72, 570, 1], [374, 374, 1], [267, 369, 2], [248, 246, 2], [337, 524, 2], [602, 602, 2], [69, 69, 3], [856, 856, 1], [319, 446, 1], [331, 243, 2], [281, 1026, 2], [457, 326, 1], [240, 240, 5], [241, 241, 5], [190, 453, 2], [351, 351, 2], [209, 209, 3], [23, 24, 1], [273, 273, 7], [540, 540, 3], [1121, 1121, 2], [715, 715, 2], [244, 336, 2], [631, 631, 2], [1030, 294, 3], [216, 196, 2], [188, 196, 2], [575, 575, 3], [550, 339, 2], [491, 491, 2], [190, 449, 2], [1116, 1116, 2], [1030, 296, 3], [205, 194, 1], [1027, 1079, 3], [729, 729, 1], [331, 243, 1], [256, 245, 2], [1059, 349, 4], [285, 322, 2], [613, 613, 2], [270, 270, 1], [549, 549, 2], [199, 242, 2], [939, 939, 2], [1024, 369, 4], [1028, 1132, 1], [1073, 1040, 1], [276, 348, 2], [201, 249, 2], [1167, 332, 4], [278, 278, 1], [403, 193, 2], [503, 264, 2], [239, 200, 1], [1111, 71, 2], [1029, 1029, 1], [327, 258, 2], [496, 496, 4], [271, 271, 5], [294, 174, 2], [444, 315, 1], [279, 279, 5], [312, 312, 5], [514, 514, 3], [301, 229, 2], [249, 201, 2], [425, 425, 3], [329, 322, 2], [478, 668, 1], [326, 457, 1], [452, 452, 1], [892, 892, 1], [1148, 73, 2], [338, 338, 4], [1166, 325, 4], [357, 288, 2], [272, 295, 2], [903, 903, 1], [138, 660, 1], [843, 843, 1], [362, 563, 2], [335, 335, 3], [1165, 1028, 1], [102, 103, 1], [409, 193, 2], [74, 1593, 1], [236, 219, 2], [334, 534, 2], [412, 367, 2], [290, 223, 2], [799, 799, 2], [512, 299, 2], [1075, 272, 4], [370, 370, 4], [488, 488, 4], [398, 321, 1], [284, 284, 7], [104, 103, 1], [896, 896, 1], [617, 617, 2], [443, 443, 4], [688, 688, 2], [1070, 1070, 4], [738, 738, 2], [99, 98, 1], [418, 418, 3], [254, 247, 2], [230, 235, 2], [391, 391, 4], [1040, 217, 6], [66, 194, 1], [766, 766, 2], [253, 328, 2], [389, 389, 4], [1046, 322, 4], [272, 256, 2], [245, 256, 2], [318, 234, 3], [897, 897, 2], [528, 528, 3], [1075, 273, 4], [246, 214, 2], [397, 202, 2], [280, 343, 2], [487, 487, 3], [633, 633, 2], [1036, 1053, 4], [260, 343, 3], [60, 1693, 1], [69, 70, 2], [296, 176, 2], [232, 232, 3], [274, 274, 2], [107, 108, 1], [542, 214, 2], [243, 331, 1], [1270, 466, 1], [1106, 1106, 2], [621, 621, 2], [363, 363, 3], [188, 421, 2], [675, 675, 2], [203, 203, 3], [212, 237, 1], [1027, 365, 1], [201, 325, 2], [1152, 254, 7], [1191, 378, 4], [426, 190, 2], [244, 309, 2], [251, 240, 2], [1075, 269, 4], [516, 516, 3], [249, 367, 2], [1080, 267, 4], [816, 816, 2], [188, 424, 2], [314, 314, 5], [518, 518, 4], [1044, 1024, 4], [1068, 1068, 1], [327, 327, 4], [285, 216, 1], [199, 242, 1], [1027, 1067, 5], [592, 481, 2], [508, 508, 1], [513, 513, 2], [313, 313, 6], [248, 476, 2], [252, 210, 2], [1028, 379, 1], [328, 253, 2], [76, 75, 1], [340, 340, 5], [792, 792, 2], [469, 469, 3], [618, 618, 2], [404, 262, 2], [512, 264, 2], [405, 405, 3], [246, 247, 2], [1178, 304, 4], [931, 931, 1], [1152, 248, 7], [58, 59, 1], [229, 229, 7], [294, 275, 2], [1057, 329, 4], [280, 277, 2], [765, 765, 2], [475, 371, 2], [446, 319, 1], [386, 386, 1], [1152, 247, 7], [603, 603, 3], [1138, 322, 4], [429, 429, 3], [422, 323, 2], [305, 237, 1], [493, 266, 2], [558, 214, 2], [536, 536, 3], [465, 330, 2], [210, 252, 1], [636, 636, 2], [273, 251, 2], [230, 307, 2], [419, 310, 2], [255, 352, 2], [1033, 262, 6], [362, 279, 2], [248, 424, 2], [315, 413, 1], [1027, 1069, 5], [720, 720, 2], [431, 190, 2], [1027, 1097, 3], [435, 193, 2], [296, 260, 2], [498, 264, 2], [334, 1039, 2], [573, 573, 2], [315, 413, 2], [782, 782, 2], [216, 268, 2], [200, 239, 1], [383, 383, 4], [760, 660, 1], [908, 908, 1], [1028, 1179, 1], [342, 342, 5], [347, 347, 1], [449, 449, 4], [519, 264, 2], [742, 742, 2], [188, 375, 2], [494, 494, 4], [266, 505, 2], [373, 373, 3], [807, 807, 2], [325, 201, 2], [485, 485, 3], [254, 1044, 2], [356, 356, 1], [456, 456, 4], [64, 1124, 1], [346, 346, 3], [691, 691, 1], [294, 260, 2], [537, 537, 3], [277, 280, 2], [454, 634, 1], [1148, 1148, 2], [254, 248, 2], [566, 566, 3], [196, 201, 2], [355, 355, 1], [256, 272, 2], [440, 308, 1], [328, 396, 2], [647, 430, 1], [255, 201, 2], [189, 189, 2], [698, 698, 2], [268, 262, 2], [460, 460, 4], [257, 369, 2], [1076, 1076, 4], [1183, 307, 4], [225, 195, 2], [316, 316, 5], [1190, 299, 4], [288, 288, 4], [1024, 362, 4], [1285, 317, 4], [374, 258, 2], [265, 217, 2], [266, 538, 2], [552, 552, 2], [1027, 1126, 1], [245, 258, 2], [275, 360, 2], [190, 477, 2], [1155, 210, 4], [304, 503, 2], [556, 556, 3], [62, 64, 1], [278, 278, 5], [294, 403, 2], [128, 127, 1], [417, 262, 2], [251, 332, 3], [942, 597, 1], [1046, 262, 4], [645, 645, 2], [351, 351, 5], [376, 376, 3], [261, 406, 2], [433, 330, 2], [658, 658, 2], [898, 898, 2], [757, 757, 2], [1026, 222, 4], [364, 258, 2], [696, 289, 2], [360, 275, 2], [1028, 388, 1], [176, 174, 6], [1513, 106, 2], [314, 1025, 2], [234, 320, 4], [226, 308, 2], [741, 578, 2], [644, 644, 2], [501, 501, 4], [1130, 1028, 1], [202, 196, 2], [70, 71, 2], [247, 421, 2], [295, 272, 2], [1075, 295, 4], [273, 256, 2], [1027, 366, 1], [129, 679, 1], [301, 505, 2], [1067, 1027, 1], [202, 241, 2], [1118, 281, 5], [441, 193, 2], [1053, 267, 4], [1154, 283, 4], [260, 296, 2], [1074, 252, 3], [312, 1025, 2], [385, 385, 3], [523, 523, 3], [230, 299, 4], [181, 192, 1], [18, 19, 1], [338, 1039, 2], [202, 352, 2], [1174, 321, 4], [427, 293, 2], [216, 279, 2], [378, 283, 2], [16, 15, 1], [327, 402, 2], [1069, 1027, 1], [400, 400, 3], [453, 453, 4], [242, 199, 1], [246, 348, 2], [1050, 1050, 3], [276, 276, 5], [411, 411, 4], [269, 1084, 2], [190, 491, 2], [393, 393, 4], [217, 254, 2], [413, 315, 1], [498, 313, 2], [353, 353, 5], [227, 300, 1], [70, 69, 2], [1152, 265, 7], [714, 714, 2], [1024, 334, 4], [718, 718, 2], [311, 311, 2], [412, 241, 2], [219, 219, 5], [452, 451, 2], [1028, 1226, 1], [446, 323, 1], [229, 304, 4], [260, 294, 2], [333, 333, 1], [1049, 1059, 4], [230, 234, 2], [416, 285, 2], [1192, 236, 4], [65, 65, 3], [595, 217, 2], [1223, 235, 4], [67, 67, 3], [522, 522, 3], [68, 237, 1], [961, 961, 2], [793, 793, 2], [1117, 262, 4], [504, 382, 2], [265, 405, 2], [368, 335, 2], [1028, 1219, 1], [299, 299, 6], [510, 339, 2], [520, 520, 3], [259, 259, 1], [398, 300, 1], [369, 459, 2], [1027, 1063, 3], [249, 354, 2], [490, 490, 3], [252, 1074, 1], [336, 430, 1], [337, 337, 3], [1024, 325, 4], [272, 251, 2], [458, 193, 2], [195, 244, 2], [442, 258, 2], [1141, 1141, 1], [245, 245, 5], [1129, 1028, 1], [217, 248, 2], [359, 359, 4], [222, 193, 2], [30, 29, 1], [1031, 289, 5], [659, 659, 2], [1586, 22, 2], [285, 285, 4], [334, 628, 2], [462, 462, 4], [217, 247, 2], [1181, 1027, 1], [314, 251, 2], [1042, 174, 2], [690, 690, 2], [531, 531, 3], [1027, 345, 1], [1529, 100, 2], [324, 538, 2], [417, 338, 2], [197, 221, 2], [280, 277, 1], [229, 235, 2], [350, 350, 3], [215, 215, 3], [1119, 1119, 4], [225, 309, 1], [296, 275, 2], [1024, 1056, 4], [226, 323, 2], [292, 292, 3], [415, 415, 4], [105, 106, 1], [246, 1046, 2], [174, 190, 2], [205, 66, 2], [289, 627, 2], [1024, 338, 4], [72, 1003, 1], [234, 230, 2], [699, 699, 2], [727, 727, 2], [1030, 1026, 1], [201, 375, 2], [214, 1036, 3], [210, 317, 2], [712, 712, 2], [713, 713, 2], [1503, 17, 2], [495, 495, 3], [438, 266, 1], [1075, 314, 4], [305, 70, 1], [1132, 1028, 1], [635, 408, 1], [296, 409, 2], [457, 321, 1], [265, 1072, 2], [716, 716, 2], [277, 280, 1], [328, 188, 2], [261, 261, 6], [500, 500, 3], [247, 254, 2], [198, 243, 2], [434, 253, 2], [175, 175, 6], [429, 279, 2], [249, 358, 2], [247, 423, 2], [228, 228, 1], [250, 196, 2], [419, 310, 1], [355, 355, 4], [240, 253, 2], [425, 284, 2], [1198, 66, 2], [63, 378, 1], [489, 489, 4], [521, 521, 3], [1057, 1057, 3], [1042, 176, 2], [193, 174, 4], [673, 673, 2], [396, 361, 2], [149, 149, 2], [259, 1058, 3], [756, 756, 2], [313, 235, 4], [364, 402, 2], [332, 190, 2], [583, 217, 2], [327, 188, 2], [465, 330, 1], [1038, 1038, 1], [1082, 1082, 4], [202, 436, 2], [464, 464, 1], [666, 666, 2], [1098, 397, 2], [256, 273, 2], [268, 216, 2], [1088, 275, 4], [1083, 260, 5], [269, 312, 2], [291, 291, 3], [1024, 348, 4], [1224, 200, 1], [1100, 1100, 2], [1024, 1055, 4], [972, 972, 1], [620, 480, 2], [381, 381, 4], [248, 254, 2], [1028, 1130, 3], [532, 532, 3], [1196, 301, 4], [722, 827, 1], [318, 266, 1], [543, 543, 1], [791, 791, 2], [294, 281, 2], [468, 468, 4], [374, 374, 4], [264, 428, 1], [190, 479, 2], [26, 25, 1], [1075, 312, 4], [473, 473, 4], [1025, 196, 4], [735, 735, 2], [1052, 379, 2], [544, 544, 3], [210, 241, 2], [404, 334, 2], [1049, 352, 4], [356, 356, 4], [1031, 1029, 1], [1243, 1027, 1], [472, 472, 3], [276, 201, 2], [248, 439, 2], [110, 111, 1], [1028, 1146, 1], [1211, 309, 4], [227, 321, 1], [345, 345, 3], [390, 577, 2], [1024, 405, 4], [506, 506, 3], [380, 380, 4], [511, 511, 3], [304, 229, 4], [1232, 234, 4], [202, 316, 2], [230, 307, 4], [904, 904, 2], [1120, 235, 6], [70, 70, 3], [889, 889, 1], [1030, 1168, 1], [887, 887, 2], [1024, 347, 4], [329, 514, 2], [1041, 174, 2], [1040, 214, 6], [164, 164, 2], [222, 222, 3], [440, 440, 3], [267, 1080, 2], [1382, 478, 2], [554, 554, 3], [559, 559, 4], [1041, 332, 2], [407, 407, 1], [810, 810, 2], [1059, 1059, 4], [527, 527, 4], [193, 176, 4], [692, 692, 2], [336, 478, 1], [155, 155, 2], [1028, 1129, 3], [242, 315, 1], [822, 822, 2], [1024, 359, 4], [1106, 66, 2], [1308, 454, 2], [69, 68, 1], [463, 241, 2], [188, 423, 2], [243, 300, 2], [272, 1091, 2], [196, 250, 2], [361, 253, 2], [1036, 1044, 4], [1219, 1028, 1], [1041, 1278, 2], [1195, 347, 4], [176, 190, 2], [805, 805, 1], [1002, 1002, 1], [461, 461, 1], [1179, 1028, 1], [289, 436, 2], [474, 296, 2], [320, 234, 4], [1027, 350, 1], [1045, 1029, 1], [1077, 68, 2], [1028, 1092, 1], [1103, 1103, 2], [202, 317, 2], [272, 216, 2], [195, 226, 2], [256, 312, 2], [260, 277, 2], [487, 487, 1], [1074, 252, 1], [341, 341, 5], [1028, 1132, 3], [1028, 1169, 1], [420, 420, 2], [251, 273, 2], [403, 294, 2], [516, 325, 2], [802, 802, 2], [471, 241, 2], [284, 281, 2], [229, 301, 4], [589, 589, 1], [299, 512, 2], [188, 1110, 2], [288, 432, 2], [339, 333, 2], [483, 258, 2], [1228, 338, 4], [529, 529, 4], [20, 19, 1], [371, 475, 2], [305, 305, 3], [1088, 281, 4], [584, 422, 1], [726, 726, 2], [1291, 316, 4], [283, 378, 1], [598, 550, 2], [64, 63, 2], [216, 217, 2], [343, 280, 3], [560, 560, 3], [1025, 1028, 1], [1058, 1058, 3], [447, 193, 2], [601, 601, 1], [306, 306, 3], [470, 253, 2], [1139, 1139, 2], [312, 256, 2], [482, 294, 2], [264, 503, 2], [481, 481, 3], [220, 220, 1], [235, 230, 3], [282, 282, 3], [465, 319, 1], [1134, 259, 2], [1028, 1091, 1], [1260, 428, 4], [240, 332, 3], [300, 398, 1], [1105, 326, 1], [467, 467, 4], [1031, 289, 1], [1460, 109, 2], [216, 272, 2], [996, 996, 1], [174, 176, 5], [307, 307, 6], [446, 323, 2], [322, 534, 2], [201, 255, 2], [1027, 1063, 5], [231, 310, 2], [535, 646, 2], [205, 232, 2], [231, 330, 2], [279, 257, 2], [295, 370, 2], [736, 736, 2], [1088, 294, 4], [706, 706, 2], [252, 210, 1], [772, 772, 1], [298, 298, 3], [1084, 1028, 1], [190, 562, 2], [277, 260, 2], [546, 546, 4], [778, 778, 2], [524, 346, 2], [647, 478, 1], [214, 542, 2], [269, 314, 2], [284, 275, 2], [1028, 1173, 1], [477, 477, 4], [569, 569, 1], [409, 296, 2], [1028, 1084, 1], [191, 191, 1], [1024, 327, 4], [318, 234, 4], [349, 1029, 2], [515, 515, 3], [379, 314, 2], [604, 604, 1], [250, 347, 2], [357, 357, 1], [196, 216, 2], [416, 285, 1], [1226, 1028, 1], [235, 229, 2], [269, 272, 2], [509, 509, 3], [1267, 398, 1], [1092, 1028, 1], [188, 439, 2], [196, 257, 2], [786, 786, 2], [1036, 325, 4], [377, 377, 4], [463, 317, 2], [349, 352, 2], [173, 173, 2], [555, 555, 3], [242, 321, 1], [62, 843, 1], [243, 331, 2], [228, 228, 6], [423, 254, 2], [466, 100, 1], [225, 315, 1], [399, 794, 2], [266, 324, 1], [355, 253, 2], [320, 320, 6], [1033, 1033, 3], [315, 225, 2], [866, 866, 2], [275, 284, 2], [326, 1312, 1], [24, 25, 1], [1088, 260, 4], [264, 498, 2], [1112, 1031, 1], [406, 406, 4], [392, 71, 2], [204, 204, 4], [1343, 410, 1], [588, 430, 1], [239, 1141, 1], [806, 806, 2], [275, 296, 2], [177, 177, 2], [785, 785, 2], [1024, 328, 4], [1088, 296, 4], [611, 611, 1], [484, 484, 4], [214, 558, 2], [329, 536, 2], [322, 547, 2], [235, 313, 4], [211, 211, 2], [1206, 343, 4], [266, 318, 1], [1361, 185, 1], [1045, 1045, 1], [362, 362, 1], [244, 308, 2], [251, 272, 2], [360, 385, 3], [286, 286, 4], [1028, 190, 5], [421, 246, 2], [1027, 1072, 3], [1175, 323, 4], [1290, 410, 2], [1041, 176, 2], [537, 402, 2], [525, 525, 2], [885, 885, 2], [570, 73, 1], [413, 309, 1], [1088, 280, 4], [14, 15, 1], [1031, 249, 1], [1026, 1026, 1], [280, 296, 2], [1040, 246, 6], [304, 304, 6], [1088, 277, 4], [609, 609, 3], [202, 342, 2], [383, 383, 1], [395, 395, 4], [424, 246, 2], [519, 519, 3], [389, 230, 2], [241, 210, 2], [267, 214, 2], [268, 250, 2], [332, 1096, 2], [138, 139, 1], [1091, 1028, 1], [528, 396, 2], [1031, 1112, 3], [259, 459, 2], [105, 104, 1], [902, 902, 2], [297, 297, 4], [1052, 388, 2], [448, 448, 1], [293, 293, 3], [479, 479, 4], [64, 64, 3], [314, 269, 2], [236, 236, 6], [257, 196, 2], [314, 379, 2], [201, 201, 6], [284, 425, 2], [388, 312, 2], [329, 646, 2], [528, 339, 2], [1154, 283, 1], [968, 968, 2], [1031, 1220, 1], [275, 294, 2], [376, 436, 2], [1088, 284, 4], [287, 287, 4], [193, 443, 2], [386, 386, 3], [648, 217, 2], [1039, 359, 4], [216, 285, 1], [557, 557, 4], [271, 271, 6], [580, 580, 3], [1079, 1027, 1], [476, 476, 1], [1125, 234, 6], [331, 418, 1], [1035, 370, 6], [1052, 401, 2], [1035, 174, 6], [433, 310, 1], [1148, 72, 2], [326, 315, 1], [526, 63, 1], [537, 339, 2], [1015, 1015, 1], [194, 212, 1], [511, 348, 2], [99, 737, 1], [592, 592, 1], [1140, 1140, 4], [273, 1092, 2], [364, 364, 4], [280, 294, 2], [257, 255, 2], [308, 422, 1], [244, 309, 1], [530, 530, 3], [301, 229, 4], [517, 517, 4], [202, 340, 2], [190, 456, 2], [1193, 288, 4], [449, 256, 2], [1035, 176, 6], [567, 567, 3], [101, 100, 1], [264, 512, 2], [1051, 1051, 3], [1213, 270, 4], [405, 265, 2], [882, 882, 2], [578, 347, 2], [1025, 351, 4], [235, 324, 4], [655, 217, 2], [261, 393, 2], [507, 248, 2], [1632, 108, 2], [1044, 254, 4], [245, 381, 2], [1136, 1136, 2], [344, 344, 5], [561, 398, 1], [349, 249, 2], [452, 451, 1], [272, 269, 2], [281, 284, 2], [626, 626, 3], [804, 804, 2], [1204, 334, 4], [1158, 1158, 4], [963, 963, 2], [1058, 254, 4], [193, 234, 2], [299, 230, 4], [533, 533, 4], [770, 770, 2], [281, 294, 2], [352, 255, 2], [267, 375, 2], [593, 497, 2], [312, 269, 2], [258, 374, 2], [279, 216, 2], [840, 840, 2], [875, 875, 2], [242, 199, 2], [307, 230, 4], [416, 579, 1], [749, 749, 2], [624, 289, 2], [1027, 345, 5], [1027, 1126, 3], [229, 229, 1], [1617, 1617, 2], [393, 261, 2], [1384, 181, 2], [208, 208, 1], [338, 547, 2], [368, 368, 3], [242, 1093, 1], [1231, 300, 4], [485, 485, 1], [280, 1038, 2], [237, 69, 1], [552, 256, 2], [562, 562, 2], [317, 210, 2], [318, 301, 1], [213, 213, 3], [416, 579, 2], [308, 440, 1], [1026, 360, 4], [201, 276, 2], [1123, 410, 2], [683, 683, 2], [848, 848, 2], [384, 384, 4], [405, 701, 2], [214, 345, 2], [654, 654, 2], [483, 288, 2], [205, 232, 1], [331, 419, 1], [439, 254, 2], [1170, 260, 4], [190, 341, 2], [675, 375, 2], [838, 838, 2], [68, 68, 3], [333, 288, 2], [475, 662, 2], [98, 98, 1], [1027, 350, 5], [565, 565, 3], [469, 354, 2], [245, 387, 2], [1028, 1092, 5], [1244, 66, 2], [1141, 319, 1], [1124, 1124, 2], [281, 1118, 2], [249, 571, 2], [330, 465, 1], [502, 502, 3], [508, 390, 1], [872, 872, 2], [480, 399, 2], [722, 137, 1], [400, 277, 2], [470, 470, 1], [474, 474, 4], [1036, 1073, 4], [1042, 222, 2], [1027, 1072, 5], [338, 261, 2], [553, 262, 2], [217, 322, 1], [201, 253, 2], [303, 303, 2], [513, 247, 2], [597, 410, 1], [1027, 1063, 1], [201, 196, 2], [445, 445, 5], [307, 324, 1], [193, 482, 2], [1046, 246, 4], [326, 321, 1], [251, 314, 2], [890, 634, 1], [182, 218, 1], [1028, 379, 5], [575, 575, 4], [1052, 414, 2]]} \ No newline at end of file +{ + "spatial_merges": [ + [ + 152, + 164 + ], + [ + 133, + 183 + ], + [ + 22, + 105 + ], + [ + 67, + 184 + ], + [ + 185, + 186 + ], + [ + 181, + 187 + ], + [ + 175, + 182 + ], + [ + 187, + 189 + ], + [ + 181, + 184 + ], + [ + 181, + 183 + ], + [ + 175, + 188 + ], + [ + 181, + 186 + ], + [ + 21, + 105 + ], + [ + 67, + 185 + ], + [ + 133, + 181 + ], + [ + 23, + 105 + ], + [ + 22, + 104 + ], + [ + 22, + 106 + ], + [ + 68, + 185 + ], + [ + 182, + 187 + ], + [ + 134, + 192 + ], + [ + 132, + 192 + ], + [ + 66, + 191 + ], + [ + 153, + 164 + ], + [ + 151, + 164 + ], + [ + 152, + 165 + ], + [ + 152, + 163 + ], + [ + 182, + 184 + ], + [ + 183, + 189 + ], + [ + 68, + 191 + ], + [ + 186, + 189 + ], + [ + 191, + 201 + ], + [ + 175, + 194 + ], + [ + 66, + 185 + ], + [ + 185, + 205 + ], + [ + 182, + 183 + ], + [ + 184, + 189 + ], + [ + 67, + 175 + ], + [ + 134, + 181 + ], + [ + 175, + 196 + ], + [ + 132, + 181 + ], + [ + 133, + 189 + ], + [ + 21, + 104 + ], + [ + 21, + 106 + ], + [ + 23, + 104 + ], + [ + 134, + 211 + ], + [ + 197, + 207 + ], + [ + 197, + 206 + ], + [ + 23, + 106 + ], + [ + 65, + 191 + ], + [ + 133, + 182 + ], + [ + 197, + 208 + ], + [ + 197, + 209 + ], + [ + 132, + 211 + ], + [ + 69, + 191 + ], + [ + 182, + 186 + ], + [ + 22, + 107 + ], + [ + 67, + 195 + ], + [ + 132, + 218 + ], + [ + 22, + 103 + ], + [ + 24, + 105 + ], + [ + 20, + 105 + ], + [ + 67, + 198 + ], + [ + 194, + 200 + ], + [ + 194, + 195 + ], + [ + 194, + 198 + ], + [ + 201, + 210 + ], + [ + 67, + 200 + ], + [ + 195, + 213 + ], + [ + 134, + 218 + ], + [ + 68, + 195 + ], + [ + 194, + 199 + ], + [ + 68, + 199 + ], + [ + 198, + 213 + ], + [ + 67, + 199 + ], + [ + 68, + 198 + ], + [ + 199, + 212 + ], + [ + 195, + 215 + ], + [ + 66, + 198 + ], + [ + 200, + 205 + ], + [ + 196, + 224 + ], + [ + 135, + 192 + ], + [ + 196, + 204 + ], + [ + 131, + 192 + ], + [ + 196, + 203 + ], + [ + 66, + 200 + ], + [ + 196, + 228 + ], + [ + 175, + 203 + ], + [ + 66, + 195 + ], + [ + 216, + 219 + ], + [ + 201, + 219 + ], + [ + 203, + 220 + ], + [ + 198, + 215 + ], + [ + 68, + 200 + ], + [ + 175, + 214 + ], + [ + 175, + 204 + ], + [ + 66, + 199 + ], + [ + 203, + 222 + ], + [ + 204, + 222 + ], + [ + 204, + 220 + ], + [ + 64, + 191 + ], + [ + 175, + 217 + ], + [ + 65, + 185 + ], + [ + 153, + 163 + ], + [ + 151, + 165 + ], + [ + 69, + 185 + ], + [ + 210, + 216 + ], + [ + 131, + 181 + ], + [ + 175, + 212 + ], + [ + 135, + 181 + ], + [ + 132, + 182 + ], + [ + 199, + 215 + ], + [ + 196, + 236 + ], + [ + 200, + 215 + ], + [ + 151, + 163 + ], + [ + 175, + 205 + ], + [ + 206, + 221 + ], + [ + 24, + 104 + ], + [ + 207, + 223 + ], + [ + 153, + 165 + ], + [ + 134, + 189 + ], + [ + 207, + 221 + ], + [ + 70, + 191 + ], + [ + 134, + 182 + ], + [ + 206, + 223 + ], + [ + 20, + 106 + ], + [ + 20, + 104 + ], + [ + 24, + 106 + ], + [ + 132, + 189 + ], + [ + 199, + 213 + ], + [ + 209, + 221 + ], + [ + 200, + 213 + ], + [ + 21, + 103 + ], + [ + 206, + 233 + ], + [ + 207, + 233 + ], + [ + 208, + 223 + ], + [ + 22, + 108 + ], + [ + 208, + 221 + ], + [ + 23, + 103 + ], + [ + 185, + 232 + ], + [ + 21, + 107 + ], + [ + 209, + 223 + ], + [ + 201, + 204 + ], + [ + 22, + 102 + ], + [ + 198, + 212 + ], + [ + 195, + 212 + ], + [ + 200, + 232 + ], + [ + 23, + 107 + ], + [ + 25, + 105 + ], + [ + 228, + 240 + ], + [ + 69, + 199 + ], + [ + 195, + 205 + ], + [ + 67, + 204 + ], + [ + 19, + 105 + ], + [ + 65, + 203 + ], + [ + 198, + 205 + ], + [ + 199, + 237 + ], + [ + 208, + 233 + ], + [ + 206, + 224 + ], + [ + 209, + 233 + ], + [ + 195, + 274 + ], + [ + 207, + 224 + ], + [ + 196, + 230 + ], + [ + 67, + 203 + ], + [ + 204, + 250 + ], + [ + 200, + 212 + ], + [ + 199, + 238 + ], + [ + 196, + 229 + ], + [ + 208, + 224 + ], + [ + 210, + 255 + ], + [ + 209, + 224 + ], + [ + 195, + 238 + ], + [ + 68, + 226 + ], + [ + 66, + 227 + ], + [ + 185, + 237 + ], + [ + 198, + 238 + ], + [ + 203, + 216 + ], + [ + 198, + 282 + ], + [ + 68, + 225 + ], + [ + 199, + 205 + ], + [ + 65, + 200 + ], + [ + 68, + 227 + ], + [ + 196, + 234 + ], + [ + 196, + 235 + ], + [ + 196, + 241 + ], + [ + 66, + 204 + ], + [ + 203, + 257 + ], + [ + 236, + 245 + ], + [ + 69, + 203 + ], + [ + 195, + 220 + ], + [ + 64, + 203 + ], + [ + 68, + 231 + ], + [ + 201, + 203 + ], + [ + 200, + 238 + ], + [ + 67, + 226 + ], + [ + 63, + 191 + ], + [ + 206, + 263 + ], + [ + 67, + 227 + ], + [ + 67, + 243 + ], + [ + 65, + 204 + ], + [ + 66, + 225 + ], + [ + 67, + 225 + ], + [ + 198, + 220 + ], + [ + 69, + 204 + ], + [ + 67, + 231 + ], + [ + 207, + 263 + ], + [ + 197, + 286 + ], + [ + 69, + 210 + ], + [ + 197, + 287 + ], + [ + 71, + 191 + ], + [ + 66, + 231 + ], + [ + 67, + 244 + ], + [ + 66, + 226 + ], + [ + 212, + 225 + ], + [ + 196, + 252 + ], + [ + 24, + 103 + ], + [ + 131, + 218 + ], + [ + 175, + 201 + ], + [ + 208, + 263 + ], + [ + 212, + 227 + ], + [ + 222, + 229 + ], + [ + 205, + 226 + ], + [ + 204, + 216 + ], + [ + 66, + 243 + ], + [ + 68, + 203 + ], + [ + 130, + 181 + ], + [ + 222, + 230 + ], + [ + 22, + 109 + ], + [ + 197, + 297 + ], + [ + 201, + 241 + ], + [ + 20, + 103 + ], + [ + 209, + 263 + ], + [ + 197, + 302 + ], + [ + 64, + 185 + ], + [ + 205, + 231 + ], + [ + 25, + 104 + ], + [ + 25, + 106 + ], + [ + 136, + 181 + ], + [ + 194, + 226 + ], + [ + 20, + 107 + ], + [ + 194, + 225 + ], + [ + 194, + 231 + ], + [ + 175, + 216 + ], + [ + 174, + 202 + ], + [ + 131, + 182 + ], + [ + 136, + 192 + ], + [ + 65, + 199 + ], + [ + 19, + 104 + ], + [ + 176, + 202 + ], + [ + 70, + 185 + ], + [ + 24, + 107 + ], + [ + 68, + 244 + ], + [ + 176, + 188 + ], + [ + 210, + 268 + ], + [ + 67, + 239 + ], + [ + 130, + 192 + ], + [ + 194, + 227 + ], + [ + 19, + 106 + ], + [ + 174, + 188 + ], + [ + 68, + 243 + ], + [ + 195, + 291 + ], + [ + 21, + 102 + ], + [ + 201, + 270 + ], + [ + 21, + 108 + ], + [ + 222, + 235 + ], + [ + 203, + 285 + ], + [ + 219, + 261 + ], + [ + 199, + 220 + ], + [ + 135, + 218 + ], + [ + 135, + 182 + ], + [ + 219, + 253 + ], + [ + 26, + 105 + ], + [ + 200, + 220 + ], + [ + 201, + 228 + ], + [ + 23, + 102 + ], + [ + 222, + 234 + ], + [ + 203, + 255 + ], + [ + 216, + 278 + ], + [ + 66, + 244 + ], + [ + 215, + 225 + ], + [ + 207, + 293 + ], + [ + 65, + 198 + ], + [ + 23, + 108 + ], + [ + 22, + 101 + ], + [ + 209, + 303 + ], + [ + 215, + 226 + ], + [ + 210, + 253 + ], + [ + 69, + 195 + ], + [ + 206, + 293 + ], + [ + 69, + 200 + ], + [ + 206, + 303 + ], + [ + 200, + 291 + ], + [ + 70, + 203 + ], + [ + 194, + 243 + ], + [ + 216, + 236 + ], + [ + 18, + 105 + ], + [ + 219, + 258 + ], + [ + 131, + 211 + ], + [ + 70, + 204 + ], + [ + 199, + 298 + ], + [ + 69, + 198 + ], + [ + 195, + 298 + ], + [ + 194, + 244 + ], + [ + 206, + 306 + ], + [ + 232, + 239 + ], + [ + 175, + 230 + ], + [ + 208, + 311 + ], + [ + 204, + 268 + ], + [ + 219, + 271 + ], + [ + 207, + 306 + ], + [ + 206, + 290 + ], + [ + 175, + 229 + ], + [ + 210, + 258 + ], + [ + 207, + 311 + ], + [ + 66, + 239 + ], + [ + 209, + 292 + ], + [ + 198, + 298 + ], + [ + 208, + 290 + ], + [ + 207, + 303 + ], + [ + 65, + 210 + ], + [ + 207, + 292 + ], + [ + 64, + 204 + ], + [ + 207, + 290 + ], + [ + 150, + 164 + ], + [ + 204, + 245 + ], + [ + 70, + 210 + ], + [ + 154, + 164 + ], + [ + 199, + 305 + ], + [ + 204, + 276 + ], + [ + 206, + 292 + ], + [ + 203, + 240 + ], + [ + 226, + 232 + ], + [ + 203, + 279 + ], + [ + 204, + 288 + ], + [ + 228, + 253 + ], + [ + 209, + 311 + ], + [ + 208, + 292 + ], + [ + 215, + 231 + ], + [ + 215, + 227 + ], + [ + 198, + 291 + ], + [ + 213, + 227 + ], + [ + 66, + 203 + ], + [ + 213, + 226 + ], + [ + 63, + 203 + ], + [ + 206, + 311 + ], + [ + 225, + 237 + ], + [ + 208, + 303 + ], + [ + 65, + 195 + ], + [ + 209, + 293 + ], + [ + 208, + 293 + ], + [ + 175, + 234 + ], + [ + 195, + 232 + ], + [ + 200, + 283 + ], + [ + 231, + 232 + ], + [ + 227, + 237 + ], + [ + 209, + 290 + ], + [ + 196, + 316 + ], + [ + 253, + 270 + ], + [ + 236, + 261 + ], + [ + 201, + 230 + ], + [ + 68, + 242 + ], + [ + 209, + 306 + ], + [ + 196, + 317 + ], + [ + 174, + 252 + ], + [ + 198, + 232 + ], + [ + 67, + 242 + ], + [ + 204, + 240 + ], + [ + 237, + 242 + ], + [ + 64, + 210 + ], + [ + 213, + 231 + ], + [ + 205, + 239 + ], + [ + 208, + 306 + ], + [ + 201, + 278 + ], + [ + 175, + 235 + ], + [ + 176, + 252 + ], + [ + 201, + 229 + ], + [ + 176, + 241 + ], + [ + 213, + 225 + ], + [ + 25, + 103 + ], + [ + 219, + 279 + ], + [ + 199, + 232 + ], + [ + 216, + 228 + ], + [ + 216, + 270 + ], + [ + 261, + 278 + ], + [ + 219, + 276 + ], + [ + 200, + 237 + ], + [ + 62, + 191 + ], + [ + 72, + 191 + ], + [ + 210, + 288 + ], + [ + 199, + 282 + ], + [ + 203, + 245 + ], + [ + 204, + 258 + ], + [ + 174, + 241 + ], + [ + 185, + 283 + ], + [ + 210, + 333 + ], + [ + 239, + 335 + ], + [ + 63, + 185 + ], + [ + 66, + 300 + ], + [ + 200, + 274 + ], + [ + 25, + 107 + ], + [ + 216, + 229 + ], + [ + 19, + 107 + ], + [ + 20, + 108 + ], + [ + 24, + 102 + ], + [ + 195, + 237 + ], + [ + 19, + 103 + ], + [ + 64, + 199 + ], + [ + 223, + 287 + ], + [ + 210, + 276 + ], + [ + 71, + 204 + ], + [ + 65, + 239 + ], + [ + 223, + 286 + ], + [ + 216, + 230 + ], + [ + 20, + 102 + ], + [ + 22, + 110 + ], + [ + 212, + 242 + ], + [ + 68, + 308 + ], + [ + 221, + 286 + ], + [ + 66, + 242 + ], + [ + 198, + 237 + ], + [ + 175, + 266 + ], + [ + 68, + 239 + ], + [ + 64, + 200 + ], + [ + 67, + 300 + ], + [ + 175, + 259 + ], + [ + 69, + 242 + ], + [ + 135, + 211 + ], + [ + 221, + 297 + ], + [ + 67, + 331 + ], + [ + 204, + 253 + ], + [ + 26, + 106 + ], + [ + 201, + 234 + ], + [ + 69, + 225 + ], + [ + 200, + 282 + ], + [ + 210, + 261 + ], + [ + 201, + 236 + ], + [ + 70, + 199 + ], + [ + 131, + 189 + ], + [ + 67, + 319 + ], + [ + 205, + 243 + ], + [ + 201, + 235 + ], + [ + 210, + 279 + ], + [ + 69, + 227 + ], + [ + 270, + 271 + ], + [ + 210, + 285 + ], + [ + 205, + 244 + ], + [ + 221, + 302 + ], + [ + 199, + 274 + ], + [ + 210, + 271 + ], + [ + 67, + 310 + ], + [ + 221, + 287 + ], + [ + 27, + 105 + ], + [ + 129, + 181 + ], + [ + 26, + 104 + ], + [ + 21, + 109 + ], + [ + 195, + 282 + ], + [ + 175, + 262 + ], + [ + 228, + 271 + ], + [ + 240, + 351 + ], + [ + 68, + 310 + ], + [ + 220, + 226 + ], + [ + 203, + 271 + ], + [ + 24, + 108 + ], + [ + 239, + 283 + ], + [ + 18, + 104 + ], + [ + 216, + 235 + ], + [ + 67, + 308 + ], + [ + 212, + 226 + ], + [ + 196, + 340 + ], + [ + 236, + 258 + ], + [ + 196, + 342 + ], + [ + 212, + 231 + ], + [ + 216, + 234 + ], + [ + 67, + 309 + ], + [ + 220, + 225 + ], + [ + 223, + 297 + ], + [ + 18, + 106 + ], + [ + 137, + 181 + ], + [ + 69, + 226 + ], + [ + 71, + 203 + ], + [ + 66, + 310 + ], + [ + 205, + 225 + ], + [ + 65, + 227 + ], + [ + 223, + 302 + ], + [ + 21, + 101 + ], + [ + 17, + 105 + ], + [ + 68, + 300 + ], + [ + 245, + 353 + ], + [ + 242, + 305 + ], + [ + 228, + 257 + ], + [ + 226, + 291 + ], + [ + 220, + 227 + ], + [ + 203, + 288 + ], + [ + 258, + 278 + ], + [ + 203, + 250 + ], + [ + 204, + 255 + ], + [ + 130, + 182 + ], + [ + 23, + 109 + ], + [ + 229, + 450 + ], + [ + 228, + 250 + ], + [ + 65, + 231 + ], + [ + 239, + 368 + ], + [ + 67, + 336 + ], + [ + 205, + 227 + ], + [ + 64, + 264 + ], + [ + 68, + 309 + ], + [ + 66, + 309 + ], + [ + 201, + 252 + ], + [ + 65, + 242 + ], + [ + 194, + 239 + ], + [ + 226, + 274 + ], + [ + 65, + 226 + ], + [ + 71, + 210 + ], + [ + 216, + 252 + ], + [ + 185, + 373 + ], + [ + 242, + 407 + ], + [ + 203, + 261 + ], + [ + 175, + 264 + ], + [ + 204, + 285 + ], + [ + 152, + 166 + ], + [ + 230, + 455 + ], + [ + 225, + 274 + ], + [ + 228, + 245 + ], + [ + 200, + 337 + ], + [ + 204, + 257 + ], + [ + 220, + 231 + ], + [ + 230, + 240 + ], + [ + 210, + 363 + ], + [ + 225, + 346 + ], + [ + 212, + 243 + ], + [ + 69, + 231 + ], + [ + 210, + 361 + ], + [ + 241, + 250 + ], + [ + 70, + 200 + ], + [ + 203, + 268 + ], + [ + 203, + 333 + ], + [ + 175, + 299 + ], + [ + 66, + 308 + ], + [ + 229, + 245 + ], + [ + 136, + 182 + ], + [ + 23, + 101 + ], + [ + 65, + 243 + ], + [ + 175, + 301 + ], + [ + 212, + 244 + ], + [ + 233, + 297 + ], + [ + 229, + 240 + ], + [ + 63, + 199 + ], + [ + 196, + 299 + ], + [ + 231, + 335 + ], + [ + 152, + 162 + ], + [ + 230, + 245 + ], + [ + 198, + 274 + ], + [ + 233, + 302 + ], + [ + 233, + 286 + ], + [ + 22, + 100 + ], + [ + 252, + 257 + ], + [ + 227, + 282 + ], + [ + 196, + 304 + ], + [ + 266, + 437 + ], + [ + 69, + 244 + ], + [ + 203, + 253 + ], + [ + 230, + 250 + ], + [ + 129, + 192 + ], + [ + 176, + 246 + ], + [ + 66, + 331 + ], + [ + 225, + 298 + ], + [ + 233, + 287 + ], + [ + 219, + 268 + ], + [ + 234, + 372 + ], + [ + 174, + 254 + ], + [ + 231, + 282 + ], + [ + 219, + 255 + ], + [ + 174, + 316 + ], + [ + 185, + 305 + ], + [ + 69, + 243 + ], + [ + 176, + 317 + ], + [ + 235, + 240 + ], + [ + 137, + 192 + ], + [ + 228, + 377 + ], + [ + 234, + 245 + ], + [ + 175, + 313 + ], + [ + 65, + 225 + ], + [ + 66, + 319 + ], + [ + 205, + 310 + ], + [ + 242, + 346 + ], + [ + 219, + 356 + ], + [ + 236, + 257 + ], + [ + 210, + 364 + ], + [ + 228, + 384 + ], + [ + 62, + 203 + ], + [ + 204, + 333 + ], + [ + 196, + 301 + ], + [ + 73, + 191 + ], + [ + 199, + 337 + ], + [ + 196, + 307 + ], + [ + 242, + 371 + ], + [ + 236, + 250 + ], + [ + 70, + 242 + ], + [ + 175, + 318 + ], + [ + 68, + 331 + ], + [ + 227, + 298 + ], + [ + 227, + 238 + ], + [ + 220, + 244 + ], + [ + 63, + 204 + ], + [ + 229, + 257 + ], + [ + 25, + 102 + ], + [ + 225, + 238 + ], + [ + 227, + 346 + ], + [ + 250, + 266 + ], + [ + 135, + 189 + ], + [ + 205, + 308 + ], + [ + 130, + 218 + ], + [ + 240, + 341 + ], + [ + 69, + 239 + ], + [ + 71, + 185 + ], + [ + 226, + 335 + ], + [ + 244, + 274 + ], + [ + 226, + 238 + ], + [ + 196, + 320 + ], + [ + 195, + 337 + ], + [ + 196, + 313 + ], + [ + 70, + 195 + ], + [ + 72, + 204 + ], + [ + 232, + 323 + ], + [ + 63, + 264 + ], + [ + 175, + 304 + ], + [ + 64, + 235 + ], + [ + 68, + 336 + ], + [ + 229, + 250 + ], + [ + 175, + 307 + ], + [ + 194, + 242 + ], + [ + 204, + 363 + ], + [ + 216, + 241 + ], + [ + 241, + 288 + ], + [ + 19, + 108 + ], + [ + 174, + 214 + ], + [ + 154, + 163 + ], + [ + 26, + 103 + ], + [ + 245, + 344 + ], + [ + 236, + 381 + ], + [ + 70, + 198 + ], + [ + 65, + 235 + ], + [ + 64, + 229 + ], + [ + 230, + 372 + ], + [ + 136, + 218 + ], + [ + 232, + 330 + ], + [ + 203, + 258 + ], + [ + 201, + 341 + ], + [ + 176, + 217 + ], + [ + 64, + 230 + ], + [ + 150, + 165 + ], + [ + 236, + 380 + ], + [ + 270, + 276 + ], + [ + 150, + 163 + ], + [ + 270, + 355 + ], + [ + 198, + 337 + ], + [ + 196, + 318 + ], + [ + 212, + 300 + ], + [ + 224, + 286 + ], + [ + 239, + 382 + ], + [ + 62, + 185 + ], + [ + 231, + 238 + ], + [ + 236, + 387 + ], + [ + 235, + 385 + ], + [ + 237, + 321 + ], + [ + 215, + 244 + ], + [ + 194, + 309 + ], + [ + 154, + 165 + ], + [ + 204, + 261 + ], + [ + 194, + 310 + ], + [ + 196, + 324 + ], + [ + 19, + 102 + ], + [ + 68, + 204 + ], + [ + 26, + 107 + ], + [ + 250, + 341 + ], + [ + 174, + 247 + ], + [ + 237, + 315 + ], + [ + 216, + 344 + ], + [ + 194, + 300 + ], + [ + 219, + 355 + ], + [ + 194, + 331 + ], + [ + 235, + 250 + ], + [ + 203, + 361 + ], + [ + 207, + 427 + ], + [ + 174, + 249 + ], + [ + 278, + 279 + ], + [ + 236, + 240 + ], + [ + 65, + 234 + ], + [ + 230, + 257 + ], + [ + 65, + 266 + ], + [ + 212, + 309 + ], + [ + 174, + 354 + ], + [ + 228, + 394 + ], + [ + 245, + 341 + ], + [ + 224, + 287 + ], + [ + 196, + 467 + ], + [ + 230, + 400 + ], + [ + 201, + 316 + ], + [ + 64, + 234 + ], + [ + 220, + 243 + ], + [ + 65, + 229 + ], + [ + 20, + 109 + ], + [ + 206, + 427 + ], + [ + 213, + 243 + ], + [ + 208, + 408 + ], + [ + 240, + 344 + ], + [ + 61, + 191 + ], + [ + 28, + 105 + ], + [ + 257, + 344 + ], + [ + 18, + 103 + ], + [ + 175, + 320 + ], + [ + 231, + 291 + ], + [ + 66, + 336 + ], + [ + 18, + 107 + ], + [ + 196, + 264 + ], + [ + 63, + 210 + ], + [ + 229, + 372 + ], + [ + 234, + 240 + ], + [ + 235, + 245 + ], + [ + 206, + 408 + ], + [ + 25, + 108 + ], + [ + 209, + 420 + ], + [ + 67, + 229 + ], + [ + 222, + 313 + ], + [ + 176, + 289 + ], + [ + 27, + 106 + ], + [ + 234, + 250 + ], + [ + 234, + 257 + ], + [ + 67, + 234 + ], + [ + 65, + 230 + ], + [ + 201, + 317 + ], + [ + 198, + 386 + ], + [ + 176, + 358 + ], + [ + 66, + 323 + ], + [ + 252, + 255 + ], + [ + 175, + 324 + ], + [ + 66, + 330 + ], + [ + 69, + 234 + ], + [ + 216, + 351 + ], + [ + 194, + 308 + ], + [ + 197, + 509 + ], + [ + 194, + 336 + ], + [ + 229, + 255 + ], + [ + 176, + 210 + ], + [ + 224, + 302 + ], + [ + 69, + 230 + ], + [ + 67, + 230 + ], + [ + 64, + 242 + ], + [ + 20, + 101 + ], + [ + 68, + 321 + ], + [ + 235, + 257 + ], + [ + 224, + 297 + ], + [ + 230, + 268 + ], + [ + 229, + 425 + ], + [ + 278, + 356 + ], + [ + 226, + 283 + ], + [ + 197, + 506 + ], + [ + 203, + 276 + ], + [ + 68, + 315 + ], + [ + 22, + 111 + ], + [ + 229, + 385 + ], + [ + 222, + 318 + ], + [ + 176, + 247 + ], + [ + 69, + 229 + ], + [ + 70, + 230 + ], + [ + 203, + 364 + ], + [ + 70, + 229 + ], + [ + 176, + 354 + ], + [ + 71, + 199 + ], + [ + 286, + 290 + ], + [ + 67, + 264 + ], + [ + 16, + 105 + ], + [ + 207, + 420 + ], + [ + 66, + 321 + ], + [ + 230, + 255 + ], + [ + 174, + 358 + ], + [ + 225, + 305 + ], + [ + 205, + 323 + ], + [ + 199, + 392 + ], + [ + 219, + 374 + ], + [ + 242, + 392 + ], + [ + 207, + 452 + ], + [ + 229, + 268 + ], + [ + 200, + 373 + ], + [ + 64, + 198 + ], + [ + 204, + 432 + ], + [ + 176, + 342 + ], + [ + 208, + 420 + ], + [ + 67, + 410 + ], + [ + 27, + 104 + ], + [ + 241, + 276 + ], + [ + 207, + 408 + ], + [ + 200, + 386 + ], + [ + 204, + 279 + ], + [ + 195, + 386 + ], + [ + 235, + 400 + ], + [ + 209, + 408 + ], + [ + 204, + 271 + ], + [ + 65, + 264 + ], + [ + 222, + 301 + ], + [ + 176, + 248 + ], + [ + 205, + 330 + ], + [ + 208, + 427 + ], + [ + 234, + 255 + ], + [ + 287, + 290 + ], + [ + 206, + 452 + ], + [ + 174, + 340 + ], + [ + 201, + 353 + ], + [ + 69, + 264 + ], + [ + 196, + 489 + ], + [ + 232, + 310 + ], + [ + 231, + 283 + ], + [ + 203, + 383 + ], + [ + 17, + 104 + ], + [ + 199, + 283 + ], + [ + 209, + 427 + ], + [ + 231, + 368 + ], + [ + 196, + 473 + ], + [ + 236, + 356 + ], + [ + 24, + 101 + ], + [ + 72, + 210 + ], + [ + 63, + 200 + ], + [ + 174, + 317 + ], + [ + 227, + 305 + ], + [ + 72, + 203 + ], + [ + 67, + 235 + ], + [ + 64, + 195 + ], + [ + 66, + 315 + ], + [ + 70, + 239 + ], + [ + 210, + 395 + ], + [ + 212, + 315 + ], + [ + 232, + 308 + ], + [ + 21, + 110 + ], + [ + 226, + 368 + ], + [ + 206, + 420 + ], + [ + 235, + 255 + ], + [ + 212, + 321 + ], + [ + 228, + 355 + ], + [ + 176, + 316 + ], + [ + 232, + 243 + ], + [ + 232, + 244 + ] + ], + "temporal_merges": [ + [ + 188, + 188, + 2 + ], + [ + 190, + 190, + 2 + ], + [ + 193, + 193, + 2 + ], + [ + 1024, + 1024, + 4 + ], + [ + 1025, + 1025, + 4 + ], + [ + 202, + 202, + 2 + ], + [ + 1026, + 1026, + 4 + ], + [ + 1029, + 1029, + 4 + ], + [ + 1027, + 1027, + 1 + ], + [ + 1024, + 188, + 4 + ], + [ + 1028, + 1028, + 1 + ], + [ + 1025, + 190, + 4 + ], + [ + 214, + 214, + 2 + ], + [ + 1030, + 1030, + 1 + ], + [ + 1026, + 193, + 4 + ], + [ + 217, + 217, + 2 + ], + [ + 188, + 188, + 4 + ], + [ + 190, + 190, + 4 + ], + [ + 193, + 193, + 4 + ], + [ + 1031, + 1031, + 1 + ], + [ + 188, + 214, + 2 + ], + [ + 1029, + 202, + 4 + ], + [ + 188, + 217, + 2 + ], + [ + 174, + 174, + 3 + ], + [ + 176, + 176, + 3 + ], + [ + 249, + 249, + 2 + ], + [ + 1024, + 214, + 4 + ], + [ + 1024, + 217, + 4 + ], + [ + 190, + 1025, + 4 + ], + [ + 214, + 188, + 2 + ], + [ + 188, + 246, + 2 + ], + [ + 248, + 248, + 2 + ], + [ + 247, + 247, + 2 + ], + [ + 262, + 262, + 2 + ], + [ + 259, + 259, + 2 + ], + [ + 249, + 202, + 2 + ], + [ + 193, + 1026, + 4 + ], + [ + 190, + 251, + 2 + ], + [ + 190, + 256, + 2 + ], + [ + 188, + 254, + 2 + ], + [ + 266, + 266, + 2 + ], + [ + 1033, + 217, + 6 + ], + [ + 1024, + 246, + 4 + ], + [ + 188, + 247, + 2 + ], + [ + 264, + 264, + 2 + ], + [ + 188, + 248, + 2 + ], + [ + 241, + 241, + 2 + ], + [ + 193, + 193, + 6 + ], + [ + 188, + 265, + 2 + ], + [ + 214, + 214, + 3 + ], + [ + 252, + 252, + 2 + ], + [ + 1025, + 190, + 6 + ], + [ + 289, + 289, + 2 + ], + [ + 67, + 67, + 1 + ], + [ + 174, + 174, + 4 + ], + [ + 1024, + 254, + 4 + ], + [ + 188, + 267, + 2 + ], + [ + 176, + 176, + 4 + ], + [ + 246, + 246, + 2 + ], + [ + 260, + 260, + 3 + ], + [ + 190, + 269, + 2 + ], + [ + 66, + 66, + 1 + ], + [ + 1025, + 251, + 4 + ], + [ + 1024, + 247, + 4 + ], + [ + 1026, + 193, + 6 + ], + [ + 1025, + 256, + 4 + ], + [ + 1024, + 248, + 4 + ], + [ + 190, + 272, + 2 + ], + [ + 190, + 273, + 2 + ], + [ + 326, + 326, + 1 + ], + [ + 1039, + 217, + 4 + ], + [ + 1033, + 214, + 6 + ], + [ + 251, + 251, + 2 + ], + [ + 1024, + 265, + 4 + ], + [ + 202, + 202, + 4 + ], + [ + 230, + 230, + 2 + ], + [ + 68, + 68, + 1 + ], + [ + 1035, + 256, + 6 + ], + [ + 229, + 229, + 2 + ], + [ + 71, + 71, + 1 + ], + [ + 190, + 295, + 2 + ], + [ + 242, + 242, + 2 + ], + [ + 65, + 65, + 1 + ], + [ + 254, + 254, + 2 + ], + [ + 1035, + 251, + 6 + ], + [ + 256, + 256, + 2 + ], + [ + 1036, + 214, + 4 + ], + [ + 70, + 70, + 1 + ], + [ + 202, + 249, + 2 + ], + [ + 267, + 267, + 2 + ], + [ + 193, + 275, + 2 + ], + [ + 1033, + 246, + 6 + ], + [ + 64, + 64, + 1 + ], + [ + 262, + 217, + 2 + ], + [ + 281, + 281, + 3 + ], + [ + 329, + 329, + 2 + ], + [ + 235, + 235, + 3 + ], + [ + 62, + 62, + 1 + ], + [ + 193, + 277, + 2 + ], + [ + 319, + 319, + 1 + ], + [ + 63, + 63, + 1 + ], + [ + 234, + 234, + 3 + ], + [ + 1024, + 267, + 4 + ], + [ + 193, + 280, + 2 + ], + [ + 193, + 260, + 2 + ], + [ + 1025, + 272, + 4 + ], + [ + 1025, + 273, + 4 + ], + [ + 190, + 312, + 2 + ], + [ + 1025, + 269, + 4 + ], + [ + 193, + 284, + 2 + ], + [ + 214, + 214, + 4 + ], + [ + 190, + 314, + 2 + ], + [ + 69, + 69, + 1 + ], + [ + 1027, + 1033, + 3 + ], + [ + 322, + 322, + 2 + ], + [ + 73, + 73, + 1 + ], + [ + 339, + 339, + 2 + ], + [ + 239, + 239, + 2 + ], + [ + 277, + 277, + 3 + ], + [ + 265, + 265, + 2 + ], + [ + 193, + 294, + 2 + ], + [ + 217, + 217, + 3 + ], + [ + 1025, + 295, + 4 + ], + [ + 196, + 196, + 2 + ], + [ + 72, + 72, + 1 + ], + [ + 193, + 296, + 2 + ], + [ + 275, + 275, + 3 + ], + [ + 193, + 281, + 2 + ], + [ + 1027, + 1033, + 1 + ], + [ + 202, + 289, + 2 + ], + [ + 283, + 283, + 2 + ], + [ + 210, + 210, + 2 + ], + [ + 315, + 315, + 2 + ], + [ + 249, + 1029, + 2 + ], + [ + 175, + 175, + 2 + ], + [ + 1035, + 273, + 6 + ], + [ + 1035, + 272, + 6 + ], + [ + 280, + 280, + 3 + ], + [ + 352, + 352, + 2 + ], + [ + 61, + 61, + 1 + ], + [ + 259, + 259, + 3 + ], + [ + 1035, + 269, + 6 + ], + [ + 325, + 325, + 2 + ], + [ + 332, + 332, + 2 + ], + [ + 1026, + 275, + 4 + ], + [ + 1025, + 312, + 4 + ], + [ + 260, + 260, + 2 + ], + [ + 188, + 1039, + 2 + ], + [ + 284, + 284, + 3 + ], + [ + 1025, + 314, + 4 + ], + [ + 321, + 321, + 2 + ], + [ + 323, + 323, + 2 + ], + [ + 251, + 251, + 3 + ], + [ + 285, + 285, + 2 + ], + [ + 304, + 304, + 2 + ], + [ + 1035, + 295, + 6 + ], + [ + 188, + 345, + 2 + ], + [ + 1033, + 254, + 6 + ], + [ + 237, + 237, + 2 + ], + [ + 307, + 307, + 2 + ], + [ + 1033, + 247, + 6 + ], + [ + 188, + 350, + 2 + ], + [ + 1033, + 248, + 6 + ], + [ + 1026, + 277, + 4 + ], + [ + 1026, + 260, + 4 + ], + [ + 272, + 272, + 2 + ], + [ + 299, + 299, + 2 + ], + [ + 378, + 378, + 2 + ], + [ + 236, + 236, + 2 + ], + [ + 288, + 288, + 2 + ], + [ + 269, + 269, + 2 + ], + [ + 347, + 347, + 2 + ], + [ + 301, + 301, + 2 + ], + [ + 273, + 273, + 2 + ], + [ + 66, + 67, + 1 + ], + [ + 330, + 330, + 2 + ], + [ + 1026, + 281, + 4 + ], + [ + 230, + 230, + 3 + ], + [ + 1040, + 217, + 2 + ], + [ + 1026, + 284, + 4 + ], + [ + 334, + 334, + 2 + ], + [ + 1026, + 280, + 4 + ], + [ + 343, + 343, + 2 + ], + [ + 327, + 327, + 2 + ], + [ + 259, + 214, + 2 + ], + [ + 216, + 216, + 2 + ], + [ + 229, + 229, + 3 + ], + [ + 309, + 309, + 2 + ], + [ + 305, + 305, + 2 + ], + [ + 270, + 270, + 2 + ], + [ + 201, + 201, + 2 + ], + [ + 1030, + 1038, + 3 + ], + [ + 1040, + 214, + 2 + ], + [ + 256, + 256, + 3 + ], + [ + 1030, + 1038, + 1 + ], + [ + 1035, + 312, + 6 + ], + [ + 1029, + 289, + 4 + ], + [ + 225, + 225, + 2 + ], + [ + 328, + 328, + 2 + ], + [ + 235, + 235, + 2 + ], + [ + 200, + 200, + 2 + ], + [ + 244, + 244, + 2 + ], + [ + 1035, + 314, + 6 + ], + [ + 188, + 365, + 2 + ], + [ + 338, + 338, + 2 + ], + [ + 174, + 174, + 5 + ], + [ + 188, + 1036, + 2 + ], + [ + 300, + 300, + 2 + ], + [ + 234, + 234, + 2 + ], + [ + 188, + 366, + 2 + ], + [ + 1026, + 294, + 4 + ], + [ + 247, + 247, + 3 + ], + [ + 248, + 248, + 3 + ], + [ + 1026, + 296, + 4 + ], + [ + 176, + 176, + 5 + ], + [ + 1027, + 1024, + 5 + ], + [ + 232, + 232, + 2 + ], + [ + 258, + 258, + 2 + ], + [ + 266, + 266, + 1 + ], + [ + 1033, + 265, + 6 + ], + [ + 64, + 65, + 1 + ], + [ + 262, + 262, + 3 + ], + [ + 253, + 253, + 2 + ], + [ + 246, + 246, + 3 + ], + [ + 360, + 360, + 2 + ], + [ + 199, + 199, + 2 + ], + [ + 243, + 243, + 2 + ], + [ + 68, + 69, + 1 + ], + [ + 1038, + 1030, + 1 + ], + [ + 202, + 349, + 2 + ], + [ + 195, + 195, + 2 + ], + [ + 294, + 294, + 2 + ], + [ + 399, + 399, + 2 + ], + [ + 296, + 296, + 2 + ], + [ + 281, + 281, + 2 + ], + [ + 188, + 188, + 1 + ], + [ + 428, + 428, + 2 + ], + [ + 357, + 357, + 2 + ], + [ + 174, + 174, + 2 + ], + [ + 269, + 190, + 2 + ], + [ + 62, + 63, + 1 + ], + [ + 1027, + 1024, + 3 + ], + [ + 176, + 176, + 2 + ], + [ + 398, + 398, + 2 + ], + [ + 277, + 277, + 4 + ], + [ + 245, + 245, + 2 + ], + [ + 326, + 326, + 2 + ], + [ + 275, + 275, + 2 + ], + [ + 227, + 227, + 2 + ], + [ + 254, + 254, + 3 + ], + [ + 1029, + 249, + 4 + ], + [ + 70, + 71, + 1 + ], + [ + 261, + 261, + 2 + ], + [ + 264, + 264, + 1 + ], + [ + 251, + 251, + 4 + ], + [ + 278, + 278, + 2 + ], + [ + 228, + 228, + 2 + ], + [ + 205, + 205, + 2 + ], + [ + 74, + 74, + 1 + ], + [ + 280, + 280, + 2 + ], + [ + 240, + 240, + 2 + ], + [ + 317, + 317, + 2 + ], + [ + 313, + 313, + 2 + ], + [ + 217, + 188, + 2 + ], + [ + 1033, + 267, + 6 + ], + [ + 241, + 241, + 3 + ], + [ + 410, + 410, + 1 + ], + [ + 316, + 316, + 2 + ], + [ + 1040, + 246, + 2 + ], + [ + 320, + 320, + 2 + ], + [ + 308, + 308, + 2 + ], + [ + 359, + 359, + 2 + ], + [ + 1041, + 256, + 2 + ], + [ + 249, + 352, + 2 + ], + [ + 413, + 413, + 2 + ], + [ + 348, + 348, + 2 + ], + [ + 390, + 390, + 2 + ], + [ + 251, + 190, + 2 + ], + [ + 217, + 322, + 2 + ], + [ + 438, + 438, + 2 + ], + [ + 226, + 226, + 2 + ], + [ + 1036, + 1036, + 4 + ], + [ + 1024, + 345, + 4 + ], + [ + 370, + 370, + 2 + ], + [ + 454, + 454, + 1 + ], + [ + 279, + 279, + 2 + ], + [ + 60, + 60, + 1 + ], + [ + 1024, + 350, + 4 + ], + [ + 466, + 466, + 1 + ], + [ + 419, + 419, + 2 + ], + [ + 273, + 190, + 2 + ], + [ + 1041, + 269, + 2 + ], + [ + 257, + 257, + 2 + ], + [ + 260, + 260, + 4 + ], + [ + 202, + 367, + 2 + ], + [ + 418, + 418, + 2 + ], + [ + 65, + 66, + 1 + ], + [ + 272, + 190, + 2 + ], + [ + 284, + 284, + 4 + ], + [ + 242, + 242, + 1 + ], + [ + 451, + 451, + 2 + ], + [ + 72, + 71, + 1 + ], + [ + 256, + 190, + 2 + ], + [ + 202, + 354, + 2 + ], + [ + 204, + 204, + 2 + ], + [ + 406, + 406, + 2 + ], + [ + 198, + 198, + 2 + ], + [ + 430, + 430, + 2 + ], + [ + 369, + 369, + 2 + ], + [ + 271, + 271, + 2 + ], + [ + 202, + 358, + 2 + ], + [ + 268, + 268, + 2 + ], + [ + 1049, + 249, + 4 + ], + [ + 331, + 331, + 1 + ], + [ + 422, + 422, + 2 + ], + [ + 252, + 252, + 3 + ], + [ + 246, + 188, + 2 + ], + [ + 480, + 480, + 2 + ], + [ + 193, + 193, + 1 + ], + [ + 319, + 319, + 2 + ], + [ + 202, + 376, + 2 + ], + [ + 214, + 214, + 1 + ], + [ + 1040, + 247, + 2 + ], + [ + 1041, + 272, + 2 + ], + [ + 444, + 444, + 2 + ], + [ + 433, + 433, + 2 + ], + [ + 1041, + 273, + 2 + ], + [ + 174, + 174, + 6 + ], + [ + 324, + 324, + 2 + ], + [ + 440, + 440, + 2 + ], + [ + 1045, + 289, + 6 + ], + [ + 318, + 318, + 2 + ], + [ + 1040, + 248, + 2 + ], + [ + 217, + 262, + 2 + ], + [ + 1027, + 214, + 3 + ], + [ + 336, + 336, + 1 + ], + [ + 1024, + 365, + 4 + ], + [ + 185, + 185, + 2 + ], + [ + 310, + 310, + 2 + ], + [ + 1024, + 366, + 4 + ], + [ + 219, + 219, + 2 + ], + [ + 436, + 436, + 2 + ], + [ + 1027, + 214, + 1 + ], + [ + 67, + 68, + 1 + ], + [ + 234, + 234, + 4 + ], + [ + 231, + 231, + 2 + ], + [ + 235, + 235, + 4 + ], + [ + 1038, + 275, + 6 + ], + [ + 176, + 176, + 6 + ], + [ + 276, + 276, + 2 + ], + [ + 1040, + 254, + 2 + ], + [ + 247, + 188, + 2 + ], + [ + 1024, + 1039, + 4 + ], + [ + 248, + 188, + 2 + ], + [ + 1047, + 1047, + 2 + ], + [ + 1041, + 251, + 2 + ], + [ + 266, + 266, + 3 + ], + [ + 254, + 188, + 2 + ], + [ + 478, + 478, + 1 + ], + [ + 265, + 265, + 3 + ], + [ + 181, + 181, + 1 + ], + [ + 412, + 412, + 2 + ], + [ + 371, + 371, + 2 + ], + [ + 362, + 362, + 2 + ], + [ + 446, + 446, + 2 + ], + [ + 230, + 230, + 4 + ], + [ + 70, + 69, + 1 + ], + [ + 250, + 250, + 2 + ], + [ + 448, + 448, + 2 + ], + [ + 62, + 61, + 1 + ], + [ + 262, + 329, + 2 + ], + [ + 1028, + 256, + 3 + ], + [ + 1029, + 349, + 4 + ], + [ + 332, + 332, + 3 + ], + [ + 229, + 229, + 4 + ], + [ + 396, + 396, + 2 + ], + [ + 64, + 63, + 1 + ], + [ + 217, + 217, + 4 + ], + [ + 190, + 379, + 2 + ], + [ + 286, + 286, + 2 + ], + [ + 1028, + 256, + 1 + ], + [ + 269, + 269, + 3 + ], + [ + 416, + 416, + 2 + ], + [ + 260, + 193, + 2 + ], + [ + 1048, + 1048, + 2 + ], + [ + 294, + 193, + 2 + ], + [ + 241, + 241, + 1 + ], + [ + 267, + 267, + 3 + ], + [ + 194, + 194, + 2 + ], + [ + 402, + 402, + 2 + ], + [ + 325, + 214, + 2 + ], + [ + 457, + 457, + 2 + ], + [ + 264, + 264, + 3 + ], + [ + 239, + 239, + 1 + ], + [ + 296, + 193, + 2 + ], + [ + 404, + 404, + 2 + ], + [ + 280, + 193, + 2 + ], + [ + 255, + 255, + 2 + ], + [ + 287, + 287, + 2 + ], + [ + 295, + 295, + 2 + ], + [ + 1028, + 251, + 3 + ], + [ + 272, + 272, + 3 + ], + [ + 340, + 340, + 2 + ], + [ + 1039, + 1039, + 4 + ], + [ + 220, + 220, + 2 + ], + [ + 354, + 354, + 2 + ], + [ + 442, + 442, + 2 + ], + [ + 190, + 388, + 2 + ], + [ + 1027, + 214, + 5 + ], + [ + 304, + 304, + 3 + ], + [ + 1028, + 256, + 5 + ], + [ + 1038, + 277, + 6 + ], + [ + 1038, + 281, + 6 + ], + [ + 434, + 434, + 2 + ], + [ + 417, + 417, + 2 + ], + [ + 273, + 273, + 3 + ], + [ + 297, + 297, + 2 + ], + [ + 342, + 342, + 2 + ], + [ + 299, + 299, + 3 + ], + [ + 182, + 182, + 1 + ], + [ + 1041, + 295, + 2 + ], + [ + 214, + 259, + 2 + ], + [ + 315, + 315, + 1 + ], + [ + 1045, + 249, + 6 + ], + [ + 382, + 382, + 2 + ], + [ + 1025, + 379, + 4 + ], + [ + 72, + 73, + 1 + ], + [ + 1028, + 251, + 1 + ], + [ + 1028, + 251, + 5 + ], + [ + 307, + 307, + 3 + ], + [ + 1027, + 217, + 5 + ], + [ + 381, + 381, + 2 + ], + [ + 1027, + 217, + 3 + ], + [ + 358, + 358, + 2 + ], + [ + 374, + 374, + 2 + ], + [ + 1038, + 284, + 6 + ], + [ + 109, + 109, + 1 + ], + [ + 1040, + 265, + 2 + ], + [ + 210, + 210, + 1 + ], + [ + 283, + 283, + 1 + ], + [ + 275, + 275, + 4 + ], + [ + 277, + 277, + 2 + ], + [ + 1056, + 247, + 4 + ], + [ + 323, + 323, + 1 + ], + [ + 252, + 252, + 1 + ], + [ + 1038, + 260, + 6 + ], + [ + 375, + 375, + 2 + ], + [ + 465, + 465, + 2 + ], + [ + 1055, + 248, + 4 + ], + [ + 301, + 301, + 3 + ], + [ + 1042, + 280, + 2 + ], + [ + 294, + 294, + 3 + ], + [ + 343, + 343, + 3 + ], + [ + 392, + 392, + 2 + ], + [ + 1025, + 388, + 4 + ], + [ + 202, + 397, + 2 + ], + [ + 174, + 174, + 7 + ], + [ + 296, + 296, + 3 + ], + [ + 1076, + 289, + 4 + ], + [ + 1040, + 267, + 2 + ], + [ + 302, + 302, + 2 + ], + [ + 373, + 373, + 2 + ], + [ + 265, + 188, + 2 + ], + [ + 328, + 214, + 2 + ], + [ + 212, + 212, + 2 + ], + [ + 432, + 432, + 2 + ], + [ + 281, + 281, + 4 + ], + [ + 327, + 327, + 3 + ], + [ + 190, + 401, + 2 + ], + [ + 202, + 1059, + 2 + ], + [ + 1041, + 312, + 2 + ], + [ + 259, + 254, + 2 + ], + [ + 267, + 188, + 2 + ], + [ + 510, + 510, + 2 + ], + [ + 201, + 201, + 3 + ], + [ + 176, + 176, + 7 + ], + [ + 217, + 217, + 1 + ], + [ + 352, + 249, + 2 + ], + [ + 262, + 246, + 2 + ], + [ + 17, + 17, + 1 + ], + [ + 321, + 321, + 1 + ], + [ + 253, + 253, + 3 + ], + [ + 1027, + 217, + 1 + ], + [ + 66, + 66, + 2 + ], + [ + 1038, + 280, + 6 + ], + [ + 208, + 208, + 2 + ], + [ + 1041, + 314, + 2 + ], + [ + 347, + 246, + 2 + ], + [ + 1033, + 1027, + 1 + ], + [ + 106, + 106, + 1 + ], + [ + 259, + 1036, + 2 + ], + [ + 236, + 236, + 3 + ], + [ + 237, + 237, + 1 + ], + [ + 259, + 339, + 2 + ], + [ + 256, + 256, + 4 + ], + [ + 275, + 193, + 2 + ], + [ + 314, + 190, + 2 + ], + [ + 258, + 258, + 3 + ], + [ + 322, + 329, + 2 + ], + [ + 349, + 349, + 2 + ], + [ + 214, + 1024, + 2 + ], + [ + 292, + 292, + 2 + ], + [ + 1029, + 367, + 4 + ], + [ + 277, + 193, + 2 + ], + [ + 295, + 190, + 2 + ], + [ + 100, + 100, + 1 + ], + [ + 393, + 393, + 2 + ], + [ + 232, + 205, + 2 + ], + [ + 330, + 330, + 1 + ], + [ + 312, + 190, + 2 + ], + [ + 383, + 383, + 2 + ], + [ + 175, + 175, + 3 + ], + [ + 313, + 313, + 3 + ], + [ + 244, + 244, + 1 + ], + [ + 284, + 193, + 2 + ], + [ + 1029, + 376, + 4 + ], + [ + 508, + 508, + 2 + ], + [ + 325, + 325, + 3 + ], + [ + 1044, + 1027, + 1 + ], + [ + 216, + 216, + 3 + ], + [ + 334, + 334, + 3 + ], + [ + 1028, + 1035, + 1 + ], + [ + 202, + 1049, + 2 + ], + [ + 70, + 70, + 2 + ], + [ + 337, + 337, + 2 + ], + [ + 1027, + 1044, + 3 + ], + [ + 67, + 67, + 2 + ], + [ + 68, + 68, + 2 + ], + [ + 1025, + 401, + 4 + ], + [ + 389, + 389, + 2 + ], + [ + 1028, + 1035, + 3 + ], + [ + 391, + 391, + 2 + ], + [ + 305, + 305, + 1 + ], + [ + 357, + 214, + 2 + ], + [ + 209, + 209, + 2 + ], + [ + 320, + 320, + 3 + ], + [ + 394, + 394, + 2 + ], + [ + 476, + 476, + 2 + ], + [ + 1042, + 260, + 2 + ], + [ + 203, + 203, + 2 + ], + [ + 328, + 328, + 3 + ], + [ + 60, + 61, + 1 + ], + [ + 429, + 429, + 2 + ], + [ + 461, + 461, + 2 + ], + [ + 487, + 487, + 2 + ], + [ + 1029, + 354, + 4 + ], + [ + 284, + 284, + 2 + ], + [ + 360, + 360, + 3 + ], + [ + 475, + 475, + 2 + ], + [ + 338, + 338, + 3 + ], + [ + 285, + 285, + 1 + ], + [ + 367, + 367, + 2 + ], + [ + 327, + 214, + 2 + ], + [ + 348, + 214, + 2 + ], + [ + 1038, + 296, + 6 + ], + [ + 502, + 502, + 2 + ], + [ + 270, + 270, + 3 + ], + [ + 281, + 193, + 2 + ], + [ + 355, + 355, + 2 + ], + [ + 1038, + 294, + 6 + ], + [ + 411, + 411, + 2 + ], + [ + 74, + 73, + 1 + ], + [ + 22, + 22, + 1 + ], + [ + 234, + 234, + 5 + ], + [ + 1042, + 275, + 2 + ], + [ + 1027, + 1044, + 1 + ], + [ + 1029, + 358, + 4 + ], + [ + 243, + 243, + 1 + ], + [ + 261, + 261, + 3 + ], + [ + 75, + 75, + 1 + ], + [ + 485, + 485, + 2 + ], + [ + 1047, + 174, + 6 + ], + [ + 346, + 346, + 2 + ], + [ + 356, + 356, + 2 + ], + [ + 322, + 217, + 2 + ], + [ + 481, + 481, + 2 + ], + [ + 65, + 65, + 2 + ], + [ + 269, + 269, + 4 + ], + [ + 551, + 551, + 2 + ], + [ + 378, + 378, + 1 + ], + [ + 188, + 188, + 3 + ], + [ + 248, + 248, + 4 + ], + [ + 1025, + 414, + 4 + ], + [ + 272, + 272, + 4 + ], + [ + 247, + 247, + 4 + ], + [ + 235, + 235, + 5 + ], + [ + 1042, + 294, + 2 + ], + [ + 240, + 240, + 3 + ], + [ + 1027, + 246, + 3 + ], + [ + 1042, + 277, + 2 + ], + [ + 1024, + 1036, + 4 + ], + [ + 359, + 217, + 2 + ], + [ + 190, + 414, + 2 + ], + [ + 105, + 105, + 1 + ], + [ + 1042, + 296, + 2 + ], + [ + 102, + 102, + 1 + ], + [ + 1027, + 246, + 5 + ], + [ + 339, + 339, + 3 + ], + [ + 309, + 309, + 1 + ], + [ + 1059, + 249, + 4 + ], + [ + 228, + 228, + 3 + ], + [ + 464, + 464, + 2 + ], + [ + 415, + 415, + 2 + ], + [ + 364, + 364, + 2 + ], + [ + 506, + 506, + 2 + ], + [ + 1077, + 1077, + 2 + ], + [ + 329, + 329, + 3 + ], + [ + 273, + 273, + 4 + ], + [ + 108, + 108, + 1 + ], + [ + 597, + 597, + 1 + ], + [ + 1050, + 1027, + 1 + ], + [ + 1048, + 176, + 6 + ], + [ + 335, + 335, + 2 + ], + [ + 197, + 197, + 2 + ], + [ + 245, + 245, + 3 + ], + [ + 324, + 324, + 3 + ], + [ + 318, + 318, + 3 + ], + [ + 1093, + 326, + 2 + ], + [ + 1027, + 1050, + 1 + ], + [ + 69, + 69, + 2 + ], + [ + 280, + 280, + 4 + ], + [ + 333, + 333, + 2 + ], + [ + 200, + 200, + 1 + ], + [ + 28, + 28, + 1 + ], + [ + 188, + 262, + 2 + ], + [ + 1042, + 284, + 2 + ], + [ + 110, + 110, + 1 + ], + [ + 1035, + 1028, + 1 + ], + [ + 249, + 249, + 4 + ], + [ + 1027, + 1051, + 3 + ], + [ + 300, + 300, + 1 + ], + [ + 251, + 251, + 5 + ], + [ + 260, + 260, + 5 + ], + [ + 363, + 363, + 2 + ], + [ + 225, + 225, + 1 + ], + [ + 368, + 368, + 2 + ], + [ + 1103, + 71, + 2 + ], + [ + 1031, + 1045, + 1 + ], + [ + 230, + 230, + 5 + ], + [ + 190, + 426, + 2 + ], + [ + 1057, + 262, + 4 + ], + [ + 1027, + 1051, + 1 + ], + [ + 509, + 509, + 2 + ], + [ + 398, + 398, + 1 + ], + [ + 1030, + 1026, + 5 + ], + [ + 288, + 288, + 3 + ], + [ + 452, + 452, + 2 + ], + [ + 361, + 361, + 2 + ], + [ + 202, + 202, + 1 + ], + [ + 63, + 64, + 1 + ], + [ + 278, + 278, + 3 + ], + [ + 229, + 229, + 5 + ], + [ + 190, + 431, + 2 + ], + [ + 463, + 463, + 2 + ], + [ + 370, + 370, + 3 + ], + [ + 1028, + 273, + 3 + ], + [ + 1025, + 426, + 4 + ], + [ + 65, + 1085, + 1 + ], + [ + 395, + 395, + 2 + ], + [ + 1033, + 345, + 6 + ], + [ + 1028, + 273, + 1 + ], + [ + 334, + 217, + 2 + ], + [ + 1024, + 1024, + 1 + ], + [ + 271, + 271, + 3 + ], + [ + 1033, + 350, + 6 + ], + [ + 1049, + 1049, + 4 + ], + [ + 1029, + 397, + 4 + ], + [ + 317, + 317, + 3 + ], + [ + 353, + 353, + 3 + ], + [ + 59, + 59, + 1 + ], + [ + 1028, + 273, + 5 + ], + [ + 1058, + 259, + 4 + ], + [ + 1024, + 188, + 1 + ], + [ + 1042, + 281, + 2 + ], + [ + 493, + 493, + 2 + ], + [ + 316, + 316, + 3 + ], + [ + 498, + 498, + 2 + ], + [ + 232, + 232, + 1 + ], + [ + 196, + 196, + 3 + ], + [ + 1027, + 246, + 1 + ], + [ + 1025, + 431, + 4 + ], + [ + 1031, + 1045, + 3 + ], + [ + 470, + 470, + 2 + ], + [ + 103, + 103, + 1 + ], + [ + 436, + 289, + 2 + ], + [ + 561, + 561, + 1 + ], + [ + 312, + 312, + 2 + ], + [ + 471, + 471, + 2 + ], + [ + 422, + 422, + 1 + ], + [ + 459, + 459, + 2 + ], + [ + 332, + 332, + 4 + ], + [ + 238, + 238, + 2 + ], + [ + 1028, + 272, + 5 + ], + [ + 18, + 18, + 1 + ], + [ + 27, + 27, + 1 + ], + [ + 1028, + 272, + 1 + ], + [ + 195, + 195, + 1 + ], + [ + 445, + 445, + 2 + ], + [ + 101, + 101, + 1 + ], + [ + 338, + 217, + 2 + ], + [ + 503, + 503, + 2 + ], + [ + 380, + 380, + 2 + ], + [ + 107, + 107, + 1 + ], + [ + 279, + 279, + 3 + ], + [ + 1027, + 1046, + 3 + ], + [ + 1028, + 269, + 1 + ], + [ + 336, + 336, + 2 + ], + [ + 331, + 331, + 2 + ], + [ + 351, + 351, + 3 + ], + [ + 483, + 483, + 2 + ], + [ + 269, + 251, + 1 + ], + [ + 413, + 413, + 1 + ], + [ + 635, + 635, + 1 + ], + [ + 486, + 486, + 2 + ], + [ + 256, + 256, + 5 + ], + [ + 516, + 516, + 2 + ], + [ + 1139, + 73, + 2 + ], + [ + 295, + 295, + 3 + ], + [ + 526, + 526, + 2 + ], + [ + 1028, + 269, + 5 + ], + [ + 569, + 569, + 2 + ], + [ + 319, + 410, + 1 + ], + [ + 266, + 438, + 2 + ], + [ + 570, + 570, + 2 + ], + [ + 199, + 199, + 1 + ], + [ + 437, + 437, + 2 + ], + [ + 314, + 314, + 2 + ], + [ + 64, + 1106, + 1 + ], + [ + 504, + 504, + 2 + ], + [ + 1027, + 1050, + 3 + ], + [ + 1028, + 272, + 3 + ], + [ + 1027, + 188, + 5 + ], + [ + 246, + 217, + 2 + ], + [ + 1026, + 409, + 4 + ], + [ + 327, + 248, + 2 + ], + [ + 193, + 403, + 2 + ], + [ + 276, + 276, + 3 + ], + [ + 535, + 535, + 2 + ], + [ + 26, + 26, + 1 + ], + [ + 214, + 1044, + 2 + ], + [ + 23, + 23, + 1 + ], + [ + 328, + 247, + 2 + ], + [ + 500, + 500, + 2 + ], + [ + 322, + 322, + 3 + ], + [ + 377, + 377, + 2 + ], + [ + 193, + 409, + 2 + ], + [ + 405, + 405, + 2 + ], + [ + 242, + 242, + 3 + ], + [ + 433, + 433, + 1 + ], + [ + 194, + 212, + 2 + ], + [ + 241, + 241, + 4 + ], + [ + 1028, + 269, + 3 + ], + [ + 492, + 492, + 2 + ], + [ + 505, + 505, + 2 + ], + [ + 1026, + 403, + 4 + ], + [ + 254, + 259, + 2 + ], + [ + 262, + 1039, + 2 + ], + [ + 285, + 285, + 3 + ], + [ + 16, + 16, + 1 + ], + [ + 1036, + 188, + 4 + ], + [ + 407, + 407, + 2 + ], + [ + 210, + 210, + 3 + ], + [ + 219, + 219, + 3 + ], + [ + 308, + 308, + 1 + ], + [ + 69, + 70, + 1 + ], + [ + 251, + 269, + 1 + ], + [ + 349, + 202, + 2 + ], + [ + 362, + 217, + 2 + ], + [ + 191, + 191, + 2 + ], + [ + 634, + 634, + 1 + ], + [ + 227, + 227, + 1 + ], + [ + 347, + 265, + 2 + ], + [ + 387, + 387, + 2 + ], + [ + 294, + 294, + 4 + ], + [ + 480, + 620, + 2 + ], + [ + 1077, + 67, + 2 + ], + [ + 71, + 71, + 2 + ], + [ + 226, + 226, + 1 + ], + [ + 1027, + 1065, + 1 + ], + [ + 293, + 293, + 2 + ], + [ + 268, + 268, + 3 + ], + [ + 216, + 216, + 1 + ], + [ + 497, + 497, + 2 + ], + [ + 1027, + 1046, + 5 + ], + [ + 466, + 326, + 1 + ], + [ + 609, + 609, + 2 + ], + [ + 418, + 418, + 1 + ], + [ + 375, + 214, + 2 + ], + [ + 128, + 128, + 1 + ], + [ + 660, + 660, + 1 + ], + [ + 341, + 341, + 3 + ], + [ + 514, + 514, + 2 + ], + [ + 260, + 280, + 1 + ], + [ + 384, + 384, + 2 + ], + [ + 222, + 222, + 2 + ], + [ + 621, + 621, + 1 + ], + [ + 1033, + 366, + 6 + ], + [ + 1033, + 365, + 6 + ], + [ + 64, + 64, + 2 + ], + [ + 419, + 419, + 1 + ], + [ + 296, + 296, + 4 + ], + [ + 1030, + 275, + 3 + ], + [ + 299, + 299, + 4 + ], + [ + 264, + 428, + 2 + ], + [ + 376, + 376, + 2 + ], + [ + 24, + 24, + 1 + ], + [ + 1030, + 275, + 1 + ], + [ + 1027, + 247, + 1 + ], + [ + 528, + 528, + 2 + ], + [ + 1074, + 252, + 4 + ], + [ + 1035, + 379, + 6 + ], + [ + 519, + 519, + 2 + ], + [ + 325, + 265, + 2 + ], + [ + 1030, + 275, + 5 + ], + [ + 202, + 1076, + 2 + ], + [ + 340, + 340, + 3 + ], + [ + 1027, + 248, + 1 + ], + [ + 446, + 446, + 1 + ], + [ + 512, + 512, + 2 + ], + [ + 586, + 586, + 1 + ], + [ + 104, + 104, + 1 + ], + [ + 19, + 19, + 1 + ], + [ + 304, + 304, + 4 + ], + [ + 254, + 214, + 2 + ], + [ + 423, + 423, + 2 + ], + [ + 339, + 259, + 2 + ], + [ + 198, + 198, + 1 + ], + [ + 472, + 472, + 2 + ], + [ + 359, + 359, + 3 + ], + [ + 66, + 67, + 2 + ], + [ + 307, + 307, + 4 + ], + [ + 196, + 196, + 1 + ], + [ + 1064, + 266, + 4 + ], + [ + 288, + 288, + 1 + ], + [ + 62, + 1124, + 1 + ], + [ + 390, + 390, + 1 + ], + [ + 424, + 424, + 2 + ], + [ + 1065, + 1027, + 1 + ], + [ + 585, + 585, + 1 + ], + [ + 306, + 306, + 2 + ], + [ + 280, + 260, + 1 + ], + [ + 584, + 584, + 1 + ], + [ + 582, + 582, + 1 + ], + [ + 412, + 249, + 2 + ], + [ + 310, + 310, + 1 + ], + [ + 255, + 255, + 3 + ], + [ + 444, + 444, + 1 + ], + [ + 430, + 430, + 1 + ], + [ + 603, + 603, + 2 + ], + [ + 1030, + 280, + 1 + ], + [ + 193, + 447, + 2 + ], + [ + 315, + 315, + 3 + ], + [ + 1070, + 241, + 4 + ], + [ + 1040, + 345, + 2 + ], + [ + 325, + 1036, + 2 + ], + [ + 234, + 234, + 6 + ], + [ + 1027, + 1044, + 5 + ], + [ + 62, + 1163, + 1 + ], + [ + 99, + 99, + 1 + ], + [ + 357, + 357, + 3 + ], + [ + 348, + 348, + 3 + ], + [ + 416, + 416, + 1 + ], + [ + 257, + 257, + 3 + ], + [ + 201, + 201, + 4 + ], + [ + 205, + 205, + 1 + ], + [ + 343, + 343, + 4 + ], + [ + 342, + 342, + 3 + ], + [ + 536, + 536, + 2 + ], + [ + 63, + 63, + 2 + ], + [ + 1026, + 447, + 4 + ], + [ + 138, + 138, + 1 + ], + [ + 460, + 460, + 2 + ], + [ + 537, + 537, + 2 + ], + [ + 253, + 253, + 4 + ], + [ + 1033, + 1024, + 1 + ], + [ + 456, + 456, + 2 + ], + [ + 369, + 254, + 2 + ], + [ + 440, + 440, + 1 + ], + [ + 1027, + 247, + 5 + ], + [ + 1035, + 388, + 6 + ], + [ + 477, + 477, + 2 + ], + [ + 1027, + 248, + 5 + ], + [ + 596, + 596, + 1 + ], + [ + 421, + 421, + 2 + ], + [ + 301, + 301, + 4 + ], + [ + 588, + 588, + 1 + ], + [ + 577, + 577, + 2 + ], + [ + 188, + 259, + 2 + ], + [ + 1040, + 350, + 2 + ], + [ + 246, + 262, + 2 + ], + [ + 399, + 399, + 1 + ], + [ + 223, + 223, + 2 + ], + [ + 1030, + 260, + 1 + ], + [ + 1068, + 264, + 4 + ], + [ + 289, + 289, + 3 + ], + [ + 212, + 237, + 2 + ], + [ + 235, + 235, + 6 + ], + [ + 277, + 277, + 5 + ], + [ + 469, + 469, + 2 + ], + [ + 1045, + 1031, + 1 + ], + [ + 344, + 344, + 3 + ], + [ + 193, + 435, + 2 + ], + [ + 1027, + 1024, + 1 + ], + [ + 231, + 231, + 1 + ], + [ + 439, + 439, + 2 + ], + [ + 193, + 174, + 2 + ], + [ + 193, + 441, + 2 + ], + [ + 166, + 166, + 2 + ], + [ + 322, + 322, + 1 + ], + [ + 548, + 548, + 2 + ], + [ + 443, + 443, + 2 + ], + [ + 702, + 702, + 2 + ], + [ + 1078, + 174, + 2 + ], + [ + 1026, + 441, + 4 + ], + [ + 214, + 254, + 2 + ], + [ + 679, + 679, + 1 + ], + [ + 1028, + 256, + 7 + ], + [ + 668, + 668, + 1 + ], + [ + 352, + 352, + 3 + ], + [ + 449, + 449, + 2 + ], + [ + 1100, + 68, + 2 + ], + [ + 578, + 578, + 2 + ], + [ + 1027, + 247, + 3 + ], + [ + 258, + 258, + 4 + ], + [ + 313, + 313, + 4 + ], + [ + 1033, + 1024, + 3 + ], + [ + 490, + 490, + 2 + ], + [ + 162, + 162, + 2 + ], + [ + 1026, + 435, + 4 + ], + [ + 457, + 457, + 1 + ], + [ + 1082, + 246, + 4 + ], + [ + 1051, + 1027, + 1 + ], + [ + 206, + 206, + 2 + ], + [ + 579, + 579, + 1 + ], + [ + 207, + 207, + 2 + ], + [ + 193, + 176, + 2 + ], + [ + 1027, + 1046, + 1 + ], + [ + 1027, + 248, + 3 + ], + [ + 215, + 215, + 2 + ], + [ + 517, + 517, + 2 + ], + [ + 321, + 321, + 3 + ], + [ + 1030, + 277, + 1 + ], + [ + 283, + 232, + 2 + ], + [ + 1028, + 312, + 1 + ], + [ + 252, + 252, + 4 + ], + [ + 236, + 236, + 4 + ], + [ + 1081, + 176, + 2 + ], + [ + 250, + 250, + 3 + ], + [ + 386, + 386, + 2 + ], + [ + 338, + 248, + 2 + ], + [ + 1085, + 66, + 2 + ], + [ + 202, + 539, + 2 + ], + [ + 201, + 201, + 1 + ], + [ + 269, + 251, + 2 + ], + [ + 334, + 247, + 2 + ], + [ + 1119, + 329, + 4 + ], + [ + 465, + 465, + 1 + ], + [ + 225, + 225, + 3 + ], + [ + 1028, + 314, + 1 + ], + [ + 175, + 175, + 4 + ], + [ + 221, + 221, + 2 + ], + [ + 272, + 272, + 5 + ], + [ + 538, + 538, + 2 + ], + [ + 454, + 454, + 2 + ], + [ + 190, + 174, + 2 + ], + [ + 320, + 320, + 4 + ], + [ + 204, + 204, + 1 + ], + [ + 1030, + 260, + 5 + ], + [ + 259, + 259, + 4 + ], + [ + 360, + 385, + 2 + ], + [ + 230, + 230, + 6 + ], + [ + 347, + 347, + 3 + ], + [ + 214, + 327, + 2 + ], + [ + 1026, + 458, + 4 + ], + [ + 281, + 281, + 5 + ], + [ + 396, + 396, + 3 + ], + [ + 1028, + 295, + 5 + ], + [ + 214, + 328, + 2 + ], + [ + 239, + 239, + 3 + ], + [ + 1095, + 1027, + 1 + ], + [ + 323, + 323, + 3 + ], + [ + 613, + 613, + 1 + ], + [ + 345, + 188, + 2 + ], + [ + 267, + 267, + 4 + ], + [ + 592, + 592, + 2 + ], + [ + 229, + 229, + 6 + ], + [ + 240, + 332, + 2 + ], + [ + 1046, + 1027, + 1 + ], + [ + 202, + 545, + 2 + ], + [ + 1030, + 284, + 1 + ], + [ + 68, + 69, + 2 + ], + [ + 1028, + 312, + 5 + ], + [ + 290, + 290, + 2 + ], + [ + 541, + 541, + 2 + ], + [ + 722, + 722, + 1 + ], + [ + 21, + 21, + 1 + ], + [ + 249, + 349, + 2 + ], + [ + 309, + 309, + 3 + ], + [ + 402, + 402, + 3 + ], + [ + 1035, + 401, + 6 + ], + [ + 251, + 269, + 2 + ], + [ + 1033, + 1033, + 1 + ], + [ + 348, + 246, + 2 + ], + [ + 244, + 244, + 3 + ], + [ + 1040, + 366, + 2 + ], + [ + 261, + 261, + 4 + ], + [ + 174, + 1047, + 2 + ], + [ + 1027, + 188, + 3 + ], + [ + 1098, + 289, + 2 + ], + [ + 65, + 66, + 2 + ], + [ + 129, + 129, + 1 + ], + [ + 71, + 70, + 1 + ], + [ + 410, + 319, + 1 + ], + [ + 637, + 637, + 1 + ], + [ + 392, + 305, + 2 + ], + [ + 193, + 458, + 2 + ], + [ + 275, + 275, + 5 + ], + [ + 188, + 217, + 1 + ], + [ + 273, + 273, + 5 + ], + [ + 370, + 245, + 2 + ], + [ + 1040, + 1134, + 2 + ], + [ + 1028, + 314, + 5 + ], + [ + 214, + 325, + 2 + ], + [ + 176, + 1048, + 2 + ], + [ + 1040, + 365, + 2 + ], + [ + 495, + 495, + 2 + ], + [ + 515, + 515, + 2 + ], + [ + 1024, + 262, + 4 + ], + [ + 249, + 1045, + 2 + ], + [ + 74, + 1139, + 1 + ], + [ + 283, + 378, + 2 + ], + [ + 295, + 256, + 1 + ], + [ + 438, + 266, + 2 + ], + [ + 466, + 737, + 1 + ], + [ + 214, + 246, + 2 + ], + [ + 216, + 216, + 4 + ], + [ + 218, + 218, + 2 + ], + [ + 71, + 72, + 1 + ], + [ + 249, + 412, + 2 + ], + [ + 1123, + 319, + 2 + ], + [ + 1030, + 280, + 5 + ], + [ + 284, + 284, + 5 + ], + [ + 580, + 580, + 2 + ], + [ + 237, + 237, + 3 + ], + [ + 1052, + 251, + 2 + ], + [ + 190, + 176, + 2 + ], + [ + 1024, + 188, + 3 + ], + [ + 1028, + 295, + 1 + ], + [ + 357, + 1036, + 2 + ], + [ + 1057, + 1057, + 4 + ], + [ + 205, + 194, + 2 + ], + [ + 329, + 262, + 2 + ], + [ + 406, + 406, + 3 + ], + [ + 362, + 254, + 2 + ], + [ + 1136, + 69, + 2 + ], + [ + 645, + 645, + 1 + ], + [ + 636, + 636, + 1 + ], + [ + 74, + 75, + 1 + ], + [ + 1028, + 295, + 3 + ], + [ + 330, + 330, + 3 + ], + [ + 1027, + 1095, + 1 + ], + [ + 428, + 428, + 1 + ], + [ + 300, + 300, + 3 + ], + [ + 451, + 451, + 1 + ], + [ + 369, + 369, + 3 + ], + [ + 1028, + 1089, + 1 + ], + [ + 462, + 462, + 2 + ], + [ + 1033, + 188, + 3 + ], + [ + 397, + 397, + 2 + ], + [ + 1029, + 1059, + 4 + ], + [ + 371, + 371, + 1 + ], + [ + 550, + 550, + 2 + ], + [ + 1030, + 280, + 3 + ], + [ + 1028, + 1101, + 1 + ], + [ + 1101, + 1028, + 1 + ], + [ + 312, + 312, + 3 + ], + [ + 266, + 266, + 4 + ], + [ + 404, + 404, + 3 + ], + [ + 270, + 270, + 4 + ], + [ + 1035, + 414, + 6 + ], + [ + 243, + 243, + 3 + ], + [ + 242, + 326, + 1 + ], + [ + 732, + 732, + 2 + ], + [ + 453, + 453, + 2 + ], + [ + 1028, + 312, + 3 + ], + [ + 190, + 332, + 2 + ], + [ + 214, + 265, + 2 + ], + [ + 174, + 176, + 7 + ], + [ + 217, + 246, + 2 + ], + [ + 350, + 188, + 2 + ], + [ + 228, + 228, + 4 + ], + [ + 353, + 353, + 4 + ], + [ + 234, + 234, + 7 + ], + [ + 511, + 511, + 2 + ], + [ + 190, + 370, + 2 + ], + [ + 318, + 318, + 4 + ], + [ + 324, + 324, + 4 + ], + [ + 540, + 540, + 2 + ], + [ + 1030, + 277, + 5 + ], + [ + 217, + 1046, + 2 + ], + [ + 374, + 374, + 3 + ], + [ + 339, + 339, + 1 + ], + [ + 60, + 59, + 1 + ], + [ + 647, + 647, + 1 + ], + [ + 68, + 67, + 1 + ], + [ + 468, + 468, + 2 + ], + [ + 1028, + 314, + 3 + ], + [ + 382, + 382, + 1 + ], + [ + 351, + 351, + 4 + ], + [ + 264, + 264, + 4 + ], + [ + 25, + 25, + 1 + ], + [ + 294, + 294, + 5 + ], + [ + 260, + 280, + 2 + ], + [ + 327, + 1036, + 2 + ], + [ + 354, + 202, + 2 + ], + [ + 417, + 417, + 3 + ], + [ + 1030, + 284, + 5 + ], + [ + 1052, + 269, + 2 + ], + [ + 1028, + 1086, + 1 + ], + [ + 314, + 314, + 3 + ], + [ + 227, + 227, + 3 + ], + [ + 543, + 543, + 2 + ], + [ + 1045, + 349, + 6 + ], + [ + 137, + 137, + 1 + ], + [ + 611, + 611, + 2 + ], + [ + 530, + 530, + 2 + ], + [ + 265, + 246, + 2 + ], + [ + 1113, + 267, + 4 + ], + [ + 214, + 247, + 2 + ], + [ + 328, + 1036, + 2 + ], + [ + 275, + 281, + 1 + ], + [ + 389, + 389, + 3 + ], + [ + 375, + 375, + 3 + ], + [ + 1052, + 256, + 2 + ], + [ + 1053, + 254, + 4 + ], + [ + 329, + 487, + 2 + ], + [ + 240, + 240, + 4 + ], + [ + 391, + 391, + 3 + ], + [ + 1108, + 1028, + 1 + ], + [ + 29, + 29, + 1 + ], + [ + 185, + 185, + 1 + ], + [ + 1028, + 1108, + 1 + ], + [ + 1027, + 265, + 1 + ], + [ + 1027, + 1066, + 1 + ], + [ + 478, + 478, + 2 + ], + [ + 534, + 534, + 2 + ], + [ + 257, + 257, + 1 + ], + [ + 235, + 235, + 7 + ], + [ + 1052, + 273, + 2 + ], + [ + 438, + 745, + 2 + ], + [ + 245, + 245, + 1 + ], + [ + 282, + 282, + 2 + ], + [ + 64, + 65, + 2 + ], + [ + 659, + 659, + 1 + ], + [ + 1105, + 242, + 1 + ], + [ + 1100, + 69, + 2 + ], + [ + 174, + 1047, + 4 + ], + [ + 279, + 279, + 1 + ], + [ + 667, + 667, + 1 + ], + [ + 280, + 260, + 2 + ], + [ + 296, + 296, + 5 + ], + [ + 599, + 599, + 2 + ], + [ + 214, + 248, + 2 + ], + [ + 474, + 474, + 2 + ], + [ + 1035, + 426, + 6 + ], + [ + 20, + 20, + 1 + ], + [ + 271, + 271, + 4 + ], + [ + 1031, + 1029, + 5 + ], + [ + 256, + 295, + 2 + ], + [ + 1058, + 1058, + 4 + ], + [ + 1056, + 1056, + 4 + ], + [ + 358, + 202, + 2 + ], + [ + 1030, + 260, + 3 + ], + [ + 1041, + 379, + 2 + ], + [ + 1163, + 61, + 2 + ], + [ + 1099, + 230, + 4 + ], + [ + 700, + 700, + 2 + ], + [ + 479, + 479, + 2 + ], + [ + 1111, + 70, + 2 + ], + [ + 424, + 248, + 2 + ], + [ + 281, + 275, + 1 + ], + [ + 367, + 202, + 2 + ], + [ + 429, + 429, + 1 + ], + [ + 1052, + 272, + 2 + ], + [ + 1027, + 254, + 1 + ], + [ + 217, + 334, + 2 + ], + [ + 1124, + 63, + 2 + ], + [ + 695, + 508, + 2 + ], + [ + 1055, + 1055, + 4 + ], + [ + 383, + 383, + 3 + ], + [ + 571, + 571, + 2 + ], + [ + 188, + 369, + 2 + ], + [ + 408, + 408, + 1 + ], + [ + 151, + 151, + 2 + ], + [ + 352, + 1049, + 2 + ], + [ + 1102, + 229, + 4 + ], + [ + 280, + 1026, + 2 + ], + [ + 1035, + 431, + 6 + ], + [ + 373, + 373, + 1 + ], + [ + 1085, + 67, + 2 + ], + [ + 251, + 332, + 2 + ], + [ + 385, + 385, + 2 + ], + [ + 524, + 524, + 2 + ], + [ + 214, + 348, + 2 + ], + [ + 432, + 432, + 1 + ], + [ + 420, + 420, + 1 + ], + [ + 322, + 576, + 2 + ], + [ + 360, + 360, + 4 + ], + [ + 72, + 1103, + 1 + ], + [ + 760, + 760, + 1 + ], + [ + 1024, + 1024, + 3 + ], + [ + 226, + 226, + 3 + ], + [ + 66, + 1077, + 1 + ], + [ + 233, + 233, + 2 + ], + [ + 217, + 359, + 2 + ], + [ + 256, + 295, + 1 + ], + [ + 1028, + 1025, + 5 + ], + [ + 322, + 285, + 2 + ], + [ + 308, + 308, + 3 + ], + [ + 376, + 202, + 2 + ], + [ + 775, + 73, + 1 + ], + [ + 381, + 381, + 3 + ], + [ + 278, + 278, + 4 + ], + [ + 1107, + 254, + 4 + ], + [ + 250, + 250, + 1 + ], + [ + 411, + 411, + 3 + ], + [ + 1093, + 1093, + 2 + ], + [ + 289, + 202, + 2 + ], + [ + 188, + 362, + 2 + ], + [ + 566, + 566, + 2 + ], + [ + 1027, + 267, + 1 + ], + [ + 1098, + 349, + 2 + ], + [ + 482, + 482, + 2 + ], + [ + 1030, + 277, + 3 + ], + [ + 1121, + 63, + 2 + ], + [ + 553, + 553, + 2 + ], + [ + 350, + 350, + 2 + ], + [ + 345, + 345, + 2 + ], + [ + 176, + 1048, + 4 + ], + [ + 445, + 445, + 3 + ], + [ + 304, + 229, + 3 + ], + [ + 286, + 286, + 3 + ], + [ + 237, + 305, + 2 + ], + [ + 283, + 283, + 3 + ], + [ + 217, + 338, + 2 + ], + [ + 230, + 299, + 3 + ], + [ + 393, + 393, + 3 + ], + [ + 680, + 680, + 1 + ], + [ + 295, + 256, + 2 + ], + [ + 423, + 247, + 2 + ], + [ + 476, + 248, + 2 + ], + [ + 421, + 247, + 2 + ], + [ + 240, + 240, + 1 + ], + [ + 1027, + 265, + 5 + ], + [ + 547, + 547, + 2 + ], + [ + 415, + 415, + 3 + ], + [ + 434, + 434, + 3 + ], + [ + 1030, + 281, + 5 + ], + [ + 1028, + 1025, + 1 + ], + [ + 268, + 268, + 1 + ], + [ + 193, + 222, + 2 + ], + [ + 190, + 190, + 1 + ], + [ + 410, + 597, + 1 + ], + [ + 332, + 251, + 2 + ], + [ + 484, + 484, + 2 + ], + [ + 1041, + 388, + 2 + ], + [ + 352, + 349, + 2 + ], + [ + 436, + 710, + 2 + ], + [ + 1027, + 254, + 5 + ], + [ + 355, + 355, + 3 + ], + [ + 1074, + 1074, + 4 + ], + [ + 153, + 153, + 2 + ], + [ + 287, + 287, + 3 + ], + [ + 1029, + 1076, + 4 + ], + [ + 230, + 235, + 1 + ], + [ + 1039, + 262, + 4 + ], + [ + 276, + 276, + 4 + ], + [ + 1038, + 409, + 6 + ], + [ + 378, + 63, + 1 + ], + [ + 301, + 229, + 3 + ], + [ + 364, + 364, + 3 + ], + [ + 531, + 531, + 2 + ], + [ + 1158, + 175, + 4 + ], + [ + 620, + 620, + 2 + ], + [ + 297, + 297, + 3 + ], + [ + 260, + 260, + 6 + ], + [ + 568, + 568, + 2 + ], + [ + 266, + 1064, + 1 + ], + [ + 253, + 253, + 1 + ], + [ + 235, + 230, + 1 + ], + [ + 76, + 76, + 1 + ], + [ + 444, + 315, + 2 + ], + [ + 291, + 291, + 2 + ], + [ + 1147, + 1147, + 1 + ], + [ + 316, + 316, + 4 + ], + [ + 442, + 442, + 3 + ], + [ + 1038, + 403, + 6 + ], + [ + 258, + 258, + 1 + ], + [ + 188, + 334, + 2 + ], + [ + 269, + 1025, + 2 + ], + [ + 1053, + 246, + 4 + ], + [ + 1030, + 284, + 3 + ], + [ + 341, + 341, + 4 + ], + [ + 317, + 317, + 4 + ], + [ + 217, + 362, + 2 + ], + [ + 448, + 448, + 3 + ], + [ + 1027, + 1066, + 3 + ], + [ + 68, + 1136, + 1 + ], + [ + 195, + 195, + 3 + ], + [ + 1089, + 1028, + 1 + ], + [ + 242, + 1105, + 1 + ], + [ + 1029, + 539, + 4 + ], + [ + 646, + 646, + 2 + ], + [ + 294, + 1026, + 2 + ], + [ + 245, + 245, + 4 + ], + [ + 111, + 111, + 1 + ], + [ + 194, + 194, + 1 + ], + [ + 337, + 337, + 1 + ], + [ + 192, + 192, + 1 + ], + [ + 1064, + 266, + 1 + ], + [ + 449, + 449, + 3 + ], + [ + 622, + 622, + 2 + ], + [ + 1041, + 401, + 2 + ], + [ + 356, + 356, + 3 + ], + [ + 1027, + 254, + 3 + ], + [ + 241, + 1070, + 1 + ], + [ + 1052, + 295, + 2 + ], + [ + 299, + 230, + 3 + ], + [ + 15, + 15, + 1 + ], + [ + 1052, + 312, + 2 + ], + [ + 307, + 230, + 3 + ], + [ + 443, + 443, + 3 + ], + [ + 642, + 642, + 2 + ], + [ + 737, + 737, + 1 + ], + [ + 229, + 304, + 3 + ], + [ + 277, + 277, + 6 + ], + [ + 340, + 340, + 4 + ], + [ + 544, + 544, + 2 + ], + [ + 279, + 279, + 4 + ], + [ + 339, + 357, + 2 + ], + [ + 219, + 219, + 4 + ], + [ + 267, + 254, + 2 + ], + [ + 371, + 371, + 3 + ], + [ + 1086, + 1028, + 1 + ], + [ + 200, + 200, + 3 + ], + [ + 296, + 1026, + 2 + ], + [ + 488, + 488, + 3 + ], + [ + 188, + 1055, + 2 + ], + [ + 249, + 249, + 3 + ], + [ + 1027, + 1054, + 3 + ], + [ + 1052, + 314, + 2 + ], + [ + 363, + 329, + 2 + ], + [ + 213, + 213, + 2 + ], + [ + 188, + 338, + 2 + ], + [ + 188, + 1056, + 2 + ], + [ + 260, + 1026, + 2 + ], + [ + 532, + 532, + 2 + ], + [ + 332, + 240, + 2 + ], + [ + 354, + 354, + 3 + ], + [ + 589, + 589, + 2 + ], + [ + 554, + 554, + 2 + ], + [ + 392, + 392, + 1 + ], + [ + 347, + 250, + 2 + ], + [ + 199, + 199, + 3 + ], + [ + 262, + 262, + 4 + ], + [ + 628, + 628, + 2 + ], + [ + 188, + 1094, + 2 + ], + [ + 439, + 248, + 2 + ], + [ + 1029, + 545, + 4 + ], + [ + 210, + 210, + 4 + ], + [ + 499, + 499, + 2 + ], + [ + 1028, + 1062, + 1 + ], + [ + 302, + 302, + 3 + ], + [ + 1053, + 265, + 4 + ], + [ + 361, + 361, + 3 + ], + [ + 485, + 247, + 2 + ], + [ + 204, + 204, + 3 + ], + [ + 201, + 201, + 5 + ], + [ + 1036, + 1036, + 3 + ], + [ + 366, + 366, + 2 + ], + [ + 343, + 280, + 2 + ], + [ + 277, + 1026, + 2 + ], + [ + 344, + 344, + 4 + ], + [ + 275, + 281, + 2 + ], + [ + 508, + 390, + 2 + ], + [ + 174, + 176, + 6 + ], + [ + 269, + 269, + 5 + ], + [ + 1384, + 1384, + 2 + ], + [ + 246, + 1054, + 2 + ], + [ + 234, + 229, + 1 + ], + [ + 466, + 1093, + 1 + ], + [ + 367, + 367, + 3 + ], + [ + 405, + 217, + 2 + ], + [ + 264, + 1068, + 1 + ], + [ + 196, + 196, + 4 + ], + [ + 298, + 298, + 2 + ], + [ + 1039, + 322, + 4 + ], + [ + 333, + 333, + 3 + ], + [ + 342, + 342, + 4 + ], + [ + 1045, + 376, + 6 + ], + [ + 313, + 313, + 5 + ], + [ + 1027, + 1087, + 1 + ], + [ + 285, + 416, + 2 + ], + [ + 723, + 723, + 1 + ], + [ + 518, + 518, + 3 + ], + [ + 253, + 253, + 5 + ], + [ + 1027, + 1090, + 1 + ], + [ + 232, + 205, + 1 + ], + [ + 230, + 307, + 3 + ], + [ + 292, + 292, + 1 + ], + [ + 229, + 234, + 1 + ], + [ + 188, + 327, + 2 + ], + [ + 1024, + 259, + 4 + ], + [ + 231, + 231, + 3 + ], + [ + 1027, + 1115, + 1 + ], + [ + 382, + 368, + 2 + ], + [ + 188, + 328, + 2 + ], + [ + 1028, + 1061, + 1 + ], + [ + 188, + 348, + 2 + ], + [ + 110, + 109, + 1 + ], + [ + 214, + 1033, + 2 + ], + [ + 502, + 502, + 1 + ], + [ + 369, + 267, + 2 + ], + [ + 1027, + 265, + 3 + ], + [ + 66, + 65, + 1 + ], + [ + 1053, + 247, + 4 + ], + [ + 456, + 456, + 3 + ], + [ + 190, + 190, + 3 + ], + [ + 627, + 627, + 2 + ], + [ + 346, + 407, + 2 + ], + [ + 193, + 193, + 3 + ], + [ + 1063, + 254, + 4 + ], + [ + 460, + 460, + 3 + ], + [ + 1060, + 280, + 2 + ], + [ + 246, + 1024, + 2 + ], + [ + 496, + 496, + 3 + ], + [ + 819, + 819, + 2 + ], + [ + 1041, + 414, + 2 + ], + [ + 214, + 357, + 2 + ], + [ + 1038, + 447, + 6 + ], + [ + 1078, + 1078, + 2 + ], + [ + 375, + 267, + 2 + ], + [ + 229, + 301, + 3 + ], + [ + 370, + 256, + 2 + ], + [ + 1028, + 1025, + 3 + ], + [ + 425, + 425, + 2 + ], + [ + 188, + 359, + 2 + ], + [ + 399, + 241, + 2 + ], + [ + 248, + 327, + 2 + ], + [ + 563, + 563, + 2 + ], + [ + 254, + 217, + 2 + ], + [ + 358, + 358, + 3 + ], + [ + 62, + 569, + 1 + ], + [ + 343, + 372, + 2 + ], + [ + 741, + 741, + 2 + ], + [ + 310, + 310, + 3 + ], + [ + 576, + 576, + 2 + ], + [ + 239, + 319, + 2 + ], + [ + 412, + 412, + 3 + ], + [ + 394, + 394, + 3 + ], + [ + 323, + 446, + 2 + ], + [ + 1068, + 264, + 1 + ], + [ + 1029, + 1049, + 4 + ], + [ + 288, + 357, + 2 + ], + [ + 606, + 606, + 2 + ], + [ + 312, + 312, + 4 + ], + [ + 188, + 325, + 2 + ], + [ + 396, + 259, + 2 + ], + [ + 284, + 1026, + 2 + ], + [ + 1116, + 65, + 2 + ], + [ + 1028, + 1062, + 3 + ], + [ + 475, + 475, + 1 + ], + [ + 239, + 319, + 1 + ], + [ + 1115, + 1027, + 1 + ], + [ + 402, + 259, + 2 + ], + [ + 365, + 365, + 2 + ], + [ + 362, + 362, + 3 + ], + [ + 237, + 305, + 1 + ], + [ + 561, + 561, + 2 + ], + [ + 246, + 265, + 2 + ], + [ + 1081, + 1081, + 2 + ], + [ + 1106, + 65, + 2 + ], + [ + 1066, + 1027, + 1 + ], + [ + 299, + 299, + 5 + ], + [ + 304, + 304, + 5 + ], + [ + 67, + 68, + 2 + ], + [ + 255, + 255, + 4 + ], + [ + 491, + 491, + 3 + ], + [ + 1060, + 294, + 2 + ], + [ + 453, + 453, + 3 + ], + [ + 381, + 381, + 1 + ], + [ + 1030, + 281, + 1 + ], + [ + 1134, + 1040, + 2 + ], + [ + 1028, + 1089, + 3 + ], + [ + 249, + 469, + 2 + ], + [ + 343, + 260, + 2 + ], + [ + 261, + 261, + 1 + ], + [ + 188, + 347, + 2 + ], + [ + 413, + 315, + 2 + ], + [ + 395, + 395, + 3 + ], + [ + 1064, + 266, + 3 + ], + [ + 481, + 481, + 1 + ], + [ + 212, + 212, + 1 + ], + [ + 329, + 535, + 2 + ], + [ + 494, + 494, + 3 + ], + [ + 1047, + 174, + 5 + ], + [ + 276, + 276, + 1 + ], + [ + 1042, + 403, + 2 + ], + [ + 320, + 320, + 5 + ], + [ + 1028, + 1061, + 3 + ], + [ + 380, + 380, + 3 + ], + [ + 1048, + 176, + 5 + ], + [ + 295, + 295, + 4 + ], + [ + 314, + 273, + 2 + ], + [ + 1053, + 248, + 4 + ], + [ + 477, + 477, + 3 + ], + [ + 1042, + 409, + 2 + ], + [ + 457, + 321, + 2 + ], + [ + 398, + 321, + 2 + ], + [ + 687, + 687, + 2 + ], + [ + 1062, + 1028, + 1 + ], + [ + 190, + 351, + 2 + ], + [ + 246, + 347, + 2 + ], + [ + 697, + 697, + 2 + ], + [ + 1060, + 296, + 2 + ], + [ + 214, + 375, + 2 + ], + [ + 1061, + 1028, + 1 + ], + [ + 349, + 349, + 3 + ], + [ + 377, + 377, + 3 + ], + [ + 461, + 461, + 3 + ], + [ + 1025, + 174, + 4 + ], + [ + 1028, + 1086, + 3 + ], + [ + 275, + 1026, + 2 + ], + [ + 284, + 284, + 6 + ], + [ + 190, + 196, + 2 + ], + [ + 216, + 285, + 2 + ], + [ + 307, + 307, + 5 + ], + [ + 459, + 259, + 2 + ], + [ + 70, + 305, + 1 + ], + [ + 258, + 258, + 5 + ], + [ + 335, + 335, + 1 + ], + [ + 188, + 405, + 2 + ], + [ + 1039, + 1039, + 3 + ], + [ + 890, + 890, + 1 + ], + [ + 334, + 404, + 2 + ], + [ + 1072, + 265, + 4 + ], + [ + 326, + 242, + 1 + ], + [ + 328, + 328, + 4 + ], + [ + 454, + 331, + 1 + ], + [ + 1030, + 281, + 3 + ], + [ + 710, + 710, + 2 + ], + [ + 1053, + 1036, + 4 + ], + [ + 268, + 268, + 4 + ], + [ + 745, + 745, + 2 + ], + [ + 58, + 58, + 1 + ], + [ + 289, + 289, + 1 + ], + [ + 1038, + 441, + 6 + ], + [ + 942, + 942, + 1 + ], + [ + 254, + 369, + 2 + ], + [ + 262, + 404, + 2 + ], + [ + 437, + 437, + 1 + ], + [ + 480, + 236, + 2 + ], + [ + 788, + 788, + 1 + ], + [ + 72, + 71, + 2 + ], + [ + 1041, + 426, + 2 + ], + [ + 662, + 662, + 2 + ], + [ + 463, + 463, + 3 + ], + [ + 72, + 1139, + 1 + ], + [ + 833, + 833, + 2 + ], + [ + 520, + 520, + 2 + ], + [ + 794, + 794, + 2 + ], + [ + 632, + 632, + 2 + ], + [ + 203, + 203, + 1 + ], + [ + 1045, + 367, + 6 + ], + [ + 254, + 1024, + 2 + ], + [ + 1096, + 251, + 4 + ], + [ + 1047, + 174, + 7 + ], + [ + 1041, + 431, + 2 + ], + [ + 247, + 217, + 2 + ], + [ + 462, + 462, + 3 + ], + [ + 283, + 232, + 1 + ], + [ + 1109, + 256, + 4 + ], + [ + 400, + 400, + 2 + ], + [ + 70, + 1103, + 1 + ], + [ + 62, + 772, + 1 + ], + [ + 176, + 296, + 2 + ], + [ + 325, + 325, + 4 + ], + [ + 1027, + 1054, + 1 + ], + [ + 489, + 489, + 3 + ], + [ + 574, + 574, + 2 + ], + [ + 16, + 17, + 1 + ], + [ + 1068, + 264, + 3 + ], + [ + 1038, + 435, + 6 + ], + [ + 1028, + 251, + 7 + ], + [ + 262, + 417, + 2 + ], + [ + 348, + 1036, + 2 + ], + [ + 1027, + 1054, + 5 + ], + [ + 214, + 267, + 2 + ], + [ + 1049, + 202, + 4 + ], + [ + 336, + 244, + 1 + ], + [ + 1027, + 267, + 5 + ], + [ + 225, + 315, + 2 + ], + [ + 685, + 685, + 2 + ], + [ + 850, + 850, + 2 + ], + [ + 313, + 235, + 3 + ], + [ + 247, + 328, + 2 + ], + [ + 230, + 234, + 1 + ], + [ + 272, + 272, + 7 + ], + [ + 827, + 827, + 1 + ], + [ + 1025, + 176, + 4 + ], + [ + 323, + 446, + 1 + ], + [ + 220, + 220, + 3 + ], + [ + 836, + 836, + 2 + ], + [ + 501, + 501, + 3 + ], + [ + 288, + 201, + 2 + ], + [ + 265, + 347, + 2 + ], + [ + 1048, + 176, + 7 + ], + [ + 471, + 471, + 3 + ], + [ + 60, + 1163, + 1 + ], + [ + 333, + 339, + 2 + ], + [ + 269, + 273, + 2 + ], + [ + 1027, + 1087, + 3 + ], + [ + 174, + 294, + 2 + ], + [ + 301, + 301, + 5 + ], + [ + 314, + 314, + 4 + ], + [ + 526, + 526, + 1 + ], + [ + 671, + 671, + 2 + ], + [ + 601, + 601, + 2 + ], + [ + 1121, + 61, + 2 + ], + [ + 331, + 454, + 1 + ], + [ + 390, + 390, + 3 + ], + [ + 360, + 281, + 2 + ], + [ + 378, + 63, + 2 + ], + [ + 626, + 626, + 2 + ], + [ + 1027, + 1090, + 3 + ], + [ + 387, + 387, + 3 + ], + [ + 570, + 570, + 1 + ], + [ + 247, + 334, + 2 + ], + [ + 1027, + 267, + 3 + ], + [ + 214, + 1050, + 2 + ], + [ + 402, + 327, + 2 + ], + [ + 244, + 336, + 1 + ], + [ + 174, + 193, + 2 + ], + [ + 1025, + 370, + 4 + ], + [ + 217, + 329, + 2 + ], + [ + 555, + 555, + 2 + ], + [ + 594, + 594, + 2 + ], + [ + 246, + 248, + 2 + ], + [ + 551, + 551, + 1 + ], + [ + 285, + 216, + 2 + ], + [ + 107, + 106, + 1 + ], + [ + 379, + 190, + 2 + ], + [ + 198, + 198, + 3 + ], + [ + 234, + 230, + 1 + ], + [ + 176, + 193, + 2 + ], + [ + 521, + 521, + 2 + ], + [ + 217, + 1024, + 2 + ], + [ + 1060, + 275, + 2 + ], + [ + 479, + 479, + 3 + ], + [ + 280, + 280, + 5 + ], + [ + 265, + 265, + 4 + ], + [ + 338, + 417, + 2 + ], + [ + 70, + 305, + 2 + ], + [ + 619, + 619, + 2 + ], + [ + 249, + 495, + 2 + ], + [ + 1045, + 354, + 6 + ], + [ + 468, + 468, + 3 + ], + [ + 366, + 188, + 2 + ], + [ + 652, + 652, + 2 + ], + [ + 1070, + 241, + 1 + ], + [ + 608, + 608, + 2 + ], + [ + 1030, + 294, + 1 + ], + [ + 235, + 313, + 3 + ], + [ + 1038, + 458, + 6 + ], + [ + 1045, + 397, + 6 + ], + [ + 1028, + 1061, + 5 + ], + [ + 322, + 448, + 2 + ], + [ + 1030, + 296, + 1 + ], + [ + 369, + 257, + 2 + ], + [ + 1027, + 1069, + 3 + ], + [ + 695, + 695, + 2 + ], + [ + 522, + 522, + 2 + ], + [ + 1027, + 1067, + 3 + ], + [ + 427, + 427, + 2 + ], + [ + 1443, + 1443, + 2 + ], + [ + 1141, + 239, + 1 + ], + [ + 238, + 238, + 1 + ], + [ + 99, + 100, + 1 + ], + [ + 1042, + 447, + 2 + ], + [ + 326, + 242, + 2 + ], + [ + 1098, + 376, + 2 + ], + [ + 1116, + 64, + 2 + ], + [ + 1028, + 1062, + 5 + ], + [ + 320, + 234, + 3 + ], + [ + 430, + 309, + 2 + ], + [ + 1140, + 339, + 4 + ], + [ + 267, + 267, + 1 + ], + [ + 559, + 559, + 3 + ], + [ + 384, + 384, + 3 + ], + [ + 649, + 649, + 2 + ], + [ + 604, + 604, + 2 + ], + [ + 281, + 275, + 2 + ], + [ + 277, + 277, + 7 + ], + [ + 1045, + 358, + 6 + ], + [ + 319, + 239, + 1 + ], + [ + 225, + 309, + 2 + ], + [ + 175, + 175, + 1 + ], + [ + 304, + 229, + 2 + ], + [ + 365, + 188, + 2 + ], + [ + 493, + 307, + 2 + ], + [ + 285, + 416, + 1 + ], + [ + 1162, + 352, + 4 + ], + [ + 247, + 1024, + 2 + ], + [ + 372, + 343, + 2 + ], + [ + 473, + 473, + 3 + ], + [ + 66, + 205, + 1 + ], + [ + 523, + 523, + 2 + ], + [ + 586, + 586, + 2 + ], + [ + 474, + 474, + 3 + ], + [ + 889, + 61, + 1 + ], + [ + 1047, + 1047, + 1 + ], + [ + 504, + 504, + 1 + ], + [ + 261, + 261, + 5 + ], + [ + 469, + 249, + 2 + ], + [ + 596, + 596, + 2 + ], + [ + 235, + 324, + 3 + ], + [ + 359, + 448, + 2 + ], + [ + 466, + 667, + 1 + ], + [ + 260, + 1083, + 2 + ], + [ + 363, + 363, + 1 + ], + [ + 190, + 353, + 2 + ], + [ + 817, + 817, + 1 + ], + [ + 590, + 590, + 2 + ], + [ + 112, + 112, + 1 + ], + [ + 399, + 399, + 3 + ], + [ + 1026, + 193, + 1 + ], + [ + 1148, + 71, + 2 + ], + [ + 593, + 593, + 2 + ], + [ + 273, + 314, + 2 + ], + [ + 312, + 272, + 2 + ], + [ + 318, + 318, + 5 + ], + [ + 246, + 246, + 1 + ], + [ + 451, + 252, + 2 + ], + [ + 1121, + 62, + 2 + ], + [ + 577, + 352, + 2 + ], + [ + 517, + 517, + 3 + ], + [ + 610, + 610, + 2 + ], + [ + 260, + 343, + 2 + ], + [ + 1042, + 435, + 2 + ], + [ + 247, + 1067, + 2 + ], + [ + 254, + 254, + 4 + ], + [ + 272, + 312, + 2 + ], + [ + 1025, + 332, + 4 + ], + [ + 1098, + 354, + 2 + ], + [ + 259, + 396, + 2 + ], + [ + 1143, + 265, + 4 + ], + [ + 229, + 304, + 2 + ], + [ + 330, + 433, + 2 + ], + [ + 684, + 684, + 2 + ], + [ + 266, + 500, + 2 + ], + [ + 262, + 553, + 2 + ], + [ + 1060, + 260, + 2 + ], + [ + 256, + 370, + 2 + ], + [ + 582, + 582, + 2 + ], + [ + 248, + 338, + 2 + ], + [ + 428, + 264, + 2 + ], + [ + 422, + 323, + 1 + ], + [ + 464, + 464, + 3 + ], + [ + 820, + 820, + 1 + ], + [ + 236, + 236, + 5 + ], + [ + 1030, + 294, + 5 + ], + [ + 1042, + 441, + 2 + ], + [ + 210, + 252, + 2 + ], + [ + 497, + 497, + 1 + ], + [ + 598, + 598, + 2 + ], + [ + 1026, + 174, + 4 + ], + [ + 248, + 1024, + 2 + ], + [ + 336, + 244, + 2 + ], + [ + 72, + 805, + 1 + ], + [ + 394, + 394, + 1 + ], + [ + 486, + 486, + 3 + ], + [ + 498, + 498, + 3 + ], + [ + 271, + 271, + 1 + ], + [ + 410, + 637, + 1 + ], + [ + 228, + 228, + 5 + ], + [ + 1090, + 1027, + 1 + ], + [ + 656, + 656, + 2 + ], + [ + 376, + 289, + 2 + ], + [ + 954, + 954, + 1 + ], + [ + 234, + 320, + 3 + ], + [ + 267, + 217, + 2 + ], + [ + 248, + 217, + 2 + ], + [ + 1027, + 1079, + 1 + ], + [ + 1033, + 1073, + 3 + ], + [ + 527, + 527, + 3 + ], + [ + 1111, + 1111, + 2 + ], + [ + 216, + 289, + 2 + ], + [ + 484, + 484, + 3 + ], + [ + 492, + 492, + 3 + ], + [ + 378, + 569, + 2 + ], + [ + 359, + 1039, + 2 + ], + [ + 258, + 327, + 2 + ], + [ + 418, + 300, + 2 + ], + [ + 668, + 478, + 1 + ], + [ + 273, + 269, + 2 + ], + [ + 1105, + 1105, + 1 + ], + [ + 267, + 1024, + 2 + ], + [ + 423, + 423, + 3 + ], + [ + 262, + 490, + 2 + ], + [ + 510, + 510, + 3 + ], + [ + 1028, + 1159, + 1 + ], + [ + 230, + 230, + 7 + ], + [ + 248, + 1069, + 2 + ], + [ + 1060, + 277, + 2 + ], + [ + 245, + 370, + 2 + ], + [ + 373, + 337, + 2 + ], + [ + 605, + 605, + 2 + ], + [ + 1282, + 73, + 2 + ], + [ + 388, + 190, + 2 + ], + [ + 201, + 288, + 2 + ], + [ + 612, + 612, + 2 + ], + [ + 482, + 482, + 3 + ], + [ + 792, + 609, + 2 + ], + [ + 254, + 1063, + 2 + ], + [ + 689, + 689, + 2 + ], + [ + 1030, + 296, + 5 + ], + [ + 229, + 235, + 1 + ], + [ + 1030, + 1026, + 3 + ], + [ + 424, + 424, + 3 + ], + [ + 326, + 444, + 1 + ], + [ + 565, + 565, + 2 + ], + [ + 640, + 640, + 2 + ], + [ + 1087, + 1027, + 1 + ], + [ + 235, + 229, + 1 + ], + [ + 109, + 108, + 1 + ], + [ + 406, + 406, + 1 + ], + [ + 584, + 584, + 2 + ], + [ + 1310, + 61, + 2 + ], + [ + 385, + 360, + 2 + ], + [ + 588, + 588, + 2 + ], + [ + 585, + 585, + 2 + ], + [ + 663, + 663, + 2 + ], + [ + 1048, + 1048, + 1 + ], + [ + 368, + 368, + 1 + ], + [ + 319, + 465, + 1 + ], + [ + 348, + 276, + 2 + ], + [ + 696, + 696, + 2 + ], + [ + 1184, + 1027, + 1 + ], + [ + 775, + 775, + 1 + ], + [ + 467, + 467, + 3 + ], + [ + 346, + 346, + 1 + ], + [ + 1036, + 259, + 4 + ], + [ + 323, + 422, + 1 + ], + [ + 1186, + 1027, + 1 + ], + [ + 459, + 459, + 3 + ], + [ + 1042, + 458, + 2 + ], + [ + 28, + 27, + 1 + ], + [ + 240, + 251, + 2 + ], + [ + 227, + 321, + 2 + ], + [ + 407, + 371, + 2 + ], + [ + 421, + 421, + 3 + ], + [ + 329, + 363, + 2 + ], + [ + 587, + 587, + 2 + ], + [ + 324, + 324, + 5 + ], + [ + 1054, + 1027, + 1 + ], + [ + 470, + 470, + 3 + ], + [ + 265, + 325, + 2 + ], + [ + 1028, + 1160, + 1 + ], + [ + 1029, + 202, + 1 + ], + [ + 398, + 300, + 2 + ], + [ + 1156, + 315, + 4 + ], + [ + 548, + 548, + 1 + ], + [ + 71, + 392, + 1 + ], + [ + 273, + 1025, + 2 + ], + [ + 1075, + 251, + 4 + ], + [ + 294, + 284, + 2 + ], + [ + 1060, + 284, + 2 + ], + [ + 262, + 268, + 2 + ], + [ + 413, + 309, + 2 + ], + [ + 546, + 546, + 3 + ], + [ + 332, + 269, + 2 + ], + [ + 600, + 600, + 2 + ], + [ + 419, + 419, + 3 + ], + [ + 235, + 230, + 2 + ], + [ + 102, + 101, + 1 + ], + [ + 533, + 533, + 3 + ], + [ + 661, + 661, + 2 + ], + [ + 246, + 246, + 4 + ], + [ + 270, + 270, + 5 + ], + [ + 1098, + 367, + 2 + ], + [ + 208, + 208, + 3 + ], + [ + 1024, + 1027, + 1 + ], + [ + 176, + 174, + 7 + ], + [ + 432, + 288, + 2 + ], + [ + 505, + 301, + 2 + ], + [ + 1075, + 256, + 4 + ], + [ + 216, + 216, + 5 + ], + [ + 724, + 724, + 2 + ], + [ + 251, + 1025, + 2 + ], + [ + 1057, + 217, + 4 + ], + [ + 669, + 669, + 2 + ], + [ + 396, + 328, + 2 + ], + [ + 277, + 296, + 2 + ], + [ + 247, + 485, + 2 + ], + [ + 507, + 507, + 2 + ], + [ + 1027, + 1097, + 1 + ], + [ + 234, + 229, + 2 + ], + [ + 330, + 433, + 1 + ], + [ + 1064, + 1064, + 1 + ], + [ + 1098, + 358, + 2 + ], + [ + 305, + 237, + 2 + ], + [ + 257, + 257, + 4 + ], + [ + 254, + 362, + 2 + ], + [ + 1123, + 1123, + 2 + ], + [ + 410, + 680, + 1 + ], + [ + 1157, + 249, + 6 + ], + [ + 571, + 249, + 2 + ], + [ + 284, + 294, + 2 + ], + [ + 634, + 454, + 1 + ], + [ + 624, + 624, + 2 + ], + [ + 205, + 66, + 1 + ], + [ + 439, + 439, + 3 + ], + [ + 323, + 422, + 2 + ], + [ + 1085, + 1085, + 2 + ], + [ + 629, + 629, + 2 + ], + [ + 444, + 326, + 1 + ], + [ + 254, + 267, + 2 + ], + [ + 503, + 304, + 2 + ], + [ + 193, + 360, + 2 + ], + [ + 438, + 438, + 1 + ], + [ + 247, + 214, + 2 + ], + [ + 65, + 64, + 1 + ], + [ + 1070, + 241, + 3 + ], + [ + 480, + 480, + 3 + ], + [ + 307, + 493, + 2 + ], + [ + 266, + 493, + 2 + ], + [ + 579, + 579, + 2 + ], + [ + 591, + 591, + 2 + ], + [ + 353, + 353, + 2 + ], + [ + 265, + 214, + 2 + ], + [ + 256, + 1062, + 2 + ], + [ + 296, + 277, + 2 + ], + [ + 227, + 300, + 2 + ], + [ + 130, + 130, + 2 + ], + [ + 251, + 1061, + 2 + ], + [ + 232, + 283, + 2 + ], + [ + 295, + 295, + 5 + ], + [ + 854, + 854, + 1 + ], + [ + 401, + 190, + 2 + ], + [ + 1054, + 246, + 4 + ], + [ + 68, + 212, + 1 + ], + [ + 28, + 29, + 1 + ], + [ + 1028, + 1130, + 1 + ], + [ + 797, + 797, + 2 + ], + [ + 265, + 1024, + 2 + ], + [ + 1031, + 1029, + 3 + ], + [ + 299, + 230, + 2 + ], + [ + 541, + 541, + 3 + ], + [ + 472, + 472, + 1 + ], + [ + 201, + 214, + 2 + ], + [ + 372, + 372, + 2 + ], + [ + 269, + 332, + 2 + ], + [ + 557, + 557, + 3 + ], + [ + 128, + 635, + 1 + ], + [ + 259, + 188, + 2 + ], + [ + 67, + 1100, + 1 + ], + [ + 253, + 253, + 6 + ], + [ + 202, + 653, + 2 + ], + [ + 440, + 308, + 2 + ], + [ + 248, + 214, + 2 + ], + [ + 476, + 476, + 3 + ], + [ + 414, + 190, + 2 + ], + [ + 230, + 299, + 2 + ], + [ + 63, + 62, + 1 + ], + [ + 1202, + 217, + 6 + ], + [ + 272, + 1025, + 2 + ], + [ + 341, + 341, + 2 + ], + [ + 1028, + 1165, + 1 + ], + [ + 334, + 271, + 2 + ], + [ + 229, + 234, + 2 + ], + [ + 442, + 442, + 1 + ], + [ + 495, + 249, + 2 + ], + [ + 232, + 283, + 1 + ], + [ + 923, + 923, + 2 + ], + [ + 1026, + 176, + 4 + ], + [ + 256, + 1025, + 2 + ], + [ + 568, + 348, + 2 + ], + [ + 483, + 483, + 3 + ], + [ + 322, + 1039, + 2 + ], + [ + 433, + 330, + 1 + ], + [ + 412, + 1049, + 2 + ], + [ + 229, + 301, + 2 + ], + [ + 382, + 382, + 3 + ], + [ + 1027, + 1067, + 1 + ], + [ + 665, + 665, + 2 + ], + [ + 436, + 436, + 3 + ], + [ + 357, + 339, + 2 + ], + [ + 1028, + 1129, + 1 + ], + [ + 529, + 529, + 3 + ], + [ + 202, + 651, + 2 + ], + [ + 747, + 747, + 2 + ], + [ + 18, + 17, + 1 + ], + [ + 1159, + 1028, + 1 + ], + [ + 252, + 451, + 2 + ], + [ + 1060, + 281, + 2 + ], + [ + 175, + 175, + 5 + ], + [ + 971, + 971, + 1 + ], + [ + 234, + 318, + 3 + ], + [ + 564, + 564, + 2 + ], + [ + 505, + 266, + 2 + ], + [ + 434, + 434, + 1 + ], + [ + 217, + 405, + 2 + ], + [ + 625, + 625, + 2 + ], + [ + 67, + 66, + 1 + ], + [ + 1160, + 1028, + 1 + ], + [ + 499, + 499, + 3 + ], + [ + 212, + 68, + 1 + ], + [ + 445, + 445, + 4 + ], + [ + 26, + 27, + 1 + ], + [ + 615, + 615, + 2 + ], + [ + 884, + 884, + 1 + ], + [ + 324, + 235, + 3 + ], + [ + 676, + 676, + 2 + ], + [ + 1058, + 214, + 4 + ], + [ + 255, + 255, + 1 + ], + [ + 1027, + 1069, + 1 + ], + [ + 375, + 1036, + 2 + ], + [ + 193, + 343, + 2 + ], + [ + 344, + 344, + 2 + ], + [ + 259, + 402, + 2 + ], + [ + 307, + 230, + 2 + ], + [ + 281, + 360, + 2 + ], + [ + 392, + 71, + 1 + ], + [ + 247, + 246, + 2 + ], + [ + 500, + 266, + 2 + ], + [ + 275, + 275, + 6 + ], + [ + 321, + 398, + 1 + ], + [ + 250, + 250, + 4 + ], + [ + 466, + 723, + 1 + ], + [ + 525, + 525, + 3 + ], + [ + 239, + 200, + 2 + ], + [ + 519, + 320, + 2 + ], + [ + 72, + 570, + 1 + ], + [ + 374, + 374, + 1 + ], + [ + 267, + 369, + 2 + ], + [ + 248, + 246, + 2 + ], + [ + 337, + 524, + 2 + ], + [ + 602, + 602, + 2 + ], + [ + 69, + 69, + 3 + ], + [ + 856, + 856, + 1 + ], + [ + 319, + 446, + 1 + ], + [ + 331, + 243, + 2 + ], + [ + 281, + 1026, + 2 + ], + [ + 457, + 326, + 1 + ], + [ + 240, + 240, + 5 + ], + [ + 241, + 241, + 5 + ], + [ + 190, + 453, + 2 + ], + [ + 351, + 351, + 2 + ], + [ + 209, + 209, + 3 + ], + [ + 23, + 24, + 1 + ], + [ + 273, + 273, + 7 + ], + [ + 540, + 540, + 3 + ], + [ + 1121, + 1121, + 2 + ], + [ + 715, + 715, + 2 + ], + [ + 244, + 336, + 2 + ], + [ + 631, + 631, + 2 + ], + [ + 1030, + 294, + 3 + ], + [ + 216, + 196, + 2 + ], + [ + 188, + 196, + 2 + ], + [ + 575, + 575, + 3 + ], + [ + 550, + 339, + 2 + ], + [ + 491, + 491, + 2 + ], + [ + 190, + 449, + 2 + ], + [ + 1116, + 1116, + 2 + ], + [ + 1030, + 296, + 3 + ], + [ + 205, + 194, + 1 + ], + [ + 1027, + 1079, + 3 + ], + [ + 729, + 729, + 1 + ], + [ + 331, + 243, + 1 + ], + [ + 256, + 245, + 2 + ], + [ + 1059, + 349, + 4 + ], + [ + 285, + 322, + 2 + ], + [ + 613, + 613, + 2 + ], + [ + 270, + 270, + 1 + ], + [ + 549, + 549, + 2 + ], + [ + 199, + 242, + 2 + ], + [ + 939, + 939, + 2 + ], + [ + 1024, + 369, + 4 + ], + [ + 1028, + 1132, + 1 + ], + [ + 1073, + 1040, + 1 + ], + [ + 276, + 348, + 2 + ], + [ + 201, + 249, + 2 + ], + [ + 1167, + 332, + 4 + ], + [ + 278, + 278, + 1 + ], + [ + 403, + 193, + 2 + ], + [ + 503, + 264, + 2 + ], + [ + 239, + 200, + 1 + ], + [ + 1111, + 71, + 2 + ], + [ + 1029, + 1029, + 1 + ], + [ + 327, + 258, + 2 + ], + [ + 496, + 496, + 4 + ], + [ + 271, + 271, + 5 + ], + [ + 294, + 174, + 2 + ], + [ + 444, + 315, + 1 + ], + [ + 279, + 279, + 5 + ], + [ + 312, + 312, + 5 + ], + [ + 514, + 514, + 3 + ], + [ + 301, + 229, + 2 + ], + [ + 249, + 201, + 2 + ], + [ + 425, + 425, + 3 + ], + [ + 329, + 322, + 2 + ], + [ + 478, + 668, + 1 + ], + [ + 326, + 457, + 1 + ], + [ + 452, + 452, + 1 + ], + [ + 892, + 892, + 1 + ], + [ + 1148, + 73, + 2 + ], + [ + 338, + 338, + 4 + ], + [ + 1166, + 325, + 4 + ], + [ + 357, + 288, + 2 + ], + [ + 272, + 295, + 2 + ], + [ + 903, + 903, + 1 + ], + [ + 138, + 660, + 1 + ], + [ + 843, + 843, + 1 + ], + [ + 362, + 563, + 2 + ], + [ + 335, + 335, + 3 + ], + [ + 1165, + 1028, + 1 + ], + [ + 102, + 103, + 1 + ], + [ + 409, + 193, + 2 + ], + [ + 74, + 1593, + 1 + ], + [ + 236, + 219, + 2 + ], + [ + 334, + 534, + 2 + ], + [ + 412, + 367, + 2 + ], + [ + 290, + 223, + 2 + ], + [ + 799, + 799, + 2 + ], + [ + 512, + 299, + 2 + ], + [ + 1075, + 272, + 4 + ], + [ + 370, + 370, + 4 + ], + [ + 488, + 488, + 4 + ], + [ + 398, + 321, + 1 + ], + [ + 284, + 284, + 7 + ], + [ + 104, + 103, + 1 + ], + [ + 896, + 896, + 1 + ], + [ + 617, + 617, + 2 + ], + [ + 443, + 443, + 4 + ], + [ + 688, + 688, + 2 + ], + [ + 1070, + 1070, + 4 + ], + [ + 738, + 738, + 2 + ], + [ + 99, + 98, + 1 + ], + [ + 418, + 418, + 3 + ], + [ + 254, + 247, + 2 + ], + [ + 230, + 235, + 2 + ], + [ + 391, + 391, + 4 + ], + [ + 1040, + 217, + 6 + ], + [ + 66, + 194, + 1 + ], + [ + 766, + 766, + 2 + ], + [ + 253, + 328, + 2 + ], + [ + 389, + 389, + 4 + ], + [ + 1046, + 322, + 4 + ], + [ + 272, + 256, + 2 + ], + [ + 245, + 256, + 2 + ], + [ + 318, + 234, + 3 + ], + [ + 897, + 897, + 2 + ], + [ + 528, + 528, + 3 + ], + [ + 1075, + 273, + 4 + ], + [ + 246, + 214, + 2 + ], + [ + 397, + 202, + 2 + ], + [ + 280, + 343, + 2 + ], + [ + 487, + 487, + 3 + ], + [ + 633, + 633, + 2 + ], + [ + 1036, + 1053, + 4 + ], + [ + 260, + 343, + 3 + ], + [ + 60, + 1693, + 1 + ], + [ + 69, + 70, + 2 + ], + [ + 296, + 176, + 2 + ], + [ + 232, + 232, + 3 + ], + [ + 274, + 274, + 2 + ], + [ + 107, + 108, + 1 + ], + [ + 542, + 214, + 2 + ], + [ + 243, + 331, + 1 + ], + [ + 1270, + 466, + 1 + ], + [ + 1106, + 1106, + 2 + ], + [ + 621, + 621, + 2 + ], + [ + 363, + 363, + 3 + ], + [ + 188, + 421, + 2 + ], + [ + 675, + 675, + 2 + ], + [ + 203, + 203, + 3 + ], + [ + 212, + 237, + 1 + ], + [ + 1027, + 365, + 1 + ], + [ + 201, + 325, + 2 + ], + [ + 1152, + 254, + 7 + ], + [ + 1191, + 378, + 4 + ], + [ + 426, + 190, + 2 + ], + [ + 244, + 309, + 2 + ], + [ + 251, + 240, + 2 + ], + [ + 1075, + 269, + 4 + ], + [ + 516, + 516, + 3 + ], + [ + 249, + 367, + 2 + ], + [ + 1080, + 267, + 4 + ], + [ + 816, + 816, + 2 + ], + [ + 188, + 424, + 2 + ], + [ + 314, + 314, + 5 + ], + [ + 518, + 518, + 4 + ], + [ + 1044, + 1024, + 4 + ], + [ + 1068, + 1068, + 1 + ], + [ + 327, + 327, + 4 + ], + [ + 285, + 216, + 1 + ], + [ + 199, + 242, + 1 + ], + [ + 1027, + 1067, + 5 + ], + [ + 592, + 481, + 2 + ], + [ + 508, + 508, + 1 + ], + [ + 513, + 513, + 2 + ], + [ + 313, + 313, + 6 + ], + [ + 248, + 476, + 2 + ], + [ + 252, + 210, + 2 + ], + [ + 1028, + 379, + 1 + ], + [ + 328, + 253, + 2 + ], + [ + 76, + 75, + 1 + ], + [ + 340, + 340, + 5 + ], + [ + 792, + 792, + 2 + ], + [ + 469, + 469, + 3 + ], + [ + 618, + 618, + 2 + ], + [ + 404, + 262, + 2 + ], + [ + 512, + 264, + 2 + ], + [ + 405, + 405, + 3 + ], + [ + 246, + 247, + 2 + ], + [ + 1178, + 304, + 4 + ], + [ + 931, + 931, + 1 + ], + [ + 1152, + 248, + 7 + ], + [ + 58, + 59, + 1 + ], + [ + 229, + 229, + 7 + ], + [ + 294, + 275, + 2 + ], + [ + 1057, + 329, + 4 + ], + [ + 280, + 277, + 2 + ], + [ + 765, + 765, + 2 + ], + [ + 475, + 371, + 2 + ], + [ + 446, + 319, + 1 + ], + [ + 386, + 386, + 1 + ], + [ + 1152, + 247, + 7 + ], + [ + 603, + 603, + 3 + ], + [ + 1138, + 322, + 4 + ], + [ + 429, + 429, + 3 + ], + [ + 422, + 323, + 2 + ], + [ + 305, + 237, + 1 + ], + [ + 493, + 266, + 2 + ], + [ + 558, + 214, + 2 + ], + [ + 536, + 536, + 3 + ], + [ + 465, + 330, + 2 + ], + [ + 210, + 252, + 1 + ], + [ + 636, + 636, + 2 + ], + [ + 273, + 251, + 2 + ], + [ + 230, + 307, + 2 + ], + [ + 419, + 310, + 2 + ], + [ + 255, + 352, + 2 + ], + [ + 1033, + 262, + 6 + ], + [ + 362, + 279, + 2 + ], + [ + 248, + 424, + 2 + ], + [ + 315, + 413, + 1 + ], + [ + 1027, + 1069, + 5 + ], + [ + 720, + 720, + 2 + ], + [ + 431, + 190, + 2 + ], + [ + 1027, + 1097, + 3 + ], + [ + 435, + 193, + 2 + ], + [ + 296, + 260, + 2 + ], + [ + 498, + 264, + 2 + ], + [ + 334, + 1039, + 2 + ], + [ + 573, + 573, + 2 + ], + [ + 315, + 413, + 2 + ], + [ + 782, + 782, + 2 + ], + [ + 216, + 268, + 2 + ], + [ + 200, + 239, + 1 + ], + [ + 383, + 383, + 4 + ], + [ + 760, + 660, + 1 + ], + [ + 908, + 908, + 1 + ], + [ + 1028, + 1179, + 1 + ], + [ + 342, + 342, + 5 + ], + [ + 347, + 347, + 1 + ], + [ + 449, + 449, + 4 + ], + [ + 519, + 264, + 2 + ], + [ + 742, + 742, + 2 + ], + [ + 188, + 375, + 2 + ], + [ + 494, + 494, + 4 + ], + [ + 266, + 505, + 2 + ], + [ + 373, + 373, + 3 + ], + [ + 807, + 807, + 2 + ], + [ + 325, + 201, + 2 + ], + [ + 485, + 485, + 3 + ], + [ + 254, + 1044, + 2 + ], + [ + 356, + 356, + 1 + ], + [ + 456, + 456, + 4 + ], + [ + 64, + 1124, + 1 + ], + [ + 346, + 346, + 3 + ], + [ + 691, + 691, + 1 + ], + [ + 294, + 260, + 2 + ], + [ + 537, + 537, + 3 + ], + [ + 277, + 280, + 2 + ], + [ + 454, + 634, + 1 + ], + [ + 1148, + 1148, + 2 + ], + [ + 254, + 248, + 2 + ], + [ + 566, + 566, + 3 + ], + [ + 196, + 201, + 2 + ], + [ + 355, + 355, + 1 + ], + [ + 256, + 272, + 2 + ], + [ + 440, + 308, + 1 + ], + [ + 328, + 396, + 2 + ], + [ + 647, + 430, + 1 + ], + [ + 255, + 201, + 2 + ], + [ + 189, + 189, + 2 + ], + [ + 698, + 698, + 2 + ], + [ + 268, + 262, + 2 + ], + [ + 460, + 460, + 4 + ], + [ + 257, + 369, + 2 + ], + [ + 1076, + 1076, + 4 + ], + [ + 1183, + 307, + 4 + ], + [ + 225, + 195, + 2 + ], + [ + 316, + 316, + 5 + ], + [ + 1190, + 299, + 4 + ], + [ + 288, + 288, + 4 + ], + [ + 1024, + 362, + 4 + ], + [ + 1285, + 317, + 4 + ], + [ + 374, + 258, + 2 + ], + [ + 265, + 217, + 2 + ], + [ + 266, + 538, + 2 + ], + [ + 552, + 552, + 2 + ], + [ + 1027, + 1126, + 1 + ], + [ + 245, + 258, + 2 + ], + [ + 275, + 360, + 2 + ], + [ + 190, + 477, + 2 + ], + [ + 1155, + 210, + 4 + ], + [ + 304, + 503, + 2 + ], + [ + 556, + 556, + 3 + ], + [ + 62, + 64, + 1 + ], + [ + 278, + 278, + 5 + ], + [ + 294, + 403, + 2 + ], + [ + 128, + 127, + 1 + ], + [ + 417, + 262, + 2 + ], + [ + 251, + 332, + 3 + ], + [ + 942, + 597, + 1 + ], + [ + 1046, + 262, + 4 + ], + [ + 645, + 645, + 2 + ], + [ + 351, + 351, + 5 + ], + [ + 376, + 376, + 3 + ], + [ + 261, + 406, + 2 + ], + [ + 433, + 330, + 2 + ], + [ + 658, + 658, + 2 + ], + [ + 898, + 898, + 2 + ], + [ + 757, + 757, + 2 + ], + [ + 1026, + 222, + 4 + ], + [ + 364, + 258, + 2 + ], + [ + 696, + 289, + 2 + ], + [ + 360, + 275, + 2 + ], + [ + 1028, + 388, + 1 + ], + [ + 176, + 174, + 6 + ], + [ + 1513, + 106, + 2 + ], + [ + 314, + 1025, + 2 + ], + [ + 234, + 320, + 4 + ], + [ + 226, + 308, + 2 + ], + [ + 741, + 578, + 2 + ], + [ + 644, + 644, + 2 + ], + [ + 501, + 501, + 4 + ], + [ + 1130, + 1028, + 1 + ], + [ + 202, + 196, + 2 + ], + [ + 70, + 71, + 2 + ], + [ + 247, + 421, + 2 + ], + [ + 295, + 272, + 2 + ], + [ + 1075, + 295, + 4 + ], + [ + 273, + 256, + 2 + ], + [ + 1027, + 366, + 1 + ], + [ + 129, + 679, + 1 + ], + [ + 301, + 505, + 2 + ], + [ + 1067, + 1027, + 1 + ], + [ + 202, + 241, + 2 + ], + [ + 1118, + 281, + 5 + ], + [ + 441, + 193, + 2 + ], + [ + 1053, + 267, + 4 + ], + [ + 1154, + 283, + 4 + ], + [ + 260, + 296, + 2 + ], + [ + 1074, + 252, + 3 + ], + [ + 312, + 1025, + 2 + ], + [ + 385, + 385, + 3 + ], + [ + 523, + 523, + 3 + ], + [ + 230, + 299, + 4 + ], + [ + 181, + 192, + 1 + ], + [ + 18, + 19, + 1 + ], + [ + 338, + 1039, + 2 + ], + [ + 202, + 352, + 2 + ], + [ + 1174, + 321, + 4 + ], + [ + 427, + 293, + 2 + ], + [ + 216, + 279, + 2 + ], + [ + 378, + 283, + 2 + ], + [ + 16, + 15, + 1 + ], + [ + 327, + 402, + 2 + ], + [ + 1069, + 1027, + 1 + ], + [ + 400, + 400, + 3 + ], + [ + 453, + 453, + 4 + ], + [ + 242, + 199, + 1 + ], + [ + 246, + 348, + 2 + ], + [ + 1050, + 1050, + 3 + ], + [ + 276, + 276, + 5 + ], + [ + 411, + 411, + 4 + ], + [ + 269, + 1084, + 2 + ], + [ + 190, + 491, + 2 + ], + [ + 393, + 393, + 4 + ], + [ + 217, + 254, + 2 + ], + [ + 413, + 315, + 1 + ], + [ + 498, + 313, + 2 + ], + [ + 353, + 353, + 5 + ], + [ + 227, + 300, + 1 + ], + [ + 70, + 69, + 2 + ], + [ + 1152, + 265, + 7 + ], + [ + 714, + 714, + 2 + ], + [ + 1024, + 334, + 4 + ], + [ + 718, + 718, + 2 + ], + [ + 311, + 311, + 2 + ], + [ + 412, + 241, + 2 + ], + [ + 219, + 219, + 5 + ], + [ + 452, + 451, + 2 + ], + [ + 1028, + 1226, + 1 + ], + [ + 446, + 323, + 1 + ], + [ + 229, + 304, + 4 + ], + [ + 260, + 294, + 2 + ], + [ + 333, + 333, + 1 + ], + [ + 1049, + 1059, + 4 + ], + [ + 230, + 234, + 2 + ], + [ + 416, + 285, + 2 + ], + [ + 1192, + 236, + 4 + ], + [ + 65, + 65, + 3 + ], + [ + 595, + 217, + 2 + ], + [ + 1223, + 235, + 4 + ], + [ + 67, + 67, + 3 + ], + [ + 522, + 522, + 3 + ], + [ + 68, + 237, + 1 + ], + [ + 961, + 961, + 2 + ], + [ + 793, + 793, + 2 + ], + [ + 1117, + 262, + 4 + ], + [ + 504, + 382, + 2 + ], + [ + 265, + 405, + 2 + ], + [ + 368, + 335, + 2 + ], + [ + 1028, + 1219, + 1 + ], + [ + 299, + 299, + 6 + ], + [ + 510, + 339, + 2 + ], + [ + 520, + 520, + 3 + ], + [ + 259, + 259, + 1 + ], + [ + 398, + 300, + 1 + ], + [ + 369, + 459, + 2 + ], + [ + 1027, + 1063, + 3 + ], + [ + 249, + 354, + 2 + ], + [ + 490, + 490, + 3 + ], + [ + 252, + 1074, + 1 + ], + [ + 336, + 430, + 1 + ], + [ + 337, + 337, + 3 + ], + [ + 1024, + 325, + 4 + ], + [ + 272, + 251, + 2 + ], + [ + 458, + 193, + 2 + ], + [ + 195, + 244, + 2 + ], + [ + 442, + 258, + 2 + ], + [ + 1141, + 1141, + 1 + ], + [ + 245, + 245, + 5 + ], + [ + 1129, + 1028, + 1 + ], + [ + 217, + 248, + 2 + ], + [ + 359, + 359, + 4 + ], + [ + 222, + 193, + 2 + ], + [ + 30, + 29, + 1 + ], + [ + 1031, + 289, + 5 + ], + [ + 659, + 659, + 2 + ], + [ + 1586, + 22, + 2 + ], + [ + 285, + 285, + 4 + ], + [ + 334, + 628, + 2 + ], + [ + 462, + 462, + 4 + ], + [ + 217, + 247, + 2 + ], + [ + 1181, + 1027, + 1 + ], + [ + 314, + 251, + 2 + ], + [ + 1042, + 174, + 2 + ], + [ + 690, + 690, + 2 + ], + [ + 531, + 531, + 3 + ], + [ + 1027, + 345, + 1 + ], + [ + 1529, + 100, + 2 + ], + [ + 324, + 538, + 2 + ], + [ + 417, + 338, + 2 + ], + [ + 197, + 221, + 2 + ], + [ + 280, + 277, + 1 + ], + [ + 229, + 235, + 2 + ], + [ + 350, + 350, + 3 + ], + [ + 215, + 215, + 3 + ], + [ + 1119, + 1119, + 4 + ], + [ + 225, + 309, + 1 + ], + [ + 296, + 275, + 2 + ], + [ + 1024, + 1056, + 4 + ], + [ + 226, + 323, + 2 + ], + [ + 292, + 292, + 3 + ], + [ + 415, + 415, + 4 + ], + [ + 105, + 106, + 1 + ], + [ + 246, + 1046, + 2 + ], + [ + 174, + 190, + 2 + ], + [ + 205, + 66, + 2 + ], + [ + 289, + 627, + 2 + ], + [ + 1024, + 338, + 4 + ], + [ + 72, + 1003, + 1 + ], + [ + 234, + 230, + 2 + ], + [ + 699, + 699, + 2 + ], + [ + 727, + 727, + 2 + ], + [ + 1030, + 1026, + 1 + ], + [ + 201, + 375, + 2 + ], + [ + 214, + 1036, + 3 + ], + [ + 210, + 317, + 2 + ], + [ + 712, + 712, + 2 + ], + [ + 713, + 713, + 2 + ], + [ + 1503, + 17, + 2 + ], + [ + 495, + 495, + 3 + ], + [ + 438, + 266, + 1 + ], + [ + 1075, + 314, + 4 + ], + [ + 305, + 70, + 1 + ], + [ + 1132, + 1028, + 1 + ], + [ + 635, + 408, + 1 + ], + [ + 296, + 409, + 2 + ], + [ + 457, + 321, + 1 + ], + [ + 265, + 1072, + 2 + ], + [ + 716, + 716, + 2 + ], + [ + 277, + 280, + 1 + ], + [ + 328, + 188, + 2 + ], + [ + 261, + 261, + 6 + ], + [ + 500, + 500, + 3 + ], + [ + 247, + 254, + 2 + ], + [ + 198, + 243, + 2 + ], + [ + 434, + 253, + 2 + ], + [ + 175, + 175, + 6 + ], + [ + 429, + 279, + 2 + ], + [ + 249, + 358, + 2 + ], + [ + 247, + 423, + 2 + ], + [ + 228, + 228, + 1 + ], + [ + 250, + 196, + 2 + ], + [ + 419, + 310, + 1 + ], + [ + 355, + 355, + 4 + ], + [ + 240, + 253, + 2 + ], + [ + 425, + 284, + 2 + ], + [ + 1198, + 66, + 2 + ], + [ + 63, + 378, + 1 + ], + [ + 489, + 489, + 4 + ], + [ + 521, + 521, + 3 + ], + [ + 1057, + 1057, + 3 + ], + [ + 1042, + 176, + 2 + ], + [ + 193, + 174, + 4 + ], + [ + 673, + 673, + 2 + ], + [ + 396, + 361, + 2 + ], + [ + 149, + 149, + 2 + ], + [ + 259, + 1058, + 3 + ], + [ + 756, + 756, + 2 + ], + [ + 313, + 235, + 4 + ], + [ + 364, + 402, + 2 + ], + [ + 332, + 190, + 2 + ], + [ + 583, + 217, + 2 + ], + [ + 327, + 188, + 2 + ], + [ + 465, + 330, + 1 + ], + [ + 1038, + 1038, + 1 + ], + [ + 1082, + 1082, + 4 + ], + [ + 202, + 436, + 2 + ], + [ + 464, + 464, + 1 + ], + [ + 666, + 666, + 2 + ], + [ + 1098, + 397, + 2 + ], + [ + 256, + 273, + 2 + ], + [ + 268, + 216, + 2 + ], + [ + 1088, + 275, + 4 + ], + [ + 1083, + 260, + 5 + ], + [ + 269, + 312, + 2 + ], + [ + 291, + 291, + 3 + ], + [ + 1024, + 348, + 4 + ], + [ + 1224, + 200, + 1 + ], + [ + 1100, + 1100, + 2 + ], + [ + 1024, + 1055, + 4 + ], + [ + 972, + 972, + 1 + ], + [ + 620, + 480, + 2 + ], + [ + 381, + 381, + 4 + ], + [ + 248, + 254, + 2 + ], + [ + 1028, + 1130, + 3 + ], + [ + 532, + 532, + 3 + ], + [ + 1196, + 301, + 4 + ], + [ + 722, + 827, + 1 + ], + [ + 318, + 266, + 1 + ], + [ + 543, + 543, + 1 + ], + [ + 791, + 791, + 2 + ], + [ + 294, + 281, + 2 + ], + [ + 468, + 468, + 4 + ], + [ + 374, + 374, + 4 + ], + [ + 264, + 428, + 1 + ], + [ + 190, + 479, + 2 + ], + [ + 26, + 25, + 1 + ], + [ + 1075, + 312, + 4 + ], + [ + 473, + 473, + 4 + ], + [ + 1025, + 196, + 4 + ], + [ + 735, + 735, + 2 + ], + [ + 1052, + 379, + 2 + ], + [ + 544, + 544, + 3 + ], + [ + 210, + 241, + 2 + ], + [ + 404, + 334, + 2 + ], + [ + 1049, + 352, + 4 + ], + [ + 356, + 356, + 4 + ], + [ + 1031, + 1029, + 1 + ], + [ + 1243, + 1027, + 1 + ], + [ + 472, + 472, + 3 + ], + [ + 276, + 201, + 2 + ], + [ + 248, + 439, + 2 + ], + [ + 110, + 111, + 1 + ], + [ + 1028, + 1146, + 1 + ], + [ + 1211, + 309, + 4 + ], + [ + 227, + 321, + 1 + ], + [ + 345, + 345, + 3 + ], + [ + 390, + 577, + 2 + ], + [ + 1024, + 405, + 4 + ], + [ + 506, + 506, + 3 + ], + [ + 380, + 380, + 4 + ], + [ + 511, + 511, + 3 + ], + [ + 304, + 229, + 4 + ], + [ + 1232, + 234, + 4 + ], + [ + 202, + 316, + 2 + ], + [ + 230, + 307, + 4 + ], + [ + 904, + 904, + 2 + ], + [ + 1120, + 235, + 6 + ], + [ + 70, + 70, + 3 + ], + [ + 889, + 889, + 1 + ], + [ + 1030, + 1168, + 1 + ], + [ + 887, + 887, + 2 + ], + [ + 1024, + 347, + 4 + ], + [ + 329, + 514, + 2 + ], + [ + 1041, + 174, + 2 + ], + [ + 1040, + 214, + 6 + ], + [ + 164, + 164, + 2 + ], + [ + 222, + 222, + 3 + ], + [ + 440, + 440, + 3 + ], + [ + 267, + 1080, + 2 + ], + [ + 1382, + 478, + 2 + ], + [ + 554, + 554, + 3 + ], + [ + 559, + 559, + 4 + ], + [ + 1041, + 332, + 2 + ], + [ + 407, + 407, + 1 + ], + [ + 810, + 810, + 2 + ], + [ + 1059, + 1059, + 4 + ], + [ + 527, + 527, + 4 + ], + [ + 193, + 176, + 4 + ], + [ + 692, + 692, + 2 + ], + [ + 336, + 478, + 1 + ], + [ + 155, + 155, + 2 + ], + [ + 1028, + 1129, + 3 + ], + [ + 242, + 315, + 1 + ], + [ + 822, + 822, + 2 + ], + [ + 1024, + 359, + 4 + ], + [ + 1106, + 66, + 2 + ], + [ + 1308, + 454, + 2 + ], + [ + 69, + 68, + 1 + ], + [ + 463, + 241, + 2 + ], + [ + 188, + 423, + 2 + ], + [ + 243, + 300, + 2 + ], + [ + 272, + 1091, + 2 + ], + [ + 196, + 250, + 2 + ], + [ + 361, + 253, + 2 + ], + [ + 1036, + 1044, + 4 + ], + [ + 1219, + 1028, + 1 + ], + [ + 1041, + 1278, + 2 + ], + [ + 1195, + 347, + 4 + ], + [ + 176, + 190, + 2 + ], + [ + 805, + 805, + 1 + ], + [ + 1002, + 1002, + 1 + ], + [ + 461, + 461, + 1 + ], + [ + 1179, + 1028, + 1 + ], + [ + 289, + 436, + 2 + ], + [ + 474, + 296, + 2 + ], + [ + 320, + 234, + 4 + ], + [ + 1027, + 350, + 1 + ], + [ + 1045, + 1029, + 1 + ], + [ + 1077, + 68, + 2 + ], + [ + 1028, + 1092, + 1 + ], + [ + 1103, + 1103, + 2 + ], + [ + 202, + 317, + 2 + ], + [ + 272, + 216, + 2 + ], + [ + 195, + 226, + 2 + ], + [ + 256, + 312, + 2 + ], + [ + 260, + 277, + 2 + ], + [ + 487, + 487, + 1 + ], + [ + 1074, + 252, + 1 + ], + [ + 341, + 341, + 5 + ], + [ + 1028, + 1132, + 3 + ], + [ + 1028, + 1169, + 1 + ], + [ + 420, + 420, + 2 + ], + [ + 251, + 273, + 2 + ], + [ + 403, + 294, + 2 + ], + [ + 516, + 325, + 2 + ], + [ + 802, + 802, + 2 + ], + [ + 471, + 241, + 2 + ], + [ + 284, + 281, + 2 + ], + [ + 229, + 301, + 4 + ], + [ + 589, + 589, + 1 + ], + [ + 299, + 512, + 2 + ], + [ + 188, + 1110, + 2 + ], + [ + 288, + 432, + 2 + ], + [ + 339, + 333, + 2 + ], + [ + 483, + 258, + 2 + ], + [ + 1228, + 338, + 4 + ], + [ + 529, + 529, + 4 + ], + [ + 20, + 19, + 1 + ], + [ + 371, + 475, + 2 + ], + [ + 305, + 305, + 3 + ], + [ + 1088, + 281, + 4 + ], + [ + 584, + 422, + 1 + ], + [ + 726, + 726, + 2 + ], + [ + 1291, + 316, + 4 + ], + [ + 283, + 378, + 1 + ], + [ + 598, + 550, + 2 + ], + [ + 64, + 63, + 2 + ], + [ + 216, + 217, + 2 + ], + [ + 343, + 280, + 3 + ], + [ + 560, + 560, + 3 + ], + [ + 1025, + 1028, + 1 + ], + [ + 1058, + 1058, + 3 + ], + [ + 447, + 193, + 2 + ], + [ + 601, + 601, + 1 + ], + [ + 306, + 306, + 3 + ], + [ + 470, + 253, + 2 + ], + [ + 1139, + 1139, + 2 + ], + [ + 312, + 256, + 2 + ], + [ + 482, + 294, + 2 + ], + [ + 264, + 503, + 2 + ], + [ + 481, + 481, + 3 + ], + [ + 220, + 220, + 1 + ], + [ + 235, + 230, + 3 + ], + [ + 282, + 282, + 3 + ], + [ + 465, + 319, + 1 + ], + [ + 1134, + 259, + 2 + ], + [ + 1028, + 1091, + 1 + ], + [ + 1260, + 428, + 4 + ], + [ + 240, + 332, + 3 + ], + [ + 300, + 398, + 1 + ], + [ + 1105, + 326, + 1 + ], + [ + 467, + 467, + 4 + ], + [ + 1031, + 289, + 1 + ], + [ + 1460, + 109, + 2 + ], + [ + 216, + 272, + 2 + ], + [ + 996, + 996, + 1 + ], + [ + 174, + 176, + 5 + ], + [ + 307, + 307, + 6 + ], + [ + 446, + 323, + 2 + ], + [ + 322, + 534, + 2 + ], + [ + 201, + 255, + 2 + ], + [ + 1027, + 1063, + 5 + ], + [ + 231, + 310, + 2 + ], + [ + 535, + 646, + 2 + ], + [ + 205, + 232, + 2 + ], + [ + 231, + 330, + 2 + ], + [ + 279, + 257, + 2 + ], + [ + 295, + 370, + 2 + ], + [ + 736, + 736, + 2 + ], + [ + 1088, + 294, + 4 + ], + [ + 706, + 706, + 2 + ], + [ + 252, + 210, + 1 + ], + [ + 772, + 772, + 1 + ], + [ + 298, + 298, + 3 + ], + [ + 1084, + 1028, + 1 + ], + [ + 190, + 562, + 2 + ], + [ + 277, + 260, + 2 + ], + [ + 546, + 546, + 4 + ], + [ + 778, + 778, + 2 + ], + [ + 524, + 346, + 2 + ], + [ + 647, + 478, + 1 + ], + [ + 214, + 542, + 2 + ], + [ + 269, + 314, + 2 + ], + [ + 284, + 275, + 2 + ], + [ + 1028, + 1173, + 1 + ], + [ + 477, + 477, + 4 + ], + [ + 569, + 569, + 1 + ], + [ + 409, + 296, + 2 + ], + [ + 1028, + 1084, + 1 + ], + [ + 191, + 191, + 1 + ], + [ + 1024, + 327, + 4 + ], + [ + 318, + 234, + 4 + ], + [ + 349, + 1029, + 2 + ], + [ + 515, + 515, + 3 + ], + [ + 379, + 314, + 2 + ], + [ + 604, + 604, + 1 + ], + [ + 250, + 347, + 2 + ], + [ + 357, + 357, + 1 + ], + [ + 196, + 216, + 2 + ], + [ + 416, + 285, + 1 + ], + [ + 1226, + 1028, + 1 + ], + [ + 235, + 229, + 2 + ], + [ + 269, + 272, + 2 + ], + [ + 509, + 509, + 3 + ], + [ + 1267, + 398, + 1 + ], + [ + 1092, + 1028, + 1 + ], + [ + 188, + 439, + 2 + ], + [ + 196, + 257, + 2 + ], + [ + 786, + 786, + 2 + ], + [ + 1036, + 325, + 4 + ], + [ + 377, + 377, + 4 + ], + [ + 463, + 317, + 2 + ], + [ + 349, + 352, + 2 + ], + [ + 173, + 173, + 2 + ], + [ + 555, + 555, + 3 + ], + [ + 242, + 321, + 1 + ], + [ + 62, + 843, + 1 + ], + [ + 243, + 331, + 2 + ], + [ + 228, + 228, + 6 + ], + [ + 423, + 254, + 2 + ], + [ + 466, + 100, + 1 + ], + [ + 225, + 315, + 1 + ], + [ + 399, + 794, + 2 + ], + [ + 266, + 324, + 1 + ], + [ + 355, + 253, + 2 + ], + [ + 320, + 320, + 6 + ], + [ + 1033, + 1033, + 3 + ], + [ + 315, + 225, + 2 + ], + [ + 866, + 866, + 2 + ], + [ + 275, + 284, + 2 + ], + [ + 326, + 1312, + 1 + ], + [ + 24, + 25, + 1 + ], + [ + 1088, + 260, + 4 + ], + [ + 264, + 498, + 2 + ], + [ + 1112, + 1031, + 1 + ], + [ + 406, + 406, + 4 + ], + [ + 392, + 71, + 2 + ], + [ + 204, + 204, + 4 + ], + [ + 1343, + 410, + 1 + ], + [ + 588, + 430, + 1 + ], + [ + 239, + 1141, + 1 + ], + [ + 806, + 806, + 2 + ], + [ + 275, + 296, + 2 + ], + [ + 177, + 177, + 2 + ], + [ + 785, + 785, + 2 + ], + [ + 1024, + 328, + 4 + ], + [ + 1088, + 296, + 4 + ], + [ + 611, + 611, + 1 + ], + [ + 484, + 484, + 4 + ], + [ + 214, + 558, + 2 + ], + [ + 329, + 536, + 2 + ], + [ + 322, + 547, + 2 + ], + [ + 235, + 313, + 4 + ], + [ + 211, + 211, + 2 + ], + [ + 1206, + 343, + 4 + ], + [ + 266, + 318, + 1 + ], + [ + 1361, + 185, + 1 + ], + [ + 1045, + 1045, + 1 + ], + [ + 362, + 362, + 1 + ], + [ + 244, + 308, + 2 + ], + [ + 251, + 272, + 2 + ], + [ + 360, + 385, + 3 + ], + [ + 286, + 286, + 4 + ], + [ + 1028, + 190, + 5 + ], + [ + 421, + 246, + 2 + ], + [ + 1027, + 1072, + 3 + ], + [ + 1175, + 323, + 4 + ], + [ + 1290, + 410, + 2 + ], + [ + 1041, + 176, + 2 + ], + [ + 537, + 402, + 2 + ], + [ + 525, + 525, + 2 + ], + [ + 885, + 885, + 2 + ], + [ + 570, + 73, + 1 + ], + [ + 413, + 309, + 1 + ], + [ + 1088, + 280, + 4 + ], + [ + 14, + 15, + 1 + ], + [ + 1031, + 249, + 1 + ], + [ + 1026, + 1026, + 1 + ], + [ + 280, + 296, + 2 + ], + [ + 1040, + 246, + 6 + ], + [ + 304, + 304, + 6 + ], + [ + 1088, + 277, + 4 + ], + [ + 609, + 609, + 3 + ], + [ + 202, + 342, + 2 + ], + [ + 383, + 383, + 1 + ], + [ + 395, + 395, + 4 + ], + [ + 424, + 246, + 2 + ], + [ + 519, + 519, + 3 + ], + [ + 389, + 230, + 2 + ], + [ + 241, + 210, + 2 + ], + [ + 267, + 214, + 2 + ], + [ + 268, + 250, + 2 + ], + [ + 332, + 1096, + 2 + ], + [ + 138, + 139, + 1 + ], + [ + 1091, + 1028, + 1 + ], + [ + 528, + 396, + 2 + ], + [ + 1031, + 1112, + 3 + ], + [ + 259, + 459, + 2 + ], + [ + 105, + 104, + 1 + ], + [ + 902, + 902, + 2 + ], + [ + 297, + 297, + 4 + ], + [ + 1052, + 388, + 2 + ], + [ + 448, + 448, + 1 + ], + [ + 293, + 293, + 3 + ], + [ + 479, + 479, + 4 + ], + [ + 64, + 64, + 3 + ], + [ + 314, + 269, + 2 + ], + [ + 236, + 236, + 6 + ], + [ + 257, + 196, + 2 + ], + [ + 314, + 379, + 2 + ], + [ + 201, + 201, + 6 + ], + [ + 284, + 425, + 2 + ], + [ + 388, + 312, + 2 + ], + [ + 329, + 646, + 2 + ], + [ + 528, + 339, + 2 + ], + [ + 1154, + 283, + 1 + ], + [ + 968, + 968, + 2 + ], + [ + 1031, + 1220, + 1 + ], + [ + 275, + 294, + 2 + ], + [ + 376, + 436, + 2 + ], + [ + 1088, + 284, + 4 + ], + [ + 287, + 287, + 4 + ], + [ + 193, + 443, + 2 + ], + [ + 386, + 386, + 3 + ], + [ + 648, + 217, + 2 + ], + [ + 1039, + 359, + 4 + ], + [ + 216, + 285, + 1 + ], + [ + 557, + 557, + 4 + ], + [ + 271, + 271, + 6 + ], + [ + 580, + 580, + 3 + ], + [ + 1079, + 1027, + 1 + ], + [ + 476, + 476, + 1 + ], + [ + 1125, + 234, + 6 + ], + [ + 331, + 418, + 1 + ], + [ + 1035, + 370, + 6 + ], + [ + 1052, + 401, + 2 + ], + [ + 1035, + 174, + 6 + ], + [ + 433, + 310, + 1 + ], + [ + 1148, + 72, + 2 + ], + [ + 326, + 315, + 1 + ], + [ + 526, + 63, + 1 + ], + [ + 537, + 339, + 2 + ], + [ + 1015, + 1015, + 1 + ], + [ + 194, + 212, + 1 + ], + [ + 511, + 348, + 2 + ], + [ + 99, + 737, + 1 + ], + [ + 592, + 592, + 1 + ], + [ + 1140, + 1140, + 4 + ], + [ + 273, + 1092, + 2 + ], + [ + 364, + 364, + 4 + ], + [ + 280, + 294, + 2 + ], + [ + 257, + 255, + 2 + ], + [ + 308, + 422, + 1 + ], + [ + 244, + 309, + 1 + ], + [ + 530, + 530, + 3 + ], + [ + 301, + 229, + 4 + ], + [ + 517, + 517, + 4 + ], + [ + 202, + 340, + 2 + ], + [ + 190, + 456, + 2 + ], + [ + 1193, + 288, + 4 + ], + [ + 449, + 256, + 2 + ], + [ + 1035, + 176, + 6 + ], + [ + 567, + 567, + 3 + ], + [ + 101, + 100, + 1 + ], + [ + 264, + 512, + 2 + ], + [ + 1051, + 1051, + 3 + ], + [ + 1213, + 270, + 4 + ], + [ + 405, + 265, + 2 + ], + [ + 882, + 882, + 2 + ], + [ + 578, + 347, + 2 + ], + [ + 1025, + 351, + 4 + ], + [ + 235, + 324, + 4 + ], + [ + 655, + 217, + 2 + ], + [ + 261, + 393, + 2 + ], + [ + 507, + 248, + 2 + ], + [ + 1632, + 108, + 2 + ], + [ + 1044, + 254, + 4 + ], + [ + 245, + 381, + 2 + ], + [ + 1136, + 1136, + 2 + ], + [ + 344, + 344, + 5 + ], + [ + 561, + 398, + 1 + ], + [ + 349, + 249, + 2 + ], + [ + 452, + 451, + 1 + ], + [ + 272, + 269, + 2 + ], + [ + 281, + 284, + 2 + ], + [ + 626, + 626, + 3 + ], + [ + 804, + 804, + 2 + ], + [ + 1204, + 334, + 4 + ], + [ + 1158, + 1158, + 4 + ], + [ + 963, + 963, + 2 + ], + [ + 1058, + 254, + 4 + ], + [ + 193, + 234, + 2 + ], + [ + 299, + 230, + 4 + ], + [ + 533, + 533, + 4 + ], + [ + 770, + 770, + 2 + ], + [ + 281, + 294, + 2 + ], + [ + 352, + 255, + 2 + ], + [ + 267, + 375, + 2 + ], + [ + 593, + 497, + 2 + ], + [ + 312, + 269, + 2 + ], + [ + 258, + 374, + 2 + ], + [ + 279, + 216, + 2 + ], + [ + 840, + 840, + 2 + ], + [ + 875, + 875, + 2 + ], + [ + 242, + 199, + 2 + ], + [ + 307, + 230, + 4 + ], + [ + 416, + 579, + 1 + ], + [ + 749, + 749, + 2 + ], + [ + 624, + 289, + 2 + ], + [ + 1027, + 345, + 5 + ], + [ + 1027, + 1126, + 3 + ], + [ + 229, + 229, + 1 + ], + [ + 1617, + 1617, + 2 + ], + [ + 393, + 261, + 2 + ], + [ + 1384, + 181, + 2 + ], + [ + 208, + 208, + 1 + ], + [ + 338, + 547, + 2 + ], + [ + 368, + 368, + 3 + ], + [ + 242, + 1093, + 1 + ], + [ + 1231, + 300, + 4 + ], + [ + 485, + 485, + 1 + ], + [ + 280, + 1038, + 2 + ], + [ + 237, + 69, + 1 + ], + [ + 552, + 256, + 2 + ], + [ + 562, + 562, + 2 + ], + [ + 317, + 210, + 2 + ], + [ + 318, + 301, + 1 + ], + [ + 213, + 213, + 3 + ], + [ + 416, + 579, + 2 + ], + [ + 308, + 440, + 1 + ], + [ + 1026, + 360, + 4 + ], + [ + 201, + 276, + 2 + ], + [ + 1123, + 410, + 2 + ], + [ + 683, + 683, + 2 + ], + [ + 848, + 848, + 2 + ], + [ + 384, + 384, + 4 + ], + [ + 405, + 701, + 2 + ], + [ + 214, + 345, + 2 + ], + [ + 654, + 654, + 2 + ], + [ + 483, + 288, + 2 + ], + [ + 205, + 232, + 1 + ], + [ + 331, + 419, + 1 + ], + [ + 439, + 254, + 2 + ], + [ + 1170, + 260, + 4 + ], + [ + 190, + 341, + 2 + ], + [ + 675, + 375, + 2 + ], + [ + 838, + 838, + 2 + ], + [ + 68, + 68, + 3 + ], + [ + 333, + 288, + 2 + ], + [ + 475, + 662, + 2 + ], + [ + 98, + 98, + 1 + ], + [ + 1027, + 350, + 5 + ], + [ + 565, + 565, + 3 + ], + [ + 469, + 354, + 2 + ], + [ + 245, + 387, + 2 + ], + [ + 1028, + 1092, + 5 + ], + [ + 1244, + 66, + 2 + ], + [ + 1141, + 319, + 1 + ], + [ + 1124, + 1124, + 2 + ], + [ + 281, + 1118, + 2 + ], + [ + 249, + 571, + 2 + ], + [ + 330, + 465, + 1 + ], + [ + 502, + 502, + 3 + ], + [ + 508, + 390, + 1 + ], + [ + 872, + 872, + 2 + ], + [ + 480, + 399, + 2 + ], + [ + 722, + 137, + 1 + ], + [ + 400, + 277, + 2 + ], + [ + 470, + 470, + 1 + ], + [ + 474, + 474, + 4 + ], + [ + 1036, + 1073, + 4 + ], + [ + 1042, + 222, + 2 + ], + [ + 1027, + 1072, + 5 + ], + [ + 338, + 261, + 2 + ], + [ + 553, + 262, + 2 + ], + [ + 217, + 322, + 1 + ], + [ + 201, + 253, + 2 + ], + [ + 303, + 303, + 2 + ], + [ + 513, + 247, + 2 + ], + [ + 597, + 410, + 1 + ], + [ + 1027, + 1063, + 1 + ], + [ + 201, + 196, + 2 + ], + [ + 445, + 445, + 5 + ], + [ + 307, + 324, + 1 + ], + [ + 193, + 482, + 2 + ], + [ + 1046, + 246, + 4 + ], + [ + 326, + 321, + 1 + ], + [ + 251, + 314, + 2 + ], + [ + 890, + 634, + 1 + ], + [ + 182, + 218, + 1 + ], + [ + 1028, + 379, + 5 + ], + [ + 575, + 575, + 4 + ], + [ + 1052, + 414, + 2 + ] + ] +} diff --git a/variants/extended-1st-10mm-4k/profiles/joint/primitives.npz b/variants/extended-1st-10mm-4k/profiles/joint/primitives.npz index 1bfcb546b8dfda088eefb623ab59fa79ebfed288..fca3682bc570414725b0be9cf5578ee0df57f06a 100644 --- a/variants/extended-1st-10mm-4k/profiles/joint/primitives.npz +++ b/variants/extended-1st-10mm-4k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7 +oid sha256:8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1 size 2834 diff --git a/variants/extended-1st-10mm-4k/router_config.yaml b/variants/extended-1st-10mm-4k/router_config.yaml index 8ac3ba94b18894149fbf157fb5fb3a433bb944df..ee6c383fa495d942c323e218ffc1214fd06053be 100644 --- a/variants/extended-1st-10mm-4k/router_config.yaml +++ b/variants/extended-1st-10mm-4k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-10mm-8k/config.json b/variants/extended-1st-10mm-8k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-10mm-8k/config.json +++ b/variants/extended-1st-10mm-8k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-10mm-8k/profiles/eef/bpe.json b/variants/extended-1st-10mm-8k/profiles/eef/bpe.json index 95b432f2043426c57efbf33cb03c64a0feb3b4d4..0ad3143afaf132d44ffdd9412e896dcb5102b66a 100644 --- a/variants/extended-1st-10mm-8k/profiles/eef/bpe.json +++ b/variants/extended-1st-10mm-8k/profiles/eef/bpe.json @@ -1 +1,39550 @@ -{"spatial_merges": [[4, 13], [22, 84], [38, 61], [98, 99], [100, 101], [96, 102], [97, 102], [96, 100], [61, 96], [38, 96], [22, 98], [84, 98], [97, 100], [13, 99], [4, 99], [62, 107], [37, 106], [39, 106], [97, 101], [60, 107], [83, 108], [85, 108], [21, 109], [5, 111], [23, 109], [3, 111], [14, 112], [12, 112], [61, 97], [62, 96], [38, 60], [61, 116], [3, 13], [5, 13], [101, 113], [101, 117], [60, 96], [22, 83], [101, 114], [22, 85], [101, 115], [23, 84], [4, 14], [4, 12], [21, 84], [38, 62], [105, 120], [105, 122], [105, 118], [105, 119], [105, 121], [105, 123], [105, 125], [105, 124], [116, 128], [37, 126], [97, 128], [39, 126], [37, 129], [37, 127], [39, 129], [39, 127], [23, 98], [21, 98], [39, 134], [110, 120], [37, 134], [110, 119], [110, 118], [97, 143], [116, 143], [3, 99], [110, 121], [5, 99], [110, 125], [110, 124], [60, 97], [105, 130], [113, 122], [115, 124], [105, 131], [114, 125], [110, 122], [110, 123], [105, 140], [83, 160], [135, 141], [62, 97], [85, 160], [85, 161], [83, 161], [117, 120], [23, 85], [14, 169], [12, 171], [12, 169], [23, 83], [137, 141], [14, 171], [137, 140], [21, 85], [3, 12], [3, 14], [139, 141], [21, 83], [130, 139], [131, 142], [5, 12], [130, 142], [131, 139], [141, 142], [131, 135], [5, 14], [131, 137], [130, 137], [135, 140], [101, 159], [101, 157], [37, 174], [114, 118], [130, 135], [115, 119], [113, 123], [39, 174], [117, 121], [113, 118], [101, 162], [60, 116], [101, 164], [139, 140], [113, 119], [140, 142], [117, 119], [115, 123], [39, 185], [114, 121], [40, 106], [117, 118], [113, 121], [37, 185], [62, 116], [36, 106], [117, 123], [114, 123], [125, 153], [115, 118], [114, 119], [120, 154], [124, 155], [63, 107], [139, 175], [115, 121], [142, 178], [59, 107], [114, 122], [63, 96], [115, 122], [115, 120], [59, 96], [105, 183], [114, 120], [119, 155], [118, 153], [105, 186], [105, 187], [105, 188], [113, 124], [122, 167], [105, 184], [113, 125], [119, 154], [137, 182], [37, 225], [39, 225], [118, 154], [139, 178], [117, 125], [113, 203], [135, 178], [117, 124], [142, 175], [135, 182], [105, 193], [137, 175], [137, 178], [39, 238], [105, 191], [135, 175], [105, 196], [118, 167], [105, 195], [105, 201], [82, 108], [105, 192], [119, 167], [37, 238], [86, 108], [139, 182], [113, 183], [119, 153], [118, 155], [121, 154], [142, 182], [121, 153], [113, 186], [114, 184], [115, 197], [124, 159], [117, 122], [122, 157], [115, 191], [105, 208], [59, 97], [125, 157], [139, 199], [40, 127], [36, 127], [122, 159], [22, 82], [141, 194], [120, 155], [110, 187], [114, 193], [120, 153], [110, 188], [22, 86], [110, 204], [114, 192], [110, 184], [121, 155], [40, 134], [123, 155], [110, 197], [124, 162], [141, 202], [117, 204], [115, 213], [115, 196], [130, 198], [139, 200], [125, 164], [37, 253], [137, 200], [135, 205], [131, 194], [137, 199], [113, 120], [4, 15], [121, 167], [114, 195], [117, 206], [37, 256], [135, 199], [120, 162], [140, 198], [123, 167], [113, 190], [117, 187], [130, 202], [135, 210], [113, 207], [117, 188], [137, 210], [36, 126], [36, 134], [110, 209], [142, 205], [135, 200], [40, 126], [39, 253], [110, 211], [114, 201], [142, 200], [124, 154], [125, 154], [120, 164], [139, 205], [118, 157], [123, 154], [115, 227], [123, 153], [119, 159], [2, 13], [130, 194], [39, 256], [137, 205], [142, 210], [131, 202], [119, 162], [140, 190], [6, 13], [122, 153], [131, 198], [4, 11], [122, 155], [118, 164], [63, 97], [131, 190], [123, 157], [110, 183], [110, 208], [123, 159], [110, 192], [141, 190], [123, 162], [142, 199], [24, 84], [121, 157], [115, 229], [110, 229], [110, 186], [121, 164], [125, 167], [113, 201], [140, 194], [124, 167], [118, 159], [139, 210], [110, 196], [113, 227], [110, 218], [15, 112], [110, 195], [123, 164], [110, 206], [110, 212], [119, 157], [110, 213], [141, 198], [11, 112], [130, 190], [119, 164], [121, 159], [118, 162], [121, 162], [110, 203], [114, 208], [155, 197], [110, 193], [153, 184], [2, 12], [20, 84], [140, 202], [110, 207], [157, 201], [110, 191], [120, 167], [159, 227], [117, 207], [38, 310], [124, 234], [24, 85], [114, 209], [114, 124], [114, 183], [113, 212], [117, 212], [115, 212], [115, 125], [110, 201], [125, 239], [2, 111], [110, 227], [113, 218], [115, 186], [113, 209], [119, 221], [114, 218], [122, 154], [117, 229], [117, 211], [115, 211], [117, 209], [117, 208], [6, 111], [115, 187], [114, 207], [117, 218], [114, 188], [101, 234], [125, 216], [154, 187], [101, 239], [118, 216], [114, 203], [113, 211], [23, 86], [115, 203], [118, 237], [120, 221], [120, 216], [24, 83], [124, 221], [36, 174], [154, 188], [119, 232], [115, 206], [115, 204], [20, 85], [162, 229], [157, 183], [114, 204], [86, 160], [153, 192], [124, 232], [24, 109], [38, 394], [159, 186], [115, 218], [40, 174], [122, 247], [114, 211], [113, 193], [113, 213], [125, 237], [141, 316], [114, 212], [113, 184], [115, 183], [115, 209], [6, 12], [114, 186], [155, 191], [82, 160], [115, 207], [154, 204], [113, 197], [117, 197], [3, 15], [115, 188], [40, 185], [114, 206], [153, 195], [23, 82], [20, 83], [167, 183], [117, 184], [119, 216], [113, 191], [157, 203], [114, 187], [120, 251], [175, 190], [105, 290], [155, 213], [3, 11], [117, 195], [157, 193], [159, 203], [113, 195], [105, 294], [122, 232], [198, 200], [167, 186], [155, 229], [118, 221], [105, 312], [130, 354], [113, 196], [155, 196], [117, 193], [164, 208], [153, 193], [37, 310], [117, 213], [162, 191], [175, 194], [162, 206], [117, 192], [154, 206], [117, 191], [153, 208], [21, 86], [140, 323], [157, 184], [118, 232], [157, 207], [36, 185], [21, 82], [190, 199], [159, 191], [178, 202], [178, 198], [115, 419], [135, 345], [162, 187], [113, 192], [101, 247], [122, 237], [39, 310], [202, 205], [110, 290], [37, 96], [159, 197], [101, 251], [119, 237], [194, 205], [124, 153], [121, 216], [125, 155], [110, 294], [157, 192], [5, 15], [105, 337], [105, 317], [159, 213], [113, 381], [41, 106], [122, 164], [164, 206], [162, 197], [194, 199], [182, 190], [2, 14], [117, 196], [137, 391], [182, 198], [164, 193], [82, 161], [114, 427], [164, 188], [155, 187], [164, 192], [35, 106], [199, 202], [190, 200], [159, 196], [154, 208], [164, 184], [113, 312], [105, 332], [153, 209], [167, 203], [178, 194], [159, 183], [105, 384], [153, 201], [113, 206], [154, 229], [153, 188], [164, 195], [157, 195], [130, 404], [157, 186], [39, 96], [159, 207], [105, 357], [155, 227], [182, 194], [194, 200], [198, 210], [64, 107], [155, 212], [86, 161], [162, 213], [105, 343], [117, 183], [157, 209], [121, 221], [162, 212], [154, 209], [175, 198], [167, 207], [113, 342], [5, 11], [20, 109], [140, 316], [123, 232], [154, 211], [117, 186], [155, 211], [114, 317], [113, 204], [122, 162], [117, 336], [141, 323], [131, 354], [115, 340], [105, 364], [121, 237], [162, 204], [36, 253], [37, 394], [58, 107], [190, 210], [105, 350], [6, 14], [123, 221], [105, 360], [175, 202], [114, 350], [105, 401], [105, 365], [178, 190], [11, 169], [157, 312], [115, 387], [105, 341], [117, 356], [164, 204], [114, 374], [162, 196], [105, 340], [142, 380], [114, 341], [40, 253], [154, 197], [114, 343], [99, 438], [121, 232], [114, 312], [113, 337], [120, 159], [121, 251], [130, 439], [164, 218], [115, 352], [115, 365], [153, 218], [154, 184], [130, 323], [159, 211], [162, 188], [155, 186], [167, 218], [115, 360], [113, 317], [131, 316], [200, 202], [113, 188], [142, 388], [120, 157], [191, 234], [140, 354], [153, 183], [139, 380], [123, 237], [123, 216], [119, 234], [117, 390], [130, 316], [113, 187], [164, 187], [157, 317], [194, 210], [203, 247], [198, 199], [40, 256], [153, 204], [202, 210], [118, 239], [155, 206], [115, 357], [115, 370], [167, 184], [159, 387], [139, 388], [153, 211], [117, 203], [153, 187], [105, 383], [206, 251], [117, 385], [167, 212], [113, 412], [124, 366], [115, 337], [155, 188], [157, 342], [41, 127], [198, 205], [15, 169], [36, 256], [154, 212], [167, 201], [167, 197], [114, 332], [182, 202], [131, 323], [193, 239], [115, 415], [11, 171], [105, 374], [157, 212], [164, 207], [15, 171], [115, 412], [38, 116], [35, 126], [221, 229], [98, 449], [159, 337], [164, 209], [167, 227], [155, 209], [141, 354], [208, 216], [114, 213], [162, 352], [167, 209], [159, 218], [114, 383], [39, 394], [58, 97], [167, 211], [110, 352], [162, 211], [154, 195], [164, 211], [105, 426], [125, 361], [115, 345], [155, 218], [105, 370], [98, 489], [113, 503], [110, 332], [124, 313], [159, 212], [154, 213], [105, 415], [197, 234], [157, 218], [159, 395], [41, 134], [115, 195], [190, 205], [139, 391], [157, 374], [114, 401], [154, 192], [110, 385], [155, 204], [162, 336], [192, 239], [105, 403], [114, 342], [35, 127], [99, 518], [184, 239], [154, 218], [123, 234], [114, 403], [196, 234], [164, 212], [162, 209], [117, 352], [204, 251], [117, 332], [186, 247], [101, 314], [123, 239], [101, 313], [40, 129], [159, 412], [197, 221], [187, 221], [139, 438], [184, 216], [234, 419], [213, 234], [110, 390], [110, 341], [125, 314], [162, 370], [137, 380], [227, 232], [154, 196], [164, 356], [115, 384], [153, 206], [153, 212], [197, 232], [110, 364], [117, 364], [167, 195], [131, 439], [184, 237], [188, 216], [183, 247], [36, 129], [110, 360], [22, 81], [64, 590], [110, 336], [114, 196], [201, 237], [114, 197], [58, 590], [195, 239], [115, 336], [239, 427], [153, 207], [155, 183], [153, 186], [115, 184], [35, 134], [142, 345], [121, 239], [124, 157], [101, 328], [135, 391], [115, 440], [157, 401], [124, 328], [167, 213], [192, 216], [110, 350], [125, 162], [207, 247], [20, 86], [114, 364], [117, 343], [157, 211], [162, 207], [115, 395], [22, 87], [113, 404], [154, 207], [164, 332], [113, 374], [135, 388], [159, 209], [117, 384], [155, 203], [110, 317], [114, 356], [162, 218], [186, 232], [121, 247], [130, 449], [110, 340], [40, 310], [41, 126], [110, 387], [114, 428], [206, 221], [110, 356], [58, 642], [105, 500], [124, 164], [167, 187], [247, 404], [114, 290], [101, 362], [114, 426], [167, 188], [115, 192], [125, 159], [183, 237], [167, 193], [159, 415], [110, 384], [105, 521], [117, 370], [135, 380], [155, 352], [123, 247], [113, 357], [64, 642], [114, 390], [154, 186], [115, 385], [139, 345], [167, 192], [113, 415], [81, 108], [154, 193], [154, 183], [99, 611], [121, 234], [125, 362], [137, 543], [119, 239], [115, 294], [110, 357], [117, 294], [153, 341], [122, 216], [117, 403], [115, 381], [167, 191], [164, 403], [137, 388], [247, 503], [98, 532], [117, 290], [130, 532], [123, 251], [120, 232], [115, 582], [118, 234], [98, 496], [154, 191], [157, 428], [155, 207], [113, 294], [195, 216], [87, 108], [113, 290], [113, 640], [115, 193], [119, 251], [155, 340], [114, 294], [167, 196], [142, 391], [198, 345], [153, 290], [164, 364], [115, 290], [114, 191], [117, 342], [117, 426], [159, 381], [118, 247], [153, 332], [23, 87], [63, 785], [117, 440], [110, 383], [110, 426], [113, 350], [120, 237], [153, 203], [117, 365]], "temporal_merges": [[103, 103, 2], [104, 104, 1], [1024, 1024, 4], [1025, 1025, 2], [1026, 1026, 1], [1024, 103, 4], [1027, 1027, 4], [103, 103, 4], [1025, 104, 2], [104, 104, 2], [103, 1024, 4], [103, 103, 6], [1024, 103, 6], [1027, 104, 4], [1025, 104, 3], [1027, 1025, 4], [104, 104, 3], [103, 133, 2], [103, 132, 2], [103, 136, 2], [1027, 1032, 4], [103, 138, 2], [103, 144, 2], [104, 1025, 2], [1024, 132, 4], [1024, 133, 4], [103, 145, 2], [103, 146, 2], [103, 147, 2], [1026, 1029, 1], [103, 148, 2], [1024, 136, 4], [138, 138, 3], [1024, 144, 4], [103, 149, 2], [1026, 1029, 3], [1024, 145, 4], [150, 136, 1], [132, 132, 2], [1024, 138, 4], [1024, 147, 4], [1024, 146, 4], [103, 151, 2], [133, 133, 3], [1029, 1026, 1], [103, 150, 2], [136, 136, 3], [1024, 149, 4], [1025, 1025, 3], [1024, 148, 4], [1032, 104, 4], [145, 132, 1], [151, 138, 1], [104, 152, 1], [144, 133, 1], [132, 145, 1], [1024, 150, 4], [104, 156, 1], [1024, 151, 4], [146, 146, 2], [104, 158, 1], [147, 147, 2], [163, 152, 1], [1029, 132, 6], [149, 149, 4], [136, 136, 4], [1029, 133, 6], [138, 138, 4], [144, 133, 2], [172, 156, 1], [148, 148, 4], [1025, 152, 2], [104, 165, 1], [104, 166, 1], [1031, 144, 2], [173, 158, 1], [1029, 147, 6], [1029, 136, 6], [1029, 138, 6], [1029, 146, 6], [1025, 156, 2], [104, 163, 1], [104, 168, 1], [103, 103, 1], [1031, 132, 2], [1029, 145, 6], [177, 177, 2], [133, 133, 2], [104, 170, 1], [1025, 158, 2], [1029, 144, 6], [1031, 133, 2], [179, 179, 2], [145, 132, 2], [149, 149, 5], [1025, 168, 2], [1032, 152, 3], [1027, 1033, 4], [132, 132, 3], [1029, 148, 6], [1031, 146, 2], [1031, 147, 2], [138, 151, 1], [136, 150, 1], [1025, 163, 2], [1032, 156, 3], [1031, 145, 2], [1029, 149, 6], [176, 176, 2], [1025, 170, 2], [1032, 158, 3], [133, 144, 1], [148, 148, 5], [152, 163, 1], [1025, 165, 2], [180, 168, 1], [133, 144, 2], [1025, 166, 2], [156, 156, 3], [1032, 168, 3], [136, 136, 2], [1032, 163, 3], [158, 158, 3], [138, 138, 2], [132, 145, 2], [1031, 136, 2], [1031, 138, 2], [150, 136, 2], [166, 166, 2], [1031, 148, 2], [1032, 170, 3], [145, 145, 2], [165, 165, 2], [104, 172, 1], [146, 146, 3], [1026, 144, 1], [147, 147, 3], [151, 138, 2], [104, 173, 1], [132, 103, 2], [104, 181, 1], [1031, 149, 2], [1031, 151, 2], [1029, 150, 6], [1031, 150, 2], [1033, 152, 1], [1029, 151, 6], [144, 103, 2], [1032, 165, 3], [133, 103, 2], [146, 103, 2], [136, 103, 2], [147, 103, 2], [1032, 166, 3], [138, 103, 2], [1027, 156, 4], [149, 103, 2], [145, 103, 2], [148, 103, 2], [1026, 144, 3], [104, 180, 1], [1027, 152, 4], [1033, 152, 3], [136, 150, 2], [1025, 172, 2], [1027, 158, 4], [1026, 133, 1], [1025, 173, 2], [1027, 163, 4], [138, 151, 2], [1026, 1024, 5], [1025, 181, 2], [156, 172, 1], [144, 144, 3], [151, 151, 3], [177, 177, 3], [158, 158, 4], [152, 152, 3], [132, 132, 4], [1027, 170, 4], [179, 179, 3], [1032, 172, 3], [1033, 156, 3], [1027, 1038, 4], [1026, 144, 5], [1025, 180, 2], [1027, 168, 4], [1032, 173, 3], [149, 149, 3], [1026, 133, 3], [150, 103, 2], [168, 168, 3], [1032, 181, 3], [148, 148, 3], [1032, 180, 3], [1033, 170, 3], [176, 176, 3], [158, 173, 1], [1027, 165, 4], [146, 146, 4], [1033, 168, 3], [133, 133, 4], [166, 166, 3], [151, 103, 2], [165, 165, 3], [1026, 132, 1], [1027, 166, 4], [147, 147, 4], [1033, 163, 3], [145, 145, 3], [150, 150, 3], [1026, 133, 5], [1024, 1024, 1], [189, 189, 2], [1024, 103, 1], [152, 163, 2], [1033, 158, 3], [156, 156, 4], [1026, 1024, 3], [1034, 132, 2], [144, 144, 4], [1027, 172, 4], [1029, 1029, 1], [1034, 136, 2], [170, 170, 5], [1027, 173, 4], [1034, 147, 2], [103, 176, 2], [1034, 146, 2], [1034, 133, 2], [1034, 138, 2], [1026, 145, 5], [1027, 180, 4], [1033, 165, 3], [1026, 148, 1], [1033, 166, 3], [163, 152, 2], [136, 136, 5], [168, 180, 1], [1034, 144, 2], [1029, 1024, 1], [1027, 181, 4], [132, 132, 5], [1026, 149, 1], [151, 151, 4], [1026, 146, 1], [1026, 147, 1], [1026, 136, 1], [156, 172, 2], [138, 138, 5], [149, 149, 2], [1026, 138, 1], [152, 152, 2], [158, 165, 1], [1024, 176, 4], [1026, 132, 5], [148, 148, 6], [104, 104, 4], [156, 166, 1], [1026, 149, 5], [103, 189, 2], [150, 150, 4], [146, 146, 5], [1037, 152, 5], [165, 158, 1], [177, 177, 4], [170, 170, 6], [147, 147, 5], [1026, 148, 5], [1034, 145, 2], [179, 136, 2], [1037, 156, 5], [1033, 173, 3], [166, 156, 1], [133, 133, 5], [158, 168, 1], [148, 148, 2], [1026, 138, 5], [145, 145, 4], [1026, 136, 5], [1037, 163, 5], [222, 222, 2], [1033, 181, 3], [1026, 1024, 1], [152, 104, 1], [166, 168, 1], [165, 168, 1], [1026, 147, 5], [104, 152, 2], [1026, 146, 5], [149, 149, 6], [1026, 151, 1], [1033, 180, 3], [144, 144, 2], [1037, 158, 5], [172, 156, 2], [1026, 145, 1], [1034, 148, 2], [1026, 150, 1], [103, 179, 2], [163, 104, 1], [165, 152, 1], [166, 152, 1], [144, 1024, 2], [220, 220, 2], [177, 138, 2], [156, 168, 1], [132, 1024, 2], [133, 1024, 2], [1037, 168, 5], [1026, 150, 5], [1037, 170, 5], [158, 152, 1], [1026, 151, 5], [132, 176, 2], [1033, 172, 3], [147, 1024, 2], [148, 144, 2], [1034, 149, 2], [103, 136, 4], [173, 158, 2], [146, 1024, 2], [165, 104, 1], [103, 132, 4], [103, 138, 4], [144, 148, 2], [166, 104, 1], [156, 152, 1], [179, 179, 4], [1031, 132, 6], [145, 145, 5], [189, 189, 3], [1039, 152, 6], [1036, 132, 4], [1031, 148, 6], [1034, 151, 2], [1034, 150, 2], [1026, 103, 5], [163, 170, 1], [1031, 144, 6], [138, 1024, 2], [1031, 136, 6], [156, 104, 1], [181, 181, 3], [103, 177, 2], [158, 104, 1], [151, 151, 5], [1031, 133, 6], [148, 1024, 2], [136, 1024, 2], [103, 133, 4], [176, 132, 2], [168, 168, 2], [1031, 149, 6], [1031, 146, 6], [1037, 172, 5], [1038, 163, 2], [1033, 104, 4], [136, 136, 6], [170, 170, 4], [1036, 133, 4], [1031, 147, 6], [1037, 165, 5], [1037, 173, 5], [138, 138, 6], [166, 158, 1], [1039, 156, 6], [1036, 147, 4], [240, 240, 2], [149, 1024, 2], [103, 146, 4], [1037, 180, 5], [163, 1025, 1], [1031, 138, 6], [150, 150, 5], [1036, 146, 4], [1044, 152, 7], [189, 133, 2], [132, 146, 2], [1036, 145, 4], [163, 152, 3], [1037, 181, 5], [217, 217, 2], [156, 156, 2], [1036, 144, 4], [146, 132, 2], [147, 133, 2], [157, 157, 2], [1026, 132, 3], [158, 173, 2], [145, 149, 2], [242, 242, 2], [251, 251, 2], [1039, 163, 6], [219, 219, 2], [103, 147, 4], [236, 236, 2], [1026, 136, 3], [1038, 168, 2], [132, 149, 2], [151, 151, 2], [1039, 158, 6], [132, 147, 2], [148, 133, 2], [1026, 138, 3], [1039, 168, 6], [1037, 166, 5], [170, 104, 1], [176, 145, 2], [1031, 145, 6], [146, 136, 2], [132, 136, 2], [1039, 170, 6], [180, 168, 2], [146, 133, 2], [165, 165, 4], [246, 246, 2], [132, 138, 2], [1044, 156, 7], [147, 144, 2], [158, 158, 2], [104, 168, 2], [1026, 148, 3], [1038, 170, 2], [1026, 149, 3], [147, 138, 2], [1029, 1024, 3], [247, 247, 2], [163, 163, 5], [1026, 150, 3], [223, 223, 2], [166, 166, 4], [1035, 147, 4], [136, 146, 2], [1038, 152, 2], [132, 148, 2], [165, 156, 1], [168, 104, 1], [1036, 136, 4], [1026, 145, 3], [1031, 151, 6], [136, 133, 2], [222, 222, 3], [1035, 132, 4], [1036, 138, 4], [170, 152, 1], [181, 181, 4], [173, 173, 3], [145, 1024, 2], [1029, 103, 3], [1026, 1057, 1], [1038, 156, 2], [150, 150, 2], [180, 104, 1], [1029, 176, 6], [216, 216, 2], [1026, 146, 3], [146, 144, 2], [138, 177, 2], [149, 149, 7], [103, 103, 3], [1031, 150, 6], [1044, 163, 7], [1044, 158, 7], [1026, 151, 3], [138, 147, 2], [172, 104, 1], [138, 133, 2], [1026, 147, 3], [1044, 168, 7], [136, 179, 2], [170, 163, 1], [144, 146, 2], [1024, 189, 4], [1039, 172, 6], [144, 147, 2], [214, 214, 2], [1039, 180, 6], [215, 215, 2], [1038, 158, 2], [349, 349, 2], [339, 339, 2], [149, 145, 2], [133, 148, 2], [151, 1024, 2], [176, 176, 4], [166, 1025, 1], [133, 146, 2], [1026, 1049, 1], [220, 220, 3], [150, 1024, 2], [228, 228, 2], [1039, 181, 6], [165, 1025, 1], [1039, 173, 6], [147, 132, 2], [133, 136, 2], [138, 132, 2], [149, 132, 2], [1033, 163, 1], [164, 164, 2], [1044, 170, 7], [148, 136, 2], [181, 104, 1], [133, 147, 2], [103, 215, 2], [1035, 147, 2], [152, 156, 1], [103, 226, 2], [1038, 165, 2], [313, 313, 2], [133, 138, 2], [1044, 173, 7], [103, 224, 2], [1036, 148, 4], [144, 138, 2], [1038, 166, 2], [144, 136, 2], [103, 214, 2], [1035, 146, 2], [152, 158, 1], [361, 361, 2], [173, 104, 1], [1044, 172, 7], [177, 177, 5], [133, 189, 2], [103, 217, 2], [103, 219, 2], [231, 231, 2], [152, 165, 1], [1039, 165, 6], [162, 162, 2], [136, 132, 2], [179, 179, 5], [1044, 180, 7], [145, 176, 2], [1026, 1060, 1], [314, 314, 2], [152, 166, 1], [148, 132, 2], [103, 223, 2], [138, 144, 2], [1033, 156, 1], [230, 230, 2], [168, 158, 1], [104, 163, 2], [1035, 146, 4], [136, 144, 2], [1044, 181, 7], [168, 165, 1], [152, 1025, 1], [168, 156, 1], [168, 166, 1], [1036, 149, 4], [1057, 1026, 1], [136, 148, 2], [1047, 152, 1], [1039, 166, 6], [138, 151, 3], [180, 180, 3], [224, 224, 2], [113, 113, 2], [1068, 144, 6], [103, 228, 2], [1035, 132, 2], [104, 245, 1], [156, 165, 1], [156, 1025, 1], [235, 235, 2], [170, 1025, 1], [1053, 133, 7], [1033, 158, 1], [145, 146, 2], [1038, 172, 2], [1044, 165, 7], [1033, 170, 1], [328, 328, 2], [233, 233, 3], [217, 217, 3], [149, 138, 2], [158, 166, 1], [1036, 150, 4], [1024, 1026, 1], [181, 181, 5], [221, 221, 2], [149, 133, 2], [242, 242, 3], [103, 230, 2], [147, 136, 2], [1053, 144, 7], [146, 148, 2], [234, 234, 2], [146, 145, 2], [1047, 163, 1], [1038, 173, 2], [151, 151, 6], [146, 138, 2], [1053, 145, 7], [1049, 1026, 1], [367, 367, 2], [1026, 1046, 1], [366, 366, 2], [226, 226, 2], [172, 172, 3], [1033, 166, 1], [1033, 165, 1], [382, 382, 2], [144, 144, 5], [1033, 168, 1], [1044, 166, 7], [165, 163, 1], [1026, 1048, 1], [117, 117, 2], [104, 166, 2], [219, 219, 3], [158, 1025, 1], [136, 150, 3], [147, 148, 2], [246, 246, 3], [114, 114, 2], [103, 235, 2], [154, 154, 2], [138, 148, 2], [1047, 170, 1], [259, 259, 2], [243, 243, 2], [1053, 132, 7], [239, 239, 2], [145, 136, 2], [1024, 179, 4], [244, 244, 2], [1035, 145, 4], [1036, 151, 4], [1024, 177, 4], [159, 159, 2], [236, 236, 3], [150, 146, 2], [104, 156, 2], [149, 136, 2], [148, 146, 2], [1026, 1064, 1], [1026, 1055, 1], [144, 1029, 2], [170, 156, 1], [240, 240, 3], [148, 147, 2], [104, 158, 2], [1068, 133, 6], [260, 260, 2], [1038, 181, 2], [148, 138, 2], [163, 165, 1], [241, 241, 3], [151, 147, 2], [1031, 189, 2], [214, 214, 3], [1053, 147, 7], [1038, 180, 2], [138, 149, 2], [103, 233, 2], [104, 165, 2], [1026, 1063, 1], [144, 189, 2], [146, 132, 1], [1035, 133, 2], [1026, 1065, 1], [150, 133, 2], [145, 147, 2], [136, 147, 2], [1026, 1071, 1], [166, 163, 1], [1031, 176, 2], [1026, 1041, 1], [155, 155, 2], [1035, 145, 2], [103, 222, 2], [133, 1029, 2], [138, 146, 2], [103, 220, 2], [1062, 132, 4], [168, 1025, 1], [215, 215, 3], [152, 170, 1], [1033, 173, 1], [149, 147, 2], [1035, 136, 2], [231, 231, 3], [163, 166, 1], [149, 146, 2], [172, 1025, 1], [103, 248, 2], [176, 145, 3], [1046, 133, 4], [220, 132, 2], [1047, 156, 1], [1029, 189, 6], [1046, 1026, 1], [151, 144, 2], [179, 150, 3], [1068, 145, 6], [138, 177, 3], [173, 1025, 1], [223, 223, 3], [1032, 245, 3], [237, 237, 2], [110, 110, 2], [156, 170, 1], [151, 132, 2], [1053, 146, 7], [1053, 136, 7], [1053, 138, 7], [1035, 133, 4], [104, 172, 2], [1041, 1026, 1], [151, 148, 2], [103, 148, 4], [173, 165, 1], [146, 150, 2], [232, 232, 2], [133, 222, 2], [153, 153, 2], [1047, 158, 1], [1035, 148, 2], [147, 1029, 2], [103, 243, 2], [1033, 172, 1], [245, 245, 3], [103, 244, 2], [166, 172, 1], [180, 180, 4], [1035, 144, 2], [132, 1029, 2], [149, 144, 2], [249, 249, 3], [224, 224, 3], [147, 145, 2], [104, 170, 2], [233, 233, 2], [146, 1029, 2], [1026, 1073, 1], [165, 173, 1], [136, 179, 3], [181, 181, 6], [362, 362, 2], [151, 177, 3], [150, 144, 2], [150, 132, 2], [158, 163, 1], [104, 173, 2], [103, 231, 2], [147, 149, 2], [1047, 165, 1], [1072, 163, 2], [176, 275, 2], [1024, 223, 4], [1035, 136, 4], [1053, 149, 7], [1072, 152, 2], [150, 148, 2], [151, 133, 2], [103, 250, 2], [145, 138, 2], [103, 252, 2], [1026, 1049, 3], [168, 180, 2], [133, 1067, 2], [226, 226, 3], [1035, 138, 4], [1068, 132, 6], [150, 179, 2], [1047, 166, 1], [1026, 1057, 3], [172, 166, 1], [163, 158, 1], [1035, 149, 2], [228, 228, 3], [1024, 214, 4], [1050, 132, 4], [156, 163, 1], [103, 241, 2], [268, 268, 2], [103, 249, 2], [148, 1029, 2], [170, 168, 1], [1024, 215, 4], [265, 265, 2], [146, 149, 2], [189, 189, 4], [177, 151, 2], [1048, 1026, 1], [147, 151, 2], [1042, 145, 4], [177, 138, 3], [103, 254, 2], [1026, 1060, 3], [136, 149, 2], [133, 149, 2], [1083, 146, 4], [1026, 1080, 1], [163, 156, 1], [1042, 132, 4], [180, 1025, 1], [1041, 144, 4], [1055, 1026, 1], [136, 1029, 2], [1068, 149, 6], [1035, 144, 4], [136, 145, 2], [1035, 138, 2], [1047, 173, 1], [138, 145, 2], [230, 230, 3], [181, 1025, 1], [1040, 170, 2], [1047, 168, 1], [1064, 1026, 1], [132, 151, 2], [179, 150, 2], [241, 241, 2], [275, 275, 2], [158, 158, 5], [1033, 180, 1], [1026, 1048, 3], [1026, 1082, 1], [1047, 172, 1], [1068, 147, 6], [132, 1031, 2], [1060, 1026, 1], [103, 236, 2], [138, 1029, 2], [1056, 151, 2], [148, 144, 1], [1024, 219, 4], [1035, 149, 4], [1072, 156, 2], [172, 163, 1], [215, 132, 2], [179, 136, 3], [223, 132, 2], [1024, 217, 4], [103, 255, 2], [150, 147, 2], [103, 240, 2], [103, 257, 2], [220, 220, 4], [1063, 1026, 1], [1085, 147, 4], [1035, 148, 4], [1024, 224, 4], [1031, 177, 2], [151, 177, 2], [152, 104, 2], [1065, 1026, 1], [1071, 1026, 1], [166, 166, 5], [1024, 228, 4], [103, 258, 2], [214, 132, 2], [173, 163, 1], [222, 222, 4], [1024, 226, 4], [145, 148, 2], [1025, 245, 2], [133, 147, 1], [1074, 152, 3], [1031, 179, 2], [165, 165, 5], [1072, 170, 2], [235, 235, 3], [1074, 163, 3], [1091, 138, 2], [1068, 146, 6], [147, 133, 1], [217, 217, 4], [104, 181, 2], [170, 158, 1], [150, 179, 3], [1074, 170, 3], [104, 180, 2], [1026, 1042, 1], [248, 248, 2], [103, 261, 2], [242, 242, 4], [133, 1041, 2], [219, 147, 2], [1026, 1043, 1], [132, 150, 2], [1089, 136, 2], [1026, 1041, 5], [189, 144, 2], [1072, 158, 2], [1068, 136, 6], [163, 172, 1], [167, 167, 2], [1040, 170, 4], [1034, 189, 2], [1033, 181, 1], [1024, 230, 4], [163, 1032, 1], [149, 1029, 2], [146, 136, 1], [177, 151, 3], [1026, 1045, 1], [148, 148, 7], [228, 132, 2], [1068, 138, 6], [1074, 168, 3], [146, 133, 1], [181, 168, 1], [219, 138, 2], [215, 136, 2], [243, 243, 3], [214, 138, 2], [1026, 1051, 1], [145, 1031, 2], [150, 149, 2], [173, 152, 1], [133, 146, 1], [246, 246, 4], [1024, 248, 4], [1026, 1063, 3], [105, 105, 2], [136, 146, 1], [144, 148, 1], [103, 262, 2], [172, 152, 1], [1073, 1026, 1], [176, 176, 5], [1042, 1026, 1], [1026, 1055, 3], [1186, 163, 1], [147, 150, 2], [168, 170, 1], [1026, 1046, 3], [1026, 1046, 5], [1024, 222, 4], [259, 259, 3], [1026, 1052, 1], [1024, 235, 4], [249, 249, 2], [172, 170, 1], [149, 150, 2], [132, 144, 2], [163, 173, 1], [1053, 148, 7], [1072, 168, 2], [145, 150, 2], [156, 104, 2], [1040, 152, 1], [179, 103, 2], [147, 1031, 2], [244, 244, 3], [1043, 150, 4], [151, 1029, 2], [177, 103, 2], [176, 103, 2], [158, 170, 1], [132, 1042, 2], [1040, 152, 4], [231, 138, 2], [165, 170, 1], [1051, 1026, 1], [145, 1029, 2], [1068, 148, 6], [163, 1077, 1], [1024, 220, 4], [181, 158, 1], [144, 133, 3], [1034, 1026, 1], [228, 147, 2], [151, 146, 2], [166, 170, 1], [250, 250, 3], [245, 245, 2], [189, 103, 2], [149, 1031, 2], [1026, 1042, 5], [173, 170, 1], [296, 296, 2], [136, 133, 1], [166, 104, 2], [1043, 1026, 1], [260, 260, 3], [1110, 177, 4], [146, 151, 2], [1056, 138, 5], [1040, 163, 2], [1026, 1034, 1], [146, 1031, 2], [1052, 1026, 1], [1026, 1064, 3], [115, 115, 2], [236, 132, 2], [1053, 150, 7], [1032, 1025, 4], [145, 176, 3], [133, 136, 1], [224, 138, 2], [1068, 150, 6], [1026, 1050, 1], [447, 447, 2], [1072, 173, 2], [1026, 1058, 1], [1026, 1071, 3], [144, 1031, 2], [223, 146, 2], [168, 104, 2], [1045, 1026, 1], [1035, 150, 2], [1024, 233, 4], [133, 150, 2], [181, 152, 1], [1053, 151, 7], [1026, 1050, 5], [165, 104, 2], [217, 146, 2], [1074, 156, 3], [217, 136, 2], [1025, 152, 3], [157, 157, 3], [1035, 150, 4], [1072, 172, 2], [138, 147, 1], [1047, 180, 1], [1077, 163, 2], [1024, 250, 4], [148, 150, 2], [103, 263, 2], [133, 1031, 2], [148, 1031, 2], [1068, 151, 6], [1026, 1065, 3], [147, 138, 1], [156, 156, 5], [1045, 151, 4], [144, 151, 2], [1040, 163, 4], [1024, 252, 4], [132, 146, 1], [133, 151, 2], [306, 306, 2], [1026, 1041, 3], [272, 272, 2], [254, 264, 1], [180, 180, 5], [1029, 223, 6], [1116, 179, 4], [144, 150, 2], [222, 133, 2], [1080, 1026, 1], [138, 132, 1], [145, 151, 2], [240, 240, 4], [103, 267, 2], [1081, 172, 2], [158, 181, 1], [1051, 146, 4], [235, 146, 2], [1031, 1088, 2], [148, 151, 2], [170, 173, 1], [214, 214, 4], [219, 219, 4], [168, 181, 1], [149, 151, 2], [1047, 181, 1], [170, 172, 1], [1026, 1045, 5], [136, 1061, 1], [1024, 243, 4], [1072, 165, 2], [1026, 1054, 1], [132, 147, 1], [302, 302, 2], [1026, 1043, 5], [158, 104, 2], [1032, 246, 3], [144, 189, 3], [1024, 254, 4], [1032, 242, 3], [103, 264, 2], [1024, 244, 4], [1040, 166, 2], [1074, 158, 3], [287, 287, 2], [1084, 173, 2], [1029, 228, 6], [230, 147, 2], [1088, 149, 2], [233, 233, 4], [136, 132, 1], [170, 165, 1], [1082, 1026, 1], [150, 145, 2], [226, 226, 4], [103, 266, 2], [1040, 152, 2], [1045, 138, 4], [1024, 257, 4], [1024, 231, 4], [147, 132, 1], [1035, 151, 2], [144, 149, 2], [1029, 177, 6], [1029, 179, 6], [294, 294, 2], [132, 220, 2], [103, 269, 2], [1072, 166, 2], [1029, 214, 6], [260, 172, 1], [1032, 1086, 3], [180, 181, 1], [224, 133, 2], [1024, 236, 4], [1031, 1094, 2], [215, 215, 4], [141, 141, 2], [231, 231, 4], [265, 265, 3], [1052, 147, 4], [145, 248, 2], [152, 173, 1], [1027, 245, 4], [164, 164, 3], [1058, 1026, 1], [103, 1061, 2], [145, 1050, 2], [138, 133, 1], [177, 177, 6], [1025, 168, 3], [1026, 1052, 5], [166, 180, 1], [1024, 261, 4], [151, 149, 2], [1024, 258, 4], [251, 251, 1], [1026, 1051, 5], [148, 145, 2], [1074, 165, 3], [163, 181, 1], [103, 274, 2], [176, 248, 2], [292, 292, 2], [257, 257, 2], [152, 172, 1], [1035, 151, 4], [103, 277, 2], [241, 241, 4], [1074, 166, 3], [165, 172, 1], [1029, 215, 6], [1026, 1058, 5], [1032, 265, 3], [149, 240, 2], [136, 217, 2], [168, 168, 4], [136, 1031, 2], [113, 113, 3], [140, 140, 2], [1026, 144, 7], [1029, 1075, 5], [250, 250, 2], [181, 180, 1], [104, 242, 1], [1040, 173, 2], [138, 1031, 2], [1024, 255, 4], [132, 236, 2], [252, 267, 1], [136, 1070, 2], [1026, 1069, 1], [149, 1058, 2], [151, 145, 2], [1025, 1086, 2], [132, 215, 2], [103, 276, 2], [146, 223, 2], [1024, 240, 4], [104, 1086, 1], [1040, 165, 2], [133, 138, 1], [144, 1046, 2], [179, 179, 6], [132, 223, 2], [150, 1029, 2], [1024, 249, 4], [1026, 1066, 1], [1040, 163, 1], [156, 181, 1], [296, 176, 2], [165, 180, 1], [1026, 1073, 3], [144, 1041, 2], [220, 220, 5], [1072, 180, 2], [1025, 242, 2], [1026, 1050, 3], [236, 236, 4], [271, 271, 3], [117, 117, 3], [348, 348, 2], [1066, 138, 4], [133, 224, 2], [132, 228, 2], [146, 217, 2], [132, 214, 2], [162, 162, 3], [170, 166, 1], [1026, 1042, 3], [147, 219, 2], [1024, 241, 4], [270, 270, 3], [189, 189, 5], [133, 230, 2], [136, 1043, 2], [1024, 1056, 4], [136, 215, 2], [151, 1031, 2], [244, 147, 2], [103, 282, 2], [1029, 248, 6], [259, 173, 1], [303, 303, 2], [150, 1031, 2], [1040, 156, 2], [133, 226, 2], [216, 216, 3], [1095, 163, 3], [1104, 172, 3], [148, 1054, 2], [176, 302, 2], [1026, 1058, 3], [247, 247, 3], [146, 1051, 2], [166, 1032, 1], [1024, 1061, 4], [308, 308, 2], [103, 281, 2], [268, 268, 3], [104, 246, 1], [261, 261, 2], [145, 149, 1], [103, 273, 2], [249, 138, 2], [136, 226, 2], [144, 132, 2], [130, 130, 2], [1094, 148, 2], [222, 222, 5], [243, 138, 2], [1074, 173, 3], [133, 235, 2], [1025, 246, 2], [103, 280, 2], [103, 285, 2], [1024, 262, 4], [243, 146, 2], [1069, 136, 4], [173, 168, 1], [290, 290, 2], [181, 163, 1], [103, 284, 2], [264, 254, 1], [103, 278, 2], [103, 279, 2], [1029, 230, 6], [1050, 1026, 1], [1026, 1043, 3], [156, 180, 1], [114, 114, 3], [103, 286, 2], [173, 1084, 1], [103, 289, 2], [297, 297, 2], [224, 224, 4], [1132, 176, 4], [304, 304, 2], [1206, 172, 1], [152, 181, 1], [158, 158, 6], [1041, 144, 1], [1054, 1026, 1], [270, 172, 1], [1074, 172, 3], [147, 1052, 2], [1029, 219, 6], [110, 110, 3], [1029, 217, 6], [333, 333, 2], [298, 298, 2], [163, 104, 2], [138, 1045, 2], [165, 1032, 1], [170, 1032, 1], [1024, 263, 4], [1026, 1036, 1], [166, 181, 1], [1031, 1089, 2], [491, 491, 2], [1069, 1026, 1], [1029, 1079, 5], [267, 252, 1], [168, 172, 1], [152, 1032, 1], [132, 136, 1], [159, 159, 3], [132, 138, 1], [1074, 180, 3], [176, 296, 2], [1034, 176, 2], [1029, 226, 6], [248, 248, 3], [200, 200, 2], [173, 259, 1], [266, 266, 3], [145, 220, 1], [275, 275, 3], [1025, 156, 3], [1070, 150, 1], [1040, 165, 1], [313, 234, 2], [177, 151, 4], [221, 221, 3], [226, 133, 2], [270, 163, 1], [1040, 168, 2], [154, 154, 3], [320, 320, 2], [147, 230, 2], [1072, 181, 2], [1024, 1076, 4], [138, 219, 2], [181, 172, 1], [1029, 224, 6], [233, 136, 2], [283, 283, 2], [1026, 1045, 3], [103, 300, 2], [166, 173, 1], [149, 145, 1], [103, 291, 2], [152, 152, 5], [268, 163, 1], [251, 349, 2], [1026, 1054, 5], [155, 155, 3], [136, 147, 1], [1026, 1080, 3], [1062, 1062, 4], [1067, 133, 5], [153, 153, 3], [271, 163, 1], [1026, 1051, 3], [459, 459, 2], [1066, 1026, 1], [1031, 1091, 2], [103, 288, 2], [147, 136, 1], [156, 156, 6], [269, 269, 3], [146, 138, 1], [236, 148, 2], [223, 223, 4], [1029, 1075, 6], [272, 163, 1], [1026, 1054, 3], [1040, 170, 1], [166, 166, 1], [1041, 133, 4], [136, 233, 2], [179, 150, 4], [1040, 158, 2], [1074, 181, 3], [1169, 163, 3], [103, 295, 2], [245, 245, 4], [249, 249, 4], [145, 306, 2], [1029, 257, 6], [146, 235, 2], [1029, 235, 6], [156, 1032, 1], [1240, 173, 1], [1067, 144, 2], [1026, 1052, 3], [230, 133, 2], [176, 149, 2], [1040, 166, 1], [145, 273, 2], [240, 149, 2], [1056, 151, 1], [319, 152, 1], [1040, 168, 1], [1026, 1082, 3], [1113, 173, 3], [165, 165, 1], [314, 239, 2], [138, 214, 2], [145, 133, 2], [1025, 265, 2], [104, 259, 1], [145, 1042, 2], [226, 136, 2], [1043, 136, 4], [299, 163, 1], [1038, 152, 4], [1121, 170, 5], [158, 1032, 1], [1024, 103, 3], [147, 228, 2], [246, 246, 5], [1067, 144, 1], [301, 172, 1], [242, 242, 5], [104, 265, 1], [1024, 267, 4], [138, 1056, 2], [158, 180, 1], [1031, 250, 2], [144, 1057, 2], [1036, 1026, 1], [1029, 1079, 6], [1024, 264, 4], [293, 172, 1], [325, 325, 2], [1025, 1093, 2], [138, 146, 1], [168, 168, 5], [189, 133, 3], [305, 177, 2], [1033, 1272, 1], [1061, 179, 3], [1121, 163, 5], [1042, 145, 1], [1060, 132, 6], [279, 279, 3], [334, 177, 2], [1026, 1066, 5], [1059, 144, 1], [165, 181, 1], [170, 104, 2], [1038, 1260, 2], [1119, 163, 3], [1024, 266, 4], [1029, 252, 6], [138, 231, 2], [180, 166, 1], [138, 224, 2], [335, 335, 2], [1029, 220, 6], [302, 176, 2], [248, 149, 2], [1029, 254, 6], [1048, 145, 6], [339, 339, 3], [103, 309, 2], [275, 176, 2], [1046, 148, 4], [1043, 150, 1], [1027, 265, 4], [322, 152, 1], [235, 133, 2], [104, 1093, 1], [217, 217, 5], [308, 177, 2], [199, 199, 2], [168, 173, 1], [526, 526, 2], [244, 244, 4], [271, 173, 1], [241, 136, 2], [1024, 269, 4], [170, 180, 1], [260, 260, 4], [146, 243, 2], [321, 152, 1], [507, 507, 2], [1029, 261, 6], [144, 189, 4], [496, 496, 2], [326, 156, 1], [132, 133, 2], [1027, 242, 4], [504, 504, 2], [181, 156, 1], [1024, 277, 4], [318, 152, 1], [1026, 1098, 1], [150, 179, 4], [1024, 274, 4], [1111, 133, 4], [1040, 172, 1], [104, 1099, 1], [1040, 156, 1], [228, 228, 4], [1029, 1061, 5], [234, 328, 2], [1025, 158, 3], [147, 144, 1], [166, 166, 6], [172, 1081, 1], [1040, 172, 2], [1029, 244, 6], [214, 214, 5], [345, 345, 2], [176, 307, 2], [148, 1041, 2], [215, 215, 5], [132, 145, 3], [165, 165, 6], [151, 151, 7], [247, 247, 1], [273, 273, 2], [1025, 1099, 2], [172, 168, 1], [1121, 152, 5], [219, 219, 5], [230, 230, 4], [150, 150, 7], [1121, 156, 5], [1026, 1069, 3], [152, 1105, 1], [181, 104, 2], [148, 1073, 2], [118, 118, 2], [119, 119, 2], [1031, 176, 6], [231, 231, 5], [311, 179, 2], [103, 306, 2], [148, 236, 2], [163, 1095, 1], [1040, 173, 1], [1029, 1078, 5], [272, 272, 3], [263, 146, 2], [1040, 158, 1], [1038, 1239, 2], [1024, 278, 4], [145, 223, 1], [259, 259, 4], [232, 232, 3], [237, 237, 3], [293, 293, 2], [484, 484, 2], [214, 295, 1], [257, 257, 3], [1026, 1069, 5], [180, 104, 2], [251, 251, 3], [1026, 1066, 3], [287, 287, 3], [528, 528, 2], [1024, 273, 4], [1024, 291, 4], [145, 132, 3], [240, 133, 2], [176, 1062, 2], [325, 179, 2], [449, 449, 2], [1057, 133, 6], [144, 146, 1], [177, 151, 5], [1029, 236, 6], [243, 243, 4], [181, 173, 1], [1024, 289, 4], [241, 241, 5], [220, 149, 2], [233, 233, 5], [148, 189, 2], [222, 222, 6], [1024, 276, 4], [1027, 246, 4], [252, 252, 2], [270, 270, 2], [1029, 250, 6], [1031, 248, 2], [1024, 282, 4], [261, 147, 2], [144, 230, 1], [1070, 136, 5], [180, 173, 1], [299, 299, 3], [176, 315, 2], [168, 1032, 1], [156, 1033, 1], [220, 149, 5], [295, 214, 1], [1029, 243, 6], [1024, 286, 4], [132, 1048, 2], [255, 138, 2], [1024, 281, 4], [1038, 156, 4], [1045, 151, 1], [144, 147, 1], [1089, 150, 2], [177, 1110, 3], [172, 181, 1], [472, 472, 2], [235, 235, 4], [271, 165, 1], [1062, 145, 1], [262, 147, 2], [1083, 1083, 4], [1031, 189, 6], [1038, 158, 4], [103, 144, 1], [1034, 179, 2], [1026, 132, 7], [361, 361, 1], [180, 156, 1], [172, 104, 2], [1085, 1085, 4], [180, 170, 1], [244, 136, 2], [289, 215, 1], [133, 240, 2], [347, 179, 2], [223, 145, 1], [330, 158, 1], [148, 250, 2], [1038, 168, 4], [146, 144, 1], [176, 132, 3], [149, 1042, 2], [149, 1071, 2], [1038, 163, 4], [239, 362, 2], [245, 165, 1], [1121, 158, 5], [283, 173, 1], [1034, 177, 2], [228, 145, 1], [292, 292, 3], [138, 249, 2], [303, 303, 3], [105, 105, 3], [1033, 245, 1], [157, 113, 2], [1043, 146, 4], [388, 388, 2], [131, 131, 2], [1036, 176, 4], [242, 166, 1], [277, 255, 1], [304, 177, 2], [150, 217, 1], [1042, 149, 4], [1032, 168, 4], [104, 271, 1], [216, 216, 1], [246, 158, 3], [147, 146, 2], [1035, 1092, 2], [320, 179, 2], [1026, 189, 1], [1031, 179, 6], [288, 288, 3], [1024, 1056, 1], [278, 278, 3], [173, 166, 1], [138, 136, 2], [254, 254, 3], [404, 404, 2], [1024, 280, 4], [1045, 147, 4], [1120, 163, 4], [104, 268, 1], [132, 148, 1], [220, 1062, 2], [1121, 165, 5], [1029, 222, 6], [189, 148, 2], [263, 263, 2], [1029, 231, 6], [1075, 176, 3], [446, 446, 2], [1025, 166, 3], [151, 219, 1], [144, 103, 1], [150, 215, 1], [181, 166, 1], [1029, 240, 6], [144, 235, 1], [157, 114, 2], [324, 152, 1], [167, 167, 3], [1094, 1031, 2], [149, 240, 4], [150, 136, 3], [170, 1027, 1], [1024, 285, 4], [133, 1049, 2], [147, 244, 2], [258, 274, 1], [104, 270, 1], [149, 176, 2], [180, 158, 1], [180, 172, 1], [1025, 165, 3], [1024, 279, 4], [221, 221, 1], [245, 166, 1], [257, 146, 2], [331, 177, 2], [180, 165, 1], [220, 145, 1], [329, 329, 3], [1121, 168, 5], [333, 189, 2], [335, 177, 2], [1024, 295, 4], [306, 306, 3], [367, 367, 3], [146, 147, 2], [308, 308, 3], [132, 1050, 2], [266, 146, 2], [349, 349, 3], [1029, 233, 6], [262, 262, 2], [1088, 1031, 2], [1025, 1032, 3], [1024, 309, 4], [151, 138, 3], [1121, 180, 5], [1038, 165, 4], [1024, 288, 4], [1046, 147, 4], [172, 165, 1], [224, 224, 5], [307, 307, 2], [215, 145, 1], [215, 289, 1], [1024, 284, 4], [1033, 246, 1], [1038, 170, 4], [226, 226, 5], [269, 269, 2], [1042, 146, 4], [136, 138, 2], [334, 334, 2], [1031, 219, 2], [242, 156, 3], [1024, 300, 4], [144, 222, 1], [150, 1043, 2], [246, 165, 1], [231, 149, 2], [1026, 145, 7], [301, 301, 3], [1032, 1093, 3], [168, 163, 1], [358, 358, 2], [1224, 180, 1], [181, 165, 1], [1296, 158, 1], [41, 41, 1], [283, 283, 3], [314, 314, 1], [133, 132, 2], [261, 261, 3], [561, 561, 2], [136, 241, 2], [177, 1056, 2], [173, 104, 2], [489, 489, 2], [1031, 214, 2], [1088, 1088, 2], [1121, 166, 5], [148, 133, 1], [298, 298, 3], [369, 179, 2], [305, 305, 2], [1041, 147, 4], [152, 152, 4], [1026, 149, 7], [145, 228, 1], [1025, 170, 3], [250, 250, 4], [117, 164, 2], [104, 260, 1], [219, 103, 2], [1032, 1099, 3], [236, 148, 3], [1031, 217, 2], [266, 266, 2], [132, 149, 1], [366, 366, 3], [1038, 172, 4], [144, 144, 7], [146, 1043, 2], [1031, 220, 2], [255, 133, 2], [377, 177, 2], [1081, 166, 2], [318, 173, 1], [245, 170, 1], [303, 179, 2], [115, 115, 3], [279, 279, 2], [1032, 1139, 3], [157, 339, 2], [1183, 1034, 1], [328, 328, 1], [245, 158, 1], [103, 296, 2], [1031, 226, 2], [245, 156, 1], [1046, 146, 4], [144, 224, 1], [176, 275, 3], [269, 147, 2], [326, 326, 3], [1059, 133, 1], [180, 1106, 1], [1118, 149, 2], [104, 272, 1], [252, 136, 2], [311, 311, 2], [1029, 241, 6], [271, 271, 2], [1034, 250, 2], [1031, 223, 2], [162, 162, 1], [1121, 181, 5], [1027, 1086, 4], [1076, 177, 3], [255, 277, 1], [1050, 149, 4], [189, 147, 2], [1049, 144, 3], [103, 307, 2], [146, 1042, 2], [321, 172, 1], [150, 150, 6], [234, 234, 3], [133, 148, 1], [214, 145, 1], [297, 297, 3], [151, 214, 1], [170, 170, 2], [1106, 180, 2], [103, 302, 2], [163, 168, 1], [1219, 163, 1], [1040, 181, 1], [1031, 230, 2], [1038, 166, 4], [1084, 165, 2], [217, 103, 2], [240, 149, 3], [1031, 224, 2], [133, 1078, 1], [147, 1042, 2], [605, 605, 2], [136, 148, 1], [1025, 1139, 2], [132, 176, 3], [270, 166, 1], [1075, 145, 3], [103, 344, 2], [156, 242, 3], [242, 156, 2], [138, 243, 2], [236, 148, 4], [347, 347, 2], [1121, 172, 5], [189, 144, 3], [382, 382, 3], [1029, 258, 6], [146, 257, 2], [268, 268, 4], [1027, 104, 5], [1031, 215, 2], [1031, 228, 2], [1062, 176, 4], [304, 304, 3], [313, 313, 1], [145, 215, 2], [158, 246, 3], [1038, 173, 4], [287, 180, 1], [1081, 152, 2], [136, 258, 2], [138, 103, 1], [179, 1116, 3], [133, 149, 1], [147, 1041, 2], [189, 146, 2], [148, 1046, 2], [315, 315, 2], [1091, 151, 2], [1026, 1092, 1], [1026, 189, 3], [1121, 173, 5], [1031, 222, 2], [1049, 144, 6], [1034, 1078, 1], [1040, 180, 1], [273, 273, 3], [168, 1033, 1], [359, 359, 2], [1034, 1159, 1], [248, 248, 4], [133, 145, 2], [158, 1033, 1], [214, 151, 1], [1027, 1137, 4], [1041, 148, 4], [1029, 249, 6], [136, 244, 2], [172, 260, 1], [217, 217, 6], [1055, 150, 6], [239, 239, 3], [149, 132, 1], [1029, 262, 6], [1061, 150, 3], [151, 1045, 2], [1029, 255, 6], [1031, 235, 2], [1091, 177, 2], [1031, 1061, 1], [133, 1046, 2], [252, 252, 3], [1041, 146, 4], [166, 1033, 1], [336, 336, 2], [152, 1033, 1], [148, 222, 2], [320, 320, 3], [147, 1045, 2], [1042, 147, 4], [145, 223, 2], [148, 132, 1], [1089, 179, 2], [173, 181, 1], [372, 156, 1], [246, 158, 2], [1232, 170, 1], [133, 189, 3], [132, 1075, 2], [1029, 1076, 5], [251, 117, 2], [589, 589, 2], [1026, 150, 7], [1040, 181, 2], [1129, 172, 4], [138, 1076, 1], [240, 348, 2], [1042, 176, 4], [133, 144, 3], [1047, 152, 4], [249, 249, 5], [1084, 168, 2], [173, 1113, 1], [220, 220, 6], [293, 293, 3], [296, 296, 3], [338, 179, 2], [621, 621, 2], [164, 164, 1], [219, 151, 1], [104, 283, 1], [231, 177, 2], [132, 1043, 2], [148, 136, 1], [280, 280, 3], [1036, 189, 4], [163, 272, 1], [448, 448, 2], [274, 258, 1], [330, 330, 3], [146, 263, 2], [168, 168, 1], [1054, 144, 4], [136, 103, 1], [163, 1027, 1], [1031, 233, 2], [248, 145, 2], [173, 1032, 1], [587, 587, 2], [170, 170, 7], [247, 113, 2], [297, 172, 1], [371, 158, 1], [179, 1070, 2], [254, 138, 2], [1025, 180, 3], [1084, 152, 2], [1033, 242, 1], [1077, 156, 2], [147, 147, 7], [173, 180, 1], [1029, 1061, 6], [149, 231, 4], [144, 224, 2], [1104, 166, 3], [575, 575, 2], [1035, 1117, 2], [103, 315, 2], [1024, 306, 4], [217, 150, 1], [346, 346, 2], [1029, 267, 6], [1035, 1140, 2], [1040, 180, 2], [1077, 166, 2], [148, 222, 4], [223, 176, 2], [247, 339, 2], [146, 1041, 2], [1031, 1075, 1], [145, 214, 2], [146, 176, 2], [1029, 1078, 6], [103, 1132, 2], [265, 265, 4], [138, 255, 2], [145, 252, 2], [548, 548, 2], [35, 35, 2], [379, 379, 2], [1029, 263, 6], [151, 231, 1], [262, 262, 3], [307, 176, 2], [224, 144, 2], [1048, 132, 6], [179, 303, 2], [299, 299, 4], [513, 513, 2], [1026, 147, 7], [233, 233, 6], [136, 1055, 2], [1032, 293, 3], [301, 301, 4], [136, 1061, 2], [146, 1045, 2], [245, 1025, 1], [151, 214, 2], [215, 150, 1], [236, 236, 5], [1098, 133, 6], [110, 110, 4], [165, 1033, 1], [438, 438, 2], [1032, 292, 3], [145, 215, 1], [230, 144, 1], [1047, 163, 4], [216, 154, 2], [250, 133, 2], [1031, 177, 6], [1043, 133, 4], [600, 600, 2], [541, 541, 2], [1035, 1148, 2], [1054, 133, 4], [145, 220, 2], [147, 189, 2], [1029, 1076, 6], [138, 149, 1], [1042, 1062, 4], [132, 1045, 2], [680, 680, 2], [221, 154, 2], [226, 150, 1], [179, 325, 2], [1048, 145, 3], [1032, 270, 3], [1029, 264, 6], [231, 151, 1], [315, 176, 2], [355, 189, 2], [1097, 152, 2], [144, 230, 2], [157, 314, 2], [367, 367, 1], [1034, 1078, 2], [1104, 152, 3], [219, 177, 2], [232, 155, 2], [145, 214, 1], [147, 261, 2], [1077, 165, 2], [156, 1157, 1], [1025, 163, 3], [531, 531, 2], [1025, 270, 2], [1026, 148, 7], [254, 254, 2], [278, 278, 4], [149, 220, 4], [1213, 1034, 1], [1026, 138, 7], [259, 259, 5], [146, 189, 2], [151, 1066, 2], [215, 136, 3], [147, 1043, 2], [1096, 168, 2], [144, 226, 1], [1032, 272, 3], [104, 1139, 1], [149, 1050, 2], [375, 375, 2], [1031, 255, 2], [206, 206, 2], [222, 222, 7], [241, 241, 6], [396, 396, 2], [1112, 163, 2], [1032, 268, 3], [150, 226, 1], [598, 598, 2], [1056, 177, 5], [223, 223, 5], [228, 176, 2], [1155, 145, 4], [138, 219, 3], [158, 246, 2], [1081, 168, 2], [104, 293, 1], [138, 214, 3], [258, 258, 3], [216, 153, 2], [361, 361, 3], [1089, 1031, 2], [132, 1058, 2], [156, 242, 2], [1026, 136, 7], [152, 152, 1], [348, 348, 3], [103, 133, 1], [179, 217, 2], [1026, 133, 7], [300, 224, 1], [353, 353, 3], [1091, 1031, 2], [1113, 165, 3], [149, 1045, 2], [402, 402, 2], [458, 458, 2], [329, 329, 2], [395, 395, 2], [144, 1054, 2], [1050, 146, 4], [1026, 146, 7], [1040, 165, 4], [1316, 168, 1], [235, 235, 5], [1025, 272, 2], [1031, 262, 2], [1063, 151, 6], [263, 263, 3], [1031, 1079, 2], [103, 275, 2], [1040, 173, 4], [147, 1064, 2], [1026, 151, 7], [1033, 242, 3], [163, 163, 2], [217, 179, 2], [260, 260, 5], [313, 313, 3], [255, 255, 3], [1035, 1062, 2], [1043, 132, 4], [1043, 148, 4], [152, 1128, 1], [176, 1079, 2], [1032, 283, 3], [1119, 180, 3], [397, 168, 1], [1050, 145, 4], [149, 148, 2], [356, 356, 2], [391, 391, 2], [1040, 166, 4], [1061, 150, 2], [156, 326, 1], [156, 1027, 1], [288, 288, 2], [399, 399, 2], [439, 439, 2], [1031, 258, 2], [1110, 1110, 4], [144, 1049, 2], [1043, 179, 4], [1116, 1116, 4], [103, 311, 2], [136, 252, 2], [145, 1058, 2], [1025, 268, 2], [1034, 224, 2], [1034, 1190, 1], [104, 292, 1], [172, 180, 1], [298, 173, 1], [148, 236, 3], [248, 132, 2], [335, 335, 3], [244, 244, 5], [1032, 259, 3], [1104, 168, 3], [230, 230, 5], [427, 427, 2], [1038, 1319, 2], [1045, 177, 4], [147, 262, 2], [132, 248, 2], [144, 226, 2], [165, 1027, 1], [146, 1065, 2], [228, 228, 5], [355, 355, 2], [1031, 1075, 2], [1032, 324, 3], [243, 243, 5], [1025, 271, 2], [159, 159, 4], [1077, 158, 2], [104, 298, 1], [447, 154, 2], [1032, 260, 3], [220, 149, 3], [1113, 168, 3], [1045, 133, 4], [1134, 173, 4], [327, 173, 1], [1040, 168, 4], [1096, 158, 2], [366, 366, 1], [1031, 1061, 2], [146, 266, 2], [1055, 150, 3], [104, 299, 1], [214, 177, 2], [1031, 263, 2], [189, 333, 2], [1032, 271, 3], [223, 145, 2], [409, 409, 2], [114, 164, 2], [284, 284, 3], [331, 331, 2], [240, 240, 5], [302, 302, 3], [1051, 132, 4], [149, 220, 2], [166, 1027, 1], [325, 325, 3], [1025, 260, 2], [1032, 287, 3], [104, 301, 1], [114, 157, 2], [235, 144, 1], [382, 382, 1], [1031, 231, 2], [1034, 226, 2], [138, 1041, 2], [1025, 287, 2], [1029, 1067, 3], [1046, 133, 1], [224, 300, 1], [104, 287, 1], [170, 170, 3], [1025, 259, 2], [1033, 152, 4], [136, 1042, 2], [1031, 249, 2], [1034, 230, 2], [103, 351, 2], [148, 1043, 2], [258, 133, 2], [177, 308, 2], [1029, 289, 6], [1041, 138, 4], [144, 235, 2], [392, 168, 1], [166, 242, 1], [239, 239, 1], [1038, 180, 4], [145, 1079, 2], [1024, 344, 4], [1029, 1127, 5], [233, 179, 2], [294, 294, 3], [305, 305, 3], [1047, 245, 1], [1118, 149, 3], [1029, 266, 6], [190, 190, 2], [264, 132, 2], [1031, 244, 2], [1034, 223, 2], [1136, 148, 3], [149, 231, 2], [349, 349, 1], [679, 679, 2], [136, 1041, 2], [150, 233, 1], [1031, 243, 2], [221, 155, 2], [1095, 156, 3], [163, 268, 1], [408, 168, 1], [1040, 156, 4], [104, 324, 1], [150, 241, 1], [1031, 252, 2], [1096, 152, 2], [1029, 285, 6], [1031, 1078, 1], [1097, 168, 2], [1040, 158, 4], [1049, 144, 1], [176, 220, 2], [1113, 152, 3], [145, 1060, 2], [1029, 281, 6], [148, 233, 2], [703, 703, 2], [137, 137, 2], [1031, 257, 2], [1033, 245, 3], [132, 1052, 2], [226, 103, 2], [249, 177, 2], [292, 180, 1], [96, 96, 2], [649, 649, 2], [1045, 132, 4], [158, 1162, 1], [219, 219, 6], [223, 1062, 2], [362, 362, 1], [286, 286, 3], [151, 249, 1], [234, 234, 1], [380, 380, 2], [1054, 132, 4], [138, 1042, 2], [146, 276, 2], [163, 271, 1], [165, 246, 1], [786, 786, 2], [1025, 283, 2], [145, 228, 2], [164, 117, 2], [222, 144, 1], [378, 172, 1], [132, 252, 2], [147, 189, 1], [1040, 172, 4], [215, 179, 2], [414, 414, 2], [250, 250, 5], [1042, 138, 4], [150, 217, 2], [162, 162, 4], [258, 136, 2], [1026, 1092, 3], [104, 319, 1], [358, 236, 2], [1029, 276, 6], [104, 297, 1], [150, 215, 2], [16, 16, 2], [177, 231, 2], [283, 180, 1], [1038, 181, 4], [1041, 136, 4], [1042, 136, 4], [147, 269, 2], [151, 224, 1], [177, 304, 2], [421, 421, 2], [1031, 236, 2], [359, 189, 2], [1029, 1126, 5], [1061, 179, 4], [138, 224, 3], [148, 1045, 2], [393, 393, 2], [1029, 269, 6], [177, 331, 2], [1033, 246, 3], [1034, 214, 2], [103, 355, 2], [265, 168, 2], [293, 166, 1], [1108, 132, 6], [220, 149, 4], [275, 275, 4], [386, 386, 2], [279, 279, 4], [1097, 156, 2], [255, 133, 1], [220, 176, 2], [226, 226, 6], [1043, 147, 4], [146, 1046, 2], [270, 270, 4], [431, 431, 2], [1095, 165, 3], [1142, 172, 1], [280, 280, 4], [1025, 292, 2], [1034, 222, 2], [262, 133, 1], [329, 173, 1], [1029, 274, 6], [1042, 148, 4], [1045, 148, 4], [177, 334, 2], [1031, 1079, 1], [1034, 217, 2], [230, 144, 2], [240, 149, 5], [328, 328, 3], [1031, 254, 2], [132, 267, 2], [293, 180, 1], [308, 231, 2], [1066, 147, 4], [152, 318, 1], [314, 314, 3], [158, 330, 1], [179, 320, 2], [1029, 103, 5], [1034, 248, 2], [1038, 1344, 2], [103, 304, 2], [147, 1046, 2], [179, 338, 2], [189, 1067, 2], [1034, 228, 2], [1034, 235, 2], [133, 306, 2], [1080, 136, 6], [219, 138, 3], [179, 146, 2], [189, 355, 2], [1052, 1085, 4], [153, 153, 4], [176, 146, 2], [202, 202, 2], [1025, 293, 2], [226, 144, 2], [163, 1120, 1], [222, 148, 4], [152, 1027, 1], [1029, 282, 6], [165, 245, 1], [410, 156, 1], [1058, 132, 4], [158, 1027, 1], [1032, 301, 3], [1050, 147, 4], [1207, 170, 6], [285, 146, 2], [339, 339, 1], [152, 319, 1], [179, 233, 2], [1047, 170, 4], [1095, 166, 3], [149, 1043, 2], [222, 148, 2], [177, 305, 2], [271, 271, 4], [217, 150, 2], [1052, 132, 4], [138, 254, 2], [140, 200, 2], [1032, 297, 3], [258, 133, 1], [1065, 146, 6], [19, 19, 2], [215, 145, 2], [266, 266, 4], [1034, 233, 2], [1034, 1135, 1], [104, 322, 1], [248, 248, 5], [1051, 136, 4], [1081, 165, 2], [214, 214, 6], [283, 165, 1], [136, 1045, 2], [170, 1105, 1], [176, 358, 2], [1029, 277, 6], [327, 327, 3], [1038, 1272, 2], [36, 36, 2], [138, 144, 1], [191, 191, 2], [801, 801, 1], [1032, 444, 3], [1054, 147, 4], [136, 1069, 2], [273, 148, 2], [132, 264, 2], [139, 139, 2], [1031, 241, 2], [255, 255, 2], [1025, 324, 2], [1034, 1061, 1], [257, 257, 4], [1029, 280, 6], [1034, 219, 2], [1095, 158, 3], [228, 145, 2], [333, 333, 3], [1059, 136, 1], [177, 335, 2], [247, 367, 2], [176, 411, 2], [262, 133, 2], [272, 272, 4], [1033, 168, 4], [260, 152, 1], [1051, 1083, 4], [180, 152, 1], [224, 144, 1], [1031, 1078, 2], [138, 1043, 2], [242, 152, 1], [1034, 262, 2], [1046, 138, 4], [156, 1093, 1], [1026, 189, 5], [215, 215, 6], [1029, 295, 6], [149, 240, 3], [166, 245, 1], [217, 217, 7], [1027, 1093, 4], [1029, 273, 6], [353, 180, 1], [1025, 444, 2], [158, 158, 1], [269, 269, 4], [326, 326, 2], [1059, 148, 1], [159, 115, 2], [1054, 136, 4], [170, 245, 1], [309, 226, 1], [163, 1033, 1], [224, 151, 1], [1045, 146, 4], [132, 1041, 2], [10, 10, 2], [138, 1066, 2], [148, 1049, 2], [290, 290, 3], [306, 446, 2], [1029, 1056, 3], [179, 347, 2], [189, 136, 2], [334, 334, 3], [1046, 136, 4], [1051, 133, 4], [181, 181, 7], [103, 303, 2], [1034, 215, 2], [1034, 1075, 1], [1026, 1098, 3], [1141, 168, 3], [132, 254, 2], [265, 166, 1], [270, 165, 1], [1025, 297, 2], [150, 144, 1], [151, 144, 1], [146, 1050, 2], [1125, 147, 6], [113, 157, 2], [123, 123, 2], [177, 147, 2], [1027, 1139, 4], [1031, 261, 2], [1045, 149, 4], [1032, 298, 3], [150, 1069, 2], [276, 276, 3], [389, 168, 1], [1029, 284, 6], [189, 359, 2], [259, 168, 1], [432, 432, 2], [103, 305, 2], [1054, 146, 4], [1082, 138, 6], [1207, 156, 6], [1052, 133, 4], [1138, 152, 3], [214, 151, 2], [231, 231, 6], [1064, 147, 6], [117, 251, 2], [132, 1051, 2], [176, 228, 2], [1084, 166, 2], [173, 1033, 1], [1043, 149, 4], [1059, 132, 1], [1032, 299, 3], [263, 133, 2], [338, 338, 2], [1029, 288, 6], [25, 25, 2], [177, 219, 2], [445, 445, 2], [104, 110, 1], [170, 1033, 1], [429, 429, 2], [1031, 1076, 2], [1059, 147, 1], [148, 236, 4], [1186, 156, 1], [150, 138, 2], [220, 220, 7], [259, 152, 1], [291, 291, 3], [306, 133, 2], [348, 240, 2], [1038, 1413, 2], [1094, 1094, 2], [179, 241, 2], [114, 239, 2], [163, 270, 1], [252, 132, 2], [287, 287, 4], [1053, 176, 7], [1207, 163, 6], [281, 147, 2], [581, 581, 2], [164, 164, 4], [235, 144, 2], [464, 464, 2], [158, 104, 3], [351, 189, 2], [151, 243, 1], [222, 1067, 2], [1035, 103, 7], [1036, 179, 4], [1062, 257, 1], [214, 145, 2], [267, 132, 2], [424, 424, 2], [241, 149, 2], [311, 311, 3], [435, 435, 2], [1141, 152, 3], [246, 152, 1], [323, 323, 2], [172, 1104, 1], [146, 1052, 2], [243, 151, 1], [264, 264, 3], [215, 150, 2], [1138, 168, 3], [260, 168, 1], [1036, 177, 4], [1096, 156, 2], [176, 223, 2], [180, 1033, 1], [224, 224, 6], [518, 518, 2], [249, 249, 6], [1136, 148, 2], [681, 681, 2], [155, 221, 2], [1029, 286, 6], [154, 216, 2], [1029, 291, 6], [133, 1045, 2], [141, 199, 2], [144, 1043, 2], [149, 1041, 2], [1026, 1130, 3], [1034, 220, 2], [117, 162, 2], [132, 103, 1], [133, 1043, 2], [189, 138, 2], [1034, 255, 2], [121, 121, 2], [179, 1061, 2], [442, 442, 2], [233, 148, 2], [400, 156, 1], [405, 405, 2], [149, 241, 2], [254, 254, 4], [1075, 145, 2], [1206, 170, 1], [419, 419, 2], [144, 1052, 2], [176, 147, 2], [215, 103, 2], [1141, 156, 3], [172, 270, 1], [179, 226, 2], [271, 166, 1], [132, 1117, 2], [1059, 146, 1], [167, 237, 2], [437, 437, 2], [767, 767, 2], [1069, 1070, 1], [1106, 166, 2], [348, 189, 2], [1207, 158, 6], [176, 417, 2], [245, 245, 5], [1097, 158, 2], [104, 318, 1], [214, 138, 3], [263, 133, 1], [1186, 165, 1], [145, 1043, 2], [215, 136, 4], [236, 358, 2], [272, 156, 1], [148, 1057, 2], [1244, 144, 2], [303, 217, 2], [466, 466, 2], [1034, 258, 2], [113, 159, 2], [149, 241, 4], [149, 1048, 2], [242, 242, 6], [1059, 149, 1], [133, 1052, 2], [144, 250, 2], [223, 296, 2], [265, 165, 1], [268, 158, 1], [288, 147, 2], [343, 343, 2], [1186, 170, 1], [246, 246, 6], [1138, 158, 3], [1207, 152, 6], [172, 172, 2], [373, 189, 2], [376, 376, 2], [1027, 1099, 4], [1031, 291, 2], [146, 146, 7], [372, 163, 1], [284, 284, 4], [1237, 189, 4], [114, 105, 2], [138, 150, 2], [228, 302, 2], [1037, 1086, 5], [233, 103, 2], [371, 163, 1], [138, 1063, 2], [1062, 261, 1], [1029, 279, 6], [1029, 278, 6], [1050, 132, 1], [330, 330, 4], [1034, 1135, 2], [220, 145, 2], [543, 543, 2], [1040, 180, 4], [136, 1046, 2], [231, 149, 3], [297, 152, 1], [1026, 1140, 1], [1033, 1152, 1], [1106, 165, 2], [104, 321, 1], [149, 231, 3], [219, 151, 2], [278, 278, 2], [316, 316, 2], [1031, 240, 2], [1047, 168, 4], [133, 1051, 2], [136, 151, 2], [176, 1155, 2], [1025, 299, 2], [148, 250, 4], [226, 150, 2], [265, 168, 1], [138, 189, 2], [177, 1076, 2], [292, 292, 4], [1035, 189, 4], [172, 1032, 1], [251, 382, 2], [1119, 158, 3], [155, 110, 2], [193, 193, 2], [173, 271, 1], [298, 168, 1], [148, 233, 3], [413, 158, 1], [1058, 145, 4], [132, 1046, 2], [282, 147, 2], [1035, 189, 2], [1047, 156, 4], [144, 222, 2], [152, 322, 1], [1026, 176, 5], [1034, 263, 2], [151, 136, 2], [276, 146, 2], [342, 342, 2], [1059, 138, 1], [1115, 133, 6], [318, 165, 1], [1047, 1404, 1], [142, 142, 2], [181, 181, 2], [1025, 298, 2], [1031, 267, 2], [1031, 274, 2], [138, 1052, 2], [177, 249, 2], [230, 103, 2], [252, 132, 1], [275, 248, 2], [307, 307, 3], [1029, 1070, 3], [1092, 1026, 1], [110, 168, 1], [281, 281, 3], [1029, 1118, 1], [1129, 168, 4], [153, 216, 2], [181, 1032, 1], [347, 347, 3], [1031, 286, 2], [1061, 1061, 2], [1104, 165, 3], [1129, 166, 4], [1186, 158, 1], [1207, 180, 6], [152, 321, 1], [147, 176, 2], [1031, 264, 2], [1124, 146, 6], [1207, 165, 6], [167, 232, 2], [272, 158, 1], [1034, 1079, 2], [179, 148, 2], [179, 311, 2], [246, 168, 1], [219, 219, 7], [231, 103, 2], [132, 252, 1], [1038, 1437, 2], [1119, 165, 3], [351, 351, 2], [1058, 133, 4], [1186, 166, 1], [1200, 1033, 1], [144, 1051, 2], [235, 103, 2], [242, 168, 1], [136, 226, 3], [223, 103, 2], [1048, 145, 5], [1119, 166, 3], [170, 1037, 1], [358, 176, 2], [1059, 145, 1], [224, 189, 2], [283, 283, 4], [181, 1033, 1], [214, 103, 2], [1207, 181, 6], [104, 327, 1], [150, 252, 1], [159, 113, 2], [226, 309, 1], [1034, 236, 2], [1207, 166, 6], [144, 1045, 2], [1034, 1076, 2], [1078, 189, 3], [145, 267, 2], [119, 119, 3], [147, 1050, 2], [1025, 301, 2], [1034, 1061, 2], [1031, 273, 2], [254, 132, 1], [1035, 1151, 2], [576, 576, 2], [224, 177, 2], [1106, 158, 2], [1067, 1067, 2], [149, 133, 1], [230, 189, 2], [156, 156, 1], [613, 613, 2], [1077, 170, 2], [145, 264, 2], [146, 1054, 2], [261, 261, 4], [398, 152, 1], [1047, 172, 4], [151, 255, 1], [268, 156, 1], [1031, 300, 2], [149, 138, 1], [88, 88, 1], [1035, 176, 2], [148, 233, 4], [151, 219, 2], [177, 214, 2], [237, 153, 2], [1031, 1056, 2], [1138, 156, 3], [1206, 166, 1], [1219, 156, 1], [103, 132, 1], [136, 1054, 2], [150, 244, 1], [279, 146, 2], [346, 346, 3], [1081, 170, 2], [528, 366, 2], [1058, 147, 4], [117, 117, 4], [433, 168, 1], [164, 114, 2], [571, 571, 2], [145, 1045, 2], [148, 1042, 2], [1031, 266, 2], [110, 154, 2], [162, 115, 2], [662, 662, 2], [1035, 1083, 2], [1087, 1060, 1], [103, 136, 1], [179, 215, 2], [241, 149, 4], [297, 168, 1], [389, 172, 1], [1074, 1260, 3], [105, 113, 2], [1120, 156, 4], [1143, 180, 4], [103, 331, 2], [150, 146, 1], [158, 1099, 1], [1031, 276, 2], [1119, 156, 3], [132, 1054, 2], [133, 1054, 2], [136, 1051, 2], [1032, 346, 3], [104, 329, 1], [163, 1037, 1], [1029, 306, 6], [221, 221, 4], [258, 258, 2], [339, 157, 2], [1035, 1187, 2], [1040, 181, 4], [1063, 151, 3], [1156, 165, 4], [148, 222, 5], [217, 303, 2], [286, 286, 4], [459, 459, 3], [146, 223, 3], [179, 369, 2], [275, 220, 2], [1031, 269, 2], [148, 222, 3], [173, 173, 6], [243, 243, 6], [254, 132, 2], [298, 152, 1], [1134, 168, 4], [214, 214, 7], [712, 712, 2], [132, 344, 2], [398, 156, 1], [1066, 148, 4], [1113, 166, 3], [274, 274, 3], [315, 315, 3], [1026, 1247, 1], [226, 144, 1], [235, 189, 2], [282, 282, 3], [1027, 292, 4], [1052, 138, 4], [1066, 1056, 1], [170, 1077, 1], [218, 218, 2], [1259, 156, 1], [376, 163, 1], [1024, 296, 4], [1035, 1161, 2], [299, 156, 1], [1088, 240, 2], [1152, 166, 4], [285, 285, 3], [1037, 245, 5], [1041, 189, 4], [1207, 172, 6], [133, 255, 1], [147, 1054, 2], [257, 296, 2], [1106, 156, 2], [1257, 158, 1], [136, 215, 3], [224, 151, 2], [1105, 170, 2], [1134, 165, 4], [228, 1062, 2], [103, 145, 1], [147, 1051, 2], [1031, 280, 2], [1058, 146, 4], [1257, 163, 1], [138, 249, 3], [242, 170, 1], [1026, 1115, 1], [1207, 168, 6], [1038, 245, 2], [132, 254, 1], [1206, 165, 1], [136, 189, 2], [228, 103, 2], [1060, 1048, 1], [150, 226, 2], [152, 1086, 1], [211, 211, 2], [144, 151, 1], [301, 166, 1], [331, 331, 3], [420, 156, 1], [1034, 249, 2], [446, 222, 2], [1032, 327, 3], [110, 155, 2], [1029, 309, 6], [283, 166, 1], [425, 158, 1], [1031, 278, 2], [1031, 289, 2], [314, 157, 2], [1034, 1079, 1], [1035, 176, 4], [224, 103, 2], [248, 149, 5], [293, 293, 4], [159, 313, 2], [570, 570, 2], [1035, 1085, 2], [1224, 165, 1], [1047, 158, 4], [1058, 138, 4], [136, 1050, 2], [1031, 284, 2], [1047, 165, 4], [1056, 177, 1], [1146, 173, 1], [349, 251, 2], [1031, 282, 2], [1031, 1076, 1], [244, 244, 6], [377, 377, 2], [1062, 220, 4], [1133, 163, 3], [103, 373, 2], [113, 247, 2], [146, 279, 2], [298, 298, 4], [252, 150, 1], [1206, 168, 1], [1224, 156, 1], [151, 254, 1], [144, 1098, 2], [148, 233, 5], [1047, 166, 4], [1111, 1111, 4], [1232, 165, 1], [148, 250, 5], [245, 104, 1], [265, 158, 1], [304, 304, 4], [132, 257, 1], [264, 264, 4], [1027, 287, 4], [1026, 1293, 1], [138, 1050, 2], [230, 230, 6], [257, 145, 2], [1027, 293, 4], [1129, 152, 4], [135, 135, 2], [1024, 144, 1], [1026, 1250, 1], [1029, 300, 6], [1034, 1076, 1], [231, 149, 4], [1024, 302, 4], [1027, 259, 4], [1246, 1075, 6], [248, 176, 2], [500, 500, 2], [133, 1092, 2], [138, 1051, 2], [163, 299, 1], [362, 362, 3], [745, 745, 2], [1056, 1056, 2], [133, 1042, 2], [267, 136, 2], [1026, 1254, 1], [1059, 150, 1], [138, 1046, 2], [136, 1052, 2], [180, 287, 1], [252, 145, 2], [345, 526, 2], [1207, 173, 6], [118, 118, 3], [241, 149, 5], [1240, 165, 1], [170, 1128, 1], [177, 132, 2], [222, 189, 2], [1027, 268, 4], [1041, 149, 4], [1066, 146, 4], [1069, 146, 4], [177, 148, 2], [1108, 145, 6], [173, 318, 1], [233, 325, 2], [1208, 1036, 1], [165, 271, 1], [165, 1077, 1], [214, 176, 2], [292, 158, 1], [104, 167, 1], [198, 198, 2], [1031, 277, 2], [157, 157, 4], [273, 273, 4], [320, 320, 4], [329, 329, 4], [1024, 307, 4], [1025, 322, 2], [1031, 309, 2], [1034, 244, 2], [104, 353, 1], [162, 117, 2], [163, 1112, 1], [260, 260, 6], [684, 684, 2], [1026, 177, 3], [103, 338, 2], [151, 224, 2], [155, 155, 4], [1036, 248, 4], [303, 303, 4], [372, 321, 1], [103, 333, 2], [491, 361, 2], [1141, 158, 3], [215, 252, 2], [301, 152, 1], [617, 617, 2], [1031, 1067, 2], [147, 282, 2], [241, 179, 2], [308, 231, 3], [369, 369, 2], [136, 217, 3], [257, 132, 1], [448, 177, 2], [1027, 272, 4], [1224, 166, 1], [146, 179, 2], [226, 179, 2], [235, 235, 6], [409, 409, 3], [147, 1048, 2], [215, 307, 2], [103, 325, 2], [103, 359, 2], [430, 430, 2], [1026, 1115, 3], [150, 252, 2], [172, 1033, 1], [268, 268, 5], [257, 132, 2], [212, 212, 2], [270, 170, 1], [1079, 132, 3], [136, 144, 1], [259, 259, 6], [1035, 1193, 2], [1072, 1404, 2], [1120, 166, 4], [249, 148, 2], [265, 181, 1], [296, 223, 2], [1050, 136, 4], [104, 326, 1], [189, 147, 1], [327, 327, 4], [1206, 163, 1], [1076, 1076, 2], [276, 276, 2], [1026, 1252, 1], [138, 176, 2], [728, 728, 2], [1041, 1067, 4], [770, 770, 2], [177, 224, 2], [1031, 285, 2], [1070, 179, 5], [149, 1046, 2], [1259, 163, 1], [104, 346, 1], [1027, 260, 4], [1034, 1229, 1], [1059, 151, 1], [1120, 165, 4], [133, 222, 3], [197, 197, 2], [250, 189, 2], [1032, 319, 3], [103, 1110, 2], [104, 330, 1], [162, 328, 2], [167, 110, 2], [267, 145, 2], [1074, 1239, 3], [1050, 176, 4], [1097, 163, 2], [147, 1058, 2], [1027, 271, 4], [103, 335, 2], [275, 248, 3], [1026, 1278, 1], [103, 334, 2], [145, 254, 2], [147, 281, 2], [226, 189, 2], [269, 269, 5], [447, 447, 1], [1057, 148, 6], [214, 305, 2], [233, 150, 2], [1034, 240, 2], [144, 136, 1], [166, 1077, 1], [215, 311, 2], [233, 1061, 1], [1026, 1243, 1], [1120, 158, 4], [133, 262, 1], [147, 1049, 2], [1031, 281, 2], [215, 176, 2], [144, 138, 1], [154, 110, 2], [486, 486, 2], [1026, 1321, 1], [1047, 173, 4], [1066, 132, 4], [1143, 163, 4], [103, 375, 2], [146, 1048, 2], [149, 179, 2], [407, 152, 1], [1034, 1075, 2], [166, 270, 1], [242, 165, 1], [1036, 1183, 1], [149, 189, 2], [177, 377, 2], [250, 148, 2], [1172, 168, 4], [288, 288, 4], [319, 319, 3], [366, 507, 2], [1033, 1156, 1], [122, 122, 2], [150, 1041, 2], [1025, 321, 2], [148, 1052, 2], [152, 180, 1], [155, 232, 2], [1033, 265, 1], [1037, 1137, 5], [235, 1083, 2], [1060, 149, 6], [291, 291, 4], [407, 158, 1], [1043, 144, 4], [136, 1089, 2], [223, 1083, 2], [241, 150, 1], [245, 181, 1], [306, 446, 3], [379, 379, 3], [1026, 179, 3], [1040, 1086, 1], [1051, 148, 4], [1111, 1067, 4], [1128, 170, 3], [145, 257, 2], [392, 173, 1], [1255, 1036, 1], [133, 263, 1], [1116, 179, 5], [113, 113, 4], [176, 136, 2], [233, 150, 1], [297, 297, 4], [353, 353, 4], [1034, 243, 2], [138, 1091, 2], [274, 274, 4], [443, 158, 1], [148, 1051, 2], [318, 371, 1], [378, 378, 3], [1027, 324, 4], [1034, 1127, 1], [244, 150, 1], [249, 151, 1], [1172, 158, 4], [1052, 148, 4], [255, 151, 1], [146, 1064, 2], [166, 1081, 1], [340, 340, 2], [252, 150, 2], [364, 364, 2], [1027, 270, 4], [114, 114, 4], [138, 1054, 2], [226, 226, 7], [240, 402, 2], [1032, 321, 3], [1034, 278, 2], [140, 140, 3], [147, 177, 2], [287, 158, 1], [477, 477, 2], [1034, 231, 2], [1043, 145, 4], [1096, 163, 2], [1134, 152, 4], [1026, 230, 1], [115, 159, 2], [180, 292, 1], [251, 349, 1], [301, 301, 2], [1224, 158, 1], [104, 154, 1], [149, 1051, 2], [472, 472, 3], [1037, 265, 5], [422, 152, 1], [344, 132, 2], [1031, 295, 2], [293, 165, 1], [104, 368, 1], [136, 176, 2], [147, 288, 2], [189, 230, 2], [252, 179, 2], [144, 1042, 2], [149, 177, 2], [156, 1077, 1], [216, 216, 4], [245, 172, 1], [254, 151, 1], [1056, 177, 2], [1072, 245, 2], [1202, 176, 2], [243, 177, 2], [406, 177, 2], [1025, 319, 2], [1026, 223, 1], [1036, 250, 4], [1057, 133, 3], [147, 1066, 2], [192, 192, 2], [339, 247, 2], [396, 396, 3], [115, 162, 2], [132, 261, 2], [149, 1052, 2], [266, 266, 5], [1024, 315, 4], [1130, 145, 6], [1240, 166, 1], [149, 248, 2], [149, 1088, 2], [224, 255, 2], [349, 251, 1], [1061, 1061, 3], [1305, 222, 4], [103, 308, 2], [358, 358, 3], [399, 399, 3], [1037, 1139, 5], [189, 1078, 2], [1031, 1126, 1], [1055, 146, 6], [231, 308, 2], [283, 232, 2], [1041, 144, 3], [1099, 165, 2], [264, 145, 2], [287, 156, 1], [302, 228, 2], [103, 151, 1], [219, 304, 2], [104, 155, 1], [110, 158, 1], [146, 217, 3], [237, 237, 4], [1219, 168, 1], [233, 325, 3], [313, 159, 2], [1026, 176, 3], [1048, 146, 6], [1112, 152, 2], [280, 280, 5], [508, 508, 2], [1027, 283, 4], [1036, 228, 4], [1037, 1093, 5], [1089, 1089, 2], [207, 207, 2], [239, 314, 2], [417, 176, 2], [1058, 136, 4], [1129, 165, 4], [133, 258, 1], [147, 1065, 2], [411, 176, 2], [261, 132, 1], [1033, 270, 1], [103, 1116, 2], [132, 257, 2], [145, 1051, 2], [148, 151, 1], [224, 224, 7], [103, 347, 2], [133, 250, 2], [147, 179, 2], [223, 252, 1], [156, 1188, 1], [363, 152, 1], [1034, 1126, 1], [1045, 144, 4], [1169, 170, 3], [146, 103, 1], [1032, 322, 3], [217, 136, 3], [222, 144, 2], [277, 277, 3], [1031, 1127, 1], [1143, 165, 4], [240, 348, 3], [1025, 327, 2], [105, 114, 2], [365, 365, 2], [148, 236, 5], [1257, 156, 1], [278, 278, 5], [1091, 1091, 2], [1232, 166, 1], [1246, 1079, 6], [163, 163, 6], [180, 1032, 1], [219, 1056, 2], [228, 1085, 2], [1036, 223, 4], [189, 235, 2], [189, 1024, 2], [246, 181, 1], [1025, 318, 2], [151, 1052, 2], [214, 1062, 2], [1219, 158, 1], [103, 320, 2], [1026, 1130, 1], [1098, 148, 6], [110, 152, 1], [132, 1049, 2], [172, 301, 1], [416, 158, 1], [189, 351, 2], [209, 209, 2], [267, 267, 3], [367, 159, 2], [1034, 300, 2], [1055, 150, 5], [154, 221, 2], [215, 1062, 2], [239, 114, 2], [254, 145, 2], [255, 255, 4], [144, 1197, 2], [214, 147, 2], [532, 532, 2], [1066, 133, 4], [1086, 166, 2], [448, 234, 2], [1040, 1137, 1], [1048, 1060, 1], [103, 386, 2], [172, 321, 1], [230, 1085, 2], [1034, 1258, 1], [1054, 138, 4], [146, 285, 2], [213, 213, 2], [1026, 179, 1], [1033, 259, 1], [1093, 242, 4], [104, 153, 1], [156, 245, 1], [304, 219, 2], [1034, 241, 2], [1224, 170, 1], [165, 270, 1], [150, 1051, 2], [1033, 272, 1], [1034, 274, 2], [1219, 172, 1], [146, 1049, 2], [261, 132, 2], [146, 1058, 2], [173, 327, 1], [180, 180, 2], [375, 375, 3], [1035, 179, 2], [104, 363, 1], [141, 141, 3], [136, 1048, 2], [152, 324, 1], [214, 254, 2], [1050, 138, 4], [1177, 168, 4], [367, 247, 2], [421, 421, 3], [103, 369, 2], [295, 295, 4], [151, 254, 2], [219, 1085, 2], [258, 258, 4], [148, 249, 2], [214, 1056, 2], [1026, 1140, 3], [146, 1069, 2], [148, 179, 2], [176, 215, 2], [250, 103, 2], [328, 162, 2], [383, 383, 2], [1034, 1067, 2], [1172, 156, 4], [144, 150, 1], [166, 265, 1], [189, 1135, 2], [1143, 156, 4], [151, 231, 2], [154, 154, 4], [148, 1066, 2], [151, 1042, 2], [706, 706, 2], [1027, 297, 4], [1179, 172, 5], [145, 1052, 2], [150, 149, 1], [279, 279, 5], [1024, 275, 4], [1115, 144, 6], [1143, 158, 4], [176, 138, 2], [1033, 272, 3], [1035, 179, 4], [1232, 158, 1], [133, 255, 2], [136, 1058, 2], [217, 1070, 2], [260, 170, 1], [480, 480, 2], [1031, 288, 2], [145, 1054, 2], [150, 1080, 2], [173, 283, 1], [233, 233, 7], [1130, 132, 6], [149, 220, 3], [156, 410, 1], [299, 158, 1], [301, 168, 1], [320, 241, 3], [371, 318, 1], [1257, 168, 1], [165, 283, 1], [177, 406, 2], [338, 338, 3], [147, 1055, 2], [138, 1048, 2], [144, 262, 2], [153, 237, 2], [236, 103, 2], [246, 166, 1], [1032, 318, 3], [1034, 267, 2], [1084, 170, 2], [1143, 166, 4], [149, 220, 5], [151, 1082, 2], [214, 315, 2], [224, 138, 3], [263, 263, 4], [366, 155, 2], [1034, 286, 2], [132, 179, 2], [189, 1111, 2], [145, 1048, 2], [150, 1042, 2], [180, 283, 1], [180, 1119, 1], [228, 147, 3], [1046, 133, 3], [1219, 165, 1], [1411, 157, 4], [151, 255, 2], [1235, 1036, 1], [1259, 168, 1], [177, 243, 2], [1026, 250, 3], [1086, 165, 2], [1219, 173, 1], [1240, 170, 1], [164, 349, 2], [189, 222, 2], [373, 373, 2], [500, 484, 2], [1026, 1342, 1], [1052, 136, 4], [1062, 248, 1], [205, 205, 2], [103, 150, 1], [148, 249, 4], [156, 372, 1], [264, 138, 2], [393, 393, 3], [402, 231, 2], [1024, 1132, 4], [252, 252, 4], [285, 285, 2], [302, 261, 2], [322, 322, 3], [1025, 326, 2], [1031, 279, 2], [145, 1041, 2], [151, 249, 2], [1026, 1161, 3], [1033, 260, 1], [1, 1, 2], [148, 149, 2], [148, 1055, 2], [265, 104, 1], [177, 149, 2], [299, 166, 1], [428, 428, 2], [1034, 1267, 1], [1081, 1093, 2], [1169, 158, 3], [104, 372, 1], [151, 1126, 2], [176, 1050, 2], [234, 313, 2], [244, 244, 7], [259, 435, 2], [1026, 235, 1], [308, 308, 4], [1118, 1088, 3], [1240, 163, 1], [103, 117, 2], [105, 105, 4], [133, 258, 2], [146, 1055, 2], [245, 173, 1], [277, 138, 2], [324, 324, 3], [1026, 1117, 1], [1034, 257, 2], [1049, 147, 6], [1240, 168, 1], [386, 386, 3], [454, 240, 2], [145, 261, 2], [299, 165, 1], [307, 215, 2], [327, 152, 1], [908, 908, 2], [1056, 1031, 1], [1232, 173, 1], [136, 233, 3], [177, 1126, 2], [272, 170, 1], [341, 341, 2], [588, 588, 2], [1034, 291, 2], [458, 179, 2], [296, 257, 2], [1232, 156, 1], [115, 115, 4], [1026, 1161, 1], [1033, 271, 1], [1034, 266, 2], [1035, 177, 4], [1152, 152, 1], [104, 221, 1], [166, 293, 1], [219, 147, 3], [264, 138, 1], [320, 241, 2], [1036, 217, 4], [1117, 145, 4], [133, 226, 3], [87, 87, 1], [292, 156, 1], [1112, 168, 2], [1036, 230, 4], [1040, 1142, 1], [1043, 150, 3], [146, 1066, 2], [194, 194, 2], [243, 103, 2], [1034, 276, 2], [1092, 144, 4], [149, 1066, 2], [153, 361, 2], [1033, 268, 1], [1097, 172, 2], [250, 144, 2], [254, 228, 1], [289, 289, 4], [321, 372, 1], [334, 334, 4], [1026, 177, 1], [1026, 228, 1], [1088, 248, 2], [149, 1055, 2], [311, 215, 2], [507, 221, 2], [1081, 163, 2], [1112, 156, 2], [1169, 156, 3], [189, 1041, 2], [252, 223, 1], [281, 281, 2], [104, 216, 1], [246, 158, 1], [1036, 1213, 1], [1045, 145, 4], [1169, 166, 3], [147, 219, 3], [150, 1046, 2], [217, 146, 3], [262, 103, 2], [398, 270, 1], [1037, 1196, 5], [1038, 265, 2], [1037, 242, 5], [1051, 138, 4], [321, 166, 1], [172, 297, 1], [432, 432, 3], [1038, 242, 2], [1040, 1093, 1], [1076, 151, 2], [173, 329, 1], [1079, 176, 3], [234, 328, 1], [284, 284, 5], [1026, 217, 1], [133, 224, 3], [147, 1069, 2], [180, 353, 1], [226, 136, 3], [280, 280, 2], [1027, 298, 4], [1034, 309, 2], [103, 379, 2], [113, 105, 2], [165, 1084, 1], [180, 293, 1], [226, 146, 2], [382, 251, 2], [513, 513, 3], [1177, 152, 4], [132, 1066, 2], [150, 241, 2], [263, 103, 2], [231, 149, 5], [236, 148, 5], [246, 163, 1], [255, 224, 2], [663, 663, 2], [24, 24, 2], [132, 215, 3], [282, 282, 2], [357, 357, 2], [133, 103, 1], [170, 242, 1], [158, 268, 1], [246, 170, 1], [1070, 179, 1], [148, 138, 1], [330, 330, 2], [407, 271, 1], [414, 414, 3], [582, 582, 2], [1048, 147, 6], [1133, 152, 3], [104, 371, 1], [158, 1077, 1], [132, 177, 2], [176, 214, 2], [179, 1043, 2], [286, 286, 5], [334, 1110, 2], [1025, 368, 2], [1032, 368, 3], [1033, 260, 3], [1036, 219, 4], [1036, 1078, 3], [1038, 246, 2], [1098, 144, 6], [1156, 1156, 4], [138, 1058, 2], [147, 103, 1], [152, 245, 2], [232, 528, 2], [243, 243, 7], [249, 335, 3], [265, 156, 1], [314, 239, 1], [1035, 219, 4], [103, 138, 1], [215, 146, 2], [223, 223, 7], [256, 256, 1], [305, 214, 2], [1025, 330, 2], [1034, 269, 2], [1049, 148, 6], [136, 267, 2], [1026, 176, 1], [1045, 1056, 4], [217, 1083, 2], [277, 277, 4], [1056, 1066, 2], [104, 378, 1], [110, 153, 2], [248, 132, 1], [577, 577, 2], [1057, 133, 5], [159, 367, 2], [1026, 1151, 1], [149, 136, 1], [151, 1046, 2], [189, 348, 2], [306, 222, 2], [692, 692, 2], [1040, 1146, 1], [120, 120, 2], [327, 168, 1], [355, 230, 2], [437, 437, 3], [150, 1055, 2], [232, 167, 2], [1051, 144, 4], [1026, 1359, 1], [1034, 273, 2], [1177, 156, 4], [179, 149, 2], [1036, 1075, 4], [1037, 1099, 5], [1104, 170, 3], [173, 298, 1], [327, 165, 1], [349, 164, 2], [173, 156, 1], [189, 1046, 2], [231, 1056, 2], [274, 133, 2], [335, 1110, 2], [387, 387, 2], [429, 429, 3], [1034, 264, 2], [1033, 270, 3], [1052, 144, 4], [1095, 170, 3], [1219, 166, 1], [150, 233, 2], [166, 1106, 1], [241, 241, 7], [275, 220, 3], [363, 156, 1], [424, 424, 3], [1031, 1070, 2], [1169, 165, 3], [138, 1055, 2], [168, 265, 2], [172, 293, 1], [237, 167, 2], [299, 299, 2], [1025, 346, 2], [1084, 163, 2], [145, 267, 1], [228, 254, 1], [244, 103, 2], [1027, 301, 4], [1032, 329, 3], [1040, 1099, 1], [1048, 145, 1], [1054, 151, 4], [1152, 1152, 4], [153, 110, 2], [158, 245, 1], [179, 1127, 2], [176, 1075, 2], [382, 162, 2], [104, 232, 1], [130, 130, 3], [217, 303, 3], [233, 148, 4], [304, 219, 3], [1034, 282, 2], [1259, 158, 1], [104, 397, 1], [230, 147, 3], [295, 295, 3], [305, 305, 4], [521, 521, 2], [1034, 277, 2], [278, 144, 2], [1033, 271, 3], [1036, 235, 4], [1084, 1099, 2], [1140, 1026, 1], [1225, 189, 2], [104, 389, 1], [240, 149, 4], [319, 156, 1], [561, 216, 2], [1026, 250, 1], [133, 1048, 2], [248, 103, 2], [262, 262, 4], [264, 264, 2], [300, 300, 3], [822, 822, 2], [57, 57, 1], [132, 1060, 2], [133, 274, 2], [149, 1060, 2], [358, 236, 3], [431, 431, 3], [1067, 133, 1], [189, 224, 2], [228, 261, 2], [370, 370, 2], [133, 1064, 2], [136, 274, 1], [163, 163, 4], [321, 170, 1], [1036, 214, 4], [1257, 173, 1], [179, 132, 2], [144, 274, 2], [1047, 181, 4], [144, 1115, 2], [233, 148, 3], [249, 335, 2], [255, 151, 2], [258, 103, 2], [1026, 1108, 3], [1046, 151, 4], [1072, 163, 5], [405, 405, 3], [1037, 246, 5], [1063, 147, 6], [1069, 147, 4], [177, 146, 2], [1024, 1204, 1], [1049, 146, 6], [1051, 145, 4], [117, 105, 2], [289, 289, 3], [326, 326, 4], [421, 240, 2], [1025, 353, 2], [1026, 1165, 3], [1029, 344, 6], [1054, 148, 6], [104, 400, 1], [165, 265, 1], [351, 224, 2], [359, 235, 2], [390, 390, 2], [1062, 1062, 5], [132, 1108, 2], [136, 149, 1], [138, 231, 3], [243, 1083, 2], [244, 179, 2], [257, 176, 2], [258, 150, 2], [242, 156, 1], [251, 681, 2], [1093, 166, 2], [271, 170, 1], [294, 294, 4], [1024, 303, 4], [1232, 172, 1], [104, 398, 1], [110, 156, 1], [158, 1191, 1], [214, 132, 3], [259, 165, 2], [273, 273, 5], [328, 234, 2], [1189, 173, 5], [189, 250, 2], [261, 145, 2], [377, 377, 3], [1147, 284, 1], [222, 103, 2], [223, 223, 6], [252, 215, 2], [255, 103, 2], [158, 371, 1], [1035, 217, 4], [1156, 152, 1], [133, 1066, 2], [151, 1198, 2], [170, 1081, 1], [1032, 433, 3], [1033, 268, 3], [1050, 148, 4], [1084, 181, 2], [1094, 236, 2], [150, 1127, 2], [176, 302, 3], [217, 132, 2], [272, 272, 5], [144, 1055, 2], [150, 151, 2], [217, 1061, 1], [260, 166, 2], [1259, 170, 1], [173, 173, 2], [259, 163, 1], [267, 136, 1], [1152, 156, 1], [104, 376, 1], [155, 152, 1], [258, 226, 2], [325, 325, 4], [1070, 1070, 2], [196, 196, 2], [249, 103, 2], [322, 322, 4], [1034, 261, 2], [1046, 149, 4], [1505, 339, 4], [104, 416, 1], [138, 243, 3], [228, 228, 7], [231, 1076, 1], [244, 1085, 2], [250, 133, 1], [276, 276, 4], [484, 1015, 2], [1067, 148, 2], [181, 265, 1], [249, 151, 2], [1034, 1322, 1], [1133, 168, 3], [172, 172, 5], [184, 184, 2], [133, 1055, 2], [189, 146, 1], [605, 234, 2], [1026, 1153, 3], [1033, 265, 3], [1069, 149, 4], [1328, 220, 4], [144, 1073, 2], [164, 362, 2], [287, 287, 5], [1036, 220, 4], [1036, 226, 4], [1060, 145, 6], [1110, 177, 5], [150, 244, 2], [163, 1185, 1], [222, 1111, 2], [321, 165, 1], [459, 701, 2], [1026, 230, 3], [1031, 344, 2], [1088, 1118, 2], [136, 267, 1], [138, 1049, 2], [1042, 151, 4], [1043, 1061, 3], [150, 258, 2], [188, 188, 2], [257, 215, 1], [269, 269, 6], [301, 301, 5], [1026, 1108, 1], [219, 304, 3], [249, 148, 4], [1026, 1124, 1], [436, 156, 1], [1036, 1079, 4], [1057, 147, 6], [146, 1063, 2], [149, 144, 1], [236, 1062, 2], [296, 296, 4], [1027, 346, 4], [1134, 166, 4], [1179, 168, 5], [34, 34, 1], [210, 210, 2], [269, 138, 2], [493, 493, 2], [1026, 1150, 3], [1133, 156, 3], [1257, 170, 1], [149, 1069, 2], [224, 147, 2], [274, 136, 2], [435, 435, 3], [239, 314, 1], [1034, 1127, 2], [1096, 173, 2], [220, 103, 2], [224, 351, 2], [226, 258, 2], [1026, 1151, 3], [1109, 1048, 1], [176, 148, 2], [181, 245, 1], [231, 151, 2], [1034, 280, 2], [1039, 1139, 6], [1069, 148, 4], [1086, 156, 2], [162, 382, 2], [189, 373, 2], [368, 152, 1], [1025, 371, 2], [1034, 284, 2], [241, 1061, 1], [491, 216, 2], [1026, 1117, 5], [132, 261, 1], [144, 277, 2], [165, 1106, 1], [222, 333, 2], [81, 81, 2], [248, 149, 4], [319, 158, 1], [1036, 1075, 3], [1086, 158, 2], [1186, 173, 1], [1189, 168, 5], [144, 1064, 2], [147, 244, 3], [223, 146, 4], [250, 333, 2], [271, 271, 5], [288, 288, 5], [1026, 1360, 1], [1036, 215, 4], [1072, 152, 5], [176, 315, 3], [242, 163, 1], [392, 413, 1], [589, 589, 3], [1025, 372, 2], [1026, 1149, 3], [1032, 363, 3], [1067, 1031, 1], [1105, 165, 2], [1259, 172, 1], [1025, 329, 2], [1026, 219, 1], [1042, 145, 3], [42, 42, 2], [138, 264, 2], [172, 1129, 1], [295, 132, 2], [575, 361, 2], [611, 611, 2], [1024, 311, 4], [1025, 363, 2], [1057, 146, 6], [1172, 152, 4], [254, 214, 2], [300, 133, 2], [329, 168, 1], [378, 378, 4], [1024, 355, 4], [1034, 254, 2], [1094, 144, 2], [151, 149, 1], [165, 268, 2], [350, 350, 2], [368, 156, 1], [442, 311, 2], [447, 447, 3], [1039, 265, 6], [1047, 180, 4], [132, 1065, 2], [133, 235, 3], [200, 200, 3], [1036, 1061, 3], [146, 177, 2], [150, 1058, 2], [237, 237, 1], [266, 136, 1], [285, 285, 4], [305, 138, 2], [1034, 1315, 1], [1306, 180, 1], [166, 166, 7], [227, 227, 2], [233, 148, 5], [241, 103, 2], [151, 1041, 2], [176, 236, 2], [179, 147, 2], [240, 421, 2], [291, 136, 2], [1177, 158, 4], [1504, 349, 4], [347, 347, 4], [1043, 1070, 4], [1048, 149, 6], [254, 177, 2], [267, 145, 1], [449, 404, 2], [1067, 1111, 5], [1089, 1061, 1], [146, 215, 2], [172, 158, 1], [173, 1134, 1], [230, 230, 7], [1025, 433, 2], [1026, 1031, 1], [1032, 330, 3], [1037, 1277, 5], [1098, 147, 6], [189, 539, 2], [264, 145, 1], [104, 433, 1], [179, 303, 3], [240, 103, 2], [257, 257, 5], [1039, 245, 6], [138, 1064, 2], [235, 146, 3], [289, 132, 2], [1026, 1150, 1], [1049, 144, 5], [1105, 166, 2], [41, 41, 2], [176, 261, 2], [270, 398, 1], [292, 165, 2], [389, 410, 1], [402, 402, 3], [1034, 252, 2], [133, 1058, 2], [150, 258, 1], [215, 132, 3], [254, 151, 2], [1024, 1220, 1], [1032, 353, 3], [1032, 416, 3], [1052, 149, 4], [1179, 166, 5], [104, 422, 1], [105, 117, 2], [167, 167, 4], [310, 310, 1], [345, 140, 2], [1033, 259, 3], [1056, 147, 2], [242, 181, 1], [360, 360, 2], [1074, 152, 5], [1094, 250, 2], [246, 246, 7], [275, 145, 2], [280, 136, 2], [1038, 444, 2], [1041, 150, 4], [1268, 151, 2], [104, 408, 1], [133, 262, 2], [144, 145, 2], [335, 335, 4], [359, 263, 2], [1034, 1122, 2], [1046, 1067, 1], [201, 201, 2], [297, 297, 5], [315, 214, 2], [376, 376, 3], [1156, 158, 1], [166, 283, 1], [177, 255, 2], [305, 1110, 2], [1035, 1111, 2], [1062, 223, 4], [1085, 1085, 3], [40, 40, 2], [65, 65, 1], [233, 136, 3], [281, 281, 4], [303, 217, 3], [1024, 1199, 1], [1036, 222, 4], [1093, 152, 2], [103, 147, 1], [104, 407, 1], [132, 1064, 2], [153, 152, 1], [226, 338, 2], [300, 138, 2], [144, 1065, 2], [149, 231, 5], [249, 148, 5], [268, 170, 1], [1036, 224, 4], [1099, 168, 2], [1296, 170, 1], [158, 413, 1], [176, 248, 3], [299, 299, 5], [144, 255, 2], [179, 244, 2], [232, 155, 3], [266, 1083, 2], [1026, 1124, 3], [1029, 302, 6], [1052, 151, 4], [1144, 291, 1], [115, 234, 2], [151, 1054, 2], [177, 448, 2], [1026, 1125, 1], [189, 226, 2], [598, 598, 3], [1060, 146, 6], [149, 150, 1], [156, 272, 1], [176, 508, 2], [319, 319, 4], [1026, 223, 5], [1035, 214, 4], [1088, 278, 2], [101, 101, 2], [133, 1057, 2], [258, 235, 1], [1035, 214, 2], [1062, 228, 4], [1076, 151, 3], [231, 308, 3], [240, 278, 2], [346, 346, 4], [1035, 215, 2], [1145, 170, 4], [144, 1048, 2], [145, 236, 2], [165, 1081, 1], [220, 275, 2], [103, 148, 1], [148, 150, 1], [149, 241, 3], [166, 1084, 1], [176, 257, 2], [206, 206, 3], [362, 164, 2], [369, 311, 2], [733, 733, 2], [1026, 226, 1], [144, 263, 2], [219, 147, 4], [1024, 304, 4], [1049, 133, 6], [1072, 168, 5], [1076, 177, 4], [1105, 1032, 2], [132, 1055, 2], [174, 174, 2], [181, 1027, 1], [247, 649, 2], [266, 136, 2], [587, 587, 1], [1026, 1117, 3], [1033, 165, 4], [1094, 132, 2], [144, 1063, 2], [239, 458, 2], [249, 249, 7], [259, 170, 1], [1024, 331, 4], [1037, 1221, 5], [1047, 242, 1], [1051, 149, 4], [1088, 220, 2], [1089, 217, 2], [145, 264, 1], [163, 1133, 1], [1029, 296, 6], [1034, 281, 2], [1034, 285, 2], [1062, 1122, 4], [132, 1071, 2], [149, 103, 1], [173, 245, 1], [181, 246, 1], [224, 331, 2], [298, 298, 5], [361, 153, 2], [1036, 244, 4], [1108, 147, 6], [261, 302, 2], [268, 165, 2], [104, 392, 1], [395, 395, 3], [1026, 1149, 1], [1034, 289, 2], [1066, 149, 4], [1074, 168, 5], [1296, 163, 1], [157, 157, 1], [186, 186, 2], [1025, 400, 2], [132, 1069, 2], [133, 1069, 2], [148, 1069, 2], [163, 372, 1], [176, 1042, 2], [271, 407, 1], [375, 217, 2], [1037, 1282, 5], [1054, 150, 4], [1067, 222, 5], [1313, 1036, 1], [136, 1063, 2], [138, 277, 1], [430, 236, 2], [457, 168, 1], [133, 263, 2], [133, 1065, 2], [243, 151, 2], [251, 117, 1], [1026, 177, 5], [1074, 1319, 3], [132, 289, 2], [1035, 219, 2], [1046, 150, 4], [1186, 172, 1], [1239, 165, 1], [270, 270, 5], [616, 616, 2], [711, 711, 2], [148, 1078, 1], [166, 1097, 1], [176, 252, 2], [279, 279, 6], [385, 385, 2], [1025, 397, 2], [117, 117, 1], [144, 240, 2], [257, 1083, 2], [1026, 1148, 3], [1116, 1116, 3], [1171, 189, 4], [1206, 156, 1], [180, 180, 6], [230, 355, 2], [315, 445, 2], [133, 277, 2], [223, 146, 3], [248, 275, 3], [312, 312, 2], [1025, 398, 2], [1041, 222, 4], [132, 1063, 2], [150, 1054, 2], [154, 154, 1], [179, 338, 3], [224, 1056, 2], [344, 344, 3], [1027, 319, 4], [1086, 170, 2], [1166, 138, 6], [136, 1049, 2], [363, 168, 1], [396, 396, 4], [481, 481, 2], [835, 835, 2], [1026, 223, 3], [1040, 1201, 1], [1050, 1155, 4], [1096, 170, 2], [104, 418, 1], [144, 1066, 2], [1144, 266, 1], [136, 274, 2], [146, 145, 1], [148, 147, 1], [158, 246, 4], [204, 204, 2], [252, 103, 2], [189, 240, 2], [240, 189, 2], [1034, 1070, 2], [1034, 1126, 2], [1058, 149, 6], [4, 4, 2], [110, 167, 2], [215, 1070, 2], [228, 132, 3], [336, 336, 3], [353, 353, 2], [541, 541, 3], [664, 664, 2], [855, 855, 2], [1032, 378, 3], [1034, 288, 2], [1057, 133, 1], [148, 1063, 2], [151, 243, 2], [307, 442, 2], [1024, 325, 4], [1024, 373, 4], [1034, 1056, 2], [1111, 222, 4], [1339, 170, 1], [149, 1063, 2], [156, 242, 1], [284, 138, 2], [362, 239, 2], [446, 446, 3], [1026, 235, 3], [1033, 166, 4], [151, 1063, 2], [168, 265, 1], [245, 152, 1], [248, 248, 6], [468, 468, 2], [1112, 172, 2], [103, 146, 1], [104, 237, 1], [146, 1079, 1], [177, 1045, 2], [179, 133, 2], [215, 147, 2], [260, 163, 1], [328, 234, 1], [405, 233, 2], [539, 539, 2], [1024, 305, 4], [1026, 224, 1], [1088, 231, 2], [1156, 168, 1], [104, 410, 1], [267, 267, 4], [283, 181, 1], [1026, 179, 5], [1032, 376, 3], [1038, 270, 2], [1088, 132, 2], [1121, 1260, 5], [150, 189, 2], [236, 358, 3], [886, 886, 2], [145, 103, 1], [150, 1050, 2], [277, 133, 2], [284, 284, 2], [290, 290, 4], [548, 548, 3], [1093, 168, 2], [1110, 1110, 3], [291, 291, 5], [292, 292, 5], [293, 170, 1], [673, 673, 2], [1035, 215, 4], [1115, 148, 6], [1260, 165, 1], [146, 1075, 1], [149, 241, 5], [183, 183, 2], [243, 334, 2], [250, 333, 3], [306, 306, 4], [497, 497, 2], [1034, 279, 2], [1074, 1344, 3], [1479, 216, 4], [35, 35, 1], [168, 392, 1], [199, 199, 3], [223, 136, 2], [282, 282, 4], [156, 173, 1], [177, 304, 3], [219, 132, 2], [224, 262, 1], [308, 138, 2], [464, 464, 3], [1051, 150, 4], [1052, 145, 4], [1098, 136, 6], [1099, 246, 4], [1179, 152, 5], [156, 400, 1], [223, 375, 2], [223, 1075, 1], [1086, 104, 2], [146, 150, 1], [226, 133, 3], [1072, 170, 5], [144, 1058, 2], [163, 1039, 1], [166, 271, 1], [187, 187, 2], [1031, 1127, 2], [1045, 151, 3], [131, 131, 1], [217, 375, 2], [1037, 1262, 5], [1303, 1036, 1], [147, 214, 2], [147, 1063, 2], [179, 434, 2], [1025, 408, 2], [1054, 148, 4], [1132, 275, 4], [1534, 313, 4], [228, 138, 2], [322, 158, 1], [413, 392, 1], [422, 422, 3], [1025, 376, 2], [1067, 1034, 1], [113, 159, 3], [172, 172, 6], [255, 230, 1], [405, 236, 2], [931, 931, 2], [1078, 147, 2], [1339, 163, 1], [144, 258, 2], [343, 343, 3], [427, 427, 3], [504, 167, 2], [1026, 217, 3], [1055, 148, 6], [1085, 1085, 5], [1311, 1036, 1], [145, 1066, 2], [176, 307, 3], [244, 136, 3], [249, 1056, 2], [286, 286, 2], [359, 359, 3], [1027, 299, 4], [1035, 177, 2], [150, 136, 4], [170, 1039, 1], [177, 133, 2], [219, 379, 2], [263, 235, 2], [287, 166, 2], [368, 168, 1], [1026, 1092, 5], [1026, 1125, 3], [1036, 258, 4], [1036, 1079, 3], [1061, 146, 2], [1067, 189, 1], [103, 377, 2], [117, 164, 3], [151, 148, 1], [165, 1105, 1], [185, 185, 2], [220, 254, 1], [355, 355, 3], [1036, 252, 4], [1066, 144, 4], [1168, 136, 6], [152, 1145, 1], [273, 148, 4], [1026, 1165, 1], [1036, 257, 4], [1036, 1135, 3], [1144, 1070, 4], [179, 252, 2], [228, 228, 6], [339, 247, 1], [448, 448, 3], [1083, 1083, 3], [1239, 166, 1], [1285, 150, 2], [103, 113, 2], [222, 333, 3], [259, 158, 2], [348, 348, 4], [1026, 1153, 1], [151, 150, 2], [166, 1105, 1], [232, 283, 2], [300, 300, 2], [325, 233, 2], [441, 168, 1], [496, 496, 3], [1025, 416, 2], [1036, 243, 4], [1189, 165, 5], [103, 417, 2], [149, 278, 2], [152, 1081, 1], [409, 409, 4], [1024, 144, 3], [1032, 400, 3], [1088, 145, 2], [155, 366, 2], [215, 148, 2], [231, 231, 7], [266, 266, 6], [1026, 219, 3], [1147, 1056, 4], [1152, 168, 1], [1283, 1036, 1], [1306, 168, 1], [104, 420, 1], [152, 260, 1], [351, 351, 3], [356, 356, 3], [1026, 1148, 1], [1185, 156, 5], [103, 114, 2], [103, 393, 2], [151, 1050, 2], [170, 1145, 1], [172, 378, 1], [173, 1040, 1], [215, 149, 2], [223, 257, 2], [243, 1056, 2], [302, 302, 4], [322, 156, 1], [1035, 230, 2], [1037, 1299, 5], [1045, 1076, 3], [146, 189, 1], [236, 145, 2], [812, 489, 2], [1025, 110, 2], [1045, 219, 4], [214, 264, 2], [226, 373, 2], [280, 320, 3], [1091, 219, 2], [132, 273, 2], [158, 259, 3], [234, 115, 2], [241, 150, 2], [261, 261, 5], [550, 550, 2], [1036, 236, 4], [1036, 262, 4], [154, 156, 1], [181, 242, 1], [239, 621, 2], [304, 269, 3], [309, 136, 2], [454, 454, 2], [800, 800, 2], [1042, 150, 4], [1132, 1132, 4], [103, 411, 2], [165, 1040, 1], [1058, 150, 4], [1108, 146, 6], [1150, 151, 6], [1279, 1036, 1], [133, 250, 1], [138, 264, 1], [145, 179, 2], [155, 168, 1], [163, 376, 1], [275, 275, 5], [1025, 407, 2], [1065, 136, 6], [1097, 166, 3], [132, 248, 1], [215, 217, 2], [301, 163, 1], [347, 1116, 2], [1026, 215, 1], [1032, 326, 3], [1033, 293, 1], [1037, 1288, 5], [136, 244, 3], [145, 1069, 2], [148, 177, 2], [308, 231, 4], [325, 1116, 2], [521, 531, 2], [1033, 1137, 3], [1036, 254, 4], [1041, 1111, 4], [1181, 176, 4], [147, 1060, 2], [170, 324, 4], [219, 386, 2], [241, 217, 2], [258, 148, 2], [272, 166, 2], [466, 466, 3], [377, 305, 2], [457, 156, 1], [1050, 150, 4], [1089, 241, 2], [1224, 181, 1], [138, 1057, 2], [264, 214, 2], [277, 144, 2], [382, 251, 1], [425, 425, 3], [1035, 217, 2], [1585, 113, 4], [149, 1075, 1], [152, 259, 1], [189, 149, 2], [232, 232, 4], [331, 224, 2], [431, 235, 2], [445, 305, 2], [1024, 338, 4], [1037, 1297, 5], [1121, 1239, 5], [103, 414, 2], [215, 233, 2], [217, 148, 2], [309, 133, 2], [430, 430, 3], [1058, 144, 4], [1070, 146, 2], [1151, 150, 4], [151, 147, 1], [173, 173, 4], [230, 255, 1], [241, 320, 2], [251, 382, 1], [507, 507, 1], [1316, 163, 1], [1545, 361, 4], [165, 242, 1], [170, 1104, 1], [221, 154, 3], [417, 417, 2], [1033, 298, 3], [1055, 136, 6], [133, 177, 2], [153, 168, 1], [244, 150, 2], [367, 247, 1], [1039, 1137, 6], [1050, 145, 6], [1152, 158, 1], [1164, 168, 2], [181, 1084, 1], [406, 406, 2], [410, 389, 1], [470, 470, 2], [1024, 333, 4], [133, 1063, 2], [165, 293, 1], [226, 263, 1], [245, 152, 2], [1024, 351, 4], [1035, 224, 2], [1036, 240, 4], [138, 148, 1], [146, 1057, 2], [158, 172, 1], [173, 1027, 1], [311, 179, 3], [322, 170, 1], [501, 501, 2], [1026, 228, 5], [1041, 151, 4], [1156, 156, 1], [103, 105, 2], [113, 157, 3], [147, 230, 3], [158, 292, 1], [165, 259, 2], [581, 581, 3], [1035, 235, 2], [1038, 271, 2], [1048, 176, 6], [1073, 132, 6], [1089, 146, 2], [1091, 214, 2], [165, 1113, 1], [363, 363, 4], [498, 498, 2], [1026, 1166, 3], [104, 413, 1], [149, 223, 2], [216, 491, 2], [399, 214, 2], [132, 295, 2], [148, 189, 1], [220, 132, 3], [1115, 146, 6], [103, 456, 2], [640, 640, 2], [64, 64, 2], [104, 437, 1], [158, 1106, 1], [163, 371, 1], [170, 1040, 1], [434, 179, 2], [1033, 292, 3], [1039, 242, 6], [1054, 145, 4], [1078, 146, 2], [1099, 152, 2], [1145, 1095, 4], [1224, 168, 1], [1224, 173, 1], [1296, 165, 1], [224, 138, 4], [254, 254, 5], [1033, 293, 3], [1034, 295, 2], [165, 1096, 1], [166, 272, 2], [215, 267, 2], [219, 133, 2], [257, 296, 3], [287, 181, 1], [453, 453, 2], [1038, 272, 2], [1240, 181, 1], [136, 1107, 1], [229, 229, 2], [278, 133, 2], [313, 767, 2], [1024, 359, 4], [1035, 226, 2], [115, 105, 2], [138, 1065, 2], [147, 228, 3], [151, 1049, 2], [307, 252, 3], [368, 368, 3], [1069, 132, 4], [1090, 144, 3], [166, 1095, 1], [172, 1027, 1], [249, 148, 3], [276, 276, 5], [311, 369, 2], [377, 1110, 2], [1025, 378, 2], [1026, 250, 5], [1033, 283, 3], [1115, 147, 6], [1301, 1036, 1], [104, 423, 1], [331, 331, 4], [338, 226, 2], [378, 168, 1], [477, 477, 3], [1026, 1168, 1], [1036, 1076, 3], [1044, 265, 7], [114, 157, 3], [136, 1064, 2], [146, 1124, 2], [149, 1065, 2], [214, 146, 2], [248, 240, 2], [324, 156, 1], [334, 243, 2], [403, 403, 2], [1025, 389, 2], [1074, 245, 3], [1163, 176, 4], [145, 1071, 2], [148, 1065, 2], [255, 147, 2], [1032, 407, 3], [1132, 145, 4], [1316, 181, 1], [221, 271, 3], [289, 136, 2], [418, 168, 1], [754, 472, 2], [1091, 231, 2], [82, 82, 2], [145, 177, 2], [214, 148, 2], [224, 146, 2], [297, 163, 1], [460, 168, 1], [1034, 344, 2], [1142, 172, 4], [1155, 1155, 4], [149, 1079, 1], [173, 1105, 1], [337, 337, 2], [1026, 1168, 3], [1029, 144, 3], [1056, 219, 5], [1091, 1076, 1], [156, 260, 3], [242, 153, 2], [262, 262, 5], [275, 220, 4], [303, 266, 3], [405, 233, 3], [1032, 398, 3], [1035, 223, 2], [1035, 228, 2], [1098, 146, 6], [1113, 170, 3], [138, 1107, 1], [152, 1077, 1], [280, 280, 6], [1260, 170, 1], [103, 451, 2], [247, 367, 1], [413, 180, 1], [458, 458, 3], [1026, 248, 5], [1029, 315, 6], [1049, 136, 6], [1185, 158, 5], [86, 86, 2], [241, 1070, 2], [306, 446, 4], [329, 329, 5], [535, 535, 2], [1032, 397, 3], [1033, 299, 3], [1048, 148, 6], [1062, 254, 1], [1154, 163, 4], [1222, 168, 5], [149, 214, 2], [217, 215, 2], [226, 147, 2], [268, 268, 6], [274, 274, 2], [486, 486, 3], [880, 880, 2], [1033, 1093, 3], [1036, 249, 4], [1112, 158, 2], [1198, 1056, 1], [226, 148, 2], [263, 1083, 2], [291, 291, 2], [1027, 327, 4], [1050, 151, 4], [103, 406, 2], [121, 121, 3], [147, 1107, 1], [151, 1058, 2], [221, 271, 2], [224, 432, 2], [244, 1070, 2], [254, 220, 1], [257, 223, 2], [330, 168, 1], [346, 156, 1], [560, 560, 2], [1029, 307, 6], [1036, 233, 4], [114, 164, 3], [131, 131, 3], [166, 1104, 1], [176, 296, 3], [231, 132, 2], [295, 295, 2], [298, 163, 1], [379, 219, 2], [1043, 1061, 4], [1064, 138, 6], [1108, 138, 6], [1239, 158, 1], [144, 1069, 2], [149, 215, 2], [410, 180, 1], [1032, 371, 3], [1074, 1437, 3], [1086, 1025, 2], [1112, 173, 2], [149, 1049, 2], [402, 240, 2], [526, 526, 3], [1047, 246, 1], [1055, 150, 1], [1066, 145, 4], [1067, 133, 2], [1108, 136, 6], [1109, 1048, 3], [235, 146, 4], [273, 145, 2], [277, 277, 2], [297, 170, 1], [318, 166, 1], [1062, 1042, 4], [1145, 1025, 4], [123, 123, 3], [153, 242, 2], [244, 347, 2], [250, 1046, 2], [261, 176, 2], [339, 679, 2], [600, 345, 2], [1239, 156, 1], [1420, 236, 4], [146, 1073, 2], [179, 258, 2], [226, 1070, 2], [255, 148, 2], [363, 163, 1], [1089, 148, 2], [1112, 165, 2], [1306, 158, 1], [132, 144, 1], [147, 1125, 2], [149, 278, 4], [162, 115, 3], [223, 414, 2], [228, 302, 3], [258, 150, 1], [286, 138, 2], [361, 491, 2], [420, 420, 2], [1026, 228, 3], [1088, 241, 2], [167, 158, 1], [338, 338, 4], [347, 244, 2], [930, 930, 1], [1031, 1126, 2], [1063, 151, 5], [1068, 176, 6], [1106, 170, 2], [130, 130, 1], [146, 1060, 2], [159, 159, 1], [163, 1096, 1], [205, 141, 2], [233, 325, 4], [262, 148, 2], [264, 264, 5], [272, 172, 1], [1024, 456, 4], [240, 144, 2], [326, 326, 5], [408, 408, 3], [1067, 189, 5], [1072, 156, 5], [1088, 133, 2], [154, 245, 2], [177, 254, 2], [236, 236, 6], [255, 144, 2], [285, 285, 5], [322, 166, 2], [484, 500, 2], [1035, 226, 4], [147, 151, 1], [252, 252, 5], [282, 103, 2], [319, 165, 2], [1024, 379, 4], [1026, 1031, 3], [1083, 217, 4], [215, 375, 2], [219, 249, 2], [220, 1042, 2], [333, 250, 2], [788, 788, 2], [1026, 224, 3], [1043, 133, 1], [1094, 273, 2], [1186, 181, 1], [1339, 166, 1], [167, 156, 1], [195, 195, 2], [224, 148, 2], [262, 1085, 2], [435, 259, 2], [447, 561, 2], [605, 605, 1], [166, 1040, 1], [170, 1084, 1], [231, 219, 2], [262, 144, 2], [311, 136, 2], [324, 324, 4], [346, 180, 1], [1056, 284, 2], [1097, 170, 2], [1260, 166, 1], [145, 144, 2], [250, 147, 2], [255, 177, 2], [274, 144, 2], [1026, 226, 3], [1031, 1026, 1], [1035, 224, 4], [1069, 133, 4], [146, 243, 3], [151, 1051, 2], [163, 1040, 1], [269, 138, 1], [894, 894, 2], [1024, 411, 4], [1050, 248, 4], [1090, 1057, 1], [1108, 149, 6], [154, 158, 1], [214, 249, 2], [217, 233, 2], [330, 330, 5], [545, 545, 2], [706, 459, 2], [1024, 451, 4], [1074, 1272, 3], [1105, 156, 2], [1110, 308, 4], [147, 145, 1], [176, 273, 2], [181, 1106, 1], [245, 1077, 1], [281, 281, 5], [348, 240, 3], [419, 419, 3], [438, 438, 3], [1024, 369, 4], [1033, 301, 3], [1062, 214, 4], [1192, 1077, 5], [1210, 180, 5], [103, 358, 2], [165, 1037, 1], [173, 1096, 1], [217, 226, 2], [262, 230, 2], [1033, 283, 1], [1094, 233, 2], [1260, 156, 1], [148, 226, 2], [150, 1052, 2], [170, 270, 1], [231, 402, 2], [260, 260, 7], [1083, 1158, 4], [1089, 215, 2], [1147, 177, 4], [148, 1064, 2], [152, 1084, 1], [242, 1081, 1], [246, 246, 1], [284, 138, 1], [294, 294, 1], [404, 404, 3], [779, 779, 2], [1035, 223, 4], [158, 259, 2], [242, 1093, 3], [565, 565, 2], [571, 571, 3], [1038, 268, 2], [1060, 132, 3], [1120, 1128, 4], [152, 268, 2], [235, 431, 2], [293, 293, 5], [299, 299, 6], [303, 179, 3], [1039, 1277, 6], [1085, 1160, 4], [1092, 103, 4], [117, 162, 3], [168, 397, 1], [220, 1075, 1], [318, 318, 4], [936, 936, 2], [1036, 1078, 4], [1039, 246, 6], [1055, 147, 6], [157, 157, 5], [166, 1037, 1], [223, 132, 3], [295, 138, 2], [297, 165, 2], [396, 220, 3], [424, 244, 2], [1041, 145, 4], [1057, 1049, 1], [1116, 1116, 5], [1206, 181, 1], [1292, 1036, 1], [119, 119, 4], [148, 1050, 2], [165, 1095, 1], [215, 241, 2], [228, 147, 4], [305, 214, 3], [1115, 136, 6], [1306, 163, 1], [149, 1064, 2], [234, 448, 2], [255, 189, 2], [728, 388, 2], [1027, 322, 4], [1032, 372, 3], [1032, 408, 3], [1036, 261, 4], [1048, 136, 6], [146, 235, 3], [152, 1097, 1], [282, 282, 5], [303, 303, 5], [331, 406, 2], [1072, 166, 5], [1096, 165, 3], [1306, 156, 1], [141, 199, 3], [213, 213, 3], [219, 1076, 1], [230, 136, 2], [248, 275, 2], [307, 252, 2], [327, 327, 5], [1024, 375, 4], [1033, 292, 1], [1042, 146, 1], [1091, 147, 2], [334, 177, 3], [1036, 255, 4], [1039, 1093, 6], [1048, 138, 6], [103, 115, 2], [132, 1073, 2], [261, 1085, 2], [1025, 425, 2], [1039, 1086, 6], [1044, 245, 7], [1105, 172, 2], [103, 405, 2], [124, 124, 2], [133, 230, 3], [147, 224, 2], [149, 224, 2], [173, 1077, 1], [258, 258, 5], [411, 411, 2], [423, 168, 1], [663, 712, 2], [1038, 259, 2], [1136, 1094, 3], [145, 146, 1], [151, 176, 2], [151, 1064, 2], [152, 1037, 1], [191, 191, 3], [193, 193, 3], [263, 144, 2], [274, 136, 1], [701, 701, 2], [146, 1071, 2], [163, 1081, 1], [217, 133, 2], [219, 224, 2], [220, 147, 2], [269, 269, 7], [504, 504, 3], [585, 585, 2], [617, 617, 3], [1026, 1187, 1], [1036, 263, 4], [1094, 133, 2], [1224, 172, 1], [138, 214, 4], [151, 279, 2], [158, 246, 1], [181, 283, 1], [203, 203, 2], [228, 1075, 1], [480, 480, 3], [763, 366, 2], [1033, 1146, 1], [1042, 223, 4], [1185, 165, 5], [1230, 156, 5], [1302, 176, 2], [138, 1073, 2], [149, 1057, 2], [177, 1066, 2], [217, 393, 2], [222, 1305, 3], [235, 136, 2], [1039, 1196, 6], [105, 115, 2], [110, 110, 5], [158, 1096, 1], [170, 1095, 1], [248, 1058, 2], [287, 172, 1], [1162, 163, 2], [103, 162, 2], [173, 1112, 1], [215, 223, 2], [217, 266, 2], [236, 176, 2], [261, 302, 3], [263, 148, 2], [1052, 133, 1], [1061, 1043, 2], [1070, 1069, 2], [1307, 189, 5], [239, 362, 1], [247, 339, 1], [267, 267, 2], [333, 250, 3], [353, 353, 5], [733, 459, 2], [1065, 132, 6], [1161, 151, 4], [1306, 172, 1], [132, 1057, 2], [154, 245, 3], [170, 1106, 1], [220, 214, 2], [220, 1122, 2], [279, 151, 2], [391, 543, 2], [1032, 389, 3], [1089, 233, 2], [1189, 152, 5], [1260, 1047, 1], [277, 138, 1], [278, 133, 1], [329, 165, 1], [363, 158, 1], [1044, 242, 7], [173, 392, 1], [219, 231, 2], [445, 377, 2], [449, 190, 2], [1215, 180, 1], [1334, 1036, 1], [1422, 180, 4], [138, 277, 2], [148, 1048, 2], [156, 287, 1], [170, 246, 1], [219, 149, 2], [241, 149, 3], [260, 181, 1], [265, 265, 5], [276, 103, 2], [386, 230, 2], [397, 397, 2], [1026, 1166, 1], [1027, 321, 4], [1036, 241, 4], [1055, 132, 6], [1091, 224, 2], [3359, 58, 2], [113, 113, 1], [122, 122, 3], [218, 218, 3], [223, 296, 3], [352, 352, 2], [361, 575, 2], [362, 239, 1], [384, 384, 2], [463, 236, 2], [508, 176, 2], [1026, 248, 3], [103, 462, 2], [150, 176, 2], [278, 278, 6], [520, 520, 2], [1025, 392, 2], [1027, 433, 4], [1029, 275, 6], [1136, 1031, 3], [1157, 166, 2], [117, 251, 1], [164, 164, 5], [177, 1147, 2], [301, 301, 6], [324, 172, 1], [326, 168, 1], [422, 422, 4], [1240, 158, 1], [133, 1115, 2], [135, 202, 2], [152, 1040, 1], [163, 1044, 1], [163, 1169, 1], [177, 144, 2], [214, 149, 2], [228, 379, 2], [235, 359, 2], [262, 355, 2], [347, 179, 3], [368, 158, 1], [418, 418, 4], [430, 249, 2], [1035, 1147, 2], [1094, 136, 2], [1162, 165, 2], [133, 1073, 2], [284, 284, 6], [344, 344, 2], [381, 381, 2], [457, 293, 1], [460, 158, 1], [769, 769, 2], [1024, 335, 4], [1052, 150, 4], [1060, 147, 6], [1079, 1050, 2], [1091, 249, 2], [1149, 150, 6], [1219, 180, 1], [1337, 1036, 1], [145, 1130, 2], [230, 1078, 1], [250, 250, 6], [273, 132, 2], [276, 148, 2], [539, 189, 2], [1025, 441, 2], [1035, 228, 4], [1049, 138, 6], [1063, 138, 6], [1072, 165, 5], [1222, 158, 5], [103, 452, 2], [104, 425, 1], [155, 259, 2], [157, 114, 3], [228, 136, 2], [417, 315, 2], [1024, 386, 4], [1024, 1220, 4], [1089, 132, 2], [1173, 189, 4], [1259, 180, 1], [1561, 314, 4], [156, 1037, 1], [163, 1154, 1], [214, 379, 2], [215, 1061, 1], [244, 1061, 1], [259, 155, 2], [371, 165, 1], [373, 226, 2], [1239, 170, 1], [145, 1055, 2], [150, 1065, 2], [156, 1106, 1], [163, 1084, 1], [168, 1184, 1], [228, 148, 2], [269, 1085, 2], [274, 103, 2], [320, 280, 3], [369, 369, 3], [402, 231, 3], [1033, 1142, 1], [1050, 1042, 1], [1415, 242, 4], [179, 1144, 2], [240, 454, 2], [243, 132, 2], [328, 162, 1], [1032, 413, 3], [1043, 217, 4], [1060, 136, 6], [1081, 181, 2], [1257, 180, 1], [104, 435, 1], [146, 226, 2], [151, 1048, 2], [223, 148, 2], [232, 232, 1], [233, 1070, 2], [309, 309, 3], [313, 234, 1], [317, 317, 2], [1150, 147, 6], [1185, 166, 5], [1206, 180, 1], [151, 189, 2], [157, 113, 3], [166, 322, 2], [221, 154, 1], [233, 405, 2], [235, 258, 1], [1035, 230, 4], [1036, 231, 4], [230, 138, 2], [262, 224, 1], [1128, 165, 3], [104, 436, 1], [132, 307, 2], [222, 148, 3], [289, 289, 5], [304, 269, 2], [308, 308, 5], [1038, 292, 2], [1073, 136, 6], [1074, 1413, 3], [1093, 172, 2], [1105, 158, 2], [1124, 136, 6], [1152, 163, 1], [1164, 180, 2], [164, 117, 3], [214, 219, 2], [283, 170, 1], [346, 158, 1], [1033, 287, 1], [1042, 1117, 4], [1152, 172, 1], [103, 409, 2], [176, 150, 2], [237, 153, 3], [288, 136, 2], [410, 166, 1], [1038, 297, 2], [1130, 149, 6], [1155, 273, 4], [1451, 247, 4], [103, 399, 2], [147, 215, 2], [215, 257, 1], [332, 332, 2], [416, 416, 3], [429, 230, 2], [1024, 320, 4], [1026, 215, 3], [1048, 1050, 1], [1070, 266, 1], [156, 1142, 2], [177, 305, 3], [258, 146, 2], [264, 219, 1], [1035, 243, 2], [1043, 233, 4], [1098, 138, 6], [16, 526, 2], [147, 1057, 2], [168, 408, 1], [306, 1067, 2], [386, 219, 2], [505, 505, 2], [1051, 151, 4], [1062, 1075, 3], [1069, 144, 4], [1094, 1136, 2], [103, 164, 2], [103, 432, 2], [104, 444, 1], [152, 1096, 1], [165, 1119, 1], [228, 149, 2], [263, 359, 2], [1026, 1187, 3], [1056, 1076, 4], [1072, 158, 5], [1083, 1083, 5], [1089, 226, 2], [1232, 168, 1], [170, 1113, 1], [268, 173, 1], [315, 132, 2], [1137, 1077, 2], [1156, 173, 1], [168, 389, 1], [240, 240, 6], [249, 1076, 1], [318, 181, 1], [353, 158, 1], [1024, 377, 4], [1031, 306, 2], [1031, 1118, 2], [1033, 297, 3], [1042, 144, 4], [1042, 1075, 4], [1074, 156, 5], [1153, 144, 6], [1164, 158, 2], [220, 138, 2], [271, 319, 1], [290, 290, 1], [358, 273, 2], [369, 179, 3], [1025, 413, 2], [1038, 283, 2], [1056, 1034, 1], [1056, 1045, 5], [115, 159, 3], [133, 300, 2], [150, 1234, 2], [162, 328, 1], [230, 262, 2], [1032, 392, 3], [146, 233, 2], [150, 133, 1], [156, 1095, 1], [172, 389, 1], [181, 1081, 1], [217, 241, 2], [223, 138, 2], [235, 148, 2], [258, 179, 2], [287, 168, 2], [292, 167, 2], [305, 377, 2], [316, 316, 3], [327, 166, 1], [335, 249, 2], [363, 363, 3], [759, 759, 2], [1036, 1446, 1], [1037, 1309, 5], [1041, 147, 1], [1088, 280, 2], [149, 285, 2], [189, 1029, 2], [267, 215, 2], [286, 286, 6], [342, 342, 3], [592, 592, 2], [1026, 1140, 5], [1043, 146, 1], [1085, 219, 4], [1093, 170, 2], [103, 1294, 2], [114, 114, 1], [146, 1107, 1], [264, 231, 1], [293, 181, 1], [323, 323, 3], [375, 223, 2], [378, 378, 2], [414, 243, 2], [881, 881, 1], [1025, 422, 2], [1031, 1136, 2], [1036, 1421, 1], [1088, 284, 2], [1091, 132, 2], [1259, 173, 1], [136, 266, 1], [144, 277, 1], [304, 138, 2], [437, 260, 3], [590, 590, 1], [1026, 1193, 1], [1042, 1075, 3], [147, 1073, 2], [249, 219, 2], [259, 181, 1], [319, 170, 1], [1037, 1310, 5], [1038, 324, 2], [1039, 1221, 6], [1108, 148, 6], [1295, 168, 6], [110, 153, 3], [118, 118, 4], [147, 1079, 1], [163, 1047, 1], [177, 331, 3], [234, 313, 1], [241, 421, 2], [270, 270, 6], [311, 1116, 2], [496, 496, 1], [1025, 410, 2], [1035, 1056, 1], [1062, 215, 4], [1260, 158, 1], [1392, 240, 4], [103, 402, 2], [103, 424, 2], [132, 1107, 1], [144, 1041, 1], [159, 113, 3], [235, 393, 2], [368, 163, 1], [431, 243, 2], [1042, 248, 4], [1070, 1061, 4], [107, 107, 1], [136, 1057, 2], [137, 137, 3], [149, 217, 2], [152, 1047, 1], [224, 162, 2], [301, 165, 1], [307, 442, 3], [460, 283, 1], [1075, 146, 2], [1133, 158, 3], [1185, 1105, 5], [103, 348, 2], [103, 429, 2], [133, 1071, 2], [145, 145, 7], [180, 1027, 1], [220, 1058, 2], [224, 219, 2], [224, 1067, 2], [298, 170, 1], [318, 170, 1], [318, 268, 1], [321, 272, 1], [376, 158, 1], [383, 383, 3], [836, 518, 2], [1026, 217, 5], [1035, 233, 4], [1035, 235, 4], [1088, 138, 2], [1129, 170, 4], [132, 296, 2], [147, 149, 1], [156, 1097, 1], [211, 211, 3], [267, 176, 2], [553, 553, 2], [1024, 308, 4], [1046, 132, 4], [1060, 138, 6], [1070, 179, 2], [1110, 1110, 5], [163, 1218, 1], [241, 320, 3], [279, 334, 3], [288, 288, 6], [326, 166, 2], [367, 703, 2], [1039, 1099, 6], [1039, 1262, 6], [1044, 246, 7], [1115, 138, 6], [1162, 170, 2], [1246, 1078, 6], [152, 1112, 1], [222, 148, 5], [314, 835, 2], [1038, 299, 2], [1090, 144, 1], [1416, 251, 4], [132, 302, 2], [136, 266, 2], [149, 219, 2], [168, 259, 1], [189, 151, 2], [233, 274, 1], [351, 133, 2], [1039, 1282, 6], [1054, 144, 1], [1067, 1046, 2], [1142, 156, 1], [1209, 181, 3], [166, 1047, 1], [176, 254, 2], [176, 264, 2], [306, 145, 2], [348, 278, 2], [399, 220, 2], [1032, 441, 3], [1033, 287, 3], [1035, 1144, 2], [1046, 1041, 1], [1210, 165, 5], [1625, 366, 4], [136, 291, 2], [145, 1108, 2], [151, 1043, 2], [172, 1077, 1], [222, 258, 1], [252, 266, 1], [261, 214, 1], [613, 427, 2], [725, 725, 2], [1026, 215, 5], [1034, 1136, 2], [1039, 1330, 6], [1066, 138, 1], [1113, 181, 3], [1157, 170, 2], [104, 443, 1], [305, 177, 3], [329, 152, 1], [396, 220, 2], [622, 622, 2], [1039, 1299, 6], [1042, 236, 4], [1070, 291, 2], [1106, 181, 2], [117, 164, 1], [132, 315, 2], [163, 1097, 1], [166, 1112, 1], [194, 135, 2], [226, 217, 2], [283, 232, 3], [1184, 181, 2], [136, 289, 2], [226, 409, 2], [242, 104, 1], [243, 146, 3], [388, 518, 2], [484, 484, 3], [1026, 1193, 3], [1038, 260, 2], [1040, 1196, 1], [1040, 1215, 1], [1046, 1213, 1], [1050, 1122, 1], [1074, 170, 5], [1118, 1031, 3], [1306, 173, 1], [1630, 382, 4], [215, 424, 2], [226, 393, 2], [262, 189, 2], [274, 274, 5], [286, 286, 7], [1036, 1428, 1], [1036, 1448, 1], [1045, 133, 1], [1052, 219, 4], [1138, 163, 3], [1154, 168, 4], [1202, 220, 2], [144, 1107, 1], [145, 296, 2], [150, 1048, 2], [152, 297, 1], [156, 268, 1], [172, 1105, 1], [214, 261, 1], [271, 271, 6], [281, 149, 2], [1050, 1148, 4], [1056, 147, 1], [103, 434, 2], [164, 117, 1], [223, 236, 2], [245, 245, 6], [255, 255, 5], [1035, 244, 4], [1036, 1126, 3], [1060, 1042, 1], [1072, 172, 5], [224, 1024, 2], [230, 386, 2], [235, 217, 2], [244, 429, 2], [265, 167, 2], [287, 167, 2], [475, 240, 2], [651, 651, 2], [693, 693, 2], [1026, 230, 5], [1056, 132, 1], [1057, 138, 6], [1062, 236, 4], [1144, 179, 4], [154, 216, 1], [230, 1067, 2], [1032, 422, 3], [1036, 1127, 3], [1058, 149, 4], [1079, 149, 2], [1124, 132, 6], [1149, 146, 6], [103, 450, 2], [103, 1220, 2], [177, 1024, 2], [180, 1143, 1], [231, 147, 2], [235, 263, 2], [249, 147, 2], [295, 295, 5], [298, 166, 2], [300, 300, 4], [303, 266, 2], [414, 223, 2], [623, 623, 2], [1026, 219, 5], [1038, 293, 2], [1058, 151, 4], [1063, 132, 6], [1077, 172, 2], [1088, 281, 2], [1094, 145, 2], [133, 179, 2], [136, 1073, 2], [145, 289, 2], [165, 297, 2], [168, 260, 1], [226, 1067, 2], [235, 222, 2], [260, 180, 1], [292, 173, 1], [1105, 173, 2], [140, 345, 2], [147, 1078, 1], [330, 330, 6], [1032, 410, 3], [1033, 1196, 3], [1036, 1135, 4], [1111, 189, 4], [1125, 138, 6], [144, 233, 2], [155, 155, 1], [226, 222, 2], [272, 321, 1], [292, 170, 1], [327, 327, 2], [379, 228, 2], [401, 401, 2], [589, 110, 2], [1049, 149, 6], [1055, 133, 6], [1063, 149, 6], [1121, 1319, 5], [132, 358, 2], [133, 219, 2], [148, 176, 2], [333, 333, 4], [398, 170, 1], [594, 594, 2], [1024, 347, 4], [1033, 321, 3], [1035, 243, 4], [1045, 1076, 4], [1074, 163, 5], [1139, 265, 4], [1179, 165, 5], [36, 36, 1], [146, 148, 1], [241, 215, 2], [248, 248, 7], [254, 254, 6], [264, 176, 2], [304, 177, 3], [507, 366, 2], [857, 857, 2], [1025, 436, 2], [1043, 215, 4], [1045, 214, 4], [1074, 172, 5], [1087, 145, 3], [1272, 166, 1], [103, 469, 2], [156, 1205, 1], [270, 181, 1], [270, 322, 1], [353, 165, 1], [368, 368, 4], [375, 375, 4], [1036, 289, 4], [1045, 1147, 4], [1210, 158, 5], [144, 149, 1], [277, 277, 5], [679, 314, 2], [1026, 214, 1], [1036, 264, 4], [1115, 132, 6], [1433, 176, 2], [132, 275, 2], [148, 1054, 4], [159, 115, 3], [226, 274, 2], [250, 250, 7], [373, 133, 2], [393, 217, 2], [489, 489, 3], [1036, 274, 4], [1062, 252, 1], [1133, 173, 3], [1272, 152, 1], [1305, 1305, 4], [104, 441, 1], [151, 1057, 2], [166, 301, 1], [179, 458, 2], [189, 263, 2], [206, 356, 2], [230, 148, 2], [236, 146, 2], [241, 146, 2], [309, 146, 2], [311, 311, 4], [1039, 1288, 6], [1080, 1070, 3], [1164, 152, 2], [176, 267, 2], [228, 424, 2], [242, 180, 1], [244, 132, 2], [1027, 397, 4], [1034, 1160, 2], [1085, 103, 4], [1171, 1024, 1], [151, 138, 4], [163, 246, 1], [165, 1104, 1], [177, 145, 2], [369, 1116, 2], [435, 435, 4], [440, 440, 2], [1033, 298, 1], [1034, 1118, 2], [1035, 1067, 2], [1074, 173, 5], [1075, 147, 2], [1110, 1199, 4], [1257, 172, 1], [105, 113, 3], [136, 1065, 2], [212, 212, 3], [219, 144, 2], [236, 273, 2], [292, 181, 1], [326, 152, 1], [1024, 358, 4], [1063, 146, 6], [136, 1127, 2], [142, 198, 2], [189, 262, 2], [244, 347, 3], [249, 430, 3], [258, 222, 1], [1038, 298, 2], [1051, 217, 4], [1064, 132, 6], [1082, 147, 6], [1230, 168, 5], [114, 179, 2], [170, 324, 5], [216, 270, 2], [221, 155, 3], [235, 1111, 2], [411, 307, 2], [1027, 378, 4], [1055, 149, 6], [1071, 145, 6], [1133, 172, 3], [1150, 132, 6], [1239, 1033, 1], [103, 421, 2], [144, 250, 3], [214, 243, 2], [220, 228, 2], [439, 874, 2], [1025, 443, 2], [1034, 1158, 2], [1035, 1070, 1], [1037, 1326, 5], [1139, 265, 3], [138, 1126, 2], [147, 226, 2], [219, 148, 2], [268, 318, 1], [271, 181, 1], [684, 684, 3], [1026, 224, 5], [1035, 231, 4], [1036, 286, 4], [1036, 1061, 4], [1045, 147, 1], [1075, 248, 2], [1080, 136, 3], [1121, 1437, 5], [1137, 104, 2], [1210, 156, 5], [1224, 163, 1], [103, 157, 2], [263, 263, 5], [267, 241, 1], [284, 214, 1], [346, 166, 1], [348, 278, 3], [372, 166, 1], [575, 237, 2], [1042, 228, 4], [1074, 166, 5], [1099, 173, 2], [1112, 166, 2], [1157, 163, 2], [1222, 152, 5], [1239, 1047, 1], [1252, 1026, 1], [138, 269, 2], [149, 228, 2], [154, 152, 1], [224, 231, 2], [235, 1067, 2], [236, 145, 1], [254, 1056, 2], [279, 151, 4], [279, 177, 2], [353, 166, 1], [432, 432, 4], [621, 621, 1], [1035, 220, 4], [1072, 444, 2], [1080, 1055, 1], [1146, 173, 4], [1225, 222, 2], [1247, 1026, 1], [138, 1060, 2], [170, 1096, 1], [170, 1097, 1], [172, 1097, 1], [246, 1084, 1], [260, 1093, 1], [400, 400, 4], [445, 445, 3], [531, 531, 3], [964, 964, 2], [1232, 181, 1], [1254, 1026, 1], [150, 1057, 2], [155, 221, 1], [172, 1040, 1], [189, 1049, 2], [233, 217, 2], [277, 243, 1], [291, 291, 6], [1026, 243, 1], [1036, 269, 4], [1118, 240, 3], [1201, 152, 1], [165, 319, 2], [216, 561, 2], [219, 255, 2], [260, 437, 2], [264, 243, 1], [300, 300, 5], [461, 461, 3], [1024, 393, 4], [1042, 147, 1], [1094, 222, 2], [1156, 163, 1], [1316, 166, 1], [132, 217, 2], [150, 148, 1], [165, 1128, 1], [249, 286, 2], [458, 239, 2], [1026, 1148, 5], [1035, 244, 2], [1046, 148, 1], [1090, 1114, 1], [110, 154, 3], [136, 241, 3], [145, 150, 1], [159, 159, 5], [164, 114, 3], [230, 429, 2], [252, 146, 2], [409, 222, 2], [1025, 420, 2], [1033, 297, 1], [1091, 149, 2], [141, 141, 1], [162, 224, 2], [220, 146, 2], [267, 257, 1], [275, 132, 2], [306, 1111, 2], [783, 783, 2], [1073, 146, 6], [1239, 1186, 1], [231, 255, 2], [261, 228, 2], [326, 163, 1], [649, 649, 1], [1033, 324, 1], [1036, 277, 4], [1041, 146, 1], [176, 1024, 2], [181, 1077, 1], [197, 197, 3], [209, 209, 3], [214, 399, 2], [293, 237, 2], [324, 1025, 1], [504, 504, 1], [1316, 156, 1], [147, 249, 2], [179, 320, 3], [189, 1057, 2], [200, 140, 2], [215, 157, 2], [222, 1078, 1], [240, 475, 2], [244, 133, 2], [266, 103, 2], [279, 138, 2], [282, 148, 2], [380, 380, 3], [406, 331, 2], [706, 438, 2], [754, 472, 3], [1032, 436, 3], [1033, 299, 1], [1041, 250, 1], [176, 1122, 2], [192, 192, 3], [231, 146, 2], [233, 146, 2], [244, 274, 1], [244, 424, 2], [253, 253, 1], [304, 1110, 2], [338, 1116, 2], [365, 365, 3], [418, 418, 3], [421, 241, 2], [786, 35, 2], [985, 985, 2], [1026, 214, 3], [1035, 220, 2], [1089, 133, 2], [1094, 249, 2], [1113, 163, 3], [1404, 1038, 1], [1440, 246, 4], [113, 113, 5], [149, 278, 5], [158, 1095, 1], [176, 289, 2], [189, 150, 2], [215, 236, 2], [219, 1024, 2], [330, 163, 1], [376, 156, 1], [812, 812, 2], [1036, 276, 4], [1036, 282, 4], [1036, 1056, 4], [1036, 1453, 1], [1036, 1488, 1], [1043, 1144, 4], [1067, 262, 1], [1085, 228, 4], [1125, 132, 6], [103, 431, 2], [147, 1135, 1], [148, 217, 2], [245, 1032, 1], [252, 1070, 2], [272, 272, 6], [296, 132, 2], [318, 318, 3], [557, 557, 2], [600, 600, 3], [1036, 278, 4], [1071, 132, 6], [1071, 138, 6], [1083, 223, 4], [1104, 163, 3], [1210, 166, 5], [97, 97, 1], [145, 302, 2], [147, 150, 1], [172, 1112, 1], [224, 149, 2], [224, 277, 2], [230, 1111, 2], [296, 498, 2], [319, 173, 1], [324, 158, 1], [334, 279, 3], [408, 408, 2], [481, 481, 3], [545, 396, 2], [1036, 267, 4], [1155, 306, 4], [1306, 166, 1], [156, 1096, 1], [168, 1084, 1], [179, 145, 2], [219, 214, 2], [231, 224, 2], [235, 1024, 2], [266, 303, 3], [311, 442, 2], [360, 360, 3], [373, 373, 3], [379, 379, 4], [479, 479, 2], [1057, 136, 6], [1061, 133, 2], [1069, 145, 4], [1074, 158, 5], [1074, 165, 5], [1268, 177, 2], [138, 284, 2], [144, 240, 1], [176, 151, 2], [219, 269, 2], [230, 1024, 2], [271, 221, 2], [315, 315, 4], [397, 397, 3], [508, 247, 2], [786, 361, 2], [1192, 104, 5], [1235, 1046, 1], [1380, 170, 4], [103, 396, 2], [150, 1045, 2], [172, 1047, 1], [177, 269, 2], [248, 149, 3], [249, 132, 2], [280, 241, 3], [465, 217, 2], [1027, 329, 4], [1032, 420, 3], [1042, 1233, 1], [1125, 136, 6], [105, 114, 3], [147, 254, 2], [168, 110, 1], [235, 226, 2], [273, 236, 2], [355, 262, 2], [435, 259, 3], [502, 246, 3], [574, 574, 2], [703, 313, 2], [1026, 214, 5], [1073, 138, 6], [1073, 144, 6], [1088, 136, 2], [1153, 133, 6], [1183, 148, 1], [1524, 164, 4], [7, 388, 2], [215, 146, 1], [350, 350, 3], [437, 242, 3], [449, 449, 3], [1032, 425, 3], [1034, 1197, 2], [1037, 268, 5], [1108, 133, 6], [1240, 180, 1], [1296, 181, 1], [1404, 1072, 1], [104, 488, 1], [152, 245, 1], [513, 513, 4], [779, 662, 2], [1032, 418, 3], [1032, 443, 3], [1039, 1297, 6], [1056, 269, 2], [1063, 133, 6], [1094, 276, 2], [1296, 168, 1], [1316, 170, 1], [148, 258, 2], [150, 145, 1], [166, 260, 2], [179, 1024, 2], [224, 1111, 2], [267, 252, 2], [296, 257, 3], [308, 1110, 2], [330, 152, 1], [374, 374, 2], [491, 491, 1], [541, 1083, 2], [1026, 235, 5], [1027, 318, 4], [1027, 400, 4], [1036, 280, 4], [1146, 158, 6], [130, 200, 2], [166, 1119, 1], [224, 249, 2], [226, 1061, 1], [233, 405, 3], [235, 138, 2], [243, 148, 2], [340, 340, 3], [463, 463, 2], [1024, 417, 4], [1027, 353, 4], [1037, 292, 5], [1037, 297, 5], [1125, 146, 6], [1164, 163, 2], [136, 1080, 2], [145, 295, 2], [151, 264, 4], [156, 1119, 1], [254, 147, 2], [320, 241, 4], [339, 157, 1], [474, 474, 2], [488, 172, 1], [1051, 146, 6], [1117, 1026, 1], [1147, 269, 1], [1149, 147, 6], [1153, 147, 6], [1171, 250, 4], [1555, 162, 4], [110, 155, 3], [117, 349, 1], [133, 1050, 2], [156, 265, 1], [219, 462, 2], [246, 180, 1], [335, 286, 3], [573, 573, 2], [1036, 285, 4], [1037, 1325, 5], [1062, 273, 1], [1071, 146, 6], [1250, 1026, 1], [1339, 165, 1], [148, 1098, 2], [214, 159, 2], [231, 240, 2], [243, 138, 3], [261, 220, 1], [423, 423, 3], [452, 452, 2], [1027, 416, 4], [1035, 1067, 1], [1045, 249, 4], [1139, 166, 2], [117, 105, 3], [136, 223, 2], [145, 280, 2], [156, 420, 1], [165, 1112, 1], [181, 1040, 1], [217, 450, 2], [250, 1054, 2], [267, 244, 1], [285, 1083, 2], [357, 357, 3], [376, 376, 4], [561, 447, 2], [1035, 255, 4], [1036, 266, 4], [1038, 287, 2], [1097, 180, 2], [1097, 1152, 2], [1105, 181, 2], [1142, 1040, 1], [1182, 250, 4], [1244, 189, 2], [136, 325, 2], [148, 224, 2], [149, 280, 2], [214, 228, 2], [220, 399, 2], [471, 189, 2], [1026, 244, 3], [1157, 152, 2], [1230, 158, 5], [1623, 367, 4], [103, 430, 2], [123, 206, 2], [145, 1073, 2], [170, 1162, 1], [220, 223, 2], [321, 321, 3], [349, 117, 1], [372, 170, 1], [1032, 457, 3], [1037, 259, 5], [1037, 272, 5], [1038, 301, 2], [1049, 1046, 1], [1067, 1041, 5], [1165, 132, 6], [1196, 1081, 2], [1580, 163, 4], [96, 96, 1], [217, 144, 2], [222, 409, 2], [224, 222, 2], [264, 254, 2], [283, 283, 5], [296, 1132, 2], [302, 132, 2], [320, 1116, 2], [355, 133, 2], [576, 576, 3], [587, 221, 2], [1026, 243, 3], [1036, 1076, 4], [1181, 248, 4], [1600, 328, 4], [103, 455, 2], [145, 1064, 2], [145, 1065, 2], [214, 236, 2], [241, 132, 2], [267, 146, 2], [435, 246, 3], [1035, 1341, 2], [1051, 136, 1], [1056, 284, 1], [1070, 1031, 1], [1072, 181, 5], [1125, 133, 6], [1728, 237, 4], [103, 1329, 2], [133, 278, 2], [152, 298, 1], [252, 1061, 1], [289, 289, 2], [428, 428, 3], [433, 433, 3], [1052, 132, 1], [1078, 144, 3], [1082, 1063, 1], [1141, 172, 3], [1157, 168, 2], [1264, 1076, 5], [142, 202, 2], [173, 1047, 1], [226, 146, 1], [377, 177, 3], [472, 728, 2], [486, 237, 2], [1024, 334, 4], [1025, 418, 2], [1025, 423, 2], [1033, 301, 1], [1035, 249, 4], [1035, 1349, 2], [1045, 132, 1], [1045, 243, 4], [1077, 173, 2], [1166, 147, 6], [165, 292, 2], [181, 1184, 1], [190, 139, 2], [259, 104, 1], [273, 446, 3], [276, 1083, 2], [287, 170, 1], [309, 103, 2], [322, 172, 1], [464, 221, 2], [937, 937, 2], [1091, 243, 2], [1094, 146, 2], [1199, 177, 6], [1242, 176, 7], [114, 157, 1], [144, 1053, 1], [168, 1081, 1], [228, 248, 1], [266, 217, 2], [320, 136, 2], [329, 163, 1], [366, 528, 2], [441, 441, 3], [1035, 241, 4], [1036, 1122, 4], [1045, 1198, 1], [1071, 147, 6], [145, 275, 2], [179, 311, 3], [226, 164, 2], [230, 1041, 2], [250, 1024, 2], [258, 144, 2], [270, 216, 2], [274, 189, 2], [281, 281, 6], [400, 163, 1], [404, 139, 2], [477, 234, 2], [951, 951, 2], [1038, 1152, 2], [1050, 223, 4], [1094, 282, 2], [1154, 156, 4], [1200, 173, 1], [1316, 172, 1], [1319, 152, 1], [1339, 181, 1], [132, 1080, 2], [133, 150, 1], [152, 242, 1], [166, 298, 2], [243, 431, 2], [288, 347, 3], [324, 173, 1], [335, 286, 4], [371, 170, 1], [375, 215, 2], [763, 763, 2], [1056, 269, 1], [1073, 147, 6], [1089, 149, 2], [1089, 258, 2], [1094, 147, 2], [1121, 1413, 5], [1125, 148, 6], [1164, 172, 2], [1168, 150, 6], [1195, 158, 3], [1289, 334, 2], [147, 1075, 1], [179, 1069, 2], [222, 1041, 2], [224, 386, 2], [260, 153, 2], [270, 104, 1], [274, 146, 2], [327, 163, 1], [1026, 244, 5], [1032, 110, 3], [1035, 233, 2], [1079, 220, 2], [1118, 1118, 2], [1138, 173, 3], [149, 151, 1], [158, 272, 1], [168, 298, 1], [230, 219, 2], [236, 405, 2], [260, 104, 1], [268, 172, 1], [300, 147, 2], [445, 315, 2], [1036, 273, 4], [1042, 248, 1], [1091, 133, 2], [1153, 136, 6], [1205, 1104, 4], [1287, 156, 6], [138, 255, 3], [219, 230, 2], [236, 430, 2], [252, 267, 2], [259, 180, 1], [279, 151, 3], [284, 308, 3], [307, 307, 4], [333, 222, 2], [406, 406, 3], [424, 228, 2], [914, 914, 2], [1168, 146, 6], [145, 1049, 2], [170, 1047, 1], [260, 156, 2], [285, 103, 2], [305, 305, 5], [325, 233, 3], [808, 361, 2], [1031, 275, 2], [1038, 321, 2], [1057, 1235, 1], [1065, 138, 6], [1069, 136, 1], [1145, 1120, 4], [1182, 222, 4], [1306, 165, 1], [168, 265, 3], [201, 201, 3], [214, 231, 2], [235, 133, 3], [299, 173, 1], [442, 442, 3], [539, 251, 2], [1026, 244, 1], [1033, 327, 1], [1042, 1050, 1], [1078, 103, 2], [1082, 1056, 3], [1159, 1049, 3], [145, 217, 2], [220, 215, 2], [259, 1099, 1], [293, 110, 1], [309, 148, 2], [328, 745, 2], [1035, 1075, 1], [1079, 146, 2], [1186, 245, 1], [1296, 166, 1], [1316, 165, 1], [83, 83, 2], [138, 295, 2], [138, 304, 2], [152, 110, 1], [163, 1256, 1], [206, 336, 2], [223, 215, 2], [261, 149, 2], [314, 157, 1], [399, 399, 4], [1033, 155, 1], [1034, 1233, 2], [1070, 217, 5], [1073, 144, 3], [1089, 244, 2], [1091, 148, 2], [1169, 172, 3], [104, 460, 1], [150, 280, 4], [150, 1049, 2], [223, 149, 2], [244, 148, 2], [341, 341, 3], [378, 166, 1], [1045, 1161, 4], [1068, 189, 6], [1164, 173, 2], [1169, 181, 3], [1287, 158, 6], [1497, 1026, 1], [154, 216, 3], [156, 1112, 1], [162, 117, 3], [177, 279, 2], [179, 280, 2], [254, 264, 2], [285, 149, 2], [302, 275, 2], [319, 271, 1], [462, 462, 2], [570, 570, 3], [593, 593, 2], [598, 294, 2], [680, 237, 2], [1024, 414, 4], [1043, 1151, 4], [1088, 147, 2], [1088, 285, 2], [1124, 133, 6], [1198, 151, 5], [1230, 152, 5], [1278, 1026, 1], [164, 226, 2], [170, 1044, 1], [243, 133, 2], [269, 103, 2], [278, 224, 1], [346, 346, 5], [718, 718, 2], [1036, 295, 4], [1037, 270, 5], [1056, 264, 1], [1063, 148, 6], [1094, 291, 2], [1121, 1272, 5], [1130, 146, 6], [1344, 1033, 1], [136, 303, 2], [179, 144, 2], [217, 149, 2], [219, 469, 2], [257, 103, 2], [335, 249, 3], [468, 468, 3], [1085, 230, 4], [1088, 146, 2], [1155, 220, 1], [1339, 168, 1], [147, 148, 1], [150, 1116, 2], [233, 147, 2], [322, 322, 5], [396, 215, 2], [587, 447, 2], [1027, 389, 4], [1041, 1183, 1], [1046, 230, 4], [1049, 1057, 1], [1065, 133, 6], [1072, 242, 2], [1085, 244, 4], [1150, 146, 6], [1411, 1411, 4], [262, 1024, 2], [263, 226, 1], [266, 303, 2], [267, 267, 5], [272, 173, 1], [329, 329, 6], [334, 279, 2], [416, 416, 4], [478, 478, 2], [1027, 376, 4], [1037, 260, 5], [1040, 1139, 1], [1041, 1092, 4], [1074, 180, 5], [1189, 166, 5], [1264, 1061, 5], [1328, 220, 5], [1344, 152, 1], [21, 21, 1], [392, 165, 1], [523, 523, 2], [1035, 249, 2], [1036, 281, 4], [1043, 226, 4], [1076, 147, 2], [1078, 138, 2], [1124, 148, 6], [104, 479, 1], [136, 1071, 2], [148, 250, 3], [148, 273, 2], [155, 221, 3], [158, 407, 1], [189, 467, 2], [243, 414, 2], [262, 136, 2], [265, 170, 1], [288, 150, 2], [1036, 1067, 4], [1040, 245, 2], [1042, 215, 4], [1056, 231, 5], [1067, 147, 2], [1094, 138, 2], [1241, 156, 2], [145, 1063, 2], [149, 281, 2], [217, 1024, 2], [219, 1045, 2], [248, 214, 1], [257, 257, 6], [301, 1093, 1], [609, 609, 2], [1026, 226, 5], [1039, 1336, 6], [1079, 223, 2], [1108, 176, 6], [1124, 138, 6], [1128, 1032, 3], [1249, 1084, 5], [180, 1040, 1], [191, 370, 2], [297, 153, 2], [302, 145, 2], [307, 411, 2], [315, 417, 2], [1036, 291, 4], [1036, 300, 4], [1037, 287, 5], [1071, 133, 6], [1088, 144, 2], [1089, 147, 2], [1097, 181, 2], [148, 255, 2], [151, 103, 1], [189, 255, 2], [241, 136, 3], [252, 369, 2], [268, 268, 7], [293, 457, 1], [436, 436, 3], [1063, 151, 1], [1086, 163, 2], [1128, 1120, 3], [1153, 146, 6], [1197, 144, 5], [1211, 1113, 4], [1643, 114, 4], [1744, 153, 4], [132, 150, 1], [132, 233, 2], [166, 287, 2], [231, 264, 1], [242, 437, 3], [247, 113, 1], [296, 275, 2], [368, 173, 1], [409, 226, 2], [430, 249, 3], [1027, 408, 4], [1041, 230, 4], [1091, 255, 2], [1149, 148, 6], [236, 463, 2], [250, 138, 2], [300, 103, 2], [302, 505, 2], [439, 532, 2], [453, 453, 3], [1038, 1156, 2], [1121, 1344, 5], [1124, 147, 6], [1141, 163, 3], [1146, 1040, 1], [1245, 1081, 5], [117, 117, 5], [189, 277, 2], [221, 155, 1], [233, 226, 2], [240, 231, 2], [304, 269, 4], [1035, 262, 4], [1042, 133, 4], [1051, 132, 1], [1099, 181, 2], [4, 3, 2], [104, 457, 1], [149, 261, 2], [215, 405, 2], [221, 163, 1], [223, 217, 2], [267, 452, 1], [420, 420, 3], [530, 530, 2], [1037, 324, 5], [1072, 173, 5], [1105, 1120, 2], [1118, 1058, 1], [1128, 158, 3], [1128, 166, 3], [138, 1082, 2], [149, 1061, 1], [183, 183, 3], [207, 121, 2], [220, 261, 1], [235, 1078, 1], [236, 147, 2], [254, 284, 1], [263, 222, 1], [291, 103, 2], [326, 270, 1], [1033, 181, 4], [1051, 1158, 4], [1056, 224, 5], [1259, 181, 1], [1318, 152, 6], [136, 1060, 2], [156, 299, 1], [170, 260, 1], [212, 123, 2], [243, 144, 2], [309, 309, 4], [319, 270, 1], [325, 179, 3], [363, 172, 1], [379, 214, 2], [427, 613, 2], [1025, 460, 2], [1039, 1310, 6], [1041, 132, 4], [1080, 148, 6], [1091, 146, 2], [1115, 149, 6], [1116, 1204, 4], [146, 176, 1], [248, 240, 3], [258, 147, 2], [258, 266, 1], [282, 144, 2], [308, 177, 3], [319, 168, 1], [393, 393, 4], [598, 110, 2], [996, 996, 2], [1024, 133, 3], [1026, 220, 3], [1039, 1351, 6], [1045, 231, 4], [1065, 148, 6], [1195, 168, 3], [1195, 180, 3], [88, 87, 1], [158, 110, 1], [176, 417, 3], [243, 264, 1], [325, 291, 3], [344, 344, 4], [367, 159, 1]]} \ No newline at end of file +{ + "spatial_merges": [ + [ + 4, + 13 + ], + [ + 22, + 84 + ], + [ + 38, + 61 + ], + [ + 98, + 99 + ], + [ + 100, + 101 + ], + [ + 96, + 102 + ], + [ + 97, + 102 + ], + [ + 96, + 100 + ], + [ + 61, + 96 + ], + [ + 38, + 96 + ], + [ + 22, + 98 + ], + [ + 84, + 98 + ], + [ + 97, + 100 + ], + [ + 13, + 99 + ], + [ + 4, + 99 + ], + [ + 62, + 107 + ], + [ + 37, + 106 + ], + [ + 39, + 106 + ], + [ + 97, + 101 + ], + [ + 60, + 107 + ], + [ + 83, + 108 + ], + [ + 85, + 108 + ], + [ + 21, + 109 + ], + [ + 5, + 111 + ], + [ + 23, + 109 + ], + [ + 3, + 111 + ], + [ + 14, + 112 + ], + [ + 12, + 112 + ], + [ + 61, + 97 + ], + [ + 62, + 96 + ], + [ + 38, + 60 + ], + [ + 61, + 116 + ], + [ + 3, + 13 + ], + [ + 5, + 13 + ], + [ + 101, + 113 + ], + [ + 101, + 117 + ], + [ + 60, + 96 + ], + [ + 22, + 83 + ], + [ + 101, + 114 + ], + [ + 22, + 85 + ], + [ + 101, + 115 + ], + [ + 23, + 84 + ], + [ + 4, + 14 + ], + [ + 4, + 12 + ], + [ + 21, + 84 + ], + [ + 38, + 62 + ], + [ + 105, + 120 + ], + [ + 105, + 122 + ], + [ + 105, + 118 + ], + [ + 105, + 119 + ], + [ + 105, + 121 + ], + [ + 105, + 123 + ], + [ + 105, + 125 + ], + [ + 105, + 124 + ], + [ + 116, + 128 + ], + [ + 37, + 126 + ], + [ + 97, + 128 + ], + [ + 39, + 126 + ], + [ + 37, + 129 + ], + [ + 37, + 127 + ], + [ + 39, + 129 + ], + [ + 39, + 127 + ], + [ + 23, + 98 + ], + [ + 21, + 98 + ], + [ + 39, + 134 + ], + [ + 110, + 120 + ], + [ + 37, + 134 + ], + [ + 110, + 119 + ], + [ + 110, + 118 + ], + [ + 97, + 143 + ], + [ + 116, + 143 + ], + [ + 3, + 99 + ], + [ + 110, + 121 + ], + [ + 5, + 99 + ], + [ + 110, + 125 + ], + [ + 110, + 124 + ], + [ + 60, + 97 + ], + [ + 105, + 130 + ], + [ + 113, + 122 + ], + [ + 115, + 124 + ], + [ + 105, + 131 + ], + [ + 114, + 125 + ], + [ + 110, + 122 + ], + [ + 110, + 123 + ], + [ + 105, + 140 + ], + [ + 83, + 160 + ], + [ + 135, + 141 + ], + [ + 62, + 97 + ], + [ + 85, + 160 + ], + [ + 85, + 161 + ], + [ + 83, + 161 + ], + [ + 117, + 120 + ], + [ + 23, + 85 + ], + [ + 14, + 169 + ], + [ + 12, + 171 + ], + [ + 12, + 169 + ], + [ + 23, + 83 + ], + [ + 137, + 141 + ], + [ + 14, + 171 + ], + [ + 137, + 140 + ], + [ + 21, + 85 + ], + [ + 3, + 12 + ], + [ + 3, + 14 + ], + [ + 139, + 141 + ], + [ + 21, + 83 + ], + [ + 130, + 139 + ], + [ + 131, + 142 + ], + [ + 5, + 12 + ], + [ + 130, + 142 + ], + [ + 131, + 139 + ], + [ + 141, + 142 + ], + [ + 131, + 135 + ], + [ + 5, + 14 + ], + [ + 131, + 137 + ], + [ + 130, + 137 + ], + [ + 135, + 140 + ], + [ + 101, + 159 + ], + [ + 101, + 157 + ], + [ + 37, + 174 + ], + [ + 114, + 118 + ], + [ + 130, + 135 + ], + [ + 115, + 119 + ], + [ + 113, + 123 + ], + [ + 39, + 174 + ], + [ + 117, + 121 + ], + [ + 113, + 118 + ], + [ + 101, + 162 + ], + [ + 60, + 116 + ], + [ + 101, + 164 + ], + [ + 139, + 140 + ], + [ + 113, + 119 + ], + [ + 140, + 142 + ], + [ + 117, + 119 + ], + [ + 115, + 123 + ], + [ + 39, + 185 + ], + [ + 114, + 121 + ], + [ + 40, + 106 + ], + [ + 117, + 118 + ], + [ + 113, + 121 + ], + [ + 37, + 185 + ], + [ + 62, + 116 + ], + [ + 36, + 106 + ], + [ + 117, + 123 + ], + [ + 114, + 123 + ], + [ + 125, + 153 + ], + [ + 115, + 118 + ], + [ + 114, + 119 + ], + [ + 120, + 154 + ], + [ + 124, + 155 + ], + [ + 63, + 107 + ], + [ + 139, + 175 + ], + [ + 115, + 121 + ], + [ + 142, + 178 + ], + [ + 59, + 107 + ], + [ + 114, + 122 + ], + [ + 63, + 96 + ], + [ + 115, + 122 + ], + [ + 115, + 120 + ], + [ + 59, + 96 + ], + [ + 105, + 183 + ], + [ + 114, + 120 + ], + [ + 119, + 155 + ], + [ + 118, + 153 + ], + [ + 105, + 186 + ], + [ + 105, + 187 + ], + [ + 105, + 188 + ], + [ + 113, + 124 + ], + [ + 122, + 167 + ], + [ + 105, + 184 + ], + [ + 113, + 125 + ], + [ + 119, + 154 + ], + [ + 137, + 182 + ], + [ + 37, + 225 + ], + [ + 39, + 225 + ], + [ + 118, + 154 + ], + [ + 139, + 178 + ], + [ + 117, + 125 + ], + [ + 113, + 203 + ], + [ + 135, + 178 + ], + [ + 117, + 124 + ], + [ + 142, + 175 + ], + [ + 135, + 182 + ], + [ + 105, + 193 + ], + [ + 137, + 175 + ], + [ + 137, + 178 + ], + [ + 39, + 238 + ], + [ + 105, + 191 + ], + [ + 135, + 175 + ], + [ + 105, + 196 + ], + [ + 118, + 167 + ], + [ + 105, + 195 + ], + [ + 105, + 201 + ], + [ + 82, + 108 + ], + [ + 105, + 192 + ], + [ + 119, + 167 + ], + [ + 37, + 238 + ], + [ + 86, + 108 + ], + [ + 139, + 182 + ], + [ + 113, + 183 + ], + [ + 119, + 153 + ], + [ + 118, + 155 + ], + [ + 121, + 154 + ], + [ + 142, + 182 + ], + [ + 121, + 153 + ], + [ + 113, + 186 + ], + [ + 114, + 184 + ], + [ + 115, + 197 + ], + [ + 124, + 159 + ], + [ + 117, + 122 + ], + [ + 122, + 157 + ], + [ + 115, + 191 + ], + [ + 105, + 208 + ], + [ + 59, + 97 + ], + [ + 125, + 157 + ], + [ + 139, + 199 + ], + [ + 40, + 127 + ], + [ + 36, + 127 + ], + [ + 122, + 159 + ], + [ + 22, + 82 + ], + [ + 141, + 194 + ], + [ + 120, + 155 + ], + [ + 110, + 187 + ], + [ + 114, + 193 + ], + [ + 120, + 153 + ], + [ + 110, + 188 + ], + [ + 22, + 86 + ], + [ + 110, + 204 + ], + [ + 114, + 192 + ], + [ + 110, + 184 + ], + [ + 121, + 155 + ], + [ + 40, + 134 + ], + [ + 123, + 155 + ], + [ + 110, + 197 + ], + [ + 124, + 162 + ], + [ + 141, + 202 + ], + [ + 117, + 204 + ], + [ + 115, + 213 + ], + [ + 115, + 196 + ], + [ + 130, + 198 + ], + [ + 139, + 200 + ], + [ + 125, + 164 + ], + [ + 37, + 253 + ], + [ + 137, + 200 + ], + [ + 135, + 205 + ], + [ + 131, + 194 + ], + [ + 137, + 199 + ], + [ + 113, + 120 + ], + [ + 4, + 15 + ], + [ + 121, + 167 + ], + [ + 114, + 195 + ], + [ + 117, + 206 + ], + [ + 37, + 256 + ], + [ + 135, + 199 + ], + [ + 120, + 162 + ], + [ + 140, + 198 + ], + [ + 123, + 167 + ], + [ + 113, + 190 + ], + [ + 117, + 187 + ], + [ + 130, + 202 + ], + [ + 135, + 210 + ], + [ + 113, + 207 + ], + [ + 117, + 188 + ], + [ + 137, + 210 + ], + [ + 36, + 126 + ], + [ + 36, + 134 + ], + [ + 110, + 209 + ], + [ + 142, + 205 + ], + [ + 135, + 200 + ], + [ + 40, + 126 + ], + [ + 39, + 253 + ], + [ + 110, + 211 + ], + [ + 114, + 201 + ], + [ + 142, + 200 + ], + [ + 124, + 154 + ], + [ + 125, + 154 + ], + [ + 120, + 164 + ], + [ + 139, + 205 + ], + [ + 118, + 157 + ], + [ + 123, + 154 + ], + [ + 115, + 227 + ], + [ + 123, + 153 + ], + [ + 119, + 159 + ], + [ + 2, + 13 + ], + [ + 130, + 194 + ], + [ + 39, + 256 + ], + [ + 137, + 205 + ], + [ + 142, + 210 + ], + [ + 131, + 202 + ], + [ + 119, + 162 + ], + [ + 140, + 190 + ], + [ + 6, + 13 + ], + [ + 122, + 153 + ], + [ + 131, + 198 + ], + [ + 4, + 11 + ], + [ + 122, + 155 + ], + [ + 118, + 164 + ], + [ + 63, + 97 + ], + [ + 131, + 190 + ], + [ + 123, + 157 + ], + [ + 110, + 183 + ], + [ + 110, + 208 + ], + [ + 123, + 159 + ], + [ + 110, + 192 + ], + [ + 141, + 190 + ], + [ + 123, + 162 + ], + [ + 142, + 199 + ], + [ + 24, + 84 + ], + [ + 121, + 157 + ], + [ + 115, + 229 + ], + [ + 110, + 229 + ], + [ + 110, + 186 + ], + [ + 121, + 164 + ], + [ + 125, + 167 + ], + [ + 113, + 201 + ], + [ + 140, + 194 + ], + [ + 124, + 167 + ], + [ + 118, + 159 + ], + [ + 139, + 210 + ], + [ + 110, + 196 + ], + [ + 113, + 227 + ], + [ + 110, + 218 + ], + [ + 15, + 112 + ], + [ + 110, + 195 + ], + [ + 123, + 164 + ], + [ + 110, + 206 + ], + [ + 110, + 212 + ], + [ + 119, + 157 + ], + [ + 110, + 213 + ], + [ + 141, + 198 + ], + [ + 11, + 112 + ], + [ + 130, + 190 + ], + [ + 119, + 164 + ], + [ + 121, + 159 + ], + [ + 118, + 162 + ], + [ + 121, + 162 + ], + [ + 110, + 203 + ], + [ + 114, + 208 + ], + [ + 155, + 197 + ], + [ + 110, + 193 + ], + [ + 153, + 184 + ], + [ + 2, + 12 + ], + [ + 20, + 84 + ], + [ + 140, + 202 + ], + [ + 110, + 207 + ], + [ + 157, + 201 + ], + [ + 110, + 191 + ], + [ + 120, + 167 + ], + [ + 159, + 227 + ], + [ + 117, + 207 + ], + [ + 38, + 310 + ], + [ + 124, + 234 + ], + [ + 24, + 85 + ], + [ + 114, + 209 + ], + [ + 114, + 124 + ], + [ + 114, + 183 + ], + [ + 113, + 212 + ], + [ + 117, + 212 + ], + [ + 115, + 212 + ], + [ + 115, + 125 + ], + [ + 110, + 201 + ], + [ + 125, + 239 + ], + [ + 2, + 111 + ], + [ + 110, + 227 + ], + [ + 113, + 218 + ], + [ + 115, + 186 + ], + [ + 113, + 209 + ], + [ + 119, + 221 + ], + [ + 114, + 218 + ], + [ + 122, + 154 + ], + [ + 117, + 229 + ], + [ + 117, + 211 + ], + [ + 115, + 211 + ], + [ + 117, + 209 + ], + [ + 117, + 208 + ], + [ + 6, + 111 + ], + [ + 115, + 187 + ], + [ + 114, + 207 + ], + [ + 117, + 218 + ], + [ + 114, + 188 + ], + [ + 101, + 234 + ], + [ + 125, + 216 + ], + [ + 154, + 187 + ], + [ + 101, + 239 + ], + [ + 118, + 216 + ], + [ + 114, + 203 + ], + [ + 113, + 211 + ], + [ + 23, + 86 + ], + [ + 115, + 203 + ], + [ + 118, + 237 + ], + [ + 120, + 221 + ], + [ + 120, + 216 + ], + [ + 24, + 83 + ], + [ + 124, + 221 + ], + [ + 36, + 174 + ], + [ + 154, + 188 + ], + [ + 119, + 232 + ], + [ + 115, + 206 + ], + [ + 115, + 204 + ], + [ + 20, + 85 + ], + [ + 162, + 229 + ], + [ + 157, + 183 + ], + [ + 114, + 204 + ], + [ + 86, + 160 + ], + [ + 153, + 192 + ], + [ + 124, + 232 + ], + [ + 24, + 109 + ], + [ + 38, + 394 + ], + [ + 159, + 186 + ], + [ + 115, + 218 + ], + [ + 40, + 174 + ], + [ + 122, + 247 + ], + [ + 114, + 211 + ], + [ + 113, + 193 + ], + [ + 113, + 213 + ], + [ + 125, + 237 + ], + [ + 141, + 316 + ], + [ + 114, + 212 + ], + [ + 113, + 184 + ], + [ + 115, + 183 + ], + [ + 115, + 209 + ], + [ + 6, + 12 + ], + [ + 114, + 186 + ], + [ + 155, + 191 + ], + [ + 82, + 160 + ], + [ + 115, + 207 + ], + [ + 154, + 204 + ], + [ + 113, + 197 + ], + [ + 117, + 197 + ], + [ + 3, + 15 + ], + [ + 115, + 188 + ], + [ + 40, + 185 + ], + [ + 114, + 206 + ], + [ + 153, + 195 + ], + [ + 23, + 82 + ], + [ + 20, + 83 + ], + [ + 167, + 183 + ], + [ + 117, + 184 + ], + [ + 119, + 216 + ], + [ + 113, + 191 + ], + [ + 157, + 203 + ], + [ + 114, + 187 + ], + [ + 120, + 251 + ], + [ + 175, + 190 + ], + [ + 105, + 290 + ], + [ + 155, + 213 + ], + [ + 3, + 11 + ], + [ + 117, + 195 + ], + [ + 157, + 193 + ], + [ + 159, + 203 + ], + [ + 113, + 195 + ], + [ + 105, + 294 + ], + [ + 122, + 232 + ], + [ + 198, + 200 + ], + [ + 167, + 186 + ], + [ + 155, + 229 + ], + [ + 118, + 221 + ], + [ + 105, + 312 + ], + [ + 130, + 354 + ], + [ + 113, + 196 + ], + [ + 155, + 196 + ], + [ + 117, + 193 + ], + [ + 164, + 208 + ], + [ + 153, + 193 + ], + [ + 37, + 310 + ], + [ + 117, + 213 + ], + [ + 162, + 191 + ], + [ + 175, + 194 + ], + [ + 162, + 206 + ], + [ + 117, + 192 + ], + [ + 154, + 206 + ], + [ + 117, + 191 + ], + [ + 153, + 208 + ], + [ + 21, + 86 + ], + [ + 140, + 323 + ], + [ + 157, + 184 + ], + [ + 118, + 232 + ], + [ + 157, + 207 + ], + [ + 36, + 185 + ], + [ + 21, + 82 + ], + [ + 190, + 199 + ], + [ + 159, + 191 + ], + [ + 178, + 202 + ], + [ + 178, + 198 + ], + [ + 115, + 419 + ], + [ + 135, + 345 + ], + [ + 162, + 187 + ], + [ + 113, + 192 + ], + [ + 101, + 247 + ], + [ + 122, + 237 + ], + [ + 39, + 310 + ], + [ + 202, + 205 + ], + [ + 110, + 290 + ], + [ + 37, + 96 + ], + [ + 159, + 197 + ], + [ + 101, + 251 + ], + [ + 119, + 237 + ], + [ + 194, + 205 + ], + [ + 124, + 153 + ], + [ + 121, + 216 + ], + [ + 125, + 155 + ], + [ + 110, + 294 + ], + [ + 157, + 192 + ], + [ + 5, + 15 + ], + [ + 105, + 337 + ], + [ + 105, + 317 + ], + [ + 159, + 213 + ], + [ + 113, + 381 + ], + [ + 41, + 106 + ], + [ + 122, + 164 + ], + [ + 164, + 206 + ], + [ + 162, + 197 + ], + [ + 194, + 199 + ], + [ + 182, + 190 + ], + [ + 2, + 14 + ], + [ + 117, + 196 + ], + [ + 137, + 391 + ], + [ + 182, + 198 + ], + [ + 164, + 193 + ], + [ + 82, + 161 + ], + [ + 114, + 427 + ], + [ + 164, + 188 + ], + [ + 155, + 187 + ], + [ + 164, + 192 + ], + [ + 35, + 106 + ], + [ + 199, + 202 + ], + [ + 190, + 200 + ], + [ + 159, + 196 + ], + [ + 154, + 208 + ], + [ + 164, + 184 + ], + [ + 113, + 312 + ], + [ + 105, + 332 + ], + [ + 153, + 209 + ], + [ + 167, + 203 + ], + [ + 178, + 194 + ], + [ + 159, + 183 + ], + [ + 105, + 384 + ], + [ + 153, + 201 + ], + [ + 113, + 206 + ], + [ + 154, + 229 + ], + [ + 153, + 188 + ], + [ + 164, + 195 + ], + [ + 157, + 195 + ], + [ + 130, + 404 + ], + [ + 157, + 186 + ], + [ + 39, + 96 + ], + [ + 159, + 207 + ], + [ + 105, + 357 + ], + [ + 155, + 227 + ], + [ + 182, + 194 + ], + [ + 194, + 200 + ], + [ + 198, + 210 + ], + [ + 64, + 107 + ], + [ + 155, + 212 + ], + [ + 86, + 161 + ], + [ + 162, + 213 + ], + [ + 105, + 343 + ], + [ + 117, + 183 + ], + [ + 157, + 209 + ], + [ + 121, + 221 + ], + [ + 162, + 212 + ], + [ + 154, + 209 + ], + [ + 175, + 198 + ], + [ + 167, + 207 + ], + [ + 113, + 342 + ], + [ + 5, + 11 + ], + [ + 20, + 109 + ], + [ + 140, + 316 + ], + [ + 123, + 232 + ], + [ + 154, + 211 + ], + [ + 117, + 186 + ], + [ + 155, + 211 + ], + [ + 114, + 317 + ], + [ + 113, + 204 + ], + [ + 122, + 162 + ], + [ + 117, + 336 + ], + [ + 141, + 323 + ], + [ + 131, + 354 + ], + [ + 115, + 340 + ], + [ + 105, + 364 + ], + [ + 121, + 237 + ], + [ + 162, + 204 + ], + [ + 36, + 253 + ], + [ + 37, + 394 + ], + [ + 58, + 107 + ], + [ + 190, + 210 + ], + [ + 105, + 350 + ], + [ + 6, + 14 + ], + [ + 123, + 221 + ], + [ + 105, + 360 + ], + [ + 175, + 202 + ], + [ + 114, + 350 + ], + [ + 105, + 401 + ], + [ + 105, + 365 + ], + [ + 178, + 190 + ], + [ + 11, + 169 + ], + [ + 157, + 312 + ], + [ + 115, + 387 + ], + [ + 105, + 341 + ], + [ + 117, + 356 + ], + [ + 164, + 204 + ], + [ + 114, + 374 + ], + [ + 162, + 196 + ], + [ + 105, + 340 + ], + [ + 142, + 380 + ], + [ + 114, + 341 + ], + [ + 40, + 253 + ], + [ + 154, + 197 + ], + [ + 114, + 343 + ], + [ + 99, + 438 + ], + [ + 121, + 232 + ], + [ + 114, + 312 + ], + [ + 113, + 337 + ], + [ + 120, + 159 + ], + [ + 121, + 251 + ], + [ + 130, + 439 + ], + [ + 164, + 218 + ], + [ + 115, + 352 + ], + [ + 115, + 365 + ], + [ + 153, + 218 + ], + [ + 154, + 184 + ], + [ + 130, + 323 + ], + [ + 159, + 211 + ], + [ + 162, + 188 + ], + [ + 155, + 186 + ], + [ + 167, + 218 + ], + [ + 115, + 360 + ], + [ + 113, + 317 + ], + [ + 131, + 316 + ], + [ + 200, + 202 + ], + [ + 113, + 188 + ], + [ + 142, + 388 + ], + [ + 120, + 157 + ], + [ + 191, + 234 + ], + [ + 140, + 354 + ], + [ + 153, + 183 + ], + [ + 139, + 380 + ], + [ + 123, + 237 + ], + [ + 123, + 216 + ], + [ + 119, + 234 + ], + [ + 117, + 390 + ], + [ + 130, + 316 + ], + [ + 113, + 187 + ], + [ + 164, + 187 + ], + [ + 157, + 317 + ], + [ + 194, + 210 + ], + [ + 203, + 247 + ], + [ + 198, + 199 + ], + [ + 40, + 256 + ], + [ + 153, + 204 + ], + [ + 202, + 210 + ], + [ + 118, + 239 + ], + [ + 155, + 206 + ], + [ + 115, + 357 + ], + [ + 115, + 370 + ], + [ + 167, + 184 + ], + [ + 159, + 387 + ], + [ + 139, + 388 + ], + [ + 153, + 211 + ], + [ + 117, + 203 + ], + [ + 153, + 187 + ], + [ + 105, + 383 + ], + [ + 206, + 251 + ], + [ + 117, + 385 + ], + [ + 167, + 212 + ], + [ + 113, + 412 + ], + [ + 124, + 366 + ], + [ + 115, + 337 + ], + [ + 155, + 188 + ], + [ + 157, + 342 + ], + [ + 41, + 127 + ], + [ + 198, + 205 + ], + [ + 15, + 169 + ], + [ + 36, + 256 + ], + [ + 154, + 212 + ], + [ + 167, + 201 + ], + [ + 167, + 197 + ], + [ + 114, + 332 + ], + [ + 182, + 202 + ], + [ + 131, + 323 + ], + [ + 193, + 239 + ], + [ + 115, + 415 + ], + [ + 11, + 171 + ], + [ + 105, + 374 + ], + [ + 157, + 212 + ], + [ + 164, + 207 + ], + [ + 15, + 171 + ], + [ + 115, + 412 + ], + [ + 38, + 116 + ], + [ + 35, + 126 + ], + [ + 221, + 229 + ], + [ + 98, + 449 + ], + [ + 159, + 337 + ], + [ + 164, + 209 + ], + [ + 167, + 227 + ], + [ + 155, + 209 + ], + [ + 141, + 354 + ], + [ + 208, + 216 + ], + [ + 114, + 213 + ], + [ + 162, + 352 + ], + [ + 167, + 209 + ], + [ + 159, + 218 + ], + [ + 114, + 383 + ], + [ + 39, + 394 + ], + [ + 58, + 97 + ], + [ + 167, + 211 + ], + [ + 110, + 352 + ], + [ + 162, + 211 + ], + [ + 154, + 195 + ], + [ + 164, + 211 + ], + [ + 105, + 426 + ], + [ + 125, + 361 + ], + [ + 115, + 345 + ], + [ + 155, + 218 + ], + [ + 105, + 370 + ], + [ + 98, + 489 + ], + [ + 113, + 503 + ], + [ + 110, + 332 + ], + [ + 124, + 313 + ], + [ + 159, + 212 + ], + [ + 154, + 213 + ], + [ + 105, + 415 + ], + [ + 197, + 234 + ], + [ + 157, + 218 + ], + [ + 159, + 395 + ], + [ + 41, + 134 + ], + [ + 115, + 195 + ], + [ + 190, + 205 + ], + [ + 139, + 391 + ], + [ + 157, + 374 + ], + [ + 114, + 401 + ], + [ + 154, + 192 + ], + [ + 110, + 385 + ], + [ + 155, + 204 + ], + [ + 162, + 336 + ], + [ + 192, + 239 + ], + [ + 105, + 403 + ], + [ + 114, + 342 + ], + [ + 35, + 127 + ], + [ + 99, + 518 + ], + [ + 184, + 239 + ], + [ + 154, + 218 + ], + [ + 123, + 234 + ], + [ + 114, + 403 + ], + [ + 196, + 234 + ], + [ + 164, + 212 + ], + [ + 162, + 209 + ], + [ + 117, + 352 + ], + [ + 204, + 251 + ], + [ + 117, + 332 + ], + [ + 186, + 247 + ], + [ + 101, + 314 + ], + [ + 123, + 239 + ], + [ + 101, + 313 + ], + [ + 40, + 129 + ], + [ + 159, + 412 + ], + [ + 197, + 221 + ], + [ + 187, + 221 + ], + [ + 139, + 438 + ], + [ + 184, + 216 + ], + [ + 234, + 419 + ], + [ + 213, + 234 + ], + [ + 110, + 390 + ], + [ + 110, + 341 + ], + [ + 125, + 314 + ], + [ + 162, + 370 + ], + [ + 137, + 380 + ], + [ + 227, + 232 + ], + [ + 154, + 196 + ], + [ + 164, + 356 + ], + [ + 115, + 384 + ], + [ + 153, + 206 + ], + [ + 153, + 212 + ], + [ + 197, + 232 + ], + [ + 110, + 364 + ], + [ + 117, + 364 + ], + [ + 167, + 195 + ], + [ + 131, + 439 + ], + [ + 184, + 237 + ], + [ + 188, + 216 + ], + [ + 183, + 247 + ], + [ + 36, + 129 + ], + [ + 110, + 360 + ], + [ + 22, + 81 + ], + [ + 64, + 590 + ], + [ + 110, + 336 + ], + [ + 114, + 196 + ], + [ + 201, + 237 + ], + [ + 114, + 197 + ], + [ + 58, + 590 + ], + [ + 195, + 239 + ], + [ + 115, + 336 + ], + [ + 239, + 427 + ], + [ + 153, + 207 + ], + [ + 155, + 183 + ], + [ + 153, + 186 + ], + [ + 115, + 184 + ], + [ + 35, + 134 + ], + [ + 142, + 345 + ], + [ + 121, + 239 + ], + [ + 124, + 157 + ], + [ + 101, + 328 + ], + [ + 135, + 391 + ], + [ + 115, + 440 + ], + [ + 157, + 401 + ], + [ + 124, + 328 + ], + [ + 167, + 213 + ], + [ + 192, + 216 + ], + [ + 110, + 350 + ], + [ + 125, + 162 + ], + [ + 207, + 247 + ], + [ + 20, + 86 + ], + [ + 114, + 364 + ], + [ + 117, + 343 + ], + [ + 157, + 211 + ], + [ + 162, + 207 + ], + [ + 115, + 395 + ], + [ + 22, + 87 + ], + [ + 113, + 404 + ], + [ + 154, + 207 + ], + [ + 164, + 332 + ], + [ + 113, + 374 + ], + [ + 135, + 388 + ], + [ + 159, + 209 + ], + [ + 117, + 384 + ], + [ + 155, + 203 + ], + [ + 110, + 317 + ], + [ + 114, + 356 + ], + [ + 162, + 218 + ], + [ + 186, + 232 + ], + [ + 121, + 247 + ], + [ + 130, + 449 + ], + [ + 110, + 340 + ], + [ + 40, + 310 + ], + [ + 41, + 126 + ], + [ + 110, + 387 + ], + [ + 114, + 428 + ], + [ + 206, + 221 + ], + [ + 110, + 356 + ], + [ + 58, + 642 + ], + [ + 105, + 500 + ], + [ + 124, + 164 + ], + [ + 167, + 187 + ], + [ + 247, + 404 + ], + [ + 114, + 290 + ], + [ + 101, + 362 + ], + [ + 114, + 426 + ], + [ + 167, + 188 + ], + [ + 115, + 192 + ], + [ + 125, + 159 + ], + [ + 183, + 237 + ], + [ + 167, + 193 + ], + [ + 159, + 415 + ], + [ + 110, + 384 + ], + [ + 105, + 521 + ], + [ + 117, + 370 + ], + [ + 135, + 380 + ], + [ + 155, + 352 + ], + [ + 123, + 247 + ], + [ + 113, + 357 + ], + [ + 64, + 642 + ], + [ + 114, + 390 + ], + [ + 154, + 186 + ], + [ + 115, + 385 + ], + [ + 139, + 345 + ], + [ + 167, + 192 + ], + [ + 113, + 415 + ], + [ + 81, + 108 + ], + [ + 154, + 193 + ], + [ + 154, + 183 + ], + [ + 99, + 611 + ], + [ + 121, + 234 + ], + [ + 125, + 362 + ], + [ + 137, + 543 + ], + [ + 119, + 239 + ], + [ + 115, + 294 + ], + [ + 110, + 357 + ], + [ + 117, + 294 + ], + [ + 153, + 341 + ], + [ + 122, + 216 + ], + [ + 117, + 403 + ], + [ + 115, + 381 + ], + [ + 167, + 191 + ], + [ + 164, + 403 + ], + [ + 137, + 388 + ], + [ + 247, + 503 + ], + [ + 98, + 532 + ], + [ + 117, + 290 + ], + [ + 130, + 532 + ], + [ + 123, + 251 + ], + [ + 120, + 232 + ], + [ + 115, + 582 + ], + [ + 118, + 234 + ], + [ + 98, + 496 + ], + [ + 154, + 191 + ], + [ + 157, + 428 + ], + [ + 155, + 207 + ], + [ + 113, + 294 + ], + [ + 195, + 216 + ], + [ + 87, + 108 + ], + [ + 113, + 290 + ], + [ + 113, + 640 + ], + [ + 115, + 193 + ], + [ + 119, + 251 + ], + [ + 155, + 340 + ], + [ + 114, + 294 + ], + [ + 167, + 196 + ], + [ + 142, + 391 + ], + [ + 198, + 345 + ], + [ + 153, + 290 + ], + [ + 164, + 364 + ], + [ + 115, + 290 + ], + [ + 114, + 191 + ], + [ + 117, + 342 + ], + [ + 117, + 426 + ], + [ + 159, + 381 + ], + [ + 118, + 247 + ], + [ + 153, + 332 + ], + [ + 23, + 87 + ], + [ + 63, + 785 + ], + [ + 117, + 440 + ], + [ + 110, + 383 + ], + [ + 110, + 426 + ], + [ + 113, + 350 + ], + [ + 120, + 237 + ], + [ + 153, + 203 + ], + [ + 117, + 365 + ] + ], + "temporal_merges": [ + [ + 103, + 103, + 2 + ], + [ + 104, + 104, + 1 + ], + [ + 1024, + 1024, + 4 + ], + [ + 1025, + 1025, + 2 + ], + [ + 1026, + 1026, + 1 + ], + [ + 1024, + 103, + 4 + ], + [ + 1027, + 1027, + 4 + ], + [ + 103, + 103, + 4 + ], + [ + 1025, + 104, + 2 + ], + [ + 104, + 104, + 2 + ], + [ + 103, + 1024, + 4 + ], + [ + 103, + 103, + 6 + ], + [ + 1024, + 103, + 6 + ], + [ + 1027, + 104, + 4 + ], + [ + 1025, + 104, + 3 + ], + [ + 1027, + 1025, + 4 + ], + [ + 104, + 104, + 3 + ], + [ + 103, + 133, + 2 + ], + [ + 103, + 132, + 2 + ], + [ + 103, + 136, + 2 + ], + [ + 1027, + 1032, + 4 + ], + [ + 103, + 138, + 2 + ], + [ + 103, + 144, + 2 + ], + [ + 104, + 1025, + 2 + ], + [ + 1024, + 132, + 4 + ], + [ + 1024, + 133, + 4 + ], + [ + 103, + 145, + 2 + ], + [ + 103, + 146, + 2 + ], + [ + 103, + 147, + 2 + ], + [ + 1026, + 1029, + 1 + ], + [ + 103, + 148, + 2 + ], + [ + 1024, + 136, + 4 + ], + [ + 138, + 138, + 3 + ], + [ + 1024, + 144, + 4 + ], + [ + 103, + 149, + 2 + ], + [ + 1026, + 1029, + 3 + ], + [ + 1024, + 145, + 4 + ], + [ + 150, + 136, + 1 + ], + [ + 132, + 132, + 2 + ], + [ + 1024, + 138, + 4 + ], + [ + 1024, + 147, + 4 + ], + [ + 1024, + 146, + 4 + ], + [ + 103, + 151, + 2 + ], + [ + 133, + 133, + 3 + ], + [ + 1029, + 1026, + 1 + ], + [ + 103, + 150, + 2 + ], + [ + 136, + 136, + 3 + ], + [ + 1024, + 149, + 4 + ], + [ + 1025, + 1025, + 3 + ], + [ + 1024, + 148, + 4 + ], + [ + 1032, + 104, + 4 + ], + [ + 145, + 132, + 1 + ], + [ + 151, + 138, + 1 + ], + [ + 104, + 152, + 1 + ], + [ + 144, + 133, + 1 + ], + [ + 132, + 145, + 1 + ], + [ + 1024, + 150, + 4 + ], + [ + 104, + 156, + 1 + ], + [ + 1024, + 151, + 4 + ], + [ + 146, + 146, + 2 + ], + [ + 104, + 158, + 1 + ], + [ + 147, + 147, + 2 + ], + [ + 163, + 152, + 1 + ], + [ + 1029, + 132, + 6 + ], + [ + 149, + 149, + 4 + ], + [ + 136, + 136, + 4 + ], + [ + 1029, + 133, + 6 + ], + [ + 138, + 138, + 4 + ], + [ + 144, + 133, + 2 + ], + [ + 172, + 156, + 1 + ], + [ + 148, + 148, + 4 + ], + [ + 1025, + 152, + 2 + ], + [ + 104, + 165, + 1 + ], + [ + 104, + 166, + 1 + ], + [ + 1031, + 144, + 2 + ], + [ + 173, + 158, + 1 + ], + [ + 1029, + 147, + 6 + ], + [ + 1029, + 136, + 6 + ], + [ + 1029, + 138, + 6 + ], + [ + 1029, + 146, + 6 + ], + [ + 1025, + 156, + 2 + ], + [ + 104, + 163, + 1 + ], + [ + 104, + 168, + 1 + ], + [ + 103, + 103, + 1 + ], + [ + 1031, + 132, + 2 + ], + [ + 1029, + 145, + 6 + ], + [ + 177, + 177, + 2 + ], + [ + 133, + 133, + 2 + ], + [ + 104, + 170, + 1 + ], + [ + 1025, + 158, + 2 + ], + [ + 1029, + 144, + 6 + ], + [ + 1031, + 133, + 2 + ], + [ + 179, + 179, + 2 + ], + [ + 145, + 132, + 2 + ], + [ + 149, + 149, + 5 + ], + [ + 1025, + 168, + 2 + ], + [ + 1032, + 152, + 3 + ], + [ + 1027, + 1033, + 4 + ], + [ + 132, + 132, + 3 + ], + [ + 1029, + 148, + 6 + ], + [ + 1031, + 146, + 2 + ], + [ + 1031, + 147, + 2 + ], + [ + 138, + 151, + 1 + ], + [ + 136, + 150, + 1 + ], + [ + 1025, + 163, + 2 + ], + [ + 1032, + 156, + 3 + ], + [ + 1031, + 145, + 2 + ], + [ + 1029, + 149, + 6 + ], + [ + 176, + 176, + 2 + ], + [ + 1025, + 170, + 2 + ], + [ + 1032, + 158, + 3 + ], + [ + 133, + 144, + 1 + ], + [ + 148, + 148, + 5 + ], + [ + 152, + 163, + 1 + ], + [ + 1025, + 165, + 2 + ], + [ + 180, + 168, + 1 + ], + [ + 133, + 144, + 2 + ], + [ + 1025, + 166, + 2 + ], + [ + 156, + 156, + 3 + ], + [ + 1032, + 168, + 3 + ], + [ + 136, + 136, + 2 + ], + [ + 1032, + 163, + 3 + ], + [ + 158, + 158, + 3 + ], + [ + 138, + 138, + 2 + ], + [ + 132, + 145, + 2 + ], + [ + 1031, + 136, + 2 + ], + [ + 1031, + 138, + 2 + ], + [ + 150, + 136, + 2 + ], + [ + 166, + 166, + 2 + ], + [ + 1031, + 148, + 2 + ], + [ + 1032, + 170, + 3 + ], + [ + 145, + 145, + 2 + ], + [ + 165, + 165, + 2 + ], + [ + 104, + 172, + 1 + ], + [ + 146, + 146, + 3 + ], + [ + 1026, + 144, + 1 + ], + [ + 147, + 147, + 3 + ], + [ + 151, + 138, + 2 + ], + [ + 104, + 173, + 1 + ], + [ + 132, + 103, + 2 + ], + [ + 104, + 181, + 1 + ], + [ + 1031, + 149, + 2 + ], + [ + 1031, + 151, + 2 + ], + [ + 1029, + 150, + 6 + ], + [ + 1031, + 150, + 2 + ], + [ + 1033, + 152, + 1 + ], + [ + 1029, + 151, + 6 + ], + [ + 144, + 103, + 2 + ], + [ + 1032, + 165, + 3 + ], + [ + 133, + 103, + 2 + ], + [ + 146, + 103, + 2 + ], + [ + 136, + 103, + 2 + ], + [ + 147, + 103, + 2 + ], + [ + 1032, + 166, + 3 + ], + [ + 138, + 103, + 2 + ], + [ + 1027, + 156, + 4 + ], + [ + 149, + 103, + 2 + ], + [ + 145, + 103, + 2 + ], + [ + 148, + 103, + 2 + ], + [ + 1026, + 144, + 3 + ], + [ + 104, + 180, + 1 + ], + [ + 1027, + 152, + 4 + ], + [ + 1033, + 152, + 3 + ], + [ + 136, + 150, + 2 + ], + [ + 1025, + 172, + 2 + ], + [ + 1027, + 158, + 4 + ], + [ + 1026, + 133, + 1 + ], + [ + 1025, + 173, + 2 + ], + [ + 1027, + 163, + 4 + ], + [ + 138, + 151, + 2 + ], + [ + 1026, + 1024, + 5 + ], + [ + 1025, + 181, + 2 + ], + [ + 156, + 172, + 1 + ], + [ + 144, + 144, + 3 + ], + [ + 151, + 151, + 3 + ], + [ + 177, + 177, + 3 + ], + [ + 158, + 158, + 4 + ], + [ + 152, + 152, + 3 + ], + [ + 132, + 132, + 4 + ], + [ + 1027, + 170, + 4 + ], + [ + 179, + 179, + 3 + ], + [ + 1032, + 172, + 3 + ], + [ + 1033, + 156, + 3 + ], + [ + 1027, + 1038, + 4 + ], + [ + 1026, + 144, + 5 + ], + [ + 1025, + 180, + 2 + ], + [ + 1027, + 168, + 4 + ], + [ + 1032, + 173, + 3 + ], + [ + 149, + 149, + 3 + ], + [ + 1026, + 133, + 3 + ], + [ + 150, + 103, + 2 + ], + [ + 168, + 168, + 3 + ], + [ + 1032, + 181, + 3 + ], + [ + 148, + 148, + 3 + ], + [ + 1032, + 180, + 3 + ], + [ + 1033, + 170, + 3 + ], + [ + 176, + 176, + 3 + ], + [ + 158, + 173, + 1 + ], + [ + 1027, + 165, + 4 + ], + [ + 146, + 146, + 4 + ], + [ + 1033, + 168, + 3 + ], + [ + 133, + 133, + 4 + ], + [ + 166, + 166, + 3 + ], + [ + 151, + 103, + 2 + ], + [ + 165, + 165, + 3 + ], + [ + 1026, + 132, + 1 + ], + [ + 1027, + 166, + 4 + ], + [ + 147, + 147, + 4 + ], + [ + 1033, + 163, + 3 + ], + [ + 145, + 145, + 3 + ], + [ + 150, + 150, + 3 + ], + [ + 1026, + 133, + 5 + ], + [ + 1024, + 1024, + 1 + ], + [ + 189, + 189, + 2 + ], + [ + 1024, + 103, + 1 + ], + [ + 152, + 163, + 2 + ], + [ + 1033, + 158, + 3 + ], + [ + 156, + 156, + 4 + ], + [ + 1026, + 1024, + 3 + ], + [ + 1034, + 132, + 2 + ], + [ + 144, + 144, + 4 + ], + [ + 1027, + 172, + 4 + ], + [ + 1029, + 1029, + 1 + ], + [ + 1034, + 136, + 2 + ], + [ + 170, + 170, + 5 + ], + [ + 1027, + 173, + 4 + ], + [ + 1034, + 147, + 2 + ], + [ + 103, + 176, + 2 + ], + [ + 1034, + 146, + 2 + ], + [ + 1034, + 133, + 2 + ], + [ + 1034, + 138, + 2 + ], + [ + 1026, + 145, + 5 + ], + [ + 1027, + 180, + 4 + ], + [ + 1033, + 165, + 3 + ], + [ + 1026, + 148, + 1 + ], + [ + 1033, + 166, + 3 + ], + [ + 163, + 152, + 2 + ], + [ + 136, + 136, + 5 + ], + [ + 168, + 180, + 1 + ], + [ + 1034, + 144, + 2 + ], + [ + 1029, + 1024, + 1 + ], + [ + 1027, + 181, + 4 + ], + [ + 132, + 132, + 5 + ], + [ + 1026, + 149, + 1 + ], + [ + 151, + 151, + 4 + ], + [ + 1026, + 146, + 1 + ], + [ + 1026, + 147, + 1 + ], + [ + 1026, + 136, + 1 + ], + [ + 156, + 172, + 2 + ], + [ + 138, + 138, + 5 + ], + [ + 149, + 149, + 2 + ], + [ + 1026, + 138, + 1 + ], + [ + 152, + 152, + 2 + ], + [ + 158, + 165, + 1 + ], + [ + 1024, + 176, + 4 + ], + [ + 1026, + 132, + 5 + ], + [ + 148, + 148, + 6 + ], + [ + 104, + 104, + 4 + ], + [ + 156, + 166, + 1 + ], + [ + 1026, + 149, + 5 + ], + [ + 103, + 189, + 2 + ], + [ + 150, + 150, + 4 + ], + [ + 146, + 146, + 5 + ], + [ + 1037, + 152, + 5 + ], + [ + 165, + 158, + 1 + ], + [ + 177, + 177, + 4 + ], + [ + 170, + 170, + 6 + ], + [ + 147, + 147, + 5 + ], + [ + 1026, + 148, + 5 + ], + [ + 1034, + 145, + 2 + ], + [ + 179, + 136, + 2 + ], + [ + 1037, + 156, + 5 + ], + [ + 1033, + 173, + 3 + ], + [ + 166, + 156, + 1 + ], + [ + 133, + 133, + 5 + ], + [ + 158, + 168, + 1 + ], + [ + 148, + 148, + 2 + ], + [ + 1026, + 138, + 5 + ], + [ + 145, + 145, + 4 + ], + [ + 1026, + 136, + 5 + ], + [ + 1037, + 163, + 5 + ], + [ + 222, + 222, + 2 + ], + [ + 1033, + 181, + 3 + ], + [ + 1026, + 1024, + 1 + ], + [ + 152, + 104, + 1 + ], + [ + 166, + 168, + 1 + ], + [ + 165, + 168, + 1 + ], + [ + 1026, + 147, + 5 + ], + [ + 104, + 152, + 2 + ], + [ + 1026, + 146, + 5 + ], + [ + 149, + 149, + 6 + ], + [ + 1026, + 151, + 1 + ], + [ + 1033, + 180, + 3 + ], + [ + 144, + 144, + 2 + ], + [ + 1037, + 158, + 5 + ], + [ + 172, + 156, + 2 + ], + [ + 1026, + 145, + 1 + ], + [ + 1034, + 148, + 2 + ], + [ + 1026, + 150, + 1 + ], + [ + 103, + 179, + 2 + ], + [ + 163, + 104, + 1 + ], + [ + 165, + 152, + 1 + ], + [ + 166, + 152, + 1 + ], + [ + 144, + 1024, + 2 + ], + [ + 220, + 220, + 2 + ], + [ + 177, + 138, + 2 + ], + [ + 156, + 168, + 1 + ], + [ + 132, + 1024, + 2 + ], + [ + 133, + 1024, + 2 + ], + [ + 1037, + 168, + 5 + ], + [ + 1026, + 150, + 5 + ], + [ + 1037, + 170, + 5 + ], + [ + 158, + 152, + 1 + ], + [ + 1026, + 151, + 5 + ], + [ + 132, + 176, + 2 + ], + [ + 1033, + 172, + 3 + ], + [ + 147, + 1024, + 2 + ], + [ + 148, + 144, + 2 + ], + [ + 1034, + 149, + 2 + ], + [ + 103, + 136, + 4 + ], + [ + 173, + 158, + 2 + ], + [ + 146, + 1024, + 2 + ], + [ + 165, + 104, + 1 + ], + [ + 103, + 132, + 4 + ], + [ + 103, + 138, + 4 + ], + [ + 144, + 148, + 2 + ], + [ + 166, + 104, + 1 + ], + [ + 156, + 152, + 1 + ], + [ + 179, + 179, + 4 + ], + [ + 1031, + 132, + 6 + ], + [ + 145, + 145, + 5 + ], + [ + 189, + 189, + 3 + ], + [ + 1039, + 152, + 6 + ], + [ + 1036, + 132, + 4 + ], + [ + 1031, + 148, + 6 + ], + [ + 1034, + 151, + 2 + ], + [ + 1034, + 150, + 2 + ], + [ + 1026, + 103, + 5 + ], + [ + 163, + 170, + 1 + ], + [ + 1031, + 144, + 6 + ], + [ + 138, + 1024, + 2 + ], + [ + 1031, + 136, + 6 + ], + [ + 156, + 104, + 1 + ], + [ + 181, + 181, + 3 + ], + [ + 103, + 177, + 2 + ], + [ + 158, + 104, + 1 + ], + [ + 151, + 151, + 5 + ], + [ + 1031, + 133, + 6 + ], + [ + 148, + 1024, + 2 + ], + [ + 136, + 1024, + 2 + ], + [ + 103, + 133, + 4 + ], + [ + 176, + 132, + 2 + ], + [ + 168, + 168, + 2 + ], + [ + 1031, + 149, + 6 + ], + [ + 1031, + 146, + 6 + ], + [ + 1037, + 172, + 5 + ], + [ + 1038, + 163, + 2 + ], + [ + 1033, + 104, + 4 + ], + [ + 136, + 136, + 6 + ], + [ + 170, + 170, + 4 + ], + [ + 1036, + 133, + 4 + ], + [ + 1031, + 147, + 6 + ], + [ + 1037, + 165, + 5 + ], + [ + 1037, + 173, + 5 + ], + [ + 138, + 138, + 6 + ], + [ + 166, + 158, + 1 + ], + [ + 1039, + 156, + 6 + ], + [ + 1036, + 147, + 4 + ], + [ + 240, + 240, + 2 + ], + [ + 149, + 1024, + 2 + ], + [ + 103, + 146, + 4 + ], + [ + 1037, + 180, + 5 + ], + [ + 163, + 1025, + 1 + ], + [ + 1031, + 138, + 6 + ], + [ + 150, + 150, + 5 + ], + [ + 1036, + 146, + 4 + ], + [ + 1044, + 152, + 7 + ], + [ + 189, + 133, + 2 + ], + [ + 132, + 146, + 2 + ], + [ + 1036, + 145, + 4 + ], + [ + 163, + 152, + 3 + ], + [ + 1037, + 181, + 5 + ], + [ + 217, + 217, + 2 + ], + [ + 156, + 156, + 2 + ], + [ + 1036, + 144, + 4 + ], + [ + 146, + 132, + 2 + ], + [ + 147, + 133, + 2 + ], + [ + 157, + 157, + 2 + ], + [ + 1026, + 132, + 3 + ], + [ + 158, + 173, + 2 + ], + [ + 145, + 149, + 2 + ], + [ + 242, + 242, + 2 + ], + [ + 251, + 251, + 2 + ], + [ + 1039, + 163, + 6 + ], + [ + 219, + 219, + 2 + ], + [ + 103, + 147, + 4 + ], + [ + 236, + 236, + 2 + ], + [ + 1026, + 136, + 3 + ], + [ + 1038, + 168, + 2 + ], + [ + 132, + 149, + 2 + ], + [ + 151, + 151, + 2 + ], + [ + 1039, + 158, + 6 + ], + [ + 132, + 147, + 2 + ], + [ + 148, + 133, + 2 + ], + [ + 1026, + 138, + 3 + ], + [ + 1039, + 168, + 6 + ], + [ + 1037, + 166, + 5 + ], + [ + 170, + 104, + 1 + ], + [ + 176, + 145, + 2 + ], + [ + 1031, + 145, + 6 + ], + [ + 146, + 136, + 2 + ], + [ + 132, + 136, + 2 + ], + [ + 1039, + 170, + 6 + ], + [ + 180, + 168, + 2 + ], + [ + 146, + 133, + 2 + ], + [ + 165, + 165, + 4 + ], + [ + 246, + 246, + 2 + ], + [ + 132, + 138, + 2 + ], + [ + 1044, + 156, + 7 + ], + [ + 147, + 144, + 2 + ], + [ + 158, + 158, + 2 + ], + [ + 104, + 168, + 2 + ], + [ + 1026, + 148, + 3 + ], + [ + 1038, + 170, + 2 + ], + [ + 1026, + 149, + 3 + ], + [ + 147, + 138, + 2 + ], + [ + 1029, + 1024, + 3 + ], + [ + 247, + 247, + 2 + ], + [ + 163, + 163, + 5 + ], + [ + 1026, + 150, + 3 + ], + [ + 223, + 223, + 2 + ], + [ + 166, + 166, + 4 + ], + [ + 1035, + 147, + 4 + ], + [ + 136, + 146, + 2 + ], + [ + 1038, + 152, + 2 + ], + [ + 132, + 148, + 2 + ], + [ + 165, + 156, + 1 + ], + [ + 168, + 104, + 1 + ], + [ + 1036, + 136, + 4 + ], + [ + 1026, + 145, + 3 + ], + [ + 1031, + 151, + 6 + ], + [ + 136, + 133, + 2 + ], + [ + 222, + 222, + 3 + ], + [ + 1035, + 132, + 4 + ], + [ + 1036, + 138, + 4 + ], + [ + 170, + 152, + 1 + ], + [ + 181, + 181, + 4 + ], + [ + 173, + 173, + 3 + ], + [ + 145, + 1024, + 2 + ], + [ + 1029, + 103, + 3 + ], + [ + 1026, + 1057, + 1 + ], + [ + 1038, + 156, + 2 + ], + [ + 150, + 150, + 2 + ], + [ + 180, + 104, + 1 + ], + [ + 1029, + 176, + 6 + ], + [ + 216, + 216, + 2 + ], + [ + 1026, + 146, + 3 + ], + [ + 146, + 144, + 2 + ], + [ + 138, + 177, + 2 + ], + [ + 149, + 149, + 7 + ], + [ + 103, + 103, + 3 + ], + [ + 1031, + 150, + 6 + ], + [ + 1044, + 163, + 7 + ], + [ + 1044, + 158, + 7 + ], + [ + 1026, + 151, + 3 + ], + [ + 138, + 147, + 2 + ], + [ + 172, + 104, + 1 + ], + [ + 138, + 133, + 2 + ], + [ + 1026, + 147, + 3 + ], + [ + 1044, + 168, + 7 + ], + [ + 136, + 179, + 2 + ], + [ + 170, + 163, + 1 + ], + [ + 144, + 146, + 2 + ], + [ + 1024, + 189, + 4 + ], + [ + 1039, + 172, + 6 + ], + [ + 144, + 147, + 2 + ], + [ + 214, + 214, + 2 + ], + [ + 1039, + 180, + 6 + ], + [ + 215, + 215, + 2 + ], + [ + 1038, + 158, + 2 + ], + [ + 349, + 349, + 2 + ], + [ + 339, + 339, + 2 + ], + [ + 149, + 145, + 2 + ], + [ + 133, + 148, + 2 + ], + [ + 151, + 1024, + 2 + ], + [ + 176, + 176, + 4 + ], + [ + 166, + 1025, + 1 + ], + [ + 133, + 146, + 2 + ], + [ + 1026, + 1049, + 1 + ], + [ + 220, + 220, + 3 + ], + [ + 150, + 1024, + 2 + ], + [ + 228, + 228, + 2 + ], + [ + 1039, + 181, + 6 + ], + [ + 165, + 1025, + 1 + ], + [ + 1039, + 173, + 6 + ], + [ + 147, + 132, + 2 + ], + [ + 133, + 136, + 2 + ], + [ + 138, + 132, + 2 + ], + [ + 149, + 132, + 2 + ], + [ + 1033, + 163, + 1 + ], + [ + 164, + 164, + 2 + ], + [ + 1044, + 170, + 7 + ], + [ + 148, + 136, + 2 + ], + [ + 181, + 104, + 1 + ], + [ + 133, + 147, + 2 + ], + [ + 103, + 215, + 2 + ], + [ + 1035, + 147, + 2 + ], + [ + 152, + 156, + 1 + ], + [ + 103, + 226, + 2 + ], + [ + 1038, + 165, + 2 + ], + [ + 313, + 313, + 2 + ], + [ + 133, + 138, + 2 + ], + [ + 1044, + 173, + 7 + ], + [ + 103, + 224, + 2 + ], + [ + 1036, + 148, + 4 + ], + [ + 144, + 138, + 2 + ], + [ + 1038, + 166, + 2 + ], + [ + 144, + 136, + 2 + ], + [ + 103, + 214, + 2 + ], + [ + 1035, + 146, + 2 + ], + [ + 152, + 158, + 1 + ], + [ + 361, + 361, + 2 + ], + [ + 173, + 104, + 1 + ], + [ + 1044, + 172, + 7 + ], + [ + 177, + 177, + 5 + ], + [ + 133, + 189, + 2 + ], + [ + 103, + 217, + 2 + ], + [ + 103, + 219, + 2 + ], + [ + 231, + 231, + 2 + ], + [ + 152, + 165, + 1 + ], + [ + 1039, + 165, + 6 + ], + [ + 162, + 162, + 2 + ], + [ + 136, + 132, + 2 + ], + [ + 179, + 179, + 5 + ], + [ + 1044, + 180, + 7 + ], + [ + 145, + 176, + 2 + ], + [ + 1026, + 1060, + 1 + ], + [ + 314, + 314, + 2 + ], + [ + 152, + 166, + 1 + ], + [ + 148, + 132, + 2 + ], + [ + 103, + 223, + 2 + ], + [ + 138, + 144, + 2 + ], + [ + 1033, + 156, + 1 + ], + [ + 230, + 230, + 2 + ], + [ + 168, + 158, + 1 + ], + [ + 104, + 163, + 2 + ], + [ + 1035, + 146, + 4 + ], + [ + 136, + 144, + 2 + ], + [ + 1044, + 181, + 7 + ], + [ + 168, + 165, + 1 + ], + [ + 152, + 1025, + 1 + ], + [ + 168, + 156, + 1 + ], + [ + 168, + 166, + 1 + ], + [ + 1036, + 149, + 4 + ], + [ + 1057, + 1026, + 1 + ], + [ + 136, + 148, + 2 + ], + [ + 1047, + 152, + 1 + ], + [ + 1039, + 166, + 6 + ], + [ + 138, + 151, + 3 + ], + [ + 180, + 180, + 3 + ], + [ + 224, + 224, + 2 + ], + [ + 113, + 113, + 2 + ], + [ + 1068, + 144, + 6 + ], + [ + 103, + 228, + 2 + ], + [ + 1035, + 132, + 2 + ], + [ + 104, + 245, + 1 + ], + [ + 156, + 165, + 1 + ], + [ + 156, + 1025, + 1 + ], + [ + 235, + 235, + 2 + ], + [ + 170, + 1025, + 1 + ], + [ + 1053, + 133, + 7 + ], + [ + 1033, + 158, + 1 + ], + [ + 145, + 146, + 2 + ], + [ + 1038, + 172, + 2 + ], + [ + 1044, + 165, + 7 + ], + [ + 1033, + 170, + 1 + ], + [ + 328, + 328, + 2 + ], + [ + 233, + 233, + 3 + ], + [ + 217, + 217, + 3 + ], + [ + 149, + 138, + 2 + ], + [ + 158, + 166, + 1 + ], + [ + 1036, + 150, + 4 + ], + [ + 1024, + 1026, + 1 + ], + [ + 181, + 181, + 5 + ], + [ + 221, + 221, + 2 + ], + [ + 149, + 133, + 2 + ], + [ + 242, + 242, + 3 + ], + [ + 103, + 230, + 2 + ], + [ + 147, + 136, + 2 + ], + [ + 1053, + 144, + 7 + ], + [ + 146, + 148, + 2 + ], + [ + 234, + 234, + 2 + ], + [ + 146, + 145, + 2 + ], + [ + 1047, + 163, + 1 + ], + [ + 1038, + 173, + 2 + ], + [ + 151, + 151, + 6 + ], + [ + 146, + 138, + 2 + ], + [ + 1053, + 145, + 7 + ], + [ + 1049, + 1026, + 1 + ], + [ + 367, + 367, + 2 + ], + [ + 1026, + 1046, + 1 + ], + [ + 366, + 366, + 2 + ], + [ + 226, + 226, + 2 + ], + [ + 172, + 172, + 3 + ], + [ + 1033, + 166, + 1 + ], + [ + 1033, + 165, + 1 + ], + [ + 382, + 382, + 2 + ], + [ + 144, + 144, + 5 + ], + [ + 1033, + 168, + 1 + ], + [ + 1044, + 166, + 7 + ], + [ + 165, + 163, + 1 + ], + [ + 1026, + 1048, + 1 + ], + [ + 117, + 117, + 2 + ], + [ + 104, + 166, + 2 + ], + [ + 219, + 219, + 3 + ], + [ + 158, + 1025, + 1 + ], + [ + 136, + 150, + 3 + ], + [ + 147, + 148, + 2 + ], + [ + 246, + 246, + 3 + ], + [ + 114, + 114, + 2 + ], + [ + 103, + 235, + 2 + ], + [ + 154, + 154, + 2 + ], + [ + 138, + 148, + 2 + ], + [ + 1047, + 170, + 1 + ], + [ + 259, + 259, + 2 + ], + [ + 243, + 243, + 2 + ], + [ + 1053, + 132, + 7 + ], + [ + 239, + 239, + 2 + ], + [ + 145, + 136, + 2 + ], + [ + 1024, + 179, + 4 + ], + [ + 244, + 244, + 2 + ], + [ + 1035, + 145, + 4 + ], + [ + 1036, + 151, + 4 + ], + [ + 1024, + 177, + 4 + ], + [ + 159, + 159, + 2 + ], + [ + 236, + 236, + 3 + ], + [ + 150, + 146, + 2 + ], + [ + 104, + 156, + 2 + ], + [ + 149, + 136, + 2 + ], + [ + 148, + 146, + 2 + ], + [ + 1026, + 1064, + 1 + ], + [ + 1026, + 1055, + 1 + ], + [ + 144, + 1029, + 2 + ], + [ + 170, + 156, + 1 + ], + [ + 240, + 240, + 3 + ], + [ + 148, + 147, + 2 + ], + [ + 104, + 158, + 2 + ], + [ + 1068, + 133, + 6 + ], + [ + 260, + 260, + 2 + ], + [ + 1038, + 181, + 2 + ], + [ + 148, + 138, + 2 + ], + [ + 163, + 165, + 1 + ], + [ + 241, + 241, + 3 + ], + [ + 151, + 147, + 2 + ], + [ + 1031, + 189, + 2 + ], + [ + 214, + 214, + 3 + ], + [ + 1053, + 147, + 7 + ], + [ + 1038, + 180, + 2 + ], + [ + 138, + 149, + 2 + ], + [ + 103, + 233, + 2 + ], + [ + 104, + 165, + 2 + ], + [ + 1026, + 1063, + 1 + ], + [ + 144, + 189, + 2 + ], + [ + 146, + 132, + 1 + ], + [ + 1035, + 133, + 2 + ], + [ + 1026, + 1065, + 1 + ], + [ + 150, + 133, + 2 + ], + [ + 145, + 147, + 2 + ], + [ + 136, + 147, + 2 + ], + [ + 1026, + 1071, + 1 + ], + [ + 166, + 163, + 1 + ], + [ + 1031, + 176, + 2 + ], + [ + 1026, + 1041, + 1 + ], + [ + 155, + 155, + 2 + ], + [ + 1035, + 145, + 2 + ], + [ + 103, + 222, + 2 + ], + [ + 133, + 1029, + 2 + ], + [ + 138, + 146, + 2 + ], + [ + 103, + 220, + 2 + ], + [ + 1062, + 132, + 4 + ], + [ + 168, + 1025, + 1 + ], + [ + 215, + 215, + 3 + ], + [ + 152, + 170, + 1 + ], + [ + 1033, + 173, + 1 + ], + [ + 149, + 147, + 2 + ], + [ + 1035, + 136, + 2 + ], + [ + 231, + 231, + 3 + ], + [ + 163, + 166, + 1 + ], + [ + 149, + 146, + 2 + ], + [ + 172, + 1025, + 1 + ], + [ + 103, + 248, + 2 + ], + [ + 176, + 145, + 3 + ], + [ + 1046, + 133, + 4 + ], + [ + 220, + 132, + 2 + ], + [ + 1047, + 156, + 1 + ], + [ + 1029, + 189, + 6 + ], + [ + 1046, + 1026, + 1 + ], + [ + 151, + 144, + 2 + ], + [ + 179, + 150, + 3 + ], + [ + 1068, + 145, + 6 + ], + [ + 138, + 177, + 3 + ], + [ + 173, + 1025, + 1 + ], + [ + 223, + 223, + 3 + ], + [ + 1032, + 245, + 3 + ], + [ + 237, + 237, + 2 + ], + [ + 110, + 110, + 2 + ], + [ + 156, + 170, + 1 + ], + [ + 151, + 132, + 2 + ], + [ + 1053, + 146, + 7 + ], + [ + 1053, + 136, + 7 + ], + [ + 1053, + 138, + 7 + ], + [ + 1035, + 133, + 4 + ], + [ + 104, + 172, + 2 + ], + [ + 1041, + 1026, + 1 + ], + [ + 151, + 148, + 2 + ], + [ + 103, + 148, + 4 + ], + [ + 173, + 165, + 1 + ], + [ + 146, + 150, + 2 + ], + [ + 232, + 232, + 2 + ], + [ + 133, + 222, + 2 + ], + [ + 153, + 153, + 2 + ], + [ + 1047, + 158, + 1 + ], + [ + 1035, + 148, + 2 + ], + [ + 147, + 1029, + 2 + ], + [ + 103, + 243, + 2 + ], + [ + 1033, + 172, + 1 + ], + [ + 245, + 245, + 3 + ], + [ + 103, + 244, + 2 + ], + [ + 166, + 172, + 1 + ], + [ + 180, + 180, + 4 + ], + [ + 1035, + 144, + 2 + ], + [ + 132, + 1029, + 2 + ], + [ + 149, + 144, + 2 + ], + [ + 249, + 249, + 3 + ], + [ + 224, + 224, + 3 + ], + [ + 147, + 145, + 2 + ], + [ + 104, + 170, + 2 + ], + [ + 233, + 233, + 2 + ], + [ + 146, + 1029, + 2 + ], + [ + 1026, + 1073, + 1 + ], + [ + 165, + 173, + 1 + ], + [ + 136, + 179, + 3 + ], + [ + 181, + 181, + 6 + ], + [ + 362, + 362, + 2 + ], + [ + 151, + 177, + 3 + ], + [ + 150, + 144, + 2 + ], + [ + 150, + 132, + 2 + ], + [ + 158, + 163, + 1 + ], + [ + 104, + 173, + 2 + ], + [ + 103, + 231, + 2 + ], + [ + 147, + 149, + 2 + ], + [ + 1047, + 165, + 1 + ], + [ + 1072, + 163, + 2 + ], + [ + 176, + 275, + 2 + ], + [ + 1024, + 223, + 4 + ], + [ + 1035, + 136, + 4 + ], + [ + 1053, + 149, + 7 + ], + [ + 1072, + 152, + 2 + ], + [ + 150, + 148, + 2 + ], + [ + 151, + 133, + 2 + ], + [ + 103, + 250, + 2 + ], + [ + 145, + 138, + 2 + ], + [ + 103, + 252, + 2 + ], + [ + 1026, + 1049, + 3 + ], + [ + 168, + 180, + 2 + ], + [ + 133, + 1067, + 2 + ], + [ + 226, + 226, + 3 + ], + [ + 1035, + 138, + 4 + ], + [ + 1068, + 132, + 6 + ], + [ + 150, + 179, + 2 + ], + [ + 1047, + 166, + 1 + ], + [ + 1026, + 1057, + 3 + ], + [ + 172, + 166, + 1 + ], + [ + 163, + 158, + 1 + ], + [ + 1035, + 149, + 2 + ], + [ + 228, + 228, + 3 + ], + [ + 1024, + 214, + 4 + ], + [ + 1050, + 132, + 4 + ], + [ + 156, + 163, + 1 + ], + [ + 103, + 241, + 2 + ], + [ + 268, + 268, + 2 + ], + [ + 103, + 249, + 2 + ], + [ + 148, + 1029, + 2 + ], + [ + 170, + 168, + 1 + ], + [ + 1024, + 215, + 4 + ], + [ + 265, + 265, + 2 + ], + [ + 146, + 149, + 2 + ], + [ + 189, + 189, + 4 + ], + [ + 177, + 151, + 2 + ], + [ + 1048, + 1026, + 1 + ], + [ + 147, + 151, + 2 + ], + [ + 1042, + 145, + 4 + ], + [ + 177, + 138, + 3 + ], + [ + 103, + 254, + 2 + ], + [ + 1026, + 1060, + 3 + ], + [ + 136, + 149, + 2 + ], + [ + 133, + 149, + 2 + ], + [ + 1083, + 146, + 4 + ], + [ + 1026, + 1080, + 1 + ], + [ + 163, + 156, + 1 + ], + [ + 1042, + 132, + 4 + ], + [ + 180, + 1025, + 1 + ], + [ + 1041, + 144, + 4 + ], + [ + 1055, + 1026, + 1 + ], + [ + 136, + 1029, + 2 + ], + [ + 1068, + 149, + 6 + ], + [ + 1035, + 144, + 4 + ], + [ + 136, + 145, + 2 + ], + [ + 1035, + 138, + 2 + ], + [ + 1047, + 173, + 1 + ], + [ + 138, + 145, + 2 + ], + [ + 230, + 230, + 3 + ], + [ + 181, + 1025, + 1 + ], + [ + 1040, + 170, + 2 + ], + [ + 1047, + 168, + 1 + ], + [ + 1064, + 1026, + 1 + ], + [ + 132, + 151, + 2 + ], + [ + 179, + 150, + 2 + ], + [ + 241, + 241, + 2 + ], + [ + 275, + 275, + 2 + ], + [ + 158, + 158, + 5 + ], + [ + 1033, + 180, + 1 + ], + [ + 1026, + 1048, + 3 + ], + [ + 1026, + 1082, + 1 + ], + [ + 1047, + 172, + 1 + ], + [ + 1068, + 147, + 6 + ], + [ + 132, + 1031, + 2 + ], + [ + 1060, + 1026, + 1 + ], + [ + 103, + 236, + 2 + ], + [ + 138, + 1029, + 2 + ], + [ + 1056, + 151, + 2 + ], + [ + 148, + 144, + 1 + ], + [ + 1024, + 219, + 4 + ], + [ + 1035, + 149, + 4 + ], + [ + 1072, + 156, + 2 + ], + [ + 172, + 163, + 1 + ], + [ + 215, + 132, + 2 + ], + [ + 179, + 136, + 3 + ], + [ + 223, + 132, + 2 + ], + [ + 1024, + 217, + 4 + ], + [ + 103, + 255, + 2 + ], + [ + 150, + 147, + 2 + ], + [ + 103, + 240, + 2 + ], + [ + 103, + 257, + 2 + ], + [ + 220, + 220, + 4 + ], + [ + 1063, + 1026, + 1 + ], + [ + 1085, + 147, + 4 + ], + [ + 1035, + 148, + 4 + ], + [ + 1024, + 224, + 4 + ], + [ + 1031, + 177, + 2 + ], + [ + 151, + 177, + 2 + ], + [ + 152, + 104, + 2 + ], + [ + 1065, + 1026, + 1 + ], + [ + 1071, + 1026, + 1 + ], + [ + 166, + 166, + 5 + ], + [ + 1024, + 228, + 4 + ], + [ + 103, + 258, + 2 + ], + [ + 214, + 132, + 2 + ], + [ + 173, + 163, + 1 + ], + [ + 222, + 222, + 4 + ], + [ + 1024, + 226, + 4 + ], + [ + 145, + 148, + 2 + ], + [ + 1025, + 245, + 2 + ], + [ + 133, + 147, + 1 + ], + [ + 1074, + 152, + 3 + ], + [ + 1031, + 179, + 2 + ], + [ + 165, + 165, + 5 + ], + [ + 1072, + 170, + 2 + ], + [ + 235, + 235, + 3 + ], + [ + 1074, + 163, + 3 + ], + [ + 1091, + 138, + 2 + ], + [ + 1068, + 146, + 6 + ], + [ + 147, + 133, + 1 + ], + [ + 217, + 217, + 4 + ], + [ + 104, + 181, + 2 + ], + [ + 170, + 158, + 1 + ], + [ + 150, + 179, + 3 + ], + [ + 1074, + 170, + 3 + ], + [ + 104, + 180, + 2 + ], + [ + 1026, + 1042, + 1 + ], + [ + 248, + 248, + 2 + ], + [ + 103, + 261, + 2 + ], + [ + 242, + 242, + 4 + ], + [ + 133, + 1041, + 2 + ], + [ + 219, + 147, + 2 + ], + [ + 1026, + 1043, + 1 + ], + [ + 132, + 150, + 2 + ], + [ + 1089, + 136, + 2 + ], + [ + 1026, + 1041, + 5 + ], + [ + 189, + 144, + 2 + ], + [ + 1072, + 158, + 2 + ], + [ + 1068, + 136, + 6 + ], + [ + 163, + 172, + 1 + ], + [ + 167, + 167, + 2 + ], + [ + 1040, + 170, + 4 + ], + [ + 1034, + 189, + 2 + ], + [ + 1033, + 181, + 1 + ], + [ + 1024, + 230, + 4 + ], + [ + 163, + 1032, + 1 + ], + [ + 149, + 1029, + 2 + ], + [ + 146, + 136, + 1 + ], + [ + 177, + 151, + 3 + ], + [ + 1026, + 1045, + 1 + ], + [ + 148, + 148, + 7 + ], + [ + 228, + 132, + 2 + ], + [ + 1068, + 138, + 6 + ], + [ + 1074, + 168, + 3 + ], + [ + 146, + 133, + 1 + ], + [ + 181, + 168, + 1 + ], + [ + 219, + 138, + 2 + ], + [ + 215, + 136, + 2 + ], + [ + 243, + 243, + 3 + ], + [ + 214, + 138, + 2 + ], + [ + 1026, + 1051, + 1 + ], + [ + 145, + 1031, + 2 + ], + [ + 150, + 149, + 2 + ], + [ + 173, + 152, + 1 + ], + [ + 133, + 146, + 1 + ], + [ + 246, + 246, + 4 + ], + [ + 1024, + 248, + 4 + ], + [ + 1026, + 1063, + 3 + ], + [ + 105, + 105, + 2 + ], + [ + 136, + 146, + 1 + ], + [ + 144, + 148, + 1 + ], + [ + 103, + 262, + 2 + ], + [ + 172, + 152, + 1 + ], + [ + 1073, + 1026, + 1 + ], + [ + 176, + 176, + 5 + ], + [ + 1042, + 1026, + 1 + ], + [ + 1026, + 1055, + 3 + ], + [ + 1186, + 163, + 1 + ], + [ + 147, + 150, + 2 + ], + [ + 168, + 170, + 1 + ], + [ + 1026, + 1046, + 3 + ], + [ + 1026, + 1046, + 5 + ], + [ + 1024, + 222, + 4 + ], + [ + 259, + 259, + 3 + ], + [ + 1026, + 1052, + 1 + ], + [ + 1024, + 235, + 4 + ], + [ + 249, + 249, + 2 + ], + [ + 172, + 170, + 1 + ], + [ + 149, + 150, + 2 + ], + [ + 132, + 144, + 2 + ], + [ + 163, + 173, + 1 + ], + [ + 1053, + 148, + 7 + ], + [ + 1072, + 168, + 2 + ], + [ + 145, + 150, + 2 + ], + [ + 156, + 104, + 2 + ], + [ + 1040, + 152, + 1 + ], + [ + 179, + 103, + 2 + ], + [ + 147, + 1031, + 2 + ], + [ + 244, + 244, + 3 + ], + [ + 1043, + 150, + 4 + ], + [ + 151, + 1029, + 2 + ], + [ + 177, + 103, + 2 + ], + [ + 176, + 103, + 2 + ], + [ + 158, + 170, + 1 + ], + [ + 132, + 1042, + 2 + ], + [ + 1040, + 152, + 4 + ], + [ + 231, + 138, + 2 + ], + [ + 165, + 170, + 1 + ], + [ + 1051, + 1026, + 1 + ], + [ + 145, + 1029, + 2 + ], + [ + 1068, + 148, + 6 + ], + [ + 163, + 1077, + 1 + ], + [ + 1024, + 220, + 4 + ], + [ + 181, + 158, + 1 + ], + [ + 144, + 133, + 3 + ], + [ + 1034, + 1026, + 1 + ], + [ + 228, + 147, + 2 + ], + [ + 151, + 146, + 2 + ], + [ + 166, + 170, + 1 + ], + [ + 250, + 250, + 3 + ], + [ + 245, + 245, + 2 + ], + [ + 189, + 103, + 2 + ], + [ + 149, + 1031, + 2 + ], + [ + 1026, + 1042, + 5 + ], + [ + 173, + 170, + 1 + ], + [ + 296, + 296, + 2 + ], + [ + 136, + 133, + 1 + ], + [ + 166, + 104, + 2 + ], + [ + 1043, + 1026, + 1 + ], + [ + 260, + 260, + 3 + ], + [ + 1110, + 177, + 4 + ], + [ + 146, + 151, + 2 + ], + [ + 1056, + 138, + 5 + ], + [ + 1040, + 163, + 2 + ], + [ + 1026, + 1034, + 1 + ], + [ + 146, + 1031, + 2 + ], + [ + 1052, + 1026, + 1 + ], + [ + 1026, + 1064, + 3 + ], + [ + 115, + 115, + 2 + ], + [ + 236, + 132, + 2 + ], + [ + 1053, + 150, + 7 + ], + [ + 1032, + 1025, + 4 + ], + [ + 145, + 176, + 3 + ], + [ + 133, + 136, + 1 + ], + [ + 224, + 138, + 2 + ], + [ + 1068, + 150, + 6 + ], + [ + 1026, + 1050, + 1 + ], + [ + 447, + 447, + 2 + ], + [ + 1072, + 173, + 2 + ], + [ + 1026, + 1058, + 1 + ], + [ + 1026, + 1071, + 3 + ], + [ + 144, + 1031, + 2 + ], + [ + 223, + 146, + 2 + ], + [ + 168, + 104, + 2 + ], + [ + 1045, + 1026, + 1 + ], + [ + 1035, + 150, + 2 + ], + [ + 1024, + 233, + 4 + ], + [ + 133, + 150, + 2 + ], + [ + 181, + 152, + 1 + ], + [ + 1053, + 151, + 7 + ], + [ + 1026, + 1050, + 5 + ], + [ + 165, + 104, + 2 + ], + [ + 217, + 146, + 2 + ], + [ + 1074, + 156, + 3 + ], + [ + 217, + 136, + 2 + ], + [ + 1025, + 152, + 3 + ], + [ + 157, + 157, + 3 + ], + [ + 1035, + 150, + 4 + ], + [ + 1072, + 172, + 2 + ], + [ + 138, + 147, + 1 + ], + [ + 1047, + 180, + 1 + ], + [ + 1077, + 163, + 2 + ], + [ + 1024, + 250, + 4 + ], + [ + 148, + 150, + 2 + ], + [ + 103, + 263, + 2 + ], + [ + 133, + 1031, + 2 + ], + [ + 148, + 1031, + 2 + ], + [ + 1068, + 151, + 6 + ], + [ + 1026, + 1065, + 3 + ], + [ + 147, + 138, + 1 + ], + [ + 156, + 156, + 5 + ], + [ + 1045, + 151, + 4 + ], + [ + 144, + 151, + 2 + ], + [ + 1040, + 163, + 4 + ], + [ + 1024, + 252, + 4 + ], + [ + 132, + 146, + 1 + ], + [ + 133, + 151, + 2 + ], + [ + 306, + 306, + 2 + ], + [ + 1026, + 1041, + 3 + ], + [ + 272, + 272, + 2 + ], + [ + 254, + 264, + 1 + ], + [ + 180, + 180, + 5 + ], + [ + 1029, + 223, + 6 + ], + [ + 1116, + 179, + 4 + ], + [ + 144, + 150, + 2 + ], + [ + 222, + 133, + 2 + ], + [ + 1080, + 1026, + 1 + ], + [ + 138, + 132, + 1 + ], + [ + 145, + 151, + 2 + ], + [ + 240, + 240, + 4 + ], + [ + 103, + 267, + 2 + ], + [ + 1081, + 172, + 2 + ], + [ + 158, + 181, + 1 + ], + [ + 1051, + 146, + 4 + ], + [ + 235, + 146, + 2 + ], + [ + 1031, + 1088, + 2 + ], + [ + 148, + 151, + 2 + ], + [ + 170, + 173, + 1 + ], + [ + 214, + 214, + 4 + ], + [ + 219, + 219, + 4 + ], + [ + 168, + 181, + 1 + ], + [ + 149, + 151, + 2 + ], + [ + 1047, + 181, + 1 + ], + [ + 170, + 172, + 1 + ], + [ + 1026, + 1045, + 5 + ], + [ + 136, + 1061, + 1 + ], + [ + 1024, + 243, + 4 + ], + [ + 1072, + 165, + 2 + ], + [ + 1026, + 1054, + 1 + ], + [ + 132, + 147, + 1 + ], + [ + 302, + 302, + 2 + ], + [ + 1026, + 1043, + 5 + ], + [ + 158, + 104, + 2 + ], + [ + 1032, + 246, + 3 + ], + [ + 144, + 189, + 3 + ], + [ + 1024, + 254, + 4 + ], + [ + 1032, + 242, + 3 + ], + [ + 103, + 264, + 2 + ], + [ + 1024, + 244, + 4 + ], + [ + 1040, + 166, + 2 + ], + [ + 1074, + 158, + 3 + ], + [ + 287, + 287, + 2 + ], + [ + 1084, + 173, + 2 + ], + [ + 1029, + 228, + 6 + ], + [ + 230, + 147, + 2 + ], + [ + 1088, + 149, + 2 + ], + [ + 233, + 233, + 4 + ], + [ + 136, + 132, + 1 + ], + [ + 170, + 165, + 1 + ], + [ + 1082, + 1026, + 1 + ], + [ + 150, + 145, + 2 + ], + [ + 226, + 226, + 4 + ], + [ + 103, + 266, + 2 + ], + [ + 1040, + 152, + 2 + ], + [ + 1045, + 138, + 4 + ], + [ + 1024, + 257, + 4 + ], + [ + 1024, + 231, + 4 + ], + [ + 147, + 132, + 1 + ], + [ + 1035, + 151, + 2 + ], + [ + 144, + 149, + 2 + ], + [ + 1029, + 177, + 6 + ], + [ + 1029, + 179, + 6 + ], + [ + 294, + 294, + 2 + ], + [ + 132, + 220, + 2 + ], + [ + 103, + 269, + 2 + ], + [ + 1072, + 166, + 2 + ], + [ + 1029, + 214, + 6 + ], + [ + 260, + 172, + 1 + ], + [ + 1032, + 1086, + 3 + ], + [ + 180, + 181, + 1 + ], + [ + 224, + 133, + 2 + ], + [ + 1024, + 236, + 4 + ], + [ + 1031, + 1094, + 2 + ], + [ + 215, + 215, + 4 + ], + [ + 141, + 141, + 2 + ], + [ + 231, + 231, + 4 + ], + [ + 265, + 265, + 3 + ], + [ + 1052, + 147, + 4 + ], + [ + 145, + 248, + 2 + ], + [ + 152, + 173, + 1 + ], + [ + 1027, + 245, + 4 + ], + [ + 164, + 164, + 3 + ], + [ + 1058, + 1026, + 1 + ], + [ + 103, + 1061, + 2 + ], + [ + 145, + 1050, + 2 + ], + [ + 138, + 133, + 1 + ], + [ + 177, + 177, + 6 + ], + [ + 1025, + 168, + 3 + ], + [ + 1026, + 1052, + 5 + ], + [ + 166, + 180, + 1 + ], + [ + 1024, + 261, + 4 + ], + [ + 151, + 149, + 2 + ], + [ + 1024, + 258, + 4 + ], + [ + 251, + 251, + 1 + ], + [ + 1026, + 1051, + 5 + ], + [ + 148, + 145, + 2 + ], + [ + 1074, + 165, + 3 + ], + [ + 163, + 181, + 1 + ], + [ + 103, + 274, + 2 + ], + [ + 176, + 248, + 2 + ], + [ + 292, + 292, + 2 + ], + [ + 257, + 257, + 2 + ], + [ + 152, + 172, + 1 + ], + [ + 1035, + 151, + 4 + ], + [ + 103, + 277, + 2 + ], + [ + 241, + 241, + 4 + ], + [ + 1074, + 166, + 3 + ], + [ + 165, + 172, + 1 + ], + [ + 1029, + 215, + 6 + ], + [ + 1026, + 1058, + 5 + ], + [ + 1032, + 265, + 3 + ], + [ + 149, + 240, + 2 + ], + [ + 136, + 217, + 2 + ], + [ + 168, + 168, + 4 + ], + [ + 136, + 1031, + 2 + ], + [ + 113, + 113, + 3 + ], + [ + 140, + 140, + 2 + ], + [ + 1026, + 144, + 7 + ], + [ + 1029, + 1075, + 5 + ], + [ + 250, + 250, + 2 + ], + [ + 181, + 180, + 1 + ], + [ + 104, + 242, + 1 + ], + [ + 1040, + 173, + 2 + ], + [ + 138, + 1031, + 2 + ], + [ + 1024, + 255, + 4 + ], + [ + 132, + 236, + 2 + ], + [ + 252, + 267, + 1 + ], + [ + 136, + 1070, + 2 + ], + [ + 1026, + 1069, + 1 + ], + [ + 149, + 1058, + 2 + ], + [ + 151, + 145, + 2 + ], + [ + 1025, + 1086, + 2 + ], + [ + 132, + 215, + 2 + ], + [ + 103, + 276, + 2 + ], + [ + 146, + 223, + 2 + ], + [ + 1024, + 240, + 4 + ], + [ + 104, + 1086, + 1 + ], + [ + 1040, + 165, + 2 + ], + [ + 133, + 138, + 1 + ], + [ + 144, + 1046, + 2 + ], + [ + 179, + 179, + 6 + ], + [ + 132, + 223, + 2 + ], + [ + 150, + 1029, + 2 + ], + [ + 1024, + 249, + 4 + ], + [ + 1026, + 1066, + 1 + ], + [ + 1040, + 163, + 1 + ], + [ + 156, + 181, + 1 + ], + [ + 296, + 176, + 2 + ], + [ + 165, + 180, + 1 + ], + [ + 1026, + 1073, + 3 + ], + [ + 144, + 1041, + 2 + ], + [ + 220, + 220, + 5 + ], + [ + 1072, + 180, + 2 + ], + [ + 1025, + 242, + 2 + ], + [ + 1026, + 1050, + 3 + ], + [ + 236, + 236, + 4 + ], + [ + 271, + 271, + 3 + ], + [ + 117, + 117, + 3 + ], + [ + 348, + 348, + 2 + ], + [ + 1066, + 138, + 4 + ], + [ + 133, + 224, + 2 + ], + [ + 132, + 228, + 2 + ], + [ + 146, + 217, + 2 + ], + [ + 132, + 214, + 2 + ], + [ + 162, + 162, + 3 + ], + [ + 170, + 166, + 1 + ], + [ + 1026, + 1042, + 3 + ], + [ + 147, + 219, + 2 + ], + [ + 1024, + 241, + 4 + ], + [ + 270, + 270, + 3 + ], + [ + 189, + 189, + 5 + ], + [ + 133, + 230, + 2 + ], + [ + 136, + 1043, + 2 + ], + [ + 1024, + 1056, + 4 + ], + [ + 136, + 215, + 2 + ], + [ + 151, + 1031, + 2 + ], + [ + 244, + 147, + 2 + ], + [ + 103, + 282, + 2 + ], + [ + 1029, + 248, + 6 + ], + [ + 259, + 173, + 1 + ], + [ + 303, + 303, + 2 + ], + [ + 150, + 1031, + 2 + ], + [ + 1040, + 156, + 2 + ], + [ + 133, + 226, + 2 + ], + [ + 216, + 216, + 3 + ], + [ + 1095, + 163, + 3 + ], + [ + 1104, + 172, + 3 + ], + [ + 148, + 1054, + 2 + ], + [ + 176, + 302, + 2 + ], + [ + 1026, + 1058, + 3 + ], + [ + 247, + 247, + 3 + ], + [ + 146, + 1051, + 2 + ], + [ + 166, + 1032, + 1 + ], + [ + 1024, + 1061, + 4 + ], + [ + 308, + 308, + 2 + ], + [ + 103, + 281, + 2 + ], + [ + 268, + 268, + 3 + ], + [ + 104, + 246, + 1 + ], + [ + 261, + 261, + 2 + ], + [ + 145, + 149, + 1 + ], + [ + 103, + 273, + 2 + ], + [ + 249, + 138, + 2 + ], + [ + 136, + 226, + 2 + ], + [ + 144, + 132, + 2 + ], + [ + 130, + 130, + 2 + ], + [ + 1094, + 148, + 2 + ], + [ + 222, + 222, + 5 + ], + [ + 243, + 138, + 2 + ], + [ + 1074, + 173, + 3 + ], + [ + 133, + 235, + 2 + ], + [ + 1025, + 246, + 2 + ], + [ + 103, + 280, + 2 + ], + [ + 103, + 285, + 2 + ], + [ + 1024, + 262, + 4 + ], + [ + 243, + 146, + 2 + ], + [ + 1069, + 136, + 4 + ], + [ + 173, + 168, + 1 + ], + [ + 290, + 290, + 2 + ], + [ + 181, + 163, + 1 + ], + [ + 103, + 284, + 2 + ], + [ + 264, + 254, + 1 + ], + [ + 103, + 278, + 2 + ], + [ + 103, + 279, + 2 + ], + [ + 1029, + 230, + 6 + ], + [ + 1050, + 1026, + 1 + ], + [ + 1026, + 1043, + 3 + ], + [ + 156, + 180, + 1 + ], + [ + 114, + 114, + 3 + ], + [ + 103, + 286, + 2 + ], + [ + 173, + 1084, + 1 + ], + [ + 103, + 289, + 2 + ], + [ + 297, + 297, + 2 + ], + [ + 224, + 224, + 4 + ], + [ + 1132, + 176, + 4 + ], + [ + 304, + 304, + 2 + ], + [ + 1206, + 172, + 1 + ], + [ + 152, + 181, + 1 + ], + [ + 158, + 158, + 6 + ], + [ + 1041, + 144, + 1 + ], + [ + 1054, + 1026, + 1 + ], + [ + 270, + 172, + 1 + ], + [ + 1074, + 172, + 3 + ], + [ + 147, + 1052, + 2 + ], + [ + 1029, + 219, + 6 + ], + [ + 110, + 110, + 3 + ], + [ + 1029, + 217, + 6 + ], + [ + 333, + 333, + 2 + ], + [ + 298, + 298, + 2 + ], + [ + 163, + 104, + 2 + ], + [ + 138, + 1045, + 2 + ], + [ + 165, + 1032, + 1 + ], + [ + 170, + 1032, + 1 + ], + [ + 1024, + 263, + 4 + ], + [ + 1026, + 1036, + 1 + ], + [ + 166, + 181, + 1 + ], + [ + 1031, + 1089, + 2 + ], + [ + 491, + 491, + 2 + ], + [ + 1069, + 1026, + 1 + ], + [ + 1029, + 1079, + 5 + ], + [ + 267, + 252, + 1 + ], + [ + 168, + 172, + 1 + ], + [ + 152, + 1032, + 1 + ], + [ + 132, + 136, + 1 + ], + [ + 159, + 159, + 3 + ], + [ + 132, + 138, + 1 + ], + [ + 1074, + 180, + 3 + ], + [ + 176, + 296, + 2 + ], + [ + 1034, + 176, + 2 + ], + [ + 1029, + 226, + 6 + ], + [ + 248, + 248, + 3 + ], + [ + 200, + 200, + 2 + ], + [ + 173, + 259, + 1 + ], + [ + 266, + 266, + 3 + ], + [ + 145, + 220, + 1 + ], + [ + 275, + 275, + 3 + ], + [ + 1025, + 156, + 3 + ], + [ + 1070, + 150, + 1 + ], + [ + 1040, + 165, + 1 + ], + [ + 313, + 234, + 2 + ], + [ + 177, + 151, + 4 + ], + [ + 221, + 221, + 3 + ], + [ + 226, + 133, + 2 + ], + [ + 270, + 163, + 1 + ], + [ + 1040, + 168, + 2 + ], + [ + 154, + 154, + 3 + ], + [ + 320, + 320, + 2 + ], + [ + 147, + 230, + 2 + ], + [ + 1072, + 181, + 2 + ], + [ + 1024, + 1076, + 4 + ], + [ + 138, + 219, + 2 + ], + [ + 181, + 172, + 1 + ], + [ + 1029, + 224, + 6 + ], + [ + 233, + 136, + 2 + ], + [ + 283, + 283, + 2 + ], + [ + 1026, + 1045, + 3 + ], + [ + 103, + 300, + 2 + ], + [ + 166, + 173, + 1 + ], + [ + 149, + 145, + 1 + ], + [ + 103, + 291, + 2 + ], + [ + 152, + 152, + 5 + ], + [ + 268, + 163, + 1 + ], + [ + 251, + 349, + 2 + ], + [ + 1026, + 1054, + 5 + ], + [ + 155, + 155, + 3 + ], + [ + 136, + 147, + 1 + ], + [ + 1026, + 1080, + 3 + ], + [ + 1062, + 1062, + 4 + ], + [ + 1067, + 133, + 5 + ], + [ + 153, + 153, + 3 + ], + [ + 271, + 163, + 1 + ], + [ + 1026, + 1051, + 3 + ], + [ + 459, + 459, + 2 + ], + [ + 1066, + 1026, + 1 + ], + [ + 1031, + 1091, + 2 + ], + [ + 103, + 288, + 2 + ], + [ + 147, + 136, + 1 + ], + [ + 156, + 156, + 6 + ], + [ + 269, + 269, + 3 + ], + [ + 146, + 138, + 1 + ], + [ + 236, + 148, + 2 + ], + [ + 223, + 223, + 4 + ], + [ + 1029, + 1075, + 6 + ], + [ + 272, + 163, + 1 + ], + [ + 1026, + 1054, + 3 + ], + [ + 1040, + 170, + 1 + ], + [ + 166, + 166, + 1 + ], + [ + 1041, + 133, + 4 + ], + [ + 136, + 233, + 2 + ], + [ + 179, + 150, + 4 + ], + [ + 1040, + 158, + 2 + ], + [ + 1074, + 181, + 3 + ], + [ + 1169, + 163, + 3 + ], + [ + 103, + 295, + 2 + ], + [ + 245, + 245, + 4 + ], + [ + 249, + 249, + 4 + ], + [ + 145, + 306, + 2 + ], + [ + 1029, + 257, + 6 + ], + [ + 146, + 235, + 2 + ], + [ + 1029, + 235, + 6 + ], + [ + 156, + 1032, + 1 + ], + [ + 1240, + 173, + 1 + ], + [ + 1067, + 144, + 2 + ], + [ + 1026, + 1052, + 3 + ], + [ + 230, + 133, + 2 + ], + [ + 176, + 149, + 2 + ], + [ + 1040, + 166, + 1 + ], + [ + 145, + 273, + 2 + ], + [ + 240, + 149, + 2 + ], + [ + 1056, + 151, + 1 + ], + [ + 319, + 152, + 1 + ], + [ + 1040, + 168, + 1 + ], + [ + 1026, + 1082, + 3 + ], + [ + 1113, + 173, + 3 + ], + [ + 165, + 165, + 1 + ], + [ + 314, + 239, + 2 + ], + [ + 138, + 214, + 2 + ], + [ + 145, + 133, + 2 + ], + [ + 1025, + 265, + 2 + ], + [ + 104, + 259, + 1 + ], + [ + 145, + 1042, + 2 + ], + [ + 226, + 136, + 2 + ], + [ + 1043, + 136, + 4 + ], + [ + 299, + 163, + 1 + ], + [ + 1038, + 152, + 4 + ], + [ + 1121, + 170, + 5 + ], + [ + 158, + 1032, + 1 + ], + [ + 1024, + 103, + 3 + ], + [ + 147, + 228, + 2 + ], + [ + 246, + 246, + 5 + ], + [ + 1067, + 144, + 1 + ], + [ + 301, + 172, + 1 + ], + [ + 242, + 242, + 5 + ], + [ + 104, + 265, + 1 + ], + [ + 1024, + 267, + 4 + ], + [ + 138, + 1056, + 2 + ], + [ + 158, + 180, + 1 + ], + [ + 1031, + 250, + 2 + ], + [ + 144, + 1057, + 2 + ], + [ + 1036, + 1026, + 1 + ], + [ + 1029, + 1079, + 6 + ], + [ + 1024, + 264, + 4 + ], + [ + 293, + 172, + 1 + ], + [ + 325, + 325, + 2 + ], + [ + 1025, + 1093, + 2 + ], + [ + 138, + 146, + 1 + ], + [ + 168, + 168, + 5 + ], + [ + 189, + 133, + 3 + ], + [ + 305, + 177, + 2 + ], + [ + 1033, + 1272, + 1 + ], + [ + 1061, + 179, + 3 + ], + [ + 1121, + 163, + 5 + ], + [ + 1042, + 145, + 1 + ], + [ + 1060, + 132, + 6 + ], + [ + 279, + 279, + 3 + ], + [ + 334, + 177, + 2 + ], + [ + 1026, + 1066, + 5 + ], + [ + 1059, + 144, + 1 + ], + [ + 165, + 181, + 1 + ], + [ + 170, + 104, + 2 + ], + [ + 1038, + 1260, + 2 + ], + [ + 1119, + 163, + 3 + ], + [ + 1024, + 266, + 4 + ], + [ + 1029, + 252, + 6 + ], + [ + 138, + 231, + 2 + ], + [ + 180, + 166, + 1 + ], + [ + 138, + 224, + 2 + ], + [ + 335, + 335, + 2 + ], + [ + 1029, + 220, + 6 + ], + [ + 302, + 176, + 2 + ], + [ + 248, + 149, + 2 + ], + [ + 1029, + 254, + 6 + ], + [ + 1048, + 145, + 6 + ], + [ + 339, + 339, + 3 + ], + [ + 103, + 309, + 2 + ], + [ + 275, + 176, + 2 + ], + [ + 1046, + 148, + 4 + ], + [ + 1043, + 150, + 1 + ], + [ + 1027, + 265, + 4 + ], + [ + 322, + 152, + 1 + ], + [ + 235, + 133, + 2 + ], + [ + 104, + 1093, + 1 + ], + [ + 217, + 217, + 5 + ], + [ + 308, + 177, + 2 + ], + [ + 199, + 199, + 2 + ], + [ + 168, + 173, + 1 + ], + [ + 526, + 526, + 2 + ], + [ + 244, + 244, + 4 + ], + [ + 271, + 173, + 1 + ], + [ + 241, + 136, + 2 + ], + [ + 1024, + 269, + 4 + ], + [ + 170, + 180, + 1 + ], + [ + 260, + 260, + 4 + ], + [ + 146, + 243, + 2 + ], + [ + 321, + 152, + 1 + ], + [ + 507, + 507, + 2 + ], + [ + 1029, + 261, + 6 + ], + [ + 144, + 189, + 4 + ], + [ + 496, + 496, + 2 + ], + [ + 326, + 156, + 1 + ], + [ + 132, + 133, + 2 + ], + [ + 1027, + 242, + 4 + ], + [ + 504, + 504, + 2 + ], + [ + 181, + 156, + 1 + ], + [ + 1024, + 277, + 4 + ], + [ + 318, + 152, + 1 + ], + [ + 1026, + 1098, + 1 + ], + [ + 150, + 179, + 4 + ], + [ + 1024, + 274, + 4 + ], + [ + 1111, + 133, + 4 + ], + [ + 1040, + 172, + 1 + ], + [ + 104, + 1099, + 1 + ], + [ + 1040, + 156, + 1 + ], + [ + 228, + 228, + 4 + ], + [ + 1029, + 1061, + 5 + ], + [ + 234, + 328, + 2 + ], + [ + 1025, + 158, + 3 + ], + [ + 147, + 144, + 1 + ], + [ + 166, + 166, + 6 + ], + [ + 172, + 1081, + 1 + ], + [ + 1040, + 172, + 2 + ], + [ + 1029, + 244, + 6 + ], + [ + 214, + 214, + 5 + ], + [ + 345, + 345, + 2 + ], + [ + 176, + 307, + 2 + ], + [ + 148, + 1041, + 2 + ], + [ + 215, + 215, + 5 + ], + [ + 132, + 145, + 3 + ], + [ + 165, + 165, + 6 + ], + [ + 151, + 151, + 7 + ], + [ + 247, + 247, + 1 + ], + [ + 273, + 273, + 2 + ], + [ + 1025, + 1099, + 2 + ], + [ + 172, + 168, + 1 + ], + [ + 1121, + 152, + 5 + ], + [ + 219, + 219, + 5 + ], + [ + 230, + 230, + 4 + ], + [ + 150, + 150, + 7 + ], + [ + 1121, + 156, + 5 + ], + [ + 1026, + 1069, + 3 + ], + [ + 152, + 1105, + 1 + ], + [ + 181, + 104, + 2 + ], + [ + 148, + 1073, + 2 + ], + [ + 118, + 118, + 2 + ], + [ + 119, + 119, + 2 + ], + [ + 1031, + 176, + 6 + ], + [ + 231, + 231, + 5 + ], + [ + 311, + 179, + 2 + ], + [ + 103, + 306, + 2 + ], + [ + 148, + 236, + 2 + ], + [ + 163, + 1095, + 1 + ], + [ + 1040, + 173, + 1 + ], + [ + 1029, + 1078, + 5 + ], + [ + 272, + 272, + 3 + ], + [ + 263, + 146, + 2 + ], + [ + 1040, + 158, + 1 + ], + [ + 1038, + 1239, + 2 + ], + [ + 1024, + 278, + 4 + ], + [ + 145, + 223, + 1 + ], + [ + 259, + 259, + 4 + ], + [ + 232, + 232, + 3 + ], + [ + 237, + 237, + 3 + ], + [ + 293, + 293, + 2 + ], + [ + 484, + 484, + 2 + ], + [ + 214, + 295, + 1 + ], + [ + 257, + 257, + 3 + ], + [ + 1026, + 1069, + 5 + ], + [ + 180, + 104, + 2 + ], + [ + 251, + 251, + 3 + ], + [ + 1026, + 1066, + 3 + ], + [ + 287, + 287, + 3 + ], + [ + 528, + 528, + 2 + ], + [ + 1024, + 273, + 4 + ], + [ + 1024, + 291, + 4 + ], + [ + 145, + 132, + 3 + ], + [ + 240, + 133, + 2 + ], + [ + 176, + 1062, + 2 + ], + [ + 325, + 179, + 2 + ], + [ + 449, + 449, + 2 + ], + [ + 1057, + 133, + 6 + ], + [ + 144, + 146, + 1 + ], + [ + 177, + 151, + 5 + ], + [ + 1029, + 236, + 6 + ], + [ + 243, + 243, + 4 + ], + [ + 181, + 173, + 1 + ], + [ + 1024, + 289, + 4 + ], + [ + 241, + 241, + 5 + ], + [ + 220, + 149, + 2 + ], + [ + 233, + 233, + 5 + ], + [ + 148, + 189, + 2 + ], + [ + 222, + 222, + 6 + ], + [ + 1024, + 276, + 4 + ], + [ + 1027, + 246, + 4 + ], + [ + 252, + 252, + 2 + ], + [ + 270, + 270, + 2 + ], + [ + 1029, + 250, + 6 + ], + [ + 1031, + 248, + 2 + ], + [ + 1024, + 282, + 4 + ], + [ + 261, + 147, + 2 + ], + [ + 144, + 230, + 1 + ], + [ + 1070, + 136, + 5 + ], + [ + 180, + 173, + 1 + ], + [ + 299, + 299, + 3 + ], + [ + 176, + 315, + 2 + ], + [ + 168, + 1032, + 1 + ], + [ + 156, + 1033, + 1 + ], + [ + 220, + 149, + 5 + ], + [ + 295, + 214, + 1 + ], + [ + 1029, + 243, + 6 + ], + [ + 1024, + 286, + 4 + ], + [ + 132, + 1048, + 2 + ], + [ + 255, + 138, + 2 + ], + [ + 1024, + 281, + 4 + ], + [ + 1038, + 156, + 4 + ], + [ + 1045, + 151, + 1 + ], + [ + 144, + 147, + 1 + ], + [ + 1089, + 150, + 2 + ], + [ + 177, + 1110, + 3 + ], + [ + 172, + 181, + 1 + ], + [ + 472, + 472, + 2 + ], + [ + 235, + 235, + 4 + ], + [ + 271, + 165, + 1 + ], + [ + 1062, + 145, + 1 + ], + [ + 262, + 147, + 2 + ], + [ + 1083, + 1083, + 4 + ], + [ + 1031, + 189, + 6 + ], + [ + 1038, + 158, + 4 + ], + [ + 103, + 144, + 1 + ], + [ + 1034, + 179, + 2 + ], + [ + 1026, + 132, + 7 + ], + [ + 361, + 361, + 1 + ], + [ + 180, + 156, + 1 + ], + [ + 172, + 104, + 2 + ], + [ + 1085, + 1085, + 4 + ], + [ + 180, + 170, + 1 + ], + [ + 244, + 136, + 2 + ], + [ + 289, + 215, + 1 + ], + [ + 133, + 240, + 2 + ], + [ + 347, + 179, + 2 + ], + [ + 223, + 145, + 1 + ], + [ + 330, + 158, + 1 + ], + [ + 148, + 250, + 2 + ], + [ + 1038, + 168, + 4 + ], + [ + 146, + 144, + 1 + ], + [ + 176, + 132, + 3 + ], + [ + 149, + 1042, + 2 + ], + [ + 149, + 1071, + 2 + ], + [ + 1038, + 163, + 4 + ], + [ + 239, + 362, + 2 + ], + [ + 245, + 165, + 1 + ], + [ + 1121, + 158, + 5 + ], + [ + 283, + 173, + 1 + ], + [ + 1034, + 177, + 2 + ], + [ + 228, + 145, + 1 + ], + [ + 292, + 292, + 3 + ], + [ + 138, + 249, + 2 + ], + [ + 303, + 303, + 3 + ], + [ + 105, + 105, + 3 + ], + [ + 1033, + 245, + 1 + ], + [ + 157, + 113, + 2 + ], + [ + 1043, + 146, + 4 + ], + [ + 388, + 388, + 2 + ], + [ + 131, + 131, + 2 + ], + [ + 1036, + 176, + 4 + ], + [ + 242, + 166, + 1 + ], + [ + 277, + 255, + 1 + ], + [ + 304, + 177, + 2 + ], + [ + 150, + 217, + 1 + ], + [ + 1042, + 149, + 4 + ], + [ + 1032, + 168, + 4 + ], + [ + 104, + 271, + 1 + ], + [ + 216, + 216, + 1 + ], + [ + 246, + 158, + 3 + ], + [ + 147, + 146, + 2 + ], + [ + 1035, + 1092, + 2 + ], + [ + 320, + 179, + 2 + ], + [ + 1026, + 189, + 1 + ], + [ + 1031, + 179, + 6 + ], + [ + 288, + 288, + 3 + ], + [ + 1024, + 1056, + 1 + ], + [ + 278, + 278, + 3 + ], + [ + 173, + 166, + 1 + ], + [ + 138, + 136, + 2 + ], + [ + 254, + 254, + 3 + ], + [ + 404, + 404, + 2 + ], + [ + 1024, + 280, + 4 + ], + [ + 1045, + 147, + 4 + ], + [ + 1120, + 163, + 4 + ], + [ + 104, + 268, + 1 + ], + [ + 132, + 148, + 1 + ], + [ + 220, + 1062, + 2 + ], + [ + 1121, + 165, + 5 + ], + [ + 1029, + 222, + 6 + ], + [ + 189, + 148, + 2 + ], + [ + 263, + 263, + 2 + ], + [ + 1029, + 231, + 6 + ], + [ + 1075, + 176, + 3 + ], + [ + 446, + 446, + 2 + ], + [ + 1025, + 166, + 3 + ], + [ + 151, + 219, + 1 + ], + [ + 144, + 103, + 1 + ], + [ + 150, + 215, + 1 + ], + [ + 181, + 166, + 1 + ], + [ + 1029, + 240, + 6 + ], + [ + 144, + 235, + 1 + ], + [ + 157, + 114, + 2 + ], + [ + 324, + 152, + 1 + ], + [ + 167, + 167, + 3 + ], + [ + 1094, + 1031, + 2 + ], + [ + 149, + 240, + 4 + ], + [ + 150, + 136, + 3 + ], + [ + 170, + 1027, + 1 + ], + [ + 1024, + 285, + 4 + ], + [ + 133, + 1049, + 2 + ], + [ + 147, + 244, + 2 + ], + [ + 258, + 274, + 1 + ], + [ + 104, + 270, + 1 + ], + [ + 149, + 176, + 2 + ], + [ + 180, + 158, + 1 + ], + [ + 180, + 172, + 1 + ], + [ + 1025, + 165, + 3 + ], + [ + 1024, + 279, + 4 + ], + [ + 221, + 221, + 1 + ], + [ + 245, + 166, + 1 + ], + [ + 257, + 146, + 2 + ], + [ + 331, + 177, + 2 + ], + [ + 180, + 165, + 1 + ], + [ + 220, + 145, + 1 + ], + [ + 329, + 329, + 3 + ], + [ + 1121, + 168, + 5 + ], + [ + 333, + 189, + 2 + ], + [ + 335, + 177, + 2 + ], + [ + 1024, + 295, + 4 + ], + [ + 306, + 306, + 3 + ], + [ + 367, + 367, + 3 + ], + [ + 146, + 147, + 2 + ], + [ + 308, + 308, + 3 + ], + [ + 132, + 1050, + 2 + ], + [ + 266, + 146, + 2 + ], + [ + 349, + 349, + 3 + ], + [ + 1029, + 233, + 6 + ], + [ + 262, + 262, + 2 + ], + [ + 1088, + 1031, + 2 + ], + [ + 1025, + 1032, + 3 + ], + [ + 1024, + 309, + 4 + ], + [ + 151, + 138, + 3 + ], + [ + 1121, + 180, + 5 + ], + [ + 1038, + 165, + 4 + ], + [ + 1024, + 288, + 4 + ], + [ + 1046, + 147, + 4 + ], + [ + 172, + 165, + 1 + ], + [ + 224, + 224, + 5 + ], + [ + 307, + 307, + 2 + ], + [ + 215, + 145, + 1 + ], + [ + 215, + 289, + 1 + ], + [ + 1024, + 284, + 4 + ], + [ + 1033, + 246, + 1 + ], + [ + 1038, + 170, + 4 + ], + [ + 226, + 226, + 5 + ], + [ + 269, + 269, + 2 + ], + [ + 1042, + 146, + 4 + ], + [ + 136, + 138, + 2 + ], + [ + 334, + 334, + 2 + ], + [ + 1031, + 219, + 2 + ], + [ + 242, + 156, + 3 + ], + [ + 1024, + 300, + 4 + ], + [ + 144, + 222, + 1 + ], + [ + 150, + 1043, + 2 + ], + [ + 246, + 165, + 1 + ], + [ + 231, + 149, + 2 + ], + [ + 1026, + 145, + 7 + ], + [ + 301, + 301, + 3 + ], + [ + 1032, + 1093, + 3 + ], + [ + 168, + 163, + 1 + ], + [ + 358, + 358, + 2 + ], + [ + 1224, + 180, + 1 + ], + [ + 181, + 165, + 1 + ], + [ + 1296, + 158, + 1 + ], + [ + 41, + 41, + 1 + ], + [ + 283, + 283, + 3 + ], + [ + 314, + 314, + 1 + ], + [ + 133, + 132, + 2 + ], + [ + 261, + 261, + 3 + ], + [ + 561, + 561, + 2 + ], + [ + 136, + 241, + 2 + ], + [ + 177, + 1056, + 2 + ], + [ + 173, + 104, + 2 + ], + [ + 489, + 489, + 2 + ], + [ + 1031, + 214, + 2 + ], + [ + 1088, + 1088, + 2 + ], + [ + 1121, + 166, + 5 + ], + [ + 148, + 133, + 1 + ], + [ + 298, + 298, + 3 + ], + [ + 369, + 179, + 2 + ], + [ + 305, + 305, + 2 + ], + [ + 1041, + 147, + 4 + ], + [ + 152, + 152, + 4 + ], + [ + 1026, + 149, + 7 + ], + [ + 145, + 228, + 1 + ], + [ + 1025, + 170, + 3 + ], + [ + 250, + 250, + 4 + ], + [ + 117, + 164, + 2 + ], + [ + 104, + 260, + 1 + ], + [ + 219, + 103, + 2 + ], + [ + 1032, + 1099, + 3 + ], + [ + 236, + 148, + 3 + ], + [ + 1031, + 217, + 2 + ], + [ + 266, + 266, + 2 + ], + [ + 132, + 149, + 1 + ], + [ + 366, + 366, + 3 + ], + [ + 1038, + 172, + 4 + ], + [ + 144, + 144, + 7 + ], + [ + 146, + 1043, + 2 + ], + [ + 1031, + 220, + 2 + ], + [ + 255, + 133, + 2 + ], + [ + 377, + 177, + 2 + ], + [ + 1081, + 166, + 2 + ], + [ + 318, + 173, + 1 + ], + [ + 245, + 170, + 1 + ], + [ + 303, + 179, + 2 + ], + [ + 115, + 115, + 3 + ], + [ + 279, + 279, + 2 + ], + [ + 1032, + 1139, + 3 + ], + [ + 157, + 339, + 2 + ], + [ + 1183, + 1034, + 1 + ], + [ + 328, + 328, + 1 + ], + [ + 245, + 158, + 1 + ], + [ + 103, + 296, + 2 + ], + [ + 1031, + 226, + 2 + ], + [ + 245, + 156, + 1 + ], + [ + 1046, + 146, + 4 + ], + [ + 144, + 224, + 1 + ], + [ + 176, + 275, + 3 + ], + [ + 269, + 147, + 2 + ], + [ + 326, + 326, + 3 + ], + [ + 1059, + 133, + 1 + ], + [ + 180, + 1106, + 1 + ], + [ + 1118, + 149, + 2 + ], + [ + 104, + 272, + 1 + ], + [ + 252, + 136, + 2 + ], + [ + 311, + 311, + 2 + ], + [ + 1029, + 241, + 6 + ], + [ + 271, + 271, + 2 + ], + [ + 1034, + 250, + 2 + ], + [ + 1031, + 223, + 2 + ], + [ + 162, + 162, + 1 + ], + [ + 1121, + 181, + 5 + ], + [ + 1027, + 1086, + 4 + ], + [ + 1076, + 177, + 3 + ], + [ + 255, + 277, + 1 + ], + [ + 1050, + 149, + 4 + ], + [ + 189, + 147, + 2 + ], + [ + 1049, + 144, + 3 + ], + [ + 103, + 307, + 2 + ], + [ + 146, + 1042, + 2 + ], + [ + 321, + 172, + 1 + ], + [ + 150, + 150, + 6 + ], + [ + 234, + 234, + 3 + ], + [ + 133, + 148, + 1 + ], + [ + 214, + 145, + 1 + ], + [ + 297, + 297, + 3 + ], + [ + 151, + 214, + 1 + ], + [ + 170, + 170, + 2 + ], + [ + 1106, + 180, + 2 + ], + [ + 103, + 302, + 2 + ], + [ + 163, + 168, + 1 + ], + [ + 1219, + 163, + 1 + ], + [ + 1040, + 181, + 1 + ], + [ + 1031, + 230, + 2 + ], + [ + 1038, + 166, + 4 + ], + [ + 1084, + 165, + 2 + ], + [ + 217, + 103, + 2 + ], + [ + 240, + 149, + 3 + ], + [ + 1031, + 224, + 2 + ], + [ + 133, + 1078, + 1 + ], + [ + 147, + 1042, + 2 + ], + [ + 605, + 605, + 2 + ], + [ + 136, + 148, + 1 + ], + [ + 1025, + 1139, + 2 + ], + [ + 132, + 176, + 3 + ], + [ + 270, + 166, + 1 + ], + [ + 1075, + 145, + 3 + ], + [ + 103, + 344, + 2 + ], + [ + 156, + 242, + 3 + ], + [ + 242, + 156, + 2 + ], + [ + 138, + 243, + 2 + ], + [ + 236, + 148, + 4 + ], + [ + 347, + 347, + 2 + ], + [ + 1121, + 172, + 5 + ], + [ + 189, + 144, + 3 + ], + [ + 382, + 382, + 3 + ], + [ + 1029, + 258, + 6 + ], + [ + 146, + 257, + 2 + ], + [ + 268, + 268, + 4 + ], + [ + 1027, + 104, + 5 + ], + [ + 1031, + 215, + 2 + ], + [ + 1031, + 228, + 2 + ], + [ + 1062, + 176, + 4 + ], + [ + 304, + 304, + 3 + ], + [ + 313, + 313, + 1 + ], + [ + 145, + 215, + 2 + ], + [ + 158, + 246, + 3 + ], + [ + 1038, + 173, + 4 + ], + [ + 287, + 180, + 1 + ], + [ + 1081, + 152, + 2 + ], + [ + 136, + 258, + 2 + ], + [ + 138, + 103, + 1 + ], + [ + 179, + 1116, + 3 + ], + [ + 133, + 149, + 1 + ], + [ + 147, + 1041, + 2 + ], + [ + 189, + 146, + 2 + ], + [ + 148, + 1046, + 2 + ], + [ + 315, + 315, + 2 + ], + [ + 1091, + 151, + 2 + ], + [ + 1026, + 1092, + 1 + ], + [ + 1026, + 189, + 3 + ], + [ + 1121, + 173, + 5 + ], + [ + 1031, + 222, + 2 + ], + [ + 1049, + 144, + 6 + ], + [ + 1034, + 1078, + 1 + ], + [ + 1040, + 180, + 1 + ], + [ + 273, + 273, + 3 + ], + [ + 168, + 1033, + 1 + ], + [ + 359, + 359, + 2 + ], + [ + 1034, + 1159, + 1 + ], + [ + 248, + 248, + 4 + ], + [ + 133, + 145, + 2 + ], + [ + 158, + 1033, + 1 + ], + [ + 214, + 151, + 1 + ], + [ + 1027, + 1137, + 4 + ], + [ + 1041, + 148, + 4 + ], + [ + 1029, + 249, + 6 + ], + [ + 136, + 244, + 2 + ], + [ + 172, + 260, + 1 + ], + [ + 217, + 217, + 6 + ], + [ + 1055, + 150, + 6 + ], + [ + 239, + 239, + 3 + ], + [ + 149, + 132, + 1 + ], + [ + 1029, + 262, + 6 + ], + [ + 1061, + 150, + 3 + ], + [ + 151, + 1045, + 2 + ], + [ + 1029, + 255, + 6 + ], + [ + 1031, + 235, + 2 + ], + [ + 1091, + 177, + 2 + ], + [ + 1031, + 1061, + 1 + ], + [ + 133, + 1046, + 2 + ], + [ + 252, + 252, + 3 + ], + [ + 1041, + 146, + 4 + ], + [ + 166, + 1033, + 1 + ], + [ + 336, + 336, + 2 + ], + [ + 152, + 1033, + 1 + ], + [ + 148, + 222, + 2 + ], + [ + 320, + 320, + 3 + ], + [ + 147, + 1045, + 2 + ], + [ + 1042, + 147, + 4 + ], + [ + 145, + 223, + 2 + ], + [ + 148, + 132, + 1 + ], + [ + 1089, + 179, + 2 + ], + [ + 173, + 181, + 1 + ], + [ + 372, + 156, + 1 + ], + [ + 246, + 158, + 2 + ], + [ + 1232, + 170, + 1 + ], + [ + 133, + 189, + 3 + ], + [ + 132, + 1075, + 2 + ], + [ + 1029, + 1076, + 5 + ], + [ + 251, + 117, + 2 + ], + [ + 589, + 589, + 2 + ], + [ + 1026, + 150, + 7 + ], + [ + 1040, + 181, + 2 + ], + [ + 1129, + 172, + 4 + ], + [ + 138, + 1076, + 1 + ], + [ + 240, + 348, + 2 + ], + [ + 1042, + 176, + 4 + ], + [ + 133, + 144, + 3 + ], + [ + 1047, + 152, + 4 + ], + [ + 249, + 249, + 5 + ], + [ + 1084, + 168, + 2 + ], + [ + 173, + 1113, + 1 + ], + [ + 220, + 220, + 6 + ], + [ + 293, + 293, + 3 + ], + [ + 296, + 296, + 3 + ], + [ + 338, + 179, + 2 + ], + [ + 621, + 621, + 2 + ], + [ + 164, + 164, + 1 + ], + [ + 219, + 151, + 1 + ], + [ + 104, + 283, + 1 + ], + [ + 231, + 177, + 2 + ], + [ + 132, + 1043, + 2 + ], + [ + 148, + 136, + 1 + ], + [ + 280, + 280, + 3 + ], + [ + 1036, + 189, + 4 + ], + [ + 163, + 272, + 1 + ], + [ + 448, + 448, + 2 + ], + [ + 274, + 258, + 1 + ], + [ + 330, + 330, + 3 + ], + [ + 146, + 263, + 2 + ], + [ + 168, + 168, + 1 + ], + [ + 1054, + 144, + 4 + ], + [ + 136, + 103, + 1 + ], + [ + 163, + 1027, + 1 + ], + [ + 1031, + 233, + 2 + ], + [ + 248, + 145, + 2 + ], + [ + 173, + 1032, + 1 + ], + [ + 587, + 587, + 2 + ], + [ + 170, + 170, + 7 + ], + [ + 247, + 113, + 2 + ], + [ + 297, + 172, + 1 + ], + [ + 371, + 158, + 1 + ], + [ + 179, + 1070, + 2 + ], + [ + 254, + 138, + 2 + ], + [ + 1025, + 180, + 3 + ], + [ + 1084, + 152, + 2 + ], + [ + 1033, + 242, + 1 + ], + [ + 1077, + 156, + 2 + ], + [ + 147, + 147, + 7 + ], + [ + 173, + 180, + 1 + ], + [ + 1029, + 1061, + 6 + ], + [ + 149, + 231, + 4 + ], + [ + 144, + 224, + 2 + ], + [ + 1104, + 166, + 3 + ], + [ + 575, + 575, + 2 + ], + [ + 1035, + 1117, + 2 + ], + [ + 103, + 315, + 2 + ], + [ + 1024, + 306, + 4 + ], + [ + 217, + 150, + 1 + ], + [ + 346, + 346, + 2 + ], + [ + 1029, + 267, + 6 + ], + [ + 1035, + 1140, + 2 + ], + [ + 1040, + 180, + 2 + ], + [ + 1077, + 166, + 2 + ], + [ + 148, + 222, + 4 + ], + [ + 223, + 176, + 2 + ], + [ + 247, + 339, + 2 + ], + [ + 146, + 1041, + 2 + ], + [ + 1031, + 1075, + 1 + ], + [ + 145, + 214, + 2 + ], + [ + 146, + 176, + 2 + ], + [ + 1029, + 1078, + 6 + ], + [ + 103, + 1132, + 2 + ], + [ + 265, + 265, + 4 + ], + [ + 138, + 255, + 2 + ], + [ + 145, + 252, + 2 + ], + [ + 548, + 548, + 2 + ], + [ + 35, + 35, + 2 + ], + [ + 379, + 379, + 2 + ], + [ + 1029, + 263, + 6 + ], + [ + 151, + 231, + 1 + ], + [ + 262, + 262, + 3 + ], + [ + 307, + 176, + 2 + ], + [ + 224, + 144, + 2 + ], + [ + 1048, + 132, + 6 + ], + [ + 179, + 303, + 2 + ], + [ + 299, + 299, + 4 + ], + [ + 513, + 513, + 2 + ], + [ + 1026, + 147, + 7 + ], + [ + 233, + 233, + 6 + ], + [ + 136, + 1055, + 2 + ], + [ + 1032, + 293, + 3 + ], + [ + 301, + 301, + 4 + ], + [ + 136, + 1061, + 2 + ], + [ + 146, + 1045, + 2 + ], + [ + 245, + 1025, + 1 + ], + [ + 151, + 214, + 2 + ], + [ + 215, + 150, + 1 + ], + [ + 236, + 236, + 5 + ], + [ + 1098, + 133, + 6 + ], + [ + 110, + 110, + 4 + ], + [ + 165, + 1033, + 1 + ], + [ + 438, + 438, + 2 + ], + [ + 1032, + 292, + 3 + ], + [ + 145, + 215, + 1 + ], + [ + 230, + 144, + 1 + ], + [ + 1047, + 163, + 4 + ], + [ + 216, + 154, + 2 + ], + [ + 250, + 133, + 2 + ], + [ + 1031, + 177, + 6 + ], + [ + 1043, + 133, + 4 + ], + [ + 600, + 600, + 2 + ], + [ + 541, + 541, + 2 + ], + [ + 1035, + 1148, + 2 + ], + [ + 1054, + 133, + 4 + ], + [ + 145, + 220, + 2 + ], + [ + 147, + 189, + 2 + ], + [ + 1029, + 1076, + 6 + ], + [ + 138, + 149, + 1 + ], + [ + 1042, + 1062, + 4 + ], + [ + 132, + 1045, + 2 + ], + [ + 680, + 680, + 2 + ], + [ + 221, + 154, + 2 + ], + [ + 226, + 150, + 1 + ], + [ + 179, + 325, + 2 + ], + [ + 1048, + 145, + 3 + ], + [ + 1032, + 270, + 3 + ], + [ + 1029, + 264, + 6 + ], + [ + 231, + 151, + 1 + ], + [ + 315, + 176, + 2 + ], + [ + 355, + 189, + 2 + ], + [ + 1097, + 152, + 2 + ], + [ + 144, + 230, + 2 + ], + [ + 157, + 314, + 2 + ], + [ + 367, + 367, + 1 + ], + [ + 1034, + 1078, + 2 + ], + [ + 1104, + 152, + 3 + ], + [ + 219, + 177, + 2 + ], + [ + 232, + 155, + 2 + ], + [ + 145, + 214, + 1 + ], + [ + 147, + 261, + 2 + ], + [ + 1077, + 165, + 2 + ], + [ + 156, + 1157, + 1 + ], + [ + 1025, + 163, + 3 + ], + [ + 531, + 531, + 2 + ], + [ + 1025, + 270, + 2 + ], + [ + 1026, + 148, + 7 + ], + [ + 254, + 254, + 2 + ], + [ + 278, + 278, + 4 + ], + [ + 149, + 220, + 4 + ], + [ + 1213, + 1034, + 1 + ], + [ + 1026, + 138, + 7 + ], + [ + 259, + 259, + 5 + ], + [ + 146, + 189, + 2 + ], + [ + 151, + 1066, + 2 + ], + [ + 215, + 136, + 3 + ], + [ + 147, + 1043, + 2 + ], + [ + 1096, + 168, + 2 + ], + [ + 144, + 226, + 1 + ], + [ + 1032, + 272, + 3 + ], + [ + 104, + 1139, + 1 + ], + [ + 149, + 1050, + 2 + ], + [ + 375, + 375, + 2 + ], + [ + 1031, + 255, + 2 + ], + [ + 206, + 206, + 2 + ], + [ + 222, + 222, + 7 + ], + [ + 241, + 241, + 6 + ], + [ + 396, + 396, + 2 + ], + [ + 1112, + 163, + 2 + ], + [ + 1032, + 268, + 3 + ], + [ + 150, + 226, + 1 + ], + [ + 598, + 598, + 2 + ], + [ + 1056, + 177, + 5 + ], + [ + 223, + 223, + 5 + ], + [ + 228, + 176, + 2 + ], + [ + 1155, + 145, + 4 + ], + [ + 138, + 219, + 3 + ], + [ + 158, + 246, + 2 + ], + [ + 1081, + 168, + 2 + ], + [ + 104, + 293, + 1 + ], + [ + 138, + 214, + 3 + ], + [ + 258, + 258, + 3 + ], + [ + 216, + 153, + 2 + ], + [ + 361, + 361, + 3 + ], + [ + 1089, + 1031, + 2 + ], + [ + 132, + 1058, + 2 + ], + [ + 156, + 242, + 2 + ], + [ + 1026, + 136, + 7 + ], + [ + 152, + 152, + 1 + ], + [ + 348, + 348, + 3 + ], + [ + 103, + 133, + 1 + ], + [ + 179, + 217, + 2 + ], + [ + 1026, + 133, + 7 + ], + [ + 300, + 224, + 1 + ], + [ + 353, + 353, + 3 + ], + [ + 1091, + 1031, + 2 + ], + [ + 1113, + 165, + 3 + ], + [ + 149, + 1045, + 2 + ], + [ + 402, + 402, + 2 + ], + [ + 458, + 458, + 2 + ], + [ + 329, + 329, + 2 + ], + [ + 395, + 395, + 2 + ], + [ + 144, + 1054, + 2 + ], + [ + 1050, + 146, + 4 + ], + [ + 1026, + 146, + 7 + ], + [ + 1040, + 165, + 4 + ], + [ + 1316, + 168, + 1 + ], + [ + 235, + 235, + 5 + ], + [ + 1025, + 272, + 2 + ], + [ + 1031, + 262, + 2 + ], + [ + 1063, + 151, + 6 + ], + [ + 263, + 263, + 3 + ], + [ + 1031, + 1079, + 2 + ], + [ + 103, + 275, + 2 + ], + [ + 1040, + 173, + 4 + ], + [ + 147, + 1064, + 2 + ], + [ + 1026, + 151, + 7 + ], + [ + 1033, + 242, + 3 + ], + [ + 163, + 163, + 2 + ], + [ + 217, + 179, + 2 + ], + [ + 260, + 260, + 5 + ], + [ + 313, + 313, + 3 + ], + [ + 255, + 255, + 3 + ], + [ + 1035, + 1062, + 2 + ], + [ + 1043, + 132, + 4 + ], + [ + 1043, + 148, + 4 + ], + [ + 152, + 1128, + 1 + ], + [ + 176, + 1079, + 2 + ], + [ + 1032, + 283, + 3 + ], + [ + 1119, + 180, + 3 + ], + [ + 397, + 168, + 1 + ], + [ + 1050, + 145, + 4 + ], + [ + 149, + 148, + 2 + ], + [ + 356, + 356, + 2 + ], + [ + 391, + 391, + 2 + ], + [ + 1040, + 166, + 4 + ], + [ + 1061, + 150, + 2 + ], + [ + 156, + 326, + 1 + ], + [ + 156, + 1027, + 1 + ], + [ + 288, + 288, + 2 + ], + [ + 399, + 399, + 2 + ], + [ + 439, + 439, + 2 + ], + [ + 1031, + 258, + 2 + ], + [ + 1110, + 1110, + 4 + ], + [ + 144, + 1049, + 2 + ], + [ + 1043, + 179, + 4 + ], + [ + 1116, + 1116, + 4 + ], + [ + 103, + 311, + 2 + ], + [ + 136, + 252, + 2 + ], + [ + 145, + 1058, + 2 + ], + [ + 1025, + 268, + 2 + ], + [ + 1034, + 224, + 2 + ], + [ + 1034, + 1190, + 1 + ], + [ + 104, + 292, + 1 + ], + [ + 172, + 180, + 1 + ], + [ + 298, + 173, + 1 + ], + [ + 148, + 236, + 3 + ], + [ + 248, + 132, + 2 + ], + [ + 335, + 335, + 3 + ], + [ + 244, + 244, + 5 + ], + [ + 1032, + 259, + 3 + ], + [ + 1104, + 168, + 3 + ], + [ + 230, + 230, + 5 + ], + [ + 427, + 427, + 2 + ], + [ + 1038, + 1319, + 2 + ], + [ + 1045, + 177, + 4 + ], + [ + 147, + 262, + 2 + ], + [ + 132, + 248, + 2 + ], + [ + 144, + 226, + 2 + ], + [ + 165, + 1027, + 1 + ], + [ + 146, + 1065, + 2 + ], + [ + 228, + 228, + 5 + ], + [ + 355, + 355, + 2 + ], + [ + 1031, + 1075, + 2 + ], + [ + 1032, + 324, + 3 + ], + [ + 243, + 243, + 5 + ], + [ + 1025, + 271, + 2 + ], + [ + 159, + 159, + 4 + ], + [ + 1077, + 158, + 2 + ], + [ + 104, + 298, + 1 + ], + [ + 447, + 154, + 2 + ], + [ + 1032, + 260, + 3 + ], + [ + 220, + 149, + 3 + ], + [ + 1113, + 168, + 3 + ], + [ + 1045, + 133, + 4 + ], + [ + 1134, + 173, + 4 + ], + [ + 327, + 173, + 1 + ], + [ + 1040, + 168, + 4 + ], + [ + 1096, + 158, + 2 + ], + [ + 366, + 366, + 1 + ], + [ + 1031, + 1061, + 2 + ], + [ + 146, + 266, + 2 + ], + [ + 1055, + 150, + 3 + ], + [ + 104, + 299, + 1 + ], + [ + 214, + 177, + 2 + ], + [ + 1031, + 263, + 2 + ], + [ + 189, + 333, + 2 + ], + [ + 1032, + 271, + 3 + ], + [ + 223, + 145, + 2 + ], + [ + 409, + 409, + 2 + ], + [ + 114, + 164, + 2 + ], + [ + 284, + 284, + 3 + ], + [ + 331, + 331, + 2 + ], + [ + 240, + 240, + 5 + ], + [ + 302, + 302, + 3 + ], + [ + 1051, + 132, + 4 + ], + [ + 149, + 220, + 2 + ], + [ + 166, + 1027, + 1 + ], + [ + 325, + 325, + 3 + ], + [ + 1025, + 260, + 2 + ], + [ + 1032, + 287, + 3 + ], + [ + 104, + 301, + 1 + ], + [ + 114, + 157, + 2 + ], + [ + 235, + 144, + 1 + ], + [ + 382, + 382, + 1 + ], + [ + 1031, + 231, + 2 + ], + [ + 1034, + 226, + 2 + ], + [ + 138, + 1041, + 2 + ], + [ + 1025, + 287, + 2 + ], + [ + 1029, + 1067, + 3 + ], + [ + 1046, + 133, + 1 + ], + [ + 224, + 300, + 1 + ], + [ + 104, + 287, + 1 + ], + [ + 170, + 170, + 3 + ], + [ + 1025, + 259, + 2 + ], + [ + 1033, + 152, + 4 + ], + [ + 136, + 1042, + 2 + ], + [ + 1031, + 249, + 2 + ], + [ + 1034, + 230, + 2 + ], + [ + 103, + 351, + 2 + ], + [ + 148, + 1043, + 2 + ], + [ + 258, + 133, + 2 + ], + [ + 177, + 308, + 2 + ], + [ + 1029, + 289, + 6 + ], + [ + 1041, + 138, + 4 + ], + [ + 144, + 235, + 2 + ], + [ + 392, + 168, + 1 + ], + [ + 166, + 242, + 1 + ], + [ + 239, + 239, + 1 + ], + [ + 1038, + 180, + 4 + ], + [ + 145, + 1079, + 2 + ], + [ + 1024, + 344, + 4 + ], + [ + 1029, + 1127, + 5 + ], + [ + 233, + 179, + 2 + ], + [ + 294, + 294, + 3 + ], + [ + 305, + 305, + 3 + ], + [ + 1047, + 245, + 1 + ], + [ + 1118, + 149, + 3 + ], + [ + 1029, + 266, + 6 + ], + [ + 190, + 190, + 2 + ], + [ + 264, + 132, + 2 + ], + [ + 1031, + 244, + 2 + ], + [ + 1034, + 223, + 2 + ], + [ + 1136, + 148, + 3 + ], + [ + 149, + 231, + 2 + ], + [ + 349, + 349, + 1 + ], + [ + 679, + 679, + 2 + ], + [ + 136, + 1041, + 2 + ], + [ + 150, + 233, + 1 + ], + [ + 1031, + 243, + 2 + ], + [ + 221, + 155, + 2 + ], + [ + 1095, + 156, + 3 + ], + [ + 163, + 268, + 1 + ], + [ + 408, + 168, + 1 + ], + [ + 1040, + 156, + 4 + ], + [ + 104, + 324, + 1 + ], + [ + 150, + 241, + 1 + ], + [ + 1031, + 252, + 2 + ], + [ + 1096, + 152, + 2 + ], + [ + 1029, + 285, + 6 + ], + [ + 1031, + 1078, + 1 + ], + [ + 1097, + 168, + 2 + ], + [ + 1040, + 158, + 4 + ], + [ + 1049, + 144, + 1 + ], + [ + 176, + 220, + 2 + ], + [ + 1113, + 152, + 3 + ], + [ + 145, + 1060, + 2 + ], + [ + 1029, + 281, + 6 + ], + [ + 148, + 233, + 2 + ], + [ + 703, + 703, + 2 + ], + [ + 137, + 137, + 2 + ], + [ + 1031, + 257, + 2 + ], + [ + 1033, + 245, + 3 + ], + [ + 132, + 1052, + 2 + ], + [ + 226, + 103, + 2 + ], + [ + 249, + 177, + 2 + ], + [ + 292, + 180, + 1 + ], + [ + 96, + 96, + 2 + ], + [ + 649, + 649, + 2 + ], + [ + 1045, + 132, + 4 + ], + [ + 158, + 1162, + 1 + ], + [ + 219, + 219, + 6 + ], + [ + 223, + 1062, + 2 + ], + [ + 362, + 362, + 1 + ], + [ + 286, + 286, + 3 + ], + [ + 151, + 249, + 1 + ], + [ + 234, + 234, + 1 + ], + [ + 380, + 380, + 2 + ], + [ + 1054, + 132, + 4 + ], + [ + 138, + 1042, + 2 + ], + [ + 146, + 276, + 2 + ], + [ + 163, + 271, + 1 + ], + [ + 165, + 246, + 1 + ], + [ + 786, + 786, + 2 + ], + [ + 1025, + 283, + 2 + ], + [ + 145, + 228, + 2 + ], + [ + 164, + 117, + 2 + ], + [ + 222, + 144, + 1 + ], + [ + 378, + 172, + 1 + ], + [ + 132, + 252, + 2 + ], + [ + 147, + 189, + 1 + ], + [ + 1040, + 172, + 4 + ], + [ + 215, + 179, + 2 + ], + [ + 414, + 414, + 2 + ], + [ + 250, + 250, + 5 + ], + [ + 1042, + 138, + 4 + ], + [ + 150, + 217, + 2 + ], + [ + 162, + 162, + 4 + ], + [ + 258, + 136, + 2 + ], + [ + 1026, + 1092, + 3 + ], + [ + 104, + 319, + 1 + ], + [ + 358, + 236, + 2 + ], + [ + 1029, + 276, + 6 + ], + [ + 104, + 297, + 1 + ], + [ + 150, + 215, + 2 + ], + [ + 16, + 16, + 2 + ], + [ + 177, + 231, + 2 + ], + [ + 283, + 180, + 1 + ], + [ + 1038, + 181, + 4 + ], + [ + 1041, + 136, + 4 + ], + [ + 1042, + 136, + 4 + ], + [ + 147, + 269, + 2 + ], + [ + 151, + 224, + 1 + ], + [ + 177, + 304, + 2 + ], + [ + 421, + 421, + 2 + ], + [ + 1031, + 236, + 2 + ], + [ + 359, + 189, + 2 + ], + [ + 1029, + 1126, + 5 + ], + [ + 1061, + 179, + 4 + ], + [ + 138, + 224, + 3 + ], + [ + 148, + 1045, + 2 + ], + [ + 393, + 393, + 2 + ], + [ + 1029, + 269, + 6 + ], + [ + 177, + 331, + 2 + ], + [ + 1033, + 246, + 3 + ], + [ + 1034, + 214, + 2 + ], + [ + 103, + 355, + 2 + ], + [ + 265, + 168, + 2 + ], + [ + 293, + 166, + 1 + ], + [ + 1108, + 132, + 6 + ], + [ + 220, + 149, + 4 + ], + [ + 275, + 275, + 4 + ], + [ + 386, + 386, + 2 + ], + [ + 279, + 279, + 4 + ], + [ + 1097, + 156, + 2 + ], + [ + 255, + 133, + 1 + ], + [ + 220, + 176, + 2 + ], + [ + 226, + 226, + 6 + ], + [ + 1043, + 147, + 4 + ], + [ + 146, + 1046, + 2 + ], + [ + 270, + 270, + 4 + ], + [ + 431, + 431, + 2 + ], + [ + 1095, + 165, + 3 + ], + [ + 1142, + 172, + 1 + ], + [ + 280, + 280, + 4 + ], + [ + 1025, + 292, + 2 + ], + [ + 1034, + 222, + 2 + ], + [ + 262, + 133, + 1 + ], + [ + 329, + 173, + 1 + ], + [ + 1029, + 274, + 6 + ], + [ + 1042, + 148, + 4 + ], + [ + 1045, + 148, + 4 + ], + [ + 177, + 334, + 2 + ], + [ + 1031, + 1079, + 1 + ], + [ + 1034, + 217, + 2 + ], + [ + 230, + 144, + 2 + ], + [ + 240, + 149, + 5 + ], + [ + 328, + 328, + 3 + ], + [ + 1031, + 254, + 2 + ], + [ + 132, + 267, + 2 + ], + [ + 293, + 180, + 1 + ], + [ + 308, + 231, + 2 + ], + [ + 1066, + 147, + 4 + ], + [ + 152, + 318, + 1 + ], + [ + 314, + 314, + 3 + ], + [ + 158, + 330, + 1 + ], + [ + 179, + 320, + 2 + ], + [ + 1029, + 103, + 5 + ], + [ + 1034, + 248, + 2 + ], + [ + 1038, + 1344, + 2 + ], + [ + 103, + 304, + 2 + ], + [ + 147, + 1046, + 2 + ], + [ + 179, + 338, + 2 + ], + [ + 189, + 1067, + 2 + ], + [ + 1034, + 228, + 2 + ], + [ + 1034, + 235, + 2 + ], + [ + 133, + 306, + 2 + ], + [ + 1080, + 136, + 6 + ], + [ + 219, + 138, + 3 + ], + [ + 179, + 146, + 2 + ], + [ + 189, + 355, + 2 + ], + [ + 1052, + 1085, + 4 + ], + [ + 153, + 153, + 4 + ], + [ + 176, + 146, + 2 + ], + [ + 202, + 202, + 2 + ], + [ + 1025, + 293, + 2 + ], + [ + 226, + 144, + 2 + ], + [ + 163, + 1120, + 1 + ], + [ + 222, + 148, + 4 + ], + [ + 152, + 1027, + 1 + ], + [ + 1029, + 282, + 6 + ], + [ + 165, + 245, + 1 + ], + [ + 410, + 156, + 1 + ], + [ + 1058, + 132, + 4 + ], + [ + 158, + 1027, + 1 + ], + [ + 1032, + 301, + 3 + ], + [ + 1050, + 147, + 4 + ], + [ + 1207, + 170, + 6 + ], + [ + 285, + 146, + 2 + ], + [ + 339, + 339, + 1 + ], + [ + 152, + 319, + 1 + ], + [ + 179, + 233, + 2 + ], + [ + 1047, + 170, + 4 + ], + [ + 1095, + 166, + 3 + ], + [ + 149, + 1043, + 2 + ], + [ + 222, + 148, + 2 + ], + [ + 177, + 305, + 2 + ], + [ + 271, + 271, + 4 + ], + [ + 217, + 150, + 2 + ], + [ + 1052, + 132, + 4 + ], + [ + 138, + 254, + 2 + ], + [ + 140, + 200, + 2 + ], + [ + 1032, + 297, + 3 + ], + [ + 258, + 133, + 1 + ], + [ + 1065, + 146, + 6 + ], + [ + 19, + 19, + 2 + ], + [ + 215, + 145, + 2 + ], + [ + 266, + 266, + 4 + ], + [ + 1034, + 233, + 2 + ], + [ + 1034, + 1135, + 1 + ], + [ + 104, + 322, + 1 + ], + [ + 248, + 248, + 5 + ], + [ + 1051, + 136, + 4 + ], + [ + 1081, + 165, + 2 + ], + [ + 214, + 214, + 6 + ], + [ + 283, + 165, + 1 + ], + [ + 136, + 1045, + 2 + ], + [ + 170, + 1105, + 1 + ], + [ + 176, + 358, + 2 + ], + [ + 1029, + 277, + 6 + ], + [ + 327, + 327, + 3 + ], + [ + 1038, + 1272, + 2 + ], + [ + 36, + 36, + 2 + ], + [ + 138, + 144, + 1 + ], + [ + 191, + 191, + 2 + ], + [ + 801, + 801, + 1 + ], + [ + 1032, + 444, + 3 + ], + [ + 1054, + 147, + 4 + ], + [ + 136, + 1069, + 2 + ], + [ + 273, + 148, + 2 + ], + [ + 132, + 264, + 2 + ], + [ + 139, + 139, + 2 + ], + [ + 1031, + 241, + 2 + ], + [ + 255, + 255, + 2 + ], + [ + 1025, + 324, + 2 + ], + [ + 1034, + 1061, + 1 + ], + [ + 257, + 257, + 4 + ], + [ + 1029, + 280, + 6 + ], + [ + 1034, + 219, + 2 + ], + [ + 1095, + 158, + 3 + ], + [ + 228, + 145, + 2 + ], + [ + 333, + 333, + 3 + ], + [ + 1059, + 136, + 1 + ], + [ + 177, + 335, + 2 + ], + [ + 247, + 367, + 2 + ], + [ + 176, + 411, + 2 + ], + [ + 262, + 133, + 2 + ], + [ + 272, + 272, + 4 + ], + [ + 1033, + 168, + 4 + ], + [ + 260, + 152, + 1 + ], + [ + 1051, + 1083, + 4 + ], + [ + 180, + 152, + 1 + ], + [ + 224, + 144, + 1 + ], + [ + 1031, + 1078, + 2 + ], + [ + 138, + 1043, + 2 + ], + [ + 242, + 152, + 1 + ], + [ + 1034, + 262, + 2 + ], + [ + 1046, + 138, + 4 + ], + [ + 156, + 1093, + 1 + ], + [ + 1026, + 189, + 5 + ], + [ + 215, + 215, + 6 + ], + [ + 1029, + 295, + 6 + ], + [ + 149, + 240, + 3 + ], + [ + 166, + 245, + 1 + ], + [ + 217, + 217, + 7 + ], + [ + 1027, + 1093, + 4 + ], + [ + 1029, + 273, + 6 + ], + [ + 353, + 180, + 1 + ], + [ + 1025, + 444, + 2 + ], + [ + 158, + 158, + 1 + ], + [ + 269, + 269, + 4 + ], + [ + 326, + 326, + 2 + ], + [ + 1059, + 148, + 1 + ], + [ + 159, + 115, + 2 + ], + [ + 1054, + 136, + 4 + ], + [ + 170, + 245, + 1 + ], + [ + 309, + 226, + 1 + ], + [ + 163, + 1033, + 1 + ], + [ + 224, + 151, + 1 + ], + [ + 1045, + 146, + 4 + ], + [ + 132, + 1041, + 2 + ], + [ + 10, + 10, + 2 + ], + [ + 138, + 1066, + 2 + ], + [ + 148, + 1049, + 2 + ], + [ + 290, + 290, + 3 + ], + [ + 306, + 446, + 2 + ], + [ + 1029, + 1056, + 3 + ], + [ + 179, + 347, + 2 + ], + [ + 189, + 136, + 2 + ], + [ + 334, + 334, + 3 + ], + [ + 1046, + 136, + 4 + ], + [ + 1051, + 133, + 4 + ], + [ + 181, + 181, + 7 + ], + [ + 103, + 303, + 2 + ], + [ + 1034, + 215, + 2 + ], + [ + 1034, + 1075, + 1 + ], + [ + 1026, + 1098, + 3 + ], + [ + 1141, + 168, + 3 + ], + [ + 132, + 254, + 2 + ], + [ + 265, + 166, + 1 + ], + [ + 270, + 165, + 1 + ], + [ + 1025, + 297, + 2 + ], + [ + 150, + 144, + 1 + ], + [ + 151, + 144, + 1 + ], + [ + 146, + 1050, + 2 + ], + [ + 1125, + 147, + 6 + ], + [ + 113, + 157, + 2 + ], + [ + 123, + 123, + 2 + ], + [ + 177, + 147, + 2 + ], + [ + 1027, + 1139, + 4 + ], + [ + 1031, + 261, + 2 + ], + [ + 1045, + 149, + 4 + ], + [ + 1032, + 298, + 3 + ], + [ + 150, + 1069, + 2 + ], + [ + 276, + 276, + 3 + ], + [ + 389, + 168, + 1 + ], + [ + 1029, + 284, + 6 + ], + [ + 189, + 359, + 2 + ], + [ + 259, + 168, + 1 + ], + [ + 432, + 432, + 2 + ], + [ + 103, + 305, + 2 + ], + [ + 1054, + 146, + 4 + ], + [ + 1082, + 138, + 6 + ], + [ + 1207, + 156, + 6 + ], + [ + 1052, + 133, + 4 + ], + [ + 1138, + 152, + 3 + ], + [ + 214, + 151, + 2 + ], + [ + 231, + 231, + 6 + ], + [ + 1064, + 147, + 6 + ], + [ + 117, + 251, + 2 + ], + [ + 132, + 1051, + 2 + ], + [ + 176, + 228, + 2 + ], + [ + 1084, + 166, + 2 + ], + [ + 173, + 1033, + 1 + ], + [ + 1043, + 149, + 4 + ], + [ + 1059, + 132, + 1 + ], + [ + 1032, + 299, + 3 + ], + [ + 263, + 133, + 2 + ], + [ + 338, + 338, + 2 + ], + [ + 1029, + 288, + 6 + ], + [ + 25, + 25, + 2 + ], + [ + 177, + 219, + 2 + ], + [ + 445, + 445, + 2 + ], + [ + 104, + 110, + 1 + ], + [ + 170, + 1033, + 1 + ], + [ + 429, + 429, + 2 + ], + [ + 1031, + 1076, + 2 + ], + [ + 1059, + 147, + 1 + ], + [ + 148, + 236, + 4 + ], + [ + 1186, + 156, + 1 + ], + [ + 150, + 138, + 2 + ], + [ + 220, + 220, + 7 + ], + [ + 259, + 152, + 1 + ], + [ + 291, + 291, + 3 + ], + [ + 306, + 133, + 2 + ], + [ + 348, + 240, + 2 + ], + [ + 1038, + 1413, + 2 + ], + [ + 1094, + 1094, + 2 + ], + [ + 179, + 241, + 2 + ], + [ + 114, + 239, + 2 + ], + [ + 163, + 270, + 1 + ], + [ + 252, + 132, + 2 + ], + [ + 287, + 287, + 4 + ], + [ + 1053, + 176, + 7 + ], + [ + 1207, + 163, + 6 + ], + [ + 281, + 147, + 2 + ], + [ + 581, + 581, + 2 + ], + [ + 164, + 164, + 4 + ], + [ + 235, + 144, + 2 + ], + [ + 464, + 464, + 2 + ], + [ + 158, + 104, + 3 + ], + [ + 351, + 189, + 2 + ], + [ + 151, + 243, + 1 + ], + [ + 222, + 1067, + 2 + ], + [ + 1035, + 103, + 7 + ], + [ + 1036, + 179, + 4 + ], + [ + 1062, + 257, + 1 + ], + [ + 214, + 145, + 2 + ], + [ + 267, + 132, + 2 + ], + [ + 424, + 424, + 2 + ], + [ + 241, + 149, + 2 + ], + [ + 311, + 311, + 3 + ], + [ + 435, + 435, + 2 + ], + [ + 1141, + 152, + 3 + ], + [ + 246, + 152, + 1 + ], + [ + 323, + 323, + 2 + ], + [ + 172, + 1104, + 1 + ], + [ + 146, + 1052, + 2 + ], + [ + 243, + 151, + 1 + ], + [ + 264, + 264, + 3 + ], + [ + 215, + 150, + 2 + ], + [ + 1138, + 168, + 3 + ], + [ + 260, + 168, + 1 + ], + [ + 1036, + 177, + 4 + ], + [ + 1096, + 156, + 2 + ], + [ + 176, + 223, + 2 + ], + [ + 180, + 1033, + 1 + ], + [ + 224, + 224, + 6 + ], + [ + 518, + 518, + 2 + ], + [ + 249, + 249, + 6 + ], + [ + 1136, + 148, + 2 + ], + [ + 681, + 681, + 2 + ], + [ + 155, + 221, + 2 + ], + [ + 1029, + 286, + 6 + ], + [ + 154, + 216, + 2 + ], + [ + 1029, + 291, + 6 + ], + [ + 133, + 1045, + 2 + ], + [ + 141, + 199, + 2 + ], + [ + 144, + 1043, + 2 + ], + [ + 149, + 1041, + 2 + ], + [ + 1026, + 1130, + 3 + ], + [ + 1034, + 220, + 2 + ], + [ + 117, + 162, + 2 + ], + [ + 132, + 103, + 1 + ], + [ + 133, + 1043, + 2 + ], + [ + 189, + 138, + 2 + ], + [ + 1034, + 255, + 2 + ], + [ + 121, + 121, + 2 + ], + [ + 179, + 1061, + 2 + ], + [ + 442, + 442, + 2 + ], + [ + 233, + 148, + 2 + ], + [ + 400, + 156, + 1 + ], + [ + 405, + 405, + 2 + ], + [ + 149, + 241, + 2 + ], + [ + 254, + 254, + 4 + ], + [ + 1075, + 145, + 2 + ], + [ + 1206, + 170, + 1 + ], + [ + 419, + 419, + 2 + ], + [ + 144, + 1052, + 2 + ], + [ + 176, + 147, + 2 + ], + [ + 215, + 103, + 2 + ], + [ + 1141, + 156, + 3 + ], + [ + 172, + 270, + 1 + ], + [ + 179, + 226, + 2 + ], + [ + 271, + 166, + 1 + ], + [ + 132, + 1117, + 2 + ], + [ + 1059, + 146, + 1 + ], + [ + 167, + 237, + 2 + ], + [ + 437, + 437, + 2 + ], + [ + 767, + 767, + 2 + ], + [ + 1069, + 1070, + 1 + ], + [ + 1106, + 166, + 2 + ], + [ + 348, + 189, + 2 + ], + [ + 1207, + 158, + 6 + ], + [ + 176, + 417, + 2 + ], + [ + 245, + 245, + 5 + ], + [ + 1097, + 158, + 2 + ], + [ + 104, + 318, + 1 + ], + [ + 214, + 138, + 3 + ], + [ + 263, + 133, + 1 + ], + [ + 1186, + 165, + 1 + ], + [ + 145, + 1043, + 2 + ], + [ + 215, + 136, + 4 + ], + [ + 236, + 358, + 2 + ], + [ + 272, + 156, + 1 + ], + [ + 148, + 1057, + 2 + ], + [ + 1244, + 144, + 2 + ], + [ + 303, + 217, + 2 + ], + [ + 466, + 466, + 2 + ], + [ + 1034, + 258, + 2 + ], + [ + 113, + 159, + 2 + ], + [ + 149, + 241, + 4 + ], + [ + 149, + 1048, + 2 + ], + [ + 242, + 242, + 6 + ], + [ + 1059, + 149, + 1 + ], + [ + 133, + 1052, + 2 + ], + [ + 144, + 250, + 2 + ], + [ + 223, + 296, + 2 + ], + [ + 265, + 165, + 1 + ], + [ + 268, + 158, + 1 + ], + [ + 288, + 147, + 2 + ], + [ + 343, + 343, + 2 + ], + [ + 1186, + 170, + 1 + ], + [ + 246, + 246, + 6 + ], + [ + 1138, + 158, + 3 + ], + [ + 1207, + 152, + 6 + ], + [ + 172, + 172, + 2 + ], + [ + 373, + 189, + 2 + ], + [ + 376, + 376, + 2 + ], + [ + 1027, + 1099, + 4 + ], + [ + 1031, + 291, + 2 + ], + [ + 146, + 146, + 7 + ], + [ + 372, + 163, + 1 + ], + [ + 284, + 284, + 4 + ], + [ + 1237, + 189, + 4 + ], + [ + 114, + 105, + 2 + ], + [ + 138, + 150, + 2 + ], + [ + 228, + 302, + 2 + ], + [ + 1037, + 1086, + 5 + ], + [ + 233, + 103, + 2 + ], + [ + 371, + 163, + 1 + ], + [ + 138, + 1063, + 2 + ], + [ + 1062, + 261, + 1 + ], + [ + 1029, + 279, + 6 + ], + [ + 1029, + 278, + 6 + ], + [ + 1050, + 132, + 1 + ], + [ + 330, + 330, + 4 + ], + [ + 1034, + 1135, + 2 + ], + [ + 220, + 145, + 2 + ], + [ + 543, + 543, + 2 + ], + [ + 1040, + 180, + 4 + ], + [ + 136, + 1046, + 2 + ], + [ + 231, + 149, + 3 + ], + [ + 297, + 152, + 1 + ], + [ + 1026, + 1140, + 1 + ], + [ + 1033, + 1152, + 1 + ], + [ + 1106, + 165, + 2 + ], + [ + 104, + 321, + 1 + ], + [ + 149, + 231, + 3 + ], + [ + 219, + 151, + 2 + ], + [ + 278, + 278, + 2 + ], + [ + 316, + 316, + 2 + ], + [ + 1031, + 240, + 2 + ], + [ + 1047, + 168, + 4 + ], + [ + 133, + 1051, + 2 + ], + [ + 136, + 151, + 2 + ], + [ + 176, + 1155, + 2 + ], + [ + 1025, + 299, + 2 + ], + [ + 148, + 250, + 4 + ], + [ + 226, + 150, + 2 + ], + [ + 265, + 168, + 1 + ], + [ + 138, + 189, + 2 + ], + [ + 177, + 1076, + 2 + ], + [ + 292, + 292, + 4 + ], + [ + 1035, + 189, + 4 + ], + [ + 172, + 1032, + 1 + ], + [ + 251, + 382, + 2 + ], + [ + 1119, + 158, + 3 + ], + [ + 155, + 110, + 2 + ], + [ + 193, + 193, + 2 + ], + [ + 173, + 271, + 1 + ], + [ + 298, + 168, + 1 + ], + [ + 148, + 233, + 3 + ], + [ + 413, + 158, + 1 + ], + [ + 1058, + 145, + 4 + ], + [ + 132, + 1046, + 2 + ], + [ + 282, + 147, + 2 + ], + [ + 1035, + 189, + 2 + ], + [ + 1047, + 156, + 4 + ], + [ + 144, + 222, + 2 + ], + [ + 152, + 322, + 1 + ], + [ + 1026, + 176, + 5 + ], + [ + 1034, + 263, + 2 + ], + [ + 151, + 136, + 2 + ], + [ + 276, + 146, + 2 + ], + [ + 342, + 342, + 2 + ], + [ + 1059, + 138, + 1 + ], + [ + 1115, + 133, + 6 + ], + [ + 318, + 165, + 1 + ], + [ + 1047, + 1404, + 1 + ], + [ + 142, + 142, + 2 + ], + [ + 181, + 181, + 2 + ], + [ + 1025, + 298, + 2 + ], + [ + 1031, + 267, + 2 + ], + [ + 1031, + 274, + 2 + ], + [ + 138, + 1052, + 2 + ], + [ + 177, + 249, + 2 + ], + [ + 230, + 103, + 2 + ], + [ + 252, + 132, + 1 + ], + [ + 275, + 248, + 2 + ], + [ + 307, + 307, + 3 + ], + [ + 1029, + 1070, + 3 + ], + [ + 1092, + 1026, + 1 + ], + [ + 110, + 168, + 1 + ], + [ + 281, + 281, + 3 + ], + [ + 1029, + 1118, + 1 + ], + [ + 1129, + 168, + 4 + ], + [ + 153, + 216, + 2 + ], + [ + 181, + 1032, + 1 + ], + [ + 347, + 347, + 3 + ], + [ + 1031, + 286, + 2 + ], + [ + 1061, + 1061, + 2 + ], + [ + 1104, + 165, + 3 + ], + [ + 1129, + 166, + 4 + ], + [ + 1186, + 158, + 1 + ], + [ + 1207, + 180, + 6 + ], + [ + 152, + 321, + 1 + ], + [ + 147, + 176, + 2 + ], + [ + 1031, + 264, + 2 + ], + [ + 1124, + 146, + 6 + ], + [ + 1207, + 165, + 6 + ], + [ + 167, + 232, + 2 + ], + [ + 272, + 158, + 1 + ], + [ + 1034, + 1079, + 2 + ], + [ + 179, + 148, + 2 + ], + [ + 179, + 311, + 2 + ], + [ + 246, + 168, + 1 + ], + [ + 219, + 219, + 7 + ], + [ + 231, + 103, + 2 + ], + [ + 132, + 252, + 1 + ], + [ + 1038, + 1437, + 2 + ], + [ + 1119, + 165, + 3 + ], + [ + 351, + 351, + 2 + ], + [ + 1058, + 133, + 4 + ], + [ + 1186, + 166, + 1 + ], + [ + 1200, + 1033, + 1 + ], + [ + 144, + 1051, + 2 + ], + [ + 235, + 103, + 2 + ], + [ + 242, + 168, + 1 + ], + [ + 136, + 226, + 3 + ], + [ + 223, + 103, + 2 + ], + [ + 1048, + 145, + 5 + ], + [ + 1119, + 166, + 3 + ], + [ + 170, + 1037, + 1 + ], + [ + 358, + 176, + 2 + ], + [ + 1059, + 145, + 1 + ], + [ + 224, + 189, + 2 + ], + [ + 283, + 283, + 4 + ], + [ + 181, + 1033, + 1 + ], + [ + 214, + 103, + 2 + ], + [ + 1207, + 181, + 6 + ], + [ + 104, + 327, + 1 + ], + [ + 150, + 252, + 1 + ], + [ + 159, + 113, + 2 + ], + [ + 226, + 309, + 1 + ], + [ + 1034, + 236, + 2 + ], + [ + 1207, + 166, + 6 + ], + [ + 144, + 1045, + 2 + ], + [ + 1034, + 1076, + 2 + ], + [ + 1078, + 189, + 3 + ], + [ + 145, + 267, + 2 + ], + [ + 119, + 119, + 3 + ], + [ + 147, + 1050, + 2 + ], + [ + 1025, + 301, + 2 + ], + [ + 1034, + 1061, + 2 + ], + [ + 1031, + 273, + 2 + ], + [ + 254, + 132, + 1 + ], + [ + 1035, + 1151, + 2 + ], + [ + 576, + 576, + 2 + ], + [ + 224, + 177, + 2 + ], + [ + 1106, + 158, + 2 + ], + [ + 1067, + 1067, + 2 + ], + [ + 149, + 133, + 1 + ], + [ + 230, + 189, + 2 + ], + [ + 156, + 156, + 1 + ], + [ + 613, + 613, + 2 + ], + [ + 1077, + 170, + 2 + ], + [ + 145, + 264, + 2 + ], + [ + 146, + 1054, + 2 + ], + [ + 261, + 261, + 4 + ], + [ + 398, + 152, + 1 + ], + [ + 1047, + 172, + 4 + ], + [ + 151, + 255, + 1 + ], + [ + 268, + 156, + 1 + ], + [ + 1031, + 300, + 2 + ], + [ + 149, + 138, + 1 + ], + [ + 88, + 88, + 1 + ], + [ + 1035, + 176, + 2 + ], + [ + 148, + 233, + 4 + ], + [ + 151, + 219, + 2 + ], + [ + 177, + 214, + 2 + ], + [ + 237, + 153, + 2 + ], + [ + 1031, + 1056, + 2 + ], + [ + 1138, + 156, + 3 + ], + [ + 1206, + 166, + 1 + ], + [ + 1219, + 156, + 1 + ], + [ + 103, + 132, + 1 + ], + [ + 136, + 1054, + 2 + ], + [ + 150, + 244, + 1 + ], + [ + 279, + 146, + 2 + ], + [ + 346, + 346, + 3 + ], + [ + 1081, + 170, + 2 + ], + [ + 528, + 366, + 2 + ], + [ + 1058, + 147, + 4 + ], + [ + 117, + 117, + 4 + ], + [ + 433, + 168, + 1 + ], + [ + 164, + 114, + 2 + ], + [ + 571, + 571, + 2 + ], + [ + 145, + 1045, + 2 + ], + [ + 148, + 1042, + 2 + ], + [ + 1031, + 266, + 2 + ], + [ + 110, + 154, + 2 + ], + [ + 162, + 115, + 2 + ], + [ + 662, + 662, + 2 + ], + [ + 1035, + 1083, + 2 + ], + [ + 1087, + 1060, + 1 + ], + [ + 103, + 136, + 1 + ], + [ + 179, + 215, + 2 + ], + [ + 241, + 149, + 4 + ], + [ + 297, + 168, + 1 + ], + [ + 389, + 172, + 1 + ], + [ + 1074, + 1260, + 3 + ], + [ + 105, + 113, + 2 + ], + [ + 1120, + 156, + 4 + ], + [ + 1143, + 180, + 4 + ], + [ + 103, + 331, + 2 + ], + [ + 150, + 146, + 1 + ], + [ + 158, + 1099, + 1 + ], + [ + 1031, + 276, + 2 + ], + [ + 1119, + 156, + 3 + ], + [ + 132, + 1054, + 2 + ], + [ + 133, + 1054, + 2 + ], + [ + 136, + 1051, + 2 + ], + [ + 1032, + 346, + 3 + ], + [ + 104, + 329, + 1 + ], + [ + 163, + 1037, + 1 + ], + [ + 1029, + 306, + 6 + ], + [ + 221, + 221, + 4 + ], + [ + 258, + 258, + 2 + ], + [ + 339, + 157, + 2 + ], + [ + 1035, + 1187, + 2 + ], + [ + 1040, + 181, + 4 + ], + [ + 1063, + 151, + 3 + ], + [ + 1156, + 165, + 4 + ], + [ + 148, + 222, + 5 + ], + [ + 217, + 303, + 2 + ], + [ + 286, + 286, + 4 + ], + [ + 459, + 459, + 3 + ], + [ + 146, + 223, + 3 + ], + [ + 179, + 369, + 2 + ], + [ + 275, + 220, + 2 + ], + [ + 1031, + 269, + 2 + ], + [ + 148, + 222, + 3 + ], + [ + 173, + 173, + 6 + ], + [ + 243, + 243, + 6 + ], + [ + 254, + 132, + 2 + ], + [ + 298, + 152, + 1 + ], + [ + 1134, + 168, + 4 + ], + [ + 214, + 214, + 7 + ], + [ + 712, + 712, + 2 + ], + [ + 132, + 344, + 2 + ], + [ + 398, + 156, + 1 + ], + [ + 1066, + 148, + 4 + ], + [ + 1113, + 166, + 3 + ], + [ + 274, + 274, + 3 + ], + [ + 315, + 315, + 3 + ], + [ + 1026, + 1247, + 1 + ], + [ + 226, + 144, + 1 + ], + [ + 235, + 189, + 2 + ], + [ + 282, + 282, + 3 + ], + [ + 1027, + 292, + 4 + ], + [ + 1052, + 138, + 4 + ], + [ + 1066, + 1056, + 1 + ], + [ + 170, + 1077, + 1 + ], + [ + 218, + 218, + 2 + ], + [ + 1259, + 156, + 1 + ], + [ + 376, + 163, + 1 + ], + [ + 1024, + 296, + 4 + ], + [ + 1035, + 1161, + 2 + ], + [ + 299, + 156, + 1 + ], + [ + 1088, + 240, + 2 + ], + [ + 1152, + 166, + 4 + ], + [ + 285, + 285, + 3 + ], + [ + 1037, + 245, + 5 + ], + [ + 1041, + 189, + 4 + ], + [ + 1207, + 172, + 6 + ], + [ + 133, + 255, + 1 + ], + [ + 147, + 1054, + 2 + ], + [ + 257, + 296, + 2 + ], + [ + 1106, + 156, + 2 + ], + [ + 1257, + 158, + 1 + ], + [ + 136, + 215, + 3 + ], + [ + 224, + 151, + 2 + ], + [ + 1105, + 170, + 2 + ], + [ + 1134, + 165, + 4 + ], + [ + 228, + 1062, + 2 + ], + [ + 103, + 145, + 1 + ], + [ + 147, + 1051, + 2 + ], + [ + 1031, + 280, + 2 + ], + [ + 1058, + 146, + 4 + ], + [ + 1257, + 163, + 1 + ], + [ + 138, + 249, + 3 + ], + [ + 242, + 170, + 1 + ], + [ + 1026, + 1115, + 1 + ], + [ + 1207, + 168, + 6 + ], + [ + 1038, + 245, + 2 + ], + [ + 132, + 254, + 1 + ], + [ + 1206, + 165, + 1 + ], + [ + 136, + 189, + 2 + ], + [ + 228, + 103, + 2 + ], + [ + 1060, + 1048, + 1 + ], + [ + 150, + 226, + 2 + ], + [ + 152, + 1086, + 1 + ], + [ + 211, + 211, + 2 + ], + [ + 144, + 151, + 1 + ], + [ + 301, + 166, + 1 + ], + [ + 331, + 331, + 3 + ], + [ + 420, + 156, + 1 + ], + [ + 1034, + 249, + 2 + ], + [ + 446, + 222, + 2 + ], + [ + 1032, + 327, + 3 + ], + [ + 110, + 155, + 2 + ], + [ + 1029, + 309, + 6 + ], + [ + 283, + 166, + 1 + ], + [ + 425, + 158, + 1 + ], + [ + 1031, + 278, + 2 + ], + [ + 1031, + 289, + 2 + ], + [ + 314, + 157, + 2 + ], + [ + 1034, + 1079, + 1 + ], + [ + 1035, + 176, + 4 + ], + [ + 224, + 103, + 2 + ], + [ + 248, + 149, + 5 + ], + [ + 293, + 293, + 4 + ], + [ + 159, + 313, + 2 + ], + [ + 570, + 570, + 2 + ], + [ + 1035, + 1085, + 2 + ], + [ + 1224, + 165, + 1 + ], + [ + 1047, + 158, + 4 + ], + [ + 1058, + 138, + 4 + ], + [ + 136, + 1050, + 2 + ], + [ + 1031, + 284, + 2 + ], + [ + 1047, + 165, + 4 + ], + [ + 1056, + 177, + 1 + ], + [ + 1146, + 173, + 1 + ], + [ + 349, + 251, + 2 + ], + [ + 1031, + 282, + 2 + ], + [ + 1031, + 1076, + 1 + ], + [ + 244, + 244, + 6 + ], + [ + 377, + 377, + 2 + ], + [ + 1062, + 220, + 4 + ], + [ + 1133, + 163, + 3 + ], + [ + 103, + 373, + 2 + ], + [ + 113, + 247, + 2 + ], + [ + 146, + 279, + 2 + ], + [ + 298, + 298, + 4 + ], + [ + 252, + 150, + 1 + ], + [ + 1206, + 168, + 1 + ], + [ + 1224, + 156, + 1 + ], + [ + 151, + 254, + 1 + ], + [ + 144, + 1098, + 2 + ], + [ + 148, + 233, + 5 + ], + [ + 1047, + 166, + 4 + ], + [ + 1111, + 1111, + 4 + ], + [ + 1232, + 165, + 1 + ], + [ + 148, + 250, + 5 + ], + [ + 245, + 104, + 1 + ], + [ + 265, + 158, + 1 + ], + [ + 304, + 304, + 4 + ], + [ + 132, + 257, + 1 + ], + [ + 264, + 264, + 4 + ], + [ + 1027, + 287, + 4 + ], + [ + 1026, + 1293, + 1 + ], + [ + 138, + 1050, + 2 + ], + [ + 230, + 230, + 6 + ], + [ + 257, + 145, + 2 + ], + [ + 1027, + 293, + 4 + ], + [ + 1129, + 152, + 4 + ], + [ + 135, + 135, + 2 + ], + [ + 1024, + 144, + 1 + ], + [ + 1026, + 1250, + 1 + ], + [ + 1029, + 300, + 6 + ], + [ + 1034, + 1076, + 1 + ], + [ + 231, + 149, + 4 + ], + [ + 1024, + 302, + 4 + ], + [ + 1027, + 259, + 4 + ], + [ + 1246, + 1075, + 6 + ], + [ + 248, + 176, + 2 + ], + [ + 500, + 500, + 2 + ], + [ + 133, + 1092, + 2 + ], + [ + 138, + 1051, + 2 + ], + [ + 163, + 299, + 1 + ], + [ + 362, + 362, + 3 + ], + [ + 745, + 745, + 2 + ], + [ + 1056, + 1056, + 2 + ], + [ + 133, + 1042, + 2 + ], + [ + 267, + 136, + 2 + ], + [ + 1026, + 1254, + 1 + ], + [ + 1059, + 150, + 1 + ], + [ + 138, + 1046, + 2 + ], + [ + 136, + 1052, + 2 + ], + [ + 180, + 287, + 1 + ], + [ + 252, + 145, + 2 + ], + [ + 345, + 526, + 2 + ], + [ + 1207, + 173, + 6 + ], + [ + 118, + 118, + 3 + ], + [ + 241, + 149, + 5 + ], + [ + 1240, + 165, + 1 + ], + [ + 170, + 1128, + 1 + ], + [ + 177, + 132, + 2 + ], + [ + 222, + 189, + 2 + ], + [ + 1027, + 268, + 4 + ], + [ + 1041, + 149, + 4 + ], + [ + 1066, + 146, + 4 + ], + [ + 1069, + 146, + 4 + ], + [ + 177, + 148, + 2 + ], + [ + 1108, + 145, + 6 + ], + [ + 173, + 318, + 1 + ], + [ + 233, + 325, + 2 + ], + [ + 1208, + 1036, + 1 + ], + [ + 165, + 271, + 1 + ], + [ + 165, + 1077, + 1 + ], + [ + 214, + 176, + 2 + ], + [ + 292, + 158, + 1 + ], + [ + 104, + 167, + 1 + ], + [ + 198, + 198, + 2 + ], + [ + 1031, + 277, + 2 + ], + [ + 157, + 157, + 4 + ], + [ + 273, + 273, + 4 + ], + [ + 320, + 320, + 4 + ], + [ + 329, + 329, + 4 + ], + [ + 1024, + 307, + 4 + ], + [ + 1025, + 322, + 2 + ], + [ + 1031, + 309, + 2 + ], + [ + 1034, + 244, + 2 + ], + [ + 104, + 353, + 1 + ], + [ + 162, + 117, + 2 + ], + [ + 163, + 1112, + 1 + ], + [ + 260, + 260, + 6 + ], + [ + 684, + 684, + 2 + ], + [ + 1026, + 177, + 3 + ], + [ + 103, + 338, + 2 + ], + [ + 151, + 224, + 2 + ], + [ + 155, + 155, + 4 + ], + [ + 1036, + 248, + 4 + ], + [ + 303, + 303, + 4 + ], + [ + 372, + 321, + 1 + ], + [ + 103, + 333, + 2 + ], + [ + 491, + 361, + 2 + ], + [ + 1141, + 158, + 3 + ], + [ + 215, + 252, + 2 + ], + [ + 301, + 152, + 1 + ], + [ + 617, + 617, + 2 + ], + [ + 1031, + 1067, + 2 + ], + [ + 147, + 282, + 2 + ], + [ + 241, + 179, + 2 + ], + [ + 308, + 231, + 3 + ], + [ + 369, + 369, + 2 + ], + [ + 136, + 217, + 3 + ], + [ + 257, + 132, + 1 + ], + [ + 448, + 177, + 2 + ], + [ + 1027, + 272, + 4 + ], + [ + 1224, + 166, + 1 + ], + [ + 146, + 179, + 2 + ], + [ + 226, + 179, + 2 + ], + [ + 235, + 235, + 6 + ], + [ + 409, + 409, + 3 + ], + [ + 147, + 1048, + 2 + ], + [ + 215, + 307, + 2 + ], + [ + 103, + 325, + 2 + ], + [ + 103, + 359, + 2 + ], + [ + 430, + 430, + 2 + ], + [ + 1026, + 1115, + 3 + ], + [ + 150, + 252, + 2 + ], + [ + 172, + 1033, + 1 + ], + [ + 268, + 268, + 5 + ], + [ + 257, + 132, + 2 + ], + [ + 212, + 212, + 2 + ], + [ + 270, + 170, + 1 + ], + [ + 1079, + 132, + 3 + ], + [ + 136, + 144, + 1 + ], + [ + 259, + 259, + 6 + ], + [ + 1035, + 1193, + 2 + ], + [ + 1072, + 1404, + 2 + ], + [ + 1120, + 166, + 4 + ], + [ + 249, + 148, + 2 + ], + [ + 265, + 181, + 1 + ], + [ + 296, + 223, + 2 + ], + [ + 1050, + 136, + 4 + ], + [ + 104, + 326, + 1 + ], + [ + 189, + 147, + 1 + ], + [ + 327, + 327, + 4 + ], + [ + 1206, + 163, + 1 + ], + [ + 1076, + 1076, + 2 + ], + [ + 276, + 276, + 2 + ], + [ + 1026, + 1252, + 1 + ], + [ + 138, + 176, + 2 + ], + [ + 728, + 728, + 2 + ], + [ + 1041, + 1067, + 4 + ], + [ + 770, + 770, + 2 + ], + [ + 177, + 224, + 2 + ], + [ + 1031, + 285, + 2 + ], + [ + 1070, + 179, + 5 + ], + [ + 149, + 1046, + 2 + ], + [ + 1259, + 163, + 1 + ], + [ + 104, + 346, + 1 + ], + [ + 1027, + 260, + 4 + ], + [ + 1034, + 1229, + 1 + ], + [ + 1059, + 151, + 1 + ], + [ + 1120, + 165, + 4 + ], + [ + 133, + 222, + 3 + ], + [ + 197, + 197, + 2 + ], + [ + 250, + 189, + 2 + ], + [ + 1032, + 319, + 3 + ], + [ + 103, + 1110, + 2 + ], + [ + 104, + 330, + 1 + ], + [ + 162, + 328, + 2 + ], + [ + 167, + 110, + 2 + ], + [ + 267, + 145, + 2 + ], + [ + 1074, + 1239, + 3 + ], + [ + 1050, + 176, + 4 + ], + [ + 1097, + 163, + 2 + ], + [ + 147, + 1058, + 2 + ], + [ + 1027, + 271, + 4 + ], + [ + 103, + 335, + 2 + ], + [ + 275, + 248, + 3 + ], + [ + 1026, + 1278, + 1 + ], + [ + 103, + 334, + 2 + ], + [ + 145, + 254, + 2 + ], + [ + 147, + 281, + 2 + ], + [ + 226, + 189, + 2 + ], + [ + 269, + 269, + 5 + ], + [ + 447, + 447, + 1 + ], + [ + 1057, + 148, + 6 + ], + [ + 214, + 305, + 2 + ], + [ + 233, + 150, + 2 + ], + [ + 1034, + 240, + 2 + ], + [ + 144, + 136, + 1 + ], + [ + 166, + 1077, + 1 + ], + [ + 215, + 311, + 2 + ], + [ + 233, + 1061, + 1 + ], + [ + 1026, + 1243, + 1 + ], + [ + 1120, + 158, + 4 + ], + [ + 133, + 262, + 1 + ], + [ + 147, + 1049, + 2 + ], + [ + 1031, + 281, + 2 + ], + [ + 215, + 176, + 2 + ], + [ + 144, + 138, + 1 + ], + [ + 154, + 110, + 2 + ], + [ + 486, + 486, + 2 + ], + [ + 1026, + 1321, + 1 + ], + [ + 1047, + 173, + 4 + ], + [ + 1066, + 132, + 4 + ], + [ + 1143, + 163, + 4 + ], + [ + 103, + 375, + 2 + ], + [ + 146, + 1048, + 2 + ], + [ + 149, + 179, + 2 + ], + [ + 407, + 152, + 1 + ], + [ + 1034, + 1075, + 2 + ], + [ + 166, + 270, + 1 + ], + [ + 242, + 165, + 1 + ], + [ + 1036, + 1183, + 1 + ], + [ + 149, + 189, + 2 + ], + [ + 177, + 377, + 2 + ], + [ + 250, + 148, + 2 + ], + [ + 1172, + 168, + 4 + ], + [ + 288, + 288, + 4 + ], + [ + 319, + 319, + 3 + ], + [ + 366, + 507, + 2 + ], + [ + 1033, + 1156, + 1 + ], + [ + 122, + 122, + 2 + ], + [ + 150, + 1041, + 2 + ], + [ + 1025, + 321, + 2 + ], + [ + 148, + 1052, + 2 + ], + [ + 152, + 180, + 1 + ], + [ + 155, + 232, + 2 + ], + [ + 1033, + 265, + 1 + ], + [ + 1037, + 1137, + 5 + ], + [ + 235, + 1083, + 2 + ], + [ + 1060, + 149, + 6 + ], + [ + 291, + 291, + 4 + ], + [ + 407, + 158, + 1 + ], + [ + 1043, + 144, + 4 + ], + [ + 136, + 1089, + 2 + ], + [ + 223, + 1083, + 2 + ], + [ + 241, + 150, + 1 + ], + [ + 245, + 181, + 1 + ], + [ + 306, + 446, + 3 + ], + [ + 379, + 379, + 3 + ], + [ + 1026, + 179, + 3 + ], + [ + 1040, + 1086, + 1 + ], + [ + 1051, + 148, + 4 + ], + [ + 1111, + 1067, + 4 + ], + [ + 1128, + 170, + 3 + ], + [ + 145, + 257, + 2 + ], + [ + 392, + 173, + 1 + ], + [ + 1255, + 1036, + 1 + ], + [ + 133, + 263, + 1 + ], + [ + 1116, + 179, + 5 + ], + [ + 113, + 113, + 4 + ], + [ + 176, + 136, + 2 + ], + [ + 233, + 150, + 1 + ], + [ + 297, + 297, + 4 + ], + [ + 353, + 353, + 4 + ], + [ + 1034, + 243, + 2 + ], + [ + 138, + 1091, + 2 + ], + [ + 274, + 274, + 4 + ], + [ + 443, + 158, + 1 + ], + [ + 148, + 1051, + 2 + ], + [ + 318, + 371, + 1 + ], + [ + 378, + 378, + 3 + ], + [ + 1027, + 324, + 4 + ], + [ + 1034, + 1127, + 1 + ], + [ + 244, + 150, + 1 + ], + [ + 249, + 151, + 1 + ], + [ + 1172, + 158, + 4 + ], + [ + 1052, + 148, + 4 + ], + [ + 255, + 151, + 1 + ], + [ + 146, + 1064, + 2 + ], + [ + 166, + 1081, + 1 + ], + [ + 340, + 340, + 2 + ], + [ + 252, + 150, + 2 + ], + [ + 364, + 364, + 2 + ], + [ + 1027, + 270, + 4 + ], + [ + 114, + 114, + 4 + ], + [ + 138, + 1054, + 2 + ], + [ + 226, + 226, + 7 + ], + [ + 240, + 402, + 2 + ], + [ + 1032, + 321, + 3 + ], + [ + 1034, + 278, + 2 + ], + [ + 140, + 140, + 3 + ], + [ + 147, + 177, + 2 + ], + [ + 287, + 158, + 1 + ], + [ + 477, + 477, + 2 + ], + [ + 1034, + 231, + 2 + ], + [ + 1043, + 145, + 4 + ], + [ + 1096, + 163, + 2 + ], + [ + 1134, + 152, + 4 + ], + [ + 1026, + 230, + 1 + ], + [ + 115, + 159, + 2 + ], + [ + 180, + 292, + 1 + ], + [ + 251, + 349, + 1 + ], + [ + 301, + 301, + 2 + ], + [ + 1224, + 158, + 1 + ], + [ + 104, + 154, + 1 + ], + [ + 149, + 1051, + 2 + ], + [ + 472, + 472, + 3 + ], + [ + 1037, + 265, + 5 + ], + [ + 422, + 152, + 1 + ], + [ + 344, + 132, + 2 + ], + [ + 1031, + 295, + 2 + ], + [ + 293, + 165, + 1 + ], + [ + 104, + 368, + 1 + ], + [ + 136, + 176, + 2 + ], + [ + 147, + 288, + 2 + ], + [ + 189, + 230, + 2 + ], + [ + 252, + 179, + 2 + ], + [ + 144, + 1042, + 2 + ], + [ + 149, + 177, + 2 + ], + [ + 156, + 1077, + 1 + ], + [ + 216, + 216, + 4 + ], + [ + 245, + 172, + 1 + ], + [ + 254, + 151, + 1 + ], + [ + 1056, + 177, + 2 + ], + [ + 1072, + 245, + 2 + ], + [ + 1202, + 176, + 2 + ], + [ + 243, + 177, + 2 + ], + [ + 406, + 177, + 2 + ], + [ + 1025, + 319, + 2 + ], + [ + 1026, + 223, + 1 + ], + [ + 1036, + 250, + 4 + ], + [ + 1057, + 133, + 3 + ], + [ + 147, + 1066, + 2 + ], + [ + 192, + 192, + 2 + ], + [ + 339, + 247, + 2 + ], + [ + 396, + 396, + 3 + ], + [ + 115, + 162, + 2 + ], + [ + 132, + 261, + 2 + ], + [ + 149, + 1052, + 2 + ], + [ + 266, + 266, + 5 + ], + [ + 1024, + 315, + 4 + ], + [ + 1130, + 145, + 6 + ], + [ + 1240, + 166, + 1 + ], + [ + 149, + 248, + 2 + ], + [ + 149, + 1088, + 2 + ], + [ + 224, + 255, + 2 + ], + [ + 349, + 251, + 1 + ], + [ + 1061, + 1061, + 3 + ], + [ + 1305, + 222, + 4 + ], + [ + 103, + 308, + 2 + ], + [ + 358, + 358, + 3 + ], + [ + 399, + 399, + 3 + ], + [ + 1037, + 1139, + 5 + ], + [ + 189, + 1078, + 2 + ], + [ + 1031, + 1126, + 1 + ], + [ + 1055, + 146, + 6 + ], + [ + 231, + 308, + 2 + ], + [ + 283, + 232, + 2 + ], + [ + 1041, + 144, + 3 + ], + [ + 1099, + 165, + 2 + ], + [ + 264, + 145, + 2 + ], + [ + 287, + 156, + 1 + ], + [ + 302, + 228, + 2 + ], + [ + 103, + 151, + 1 + ], + [ + 219, + 304, + 2 + ], + [ + 104, + 155, + 1 + ], + [ + 110, + 158, + 1 + ], + [ + 146, + 217, + 3 + ], + [ + 237, + 237, + 4 + ], + [ + 1219, + 168, + 1 + ], + [ + 233, + 325, + 3 + ], + [ + 313, + 159, + 2 + ], + [ + 1026, + 176, + 3 + ], + [ + 1048, + 146, + 6 + ], + [ + 1112, + 152, + 2 + ], + [ + 280, + 280, + 5 + ], + [ + 508, + 508, + 2 + ], + [ + 1027, + 283, + 4 + ], + [ + 1036, + 228, + 4 + ], + [ + 1037, + 1093, + 5 + ], + [ + 1089, + 1089, + 2 + ], + [ + 207, + 207, + 2 + ], + [ + 239, + 314, + 2 + ], + [ + 417, + 176, + 2 + ], + [ + 1058, + 136, + 4 + ], + [ + 1129, + 165, + 4 + ], + [ + 133, + 258, + 1 + ], + [ + 147, + 1065, + 2 + ], + [ + 411, + 176, + 2 + ], + [ + 261, + 132, + 1 + ], + [ + 1033, + 270, + 1 + ], + [ + 103, + 1116, + 2 + ], + [ + 132, + 257, + 2 + ], + [ + 145, + 1051, + 2 + ], + [ + 148, + 151, + 1 + ], + [ + 224, + 224, + 7 + ], + [ + 103, + 347, + 2 + ], + [ + 133, + 250, + 2 + ], + [ + 147, + 179, + 2 + ], + [ + 223, + 252, + 1 + ], + [ + 156, + 1188, + 1 + ], + [ + 363, + 152, + 1 + ], + [ + 1034, + 1126, + 1 + ], + [ + 1045, + 144, + 4 + ], + [ + 1169, + 170, + 3 + ], + [ + 146, + 103, + 1 + ], + [ + 1032, + 322, + 3 + ], + [ + 217, + 136, + 3 + ], + [ + 222, + 144, + 2 + ], + [ + 277, + 277, + 3 + ], + [ + 1031, + 1127, + 1 + ], + [ + 1143, + 165, + 4 + ], + [ + 240, + 348, + 3 + ], + [ + 1025, + 327, + 2 + ], + [ + 105, + 114, + 2 + ], + [ + 365, + 365, + 2 + ], + [ + 148, + 236, + 5 + ], + [ + 1257, + 156, + 1 + ], + [ + 278, + 278, + 5 + ], + [ + 1091, + 1091, + 2 + ], + [ + 1232, + 166, + 1 + ], + [ + 1246, + 1079, + 6 + ], + [ + 163, + 163, + 6 + ], + [ + 180, + 1032, + 1 + ], + [ + 219, + 1056, + 2 + ], + [ + 228, + 1085, + 2 + ], + [ + 1036, + 223, + 4 + ], + [ + 189, + 235, + 2 + ], + [ + 189, + 1024, + 2 + ], + [ + 246, + 181, + 1 + ], + [ + 1025, + 318, + 2 + ], + [ + 151, + 1052, + 2 + ], + [ + 214, + 1062, + 2 + ], + [ + 1219, + 158, + 1 + ], + [ + 103, + 320, + 2 + ], + [ + 1026, + 1130, + 1 + ], + [ + 1098, + 148, + 6 + ], + [ + 110, + 152, + 1 + ], + [ + 132, + 1049, + 2 + ], + [ + 172, + 301, + 1 + ], + [ + 416, + 158, + 1 + ], + [ + 189, + 351, + 2 + ], + [ + 209, + 209, + 2 + ], + [ + 267, + 267, + 3 + ], + [ + 367, + 159, + 2 + ], + [ + 1034, + 300, + 2 + ], + [ + 1055, + 150, + 5 + ], + [ + 154, + 221, + 2 + ], + [ + 215, + 1062, + 2 + ], + [ + 239, + 114, + 2 + ], + [ + 254, + 145, + 2 + ], + [ + 255, + 255, + 4 + ], + [ + 144, + 1197, + 2 + ], + [ + 214, + 147, + 2 + ], + [ + 532, + 532, + 2 + ], + [ + 1066, + 133, + 4 + ], + [ + 1086, + 166, + 2 + ], + [ + 448, + 234, + 2 + ], + [ + 1040, + 1137, + 1 + ], + [ + 1048, + 1060, + 1 + ], + [ + 103, + 386, + 2 + ], + [ + 172, + 321, + 1 + ], + [ + 230, + 1085, + 2 + ], + [ + 1034, + 1258, + 1 + ], + [ + 1054, + 138, + 4 + ], + [ + 146, + 285, + 2 + ], + [ + 213, + 213, + 2 + ], + [ + 1026, + 179, + 1 + ], + [ + 1033, + 259, + 1 + ], + [ + 1093, + 242, + 4 + ], + [ + 104, + 153, + 1 + ], + [ + 156, + 245, + 1 + ], + [ + 304, + 219, + 2 + ], + [ + 1034, + 241, + 2 + ], + [ + 1224, + 170, + 1 + ], + [ + 165, + 270, + 1 + ], + [ + 150, + 1051, + 2 + ], + [ + 1033, + 272, + 1 + ], + [ + 1034, + 274, + 2 + ], + [ + 1219, + 172, + 1 + ], + [ + 146, + 1049, + 2 + ], + [ + 261, + 132, + 2 + ], + [ + 146, + 1058, + 2 + ], + [ + 173, + 327, + 1 + ], + [ + 180, + 180, + 2 + ], + [ + 375, + 375, + 3 + ], + [ + 1035, + 179, + 2 + ], + [ + 104, + 363, + 1 + ], + [ + 141, + 141, + 3 + ], + [ + 136, + 1048, + 2 + ], + [ + 152, + 324, + 1 + ], + [ + 214, + 254, + 2 + ], + [ + 1050, + 138, + 4 + ], + [ + 1177, + 168, + 4 + ], + [ + 367, + 247, + 2 + ], + [ + 421, + 421, + 3 + ], + [ + 103, + 369, + 2 + ], + [ + 295, + 295, + 4 + ], + [ + 151, + 254, + 2 + ], + [ + 219, + 1085, + 2 + ], + [ + 258, + 258, + 4 + ], + [ + 148, + 249, + 2 + ], + [ + 214, + 1056, + 2 + ], + [ + 1026, + 1140, + 3 + ], + [ + 146, + 1069, + 2 + ], + [ + 148, + 179, + 2 + ], + [ + 176, + 215, + 2 + ], + [ + 250, + 103, + 2 + ], + [ + 328, + 162, + 2 + ], + [ + 383, + 383, + 2 + ], + [ + 1034, + 1067, + 2 + ], + [ + 1172, + 156, + 4 + ], + [ + 144, + 150, + 1 + ], + [ + 166, + 265, + 1 + ], + [ + 189, + 1135, + 2 + ], + [ + 1143, + 156, + 4 + ], + [ + 151, + 231, + 2 + ], + [ + 154, + 154, + 4 + ], + [ + 148, + 1066, + 2 + ], + [ + 151, + 1042, + 2 + ], + [ + 706, + 706, + 2 + ], + [ + 1027, + 297, + 4 + ], + [ + 1179, + 172, + 5 + ], + [ + 145, + 1052, + 2 + ], + [ + 150, + 149, + 1 + ], + [ + 279, + 279, + 5 + ], + [ + 1024, + 275, + 4 + ], + [ + 1115, + 144, + 6 + ], + [ + 1143, + 158, + 4 + ], + [ + 176, + 138, + 2 + ], + [ + 1033, + 272, + 3 + ], + [ + 1035, + 179, + 4 + ], + [ + 1232, + 158, + 1 + ], + [ + 133, + 255, + 2 + ], + [ + 136, + 1058, + 2 + ], + [ + 217, + 1070, + 2 + ], + [ + 260, + 170, + 1 + ], + [ + 480, + 480, + 2 + ], + [ + 1031, + 288, + 2 + ], + [ + 145, + 1054, + 2 + ], + [ + 150, + 1080, + 2 + ], + [ + 173, + 283, + 1 + ], + [ + 233, + 233, + 7 + ], + [ + 1130, + 132, + 6 + ], + [ + 149, + 220, + 3 + ], + [ + 156, + 410, + 1 + ], + [ + 299, + 158, + 1 + ], + [ + 301, + 168, + 1 + ], + [ + 320, + 241, + 3 + ], + [ + 371, + 318, + 1 + ], + [ + 1257, + 168, + 1 + ], + [ + 165, + 283, + 1 + ], + [ + 177, + 406, + 2 + ], + [ + 338, + 338, + 3 + ], + [ + 147, + 1055, + 2 + ], + [ + 138, + 1048, + 2 + ], + [ + 144, + 262, + 2 + ], + [ + 153, + 237, + 2 + ], + [ + 236, + 103, + 2 + ], + [ + 246, + 166, + 1 + ], + [ + 1032, + 318, + 3 + ], + [ + 1034, + 267, + 2 + ], + [ + 1084, + 170, + 2 + ], + [ + 1143, + 166, + 4 + ], + [ + 149, + 220, + 5 + ], + [ + 151, + 1082, + 2 + ], + [ + 214, + 315, + 2 + ], + [ + 224, + 138, + 3 + ], + [ + 263, + 263, + 4 + ], + [ + 366, + 155, + 2 + ], + [ + 1034, + 286, + 2 + ], + [ + 132, + 179, + 2 + ], + [ + 189, + 1111, + 2 + ], + [ + 145, + 1048, + 2 + ], + [ + 150, + 1042, + 2 + ], + [ + 180, + 283, + 1 + ], + [ + 180, + 1119, + 1 + ], + [ + 228, + 147, + 3 + ], + [ + 1046, + 133, + 3 + ], + [ + 1219, + 165, + 1 + ], + [ + 1411, + 157, + 4 + ], + [ + 151, + 255, + 2 + ], + [ + 1235, + 1036, + 1 + ], + [ + 1259, + 168, + 1 + ], + [ + 177, + 243, + 2 + ], + [ + 1026, + 250, + 3 + ], + [ + 1086, + 165, + 2 + ], + [ + 1219, + 173, + 1 + ], + [ + 1240, + 170, + 1 + ], + [ + 164, + 349, + 2 + ], + [ + 189, + 222, + 2 + ], + [ + 373, + 373, + 2 + ], + [ + 500, + 484, + 2 + ], + [ + 1026, + 1342, + 1 + ], + [ + 1052, + 136, + 4 + ], + [ + 1062, + 248, + 1 + ], + [ + 205, + 205, + 2 + ], + [ + 103, + 150, + 1 + ], + [ + 148, + 249, + 4 + ], + [ + 156, + 372, + 1 + ], + [ + 264, + 138, + 2 + ], + [ + 393, + 393, + 3 + ], + [ + 402, + 231, + 2 + ], + [ + 1024, + 1132, + 4 + ], + [ + 252, + 252, + 4 + ], + [ + 285, + 285, + 2 + ], + [ + 302, + 261, + 2 + ], + [ + 322, + 322, + 3 + ], + [ + 1025, + 326, + 2 + ], + [ + 1031, + 279, + 2 + ], + [ + 145, + 1041, + 2 + ], + [ + 151, + 249, + 2 + ], + [ + 1026, + 1161, + 3 + ], + [ + 1033, + 260, + 1 + ], + [ + 1, + 1, + 2 + ], + [ + 148, + 149, + 2 + ], + [ + 148, + 1055, + 2 + ], + [ + 265, + 104, + 1 + ], + [ + 177, + 149, + 2 + ], + [ + 299, + 166, + 1 + ], + [ + 428, + 428, + 2 + ], + [ + 1034, + 1267, + 1 + ], + [ + 1081, + 1093, + 2 + ], + [ + 1169, + 158, + 3 + ], + [ + 104, + 372, + 1 + ], + [ + 151, + 1126, + 2 + ], + [ + 176, + 1050, + 2 + ], + [ + 234, + 313, + 2 + ], + [ + 244, + 244, + 7 + ], + [ + 259, + 435, + 2 + ], + [ + 1026, + 235, + 1 + ], + [ + 308, + 308, + 4 + ], + [ + 1118, + 1088, + 3 + ], + [ + 1240, + 163, + 1 + ], + [ + 103, + 117, + 2 + ], + [ + 105, + 105, + 4 + ], + [ + 133, + 258, + 2 + ], + [ + 146, + 1055, + 2 + ], + [ + 245, + 173, + 1 + ], + [ + 277, + 138, + 2 + ], + [ + 324, + 324, + 3 + ], + [ + 1026, + 1117, + 1 + ], + [ + 1034, + 257, + 2 + ], + [ + 1049, + 147, + 6 + ], + [ + 1240, + 168, + 1 + ], + [ + 386, + 386, + 3 + ], + [ + 454, + 240, + 2 + ], + [ + 145, + 261, + 2 + ], + [ + 299, + 165, + 1 + ], + [ + 307, + 215, + 2 + ], + [ + 327, + 152, + 1 + ], + [ + 908, + 908, + 2 + ], + [ + 1056, + 1031, + 1 + ], + [ + 1232, + 173, + 1 + ], + [ + 136, + 233, + 3 + ], + [ + 177, + 1126, + 2 + ], + [ + 272, + 170, + 1 + ], + [ + 341, + 341, + 2 + ], + [ + 588, + 588, + 2 + ], + [ + 1034, + 291, + 2 + ], + [ + 458, + 179, + 2 + ], + [ + 296, + 257, + 2 + ], + [ + 1232, + 156, + 1 + ], + [ + 115, + 115, + 4 + ], + [ + 1026, + 1161, + 1 + ], + [ + 1033, + 271, + 1 + ], + [ + 1034, + 266, + 2 + ], + [ + 1035, + 177, + 4 + ], + [ + 1152, + 152, + 1 + ], + [ + 104, + 221, + 1 + ], + [ + 166, + 293, + 1 + ], + [ + 219, + 147, + 3 + ], + [ + 264, + 138, + 1 + ], + [ + 320, + 241, + 2 + ], + [ + 1036, + 217, + 4 + ], + [ + 1117, + 145, + 4 + ], + [ + 133, + 226, + 3 + ], + [ + 87, + 87, + 1 + ], + [ + 292, + 156, + 1 + ], + [ + 1112, + 168, + 2 + ], + [ + 1036, + 230, + 4 + ], + [ + 1040, + 1142, + 1 + ], + [ + 1043, + 150, + 3 + ], + [ + 146, + 1066, + 2 + ], + [ + 194, + 194, + 2 + ], + [ + 243, + 103, + 2 + ], + [ + 1034, + 276, + 2 + ], + [ + 1092, + 144, + 4 + ], + [ + 149, + 1066, + 2 + ], + [ + 153, + 361, + 2 + ], + [ + 1033, + 268, + 1 + ], + [ + 1097, + 172, + 2 + ], + [ + 250, + 144, + 2 + ], + [ + 254, + 228, + 1 + ], + [ + 289, + 289, + 4 + ], + [ + 321, + 372, + 1 + ], + [ + 334, + 334, + 4 + ], + [ + 1026, + 177, + 1 + ], + [ + 1026, + 228, + 1 + ], + [ + 1088, + 248, + 2 + ], + [ + 149, + 1055, + 2 + ], + [ + 311, + 215, + 2 + ], + [ + 507, + 221, + 2 + ], + [ + 1081, + 163, + 2 + ], + [ + 1112, + 156, + 2 + ], + [ + 1169, + 156, + 3 + ], + [ + 189, + 1041, + 2 + ], + [ + 252, + 223, + 1 + ], + [ + 281, + 281, + 2 + ], + [ + 104, + 216, + 1 + ], + [ + 246, + 158, + 1 + ], + [ + 1036, + 1213, + 1 + ], + [ + 1045, + 145, + 4 + ], + [ + 1169, + 166, + 3 + ], + [ + 147, + 219, + 3 + ], + [ + 150, + 1046, + 2 + ], + [ + 217, + 146, + 3 + ], + [ + 262, + 103, + 2 + ], + [ + 398, + 270, + 1 + ], + [ + 1037, + 1196, + 5 + ], + [ + 1038, + 265, + 2 + ], + [ + 1037, + 242, + 5 + ], + [ + 1051, + 138, + 4 + ], + [ + 321, + 166, + 1 + ], + [ + 172, + 297, + 1 + ], + [ + 432, + 432, + 3 + ], + [ + 1038, + 242, + 2 + ], + [ + 1040, + 1093, + 1 + ], + [ + 1076, + 151, + 2 + ], + [ + 173, + 329, + 1 + ], + [ + 1079, + 176, + 3 + ], + [ + 234, + 328, + 1 + ], + [ + 284, + 284, + 5 + ], + [ + 1026, + 217, + 1 + ], + [ + 133, + 224, + 3 + ], + [ + 147, + 1069, + 2 + ], + [ + 180, + 353, + 1 + ], + [ + 226, + 136, + 3 + ], + [ + 280, + 280, + 2 + ], + [ + 1027, + 298, + 4 + ], + [ + 1034, + 309, + 2 + ], + [ + 103, + 379, + 2 + ], + [ + 113, + 105, + 2 + ], + [ + 165, + 1084, + 1 + ], + [ + 180, + 293, + 1 + ], + [ + 226, + 146, + 2 + ], + [ + 382, + 251, + 2 + ], + [ + 513, + 513, + 3 + ], + [ + 1177, + 152, + 4 + ], + [ + 132, + 1066, + 2 + ], + [ + 150, + 241, + 2 + ], + [ + 263, + 103, + 2 + ], + [ + 231, + 149, + 5 + ], + [ + 236, + 148, + 5 + ], + [ + 246, + 163, + 1 + ], + [ + 255, + 224, + 2 + ], + [ + 663, + 663, + 2 + ], + [ + 24, + 24, + 2 + ], + [ + 132, + 215, + 3 + ], + [ + 282, + 282, + 2 + ], + [ + 357, + 357, + 2 + ], + [ + 133, + 103, + 1 + ], + [ + 170, + 242, + 1 + ], + [ + 158, + 268, + 1 + ], + [ + 246, + 170, + 1 + ], + [ + 1070, + 179, + 1 + ], + [ + 148, + 138, + 1 + ], + [ + 330, + 330, + 2 + ], + [ + 407, + 271, + 1 + ], + [ + 414, + 414, + 3 + ], + [ + 582, + 582, + 2 + ], + [ + 1048, + 147, + 6 + ], + [ + 1133, + 152, + 3 + ], + [ + 104, + 371, + 1 + ], + [ + 158, + 1077, + 1 + ], + [ + 132, + 177, + 2 + ], + [ + 176, + 214, + 2 + ], + [ + 179, + 1043, + 2 + ], + [ + 286, + 286, + 5 + ], + [ + 334, + 1110, + 2 + ], + [ + 1025, + 368, + 2 + ], + [ + 1032, + 368, + 3 + ], + [ + 1033, + 260, + 3 + ], + [ + 1036, + 219, + 4 + ], + [ + 1036, + 1078, + 3 + ], + [ + 1038, + 246, + 2 + ], + [ + 1098, + 144, + 6 + ], + [ + 1156, + 1156, + 4 + ], + [ + 138, + 1058, + 2 + ], + [ + 147, + 103, + 1 + ], + [ + 152, + 245, + 2 + ], + [ + 232, + 528, + 2 + ], + [ + 243, + 243, + 7 + ], + [ + 249, + 335, + 3 + ], + [ + 265, + 156, + 1 + ], + [ + 314, + 239, + 1 + ], + [ + 1035, + 219, + 4 + ], + [ + 103, + 138, + 1 + ], + [ + 215, + 146, + 2 + ], + [ + 223, + 223, + 7 + ], + [ + 256, + 256, + 1 + ], + [ + 305, + 214, + 2 + ], + [ + 1025, + 330, + 2 + ], + [ + 1034, + 269, + 2 + ], + [ + 1049, + 148, + 6 + ], + [ + 136, + 267, + 2 + ], + [ + 1026, + 176, + 1 + ], + [ + 1045, + 1056, + 4 + ], + [ + 217, + 1083, + 2 + ], + [ + 277, + 277, + 4 + ], + [ + 1056, + 1066, + 2 + ], + [ + 104, + 378, + 1 + ], + [ + 110, + 153, + 2 + ], + [ + 248, + 132, + 1 + ], + [ + 577, + 577, + 2 + ], + [ + 1057, + 133, + 5 + ], + [ + 159, + 367, + 2 + ], + [ + 1026, + 1151, + 1 + ], + [ + 149, + 136, + 1 + ], + [ + 151, + 1046, + 2 + ], + [ + 189, + 348, + 2 + ], + [ + 306, + 222, + 2 + ], + [ + 692, + 692, + 2 + ], + [ + 1040, + 1146, + 1 + ], + [ + 120, + 120, + 2 + ], + [ + 327, + 168, + 1 + ], + [ + 355, + 230, + 2 + ], + [ + 437, + 437, + 3 + ], + [ + 150, + 1055, + 2 + ], + [ + 232, + 167, + 2 + ], + [ + 1051, + 144, + 4 + ], + [ + 1026, + 1359, + 1 + ], + [ + 1034, + 273, + 2 + ], + [ + 1177, + 156, + 4 + ], + [ + 179, + 149, + 2 + ], + [ + 1036, + 1075, + 4 + ], + [ + 1037, + 1099, + 5 + ], + [ + 1104, + 170, + 3 + ], + [ + 173, + 298, + 1 + ], + [ + 327, + 165, + 1 + ], + [ + 349, + 164, + 2 + ], + [ + 173, + 156, + 1 + ], + [ + 189, + 1046, + 2 + ], + [ + 231, + 1056, + 2 + ], + [ + 274, + 133, + 2 + ], + [ + 335, + 1110, + 2 + ], + [ + 387, + 387, + 2 + ], + [ + 429, + 429, + 3 + ], + [ + 1034, + 264, + 2 + ], + [ + 1033, + 270, + 3 + ], + [ + 1052, + 144, + 4 + ], + [ + 1095, + 170, + 3 + ], + [ + 1219, + 166, + 1 + ], + [ + 150, + 233, + 2 + ], + [ + 166, + 1106, + 1 + ], + [ + 241, + 241, + 7 + ], + [ + 275, + 220, + 3 + ], + [ + 363, + 156, + 1 + ], + [ + 424, + 424, + 3 + ], + [ + 1031, + 1070, + 2 + ], + [ + 1169, + 165, + 3 + ], + [ + 138, + 1055, + 2 + ], + [ + 168, + 265, + 2 + ], + [ + 172, + 293, + 1 + ], + [ + 237, + 167, + 2 + ], + [ + 299, + 299, + 2 + ], + [ + 1025, + 346, + 2 + ], + [ + 1084, + 163, + 2 + ], + [ + 145, + 267, + 1 + ], + [ + 228, + 254, + 1 + ], + [ + 244, + 103, + 2 + ], + [ + 1027, + 301, + 4 + ], + [ + 1032, + 329, + 3 + ], + [ + 1040, + 1099, + 1 + ], + [ + 1048, + 145, + 1 + ], + [ + 1054, + 151, + 4 + ], + [ + 1152, + 1152, + 4 + ], + [ + 153, + 110, + 2 + ], + [ + 158, + 245, + 1 + ], + [ + 179, + 1127, + 2 + ], + [ + 176, + 1075, + 2 + ], + [ + 382, + 162, + 2 + ], + [ + 104, + 232, + 1 + ], + [ + 130, + 130, + 3 + ], + [ + 217, + 303, + 3 + ], + [ + 233, + 148, + 4 + ], + [ + 304, + 219, + 3 + ], + [ + 1034, + 282, + 2 + ], + [ + 1259, + 158, + 1 + ], + [ + 104, + 397, + 1 + ], + [ + 230, + 147, + 3 + ], + [ + 295, + 295, + 3 + ], + [ + 305, + 305, + 4 + ], + [ + 521, + 521, + 2 + ], + [ + 1034, + 277, + 2 + ], + [ + 278, + 144, + 2 + ], + [ + 1033, + 271, + 3 + ], + [ + 1036, + 235, + 4 + ], + [ + 1084, + 1099, + 2 + ], + [ + 1140, + 1026, + 1 + ], + [ + 1225, + 189, + 2 + ], + [ + 104, + 389, + 1 + ], + [ + 240, + 149, + 4 + ], + [ + 319, + 156, + 1 + ], + [ + 561, + 216, + 2 + ], + [ + 1026, + 250, + 1 + ], + [ + 133, + 1048, + 2 + ], + [ + 248, + 103, + 2 + ], + [ + 262, + 262, + 4 + ], + [ + 264, + 264, + 2 + ], + [ + 300, + 300, + 3 + ], + [ + 822, + 822, + 2 + ], + [ + 57, + 57, + 1 + ], + [ + 132, + 1060, + 2 + ], + [ + 133, + 274, + 2 + ], + [ + 149, + 1060, + 2 + ], + [ + 358, + 236, + 3 + ], + [ + 431, + 431, + 3 + ], + [ + 1067, + 133, + 1 + ], + [ + 189, + 224, + 2 + ], + [ + 228, + 261, + 2 + ], + [ + 370, + 370, + 2 + ], + [ + 133, + 1064, + 2 + ], + [ + 136, + 274, + 1 + ], + [ + 163, + 163, + 4 + ], + [ + 321, + 170, + 1 + ], + [ + 1036, + 214, + 4 + ], + [ + 1257, + 173, + 1 + ], + [ + 179, + 132, + 2 + ], + [ + 144, + 274, + 2 + ], + [ + 1047, + 181, + 4 + ], + [ + 144, + 1115, + 2 + ], + [ + 233, + 148, + 3 + ], + [ + 249, + 335, + 2 + ], + [ + 255, + 151, + 2 + ], + [ + 258, + 103, + 2 + ], + [ + 1026, + 1108, + 3 + ], + [ + 1046, + 151, + 4 + ], + [ + 1072, + 163, + 5 + ], + [ + 405, + 405, + 3 + ], + [ + 1037, + 246, + 5 + ], + [ + 1063, + 147, + 6 + ], + [ + 1069, + 147, + 4 + ], + [ + 177, + 146, + 2 + ], + [ + 1024, + 1204, + 1 + ], + [ + 1049, + 146, + 6 + ], + [ + 1051, + 145, + 4 + ], + [ + 117, + 105, + 2 + ], + [ + 289, + 289, + 3 + ], + [ + 326, + 326, + 4 + ], + [ + 421, + 240, + 2 + ], + [ + 1025, + 353, + 2 + ], + [ + 1026, + 1165, + 3 + ], + [ + 1029, + 344, + 6 + ], + [ + 1054, + 148, + 6 + ], + [ + 104, + 400, + 1 + ], + [ + 165, + 265, + 1 + ], + [ + 351, + 224, + 2 + ], + [ + 359, + 235, + 2 + ], + [ + 390, + 390, + 2 + ], + [ + 1062, + 1062, + 5 + ], + [ + 132, + 1108, + 2 + ], + [ + 136, + 149, + 1 + ], + [ + 138, + 231, + 3 + ], + [ + 243, + 1083, + 2 + ], + [ + 244, + 179, + 2 + ], + [ + 257, + 176, + 2 + ], + [ + 258, + 150, + 2 + ], + [ + 242, + 156, + 1 + ], + [ + 251, + 681, + 2 + ], + [ + 1093, + 166, + 2 + ], + [ + 271, + 170, + 1 + ], + [ + 294, + 294, + 4 + ], + [ + 1024, + 303, + 4 + ], + [ + 1232, + 172, + 1 + ], + [ + 104, + 398, + 1 + ], + [ + 110, + 156, + 1 + ], + [ + 158, + 1191, + 1 + ], + [ + 214, + 132, + 3 + ], + [ + 259, + 165, + 2 + ], + [ + 273, + 273, + 5 + ], + [ + 328, + 234, + 2 + ], + [ + 1189, + 173, + 5 + ], + [ + 189, + 250, + 2 + ], + [ + 261, + 145, + 2 + ], + [ + 377, + 377, + 3 + ], + [ + 1147, + 284, + 1 + ], + [ + 222, + 103, + 2 + ], + [ + 223, + 223, + 6 + ], + [ + 252, + 215, + 2 + ], + [ + 255, + 103, + 2 + ], + [ + 158, + 371, + 1 + ], + [ + 1035, + 217, + 4 + ], + [ + 1156, + 152, + 1 + ], + [ + 133, + 1066, + 2 + ], + [ + 151, + 1198, + 2 + ], + [ + 170, + 1081, + 1 + ], + [ + 1032, + 433, + 3 + ], + [ + 1033, + 268, + 3 + ], + [ + 1050, + 148, + 4 + ], + [ + 1084, + 181, + 2 + ], + [ + 1094, + 236, + 2 + ], + [ + 150, + 1127, + 2 + ], + [ + 176, + 302, + 3 + ], + [ + 217, + 132, + 2 + ], + [ + 272, + 272, + 5 + ], + [ + 144, + 1055, + 2 + ], + [ + 150, + 151, + 2 + ], + [ + 217, + 1061, + 1 + ], + [ + 260, + 166, + 2 + ], + [ + 1259, + 170, + 1 + ], + [ + 173, + 173, + 2 + ], + [ + 259, + 163, + 1 + ], + [ + 267, + 136, + 1 + ], + [ + 1152, + 156, + 1 + ], + [ + 104, + 376, + 1 + ], + [ + 155, + 152, + 1 + ], + [ + 258, + 226, + 2 + ], + [ + 325, + 325, + 4 + ], + [ + 1070, + 1070, + 2 + ], + [ + 196, + 196, + 2 + ], + [ + 249, + 103, + 2 + ], + [ + 322, + 322, + 4 + ], + [ + 1034, + 261, + 2 + ], + [ + 1046, + 149, + 4 + ], + [ + 1505, + 339, + 4 + ], + [ + 104, + 416, + 1 + ], + [ + 138, + 243, + 3 + ], + [ + 228, + 228, + 7 + ], + [ + 231, + 1076, + 1 + ], + [ + 244, + 1085, + 2 + ], + [ + 250, + 133, + 1 + ], + [ + 276, + 276, + 4 + ], + [ + 484, + 1015, + 2 + ], + [ + 1067, + 148, + 2 + ], + [ + 181, + 265, + 1 + ], + [ + 249, + 151, + 2 + ], + [ + 1034, + 1322, + 1 + ], + [ + 1133, + 168, + 3 + ], + [ + 172, + 172, + 5 + ], + [ + 184, + 184, + 2 + ], + [ + 133, + 1055, + 2 + ], + [ + 189, + 146, + 1 + ], + [ + 605, + 234, + 2 + ], + [ + 1026, + 1153, + 3 + ], + [ + 1033, + 265, + 3 + ], + [ + 1069, + 149, + 4 + ], + [ + 1328, + 220, + 4 + ], + [ + 144, + 1073, + 2 + ], + [ + 164, + 362, + 2 + ], + [ + 287, + 287, + 5 + ], + [ + 1036, + 220, + 4 + ], + [ + 1036, + 226, + 4 + ], + [ + 1060, + 145, + 6 + ], + [ + 1110, + 177, + 5 + ], + [ + 150, + 244, + 2 + ], + [ + 163, + 1185, + 1 + ], + [ + 222, + 1111, + 2 + ], + [ + 321, + 165, + 1 + ], + [ + 459, + 701, + 2 + ], + [ + 1026, + 230, + 3 + ], + [ + 1031, + 344, + 2 + ], + [ + 1088, + 1118, + 2 + ], + [ + 136, + 267, + 1 + ], + [ + 138, + 1049, + 2 + ], + [ + 1042, + 151, + 4 + ], + [ + 1043, + 1061, + 3 + ], + [ + 150, + 258, + 2 + ], + [ + 188, + 188, + 2 + ], + [ + 257, + 215, + 1 + ], + [ + 269, + 269, + 6 + ], + [ + 301, + 301, + 5 + ], + [ + 1026, + 1108, + 1 + ], + [ + 219, + 304, + 3 + ], + [ + 249, + 148, + 4 + ], + [ + 1026, + 1124, + 1 + ], + [ + 436, + 156, + 1 + ], + [ + 1036, + 1079, + 4 + ], + [ + 1057, + 147, + 6 + ], + [ + 146, + 1063, + 2 + ], + [ + 149, + 144, + 1 + ], + [ + 236, + 1062, + 2 + ], + [ + 296, + 296, + 4 + ], + [ + 1027, + 346, + 4 + ], + [ + 1134, + 166, + 4 + ], + [ + 1179, + 168, + 5 + ], + [ + 34, + 34, + 1 + ], + [ + 210, + 210, + 2 + ], + [ + 269, + 138, + 2 + ], + [ + 493, + 493, + 2 + ], + [ + 1026, + 1150, + 3 + ], + [ + 1133, + 156, + 3 + ], + [ + 1257, + 170, + 1 + ], + [ + 149, + 1069, + 2 + ], + [ + 224, + 147, + 2 + ], + [ + 274, + 136, + 2 + ], + [ + 435, + 435, + 3 + ], + [ + 239, + 314, + 1 + ], + [ + 1034, + 1127, + 2 + ], + [ + 1096, + 173, + 2 + ], + [ + 220, + 103, + 2 + ], + [ + 224, + 351, + 2 + ], + [ + 226, + 258, + 2 + ], + [ + 1026, + 1151, + 3 + ], + [ + 1109, + 1048, + 1 + ], + [ + 176, + 148, + 2 + ], + [ + 181, + 245, + 1 + ], + [ + 231, + 151, + 2 + ], + [ + 1034, + 280, + 2 + ], + [ + 1039, + 1139, + 6 + ], + [ + 1069, + 148, + 4 + ], + [ + 1086, + 156, + 2 + ], + [ + 162, + 382, + 2 + ], + [ + 189, + 373, + 2 + ], + [ + 368, + 152, + 1 + ], + [ + 1025, + 371, + 2 + ], + [ + 1034, + 284, + 2 + ], + [ + 241, + 1061, + 1 + ], + [ + 491, + 216, + 2 + ], + [ + 1026, + 1117, + 5 + ], + [ + 132, + 261, + 1 + ], + [ + 144, + 277, + 2 + ], + [ + 165, + 1106, + 1 + ], + [ + 222, + 333, + 2 + ], + [ + 81, + 81, + 2 + ], + [ + 248, + 149, + 4 + ], + [ + 319, + 158, + 1 + ], + [ + 1036, + 1075, + 3 + ], + [ + 1086, + 158, + 2 + ], + [ + 1186, + 173, + 1 + ], + [ + 1189, + 168, + 5 + ], + [ + 144, + 1064, + 2 + ], + [ + 147, + 244, + 3 + ], + [ + 223, + 146, + 4 + ], + [ + 250, + 333, + 2 + ], + [ + 271, + 271, + 5 + ], + [ + 288, + 288, + 5 + ], + [ + 1026, + 1360, + 1 + ], + [ + 1036, + 215, + 4 + ], + [ + 1072, + 152, + 5 + ], + [ + 176, + 315, + 3 + ], + [ + 242, + 163, + 1 + ], + [ + 392, + 413, + 1 + ], + [ + 589, + 589, + 3 + ], + [ + 1025, + 372, + 2 + ], + [ + 1026, + 1149, + 3 + ], + [ + 1032, + 363, + 3 + ], + [ + 1067, + 1031, + 1 + ], + [ + 1105, + 165, + 2 + ], + [ + 1259, + 172, + 1 + ], + [ + 1025, + 329, + 2 + ], + [ + 1026, + 219, + 1 + ], + [ + 1042, + 145, + 3 + ], + [ + 42, + 42, + 2 + ], + [ + 138, + 264, + 2 + ], + [ + 172, + 1129, + 1 + ], + [ + 295, + 132, + 2 + ], + [ + 575, + 361, + 2 + ], + [ + 611, + 611, + 2 + ], + [ + 1024, + 311, + 4 + ], + [ + 1025, + 363, + 2 + ], + [ + 1057, + 146, + 6 + ], + [ + 1172, + 152, + 4 + ], + [ + 254, + 214, + 2 + ], + [ + 300, + 133, + 2 + ], + [ + 329, + 168, + 1 + ], + [ + 378, + 378, + 4 + ], + [ + 1024, + 355, + 4 + ], + [ + 1034, + 254, + 2 + ], + [ + 1094, + 144, + 2 + ], + [ + 151, + 149, + 1 + ], + [ + 165, + 268, + 2 + ], + [ + 350, + 350, + 2 + ], + [ + 368, + 156, + 1 + ], + [ + 442, + 311, + 2 + ], + [ + 447, + 447, + 3 + ], + [ + 1039, + 265, + 6 + ], + [ + 1047, + 180, + 4 + ], + [ + 132, + 1065, + 2 + ], + [ + 133, + 235, + 3 + ], + [ + 200, + 200, + 3 + ], + [ + 1036, + 1061, + 3 + ], + [ + 146, + 177, + 2 + ], + [ + 150, + 1058, + 2 + ], + [ + 237, + 237, + 1 + ], + [ + 266, + 136, + 1 + ], + [ + 285, + 285, + 4 + ], + [ + 305, + 138, + 2 + ], + [ + 1034, + 1315, + 1 + ], + [ + 1306, + 180, + 1 + ], + [ + 166, + 166, + 7 + ], + [ + 227, + 227, + 2 + ], + [ + 233, + 148, + 5 + ], + [ + 241, + 103, + 2 + ], + [ + 151, + 1041, + 2 + ], + [ + 176, + 236, + 2 + ], + [ + 179, + 147, + 2 + ], + [ + 240, + 421, + 2 + ], + [ + 291, + 136, + 2 + ], + [ + 1177, + 158, + 4 + ], + [ + 1504, + 349, + 4 + ], + [ + 347, + 347, + 4 + ], + [ + 1043, + 1070, + 4 + ], + [ + 1048, + 149, + 6 + ], + [ + 254, + 177, + 2 + ], + [ + 267, + 145, + 1 + ], + [ + 449, + 404, + 2 + ], + [ + 1067, + 1111, + 5 + ], + [ + 1089, + 1061, + 1 + ], + [ + 146, + 215, + 2 + ], + [ + 172, + 158, + 1 + ], + [ + 173, + 1134, + 1 + ], + [ + 230, + 230, + 7 + ], + [ + 1025, + 433, + 2 + ], + [ + 1026, + 1031, + 1 + ], + [ + 1032, + 330, + 3 + ], + [ + 1037, + 1277, + 5 + ], + [ + 1098, + 147, + 6 + ], + [ + 189, + 539, + 2 + ], + [ + 264, + 145, + 1 + ], + [ + 104, + 433, + 1 + ], + [ + 179, + 303, + 3 + ], + [ + 240, + 103, + 2 + ], + [ + 257, + 257, + 5 + ], + [ + 1039, + 245, + 6 + ], + [ + 138, + 1064, + 2 + ], + [ + 235, + 146, + 3 + ], + [ + 289, + 132, + 2 + ], + [ + 1026, + 1150, + 1 + ], + [ + 1049, + 144, + 5 + ], + [ + 1105, + 166, + 2 + ], + [ + 41, + 41, + 2 + ], + [ + 176, + 261, + 2 + ], + [ + 270, + 398, + 1 + ], + [ + 292, + 165, + 2 + ], + [ + 389, + 410, + 1 + ], + [ + 402, + 402, + 3 + ], + [ + 1034, + 252, + 2 + ], + [ + 133, + 1058, + 2 + ], + [ + 150, + 258, + 1 + ], + [ + 215, + 132, + 3 + ], + [ + 254, + 151, + 2 + ], + [ + 1024, + 1220, + 1 + ], + [ + 1032, + 353, + 3 + ], + [ + 1032, + 416, + 3 + ], + [ + 1052, + 149, + 4 + ], + [ + 1179, + 166, + 5 + ], + [ + 104, + 422, + 1 + ], + [ + 105, + 117, + 2 + ], + [ + 167, + 167, + 4 + ], + [ + 310, + 310, + 1 + ], + [ + 345, + 140, + 2 + ], + [ + 1033, + 259, + 3 + ], + [ + 1056, + 147, + 2 + ], + [ + 242, + 181, + 1 + ], + [ + 360, + 360, + 2 + ], + [ + 1074, + 152, + 5 + ], + [ + 1094, + 250, + 2 + ], + [ + 246, + 246, + 7 + ], + [ + 275, + 145, + 2 + ], + [ + 280, + 136, + 2 + ], + [ + 1038, + 444, + 2 + ], + [ + 1041, + 150, + 4 + ], + [ + 1268, + 151, + 2 + ], + [ + 104, + 408, + 1 + ], + [ + 133, + 262, + 2 + ], + [ + 144, + 145, + 2 + ], + [ + 335, + 335, + 4 + ], + [ + 359, + 263, + 2 + ], + [ + 1034, + 1122, + 2 + ], + [ + 1046, + 1067, + 1 + ], + [ + 201, + 201, + 2 + ], + [ + 297, + 297, + 5 + ], + [ + 315, + 214, + 2 + ], + [ + 376, + 376, + 3 + ], + [ + 1156, + 158, + 1 + ], + [ + 166, + 283, + 1 + ], + [ + 177, + 255, + 2 + ], + [ + 305, + 1110, + 2 + ], + [ + 1035, + 1111, + 2 + ], + [ + 1062, + 223, + 4 + ], + [ + 1085, + 1085, + 3 + ], + [ + 40, + 40, + 2 + ], + [ + 65, + 65, + 1 + ], + [ + 233, + 136, + 3 + ], + [ + 281, + 281, + 4 + ], + [ + 303, + 217, + 3 + ], + [ + 1024, + 1199, + 1 + ], + [ + 1036, + 222, + 4 + ], + [ + 1093, + 152, + 2 + ], + [ + 103, + 147, + 1 + ], + [ + 104, + 407, + 1 + ], + [ + 132, + 1064, + 2 + ], + [ + 153, + 152, + 1 + ], + [ + 226, + 338, + 2 + ], + [ + 300, + 138, + 2 + ], + [ + 144, + 1065, + 2 + ], + [ + 149, + 231, + 5 + ], + [ + 249, + 148, + 5 + ], + [ + 268, + 170, + 1 + ], + [ + 1036, + 224, + 4 + ], + [ + 1099, + 168, + 2 + ], + [ + 1296, + 170, + 1 + ], + [ + 158, + 413, + 1 + ], + [ + 176, + 248, + 3 + ], + [ + 299, + 299, + 5 + ], + [ + 144, + 255, + 2 + ], + [ + 179, + 244, + 2 + ], + [ + 232, + 155, + 3 + ], + [ + 266, + 1083, + 2 + ], + [ + 1026, + 1124, + 3 + ], + [ + 1029, + 302, + 6 + ], + [ + 1052, + 151, + 4 + ], + [ + 1144, + 291, + 1 + ], + [ + 115, + 234, + 2 + ], + [ + 151, + 1054, + 2 + ], + [ + 177, + 448, + 2 + ], + [ + 1026, + 1125, + 1 + ], + [ + 189, + 226, + 2 + ], + [ + 598, + 598, + 3 + ], + [ + 1060, + 146, + 6 + ], + [ + 149, + 150, + 1 + ], + [ + 156, + 272, + 1 + ], + [ + 176, + 508, + 2 + ], + [ + 319, + 319, + 4 + ], + [ + 1026, + 223, + 5 + ], + [ + 1035, + 214, + 4 + ], + [ + 1088, + 278, + 2 + ], + [ + 101, + 101, + 2 + ], + [ + 133, + 1057, + 2 + ], + [ + 258, + 235, + 1 + ], + [ + 1035, + 214, + 2 + ], + [ + 1062, + 228, + 4 + ], + [ + 1076, + 151, + 3 + ], + [ + 231, + 308, + 3 + ], + [ + 240, + 278, + 2 + ], + [ + 346, + 346, + 4 + ], + [ + 1035, + 215, + 2 + ], + [ + 1145, + 170, + 4 + ], + [ + 144, + 1048, + 2 + ], + [ + 145, + 236, + 2 + ], + [ + 165, + 1081, + 1 + ], + [ + 220, + 275, + 2 + ], + [ + 103, + 148, + 1 + ], + [ + 148, + 150, + 1 + ], + [ + 149, + 241, + 3 + ], + [ + 166, + 1084, + 1 + ], + [ + 176, + 257, + 2 + ], + [ + 206, + 206, + 3 + ], + [ + 362, + 164, + 2 + ], + [ + 369, + 311, + 2 + ], + [ + 733, + 733, + 2 + ], + [ + 1026, + 226, + 1 + ], + [ + 144, + 263, + 2 + ], + [ + 219, + 147, + 4 + ], + [ + 1024, + 304, + 4 + ], + [ + 1049, + 133, + 6 + ], + [ + 1072, + 168, + 5 + ], + [ + 1076, + 177, + 4 + ], + [ + 1105, + 1032, + 2 + ], + [ + 132, + 1055, + 2 + ], + [ + 174, + 174, + 2 + ], + [ + 181, + 1027, + 1 + ], + [ + 247, + 649, + 2 + ], + [ + 266, + 136, + 2 + ], + [ + 587, + 587, + 1 + ], + [ + 1026, + 1117, + 3 + ], + [ + 1033, + 165, + 4 + ], + [ + 1094, + 132, + 2 + ], + [ + 144, + 1063, + 2 + ], + [ + 239, + 458, + 2 + ], + [ + 249, + 249, + 7 + ], + [ + 259, + 170, + 1 + ], + [ + 1024, + 331, + 4 + ], + [ + 1037, + 1221, + 5 + ], + [ + 1047, + 242, + 1 + ], + [ + 1051, + 149, + 4 + ], + [ + 1088, + 220, + 2 + ], + [ + 1089, + 217, + 2 + ], + [ + 145, + 264, + 1 + ], + [ + 163, + 1133, + 1 + ], + [ + 1029, + 296, + 6 + ], + [ + 1034, + 281, + 2 + ], + [ + 1034, + 285, + 2 + ], + [ + 1062, + 1122, + 4 + ], + [ + 132, + 1071, + 2 + ], + [ + 149, + 103, + 1 + ], + [ + 173, + 245, + 1 + ], + [ + 181, + 246, + 1 + ], + [ + 224, + 331, + 2 + ], + [ + 298, + 298, + 5 + ], + [ + 361, + 153, + 2 + ], + [ + 1036, + 244, + 4 + ], + [ + 1108, + 147, + 6 + ], + [ + 261, + 302, + 2 + ], + [ + 268, + 165, + 2 + ], + [ + 104, + 392, + 1 + ], + [ + 395, + 395, + 3 + ], + [ + 1026, + 1149, + 1 + ], + [ + 1034, + 289, + 2 + ], + [ + 1066, + 149, + 4 + ], + [ + 1074, + 168, + 5 + ], + [ + 1296, + 163, + 1 + ], + [ + 157, + 157, + 1 + ], + [ + 186, + 186, + 2 + ], + [ + 1025, + 400, + 2 + ], + [ + 132, + 1069, + 2 + ], + [ + 133, + 1069, + 2 + ], + [ + 148, + 1069, + 2 + ], + [ + 163, + 372, + 1 + ], + [ + 176, + 1042, + 2 + ], + [ + 271, + 407, + 1 + ], + [ + 375, + 217, + 2 + ], + [ + 1037, + 1282, + 5 + ], + [ + 1054, + 150, + 4 + ], + [ + 1067, + 222, + 5 + ], + [ + 1313, + 1036, + 1 + ], + [ + 136, + 1063, + 2 + ], + [ + 138, + 277, + 1 + ], + [ + 430, + 236, + 2 + ], + [ + 457, + 168, + 1 + ], + [ + 133, + 263, + 2 + ], + [ + 133, + 1065, + 2 + ], + [ + 243, + 151, + 2 + ], + [ + 251, + 117, + 1 + ], + [ + 1026, + 177, + 5 + ], + [ + 1074, + 1319, + 3 + ], + [ + 132, + 289, + 2 + ], + [ + 1035, + 219, + 2 + ], + [ + 1046, + 150, + 4 + ], + [ + 1186, + 172, + 1 + ], + [ + 1239, + 165, + 1 + ], + [ + 270, + 270, + 5 + ], + [ + 616, + 616, + 2 + ], + [ + 711, + 711, + 2 + ], + [ + 148, + 1078, + 1 + ], + [ + 166, + 1097, + 1 + ], + [ + 176, + 252, + 2 + ], + [ + 279, + 279, + 6 + ], + [ + 385, + 385, + 2 + ], + [ + 1025, + 397, + 2 + ], + [ + 117, + 117, + 1 + ], + [ + 144, + 240, + 2 + ], + [ + 257, + 1083, + 2 + ], + [ + 1026, + 1148, + 3 + ], + [ + 1116, + 1116, + 3 + ], + [ + 1171, + 189, + 4 + ], + [ + 1206, + 156, + 1 + ], + [ + 180, + 180, + 6 + ], + [ + 230, + 355, + 2 + ], + [ + 315, + 445, + 2 + ], + [ + 133, + 277, + 2 + ], + [ + 223, + 146, + 3 + ], + [ + 248, + 275, + 3 + ], + [ + 312, + 312, + 2 + ], + [ + 1025, + 398, + 2 + ], + [ + 1041, + 222, + 4 + ], + [ + 132, + 1063, + 2 + ], + [ + 150, + 1054, + 2 + ], + [ + 154, + 154, + 1 + ], + [ + 179, + 338, + 3 + ], + [ + 224, + 1056, + 2 + ], + [ + 344, + 344, + 3 + ], + [ + 1027, + 319, + 4 + ], + [ + 1086, + 170, + 2 + ], + [ + 1166, + 138, + 6 + ], + [ + 136, + 1049, + 2 + ], + [ + 363, + 168, + 1 + ], + [ + 396, + 396, + 4 + ], + [ + 481, + 481, + 2 + ], + [ + 835, + 835, + 2 + ], + [ + 1026, + 223, + 3 + ], + [ + 1040, + 1201, + 1 + ], + [ + 1050, + 1155, + 4 + ], + [ + 1096, + 170, + 2 + ], + [ + 104, + 418, + 1 + ], + [ + 144, + 1066, + 2 + ], + [ + 1144, + 266, + 1 + ], + [ + 136, + 274, + 2 + ], + [ + 146, + 145, + 1 + ], + [ + 148, + 147, + 1 + ], + [ + 158, + 246, + 4 + ], + [ + 204, + 204, + 2 + ], + [ + 252, + 103, + 2 + ], + [ + 189, + 240, + 2 + ], + [ + 240, + 189, + 2 + ], + [ + 1034, + 1070, + 2 + ], + [ + 1034, + 1126, + 2 + ], + [ + 1058, + 149, + 6 + ], + [ + 4, + 4, + 2 + ], + [ + 110, + 167, + 2 + ], + [ + 215, + 1070, + 2 + ], + [ + 228, + 132, + 3 + ], + [ + 336, + 336, + 3 + ], + [ + 353, + 353, + 2 + ], + [ + 541, + 541, + 3 + ], + [ + 664, + 664, + 2 + ], + [ + 855, + 855, + 2 + ], + [ + 1032, + 378, + 3 + ], + [ + 1034, + 288, + 2 + ], + [ + 1057, + 133, + 1 + ], + [ + 148, + 1063, + 2 + ], + [ + 151, + 243, + 2 + ], + [ + 307, + 442, + 2 + ], + [ + 1024, + 325, + 4 + ], + [ + 1024, + 373, + 4 + ], + [ + 1034, + 1056, + 2 + ], + [ + 1111, + 222, + 4 + ], + [ + 1339, + 170, + 1 + ], + [ + 149, + 1063, + 2 + ], + [ + 156, + 242, + 1 + ], + [ + 284, + 138, + 2 + ], + [ + 362, + 239, + 2 + ], + [ + 446, + 446, + 3 + ], + [ + 1026, + 235, + 3 + ], + [ + 1033, + 166, + 4 + ], + [ + 151, + 1063, + 2 + ], + [ + 168, + 265, + 1 + ], + [ + 245, + 152, + 1 + ], + [ + 248, + 248, + 6 + ], + [ + 468, + 468, + 2 + ], + [ + 1112, + 172, + 2 + ], + [ + 103, + 146, + 1 + ], + [ + 104, + 237, + 1 + ], + [ + 146, + 1079, + 1 + ], + [ + 177, + 1045, + 2 + ], + [ + 179, + 133, + 2 + ], + [ + 215, + 147, + 2 + ], + [ + 260, + 163, + 1 + ], + [ + 328, + 234, + 1 + ], + [ + 405, + 233, + 2 + ], + [ + 539, + 539, + 2 + ], + [ + 1024, + 305, + 4 + ], + [ + 1026, + 224, + 1 + ], + [ + 1088, + 231, + 2 + ], + [ + 1156, + 168, + 1 + ], + [ + 104, + 410, + 1 + ], + [ + 267, + 267, + 4 + ], + [ + 283, + 181, + 1 + ], + [ + 1026, + 179, + 5 + ], + [ + 1032, + 376, + 3 + ], + [ + 1038, + 270, + 2 + ], + [ + 1088, + 132, + 2 + ], + [ + 1121, + 1260, + 5 + ], + [ + 150, + 189, + 2 + ], + [ + 236, + 358, + 3 + ], + [ + 886, + 886, + 2 + ], + [ + 145, + 103, + 1 + ], + [ + 150, + 1050, + 2 + ], + [ + 277, + 133, + 2 + ], + [ + 284, + 284, + 2 + ], + [ + 290, + 290, + 4 + ], + [ + 548, + 548, + 3 + ], + [ + 1093, + 168, + 2 + ], + [ + 1110, + 1110, + 3 + ], + [ + 291, + 291, + 5 + ], + [ + 292, + 292, + 5 + ], + [ + 293, + 170, + 1 + ], + [ + 673, + 673, + 2 + ], + [ + 1035, + 215, + 4 + ], + [ + 1115, + 148, + 6 + ], + [ + 1260, + 165, + 1 + ], + [ + 146, + 1075, + 1 + ], + [ + 149, + 241, + 5 + ], + [ + 183, + 183, + 2 + ], + [ + 243, + 334, + 2 + ], + [ + 250, + 333, + 3 + ], + [ + 306, + 306, + 4 + ], + [ + 497, + 497, + 2 + ], + [ + 1034, + 279, + 2 + ], + [ + 1074, + 1344, + 3 + ], + [ + 1479, + 216, + 4 + ], + [ + 35, + 35, + 1 + ], + [ + 168, + 392, + 1 + ], + [ + 199, + 199, + 3 + ], + [ + 223, + 136, + 2 + ], + [ + 282, + 282, + 4 + ], + [ + 156, + 173, + 1 + ], + [ + 177, + 304, + 3 + ], + [ + 219, + 132, + 2 + ], + [ + 224, + 262, + 1 + ], + [ + 308, + 138, + 2 + ], + [ + 464, + 464, + 3 + ], + [ + 1051, + 150, + 4 + ], + [ + 1052, + 145, + 4 + ], + [ + 1098, + 136, + 6 + ], + [ + 1099, + 246, + 4 + ], + [ + 1179, + 152, + 5 + ], + [ + 156, + 400, + 1 + ], + [ + 223, + 375, + 2 + ], + [ + 223, + 1075, + 1 + ], + [ + 1086, + 104, + 2 + ], + [ + 146, + 150, + 1 + ], + [ + 226, + 133, + 3 + ], + [ + 1072, + 170, + 5 + ], + [ + 144, + 1058, + 2 + ], + [ + 163, + 1039, + 1 + ], + [ + 166, + 271, + 1 + ], + [ + 187, + 187, + 2 + ], + [ + 1031, + 1127, + 2 + ], + [ + 1045, + 151, + 3 + ], + [ + 131, + 131, + 1 + ], + [ + 217, + 375, + 2 + ], + [ + 1037, + 1262, + 5 + ], + [ + 1303, + 1036, + 1 + ], + [ + 147, + 214, + 2 + ], + [ + 147, + 1063, + 2 + ], + [ + 179, + 434, + 2 + ], + [ + 1025, + 408, + 2 + ], + [ + 1054, + 148, + 4 + ], + [ + 1132, + 275, + 4 + ], + [ + 1534, + 313, + 4 + ], + [ + 228, + 138, + 2 + ], + [ + 322, + 158, + 1 + ], + [ + 413, + 392, + 1 + ], + [ + 422, + 422, + 3 + ], + [ + 1025, + 376, + 2 + ], + [ + 1067, + 1034, + 1 + ], + [ + 113, + 159, + 3 + ], + [ + 172, + 172, + 6 + ], + [ + 255, + 230, + 1 + ], + [ + 405, + 236, + 2 + ], + [ + 931, + 931, + 2 + ], + [ + 1078, + 147, + 2 + ], + [ + 1339, + 163, + 1 + ], + [ + 144, + 258, + 2 + ], + [ + 343, + 343, + 3 + ], + [ + 427, + 427, + 3 + ], + [ + 504, + 167, + 2 + ], + [ + 1026, + 217, + 3 + ], + [ + 1055, + 148, + 6 + ], + [ + 1085, + 1085, + 5 + ], + [ + 1311, + 1036, + 1 + ], + [ + 145, + 1066, + 2 + ], + [ + 176, + 307, + 3 + ], + [ + 244, + 136, + 3 + ], + [ + 249, + 1056, + 2 + ], + [ + 286, + 286, + 2 + ], + [ + 359, + 359, + 3 + ], + [ + 1027, + 299, + 4 + ], + [ + 1035, + 177, + 2 + ], + [ + 150, + 136, + 4 + ], + [ + 170, + 1039, + 1 + ], + [ + 177, + 133, + 2 + ], + [ + 219, + 379, + 2 + ], + [ + 263, + 235, + 2 + ], + [ + 287, + 166, + 2 + ], + [ + 368, + 168, + 1 + ], + [ + 1026, + 1092, + 5 + ], + [ + 1026, + 1125, + 3 + ], + [ + 1036, + 258, + 4 + ], + [ + 1036, + 1079, + 3 + ], + [ + 1061, + 146, + 2 + ], + [ + 1067, + 189, + 1 + ], + [ + 103, + 377, + 2 + ], + [ + 117, + 164, + 3 + ], + [ + 151, + 148, + 1 + ], + [ + 165, + 1105, + 1 + ], + [ + 185, + 185, + 2 + ], + [ + 220, + 254, + 1 + ], + [ + 355, + 355, + 3 + ], + [ + 1036, + 252, + 4 + ], + [ + 1066, + 144, + 4 + ], + [ + 1168, + 136, + 6 + ], + [ + 152, + 1145, + 1 + ], + [ + 273, + 148, + 4 + ], + [ + 1026, + 1165, + 1 + ], + [ + 1036, + 257, + 4 + ], + [ + 1036, + 1135, + 3 + ], + [ + 1144, + 1070, + 4 + ], + [ + 179, + 252, + 2 + ], + [ + 228, + 228, + 6 + ], + [ + 339, + 247, + 1 + ], + [ + 448, + 448, + 3 + ], + [ + 1083, + 1083, + 3 + ], + [ + 1239, + 166, + 1 + ], + [ + 1285, + 150, + 2 + ], + [ + 103, + 113, + 2 + ], + [ + 222, + 333, + 3 + ], + [ + 259, + 158, + 2 + ], + [ + 348, + 348, + 4 + ], + [ + 1026, + 1153, + 1 + ], + [ + 151, + 150, + 2 + ], + [ + 166, + 1105, + 1 + ], + [ + 232, + 283, + 2 + ], + [ + 300, + 300, + 2 + ], + [ + 325, + 233, + 2 + ], + [ + 441, + 168, + 1 + ], + [ + 496, + 496, + 3 + ], + [ + 1025, + 416, + 2 + ], + [ + 1036, + 243, + 4 + ], + [ + 1189, + 165, + 5 + ], + [ + 103, + 417, + 2 + ], + [ + 149, + 278, + 2 + ], + [ + 152, + 1081, + 1 + ], + [ + 409, + 409, + 4 + ], + [ + 1024, + 144, + 3 + ], + [ + 1032, + 400, + 3 + ], + [ + 1088, + 145, + 2 + ], + [ + 155, + 366, + 2 + ], + [ + 215, + 148, + 2 + ], + [ + 231, + 231, + 7 + ], + [ + 266, + 266, + 6 + ], + [ + 1026, + 219, + 3 + ], + [ + 1147, + 1056, + 4 + ], + [ + 1152, + 168, + 1 + ], + [ + 1283, + 1036, + 1 + ], + [ + 1306, + 168, + 1 + ], + [ + 104, + 420, + 1 + ], + [ + 152, + 260, + 1 + ], + [ + 351, + 351, + 3 + ], + [ + 356, + 356, + 3 + ], + [ + 1026, + 1148, + 1 + ], + [ + 1185, + 156, + 5 + ], + [ + 103, + 114, + 2 + ], + [ + 103, + 393, + 2 + ], + [ + 151, + 1050, + 2 + ], + [ + 170, + 1145, + 1 + ], + [ + 172, + 378, + 1 + ], + [ + 173, + 1040, + 1 + ], + [ + 215, + 149, + 2 + ], + [ + 223, + 257, + 2 + ], + [ + 243, + 1056, + 2 + ], + [ + 302, + 302, + 4 + ], + [ + 322, + 156, + 1 + ], + [ + 1035, + 230, + 2 + ], + [ + 1037, + 1299, + 5 + ], + [ + 1045, + 1076, + 3 + ], + [ + 146, + 189, + 1 + ], + [ + 236, + 145, + 2 + ], + [ + 812, + 489, + 2 + ], + [ + 1025, + 110, + 2 + ], + [ + 1045, + 219, + 4 + ], + [ + 214, + 264, + 2 + ], + [ + 226, + 373, + 2 + ], + [ + 280, + 320, + 3 + ], + [ + 1091, + 219, + 2 + ], + [ + 132, + 273, + 2 + ], + [ + 158, + 259, + 3 + ], + [ + 234, + 115, + 2 + ], + [ + 241, + 150, + 2 + ], + [ + 261, + 261, + 5 + ], + [ + 550, + 550, + 2 + ], + [ + 1036, + 236, + 4 + ], + [ + 1036, + 262, + 4 + ], + [ + 154, + 156, + 1 + ], + [ + 181, + 242, + 1 + ], + [ + 239, + 621, + 2 + ], + [ + 304, + 269, + 3 + ], + [ + 309, + 136, + 2 + ], + [ + 454, + 454, + 2 + ], + [ + 800, + 800, + 2 + ], + [ + 1042, + 150, + 4 + ], + [ + 1132, + 1132, + 4 + ], + [ + 103, + 411, + 2 + ], + [ + 165, + 1040, + 1 + ], + [ + 1058, + 150, + 4 + ], + [ + 1108, + 146, + 6 + ], + [ + 1150, + 151, + 6 + ], + [ + 1279, + 1036, + 1 + ], + [ + 133, + 250, + 1 + ], + [ + 138, + 264, + 1 + ], + [ + 145, + 179, + 2 + ], + [ + 155, + 168, + 1 + ], + [ + 163, + 376, + 1 + ], + [ + 275, + 275, + 5 + ], + [ + 1025, + 407, + 2 + ], + [ + 1065, + 136, + 6 + ], + [ + 1097, + 166, + 3 + ], + [ + 132, + 248, + 1 + ], + [ + 215, + 217, + 2 + ], + [ + 301, + 163, + 1 + ], + [ + 347, + 1116, + 2 + ], + [ + 1026, + 215, + 1 + ], + [ + 1032, + 326, + 3 + ], + [ + 1033, + 293, + 1 + ], + [ + 1037, + 1288, + 5 + ], + [ + 136, + 244, + 3 + ], + [ + 145, + 1069, + 2 + ], + [ + 148, + 177, + 2 + ], + [ + 308, + 231, + 4 + ], + [ + 325, + 1116, + 2 + ], + [ + 521, + 531, + 2 + ], + [ + 1033, + 1137, + 3 + ], + [ + 1036, + 254, + 4 + ], + [ + 1041, + 1111, + 4 + ], + [ + 1181, + 176, + 4 + ], + [ + 147, + 1060, + 2 + ], + [ + 170, + 324, + 4 + ], + [ + 219, + 386, + 2 + ], + [ + 241, + 217, + 2 + ], + [ + 258, + 148, + 2 + ], + [ + 272, + 166, + 2 + ], + [ + 466, + 466, + 3 + ], + [ + 377, + 305, + 2 + ], + [ + 457, + 156, + 1 + ], + [ + 1050, + 150, + 4 + ], + [ + 1089, + 241, + 2 + ], + [ + 1224, + 181, + 1 + ], + [ + 138, + 1057, + 2 + ], + [ + 264, + 214, + 2 + ], + [ + 277, + 144, + 2 + ], + [ + 382, + 251, + 1 + ], + [ + 425, + 425, + 3 + ], + [ + 1035, + 217, + 2 + ], + [ + 1585, + 113, + 4 + ], + [ + 149, + 1075, + 1 + ], + [ + 152, + 259, + 1 + ], + [ + 189, + 149, + 2 + ], + [ + 232, + 232, + 4 + ], + [ + 331, + 224, + 2 + ], + [ + 431, + 235, + 2 + ], + [ + 445, + 305, + 2 + ], + [ + 1024, + 338, + 4 + ], + [ + 1037, + 1297, + 5 + ], + [ + 1121, + 1239, + 5 + ], + [ + 103, + 414, + 2 + ], + [ + 215, + 233, + 2 + ], + [ + 217, + 148, + 2 + ], + [ + 309, + 133, + 2 + ], + [ + 430, + 430, + 3 + ], + [ + 1058, + 144, + 4 + ], + [ + 1070, + 146, + 2 + ], + [ + 1151, + 150, + 4 + ], + [ + 151, + 147, + 1 + ], + [ + 173, + 173, + 4 + ], + [ + 230, + 255, + 1 + ], + [ + 241, + 320, + 2 + ], + [ + 251, + 382, + 1 + ], + [ + 507, + 507, + 1 + ], + [ + 1316, + 163, + 1 + ], + [ + 1545, + 361, + 4 + ], + [ + 165, + 242, + 1 + ], + [ + 170, + 1104, + 1 + ], + [ + 221, + 154, + 3 + ], + [ + 417, + 417, + 2 + ], + [ + 1033, + 298, + 3 + ], + [ + 1055, + 136, + 6 + ], + [ + 133, + 177, + 2 + ], + [ + 153, + 168, + 1 + ], + [ + 244, + 150, + 2 + ], + [ + 367, + 247, + 1 + ], + [ + 1039, + 1137, + 6 + ], + [ + 1050, + 145, + 6 + ], + [ + 1152, + 158, + 1 + ], + [ + 1164, + 168, + 2 + ], + [ + 181, + 1084, + 1 + ], + [ + 406, + 406, + 2 + ], + [ + 410, + 389, + 1 + ], + [ + 470, + 470, + 2 + ], + [ + 1024, + 333, + 4 + ], + [ + 133, + 1063, + 2 + ], + [ + 165, + 293, + 1 + ], + [ + 226, + 263, + 1 + ], + [ + 245, + 152, + 2 + ], + [ + 1024, + 351, + 4 + ], + [ + 1035, + 224, + 2 + ], + [ + 1036, + 240, + 4 + ], + [ + 138, + 148, + 1 + ], + [ + 146, + 1057, + 2 + ], + [ + 158, + 172, + 1 + ], + [ + 173, + 1027, + 1 + ], + [ + 311, + 179, + 3 + ], + [ + 322, + 170, + 1 + ], + [ + 501, + 501, + 2 + ], + [ + 1026, + 228, + 5 + ], + [ + 1041, + 151, + 4 + ], + [ + 1156, + 156, + 1 + ], + [ + 103, + 105, + 2 + ], + [ + 113, + 157, + 3 + ], + [ + 147, + 230, + 3 + ], + [ + 158, + 292, + 1 + ], + [ + 165, + 259, + 2 + ], + [ + 581, + 581, + 3 + ], + [ + 1035, + 235, + 2 + ], + [ + 1038, + 271, + 2 + ], + [ + 1048, + 176, + 6 + ], + [ + 1073, + 132, + 6 + ], + [ + 1089, + 146, + 2 + ], + [ + 1091, + 214, + 2 + ], + [ + 165, + 1113, + 1 + ], + [ + 363, + 363, + 4 + ], + [ + 498, + 498, + 2 + ], + [ + 1026, + 1166, + 3 + ], + [ + 104, + 413, + 1 + ], + [ + 149, + 223, + 2 + ], + [ + 216, + 491, + 2 + ], + [ + 399, + 214, + 2 + ], + [ + 132, + 295, + 2 + ], + [ + 148, + 189, + 1 + ], + [ + 220, + 132, + 3 + ], + [ + 1115, + 146, + 6 + ], + [ + 103, + 456, + 2 + ], + [ + 640, + 640, + 2 + ], + [ + 64, + 64, + 2 + ], + [ + 104, + 437, + 1 + ], + [ + 158, + 1106, + 1 + ], + [ + 163, + 371, + 1 + ], + [ + 170, + 1040, + 1 + ], + [ + 434, + 179, + 2 + ], + [ + 1033, + 292, + 3 + ], + [ + 1039, + 242, + 6 + ], + [ + 1054, + 145, + 4 + ], + [ + 1078, + 146, + 2 + ], + [ + 1099, + 152, + 2 + ], + [ + 1145, + 1095, + 4 + ], + [ + 1224, + 168, + 1 + ], + [ + 1224, + 173, + 1 + ], + [ + 1296, + 165, + 1 + ], + [ + 224, + 138, + 4 + ], + [ + 254, + 254, + 5 + ], + [ + 1033, + 293, + 3 + ], + [ + 1034, + 295, + 2 + ], + [ + 165, + 1096, + 1 + ], + [ + 166, + 272, + 2 + ], + [ + 215, + 267, + 2 + ], + [ + 219, + 133, + 2 + ], + [ + 257, + 296, + 3 + ], + [ + 287, + 181, + 1 + ], + [ + 453, + 453, + 2 + ], + [ + 1038, + 272, + 2 + ], + [ + 1240, + 181, + 1 + ], + [ + 136, + 1107, + 1 + ], + [ + 229, + 229, + 2 + ], + [ + 278, + 133, + 2 + ], + [ + 313, + 767, + 2 + ], + [ + 1024, + 359, + 4 + ], + [ + 1035, + 226, + 2 + ], + [ + 115, + 105, + 2 + ], + [ + 138, + 1065, + 2 + ], + [ + 147, + 228, + 3 + ], + [ + 151, + 1049, + 2 + ], + [ + 307, + 252, + 3 + ], + [ + 368, + 368, + 3 + ], + [ + 1069, + 132, + 4 + ], + [ + 1090, + 144, + 3 + ], + [ + 166, + 1095, + 1 + ], + [ + 172, + 1027, + 1 + ], + [ + 249, + 148, + 3 + ], + [ + 276, + 276, + 5 + ], + [ + 311, + 369, + 2 + ], + [ + 377, + 1110, + 2 + ], + [ + 1025, + 378, + 2 + ], + [ + 1026, + 250, + 5 + ], + [ + 1033, + 283, + 3 + ], + [ + 1115, + 147, + 6 + ], + [ + 1301, + 1036, + 1 + ], + [ + 104, + 423, + 1 + ], + [ + 331, + 331, + 4 + ], + [ + 338, + 226, + 2 + ], + [ + 378, + 168, + 1 + ], + [ + 477, + 477, + 3 + ], + [ + 1026, + 1168, + 1 + ], + [ + 1036, + 1076, + 3 + ], + [ + 1044, + 265, + 7 + ], + [ + 114, + 157, + 3 + ], + [ + 136, + 1064, + 2 + ], + [ + 146, + 1124, + 2 + ], + [ + 149, + 1065, + 2 + ], + [ + 214, + 146, + 2 + ], + [ + 248, + 240, + 2 + ], + [ + 324, + 156, + 1 + ], + [ + 334, + 243, + 2 + ], + [ + 403, + 403, + 2 + ], + [ + 1025, + 389, + 2 + ], + [ + 1074, + 245, + 3 + ], + [ + 1163, + 176, + 4 + ], + [ + 145, + 1071, + 2 + ], + [ + 148, + 1065, + 2 + ], + [ + 255, + 147, + 2 + ], + [ + 1032, + 407, + 3 + ], + [ + 1132, + 145, + 4 + ], + [ + 1316, + 181, + 1 + ], + [ + 221, + 271, + 3 + ], + [ + 289, + 136, + 2 + ], + [ + 418, + 168, + 1 + ], + [ + 754, + 472, + 2 + ], + [ + 1091, + 231, + 2 + ], + [ + 82, + 82, + 2 + ], + [ + 145, + 177, + 2 + ], + [ + 214, + 148, + 2 + ], + [ + 224, + 146, + 2 + ], + [ + 297, + 163, + 1 + ], + [ + 460, + 168, + 1 + ], + [ + 1034, + 344, + 2 + ], + [ + 1142, + 172, + 4 + ], + [ + 1155, + 1155, + 4 + ], + [ + 149, + 1079, + 1 + ], + [ + 173, + 1105, + 1 + ], + [ + 337, + 337, + 2 + ], + [ + 1026, + 1168, + 3 + ], + [ + 1029, + 144, + 3 + ], + [ + 1056, + 219, + 5 + ], + [ + 1091, + 1076, + 1 + ], + [ + 156, + 260, + 3 + ], + [ + 242, + 153, + 2 + ], + [ + 262, + 262, + 5 + ], + [ + 275, + 220, + 4 + ], + [ + 303, + 266, + 3 + ], + [ + 405, + 233, + 3 + ], + [ + 1032, + 398, + 3 + ], + [ + 1035, + 223, + 2 + ], + [ + 1035, + 228, + 2 + ], + [ + 1098, + 146, + 6 + ], + [ + 1113, + 170, + 3 + ], + [ + 138, + 1107, + 1 + ], + [ + 152, + 1077, + 1 + ], + [ + 280, + 280, + 6 + ], + [ + 1260, + 170, + 1 + ], + [ + 103, + 451, + 2 + ], + [ + 247, + 367, + 1 + ], + [ + 413, + 180, + 1 + ], + [ + 458, + 458, + 3 + ], + [ + 1026, + 248, + 5 + ], + [ + 1029, + 315, + 6 + ], + [ + 1049, + 136, + 6 + ], + [ + 1185, + 158, + 5 + ], + [ + 86, + 86, + 2 + ], + [ + 241, + 1070, + 2 + ], + [ + 306, + 446, + 4 + ], + [ + 329, + 329, + 5 + ], + [ + 535, + 535, + 2 + ], + [ + 1032, + 397, + 3 + ], + [ + 1033, + 299, + 3 + ], + [ + 1048, + 148, + 6 + ], + [ + 1062, + 254, + 1 + ], + [ + 1154, + 163, + 4 + ], + [ + 1222, + 168, + 5 + ], + [ + 149, + 214, + 2 + ], + [ + 217, + 215, + 2 + ], + [ + 226, + 147, + 2 + ], + [ + 268, + 268, + 6 + ], + [ + 274, + 274, + 2 + ], + [ + 486, + 486, + 3 + ], + [ + 880, + 880, + 2 + ], + [ + 1033, + 1093, + 3 + ], + [ + 1036, + 249, + 4 + ], + [ + 1112, + 158, + 2 + ], + [ + 1198, + 1056, + 1 + ], + [ + 226, + 148, + 2 + ], + [ + 263, + 1083, + 2 + ], + [ + 291, + 291, + 2 + ], + [ + 1027, + 327, + 4 + ], + [ + 1050, + 151, + 4 + ], + [ + 103, + 406, + 2 + ], + [ + 121, + 121, + 3 + ], + [ + 147, + 1107, + 1 + ], + [ + 151, + 1058, + 2 + ], + [ + 221, + 271, + 2 + ], + [ + 224, + 432, + 2 + ], + [ + 244, + 1070, + 2 + ], + [ + 254, + 220, + 1 + ], + [ + 257, + 223, + 2 + ], + [ + 330, + 168, + 1 + ], + [ + 346, + 156, + 1 + ], + [ + 560, + 560, + 2 + ], + [ + 1029, + 307, + 6 + ], + [ + 1036, + 233, + 4 + ], + [ + 114, + 164, + 3 + ], + [ + 131, + 131, + 3 + ], + [ + 166, + 1104, + 1 + ], + [ + 176, + 296, + 3 + ], + [ + 231, + 132, + 2 + ], + [ + 295, + 295, + 2 + ], + [ + 298, + 163, + 1 + ], + [ + 379, + 219, + 2 + ], + [ + 1043, + 1061, + 4 + ], + [ + 1064, + 138, + 6 + ], + [ + 1108, + 138, + 6 + ], + [ + 1239, + 158, + 1 + ], + [ + 144, + 1069, + 2 + ], + [ + 149, + 215, + 2 + ], + [ + 410, + 180, + 1 + ], + [ + 1032, + 371, + 3 + ], + [ + 1074, + 1437, + 3 + ], + [ + 1086, + 1025, + 2 + ], + [ + 1112, + 173, + 2 + ], + [ + 149, + 1049, + 2 + ], + [ + 402, + 240, + 2 + ], + [ + 526, + 526, + 3 + ], + [ + 1047, + 246, + 1 + ], + [ + 1055, + 150, + 1 + ], + [ + 1066, + 145, + 4 + ], + [ + 1067, + 133, + 2 + ], + [ + 1108, + 136, + 6 + ], + [ + 1109, + 1048, + 3 + ], + [ + 235, + 146, + 4 + ], + [ + 273, + 145, + 2 + ], + [ + 277, + 277, + 2 + ], + [ + 297, + 170, + 1 + ], + [ + 318, + 166, + 1 + ], + [ + 1062, + 1042, + 4 + ], + [ + 1145, + 1025, + 4 + ], + [ + 123, + 123, + 3 + ], + [ + 153, + 242, + 2 + ], + [ + 244, + 347, + 2 + ], + [ + 250, + 1046, + 2 + ], + [ + 261, + 176, + 2 + ], + [ + 339, + 679, + 2 + ], + [ + 600, + 345, + 2 + ], + [ + 1239, + 156, + 1 + ], + [ + 1420, + 236, + 4 + ], + [ + 146, + 1073, + 2 + ], + [ + 179, + 258, + 2 + ], + [ + 226, + 1070, + 2 + ], + [ + 255, + 148, + 2 + ], + [ + 363, + 163, + 1 + ], + [ + 1089, + 148, + 2 + ], + [ + 1112, + 165, + 2 + ], + [ + 1306, + 158, + 1 + ], + [ + 132, + 144, + 1 + ], + [ + 147, + 1125, + 2 + ], + [ + 149, + 278, + 4 + ], + [ + 162, + 115, + 3 + ], + [ + 223, + 414, + 2 + ], + [ + 228, + 302, + 3 + ], + [ + 258, + 150, + 1 + ], + [ + 286, + 138, + 2 + ], + [ + 361, + 491, + 2 + ], + [ + 420, + 420, + 2 + ], + [ + 1026, + 228, + 3 + ], + [ + 1088, + 241, + 2 + ], + [ + 167, + 158, + 1 + ], + [ + 338, + 338, + 4 + ], + [ + 347, + 244, + 2 + ], + [ + 930, + 930, + 1 + ], + [ + 1031, + 1126, + 2 + ], + [ + 1063, + 151, + 5 + ], + [ + 1068, + 176, + 6 + ], + [ + 1106, + 170, + 2 + ], + [ + 130, + 130, + 1 + ], + [ + 146, + 1060, + 2 + ], + [ + 159, + 159, + 1 + ], + [ + 163, + 1096, + 1 + ], + [ + 205, + 141, + 2 + ], + [ + 233, + 325, + 4 + ], + [ + 262, + 148, + 2 + ], + [ + 264, + 264, + 5 + ], + [ + 272, + 172, + 1 + ], + [ + 1024, + 456, + 4 + ], + [ + 240, + 144, + 2 + ], + [ + 326, + 326, + 5 + ], + [ + 408, + 408, + 3 + ], + [ + 1067, + 189, + 5 + ], + [ + 1072, + 156, + 5 + ], + [ + 1088, + 133, + 2 + ], + [ + 154, + 245, + 2 + ], + [ + 177, + 254, + 2 + ], + [ + 236, + 236, + 6 + ], + [ + 255, + 144, + 2 + ], + [ + 285, + 285, + 5 + ], + [ + 322, + 166, + 2 + ], + [ + 484, + 500, + 2 + ], + [ + 1035, + 226, + 4 + ], + [ + 147, + 151, + 1 + ], + [ + 252, + 252, + 5 + ], + [ + 282, + 103, + 2 + ], + [ + 319, + 165, + 2 + ], + [ + 1024, + 379, + 4 + ], + [ + 1026, + 1031, + 3 + ], + [ + 1083, + 217, + 4 + ], + [ + 215, + 375, + 2 + ], + [ + 219, + 249, + 2 + ], + [ + 220, + 1042, + 2 + ], + [ + 333, + 250, + 2 + ], + [ + 788, + 788, + 2 + ], + [ + 1026, + 224, + 3 + ], + [ + 1043, + 133, + 1 + ], + [ + 1094, + 273, + 2 + ], + [ + 1186, + 181, + 1 + ], + [ + 1339, + 166, + 1 + ], + [ + 167, + 156, + 1 + ], + [ + 195, + 195, + 2 + ], + [ + 224, + 148, + 2 + ], + [ + 262, + 1085, + 2 + ], + [ + 435, + 259, + 2 + ], + [ + 447, + 561, + 2 + ], + [ + 605, + 605, + 1 + ], + [ + 166, + 1040, + 1 + ], + [ + 170, + 1084, + 1 + ], + [ + 231, + 219, + 2 + ], + [ + 262, + 144, + 2 + ], + [ + 311, + 136, + 2 + ], + [ + 324, + 324, + 4 + ], + [ + 346, + 180, + 1 + ], + [ + 1056, + 284, + 2 + ], + [ + 1097, + 170, + 2 + ], + [ + 1260, + 166, + 1 + ], + [ + 145, + 144, + 2 + ], + [ + 250, + 147, + 2 + ], + [ + 255, + 177, + 2 + ], + [ + 274, + 144, + 2 + ], + [ + 1026, + 226, + 3 + ], + [ + 1031, + 1026, + 1 + ], + [ + 1035, + 224, + 4 + ], + [ + 1069, + 133, + 4 + ], + [ + 146, + 243, + 3 + ], + [ + 151, + 1051, + 2 + ], + [ + 163, + 1040, + 1 + ], + [ + 269, + 138, + 1 + ], + [ + 894, + 894, + 2 + ], + [ + 1024, + 411, + 4 + ], + [ + 1050, + 248, + 4 + ], + [ + 1090, + 1057, + 1 + ], + [ + 1108, + 149, + 6 + ], + [ + 154, + 158, + 1 + ], + [ + 214, + 249, + 2 + ], + [ + 217, + 233, + 2 + ], + [ + 330, + 330, + 5 + ], + [ + 545, + 545, + 2 + ], + [ + 706, + 459, + 2 + ], + [ + 1024, + 451, + 4 + ], + [ + 1074, + 1272, + 3 + ], + [ + 1105, + 156, + 2 + ], + [ + 1110, + 308, + 4 + ], + [ + 147, + 145, + 1 + ], + [ + 176, + 273, + 2 + ], + [ + 181, + 1106, + 1 + ], + [ + 245, + 1077, + 1 + ], + [ + 281, + 281, + 5 + ], + [ + 348, + 240, + 3 + ], + [ + 419, + 419, + 3 + ], + [ + 438, + 438, + 3 + ], + [ + 1024, + 369, + 4 + ], + [ + 1033, + 301, + 3 + ], + [ + 1062, + 214, + 4 + ], + [ + 1192, + 1077, + 5 + ], + [ + 1210, + 180, + 5 + ], + [ + 103, + 358, + 2 + ], + [ + 165, + 1037, + 1 + ], + [ + 173, + 1096, + 1 + ], + [ + 217, + 226, + 2 + ], + [ + 262, + 230, + 2 + ], + [ + 1033, + 283, + 1 + ], + [ + 1094, + 233, + 2 + ], + [ + 1260, + 156, + 1 + ], + [ + 148, + 226, + 2 + ], + [ + 150, + 1052, + 2 + ], + [ + 170, + 270, + 1 + ], + [ + 231, + 402, + 2 + ], + [ + 260, + 260, + 7 + ], + [ + 1083, + 1158, + 4 + ], + [ + 1089, + 215, + 2 + ], + [ + 1147, + 177, + 4 + ], + [ + 148, + 1064, + 2 + ], + [ + 152, + 1084, + 1 + ], + [ + 242, + 1081, + 1 + ], + [ + 246, + 246, + 1 + ], + [ + 284, + 138, + 1 + ], + [ + 294, + 294, + 1 + ], + [ + 404, + 404, + 3 + ], + [ + 779, + 779, + 2 + ], + [ + 1035, + 223, + 4 + ], + [ + 158, + 259, + 2 + ], + [ + 242, + 1093, + 3 + ], + [ + 565, + 565, + 2 + ], + [ + 571, + 571, + 3 + ], + [ + 1038, + 268, + 2 + ], + [ + 1060, + 132, + 3 + ], + [ + 1120, + 1128, + 4 + ], + [ + 152, + 268, + 2 + ], + [ + 235, + 431, + 2 + ], + [ + 293, + 293, + 5 + ], + [ + 299, + 299, + 6 + ], + [ + 303, + 179, + 3 + ], + [ + 1039, + 1277, + 6 + ], + [ + 1085, + 1160, + 4 + ], + [ + 1092, + 103, + 4 + ], + [ + 117, + 162, + 3 + ], + [ + 168, + 397, + 1 + ], + [ + 220, + 1075, + 1 + ], + [ + 318, + 318, + 4 + ], + [ + 936, + 936, + 2 + ], + [ + 1036, + 1078, + 4 + ], + [ + 1039, + 246, + 6 + ], + [ + 1055, + 147, + 6 + ], + [ + 157, + 157, + 5 + ], + [ + 166, + 1037, + 1 + ], + [ + 223, + 132, + 3 + ], + [ + 295, + 138, + 2 + ], + [ + 297, + 165, + 2 + ], + [ + 396, + 220, + 3 + ], + [ + 424, + 244, + 2 + ], + [ + 1041, + 145, + 4 + ], + [ + 1057, + 1049, + 1 + ], + [ + 1116, + 1116, + 5 + ], + [ + 1206, + 181, + 1 + ], + [ + 1292, + 1036, + 1 + ], + [ + 119, + 119, + 4 + ], + [ + 148, + 1050, + 2 + ], + [ + 165, + 1095, + 1 + ], + [ + 215, + 241, + 2 + ], + [ + 228, + 147, + 4 + ], + [ + 305, + 214, + 3 + ], + [ + 1115, + 136, + 6 + ], + [ + 1306, + 163, + 1 + ], + [ + 149, + 1064, + 2 + ], + [ + 234, + 448, + 2 + ], + [ + 255, + 189, + 2 + ], + [ + 728, + 388, + 2 + ], + [ + 1027, + 322, + 4 + ], + [ + 1032, + 372, + 3 + ], + [ + 1032, + 408, + 3 + ], + [ + 1036, + 261, + 4 + ], + [ + 1048, + 136, + 6 + ], + [ + 146, + 235, + 3 + ], + [ + 152, + 1097, + 1 + ], + [ + 282, + 282, + 5 + ], + [ + 303, + 303, + 5 + ], + [ + 331, + 406, + 2 + ], + [ + 1072, + 166, + 5 + ], + [ + 1096, + 165, + 3 + ], + [ + 1306, + 156, + 1 + ], + [ + 141, + 199, + 3 + ], + [ + 213, + 213, + 3 + ], + [ + 219, + 1076, + 1 + ], + [ + 230, + 136, + 2 + ], + [ + 248, + 275, + 2 + ], + [ + 307, + 252, + 2 + ], + [ + 327, + 327, + 5 + ], + [ + 1024, + 375, + 4 + ], + [ + 1033, + 292, + 1 + ], + [ + 1042, + 146, + 1 + ], + [ + 1091, + 147, + 2 + ], + [ + 334, + 177, + 3 + ], + [ + 1036, + 255, + 4 + ], + [ + 1039, + 1093, + 6 + ], + [ + 1048, + 138, + 6 + ], + [ + 103, + 115, + 2 + ], + [ + 132, + 1073, + 2 + ], + [ + 261, + 1085, + 2 + ], + [ + 1025, + 425, + 2 + ], + [ + 1039, + 1086, + 6 + ], + [ + 1044, + 245, + 7 + ], + [ + 1105, + 172, + 2 + ], + [ + 103, + 405, + 2 + ], + [ + 124, + 124, + 2 + ], + [ + 133, + 230, + 3 + ], + [ + 147, + 224, + 2 + ], + [ + 149, + 224, + 2 + ], + [ + 173, + 1077, + 1 + ], + [ + 258, + 258, + 5 + ], + [ + 411, + 411, + 2 + ], + [ + 423, + 168, + 1 + ], + [ + 663, + 712, + 2 + ], + [ + 1038, + 259, + 2 + ], + [ + 1136, + 1094, + 3 + ], + [ + 145, + 146, + 1 + ], + [ + 151, + 176, + 2 + ], + [ + 151, + 1064, + 2 + ], + [ + 152, + 1037, + 1 + ], + [ + 191, + 191, + 3 + ], + [ + 193, + 193, + 3 + ], + [ + 263, + 144, + 2 + ], + [ + 274, + 136, + 1 + ], + [ + 701, + 701, + 2 + ], + [ + 146, + 1071, + 2 + ], + [ + 163, + 1081, + 1 + ], + [ + 217, + 133, + 2 + ], + [ + 219, + 224, + 2 + ], + [ + 220, + 147, + 2 + ], + [ + 269, + 269, + 7 + ], + [ + 504, + 504, + 3 + ], + [ + 585, + 585, + 2 + ], + [ + 617, + 617, + 3 + ], + [ + 1026, + 1187, + 1 + ], + [ + 1036, + 263, + 4 + ], + [ + 1094, + 133, + 2 + ], + [ + 1224, + 172, + 1 + ], + [ + 138, + 214, + 4 + ], + [ + 151, + 279, + 2 + ], + [ + 158, + 246, + 1 + ], + [ + 181, + 283, + 1 + ], + [ + 203, + 203, + 2 + ], + [ + 228, + 1075, + 1 + ], + [ + 480, + 480, + 3 + ], + [ + 763, + 366, + 2 + ], + [ + 1033, + 1146, + 1 + ], + [ + 1042, + 223, + 4 + ], + [ + 1185, + 165, + 5 + ], + [ + 1230, + 156, + 5 + ], + [ + 1302, + 176, + 2 + ], + [ + 138, + 1073, + 2 + ], + [ + 149, + 1057, + 2 + ], + [ + 177, + 1066, + 2 + ], + [ + 217, + 393, + 2 + ], + [ + 222, + 1305, + 3 + ], + [ + 235, + 136, + 2 + ], + [ + 1039, + 1196, + 6 + ], + [ + 105, + 115, + 2 + ], + [ + 110, + 110, + 5 + ], + [ + 158, + 1096, + 1 + ], + [ + 170, + 1095, + 1 + ], + [ + 248, + 1058, + 2 + ], + [ + 287, + 172, + 1 + ], + [ + 1162, + 163, + 2 + ], + [ + 103, + 162, + 2 + ], + [ + 173, + 1112, + 1 + ], + [ + 215, + 223, + 2 + ], + [ + 217, + 266, + 2 + ], + [ + 236, + 176, + 2 + ], + [ + 261, + 302, + 3 + ], + [ + 263, + 148, + 2 + ], + [ + 1052, + 133, + 1 + ], + [ + 1061, + 1043, + 2 + ], + [ + 1070, + 1069, + 2 + ], + [ + 1307, + 189, + 5 + ], + [ + 239, + 362, + 1 + ], + [ + 247, + 339, + 1 + ], + [ + 267, + 267, + 2 + ], + [ + 333, + 250, + 3 + ], + [ + 353, + 353, + 5 + ], + [ + 733, + 459, + 2 + ], + [ + 1065, + 132, + 6 + ], + [ + 1161, + 151, + 4 + ], + [ + 1306, + 172, + 1 + ], + [ + 132, + 1057, + 2 + ], + [ + 154, + 245, + 3 + ], + [ + 170, + 1106, + 1 + ], + [ + 220, + 214, + 2 + ], + [ + 220, + 1122, + 2 + ], + [ + 279, + 151, + 2 + ], + [ + 391, + 543, + 2 + ], + [ + 1032, + 389, + 3 + ], + [ + 1089, + 233, + 2 + ], + [ + 1189, + 152, + 5 + ], + [ + 1260, + 1047, + 1 + ], + [ + 277, + 138, + 1 + ], + [ + 278, + 133, + 1 + ], + [ + 329, + 165, + 1 + ], + [ + 363, + 158, + 1 + ], + [ + 1044, + 242, + 7 + ], + [ + 173, + 392, + 1 + ], + [ + 219, + 231, + 2 + ], + [ + 445, + 377, + 2 + ], + [ + 449, + 190, + 2 + ], + [ + 1215, + 180, + 1 + ], + [ + 1334, + 1036, + 1 + ], + [ + 1422, + 180, + 4 + ], + [ + 138, + 277, + 2 + ], + [ + 148, + 1048, + 2 + ], + [ + 156, + 287, + 1 + ], + [ + 170, + 246, + 1 + ], + [ + 219, + 149, + 2 + ], + [ + 241, + 149, + 3 + ], + [ + 260, + 181, + 1 + ], + [ + 265, + 265, + 5 + ], + [ + 276, + 103, + 2 + ], + [ + 386, + 230, + 2 + ], + [ + 397, + 397, + 2 + ], + [ + 1026, + 1166, + 1 + ], + [ + 1027, + 321, + 4 + ], + [ + 1036, + 241, + 4 + ], + [ + 1055, + 132, + 6 + ], + [ + 1091, + 224, + 2 + ], + [ + 3359, + 58, + 2 + ], + [ + 113, + 113, + 1 + ], + [ + 122, + 122, + 3 + ], + [ + 218, + 218, + 3 + ], + [ + 223, + 296, + 3 + ], + [ + 352, + 352, + 2 + ], + [ + 361, + 575, + 2 + ], + [ + 362, + 239, + 1 + ], + [ + 384, + 384, + 2 + ], + [ + 463, + 236, + 2 + ], + [ + 508, + 176, + 2 + ], + [ + 1026, + 248, + 3 + ], + [ + 103, + 462, + 2 + ], + [ + 150, + 176, + 2 + ], + [ + 278, + 278, + 6 + ], + [ + 520, + 520, + 2 + ], + [ + 1025, + 392, + 2 + ], + [ + 1027, + 433, + 4 + ], + [ + 1029, + 275, + 6 + ], + [ + 1136, + 1031, + 3 + ], + [ + 1157, + 166, + 2 + ], + [ + 117, + 251, + 1 + ], + [ + 164, + 164, + 5 + ], + [ + 177, + 1147, + 2 + ], + [ + 301, + 301, + 6 + ], + [ + 324, + 172, + 1 + ], + [ + 326, + 168, + 1 + ], + [ + 422, + 422, + 4 + ], + [ + 1240, + 158, + 1 + ], + [ + 133, + 1115, + 2 + ], + [ + 135, + 202, + 2 + ], + [ + 152, + 1040, + 1 + ], + [ + 163, + 1044, + 1 + ], + [ + 163, + 1169, + 1 + ], + [ + 177, + 144, + 2 + ], + [ + 214, + 149, + 2 + ], + [ + 228, + 379, + 2 + ], + [ + 235, + 359, + 2 + ], + [ + 262, + 355, + 2 + ], + [ + 347, + 179, + 3 + ], + [ + 368, + 158, + 1 + ], + [ + 418, + 418, + 4 + ], + [ + 430, + 249, + 2 + ], + [ + 1035, + 1147, + 2 + ], + [ + 1094, + 136, + 2 + ], + [ + 1162, + 165, + 2 + ], + [ + 133, + 1073, + 2 + ], + [ + 284, + 284, + 6 + ], + [ + 344, + 344, + 2 + ], + [ + 381, + 381, + 2 + ], + [ + 457, + 293, + 1 + ], + [ + 460, + 158, + 1 + ], + [ + 769, + 769, + 2 + ], + [ + 1024, + 335, + 4 + ], + [ + 1052, + 150, + 4 + ], + [ + 1060, + 147, + 6 + ], + [ + 1079, + 1050, + 2 + ], + [ + 1091, + 249, + 2 + ], + [ + 1149, + 150, + 6 + ], + [ + 1219, + 180, + 1 + ], + [ + 1337, + 1036, + 1 + ], + [ + 145, + 1130, + 2 + ], + [ + 230, + 1078, + 1 + ], + [ + 250, + 250, + 6 + ], + [ + 273, + 132, + 2 + ], + [ + 276, + 148, + 2 + ], + [ + 539, + 189, + 2 + ], + [ + 1025, + 441, + 2 + ], + [ + 1035, + 228, + 4 + ], + [ + 1049, + 138, + 6 + ], + [ + 1063, + 138, + 6 + ], + [ + 1072, + 165, + 5 + ], + [ + 1222, + 158, + 5 + ], + [ + 103, + 452, + 2 + ], + [ + 104, + 425, + 1 + ], + [ + 155, + 259, + 2 + ], + [ + 157, + 114, + 3 + ], + [ + 228, + 136, + 2 + ], + [ + 417, + 315, + 2 + ], + [ + 1024, + 386, + 4 + ], + [ + 1024, + 1220, + 4 + ], + [ + 1089, + 132, + 2 + ], + [ + 1173, + 189, + 4 + ], + [ + 1259, + 180, + 1 + ], + [ + 1561, + 314, + 4 + ], + [ + 156, + 1037, + 1 + ], + [ + 163, + 1154, + 1 + ], + [ + 214, + 379, + 2 + ], + [ + 215, + 1061, + 1 + ], + [ + 244, + 1061, + 1 + ], + [ + 259, + 155, + 2 + ], + [ + 371, + 165, + 1 + ], + [ + 373, + 226, + 2 + ], + [ + 1239, + 170, + 1 + ], + [ + 145, + 1055, + 2 + ], + [ + 150, + 1065, + 2 + ], + [ + 156, + 1106, + 1 + ], + [ + 163, + 1084, + 1 + ], + [ + 168, + 1184, + 1 + ], + [ + 228, + 148, + 2 + ], + [ + 269, + 1085, + 2 + ], + [ + 274, + 103, + 2 + ], + [ + 320, + 280, + 3 + ], + [ + 369, + 369, + 3 + ], + [ + 402, + 231, + 3 + ], + [ + 1033, + 1142, + 1 + ], + [ + 1050, + 1042, + 1 + ], + [ + 1415, + 242, + 4 + ], + [ + 179, + 1144, + 2 + ], + [ + 240, + 454, + 2 + ], + [ + 243, + 132, + 2 + ], + [ + 328, + 162, + 1 + ], + [ + 1032, + 413, + 3 + ], + [ + 1043, + 217, + 4 + ], + [ + 1060, + 136, + 6 + ], + [ + 1081, + 181, + 2 + ], + [ + 1257, + 180, + 1 + ], + [ + 104, + 435, + 1 + ], + [ + 146, + 226, + 2 + ], + [ + 151, + 1048, + 2 + ], + [ + 223, + 148, + 2 + ], + [ + 232, + 232, + 1 + ], + [ + 233, + 1070, + 2 + ], + [ + 309, + 309, + 3 + ], + [ + 313, + 234, + 1 + ], + [ + 317, + 317, + 2 + ], + [ + 1150, + 147, + 6 + ], + [ + 1185, + 166, + 5 + ], + [ + 1206, + 180, + 1 + ], + [ + 151, + 189, + 2 + ], + [ + 157, + 113, + 3 + ], + [ + 166, + 322, + 2 + ], + [ + 221, + 154, + 1 + ], + [ + 233, + 405, + 2 + ], + [ + 235, + 258, + 1 + ], + [ + 1035, + 230, + 4 + ], + [ + 1036, + 231, + 4 + ], + [ + 230, + 138, + 2 + ], + [ + 262, + 224, + 1 + ], + [ + 1128, + 165, + 3 + ], + [ + 104, + 436, + 1 + ], + [ + 132, + 307, + 2 + ], + [ + 222, + 148, + 3 + ], + [ + 289, + 289, + 5 + ], + [ + 304, + 269, + 2 + ], + [ + 308, + 308, + 5 + ], + [ + 1038, + 292, + 2 + ], + [ + 1073, + 136, + 6 + ], + [ + 1074, + 1413, + 3 + ], + [ + 1093, + 172, + 2 + ], + [ + 1105, + 158, + 2 + ], + [ + 1124, + 136, + 6 + ], + [ + 1152, + 163, + 1 + ], + [ + 1164, + 180, + 2 + ], + [ + 164, + 117, + 3 + ], + [ + 214, + 219, + 2 + ], + [ + 283, + 170, + 1 + ], + [ + 346, + 158, + 1 + ], + [ + 1033, + 287, + 1 + ], + [ + 1042, + 1117, + 4 + ], + [ + 1152, + 172, + 1 + ], + [ + 103, + 409, + 2 + ], + [ + 176, + 150, + 2 + ], + [ + 237, + 153, + 3 + ], + [ + 288, + 136, + 2 + ], + [ + 410, + 166, + 1 + ], + [ + 1038, + 297, + 2 + ], + [ + 1130, + 149, + 6 + ], + [ + 1155, + 273, + 4 + ], + [ + 1451, + 247, + 4 + ], + [ + 103, + 399, + 2 + ], + [ + 147, + 215, + 2 + ], + [ + 215, + 257, + 1 + ], + [ + 332, + 332, + 2 + ], + [ + 416, + 416, + 3 + ], + [ + 429, + 230, + 2 + ], + [ + 1024, + 320, + 4 + ], + [ + 1026, + 215, + 3 + ], + [ + 1048, + 1050, + 1 + ], + [ + 1070, + 266, + 1 + ], + [ + 156, + 1142, + 2 + ], + [ + 177, + 305, + 3 + ], + [ + 258, + 146, + 2 + ], + [ + 264, + 219, + 1 + ], + [ + 1035, + 243, + 2 + ], + [ + 1043, + 233, + 4 + ], + [ + 1098, + 138, + 6 + ], + [ + 16, + 526, + 2 + ], + [ + 147, + 1057, + 2 + ], + [ + 168, + 408, + 1 + ], + [ + 306, + 1067, + 2 + ], + [ + 386, + 219, + 2 + ], + [ + 505, + 505, + 2 + ], + [ + 1051, + 151, + 4 + ], + [ + 1062, + 1075, + 3 + ], + [ + 1069, + 144, + 4 + ], + [ + 1094, + 1136, + 2 + ], + [ + 103, + 164, + 2 + ], + [ + 103, + 432, + 2 + ], + [ + 104, + 444, + 1 + ], + [ + 152, + 1096, + 1 + ], + [ + 165, + 1119, + 1 + ], + [ + 228, + 149, + 2 + ], + [ + 263, + 359, + 2 + ], + [ + 1026, + 1187, + 3 + ], + [ + 1056, + 1076, + 4 + ], + [ + 1072, + 158, + 5 + ], + [ + 1083, + 1083, + 5 + ], + [ + 1089, + 226, + 2 + ], + [ + 1232, + 168, + 1 + ], + [ + 170, + 1113, + 1 + ], + [ + 268, + 173, + 1 + ], + [ + 315, + 132, + 2 + ], + [ + 1137, + 1077, + 2 + ], + [ + 1156, + 173, + 1 + ], + [ + 168, + 389, + 1 + ], + [ + 240, + 240, + 6 + ], + [ + 249, + 1076, + 1 + ], + [ + 318, + 181, + 1 + ], + [ + 353, + 158, + 1 + ], + [ + 1024, + 377, + 4 + ], + [ + 1031, + 306, + 2 + ], + [ + 1031, + 1118, + 2 + ], + [ + 1033, + 297, + 3 + ], + [ + 1042, + 144, + 4 + ], + [ + 1042, + 1075, + 4 + ], + [ + 1074, + 156, + 5 + ], + [ + 1153, + 144, + 6 + ], + [ + 1164, + 158, + 2 + ], + [ + 220, + 138, + 2 + ], + [ + 271, + 319, + 1 + ], + [ + 290, + 290, + 1 + ], + [ + 358, + 273, + 2 + ], + [ + 369, + 179, + 3 + ], + [ + 1025, + 413, + 2 + ], + [ + 1038, + 283, + 2 + ], + [ + 1056, + 1034, + 1 + ], + [ + 1056, + 1045, + 5 + ], + [ + 115, + 159, + 3 + ], + [ + 133, + 300, + 2 + ], + [ + 150, + 1234, + 2 + ], + [ + 162, + 328, + 1 + ], + [ + 230, + 262, + 2 + ], + [ + 1032, + 392, + 3 + ], + [ + 146, + 233, + 2 + ], + [ + 150, + 133, + 1 + ], + [ + 156, + 1095, + 1 + ], + [ + 172, + 389, + 1 + ], + [ + 181, + 1081, + 1 + ], + [ + 217, + 241, + 2 + ], + [ + 223, + 138, + 2 + ], + [ + 235, + 148, + 2 + ], + [ + 258, + 179, + 2 + ], + [ + 287, + 168, + 2 + ], + [ + 292, + 167, + 2 + ], + [ + 305, + 377, + 2 + ], + [ + 316, + 316, + 3 + ], + [ + 327, + 166, + 1 + ], + [ + 335, + 249, + 2 + ], + [ + 363, + 363, + 3 + ], + [ + 759, + 759, + 2 + ], + [ + 1036, + 1446, + 1 + ], + [ + 1037, + 1309, + 5 + ], + [ + 1041, + 147, + 1 + ], + [ + 1088, + 280, + 2 + ], + [ + 149, + 285, + 2 + ], + [ + 189, + 1029, + 2 + ], + [ + 267, + 215, + 2 + ], + [ + 286, + 286, + 6 + ], + [ + 342, + 342, + 3 + ], + [ + 592, + 592, + 2 + ], + [ + 1026, + 1140, + 5 + ], + [ + 1043, + 146, + 1 + ], + [ + 1085, + 219, + 4 + ], + [ + 1093, + 170, + 2 + ], + [ + 103, + 1294, + 2 + ], + [ + 114, + 114, + 1 + ], + [ + 146, + 1107, + 1 + ], + [ + 264, + 231, + 1 + ], + [ + 293, + 181, + 1 + ], + [ + 323, + 323, + 3 + ], + [ + 375, + 223, + 2 + ], + [ + 378, + 378, + 2 + ], + [ + 414, + 243, + 2 + ], + [ + 881, + 881, + 1 + ], + [ + 1025, + 422, + 2 + ], + [ + 1031, + 1136, + 2 + ], + [ + 1036, + 1421, + 1 + ], + [ + 1088, + 284, + 2 + ], + [ + 1091, + 132, + 2 + ], + [ + 1259, + 173, + 1 + ], + [ + 136, + 266, + 1 + ], + [ + 144, + 277, + 1 + ], + [ + 304, + 138, + 2 + ], + [ + 437, + 260, + 3 + ], + [ + 590, + 590, + 1 + ], + [ + 1026, + 1193, + 1 + ], + [ + 1042, + 1075, + 3 + ], + [ + 147, + 1073, + 2 + ], + [ + 249, + 219, + 2 + ], + [ + 259, + 181, + 1 + ], + [ + 319, + 170, + 1 + ], + [ + 1037, + 1310, + 5 + ], + [ + 1038, + 324, + 2 + ], + [ + 1039, + 1221, + 6 + ], + [ + 1108, + 148, + 6 + ], + [ + 1295, + 168, + 6 + ], + [ + 110, + 153, + 3 + ], + [ + 118, + 118, + 4 + ], + [ + 147, + 1079, + 1 + ], + [ + 163, + 1047, + 1 + ], + [ + 177, + 331, + 3 + ], + [ + 234, + 313, + 1 + ], + [ + 241, + 421, + 2 + ], + [ + 270, + 270, + 6 + ], + [ + 311, + 1116, + 2 + ], + [ + 496, + 496, + 1 + ], + [ + 1025, + 410, + 2 + ], + [ + 1035, + 1056, + 1 + ], + [ + 1062, + 215, + 4 + ], + [ + 1260, + 158, + 1 + ], + [ + 1392, + 240, + 4 + ], + [ + 103, + 402, + 2 + ], + [ + 103, + 424, + 2 + ], + [ + 132, + 1107, + 1 + ], + [ + 144, + 1041, + 1 + ], + [ + 159, + 113, + 3 + ], + [ + 235, + 393, + 2 + ], + [ + 368, + 163, + 1 + ], + [ + 431, + 243, + 2 + ], + [ + 1042, + 248, + 4 + ], + [ + 1070, + 1061, + 4 + ], + [ + 107, + 107, + 1 + ], + [ + 136, + 1057, + 2 + ], + [ + 137, + 137, + 3 + ], + [ + 149, + 217, + 2 + ], + [ + 152, + 1047, + 1 + ], + [ + 224, + 162, + 2 + ], + [ + 301, + 165, + 1 + ], + [ + 307, + 442, + 3 + ], + [ + 460, + 283, + 1 + ], + [ + 1075, + 146, + 2 + ], + [ + 1133, + 158, + 3 + ], + [ + 1185, + 1105, + 5 + ], + [ + 103, + 348, + 2 + ], + [ + 103, + 429, + 2 + ], + [ + 133, + 1071, + 2 + ], + [ + 145, + 145, + 7 + ], + [ + 180, + 1027, + 1 + ], + [ + 220, + 1058, + 2 + ], + [ + 224, + 219, + 2 + ], + [ + 224, + 1067, + 2 + ], + [ + 298, + 170, + 1 + ], + [ + 318, + 170, + 1 + ], + [ + 318, + 268, + 1 + ], + [ + 321, + 272, + 1 + ], + [ + 376, + 158, + 1 + ], + [ + 383, + 383, + 3 + ], + [ + 836, + 518, + 2 + ], + [ + 1026, + 217, + 5 + ], + [ + 1035, + 233, + 4 + ], + [ + 1035, + 235, + 4 + ], + [ + 1088, + 138, + 2 + ], + [ + 1129, + 170, + 4 + ], + [ + 132, + 296, + 2 + ], + [ + 147, + 149, + 1 + ], + [ + 156, + 1097, + 1 + ], + [ + 211, + 211, + 3 + ], + [ + 267, + 176, + 2 + ], + [ + 553, + 553, + 2 + ], + [ + 1024, + 308, + 4 + ], + [ + 1046, + 132, + 4 + ], + [ + 1060, + 138, + 6 + ], + [ + 1070, + 179, + 2 + ], + [ + 1110, + 1110, + 5 + ], + [ + 163, + 1218, + 1 + ], + [ + 241, + 320, + 3 + ], + [ + 279, + 334, + 3 + ], + [ + 288, + 288, + 6 + ], + [ + 326, + 166, + 2 + ], + [ + 367, + 703, + 2 + ], + [ + 1039, + 1099, + 6 + ], + [ + 1039, + 1262, + 6 + ], + [ + 1044, + 246, + 7 + ], + [ + 1115, + 138, + 6 + ], + [ + 1162, + 170, + 2 + ], + [ + 1246, + 1078, + 6 + ], + [ + 152, + 1112, + 1 + ], + [ + 222, + 148, + 5 + ], + [ + 314, + 835, + 2 + ], + [ + 1038, + 299, + 2 + ], + [ + 1090, + 144, + 1 + ], + [ + 1416, + 251, + 4 + ], + [ + 132, + 302, + 2 + ], + [ + 136, + 266, + 2 + ], + [ + 149, + 219, + 2 + ], + [ + 168, + 259, + 1 + ], + [ + 189, + 151, + 2 + ], + [ + 233, + 274, + 1 + ], + [ + 351, + 133, + 2 + ], + [ + 1039, + 1282, + 6 + ], + [ + 1054, + 144, + 1 + ], + [ + 1067, + 1046, + 2 + ], + [ + 1142, + 156, + 1 + ], + [ + 1209, + 181, + 3 + ], + [ + 166, + 1047, + 1 + ], + [ + 176, + 254, + 2 + ], + [ + 176, + 264, + 2 + ], + [ + 306, + 145, + 2 + ], + [ + 348, + 278, + 2 + ], + [ + 399, + 220, + 2 + ], + [ + 1032, + 441, + 3 + ], + [ + 1033, + 287, + 3 + ], + [ + 1035, + 1144, + 2 + ], + [ + 1046, + 1041, + 1 + ], + [ + 1210, + 165, + 5 + ], + [ + 1625, + 366, + 4 + ], + [ + 136, + 291, + 2 + ], + [ + 145, + 1108, + 2 + ], + [ + 151, + 1043, + 2 + ], + [ + 172, + 1077, + 1 + ], + [ + 222, + 258, + 1 + ], + [ + 252, + 266, + 1 + ], + [ + 261, + 214, + 1 + ], + [ + 613, + 427, + 2 + ], + [ + 725, + 725, + 2 + ], + [ + 1026, + 215, + 5 + ], + [ + 1034, + 1136, + 2 + ], + [ + 1039, + 1330, + 6 + ], + [ + 1066, + 138, + 1 + ], + [ + 1113, + 181, + 3 + ], + [ + 1157, + 170, + 2 + ], + [ + 104, + 443, + 1 + ], + [ + 305, + 177, + 3 + ], + [ + 329, + 152, + 1 + ], + [ + 396, + 220, + 2 + ], + [ + 622, + 622, + 2 + ], + [ + 1039, + 1299, + 6 + ], + [ + 1042, + 236, + 4 + ], + [ + 1070, + 291, + 2 + ], + [ + 1106, + 181, + 2 + ], + [ + 117, + 164, + 1 + ], + [ + 132, + 315, + 2 + ], + [ + 163, + 1097, + 1 + ], + [ + 166, + 1112, + 1 + ], + [ + 194, + 135, + 2 + ], + [ + 226, + 217, + 2 + ], + [ + 283, + 232, + 3 + ], + [ + 1184, + 181, + 2 + ], + [ + 136, + 289, + 2 + ], + [ + 226, + 409, + 2 + ], + [ + 242, + 104, + 1 + ], + [ + 243, + 146, + 3 + ], + [ + 388, + 518, + 2 + ], + [ + 484, + 484, + 3 + ], + [ + 1026, + 1193, + 3 + ], + [ + 1038, + 260, + 2 + ], + [ + 1040, + 1196, + 1 + ], + [ + 1040, + 1215, + 1 + ], + [ + 1046, + 1213, + 1 + ], + [ + 1050, + 1122, + 1 + ], + [ + 1074, + 170, + 5 + ], + [ + 1118, + 1031, + 3 + ], + [ + 1306, + 173, + 1 + ], + [ + 1630, + 382, + 4 + ], + [ + 215, + 424, + 2 + ], + [ + 226, + 393, + 2 + ], + [ + 262, + 189, + 2 + ], + [ + 274, + 274, + 5 + ], + [ + 286, + 286, + 7 + ], + [ + 1036, + 1428, + 1 + ], + [ + 1036, + 1448, + 1 + ], + [ + 1045, + 133, + 1 + ], + [ + 1052, + 219, + 4 + ], + [ + 1138, + 163, + 3 + ], + [ + 1154, + 168, + 4 + ], + [ + 1202, + 220, + 2 + ], + [ + 144, + 1107, + 1 + ], + [ + 145, + 296, + 2 + ], + [ + 150, + 1048, + 2 + ], + [ + 152, + 297, + 1 + ], + [ + 156, + 268, + 1 + ], + [ + 172, + 1105, + 1 + ], + [ + 214, + 261, + 1 + ], + [ + 271, + 271, + 6 + ], + [ + 281, + 149, + 2 + ], + [ + 1050, + 1148, + 4 + ], + [ + 1056, + 147, + 1 + ], + [ + 103, + 434, + 2 + ], + [ + 164, + 117, + 1 + ], + [ + 223, + 236, + 2 + ], + [ + 245, + 245, + 6 + ], + [ + 255, + 255, + 5 + ], + [ + 1035, + 244, + 4 + ], + [ + 1036, + 1126, + 3 + ], + [ + 1060, + 1042, + 1 + ], + [ + 1072, + 172, + 5 + ], + [ + 224, + 1024, + 2 + ], + [ + 230, + 386, + 2 + ], + [ + 235, + 217, + 2 + ], + [ + 244, + 429, + 2 + ], + [ + 265, + 167, + 2 + ], + [ + 287, + 167, + 2 + ], + [ + 475, + 240, + 2 + ], + [ + 651, + 651, + 2 + ], + [ + 693, + 693, + 2 + ], + [ + 1026, + 230, + 5 + ], + [ + 1056, + 132, + 1 + ], + [ + 1057, + 138, + 6 + ], + [ + 1062, + 236, + 4 + ], + [ + 1144, + 179, + 4 + ], + [ + 154, + 216, + 1 + ], + [ + 230, + 1067, + 2 + ], + [ + 1032, + 422, + 3 + ], + [ + 1036, + 1127, + 3 + ], + [ + 1058, + 149, + 4 + ], + [ + 1079, + 149, + 2 + ], + [ + 1124, + 132, + 6 + ], + [ + 1149, + 146, + 6 + ], + [ + 103, + 450, + 2 + ], + [ + 103, + 1220, + 2 + ], + [ + 177, + 1024, + 2 + ], + [ + 180, + 1143, + 1 + ], + [ + 231, + 147, + 2 + ], + [ + 235, + 263, + 2 + ], + [ + 249, + 147, + 2 + ], + [ + 295, + 295, + 5 + ], + [ + 298, + 166, + 2 + ], + [ + 300, + 300, + 4 + ], + [ + 303, + 266, + 2 + ], + [ + 414, + 223, + 2 + ], + [ + 623, + 623, + 2 + ], + [ + 1026, + 219, + 5 + ], + [ + 1038, + 293, + 2 + ], + [ + 1058, + 151, + 4 + ], + [ + 1063, + 132, + 6 + ], + [ + 1077, + 172, + 2 + ], + [ + 1088, + 281, + 2 + ], + [ + 1094, + 145, + 2 + ], + [ + 133, + 179, + 2 + ], + [ + 136, + 1073, + 2 + ], + [ + 145, + 289, + 2 + ], + [ + 165, + 297, + 2 + ], + [ + 168, + 260, + 1 + ], + [ + 226, + 1067, + 2 + ], + [ + 235, + 222, + 2 + ], + [ + 260, + 180, + 1 + ], + [ + 292, + 173, + 1 + ], + [ + 1105, + 173, + 2 + ], + [ + 140, + 345, + 2 + ], + [ + 147, + 1078, + 1 + ], + [ + 330, + 330, + 6 + ], + [ + 1032, + 410, + 3 + ], + [ + 1033, + 1196, + 3 + ], + [ + 1036, + 1135, + 4 + ], + [ + 1111, + 189, + 4 + ], + [ + 1125, + 138, + 6 + ], + [ + 144, + 233, + 2 + ], + [ + 155, + 155, + 1 + ], + [ + 226, + 222, + 2 + ], + [ + 272, + 321, + 1 + ], + [ + 292, + 170, + 1 + ], + [ + 327, + 327, + 2 + ], + [ + 379, + 228, + 2 + ], + [ + 401, + 401, + 2 + ], + [ + 589, + 110, + 2 + ], + [ + 1049, + 149, + 6 + ], + [ + 1055, + 133, + 6 + ], + [ + 1063, + 149, + 6 + ], + [ + 1121, + 1319, + 5 + ], + [ + 132, + 358, + 2 + ], + [ + 133, + 219, + 2 + ], + [ + 148, + 176, + 2 + ], + [ + 333, + 333, + 4 + ], + [ + 398, + 170, + 1 + ], + [ + 594, + 594, + 2 + ], + [ + 1024, + 347, + 4 + ], + [ + 1033, + 321, + 3 + ], + [ + 1035, + 243, + 4 + ], + [ + 1045, + 1076, + 4 + ], + [ + 1074, + 163, + 5 + ], + [ + 1139, + 265, + 4 + ], + [ + 1179, + 165, + 5 + ], + [ + 36, + 36, + 1 + ], + [ + 146, + 148, + 1 + ], + [ + 241, + 215, + 2 + ], + [ + 248, + 248, + 7 + ], + [ + 254, + 254, + 6 + ], + [ + 264, + 176, + 2 + ], + [ + 304, + 177, + 3 + ], + [ + 507, + 366, + 2 + ], + [ + 857, + 857, + 2 + ], + [ + 1025, + 436, + 2 + ], + [ + 1043, + 215, + 4 + ], + [ + 1045, + 214, + 4 + ], + [ + 1074, + 172, + 5 + ], + [ + 1087, + 145, + 3 + ], + [ + 1272, + 166, + 1 + ], + [ + 103, + 469, + 2 + ], + [ + 156, + 1205, + 1 + ], + [ + 270, + 181, + 1 + ], + [ + 270, + 322, + 1 + ], + [ + 353, + 165, + 1 + ], + [ + 368, + 368, + 4 + ], + [ + 375, + 375, + 4 + ], + [ + 1036, + 289, + 4 + ], + [ + 1045, + 1147, + 4 + ], + [ + 1210, + 158, + 5 + ], + [ + 144, + 149, + 1 + ], + [ + 277, + 277, + 5 + ], + [ + 679, + 314, + 2 + ], + [ + 1026, + 214, + 1 + ], + [ + 1036, + 264, + 4 + ], + [ + 1115, + 132, + 6 + ], + [ + 1433, + 176, + 2 + ], + [ + 132, + 275, + 2 + ], + [ + 148, + 1054, + 4 + ], + [ + 159, + 115, + 3 + ], + [ + 226, + 274, + 2 + ], + [ + 250, + 250, + 7 + ], + [ + 373, + 133, + 2 + ], + [ + 393, + 217, + 2 + ], + [ + 489, + 489, + 3 + ], + [ + 1036, + 274, + 4 + ], + [ + 1062, + 252, + 1 + ], + [ + 1133, + 173, + 3 + ], + [ + 1272, + 152, + 1 + ], + [ + 1305, + 1305, + 4 + ], + [ + 104, + 441, + 1 + ], + [ + 151, + 1057, + 2 + ], + [ + 166, + 301, + 1 + ], + [ + 179, + 458, + 2 + ], + [ + 189, + 263, + 2 + ], + [ + 206, + 356, + 2 + ], + [ + 230, + 148, + 2 + ], + [ + 236, + 146, + 2 + ], + [ + 241, + 146, + 2 + ], + [ + 309, + 146, + 2 + ], + [ + 311, + 311, + 4 + ], + [ + 1039, + 1288, + 6 + ], + [ + 1080, + 1070, + 3 + ], + [ + 1164, + 152, + 2 + ], + [ + 176, + 267, + 2 + ], + [ + 228, + 424, + 2 + ], + [ + 242, + 180, + 1 + ], + [ + 244, + 132, + 2 + ], + [ + 1027, + 397, + 4 + ], + [ + 1034, + 1160, + 2 + ], + [ + 1085, + 103, + 4 + ], + [ + 1171, + 1024, + 1 + ], + [ + 151, + 138, + 4 + ], + [ + 163, + 246, + 1 + ], + [ + 165, + 1104, + 1 + ], + [ + 177, + 145, + 2 + ], + [ + 369, + 1116, + 2 + ], + [ + 435, + 435, + 4 + ], + [ + 440, + 440, + 2 + ], + [ + 1033, + 298, + 1 + ], + [ + 1034, + 1118, + 2 + ], + [ + 1035, + 1067, + 2 + ], + [ + 1074, + 173, + 5 + ], + [ + 1075, + 147, + 2 + ], + [ + 1110, + 1199, + 4 + ], + [ + 1257, + 172, + 1 + ], + [ + 105, + 113, + 3 + ], + [ + 136, + 1065, + 2 + ], + [ + 212, + 212, + 3 + ], + [ + 219, + 144, + 2 + ], + [ + 236, + 273, + 2 + ], + [ + 292, + 181, + 1 + ], + [ + 326, + 152, + 1 + ], + [ + 1024, + 358, + 4 + ], + [ + 1063, + 146, + 6 + ], + [ + 136, + 1127, + 2 + ], + [ + 142, + 198, + 2 + ], + [ + 189, + 262, + 2 + ], + [ + 244, + 347, + 3 + ], + [ + 249, + 430, + 3 + ], + [ + 258, + 222, + 1 + ], + [ + 1038, + 298, + 2 + ], + [ + 1051, + 217, + 4 + ], + [ + 1064, + 132, + 6 + ], + [ + 1082, + 147, + 6 + ], + [ + 1230, + 168, + 5 + ], + [ + 114, + 179, + 2 + ], + [ + 170, + 324, + 5 + ], + [ + 216, + 270, + 2 + ], + [ + 221, + 155, + 3 + ], + [ + 235, + 1111, + 2 + ], + [ + 411, + 307, + 2 + ], + [ + 1027, + 378, + 4 + ], + [ + 1055, + 149, + 6 + ], + [ + 1071, + 145, + 6 + ], + [ + 1133, + 172, + 3 + ], + [ + 1150, + 132, + 6 + ], + [ + 1239, + 1033, + 1 + ], + [ + 103, + 421, + 2 + ], + [ + 144, + 250, + 3 + ], + [ + 214, + 243, + 2 + ], + [ + 220, + 228, + 2 + ], + [ + 439, + 874, + 2 + ], + [ + 1025, + 443, + 2 + ], + [ + 1034, + 1158, + 2 + ], + [ + 1035, + 1070, + 1 + ], + [ + 1037, + 1326, + 5 + ], + [ + 1139, + 265, + 3 + ], + [ + 138, + 1126, + 2 + ], + [ + 147, + 226, + 2 + ], + [ + 219, + 148, + 2 + ], + [ + 268, + 318, + 1 + ], + [ + 271, + 181, + 1 + ], + [ + 684, + 684, + 3 + ], + [ + 1026, + 224, + 5 + ], + [ + 1035, + 231, + 4 + ], + [ + 1036, + 286, + 4 + ], + [ + 1036, + 1061, + 4 + ], + [ + 1045, + 147, + 1 + ], + [ + 1075, + 248, + 2 + ], + [ + 1080, + 136, + 3 + ], + [ + 1121, + 1437, + 5 + ], + [ + 1137, + 104, + 2 + ], + [ + 1210, + 156, + 5 + ], + [ + 1224, + 163, + 1 + ], + [ + 103, + 157, + 2 + ], + [ + 263, + 263, + 5 + ], + [ + 267, + 241, + 1 + ], + [ + 284, + 214, + 1 + ], + [ + 346, + 166, + 1 + ], + [ + 348, + 278, + 3 + ], + [ + 372, + 166, + 1 + ], + [ + 575, + 237, + 2 + ], + [ + 1042, + 228, + 4 + ], + [ + 1074, + 166, + 5 + ], + [ + 1099, + 173, + 2 + ], + [ + 1112, + 166, + 2 + ], + [ + 1157, + 163, + 2 + ], + [ + 1222, + 152, + 5 + ], + [ + 1239, + 1047, + 1 + ], + [ + 1252, + 1026, + 1 + ], + [ + 138, + 269, + 2 + ], + [ + 149, + 228, + 2 + ], + [ + 154, + 152, + 1 + ], + [ + 224, + 231, + 2 + ], + [ + 235, + 1067, + 2 + ], + [ + 236, + 145, + 1 + ], + [ + 254, + 1056, + 2 + ], + [ + 279, + 151, + 4 + ], + [ + 279, + 177, + 2 + ], + [ + 353, + 166, + 1 + ], + [ + 432, + 432, + 4 + ], + [ + 621, + 621, + 1 + ], + [ + 1035, + 220, + 4 + ], + [ + 1072, + 444, + 2 + ], + [ + 1080, + 1055, + 1 + ], + [ + 1146, + 173, + 4 + ], + [ + 1225, + 222, + 2 + ], + [ + 1247, + 1026, + 1 + ], + [ + 138, + 1060, + 2 + ], + [ + 170, + 1096, + 1 + ], + [ + 170, + 1097, + 1 + ], + [ + 172, + 1097, + 1 + ], + [ + 246, + 1084, + 1 + ], + [ + 260, + 1093, + 1 + ], + [ + 400, + 400, + 4 + ], + [ + 445, + 445, + 3 + ], + [ + 531, + 531, + 3 + ], + [ + 964, + 964, + 2 + ], + [ + 1232, + 181, + 1 + ], + [ + 1254, + 1026, + 1 + ], + [ + 150, + 1057, + 2 + ], + [ + 155, + 221, + 1 + ], + [ + 172, + 1040, + 1 + ], + [ + 189, + 1049, + 2 + ], + [ + 233, + 217, + 2 + ], + [ + 277, + 243, + 1 + ], + [ + 291, + 291, + 6 + ], + [ + 1026, + 243, + 1 + ], + [ + 1036, + 269, + 4 + ], + [ + 1118, + 240, + 3 + ], + [ + 1201, + 152, + 1 + ], + [ + 165, + 319, + 2 + ], + [ + 216, + 561, + 2 + ], + [ + 219, + 255, + 2 + ], + [ + 260, + 437, + 2 + ], + [ + 264, + 243, + 1 + ], + [ + 300, + 300, + 5 + ], + [ + 461, + 461, + 3 + ], + [ + 1024, + 393, + 4 + ], + [ + 1042, + 147, + 1 + ], + [ + 1094, + 222, + 2 + ], + [ + 1156, + 163, + 1 + ], + [ + 1316, + 166, + 1 + ], + [ + 132, + 217, + 2 + ], + [ + 150, + 148, + 1 + ], + [ + 165, + 1128, + 1 + ], + [ + 249, + 286, + 2 + ], + [ + 458, + 239, + 2 + ], + [ + 1026, + 1148, + 5 + ], + [ + 1035, + 244, + 2 + ], + [ + 1046, + 148, + 1 + ], + [ + 1090, + 1114, + 1 + ], + [ + 110, + 154, + 3 + ], + [ + 136, + 241, + 3 + ], + [ + 145, + 150, + 1 + ], + [ + 159, + 159, + 5 + ], + [ + 164, + 114, + 3 + ], + [ + 230, + 429, + 2 + ], + [ + 252, + 146, + 2 + ], + [ + 409, + 222, + 2 + ], + [ + 1025, + 420, + 2 + ], + [ + 1033, + 297, + 1 + ], + [ + 1091, + 149, + 2 + ], + [ + 141, + 141, + 1 + ], + [ + 162, + 224, + 2 + ], + [ + 220, + 146, + 2 + ], + [ + 267, + 257, + 1 + ], + [ + 275, + 132, + 2 + ], + [ + 306, + 1111, + 2 + ], + [ + 783, + 783, + 2 + ], + [ + 1073, + 146, + 6 + ], + [ + 1239, + 1186, + 1 + ], + [ + 231, + 255, + 2 + ], + [ + 261, + 228, + 2 + ], + [ + 326, + 163, + 1 + ], + [ + 649, + 649, + 1 + ], + [ + 1033, + 324, + 1 + ], + [ + 1036, + 277, + 4 + ], + [ + 1041, + 146, + 1 + ], + [ + 176, + 1024, + 2 + ], + [ + 181, + 1077, + 1 + ], + [ + 197, + 197, + 3 + ], + [ + 209, + 209, + 3 + ], + [ + 214, + 399, + 2 + ], + [ + 293, + 237, + 2 + ], + [ + 324, + 1025, + 1 + ], + [ + 504, + 504, + 1 + ], + [ + 1316, + 156, + 1 + ], + [ + 147, + 249, + 2 + ], + [ + 179, + 320, + 3 + ], + [ + 189, + 1057, + 2 + ], + [ + 200, + 140, + 2 + ], + [ + 215, + 157, + 2 + ], + [ + 222, + 1078, + 1 + ], + [ + 240, + 475, + 2 + ], + [ + 244, + 133, + 2 + ], + [ + 266, + 103, + 2 + ], + [ + 279, + 138, + 2 + ], + [ + 282, + 148, + 2 + ], + [ + 380, + 380, + 3 + ], + [ + 406, + 331, + 2 + ], + [ + 706, + 438, + 2 + ], + [ + 754, + 472, + 3 + ], + [ + 1032, + 436, + 3 + ], + [ + 1033, + 299, + 1 + ], + [ + 1041, + 250, + 1 + ], + [ + 176, + 1122, + 2 + ], + [ + 192, + 192, + 3 + ], + [ + 231, + 146, + 2 + ], + [ + 233, + 146, + 2 + ], + [ + 244, + 274, + 1 + ], + [ + 244, + 424, + 2 + ], + [ + 253, + 253, + 1 + ], + [ + 304, + 1110, + 2 + ], + [ + 338, + 1116, + 2 + ], + [ + 365, + 365, + 3 + ], + [ + 418, + 418, + 3 + ], + [ + 421, + 241, + 2 + ], + [ + 786, + 35, + 2 + ], + [ + 985, + 985, + 2 + ], + [ + 1026, + 214, + 3 + ], + [ + 1035, + 220, + 2 + ], + [ + 1089, + 133, + 2 + ], + [ + 1094, + 249, + 2 + ], + [ + 1113, + 163, + 3 + ], + [ + 1404, + 1038, + 1 + ], + [ + 1440, + 246, + 4 + ], + [ + 113, + 113, + 5 + ], + [ + 149, + 278, + 5 + ], + [ + 158, + 1095, + 1 + ], + [ + 176, + 289, + 2 + ], + [ + 189, + 150, + 2 + ], + [ + 215, + 236, + 2 + ], + [ + 219, + 1024, + 2 + ], + [ + 330, + 163, + 1 + ], + [ + 376, + 156, + 1 + ], + [ + 812, + 812, + 2 + ], + [ + 1036, + 276, + 4 + ], + [ + 1036, + 282, + 4 + ], + [ + 1036, + 1056, + 4 + ], + [ + 1036, + 1453, + 1 + ], + [ + 1036, + 1488, + 1 + ], + [ + 1043, + 1144, + 4 + ], + [ + 1067, + 262, + 1 + ], + [ + 1085, + 228, + 4 + ], + [ + 1125, + 132, + 6 + ], + [ + 103, + 431, + 2 + ], + [ + 147, + 1135, + 1 + ], + [ + 148, + 217, + 2 + ], + [ + 245, + 1032, + 1 + ], + [ + 252, + 1070, + 2 + ], + [ + 272, + 272, + 6 + ], + [ + 296, + 132, + 2 + ], + [ + 318, + 318, + 3 + ], + [ + 557, + 557, + 2 + ], + [ + 600, + 600, + 3 + ], + [ + 1036, + 278, + 4 + ], + [ + 1071, + 132, + 6 + ], + [ + 1071, + 138, + 6 + ], + [ + 1083, + 223, + 4 + ], + [ + 1104, + 163, + 3 + ], + [ + 1210, + 166, + 5 + ], + [ + 97, + 97, + 1 + ], + [ + 145, + 302, + 2 + ], + [ + 147, + 150, + 1 + ], + [ + 172, + 1112, + 1 + ], + [ + 224, + 149, + 2 + ], + [ + 224, + 277, + 2 + ], + [ + 230, + 1111, + 2 + ], + [ + 296, + 498, + 2 + ], + [ + 319, + 173, + 1 + ], + [ + 324, + 158, + 1 + ], + [ + 334, + 279, + 3 + ], + [ + 408, + 408, + 2 + ], + [ + 481, + 481, + 3 + ], + [ + 545, + 396, + 2 + ], + [ + 1036, + 267, + 4 + ], + [ + 1155, + 306, + 4 + ], + [ + 1306, + 166, + 1 + ], + [ + 156, + 1096, + 1 + ], + [ + 168, + 1084, + 1 + ], + [ + 179, + 145, + 2 + ], + [ + 219, + 214, + 2 + ], + [ + 231, + 224, + 2 + ], + [ + 235, + 1024, + 2 + ], + [ + 266, + 303, + 3 + ], + [ + 311, + 442, + 2 + ], + [ + 360, + 360, + 3 + ], + [ + 373, + 373, + 3 + ], + [ + 379, + 379, + 4 + ], + [ + 479, + 479, + 2 + ], + [ + 1057, + 136, + 6 + ], + [ + 1061, + 133, + 2 + ], + [ + 1069, + 145, + 4 + ], + [ + 1074, + 158, + 5 + ], + [ + 1074, + 165, + 5 + ], + [ + 1268, + 177, + 2 + ], + [ + 138, + 284, + 2 + ], + [ + 144, + 240, + 1 + ], + [ + 176, + 151, + 2 + ], + [ + 219, + 269, + 2 + ], + [ + 230, + 1024, + 2 + ], + [ + 271, + 221, + 2 + ], + [ + 315, + 315, + 4 + ], + [ + 397, + 397, + 3 + ], + [ + 508, + 247, + 2 + ], + [ + 786, + 361, + 2 + ], + [ + 1192, + 104, + 5 + ], + [ + 1235, + 1046, + 1 + ], + [ + 1380, + 170, + 4 + ], + [ + 103, + 396, + 2 + ], + [ + 150, + 1045, + 2 + ], + [ + 172, + 1047, + 1 + ], + [ + 177, + 269, + 2 + ], + [ + 248, + 149, + 3 + ], + [ + 249, + 132, + 2 + ], + [ + 280, + 241, + 3 + ], + [ + 465, + 217, + 2 + ], + [ + 1027, + 329, + 4 + ], + [ + 1032, + 420, + 3 + ], + [ + 1042, + 1233, + 1 + ], + [ + 1125, + 136, + 6 + ], + [ + 105, + 114, + 3 + ], + [ + 147, + 254, + 2 + ], + [ + 168, + 110, + 1 + ], + [ + 235, + 226, + 2 + ], + [ + 273, + 236, + 2 + ], + [ + 355, + 262, + 2 + ], + [ + 435, + 259, + 3 + ], + [ + 502, + 246, + 3 + ], + [ + 574, + 574, + 2 + ], + [ + 703, + 313, + 2 + ], + [ + 1026, + 214, + 5 + ], + [ + 1073, + 138, + 6 + ], + [ + 1073, + 144, + 6 + ], + [ + 1088, + 136, + 2 + ], + [ + 1153, + 133, + 6 + ], + [ + 1183, + 148, + 1 + ], + [ + 1524, + 164, + 4 + ], + [ + 7, + 388, + 2 + ], + [ + 215, + 146, + 1 + ], + [ + 350, + 350, + 3 + ], + [ + 437, + 242, + 3 + ], + [ + 449, + 449, + 3 + ], + [ + 1032, + 425, + 3 + ], + [ + 1034, + 1197, + 2 + ], + [ + 1037, + 268, + 5 + ], + [ + 1108, + 133, + 6 + ], + [ + 1240, + 180, + 1 + ], + [ + 1296, + 181, + 1 + ], + [ + 1404, + 1072, + 1 + ], + [ + 104, + 488, + 1 + ], + [ + 152, + 245, + 1 + ], + [ + 513, + 513, + 4 + ], + [ + 779, + 662, + 2 + ], + [ + 1032, + 418, + 3 + ], + [ + 1032, + 443, + 3 + ], + [ + 1039, + 1297, + 6 + ], + [ + 1056, + 269, + 2 + ], + [ + 1063, + 133, + 6 + ], + [ + 1094, + 276, + 2 + ], + [ + 1296, + 168, + 1 + ], + [ + 1316, + 170, + 1 + ], + [ + 148, + 258, + 2 + ], + [ + 150, + 145, + 1 + ], + [ + 166, + 260, + 2 + ], + [ + 179, + 1024, + 2 + ], + [ + 224, + 1111, + 2 + ], + [ + 267, + 252, + 2 + ], + [ + 296, + 257, + 3 + ], + [ + 308, + 1110, + 2 + ], + [ + 330, + 152, + 1 + ], + [ + 374, + 374, + 2 + ], + [ + 491, + 491, + 1 + ], + [ + 541, + 1083, + 2 + ], + [ + 1026, + 235, + 5 + ], + [ + 1027, + 318, + 4 + ], + [ + 1027, + 400, + 4 + ], + [ + 1036, + 280, + 4 + ], + [ + 1146, + 158, + 6 + ], + [ + 130, + 200, + 2 + ], + [ + 166, + 1119, + 1 + ], + [ + 224, + 249, + 2 + ], + [ + 226, + 1061, + 1 + ], + [ + 233, + 405, + 3 + ], + [ + 235, + 138, + 2 + ], + [ + 243, + 148, + 2 + ], + [ + 340, + 340, + 3 + ], + [ + 463, + 463, + 2 + ], + [ + 1024, + 417, + 4 + ], + [ + 1027, + 353, + 4 + ], + [ + 1037, + 292, + 5 + ], + [ + 1037, + 297, + 5 + ], + [ + 1125, + 146, + 6 + ], + [ + 1164, + 163, + 2 + ], + [ + 136, + 1080, + 2 + ], + [ + 145, + 295, + 2 + ], + [ + 151, + 264, + 4 + ], + [ + 156, + 1119, + 1 + ], + [ + 254, + 147, + 2 + ], + [ + 320, + 241, + 4 + ], + [ + 339, + 157, + 1 + ], + [ + 474, + 474, + 2 + ], + [ + 488, + 172, + 1 + ], + [ + 1051, + 146, + 6 + ], + [ + 1117, + 1026, + 1 + ], + [ + 1147, + 269, + 1 + ], + [ + 1149, + 147, + 6 + ], + [ + 1153, + 147, + 6 + ], + [ + 1171, + 250, + 4 + ], + [ + 1555, + 162, + 4 + ], + [ + 110, + 155, + 3 + ], + [ + 117, + 349, + 1 + ], + [ + 133, + 1050, + 2 + ], + [ + 156, + 265, + 1 + ], + [ + 219, + 462, + 2 + ], + [ + 246, + 180, + 1 + ], + [ + 335, + 286, + 3 + ], + [ + 573, + 573, + 2 + ], + [ + 1036, + 285, + 4 + ], + [ + 1037, + 1325, + 5 + ], + [ + 1062, + 273, + 1 + ], + [ + 1071, + 146, + 6 + ], + [ + 1250, + 1026, + 1 + ], + [ + 1339, + 165, + 1 + ], + [ + 148, + 1098, + 2 + ], + [ + 214, + 159, + 2 + ], + [ + 231, + 240, + 2 + ], + [ + 243, + 138, + 3 + ], + [ + 261, + 220, + 1 + ], + [ + 423, + 423, + 3 + ], + [ + 452, + 452, + 2 + ], + [ + 1027, + 416, + 4 + ], + [ + 1035, + 1067, + 1 + ], + [ + 1045, + 249, + 4 + ], + [ + 1139, + 166, + 2 + ], + [ + 117, + 105, + 3 + ], + [ + 136, + 223, + 2 + ], + [ + 145, + 280, + 2 + ], + [ + 156, + 420, + 1 + ], + [ + 165, + 1112, + 1 + ], + [ + 181, + 1040, + 1 + ], + [ + 217, + 450, + 2 + ], + [ + 250, + 1054, + 2 + ], + [ + 267, + 244, + 1 + ], + [ + 285, + 1083, + 2 + ], + [ + 357, + 357, + 3 + ], + [ + 376, + 376, + 4 + ], + [ + 561, + 447, + 2 + ], + [ + 1035, + 255, + 4 + ], + [ + 1036, + 266, + 4 + ], + [ + 1038, + 287, + 2 + ], + [ + 1097, + 180, + 2 + ], + [ + 1097, + 1152, + 2 + ], + [ + 1105, + 181, + 2 + ], + [ + 1142, + 1040, + 1 + ], + [ + 1182, + 250, + 4 + ], + [ + 1244, + 189, + 2 + ], + [ + 136, + 325, + 2 + ], + [ + 148, + 224, + 2 + ], + [ + 149, + 280, + 2 + ], + [ + 214, + 228, + 2 + ], + [ + 220, + 399, + 2 + ], + [ + 471, + 189, + 2 + ], + [ + 1026, + 244, + 3 + ], + [ + 1157, + 152, + 2 + ], + [ + 1230, + 158, + 5 + ], + [ + 1623, + 367, + 4 + ], + [ + 103, + 430, + 2 + ], + [ + 123, + 206, + 2 + ], + [ + 145, + 1073, + 2 + ], + [ + 170, + 1162, + 1 + ], + [ + 220, + 223, + 2 + ], + [ + 321, + 321, + 3 + ], + [ + 349, + 117, + 1 + ], + [ + 372, + 170, + 1 + ], + [ + 1032, + 457, + 3 + ], + [ + 1037, + 259, + 5 + ], + [ + 1037, + 272, + 5 + ], + [ + 1038, + 301, + 2 + ], + [ + 1049, + 1046, + 1 + ], + [ + 1067, + 1041, + 5 + ], + [ + 1165, + 132, + 6 + ], + [ + 1196, + 1081, + 2 + ], + [ + 1580, + 163, + 4 + ], + [ + 96, + 96, + 1 + ], + [ + 217, + 144, + 2 + ], + [ + 222, + 409, + 2 + ], + [ + 224, + 222, + 2 + ], + [ + 264, + 254, + 2 + ], + [ + 283, + 283, + 5 + ], + [ + 296, + 1132, + 2 + ], + [ + 302, + 132, + 2 + ], + [ + 320, + 1116, + 2 + ], + [ + 355, + 133, + 2 + ], + [ + 576, + 576, + 3 + ], + [ + 587, + 221, + 2 + ], + [ + 1026, + 243, + 3 + ], + [ + 1036, + 1076, + 4 + ], + [ + 1181, + 248, + 4 + ], + [ + 1600, + 328, + 4 + ], + [ + 103, + 455, + 2 + ], + [ + 145, + 1064, + 2 + ], + [ + 145, + 1065, + 2 + ], + [ + 214, + 236, + 2 + ], + [ + 241, + 132, + 2 + ], + [ + 267, + 146, + 2 + ], + [ + 435, + 246, + 3 + ], + [ + 1035, + 1341, + 2 + ], + [ + 1051, + 136, + 1 + ], + [ + 1056, + 284, + 1 + ], + [ + 1070, + 1031, + 1 + ], + [ + 1072, + 181, + 5 + ], + [ + 1125, + 133, + 6 + ], + [ + 1728, + 237, + 4 + ], + [ + 103, + 1329, + 2 + ], + [ + 133, + 278, + 2 + ], + [ + 152, + 298, + 1 + ], + [ + 252, + 1061, + 1 + ], + [ + 289, + 289, + 2 + ], + [ + 428, + 428, + 3 + ], + [ + 433, + 433, + 3 + ], + [ + 1052, + 132, + 1 + ], + [ + 1078, + 144, + 3 + ], + [ + 1082, + 1063, + 1 + ], + [ + 1141, + 172, + 3 + ], + [ + 1157, + 168, + 2 + ], + [ + 1264, + 1076, + 5 + ], + [ + 142, + 202, + 2 + ], + [ + 173, + 1047, + 1 + ], + [ + 226, + 146, + 1 + ], + [ + 377, + 177, + 3 + ], + [ + 472, + 728, + 2 + ], + [ + 486, + 237, + 2 + ], + [ + 1024, + 334, + 4 + ], + [ + 1025, + 418, + 2 + ], + [ + 1025, + 423, + 2 + ], + [ + 1033, + 301, + 1 + ], + [ + 1035, + 249, + 4 + ], + [ + 1035, + 1349, + 2 + ], + [ + 1045, + 132, + 1 + ], + [ + 1045, + 243, + 4 + ], + [ + 1077, + 173, + 2 + ], + [ + 1166, + 147, + 6 + ], + [ + 165, + 292, + 2 + ], + [ + 181, + 1184, + 1 + ], + [ + 190, + 139, + 2 + ], + [ + 259, + 104, + 1 + ], + [ + 273, + 446, + 3 + ], + [ + 276, + 1083, + 2 + ], + [ + 287, + 170, + 1 + ], + [ + 309, + 103, + 2 + ], + [ + 322, + 172, + 1 + ], + [ + 464, + 221, + 2 + ], + [ + 937, + 937, + 2 + ], + [ + 1091, + 243, + 2 + ], + [ + 1094, + 146, + 2 + ], + [ + 1199, + 177, + 6 + ], + [ + 1242, + 176, + 7 + ], + [ + 114, + 157, + 1 + ], + [ + 144, + 1053, + 1 + ], + [ + 168, + 1081, + 1 + ], + [ + 228, + 248, + 1 + ], + [ + 266, + 217, + 2 + ], + [ + 320, + 136, + 2 + ], + [ + 329, + 163, + 1 + ], + [ + 366, + 528, + 2 + ], + [ + 441, + 441, + 3 + ], + [ + 1035, + 241, + 4 + ], + [ + 1036, + 1122, + 4 + ], + [ + 1045, + 1198, + 1 + ], + [ + 1071, + 147, + 6 + ], + [ + 145, + 275, + 2 + ], + [ + 179, + 311, + 3 + ], + [ + 226, + 164, + 2 + ], + [ + 230, + 1041, + 2 + ], + [ + 250, + 1024, + 2 + ], + [ + 258, + 144, + 2 + ], + [ + 270, + 216, + 2 + ], + [ + 274, + 189, + 2 + ], + [ + 281, + 281, + 6 + ], + [ + 400, + 163, + 1 + ], + [ + 404, + 139, + 2 + ], + [ + 477, + 234, + 2 + ], + [ + 951, + 951, + 2 + ], + [ + 1038, + 1152, + 2 + ], + [ + 1050, + 223, + 4 + ], + [ + 1094, + 282, + 2 + ], + [ + 1154, + 156, + 4 + ], + [ + 1200, + 173, + 1 + ], + [ + 1316, + 172, + 1 + ], + [ + 1319, + 152, + 1 + ], + [ + 1339, + 181, + 1 + ], + [ + 132, + 1080, + 2 + ], + [ + 133, + 150, + 1 + ], + [ + 152, + 242, + 1 + ], + [ + 166, + 298, + 2 + ], + [ + 243, + 431, + 2 + ], + [ + 288, + 347, + 3 + ], + [ + 324, + 173, + 1 + ], + [ + 335, + 286, + 4 + ], + [ + 371, + 170, + 1 + ], + [ + 375, + 215, + 2 + ], + [ + 763, + 763, + 2 + ], + [ + 1056, + 269, + 1 + ], + [ + 1073, + 147, + 6 + ], + [ + 1089, + 149, + 2 + ], + [ + 1089, + 258, + 2 + ], + [ + 1094, + 147, + 2 + ], + [ + 1121, + 1413, + 5 + ], + [ + 1125, + 148, + 6 + ], + [ + 1164, + 172, + 2 + ], + [ + 1168, + 150, + 6 + ], + [ + 1195, + 158, + 3 + ], + [ + 1289, + 334, + 2 + ], + [ + 147, + 1075, + 1 + ], + [ + 179, + 1069, + 2 + ], + [ + 222, + 1041, + 2 + ], + [ + 224, + 386, + 2 + ], + [ + 260, + 153, + 2 + ], + [ + 270, + 104, + 1 + ], + [ + 274, + 146, + 2 + ], + [ + 327, + 163, + 1 + ], + [ + 1026, + 244, + 5 + ], + [ + 1032, + 110, + 3 + ], + [ + 1035, + 233, + 2 + ], + [ + 1079, + 220, + 2 + ], + [ + 1118, + 1118, + 2 + ], + [ + 1138, + 173, + 3 + ], + [ + 149, + 151, + 1 + ], + [ + 158, + 272, + 1 + ], + [ + 168, + 298, + 1 + ], + [ + 230, + 219, + 2 + ], + [ + 236, + 405, + 2 + ], + [ + 260, + 104, + 1 + ], + [ + 268, + 172, + 1 + ], + [ + 300, + 147, + 2 + ], + [ + 445, + 315, + 2 + ], + [ + 1036, + 273, + 4 + ], + [ + 1042, + 248, + 1 + ], + [ + 1091, + 133, + 2 + ], + [ + 1153, + 136, + 6 + ], + [ + 1205, + 1104, + 4 + ], + [ + 1287, + 156, + 6 + ], + [ + 138, + 255, + 3 + ], + [ + 219, + 230, + 2 + ], + [ + 236, + 430, + 2 + ], + [ + 252, + 267, + 2 + ], + [ + 259, + 180, + 1 + ], + [ + 279, + 151, + 3 + ], + [ + 284, + 308, + 3 + ], + [ + 307, + 307, + 4 + ], + [ + 333, + 222, + 2 + ], + [ + 406, + 406, + 3 + ], + [ + 424, + 228, + 2 + ], + [ + 914, + 914, + 2 + ], + [ + 1168, + 146, + 6 + ], + [ + 145, + 1049, + 2 + ], + [ + 170, + 1047, + 1 + ], + [ + 260, + 156, + 2 + ], + [ + 285, + 103, + 2 + ], + [ + 305, + 305, + 5 + ], + [ + 325, + 233, + 3 + ], + [ + 808, + 361, + 2 + ], + [ + 1031, + 275, + 2 + ], + [ + 1038, + 321, + 2 + ], + [ + 1057, + 1235, + 1 + ], + [ + 1065, + 138, + 6 + ], + [ + 1069, + 136, + 1 + ], + [ + 1145, + 1120, + 4 + ], + [ + 1182, + 222, + 4 + ], + [ + 1306, + 165, + 1 + ], + [ + 168, + 265, + 3 + ], + [ + 201, + 201, + 3 + ], + [ + 214, + 231, + 2 + ], + [ + 235, + 133, + 3 + ], + [ + 299, + 173, + 1 + ], + [ + 442, + 442, + 3 + ], + [ + 539, + 251, + 2 + ], + [ + 1026, + 244, + 1 + ], + [ + 1033, + 327, + 1 + ], + [ + 1042, + 1050, + 1 + ], + [ + 1078, + 103, + 2 + ], + [ + 1082, + 1056, + 3 + ], + [ + 1159, + 1049, + 3 + ], + [ + 145, + 217, + 2 + ], + [ + 220, + 215, + 2 + ], + [ + 259, + 1099, + 1 + ], + [ + 293, + 110, + 1 + ], + [ + 309, + 148, + 2 + ], + [ + 328, + 745, + 2 + ], + [ + 1035, + 1075, + 1 + ], + [ + 1079, + 146, + 2 + ], + [ + 1186, + 245, + 1 + ], + [ + 1296, + 166, + 1 + ], + [ + 1316, + 165, + 1 + ], + [ + 83, + 83, + 2 + ], + [ + 138, + 295, + 2 + ], + [ + 138, + 304, + 2 + ], + [ + 152, + 110, + 1 + ], + [ + 163, + 1256, + 1 + ], + [ + 206, + 336, + 2 + ], + [ + 223, + 215, + 2 + ], + [ + 261, + 149, + 2 + ], + [ + 314, + 157, + 1 + ], + [ + 399, + 399, + 4 + ], + [ + 1033, + 155, + 1 + ], + [ + 1034, + 1233, + 2 + ], + [ + 1070, + 217, + 5 + ], + [ + 1073, + 144, + 3 + ], + [ + 1089, + 244, + 2 + ], + [ + 1091, + 148, + 2 + ], + [ + 1169, + 172, + 3 + ], + [ + 104, + 460, + 1 + ], + [ + 150, + 280, + 4 + ], + [ + 150, + 1049, + 2 + ], + [ + 223, + 149, + 2 + ], + [ + 244, + 148, + 2 + ], + [ + 341, + 341, + 3 + ], + [ + 378, + 166, + 1 + ], + [ + 1045, + 1161, + 4 + ], + [ + 1068, + 189, + 6 + ], + [ + 1164, + 173, + 2 + ], + [ + 1169, + 181, + 3 + ], + [ + 1287, + 158, + 6 + ], + [ + 1497, + 1026, + 1 + ], + [ + 154, + 216, + 3 + ], + [ + 156, + 1112, + 1 + ], + [ + 162, + 117, + 3 + ], + [ + 177, + 279, + 2 + ], + [ + 179, + 280, + 2 + ], + [ + 254, + 264, + 2 + ], + [ + 285, + 149, + 2 + ], + [ + 302, + 275, + 2 + ], + [ + 319, + 271, + 1 + ], + [ + 462, + 462, + 2 + ], + [ + 570, + 570, + 3 + ], + [ + 593, + 593, + 2 + ], + [ + 598, + 294, + 2 + ], + [ + 680, + 237, + 2 + ], + [ + 1024, + 414, + 4 + ], + [ + 1043, + 1151, + 4 + ], + [ + 1088, + 147, + 2 + ], + [ + 1088, + 285, + 2 + ], + [ + 1124, + 133, + 6 + ], + [ + 1198, + 151, + 5 + ], + [ + 1230, + 152, + 5 + ], + [ + 1278, + 1026, + 1 + ], + [ + 164, + 226, + 2 + ], + [ + 170, + 1044, + 1 + ], + [ + 243, + 133, + 2 + ], + [ + 269, + 103, + 2 + ], + [ + 278, + 224, + 1 + ], + [ + 346, + 346, + 5 + ], + [ + 718, + 718, + 2 + ], + [ + 1036, + 295, + 4 + ], + [ + 1037, + 270, + 5 + ], + [ + 1056, + 264, + 1 + ], + [ + 1063, + 148, + 6 + ], + [ + 1094, + 291, + 2 + ], + [ + 1121, + 1272, + 5 + ], + [ + 1130, + 146, + 6 + ], + [ + 1344, + 1033, + 1 + ], + [ + 136, + 303, + 2 + ], + [ + 179, + 144, + 2 + ], + [ + 217, + 149, + 2 + ], + [ + 219, + 469, + 2 + ], + [ + 257, + 103, + 2 + ], + [ + 335, + 249, + 3 + ], + [ + 468, + 468, + 3 + ], + [ + 1085, + 230, + 4 + ], + [ + 1088, + 146, + 2 + ], + [ + 1155, + 220, + 1 + ], + [ + 1339, + 168, + 1 + ], + [ + 147, + 148, + 1 + ], + [ + 150, + 1116, + 2 + ], + [ + 233, + 147, + 2 + ], + [ + 322, + 322, + 5 + ], + [ + 396, + 215, + 2 + ], + [ + 587, + 447, + 2 + ], + [ + 1027, + 389, + 4 + ], + [ + 1041, + 1183, + 1 + ], + [ + 1046, + 230, + 4 + ], + [ + 1049, + 1057, + 1 + ], + [ + 1065, + 133, + 6 + ], + [ + 1072, + 242, + 2 + ], + [ + 1085, + 244, + 4 + ], + [ + 1150, + 146, + 6 + ], + [ + 1411, + 1411, + 4 + ], + [ + 262, + 1024, + 2 + ], + [ + 263, + 226, + 1 + ], + [ + 266, + 303, + 2 + ], + [ + 267, + 267, + 5 + ], + [ + 272, + 173, + 1 + ], + [ + 329, + 329, + 6 + ], + [ + 334, + 279, + 2 + ], + [ + 416, + 416, + 4 + ], + [ + 478, + 478, + 2 + ], + [ + 1027, + 376, + 4 + ], + [ + 1037, + 260, + 5 + ], + [ + 1040, + 1139, + 1 + ], + [ + 1041, + 1092, + 4 + ], + [ + 1074, + 180, + 5 + ], + [ + 1189, + 166, + 5 + ], + [ + 1264, + 1061, + 5 + ], + [ + 1328, + 220, + 5 + ], + [ + 1344, + 152, + 1 + ], + [ + 21, + 21, + 1 + ], + [ + 392, + 165, + 1 + ], + [ + 523, + 523, + 2 + ], + [ + 1035, + 249, + 2 + ], + [ + 1036, + 281, + 4 + ], + [ + 1043, + 226, + 4 + ], + [ + 1076, + 147, + 2 + ], + [ + 1078, + 138, + 2 + ], + [ + 1124, + 148, + 6 + ], + [ + 104, + 479, + 1 + ], + [ + 136, + 1071, + 2 + ], + [ + 148, + 250, + 3 + ], + [ + 148, + 273, + 2 + ], + [ + 155, + 221, + 3 + ], + [ + 158, + 407, + 1 + ], + [ + 189, + 467, + 2 + ], + [ + 243, + 414, + 2 + ], + [ + 262, + 136, + 2 + ], + [ + 265, + 170, + 1 + ], + [ + 288, + 150, + 2 + ], + [ + 1036, + 1067, + 4 + ], + [ + 1040, + 245, + 2 + ], + [ + 1042, + 215, + 4 + ], + [ + 1056, + 231, + 5 + ], + [ + 1067, + 147, + 2 + ], + [ + 1094, + 138, + 2 + ], + [ + 1241, + 156, + 2 + ], + [ + 145, + 1063, + 2 + ], + [ + 149, + 281, + 2 + ], + [ + 217, + 1024, + 2 + ], + [ + 219, + 1045, + 2 + ], + [ + 248, + 214, + 1 + ], + [ + 257, + 257, + 6 + ], + [ + 301, + 1093, + 1 + ], + [ + 609, + 609, + 2 + ], + [ + 1026, + 226, + 5 + ], + [ + 1039, + 1336, + 6 + ], + [ + 1079, + 223, + 2 + ], + [ + 1108, + 176, + 6 + ], + [ + 1124, + 138, + 6 + ], + [ + 1128, + 1032, + 3 + ], + [ + 1249, + 1084, + 5 + ], + [ + 180, + 1040, + 1 + ], + [ + 191, + 370, + 2 + ], + [ + 297, + 153, + 2 + ], + [ + 302, + 145, + 2 + ], + [ + 307, + 411, + 2 + ], + [ + 315, + 417, + 2 + ], + [ + 1036, + 291, + 4 + ], + [ + 1036, + 300, + 4 + ], + [ + 1037, + 287, + 5 + ], + [ + 1071, + 133, + 6 + ], + [ + 1088, + 144, + 2 + ], + [ + 1089, + 147, + 2 + ], + [ + 1097, + 181, + 2 + ], + [ + 148, + 255, + 2 + ], + [ + 151, + 103, + 1 + ], + [ + 189, + 255, + 2 + ], + [ + 241, + 136, + 3 + ], + [ + 252, + 369, + 2 + ], + [ + 268, + 268, + 7 + ], + [ + 293, + 457, + 1 + ], + [ + 436, + 436, + 3 + ], + [ + 1063, + 151, + 1 + ], + [ + 1086, + 163, + 2 + ], + [ + 1128, + 1120, + 3 + ], + [ + 1153, + 146, + 6 + ], + [ + 1197, + 144, + 5 + ], + [ + 1211, + 1113, + 4 + ], + [ + 1643, + 114, + 4 + ], + [ + 1744, + 153, + 4 + ], + [ + 132, + 150, + 1 + ], + [ + 132, + 233, + 2 + ], + [ + 166, + 287, + 2 + ], + [ + 231, + 264, + 1 + ], + [ + 242, + 437, + 3 + ], + [ + 247, + 113, + 1 + ], + [ + 296, + 275, + 2 + ], + [ + 368, + 173, + 1 + ], + [ + 409, + 226, + 2 + ], + [ + 430, + 249, + 3 + ], + [ + 1027, + 408, + 4 + ], + [ + 1041, + 230, + 4 + ], + [ + 1091, + 255, + 2 + ], + [ + 1149, + 148, + 6 + ], + [ + 236, + 463, + 2 + ], + [ + 250, + 138, + 2 + ], + [ + 300, + 103, + 2 + ], + [ + 302, + 505, + 2 + ], + [ + 439, + 532, + 2 + ], + [ + 453, + 453, + 3 + ], + [ + 1038, + 1156, + 2 + ], + [ + 1121, + 1344, + 5 + ], + [ + 1124, + 147, + 6 + ], + [ + 1141, + 163, + 3 + ], + [ + 1146, + 1040, + 1 + ], + [ + 1245, + 1081, + 5 + ], + [ + 117, + 117, + 5 + ], + [ + 189, + 277, + 2 + ], + [ + 221, + 155, + 1 + ], + [ + 233, + 226, + 2 + ], + [ + 240, + 231, + 2 + ], + [ + 304, + 269, + 4 + ], + [ + 1035, + 262, + 4 + ], + [ + 1042, + 133, + 4 + ], + [ + 1051, + 132, + 1 + ], + [ + 1099, + 181, + 2 + ], + [ + 4, + 3, + 2 + ], + [ + 104, + 457, + 1 + ], + [ + 149, + 261, + 2 + ], + [ + 215, + 405, + 2 + ], + [ + 221, + 163, + 1 + ], + [ + 223, + 217, + 2 + ], + [ + 267, + 452, + 1 + ], + [ + 420, + 420, + 3 + ], + [ + 530, + 530, + 2 + ], + [ + 1037, + 324, + 5 + ], + [ + 1072, + 173, + 5 + ], + [ + 1105, + 1120, + 2 + ], + [ + 1118, + 1058, + 1 + ], + [ + 1128, + 158, + 3 + ], + [ + 1128, + 166, + 3 + ], + [ + 138, + 1082, + 2 + ], + [ + 149, + 1061, + 1 + ], + [ + 183, + 183, + 3 + ], + [ + 207, + 121, + 2 + ], + [ + 220, + 261, + 1 + ], + [ + 235, + 1078, + 1 + ], + [ + 236, + 147, + 2 + ], + [ + 254, + 284, + 1 + ], + [ + 263, + 222, + 1 + ], + [ + 291, + 103, + 2 + ], + [ + 326, + 270, + 1 + ], + [ + 1033, + 181, + 4 + ], + [ + 1051, + 1158, + 4 + ], + [ + 1056, + 224, + 5 + ], + [ + 1259, + 181, + 1 + ], + [ + 1318, + 152, + 6 + ], + [ + 136, + 1060, + 2 + ], + [ + 156, + 299, + 1 + ], + [ + 170, + 260, + 1 + ], + [ + 212, + 123, + 2 + ], + [ + 243, + 144, + 2 + ], + [ + 309, + 309, + 4 + ], + [ + 319, + 270, + 1 + ], + [ + 325, + 179, + 3 + ], + [ + 363, + 172, + 1 + ], + [ + 379, + 214, + 2 + ], + [ + 427, + 613, + 2 + ], + [ + 1025, + 460, + 2 + ], + [ + 1039, + 1310, + 6 + ], + [ + 1041, + 132, + 4 + ], + [ + 1080, + 148, + 6 + ], + [ + 1091, + 146, + 2 + ], + [ + 1115, + 149, + 6 + ], + [ + 1116, + 1204, + 4 + ], + [ + 146, + 176, + 1 + ], + [ + 248, + 240, + 3 + ], + [ + 258, + 147, + 2 + ], + [ + 258, + 266, + 1 + ], + [ + 282, + 144, + 2 + ], + [ + 308, + 177, + 3 + ], + [ + 319, + 168, + 1 + ], + [ + 393, + 393, + 4 + ], + [ + 598, + 110, + 2 + ], + [ + 996, + 996, + 2 + ], + [ + 1024, + 133, + 3 + ], + [ + 1026, + 220, + 3 + ], + [ + 1039, + 1351, + 6 + ], + [ + 1045, + 231, + 4 + ], + [ + 1065, + 148, + 6 + ], + [ + 1195, + 168, + 3 + ], + [ + 1195, + 180, + 3 + ], + [ + 88, + 87, + 1 + ], + [ + 158, + 110, + 1 + ], + [ + 176, + 417, + 3 + ], + [ + 243, + 264, + 1 + ], + [ + 325, + 291, + 3 + ], + [ + 344, + 344, + 4 + ], + [ + 367, + 159, + 1 + ] + ] +} diff --git a/variants/extended-1st-10mm-8k/profiles/eef/primitives.npz b/variants/extended-1st-10mm-8k/profiles/eef/primitives.npz index 66719fba16ebeb8e9f7e6e3f808d41541553b163..8026380a50507523f798198eee1451587ad14c9c 100644 --- a/variants/extended-1st-10mm-8k/profiles/eef/primitives.npz +++ b/variants/extended-1st-10mm-8k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d99d92d73fbfe2d96ff317f0eef2d0d2ba6420ac8049c47ae0cc387913854bf +oid sha256:ffe32ba8ceb3234ee4d3bf7b4f6670379e4aa8819096ccf32c892989b17a76b9 size 2510 diff --git a/variants/extended-1st-10mm-8k/profiles/joint/bpe.json b/variants/extended-1st-10mm-8k/profiles/joint/bpe.json index 47e46b0e433d52c91ee47f4a21769bca77104978..1be2ca83dc228cc14f8a4da48ebdd6b46e1667b4 100644 --- a/variants/extended-1st-10mm-8k/profiles/joint/bpe.json +++ b/variants/extended-1st-10mm-8k/profiles/joint/bpe.json @@ -1 +1,39210 @@ -{"spatial_merges": [[152, 164], [133, 183], [22, 105], [67, 184], [185, 186], [181, 187], [175, 182], [187, 189], [181, 184], [181, 183], [175, 188], [181, 186], [21, 105], [67, 185], [133, 181], [23, 105], [22, 104], [22, 106], [68, 185], [182, 187], [134, 192], [132, 192], [66, 191], [153, 164], [151, 164], [152, 165], [152, 163], [182, 184], [183, 189], [68, 191], [186, 189], [191, 201], [175, 194], [66, 185], [185, 205], [182, 183], [184, 189], [67, 175], [134, 181], [175, 196], [132, 181], [133, 189], [21, 104], [21, 106], [23, 104], [134, 211], [197, 207], [197, 206], [23, 106], [65, 191], [133, 182], [197, 208], [197, 209], [132, 211], [69, 191], [182, 186], [22, 107], [67, 195], [132, 218], [22, 103], [24, 105], [20, 105], [67, 198], [194, 200], [194, 195], [194, 198], [201, 210], [67, 200], [195, 213], [134, 218], [68, 195], [194, 199], [68, 199], [198, 213], [67, 199], [68, 198], [199, 212], [195, 215], [66, 198], [200, 205], [196, 224], [135, 192], [196, 204], [131, 192], [196, 203], [66, 200], [196, 228], [175, 203], [66, 195], [216, 219], [201, 219], [203, 220], [198, 215], [68, 200], [175, 214], [175, 204], [66, 199], [203, 222], [204, 222], [204, 220], [64, 191], [175, 217], [65, 185], [153, 163], [151, 165], [69, 185], [210, 216], [131, 181], [175, 212], [135, 181], [132, 182], [199, 215], [196, 236], [200, 215], [151, 163], [175, 205], [206, 221], [24, 104], [207, 223], [153, 165], [134, 189], [207, 221], [70, 191], [134, 182], [206, 223], [20, 106], [20, 104], [24, 106], [132, 189], [199, 213], [209, 221], [200, 213], [21, 103], [206, 233], [207, 233], [208, 223], [22, 108], [208, 221], [23, 103], [185, 232], [21, 107], [209, 223], [201, 204], [22, 102], [198, 212], [195, 212], [200, 232], [23, 107], [25, 105], [228, 240], [69, 199], [195, 205], [67, 204], [19, 105], [65, 203], [198, 205], [199, 237], [208, 233], [206, 224], [209, 233], [195, 274], [207, 224], [196, 230], [67, 203], [204, 250], [200, 212], [199, 238], [196, 229], [208, 224], [210, 255], [209, 224], [195, 238], [68, 226], [66, 227], [185, 237], [198, 238], [203, 216], [198, 282], [68, 225], [199, 205], [65, 200], [68, 227], [196, 234], [196, 235], [196, 241], [66, 204], [203, 257], [236, 245], [69, 203], [195, 220], [64, 203], [68, 231], [201, 203], [200, 238], [67, 226], [63, 191], [206, 263], [67, 227], [67, 243], [65, 204], [66, 225], [67, 225], [198, 220], [69, 204], [67, 231], [207, 263], [197, 286], [69, 210], [197, 287], [71, 191], [66, 231], [67, 244], [66, 226], [212, 225], [196, 252], [24, 103], [131, 218], [175, 201], [208, 263], [212, 227], [222, 229], [205, 226], [204, 216], [66, 243], [68, 203], [130, 181], [222, 230], [22, 109], [197, 297], [201, 241], [20, 103], [209, 263], [197, 302], [64, 185], [205, 231], [25, 104], [25, 106], [136, 181], [194, 226], [20, 107], [194, 225], [194, 231], [175, 216], [174, 202], [131, 182], [136, 192], [65, 199], [19, 104], [176, 202], [70, 185], [24, 107], [68, 244], [176, 188], [210, 268], [67, 239], [130, 192], [194, 227], [19, 106], [174, 188], [68, 243], [195, 291], [21, 102], [201, 270], [21, 108], [222, 235], [203, 285], [219, 261], [199, 220], [135, 218], [135, 182], [219, 253], [26, 105], [200, 220], [201, 228], [23, 102], [222, 234], [203, 255], [216, 278], [66, 244], [215, 225], [207, 293], [65, 198], [23, 108], [22, 101], [209, 303], [215, 226], [210, 253], [69, 195], [206, 293], [69, 200], [206, 303], [200, 291], [70, 203], [194, 243], [216, 236], [18, 105], [219, 258], [131, 211], [70, 204], [199, 298], [69, 198], [195, 298], [194, 244], [206, 306], [232, 239], [175, 230], [208, 311], [204, 268], [219, 271], [207, 306], [206, 290], [175, 229], [210, 258], [207, 311], [66, 239], [209, 292], [198, 298], [208, 290], [207, 303], [65, 210], [207, 292], [64, 204], [207, 290], [150, 164], [204, 245], [70, 210], [154, 164], [199, 305], [204, 276], [206, 292], [203, 240], [226, 232], [203, 279], [204, 288], [228, 253], [209, 311], [208, 292], [215, 231], [215, 227], [198, 291], [213, 227], [66, 203], [213, 226], [63, 203], [206, 311], [225, 237], [208, 303], [65, 195], [209, 293], [208, 293], [175, 234], [195, 232], [200, 283], [231, 232], [227, 237], [209, 290], [196, 316], [253, 270], [236, 261], [201, 230], [68, 242], [209, 306], [196, 317], [174, 252], [198, 232], [67, 242], [204, 240], [237, 242], [64, 210], [213, 231], [205, 239], [208, 306], [201, 278], [175, 235], [176, 252], [201, 229], [176, 241], [213, 225], [25, 103], [219, 279], [199, 232], [216, 228], [216, 270], [261, 278], [219, 276], [200, 237], [62, 191], [72, 191], [210, 288], [199, 282], [203, 245], [204, 258], [174, 241], [185, 283], [210, 333], [239, 335], [63, 185], [66, 300], [200, 274], [25, 107], [216, 229], [19, 107], [20, 108], [24, 102], [195, 237], [19, 103], [64, 199], [223, 287], [210, 276], [71, 204], [65, 239], [223, 286], [216, 230], [20, 102], [22, 110], [212, 242], [68, 308], [221, 286], [66, 242], [198, 237], [175, 266], [68, 239], [64, 200], [67, 300], [175, 259], [69, 242], [135, 211], [221, 297], [67, 331], [204, 253], [26, 106], [201, 234], [69, 225], [200, 282], [210, 261], [201, 236], [70, 199], [131, 189], [67, 319], [205, 243], [201, 235], [210, 279], [69, 227], [270, 271], [210, 285], [205, 244], [221, 302], [199, 274], [210, 271], [67, 310], [221, 287], [27, 105], [129, 181], [26, 104], [21, 109], [195, 282], [175, 262], [228, 271], [240, 351], [68, 310], [220, 226], [203, 271], [24, 108], [239, 283], [18, 104], [216, 235], [67, 308], [212, 226], [196, 340], [236, 258], [196, 342], [212, 231], [216, 234], [67, 309], [220, 225], [223, 297], [18, 106], [137, 181], [69, 226], [71, 203], [66, 310], [205, 225], [65, 227], [223, 302], [21, 101], [17, 105], [68, 300], [245, 353], [242, 305], [228, 257], [226, 291], [220, 227], [203, 288], [258, 278], [203, 250], [204, 255], [130, 182], [23, 109], [229, 450], [228, 250], [65, 231], [239, 368], [67, 336], [205, 227], [64, 264], [68, 309], [66, 309], [201, 252], [65, 242], [194, 239], [226, 274], [65, 226], [71, 210], [216, 252], [185, 373], [242, 407], [203, 261], [175, 264], [204, 285], [152, 166], [230, 455], [225, 274], [228, 245], [200, 337], [204, 257], [220, 231], [230, 240], [210, 363], [225, 346], [212, 243], [69, 231], [210, 361], [241, 250], [70, 200], [203, 268], [203, 333], [175, 299], [66, 308], [229, 245], [136, 182], [23, 101], [65, 243], [175, 301], [212, 244], [233, 297], [229, 240], [63, 199], [196, 299], [231, 335], [152, 162], [230, 245], [198, 274], [233, 302], [233, 286], [22, 100], [252, 257], [227, 282], [196, 304], [266, 437], [69, 244], [203, 253], [230, 250], [129, 192], [176, 246], [66, 331], [225, 298], [233, 287], [219, 268], [234, 372], [174, 254], [231, 282], [219, 255], [174, 316], [185, 305], [69, 243], [176, 317], [235, 240], [137, 192], [228, 377], [234, 245], [175, 313], [65, 225], [66, 319], [205, 310], [242, 346], [219, 356], [236, 257], [210, 364], [228, 384], [62, 203], [204, 333], [196, 301], [73, 191], [199, 337], [196, 307], [242, 371], [236, 250], [70, 242], [175, 318], [68, 331], [227, 298], [227, 238], [220, 244], [63, 204], [229, 257], [25, 102], [225, 238], [227, 346], [250, 266], [135, 189], [205, 308], [130, 218], [240, 341], [69, 239], [71, 185], [226, 335], [244, 274], [226, 238], [196, 320], [195, 337], [196, 313], [70, 195], [72, 204], [232, 323], [63, 264], [175, 304], [64, 235], [68, 336], [229, 250], [175, 307], [194, 242], [204, 363], [216, 241], [241, 288], [19, 108], [174, 214], [154, 163], [26, 103], [245, 344], [236, 381], [70, 198], [65, 235], [64, 229], [230, 372], [136, 218], [232, 330], [203, 258], [201, 341], [176, 217], [64, 230], [150, 165], [236, 380], [270, 276], [150, 163], [270, 355], [198, 337], [196, 318], [212, 300], [224, 286], [239, 382], [62, 185], [231, 238], [236, 387], [235, 385], [237, 321], [215, 244], [194, 309], [154, 165], [204, 261], [194, 310], [196, 324], [19, 102], [68, 204], [26, 107], [250, 341], [174, 247], [237, 315], [216, 344], [194, 300], [219, 355], [194, 331], [235, 250], [203, 361], [207, 427], [174, 249], [278, 279], [236, 240], [65, 234], [230, 257], [65, 266], [212, 309], [174, 354], [228, 394], [245, 341], [224, 287], [196, 467], [230, 400], [201, 316], [64, 234], [220, 243], [65, 229], [20, 109], [206, 427], [213, 243], [208, 408], [240, 344], [61, 191], [28, 105], [257, 344], [18, 103], [175, 320], [231, 291], [66, 336], [18, 107], [196, 264], [63, 210], [229, 372], [234, 240], [235, 245], [206, 408], [25, 108], [209, 420], [67, 229], [222, 313], [176, 289], [27, 106], [234, 250], [234, 257], [67, 234], [65, 230], [201, 317], [198, 386], [176, 358], [66, 323], [252, 255], [175, 324], [66, 330], [69, 234], [216, 351], [194, 308], [197, 509], [194, 336], [229, 255], [176, 210], [224, 302], [69, 230], [67, 230], [64, 242], [20, 101], [68, 321], [235, 257], [224, 297], [230, 268], [229, 425], [278, 356], [226, 283], [197, 506], [203, 276], [68, 315], [22, 111], [229, 385], [222, 318], [176, 247], [69, 229], [70, 230], [203, 364], [70, 229], [176, 354], [71, 199], [286, 290], [67, 264], [16, 105], [207, 420], [66, 321], [230, 255], [174, 358], [225, 305], [205, 323], [199, 392], [219, 374], [242, 392], [207, 452], [229, 268], [200, 373], [64, 198], [204, 432], [176, 342], [208, 420], [67, 410], [27, 104], [241, 276], [207, 408], [200, 386], [204, 279], [195, 386], [235, 400], [209, 408], [204, 271], [65, 264], [222, 301], [176, 248], [205, 330], [208, 427], [234, 255], [287, 290], [206, 452], [174, 340], [201, 353], [69, 264], [196, 489], [232, 310], [231, 283], [203, 383], [17, 104], [199, 283], [209, 427], [231, 368], [196, 473], [236, 356], [24, 101], [72, 210], [63, 200], [174, 317], [227, 305], [72, 203], [67, 235], [64, 195], [66, 315], [70, 239], [210, 395], [212, 315], [232, 308], [21, 110], [226, 368], [206, 420], [235, 255], [212, 321], [228, 355], [176, 316], [232, 243], [232, 244]], "temporal_merges": [[188, 188, 2], [190, 190, 2], [193, 193, 2], [1024, 1024, 4], [1025, 1025, 4], [202, 202, 2], [1026, 1026, 4], [1029, 1029, 4], [1027, 1027, 1], [1024, 188, 4], [1028, 1028, 1], [1025, 190, 4], [214, 214, 2], [1030, 1030, 1], [1026, 193, 4], [217, 217, 2], [188, 188, 4], [190, 190, 4], [193, 193, 4], [1031, 1031, 1], [188, 214, 2], [1029, 202, 4], [188, 217, 2], [174, 174, 3], [176, 176, 3], [249, 249, 2], [1024, 214, 4], [1024, 217, 4], [190, 1025, 4], [214, 188, 2], [188, 246, 2], [248, 248, 2], [247, 247, 2], [262, 262, 2], [259, 259, 2], [249, 202, 2], [193, 1026, 4], [190, 251, 2], [190, 256, 2], [188, 254, 2], [266, 266, 2], [1033, 217, 6], [1024, 246, 4], [188, 247, 2], [264, 264, 2], [188, 248, 2], [241, 241, 2], [193, 193, 6], [188, 265, 2], [214, 214, 3], [252, 252, 2], [1025, 190, 6], [289, 289, 2], [67, 67, 1], [174, 174, 4], [1024, 254, 4], [188, 267, 2], [176, 176, 4], [246, 246, 2], [260, 260, 3], [190, 269, 2], [66, 66, 1], [1025, 251, 4], [1024, 247, 4], [1026, 193, 6], [1025, 256, 4], [1024, 248, 4], [190, 272, 2], [190, 273, 2], [326, 326, 1], [1039, 217, 4], [1033, 214, 6], [251, 251, 2], [1024, 265, 4], [202, 202, 4], [230, 230, 2], [68, 68, 1], [1035, 256, 6], [229, 229, 2], [71, 71, 1], [190, 295, 2], [242, 242, 2], [65, 65, 1], [254, 254, 2], [1035, 251, 6], [256, 256, 2], [1036, 214, 4], [70, 70, 1], [202, 249, 2], [267, 267, 2], [193, 275, 2], [1033, 246, 6], [64, 64, 1], [262, 217, 2], [281, 281, 3], [329, 329, 2], [235, 235, 3], [62, 62, 1], [193, 277, 2], [319, 319, 1], [63, 63, 1], [234, 234, 3], [1024, 267, 4], [193, 280, 2], [193, 260, 2], [1025, 272, 4], [1025, 273, 4], [190, 312, 2], [1025, 269, 4], [193, 284, 2], [214, 214, 4], [190, 314, 2], [69, 69, 1], [1027, 1033, 3], [322, 322, 2], [73, 73, 1], [339, 339, 2], [239, 239, 2], [277, 277, 3], [265, 265, 2], [193, 294, 2], [217, 217, 3], [1025, 295, 4], [196, 196, 2], [72, 72, 1], [193, 296, 2], [275, 275, 3], [193, 281, 2], [1027, 1033, 1], [202, 289, 2], [283, 283, 2], [210, 210, 2], [315, 315, 2], [249, 1029, 2], [175, 175, 2], [1035, 273, 6], [1035, 272, 6], [280, 280, 3], [352, 352, 2], [61, 61, 1], [259, 259, 3], [1035, 269, 6], [325, 325, 2], [332, 332, 2], [1026, 275, 4], [1025, 312, 4], [260, 260, 2], [188, 1039, 2], [284, 284, 3], [1025, 314, 4], [321, 321, 2], [323, 323, 2], [251, 251, 3], [285, 285, 2], [304, 304, 2], [1035, 295, 6], [188, 345, 2], [1033, 254, 6], [237, 237, 2], [307, 307, 2], [1033, 247, 6], [188, 350, 2], [1033, 248, 6], [1026, 277, 4], [1026, 260, 4], [272, 272, 2], [299, 299, 2], [378, 378, 2], [236, 236, 2], [288, 288, 2], [269, 269, 2], [347, 347, 2], [301, 301, 2], [273, 273, 2], [66, 67, 1], [330, 330, 2], [1026, 281, 4], [230, 230, 3], [1040, 217, 2], [1026, 284, 4], [334, 334, 2], [1026, 280, 4], [343, 343, 2], [327, 327, 2], [259, 214, 2], [216, 216, 2], [229, 229, 3], [309, 309, 2], [305, 305, 2], [270, 270, 2], [201, 201, 2], [1030, 1038, 3], [1040, 214, 2], [256, 256, 3], [1030, 1038, 1], [1035, 312, 6], [1029, 289, 4], [225, 225, 2], [328, 328, 2], [235, 235, 2], [200, 200, 2], [244, 244, 2], [1035, 314, 6], [188, 365, 2], [338, 338, 2], [174, 174, 5], [188, 1036, 2], [300, 300, 2], [234, 234, 2], [188, 366, 2], [1026, 294, 4], [247, 247, 3], [248, 248, 3], [1026, 296, 4], [176, 176, 5], [1027, 1024, 5], [232, 232, 2], [258, 258, 2], [266, 266, 1], [1033, 265, 6], [64, 65, 1], [262, 262, 3], [253, 253, 2], [246, 246, 3], [360, 360, 2], [199, 199, 2], [243, 243, 2], [68, 69, 1], [1038, 1030, 1], [202, 349, 2], [195, 195, 2], [294, 294, 2], [399, 399, 2], [296, 296, 2], [281, 281, 2], [188, 188, 1], [428, 428, 2], [357, 357, 2], [174, 174, 2], [269, 190, 2], [62, 63, 1], [1027, 1024, 3], [176, 176, 2], [398, 398, 2], [277, 277, 4], [245, 245, 2], [326, 326, 2], [275, 275, 2], [227, 227, 2], [254, 254, 3], [1029, 249, 4], [70, 71, 1], [261, 261, 2], [264, 264, 1], [251, 251, 4], [278, 278, 2], [228, 228, 2], [205, 205, 2], [74, 74, 1], [280, 280, 2], [240, 240, 2], [317, 317, 2], [313, 313, 2], [217, 188, 2], [1033, 267, 6], [241, 241, 3], [410, 410, 1], [316, 316, 2], [1040, 246, 2], [320, 320, 2], [308, 308, 2], [359, 359, 2], [1041, 256, 2], [249, 352, 2], [413, 413, 2], [348, 348, 2], [390, 390, 2], [251, 190, 2], [217, 322, 2], [438, 438, 2], [226, 226, 2], [1036, 1036, 4], [1024, 345, 4], [370, 370, 2], [454, 454, 1], [279, 279, 2], [60, 60, 1], [1024, 350, 4], [466, 466, 1], [419, 419, 2], [273, 190, 2], [1041, 269, 2], [257, 257, 2], [260, 260, 4], [202, 367, 2], [418, 418, 2], [65, 66, 1], [272, 190, 2], [284, 284, 4], [242, 242, 1], [451, 451, 2], [72, 71, 1], [256, 190, 2], [202, 354, 2], [204, 204, 2], [406, 406, 2], [198, 198, 2], [430, 430, 2], [369, 369, 2], [271, 271, 2], [202, 358, 2], [268, 268, 2], [1049, 249, 4], [331, 331, 1], [422, 422, 2], [252, 252, 3], [246, 188, 2], [480, 480, 2], [193, 193, 1], [319, 319, 2], [202, 376, 2], [214, 214, 1], [1040, 247, 2], [1041, 272, 2], [444, 444, 2], [433, 433, 2], [1041, 273, 2], [174, 174, 6], [324, 324, 2], [440, 440, 2], [1045, 289, 6], [318, 318, 2], [1040, 248, 2], [217, 262, 2], [1027, 214, 3], [336, 336, 1], [1024, 365, 4], [185, 185, 2], [310, 310, 2], [1024, 366, 4], [219, 219, 2], [436, 436, 2], [1027, 214, 1], [67, 68, 1], [234, 234, 4], [231, 231, 2], [235, 235, 4], [1038, 275, 6], [176, 176, 6], [276, 276, 2], [1040, 254, 2], [247, 188, 2], [1024, 1039, 4], [248, 188, 2], [1047, 1047, 2], [1041, 251, 2], [266, 266, 3], [254, 188, 2], [478, 478, 1], [265, 265, 3], [181, 181, 1], [412, 412, 2], [371, 371, 2], [362, 362, 2], [446, 446, 2], [230, 230, 4], [70, 69, 1], [250, 250, 2], [448, 448, 2], [62, 61, 1], [262, 329, 2], [1028, 256, 3], [1029, 349, 4], [332, 332, 3], [229, 229, 4], [396, 396, 2], [64, 63, 1], [217, 217, 4], [190, 379, 2], [286, 286, 2], [1028, 256, 1], [269, 269, 3], [416, 416, 2], [260, 193, 2], [1048, 1048, 2], [294, 193, 2], [241, 241, 1], [267, 267, 3], [194, 194, 2], [402, 402, 2], [325, 214, 2], [457, 457, 2], [264, 264, 3], [239, 239, 1], [296, 193, 2], [404, 404, 2], [280, 193, 2], [255, 255, 2], [287, 287, 2], [295, 295, 2], [1028, 251, 3], [272, 272, 3], [340, 340, 2], [1039, 1039, 4], [220, 220, 2], [354, 354, 2], [442, 442, 2], [190, 388, 2], [1027, 214, 5], [304, 304, 3], [1028, 256, 5], [1038, 277, 6], [1038, 281, 6], [434, 434, 2], [417, 417, 2], [273, 273, 3], [297, 297, 2], [342, 342, 2], [299, 299, 3], [182, 182, 1], [1041, 295, 2], [214, 259, 2], [315, 315, 1], [1045, 249, 6], [382, 382, 2], [1025, 379, 4], [72, 73, 1], [1028, 251, 1], [1028, 251, 5], [307, 307, 3], [1027, 217, 5], [381, 381, 2], [1027, 217, 3], [358, 358, 2], [374, 374, 2], [1038, 284, 6], [109, 109, 1], [1040, 265, 2], [210, 210, 1], [283, 283, 1], [275, 275, 4], [277, 277, 2], [1056, 247, 4], [323, 323, 1], [252, 252, 1], [1038, 260, 6], [375, 375, 2], [465, 465, 2], [1055, 248, 4], [301, 301, 3], [1042, 280, 2], [294, 294, 3], [343, 343, 3], [392, 392, 2], [1025, 388, 4], [202, 397, 2], [174, 174, 7], [296, 296, 3], [1076, 289, 4], [1040, 267, 2], [302, 302, 2], [373, 373, 2], [265, 188, 2], [328, 214, 2], [212, 212, 2], [432, 432, 2], [281, 281, 4], [327, 327, 3], [190, 401, 2], [202, 1059, 2], [1041, 312, 2], [259, 254, 2], [267, 188, 2], [510, 510, 2], [201, 201, 3], [176, 176, 7], [217, 217, 1], [352, 249, 2], [262, 246, 2], [17, 17, 1], [321, 321, 1], [253, 253, 3], [1027, 217, 1], [66, 66, 2], [1038, 280, 6], [208, 208, 2], [1041, 314, 2], [347, 246, 2], [1033, 1027, 1], [106, 106, 1], [259, 1036, 2], [236, 236, 3], [237, 237, 1], [259, 339, 2], [256, 256, 4], [275, 193, 2], [314, 190, 2], [258, 258, 3], [322, 329, 2], [349, 349, 2], [214, 1024, 2], [292, 292, 2], [1029, 367, 4], [277, 193, 2], [295, 190, 2], [100, 100, 1], [393, 393, 2], [232, 205, 2], [330, 330, 1], [312, 190, 2], [383, 383, 2], [175, 175, 3], [313, 313, 3], [244, 244, 1], [284, 193, 2], [1029, 376, 4], [508, 508, 2], [325, 325, 3], [1044, 1027, 1], [216, 216, 3], [334, 334, 3], [1028, 1035, 1], [202, 1049, 2], [70, 70, 2], [337, 337, 2], [1027, 1044, 3], [67, 67, 2], [68, 68, 2], [1025, 401, 4], [389, 389, 2], [1028, 1035, 3], [391, 391, 2], [305, 305, 1], [357, 214, 2], [209, 209, 2], [320, 320, 3], [394, 394, 2], [476, 476, 2], [1042, 260, 2], [203, 203, 2], [328, 328, 3], [60, 61, 1], [429, 429, 2], [461, 461, 2], [487, 487, 2], [1029, 354, 4], [284, 284, 2], [360, 360, 3], [475, 475, 2], [338, 338, 3], [285, 285, 1], [367, 367, 2], [327, 214, 2], [348, 214, 2], [1038, 296, 6], [502, 502, 2], [270, 270, 3], [281, 193, 2], [355, 355, 2], [1038, 294, 6], [411, 411, 2], [74, 73, 1], [22, 22, 1], [234, 234, 5], [1042, 275, 2], [1027, 1044, 1], [1029, 358, 4], [243, 243, 1], [261, 261, 3], [75, 75, 1], [485, 485, 2], [1047, 174, 6], [346, 346, 2], [356, 356, 2], [322, 217, 2], [481, 481, 2], [65, 65, 2], [269, 269, 4], [551, 551, 2], [378, 378, 1], [188, 188, 3], [248, 248, 4], [1025, 414, 4], [272, 272, 4], [247, 247, 4], [235, 235, 5], [1042, 294, 2], [240, 240, 3], [1027, 246, 3], [1042, 277, 2], [1024, 1036, 4], [359, 217, 2], [190, 414, 2], [105, 105, 1], [1042, 296, 2], [102, 102, 1], [1027, 246, 5], [339, 339, 3], [309, 309, 1], [1059, 249, 4], [228, 228, 3], [464, 464, 2], [415, 415, 2], [364, 364, 2], [506, 506, 2], [1077, 1077, 2], [329, 329, 3], [273, 273, 4], [108, 108, 1], [597, 597, 1], [1050, 1027, 1], [1048, 176, 6], [335, 335, 2], [197, 197, 2], [245, 245, 3], [324, 324, 3], [318, 318, 3], [1093, 326, 2], [1027, 1050, 1], [69, 69, 2], [280, 280, 4], [333, 333, 2], [200, 200, 1], [28, 28, 1], [188, 262, 2], [1042, 284, 2], [110, 110, 1], [1035, 1028, 1], [249, 249, 4], [1027, 1051, 3], [300, 300, 1], [251, 251, 5], [260, 260, 5], [363, 363, 2], [225, 225, 1], [368, 368, 2], [1103, 71, 2], [1031, 1045, 1], [230, 230, 5], [190, 426, 2], [1057, 262, 4], [1027, 1051, 1], [509, 509, 2], [398, 398, 1], [1030, 1026, 5], [288, 288, 3], [452, 452, 2], [361, 361, 2], [202, 202, 1], [63, 64, 1], [278, 278, 3], [229, 229, 5], [190, 431, 2], [463, 463, 2], [370, 370, 3], [1028, 273, 3], [1025, 426, 4], [65, 1085, 1], [395, 395, 2], [1033, 345, 6], [1028, 273, 1], [334, 217, 2], [1024, 1024, 1], [271, 271, 3], [1033, 350, 6], [1049, 1049, 4], [1029, 397, 4], [317, 317, 3], [353, 353, 3], [59, 59, 1], [1028, 273, 5], [1058, 259, 4], [1024, 188, 1], [1042, 281, 2], [493, 493, 2], [316, 316, 3], [498, 498, 2], [232, 232, 1], [196, 196, 3], [1027, 246, 1], [1025, 431, 4], [1031, 1045, 3], [470, 470, 2], [103, 103, 1], [436, 289, 2], [561, 561, 1], [312, 312, 2], [471, 471, 2], [422, 422, 1], [459, 459, 2], [332, 332, 4], [238, 238, 2], [1028, 272, 5], [18, 18, 1], [27, 27, 1], [1028, 272, 1], [195, 195, 1], [445, 445, 2], [101, 101, 1], [338, 217, 2], [503, 503, 2], [380, 380, 2], [107, 107, 1], [279, 279, 3], [1027, 1046, 3], [1028, 269, 1], [336, 336, 2], [331, 331, 2], [351, 351, 3], [483, 483, 2], [269, 251, 1], [413, 413, 1], [635, 635, 1], [486, 486, 2], [256, 256, 5], [516, 516, 2], [1139, 73, 2], [295, 295, 3], [526, 526, 2], [1028, 269, 5], [569, 569, 2], [319, 410, 1], [266, 438, 2], [570, 570, 2], [199, 199, 1], [437, 437, 2], [314, 314, 2], [64, 1106, 1], [504, 504, 2], [1027, 1050, 3], [1028, 272, 3], [1027, 188, 5], [246, 217, 2], [1026, 409, 4], [327, 248, 2], [193, 403, 2], [276, 276, 3], [535, 535, 2], [26, 26, 1], [214, 1044, 2], [23, 23, 1], [328, 247, 2], [500, 500, 2], [322, 322, 3], [377, 377, 2], [193, 409, 2], [405, 405, 2], [242, 242, 3], [433, 433, 1], [194, 212, 2], [241, 241, 4], [1028, 269, 3], [492, 492, 2], [505, 505, 2], [1026, 403, 4], [254, 259, 2], [262, 1039, 2], [285, 285, 3], [16, 16, 1], [1036, 188, 4], [407, 407, 2], [210, 210, 3], [219, 219, 3], [308, 308, 1], [69, 70, 1], [251, 269, 1], [349, 202, 2], [362, 217, 2], [191, 191, 2], [634, 634, 1], [227, 227, 1], [347, 265, 2], [387, 387, 2], [294, 294, 4], [480, 620, 2], [1077, 67, 2], [71, 71, 2], [226, 226, 1], [1027, 1065, 1], [293, 293, 2], [268, 268, 3], [216, 216, 1], [497, 497, 2], [1027, 1046, 5], [466, 326, 1], [609, 609, 2], [418, 418, 1], [375, 214, 2], [128, 128, 1], [660, 660, 1], [341, 341, 3], [514, 514, 2], [260, 280, 1], [384, 384, 2], [222, 222, 2], [621, 621, 1], [1033, 366, 6], [1033, 365, 6], [64, 64, 2], [419, 419, 1], [296, 296, 4], [1030, 275, 3], [299, 299, 4], [264, 428, 2], [376, 376, 2], [24, 24, 1], [1030, 275, 1], [1027, 247, 1], [528, 528, 2], [1074, 252, 4], [1035, 379, 6], [519, 519, 2], [325, 265, 2], [1030, 275, 5], [202, 1076, 2], [340, 340, 3], [1027, 248, 1], [446, 446, 1], [512, 512, 2], [586, 586, 1], [104, 104, 1], [19, 19, 1], [304, 304, 4], [254, 214, 2], [423, 423, 2], [339, 259, 2], [198, 198, 1], [472, 472, 2], [359, 359, 3], [66, 67, 2], [307, 307, 4], [196, 196, 1], [1064, 266, 4], [288, 288, 1], [62, 1124, 1], [390, 390, 1], [424, 424, 2], [1065, 1027, 1], [585, 585, 1], [306, 306, 2], [280, 260, 1], [584, 584, 1], [582, 582, 1], [412, 249, 2], [310, 310, 1], [255, 255, 3], [444, 444, 1], [430, 430, 1], [603, 603, 2], [1030, 280, 1], [193, 447, 2], [315, 315, 3], [1070, 241, 4], [1040, 345, 2], [325, 1036, 2], [234, 234, 6], [1027, 1044, 5], [62, 1163, 1], [99, 99, 1], [357, 357, 3], [348, 348, 3], [416, 416, 1], [257, 257, 3], [201, 201, 4], [205, 205, 1], [343, 343, 4], [342, 342, 3], [536, 536, 2], [63, 63, 2], [1026, 447, 4], [138, 138, 1], [460, 460, 2], [537, 537, 2], [253, 253, 4], [1033, 1024, 1], [456, 456, 2], [369, 254, 2], [440, 440, 1], [1027, 247, 5], [1035, 388, 6], [477, 477, 2], [1027, 248, 5], [596, 596, 1], [421, 421, 2], [301, 301, 4], [588, 588, 1], [577, 577, 2], [188, 259, 2], [1040, 350, 2], [246, 262, 2], [399, 399, 1], [223, 223, 2], [1030, 260, 1], [1068, 264, 4], [289, 289, 3], [212, 237, 2], [235, 235, 6], [277, 277, 5], [469, 469, 2], [1045, 1031, 1], [344, 344, 3], [193, 435, 2], [1027, 1024, 1], [231, 231, 1], [439, 439, 2], [193, 174, 2], [193, 441, 2], [166, 166, 2], [322, 322, 1], [548, 548, 2], [443, 443, 2], [702, 702, 2], [1078, 174, 2], [1026, 441, 4], [214, 254, 2], [679, 679, 1], [1028, 256, 7], [668, 668, 1], [352, 352, 3], [449, 449, 2], [1100, 68, 2], [578, 578, 2], [1027, 247, 3], [258, 258, 4], [313, 313, 4], [1033, 1024, 3], [490, 490, 2], [162, 162, 2], [1026, 435, 4], [457, 457, 1], [1082, 246, 4], [1051, 1027, 1], [206, 206, 2], [579, 579, 1], [207, 207, 2], [193, 176, 2], [1027, 1046, 1], [1027, 248, 3], [215, 215, 2], [517, 517, 2], [321, 321, 3], [1030, 277, 1], [283, 232, 2], [1028, 312, 1], [252, 252, 4], [236, 236, 4], [1081, 176, 2], [250, 250, 3], [386, 386, 2], [338, 248, 2], [1085, 66, 2], [202, 539, 2], [201, 201, 1], [269, 251, 2], [334, 247, 2], [1119, 329, 4], [465, 465, 1], [225, 225, 3], [1028, 314, 1], [175, 175, 4], [221, 221, 2], [272, 272, 5], [538, 538, 2], [454, 454, 2], [190, 174, 2], [320, 320, 4], [204, 204, 1], [1030, 260, 5], [259, 259, 4], [360, 385, 2], [230, 230, 6], [347, 347, 3], [214, 327, 2], [1026, 458, 4], [281, 281, 5], [396, 396, 3], [1028, 295, 5], [214, 328, 2], [239, 239, 3], [1095, 1027, 1], [323, 323, 3], [613, 613, 1], [345, 188, 2], [267, 267, 4], [592, 592, 2], [229, 229, 6], [240, 332, 2], [1046, 1027, 1], [202, 545, 2], [1030, 284, 1], [68, 69, 2], [1028, 312, 5], [290, 290, 2], [541, 541, 2], [722, 722, 1], [21, 21, 1], [249, 349, 2], [309, 309, 3], [402, 402, 3], [1035, 401, 6], [251, 269, 2], [1033, 1033, 1], [348, 246, 2], [244, 244, 3], [1040, 366, 2], [261, 261, 4], [174, 1047, 2], [1027, 188, 3], [1098, 289, 2], [65, 66, 2], [129, 129, 1], [71, 70, 1], [410, 319, 1], [637, 637, 1], [392, 305, 2], [193, 458, 2], [275, 275, 5], [188, 217, 1], [273, 273, 5], [370, 245, 2], [1040, 1134, 2], [1028, 314, 5], [214, 325, 2], [176, 1048, 2], [1040, 365, 2], [495, 495, 2], [515, 515, 2], [1024, 262, 4], [249, 1045, 2], [74, 1139, 1], [283, 378, 2], [295, 256, 1], [438, 266, 2], [466, 737, 1], [214, 246, 2], [216, 216, 4], [218, 218, 2], [71, 72, 1], [249, 412, 2], [1123, 319, 2], [1030, 280, 5], [284, 284, 5], [580, 580, 2], [237, 237, 3], [1052, 251, 2], [190, 176, 2], [1024, 188, 3], [1028, 295, 1], [357, 1036, 2], [1057, 1057, 4], [205, 194, 2], [329, 262, 2], [406, 406, 3], [362, 254, 2], [1136, 69, 2], [645, 645, 1], [636, 636, 1], [74, 75, 1], [1028, 295, 3], [330, 330, 3], [1027, 1095, 1], [428, 428, 1], [300, 300, 3], [451, 451, 1], [369, 369, 3], [1028, 1089, 1], [462, 462, 2], [1033, 188, 3], [397, 397, 2], [1029, 1059, 4], [371, 371, 1], [550, 550, 2], [1030, 280, 3], [1028, 1101, 1], [1101, 1028, 1], [312, 312, 3], [266, 266, 4], [404, 404, 3], [270, 270, 4], [1035, 414, 6], [243, 243, 3], [242, 326, 1], [732, 732, 2], [453, 453, 2], [1028, 312, 3], [190, 332, 2], [214, 265, 2], [174, 176, 7], [217, 246, 2], [350, 188, 2], [228, 228, 4], [353, 353, 4], [234, 234, 7], [511, 511, 2], [190, 370, 2], [318, 318, 4], [324, 324, 4], [540, 540, 2], [1030, 277, 5], [217, 1046, 2], [374, 374, 3], [339, 339, 1], [60, 59, 1], [647, 647, 1], [68, 67, 1], [468, 468, 2], [1028, 314, 3], [382, 382, 1], [351, 351, 4], [264, 264, 4], [25, 25, 1], [294, 294, 5], [260, 280, 2], [327, 1036, 2], [354, 202, 2], [417, 417, 3], [1030, 284, 5], [1052, 269, 2], [1028, 1086, 1], [314, 314, 3], [227, 227, 3], [543, 543, 2], [1045, 349, 6], [137, 137, 1], [611, 611, 2], [530, 530, 2], [265, 246, 2], [1113, 267, 4], [214, 247, 2], [328, 1036, 2], [275, 281, 1], [389, 389, 3], [375, 375, 3], [1052, 256, 2], [1053, 254, 4], [329, 487, 2], [240, 240, 4], [391, 391, 3], [1108, 1028, 1], [29, 29, 1], [185, 185, 1], [1028, 1108, 1], [1027, 265, 1], [1027, 1066, 1], [478, 478, 2], [534, 534, 2], [257, 257, 1], [235, 235, 7], [1052, 273, 2], [438, 745, 2], [245, 245, 1], [282, 282, 2], [64, 65, 2], [659, 659, 1], [1105, 242, 1], [1100, 69, 2], [174, 1047, 4], [279, 279, 1], [667, 667, 1], [280, 260, 2], [296, 296, 5], [599, 599, 2], [214, 248, 2], [474, 474, 2], [1035, 426, 6], [20, 20, 1], [271, 271, 4], [1031, 1029, 5], [256, 295, 2], [1058, 1058, 4], [1056, 1056, 4], [358, 202, 2], [1030, 260, 3], [1041, 379, 2], [1163, 61, 2], [1099, 230, 4], [700, 700, 2], [479, 479, 2], [1111, 70, 2], [424, 248, 2], [281, 275, 1], [367, 202, 2], [429, 429, 1], [1052, 272, 2], [1027, 254, 1], [217, 334, 2], [1124, 63, 2], [695, 508, 2], [1055, 1055, 4], [383, 383, 3], [571, 571, 2], [188, 369, 2], [408, 408, 1], [151, 151, 2], [352, 1049, 2], [1102, 229, 4], [280, 1026, 2], [1035, 431, 6], [373, 373, 1], [1085, 67, 2], [251, 332, 2], [385, 385, 2], [524, 524, 2], [214, 348, 2], [432, 432, 1], [420, 420, 1], [322, 576, 2], [360, 360, 4], [72, 1103, 1], [760, 760, 1], [1024, 1024, 3], [226, 226, 3], [66, 1077, 1], [233, 233, 2], [217, 359, 2], [256, 295, 1], [1028, 1025, 5], [322, 285, 2], [308, 308, 3], [376, 202, 2], [775, 73, 1], [381, 381, 3], [278, 278, 4], [1107, 254, 4], [250, 250, 1], [411, 411, 3], [1093, 1093, 2], [289, 202, 2], [188, 362, 2], [566, 566, 2], [1027, 267, 1], [1098, 349, 2], [482, 482, 2], [1030, 277, 3], [1121, 63, 2], [553, 553, 2], [350, 350, 2], [345, 345, 2], [176, 1048, 4], [445, 445, 3], [304, 229, 3], [286, 286, 3], [237, 305, 2], [283, 283, 3], [217, 338, 2], [230, 299, 3], [393, 393, 3], [680, 680, 1], [295, 256, 2], [423, 247, 2], [476, 248, 2], [421, 247, 2], [240, 240, 1], [1027, 265, 5], [547, 547, 2], [415, 415, 3], [434, 434, 3], [1030, 281, 5], [1028, 1025, 1], [268, 268, 1], [193, 222, 2], [190, 190, 1], [410, 597, 1], [332, 251, 2], [484, 484, 2], [1041, 388, 2], [352, 349, 2], [436, 710, 2], [1027, 254, 5], [355, 355, 3], [1074, 1074, 4], [153, 153, 2], [287, 287, 3], [1029, 1076, 4], [230, 235, 1], [1039, 262, 4], [276, 276, 4], [1038, 409, 6], [378, 63, 1], [301, 229, 3], [364, 364, 3], [531, 531, 2], [1158, 175, 4], [620, 620, 2], [297, 297, 3], [260, 260, 6], [568, 568, 2], [266, 1064, 1], [253, 253, 1], [235, 230, 1], [76, 76, 1], [444, 315, 2], [291, 291, 2], [1147, 1147, 1], [316, 316, 4], [442, 442, 3], [1038, 403, 6], [258, 258, 1], [188, 334, 2], [269, 1025, 2], [1053, 246, 4], [1030, 284, 3], [341, 341, 4], [317, 317, 4], [217, 362, 2], [448, 448, 3], [1027, 1066, 3], [68, 1136, 1], [195, 195, 3], [1089, 1028, 1], [242, 1105, 1], [1029, 539, 4], [646, 646, 2], [294, 1026, 2], [245, 245, 4], [111, 111, 1], [194, 194, 1], [337, 337, 1], [192, 192, 1], [1064, 266, 1], [449, 449, 3], [622, 622, 2], [1041, 401, 2], [356, 356, 3], [1027, 254, 3], [241, 1070, 1], [1052, 295, 2], [299, 230, 3], [15, 15, 1], [1052, 312, 2], [307, 230, 3], [443, 443, 3], [642, 642, 2], [737, 737, 1], [229, 304, 3], [277, 277, 6], [340, 340, 4], [544, 544, 2], [279, 279, 4], [339, 357, 2], [219, 219, 4], [267, 254, 2], [371, 371, 3], [1086, 1028, 1], [200, 200, 3], [296, 1026, 2], [488, 488, 3], [188, 1055, 2], [249, 249, 3], [1027, 1054, 3], [1052, 314, 2], [363, 329, 2], [213, 213, 2], [188, 338, 2], [188, 1056, 2], [260, 1026, 2], [532, 532, 2], [332, 240, 2], [354, 354, 3], [589, 589, 2], [554, 554, 2], [392, 392, 1], [347, 250, 2], [199, 199, 3], [262, 262, 4], [628, 628, 2], [188, 1094, 2], [439, 248, 2], [1029, 545, 4], [210, 210, 4], [499, 499, 2], [1028, 1062, 1], [302, 302, 3], [1053, 265, 4], [361, 361, 3], [485, 247, 2], [204, 204, 3], [201, 201, 5], [1036, 1036, 3], [366, 366, 2], [343, 280, 2], [277, 1026, 2], [344, 344, 4], [275, 281, 2], [508, 390, 2], [174, 176, 6], [269, 269, 5], [1384, 1384, 2], [246, 1054, 2], [234, 229, 1], [466, 1093, 1], [367, 367, 3], [405, 217, 2], [264, 1068, 1], [196, 196, 4], [298, 298, 2], [1039, 322, 4], [333, 333, 3], [342, 342, 4], [1045, 376, 6], [313, 313, 5], [1027, 1087, 1], [285, 416, 2], [723, 723, 1], [518, 518, 3], [253, 253, 5], [1027, 1090, 1], [232, 205, 1], [230, 307, 3], [292, 292, 1], [229, 234, 1], [188, 327, 2], [1024, 259, 4], [231, 231, 3], [1027, 1115, 1], [382, 368, 2], [188, 328, 2], [1028, 1061, 1], [188, 348, 2], [110, 109, 1], [214, 1033, 2], [502, 502, 1], [369, 267, 2], [1027, 265, 3], [66, 65, 1], [1053, 247, 4], [456, 456, 3], [190, 190, 3], [627, 627, 2], [346, 407, 2], [193, 193, 3], [1063, 254, 4], [460, 460, 3], [1060, 280, 2], [246, 1024, 2], [496, 496, 3], [819, 819, 2], [1041, 414, 2], [214, 357, 2], [1038, 447, 6], [1078, 1078, 2], [375, 267, 2], [229, 301, 3], [370, 256, 2], [1028, 1025, 3], [425, 425, 2], [188, 359, 2], [399, 241, 2], [248, 327, 2], [563, 563, 2], [254, 217, 2], [358, 358, 3], [62, 569, 1], [343, 372, 2], [741, 741, 2], [310, 310, 3], [576, 576, 2], [239, 319, 2], [412, 412, 3], [394, 394, 3], [323, 446, 2], [1068, 264, 1], [1029, 1049, 4], [288, 357, 2], [606, 606, 2], [312, 312, 4], [188, 325, 2], [396, 259, 2], [284, 1026, 2], [1116, 65, 2], [1028, 1062, 3], [475, 475, 1], [239, 319, 1], [1115, 1027, 1], [402, 259, 2], [365, 365, 2], [362, 362, 3], [237, 305, 1], [561, 561, 2], [246, 265, 2], [1081, 1081, 2], [1106, 65, 2], [1066, 1027, 1], [299, 299, 5], [304, 304, 5], [67, 68, 2], [255, 255, 4], [491, 491, 3], [1060, 294, 2], [453, 453, 3], [381, 381, 1], [1030, 281, 1], [1134, 1040, 2], [1028, 1089, 3], [249, 469, 2], [343, 260, 2], [261, 261, 1], [188, 347, 2], [413, 315, 2], [395, 395, 3], [1064, 266, 3], [481, 481, 1], [212, 212, 1], [329, 535, 2], [494, 494, 3], [1047, 174, 5], [276, 276, 1], [1042, 403, 2], [320, 320, 5], [1028, 1061, 3], [380, 380, 3], [1048, 176, 5], [295, 295, 4], [314, 273, 2], [1053, 248, 4], [477, 477, 3], [1042, 409, 2], [457, 321, 2], [398, 321, 2], [687, 687, 2], [1062, 1028, 1], [190, 351, 2], [246, 347, 2], [697, 697, 2], [1060, 296, 2], [214, 375, 2], [1061, 1028, 1], [349, 349, 3], [377, 377, 3], [461, 461, 3], [1025, 174, 4], [1028, 1086, 3], [275, 1026, 2], [284, 284, 6], [190, 196, 2], [216, 285, 2], [307, 307, 5], [459, 259, 2], [70, 305, 1], [258, 258, 5], [335, 335, 1], [188, 405, 2], [1039, 1039, 3], [890, 890, 1], [334, 404, 2], [1072, 265, 4], [326, 242, 1], [328, 328, 4], [454, 331, 1], [1030, 281, 3], [710, 710, 2], [1053, 1036, 4], [268, 268, 4], [745, 745, 2], [58, 58, 1], [289, 289, 1], [1038, 441, 6], [942, 942, 1], [254, 369, 2], [262, 404, 2], [437, 437, 1], [480, 236, 2], [788, 788, 1], [72, 71, 2], [1041, 426, 2], [662, 662, 2], [463, 463, 3], [72, 1139, 1], [833, 833, 2], [520, 520, 2], [794, 794, 2], [632, 632, 2], [203, 203, 1], [1045, 367, 6], [254, 1024, 2], [1096, 251, 4], [1047, 174, 7], [1041, 431, 2], [247, 217, 2], [462, 462, 3], [283, 232, 1], [1109, 256, 4], [400, 400, 2], [70, 1103, 1], [62, 772, 1], [176, 296, 2], [325, 325, 4], [1027, 1054, 1], [489, 489, 3], [574, 574, 2], [16, 17, 1], [1068, 264, 3], [1038, 435, 6], [1028, 251, 7], [262, 417, 2], [348, 1036, 2], [1027, 1054, 5], [214, 267, 2], [1049, 202, 4], [336, 244, 1], [1027, 267, 5], [225, 315, 2], [685, 685, 2], [850, 850, 2], [313, 235, 3], [247, 328, 2], [230, 234, 1], [272, 272, 7], [827, 827, 1], [1025, 176, 4], [323, 446, 1], [220, 220, 3], [836, 836, 2], [501, 501, 3], [288, 201, 2], [265, 347, 2], [1048, 176, 7], [471, 471, 3], [60, 1163, 1], [333, 339, 2], [269, 273, 2], [1027, 1087, 3], [174, 294, 2], [301, 301, 5], [314, 314, 4], [526, 526, 1], [671, 671, 2], [601, 601, 2], [1121, 61, 2], [331, 454, 1], [390, 390, 3], [360, 281, 2], [378, 63, 2], [626, 626, 2], [1027, 1090, 3], [387, 387, 3], [570, 570, 1], [247, 334, 2], [1027, 267, 3], [214, 1050, 2], [402, 327, 2], [244, 336, 1], [174, 193, 2], [1025, 370, 4], [217, 329, 2], [555, 555, 2], [594, 594, 2], [246, 248, 2], [551, 551, 1], [285, 216, 2], [107, 106, 1], [379, 190, 2], [198, 198, 3], [234, 230, 1], [176, 193, 2], [521, 521, 2], [217, 1024, 2], [1060, 275, 2], [479, 479, 3], [280, 280, 5], [265, 265, 4], [338, 417, 2], [70, 305, 2], [619, 619, 2], [249, 495, 2], [1045, 354, 6], [468, 468, 3], [366, 188, 2], [652, 652, 2], [1070, 241, 1], [608, 608, 2], [1030, 294, 1], [235, 313, 3], [1038, 458, 6], [1045, 397, 6], [1028, 1061, 5], [322, 448, 2], [1030, 296, 1], [369, 257, 2], [1027, 1069, 3], [695, 695, 2], [522, 522, 2], [1027, 1067, 3], [427, 427, 2], [1443, 1443, 2], [1141, 239, 1], [238, 238, 1], [99, 100, 1], [1042, 447, 2], [326, 242, 2], [1098, 376, 2], [1116, 64, 2], [1028, 1062, 5], [320, 234, 3], [430, 309, 2], [1140, 339, 4], [267, 267, 1], [559, 559, 3], [384, 384, 3], [649, 649, 2], [604, 604, 2], [281, 275, 2], [277, 277, 7], [1045, 358, 6], [319, 239, 1], [225, 309, 2], [175, 175, 1], [304, 229, 2], [365, 188, 2], [493, 307, 2], [285, 416, 1], [1162, 352, 4], [247, 1024, 2], [372, 343, 2], [473, 473, 3], [66, 205, 1], [523, 523, 2], [586, 586, 2], [474, 474, 3], [889, 61, 1], [1047, 1047, 1], [504, 504, 1], [261, 261, 5], [469, 249, 2], [596, 596, 2], [235, 324, 3], [359, 448, 2], [466, 667, 1], [260, 1083, 2], [363, 363, 1], [190, 353, 2], [817, 817, 1], [590, 590, 2], [112, 112, 1], [399, 399, 3], [1026, 193, 1], [1148, 71, 2], [593, 593, 2], [273, 314, 2], [312, 272, 2], [318, 318, 5], [246, 246, 1], [451, 252, 2], [1121, 62, 2], [577, 352, 2], [517, 517, 3], [610, 610, 2], [260, 343, 2], [1042, 435, 2], [247, 1067, 2], [254, 254, 4], [272, 312, 2], [1025, 332, 4], [1098, 354, 2], [259, 396, 2], [1143, 265, 4], [229, 304, 2], [330, 433, 2], [684, 684, 2], [266, 500, 2], [262, 553, 2], [1060, 260, 2], [256, 370, 2], [582, 582, 2], [248, 338, 2], [428, 264, 2], [422, 323, 1], [464, 464, 3], [820, 820, 1], [236, 236, 5], [1030, 294, 5], [1042, 441, 2], [210, 252, 2], [497, 497, 1], [598, 598, 2], [1026, 174, 4], [248, 1024, 2], [336, 244, 2], [72, 805, 1], [394, 394, 1], [486, 486, 3], [498, 498, 3], [271, 271, 1], [410, 637, 1], [228, 228, 5], [1090, 1027, 1], [656, 656, 2], [376, 289, 2], [954, 954, 1], [234, 320, 3], [267, 217, 2], [248, 217, 2], [1027, 1079, 1], [1033, 1073, 3], [527, 527, 3], [1111, 1111, 2], [216, 289, 2], [484, 484, 3], [492, 492, 3], [378, 569, 2], [359, 1039, 2], [258, 327, 2], [418, 300, 2], [668, 478, 1], [273, 269, 2], [1105, 1105, 1], [267, 1024, 2], [423, 423, 3], [262, 490, 2], [510, 510, 3], [1028, 1159, 1], [230, 230, 7], [248, 1069, 2], [1060, 277, 2], [245, 370, 2], [373, 337, 2], [605, 605, 2], [1282, 73, 2], [388, 190, 2], [201, 288, 2], [612, 612, 2], [482, 482, 3], [792, 609, 2], [254, 1063, 2], [689, 689, 2], [1030, 296, 5], [229, 235, 1], [1030, 1026, 3], [424, 424, 3], [326, 444, 1], [565, 565, 2], [640, 640, 2], [1087, 1027, 1], [235, 229, 1], [109, 108, 1], [406, 406, 1], [584, 584, 2], [1310, 61, 2], [385, 360, 2], [588, 588, 2], [585, 585, 2], [663, 663, 2], [1048, 1048, 1], [368, 368, 1], [319, 465, 1], [348, 276, 2], [696, 696, 2], [1184, 1027, 1], [775, 775, 1], [467, 467, 3], [346, 346, 1], [1036, 259, 4], [323, 422, 1], [1186, 1027, 1], [459, 459, 3], [1042, 458, 2], [28, 27, 1], [240, 251, 2], [227, 321, 2], [407, 371, 2], [421, 421, 3], [329, 363, 2], [587, 587, 2], [324, 324, 5], [1054, 1027, 1], [470, 470, 3], [265, 325, 2], [1028, 1160, 1], [1029, 202, 1], [398, 300, 2], [1156, 315, 4], [548, 548, 1], [71, 392, 1], [273, 1025, 2], [1075, 251, 4], [294, 284, 2], [1060, 284, 2], [262, 268, 2], [413, 309, 2], [546, 546, 3], [332, 269, 2], [600, 600, 2], [419, 419, 3], [235, 230, 2], [102, 101, 1], [533, 533, 3], [661, 661, 2], [246, 246, 4], [270, 270, 5], [1098, 367, 2], [208, 208, 3], [1024, 1027, 1], [176, 174, 7], [432, 288, 2], [505, 301, 2], [1075, 256, 4], [216, 216, 5], [724, 724, 2], [251, 1025, 2], [1057, 217, 4], [669, 669, 2], [396, 328, 2], [277, 296, 2], [247, 485, 2], [507, 507, 2], [1027, 1097, 1], [234, 229, 2], [330, 433, 1], [1064, 1064, 1], [1098, 358, 2], [305, 237, 2], [257, 257, 4], [254, 362, 2], [1123, 1123, 2], [410, 680, 1], [1157, 249, 6], [571, 249, 2], [284, 294, 2], [634, 454, 1], [624, 624, 2], [205, 66, 1], [439, 439, 3], [323, 422, 2], [1085, 1085, 2], [629, 629, 2], [444, 326, 1], [254, 267, 2], [503, 304, 2], [193, 360, 2], [438, 438, 1], [247, 214, 2], [65, 64, 1], [1070, 241, 3], [480, 480, 3], [307, 493, 2], [266, 493, 2], [579, 579, 2], [591, 591, 2], [353, 353, 2], [265, 214, 2], [256, 1062, 2], [296, 277, 2], [227, 300, 2], [130, 130, 2], [251, 1061, 2], [232, 283, 2], [295, 295, 5], [854, 854, 1], [401, 190, 2], [1054, 246, 4], [68, 212, 1], [28, 29, 1], [1028, 1130, 1], [797, 797, 2], [265, 1024, 2], [1031, 1029, 3], [299, 230, 2], [541, 541, 3], [472, 472, 1], [201, 214, 2], [372, 372, 2], [269, 332, 2], [557, 557, 3], [128, 635, 1], [259, 188, 2], [67, 1100, 1], [253, 253, 6], [202, 653, 2], [440, 308, 2], [248, 214, 2], [476, 476, 3], [414, 190, 2], [230, 299, 2], [63, 62, 1], [1202, 217, 6], [272, 1025, 2], [341, 341, 2], [1028, 1165, 1], [334, 271, 2], [229, 234, 2], [442, 442, 1], [495, 249, 2], [232, 283, 1], [923, 923, 2], [1026, 176, 4], [256, 1025, 2], [568, 348, 2], [483, 483, 3], [322, 1039, 2], [433, 330, 1], [412, 1049, 2], [229, 301, 2], [382, 382, 3], [1027, 1067, 1], [665, 665, 2], [436, 436, 3], [357, 339, 2], [1028, 1129, 1], [529, 529, 3], [202, 651, 2], [747, 747, 2], [18, 17, 1], [1159, 1028, 1], [252, 451, 2], [1060, 281, 2], [175, 175, 5], [971, 971, 1], [234, 318, 3], [564, 564, 2], [505, 266, 2], [434, 434, 1], [217, 405, 2], [625, 625, 2], [67, 66, 1], [1160, 1028, 1], [499, 499, 3], [212, 68, 1], [445, 445, 4], [26, 27, 1], [615, 615, 2], [884, 884, 1], [324, 235, 3], [676, 676, 2], [1058, 214, 4], [255, 255, 1], [1027, 1069, 1], [375, 1036, 2], [193, 343, 2], [344, 344, 2], [259, 402, 2], [307, 230, 2], [281, 360, 2], [392, 71, 1], [247, 246, 2], [500, 266, 2], [275, 275, 6], [321, 398, 1], [250, 250, 4], [466, 723, 1], [525, 525, 3], [239, 200, 2], [519, 320, 2], [72, 570, 1], [374, 374, 1], [267, 369, 2], [248, 246, 2], [337, 524, 2], [602, 602, 2], [69, 69, 3], [856, 856, 1], [319, 446, 1], [331, 243, 2], [281, 1026, 2], [457, 326, 1], [240, 240, 5], [241, 241, 5], [190, 453, 2], [351, 351, 2], [209, 209, 3], [23, 24, 1], [273, 273, 7], [540, 540, 3], [1121, 1121, 2], [715, 715, 2], [244, 336, 2], [631, 631, 2], [1030, 294, 3], [216, 196, 2], [188, 196, 2], [575, 575, 3], [550, 339, 2], [491, 491, 2], [190, 449, 2], [1116, 1116, 2], [1030, 296, 3], [205, 194, 1], [1027, 1079, 3], [729, 729, 1], [331, 243, 1], [256, 245, 2], [1059, 349, 4], [285, 322, 2], [613, 613, 2], [270, 270, 1], [549, 549, 2], [199, 242, 2], [939, 939, 2], [1024, 369, 4], [1028, 1132, 1], [1073, 1040, 1], [276, 348, 2], [201, 249, 2], [1167, 332, 4], [278, 278, 1], [403, 193, 2], [503, 264, 2], [239, 200, 1], [1111, 71, 2], [1029, 1029, 1], [327, 258, 2], [496, 496, 4], [271, 271, 5], [294, 174, 2], [444, 315, 1], [279, 279, 5], [312, 312, 5], [514, 514, 3], [301, 229, 2], [249, 201, 2], [425, 425, 3], [329, 322, 2], [478, 668, 1], [326, 457, 1], [452, 452, 1], [892, 892, 1], [1148, 73, 2], [338, 338, 4], [1166, 325, 4], [357, 288, 2], [272, 295, 2], [903, 903, 1], [138, 660, 1], [843, 843, 1], [362, 563, 2], [335, 335, 3], [1165, 1028, 1], [102, 103, 1], [409, 193, 2], [74, 1593, 1], [236, 219, 2], [334, 534, 2], [412, 367, 2], [290, 223, 2], [799, 799, 2], [512, 299, 2], [1075, 272, 4], [370, 370, 4], [488, 488, 4], [398, 321, 1], [284, 284, 7], [104, 103, 1], [896, 896, 1], [617, 617, 2], [443, 443, 4], [688, 688, 2], [1070, 1070, 4], [738, 738, 2], [99, 98, 1], [418, 418, 3], [254, 247, 2], [230, 235, 2], [391, 391, 4], [1040, 217, 6], [66, 194, 1], [766, 766, 2], [253, 328, 2], [389, 389, 4], [1046, 322, 4], [272, 256, 2], [245, 256, 2], [318, 234, 3], [897, 897, 2], [528, 528, 3], [1075, 273, 4], [246, 214, 2], [397, 202, 2], [280, 343, 2], [487, 487, 3], [633, 633, 2], [1036, 1053, 4], [260, 343, 3], [60, 1693, 1], [69, 70, 2], [296, 176, 2], [232, 232, 3], [274, 274, 2], [107, 108, 1], [542, 214, 2], [243, 331, 1], [1270, 466, 1], [1106, 1106, 2], [621, 621, 2], [363, 363, 3], [188, 421, 2], [675, 675, 2], [203, 203, 3], [212, 237, 1], [1027, 365, 1], [201, 325, 2], [1152, 254, 7], [1191, 378, 4], [426, 190, 2], [244, 309, 2], [251, 240, 2], [1075, 269, 4], [516, 516, 3], [249, 367, 2], [1080, 267, 4], [816, 816, 2], [188, 424, 2], [314, 314, 5], [518, 518, 4], [1044, 1024, 4], [1068, 1068, 1], [327, 327, 4], [285, 216, 1], [199, 242, 1], [1027, 1067, 5], [592, 481, 2], [508, 508, 1], [513, 513, 2], [313, 313, 6], [248, 476, 2], [252, 210, 2], [1028, 379, 1], [328, 253, 2], [76, 75, 1], [340, 340, 5], [792, 792, 2], [469, 469, 3], [618, 618, 2], [404, 262, 2], [512, 264, 2], [405, 405, 3], [246, 247, 2], [1178, 304, 4], [931, 931, 1], [1152, 248, 7], [58, 59, 1], [229, 229, 7], [294, 275, 2], [1057, 329, 4], [280, 277, 2], [765, 765, 2], [475, 371, 2], [446, 319, 1], [386, 386, 1], [1152, 247, 7], [603, 603, 3], [1138, 322, 4], [429, 429, 3], [422, 323, 2], [305, 237, 1], [493, 266, 2], [558, 214, 2], [536, 536, 3], [465, 330, 2], [210, 252, 1], [636, 636, 2], [273, 251, 2], [230, 307, 2], [419, 310, 2], [255, 352, 2], [1033, 262, 6], [362, 279, 2], [248, 424, 2], [315, 413, 1], [1027, 1069, 5], [720, 720, 2], [431, 190, 2], [1027, 1097, 3], [435, 193, 2], [296, 260, 2], [498, 264, 2], [334, 1039, 2], [573, 573, 2], [315, 413, 2], [782, 782, 2], [216, 268, 2], [200, 239, 1], [383, 383, 4], [760, 660, 1], [908, 908, 1], [1028, 1179, 1], [342, 342, 5], [347, 347, 1], [449, 449, 4], [519, 264, 2], [742, 742, 2], [188, 375, 2], [494, 494, 4], [266, 505, 2], [373, 373, 3], [807, 807, 2], [325, 201, 2], [485, 485, 3], [254, 1044, 2], [356, 356, 1], [456, 456, 4], [64, 1124, 1], [346, 346, 3], [691, 691, 1], [294, 260, 2], [537, 537, 3], [277, 280, 2], [454, 634, 1], [1148, 1148, 2], [254, 248, 2], [566, 566, 3], [196, 201, 2], [355, 355, 1], [256, 272, 2], [440, 308, 1], [328, 396, 2], [647, 430, 1], [255, 201, 2], [189, 189, 2], [698, 698, 2], [268, 262, 2], [460, 460, 4], [257, 369, 2], [1076, 1076, 4], [1183, 307, 4], [225, 195, 2], [316, 316, 5], [1190, 299, 4], [288, 288, 4], [1024, 362, 4], [1285, 317, 4], [374, 258, 2], [265, 217, 2], [266, 538, 2], [552, 552, 2], [1027, 1126, 1], [245, 258, 2], [275, 360, 2], [190, 477, 2], [1155, 210, 4], [304, 503, 2], [556, 556, 3], [62, 64, 1], [278, 278, 5], [294, 403, 2], [128, 127, 1], [417, 262, 2], [251, 332, 3], [942, 597, 1], [1046, 262, 4], [645, 645, 2], [351, 351, 5], [376, 376, 3], [261, 406, 2], [433, 330, 2], [658, 658, 2], [898, 898, 2], [757, 757, 2], [1026, 222, 4], [364, 258, 2], [696, 289, 2], [360, 275, 2], [1028, 388, 1], [176, 174, 6], [1513, 106, 2], [314, 1025, 2], [234, 320, 4], [226, 308, 2], [741, 578, 2], [644, 644, 2], [501, 501, 4], [1130, 1028, 1], [202, 196, 2], [70, 71, 2], [247, 421, 2], [295, 272, 2], [1075, 295, 4], [273, 256, 2], [1027, 366, 1], [129, 679, 1], [301, 505, 2], [1067, 1027, 1], [202, 241, 2], [1118, 281, 5], [441, 193, 2], [1053, 267, 4], [1154, 283, 4], [260, 296, 2], [1074, 252, 3], [312, 1025, 2], [385, 385, 3], [523, 523, 3], [230, 299, 4], [181, 192, 1], [18, 19, 1], [338, 1039, 2], [202, 352, 2], [1174, 321, 4], [427, 293, 2], [216, 279, 2], [378, 283, 2], [16, 15, 1], [327, 402, 2], [1069, 1027, 1], [400, 400, 3], [453, 453, 4], [242, 199, 1], [246, 348, 2], [1050, 1050, 3], [276, 276, 5], [411, 411, 4], [269, 1084, 2], [190, 491, 2], [393, 393, 4], [217, 254, 2], [413, 315, 1], [498, 313, 2], [353, 353, 5], [227, 300, 1], [70, 69, 2], [1152, 265, 7], [714, 714, 2], [1024, 334, 4], [718, 718, 2], [311, 311, 2], [412, 241, 2], [219, 219, 5], [452, 451, 2], [1028, 1226, 1], [446, 323, 1], [229, 304, 4], [260, 294, 2], [333, 333, 1], [1049, 1059, 4], [230, 234, 2], [416, 285, 2], [1192, 236, 4], [65, 65, 3], [595, 217, 2], [1223, 235, 4], [67, 67, 3], [522, 522, 3], [68, 237, 1], [961, 961, 2], [793, 793, 2], [1117, 262, 4], [504, 382, 2], [265, 405, 2], [368, 335, 2], [1028, 1219, 1], [299, 299, 6], [510, 339, 2], [520, 520, 3], [259, 259, 1], [398, 300, 1], [369, 459, 2], [1027, 1063, 3], [249, 354, 2], [490, 490, 3], [252, 1074, 1], [336, 430, 1], [337, 337, 3], [1024, 325, 4], [272, 251, 2], [458, 193, 2], [195, 244, 2], [442, 258, 2], [1141, 1141, 1], [245, 245, 5], [1129, 1028, 1], [217, 248, 2], [359, 359, 4], [222, 193, 2], [30, 29, 1], [1031, 289, 5], [659, 659, 2], [1586, 22, 2], [285, 285, 4], [334, 628, 2], [462, 462, 4], [217, 247, 2], [1181, 1027, 1], [314, 251, 2], [1042, 174, 2], [690, 690, 2], [531, 531, 3], [1027, 345, 1], [1529, 100, 2], [324, 538, 2], [417, 338, 2], [197, 221, 2], [280, 277, 1], [229, 235, 2], [350, 350, 3], [215, 215, 3], [1119, 1119, 4], [225, 309, 1], [296, 275, 2], [1024, 1056, 4], [226, 323, 2], [292, 292, 3], [415, 415, 4], [105, 106, 1], [246, 1046, 2], [174, 190, 2], [205, 66, 2], [289, 627, 2], [1024, 338, 4], [72, 1003, 1], [234, 230, 2], [699, 699, 2], [727, 727, 2], [1030, 1026, 1], [201, 375, 2], [214, 1036, 3], [210, 317, 2], [712, 712, 2], [713, 713, 2], [1503, 17, 2], [495, 495, 3], [438, 266, 1], [1075, 314, 4], [305, 70, 1], [1132, 1028, 1], [635, 408, 1], [296, 409, 2], [457, 321, 1], [265, 1072, 2], [716, 716, 2], [277, 280, 1], [328, 188, 2], [261, 261, 6], [500, 500, 3], [247, 254, 2], [198, 243, 2], [434, 253, 2], [175, 175, 6], [429, 279, 2], [249, 358, 2], [247, 423, 2], [228, 228, 1], [250, 196, 2], [419, 310, 1], [355, 355, 4], [240, 253, 2], [425, 284, 2], [1198, 66, 2], [63, 378, 1], [489, 489, 4], [521, 521, 3], [1057, 1057, 3], [1042, 176, 2], [193, 174, 4], [673, 673, 2], [396, 361, 2], [149, 149, 2], [259, 1058, 3], [756, 756, 2], [313, 235, 4], [364, 402, 2], [332, 190, 2], [583, 217, 2], [327, 188, 2], [465, 330, 1], [1038, 1038, 1], [1082, 1082, 4], [202, 436, 2], [464, 464, 1], [666, 666, 2], [1098, 397, 2], [256, 273, 2], [268, 216, 2], [1088, 275, 4], [1083, 260, 5], [269, 312, 2], [291, 291, 3], [1024, 348, 4], [1224, 200, 1], [1100, 1100, 2], [1024, 1055, 4], [972, 972, 1], [620, 480, 2], [381, 381, 4], [248, 254, 2], [1028, 1130, 3], [532, 532, 3], [1196, 301, 4], [722, 827, 1], [318, 266, 1], [543, 543, 1], [791, 791, 2], [294, 281, 2], [468, 468, 4], [374, 374, 4], [264, 428, 1], [190, 479, 2], [26, 25, 1], [1075, 312, 4], [473, 473, 4], [1025, 196, 4], [735, 735, 2], [1052, 379, 2], [544, 544, 3], [210, 241, 2], [404, 334, 2], [1049, 352, 4], [356, 356, 4], [1031, 1029, 1], [1243, 1027, 1], [472, 472, 3], [276, 201, 2], [248, 439, 2], [110, 111, 1], [1028, 1146, 1], [1211, 309, 4], [227, 321, 1], [345, 345, 3], [390, 577, 2], [1024, 405, 4], [506, 506, 3], [380, 380, 4], [511, 511, 3], [304, 229, 4], [1232, 234, 4], [202, 316, 2], [230, 307, 4], [904, 904, 2], [1120, 235, 6], [70, 70, 3], [889, 889, 1], [1030, 1168, 1], [887, 887, 2], [1024, 347, 4], [329, 514, 2], [1041, 174, 2], [1040, 214, 6], [164, 164, 2], [222, 222, 3], [440, 440, 3], [267, 1080, 2], [1382, 478, 2], [554, 554, 3], [559, 559, 4], [1041, 332, 2], [407, 407, 1], [810, 810, 2], [1059, 1059, 4], [527, 527, 4], [193, 176, 4], [692, 692, 2], [336, 478, 1], [155, 155, 2], [1028, 1129, 3], [242, 315, 1], [822, 822, 2], [1024, 359, 4], [1106, 66, 2], [1308, 454, 2], [69, 68, 1], [463, 241, 2], [188, 423, 2], [243, 300, 2], [272, 1091, 2], [196, 250, 2], [361, 253, 2], [1036, 1044, 4], [1219, 1028, 1], [1041, 1278, 2], [1195, 347, 4], [176, 190, 2], [805, 805, 1], [1002, 1002, 1], [461, 461, 1], [1179, 1028, 1], [289, 436, 2], [474, 296, 2], [320, 234, 4], [1027, 350, 1], [1045, 1029, 1], [1077, 68, 2], [1028, 1092, 1], [1103, 1103, 2], [202, 317, 2], [272, 216, 2], [195, 226, 2], [256, 312, 2], [260, 277, 2], [487, 487, 1], [1074, 252, 1], [341, 341, 5], [1028, 1132, 3], [1028, 1169, 1], [420, 420, 2], [251, 273, 2], [403, 294, 2], [516, 325, 2], [802, 802, 2], [471, 241, 2], [284, 281, 2], [229, 301, 4], [589, 589, 1], [299, 512, 2], [188, 1110, 2], [288, 432, 2], [339, 333, 2], [483, 258, 2], [1228, 338, 4], [529, 529, 4], [20, 19, 1], [371, 475, 2], [305, 305, 3], [1088, 281, 4], [584, 422, 1], [726, 726, 2], [1291, 316, 4], [283, 378, 1], [598, 550, 2], [64, 63, 2], [216, 217, 2], [343, 280, 3], [560, 560, 3], [1025, 1028, 1], [1058, 1058, 3], [447, 193, 2], [601, 601, 1], [306, 306, 3], [470, 253, 2], [1139, 1139, 2], [312, 256, 2], [482, 294, 2], [264, 503, 2], [481, 481, 3], [220, 220, 1], [235, 230, 3], [282, 282, 3], [465, 319, 1], [1134, 259, 2], [1028, 1091, 1], [1260, 428, 4], [240, 332, 3], [300, 398, 1], [1105, 326, 1], [467, 467, 4], [1031, 289, 1], [1460, 109, 2], [216, 272, 2], [996, 996, 1], [174, 176, 5], [307, 307, 6], [446, 323, 2], [322, 534, 2], [201, 255, 2], [1027, 1063, 5], [231, 310, 2], [535, 646, 2], [205, 232, 2], [231, 330, 2], [279, 257, 2], [295, 370, 2], [736, 736, 2], [1088, 294, 4], [706, 706, 2], [252, 210, 1], [772, 772, 1], [298, 298, 3], [1084, 1028, 1], [190, 562, 2], [277, 260, 2], [546, 546, 4], [778, 778, 2], [524, 346, 2], [647, 478, 1], [214, 542, 2], [269, 314, 2], [284, 275, 2], [1028, 1173, 1], [477, 477, 4], [569, 569, 1], [409, 296, 2], [1028, 1084, 1], [191, 191, 1], [1024, 327, 4], [318, 234, 4], [349, 1029, 2], [515, 515, 3], [379, 314, 2], [604, 604, 1], [250, 347, 2], [357, 357, 1], [196, 216, 2], [416, 285, 1], [1226, 1028, 1], [235, 229, 2], [269, 272, 2], [509, 509, 3], [1267, 398, 1], [1092, 1028, 1], [188, 439, 2], [196, 257, 2], [786, 786, 2], [1036, 325, 4], [377, 377, 4], [463, 317, 2], [349, 352, 2], [173, 173, 2], [555, 555, 3], [242, 321, 1], [62, 843, 1], [243, 331, 2], [228, 228, 6], [423, 254, 2], [466, 100, 1], [225, 315, 1], [399, 794, 2], [266, 324, 1], [355, 253, 2], [320, 320, 6], [1033, 1033, 3], [315, 225, 2], [866, 866, 2], [275, 284, 2], [326, 1312, 1], [24, 25, 1], [1088, 260, 4], [264, 498, 2], [1112, 1031, 1], [406, 406, 4], [392, 71, 2], [204, 204, 4], [1343, 410, 1], [588, 430, 1], [239, 1141, 1], [806, 806, 2], [275, 296, 2], [177, 177, 2], [785, 785, 2], [1024, 328, 4], [1088, 296, 4], [611, 611, 1], [484, 484, 4], [214, 558, 2], [329, 536, 2], [322, 547, 2], [235, 313, 4], [211, 211, 2], [1206, 343, 4], [266, 318, 1], [1361, 185, 1], [1045, 1045, 1], [362, 362, 1], [244, 308, 2], [251, 272, 2], [360, 385, 3], [286, 286, 4], [1028, 190, 5], [421, 246, 2], [1027, 1072, 3], [1175, 323, 4], [1290, 410, 2], [1041, 176, 2], [537, 402, 2], [525, 525, 2], [885, 885, 2], [570, 73, 1], [413, 309, 1], [1088, 280, 4], [14, 15, 1], [1031, 249, 1], [1026, 1026, 1], [280, 296, 2], [1040, 246, 6], [304, 304, 6], [1088, 277, 4], [609, 609, 3], [202, 342, 2], [383, 383, 1], [395, 395, 4], [424, 246, 2], [519, 519, 3], [389, 230, 2], [241, 210, 2], [267, 214, 2], [268, 250, 2], [332, 1096, 2], [138, 139, 1], [1091, 1028, 1], [528, 396, 2], [1031, 1112, 3], [259, 459, 2], [105, 104, 1], [902, 902, 2], [297, 297, 4], [1052, 388, 2], [448, 448, 1], [293, 293, 3], [479, 479, 4], [64, 64, 3], [314, 269, 2], [236, 236, 6], [257, 196, 2], [314, 379, 2], [201, 201, 6], [284, 425, 2], [388, 312, 2], [329, 646, 2], [528, 339, 2], [1154, 283, 1], [968, 968, 2], [1031, 1220, 1], [275, 294, 2], [376, 436, 2], [1088, 284, 4], [287, 287, 4], [193, 443, 2], [386, 386, 3], [648, 217, 2], [1039, 359, 4], [216, 285, 1], [557, 557, 4], [271, 271, 6], [580, 580, 3], [1079, 1027, 1], [476, 476, 1], [1125, 234, 6], [331, 418, 1], [1035, 370, 6], [1052, 401, 2], [1035, 174, 6], [433, 310, 1], [1148, 72, 2], [326, 315, 1], [526, 63, 1], [537, 339, 2], [1015, 1015, 1], [194, 212, 1], [511, 348, 2], [99, 737, 1], [592, 592, 1], [1140, 1140, 4], [273, 1092, 2], [364, 364, 4], [280, 294, 2], [257, 255, 2], [308, 422, 1], [244, 309, 1], [530, 530, 3], [301, 229, 4], [517, 517, 4], [202, 340, 2], [190, 456, 2], [1193, 288, 4], [449, 256, 2], [1035, 176, 6], [567, 567, 3], [101, 100, 1], [264, 512, 2], [1051, 1051, 3], [1213, 270, 4], [405, 265, 2], [882, 882, 2], [578, 347, 2], [1025, 351, 4], [235, 324, 4], [655, 217, 2], [261, 393, 2], [507, 248, 2], [1632, 108, 2], [1044, 254, 4], [245, 381, 2], [1136, 1136, 2], [344, 344, 5], [561, 398, 1], [349, 249, 2], [452, 451, 1], [272, 269, 2], [281, 284, 2], [626, 626, 3], [804, 804, 2], [1204, 334, 4], [1158, 1158, 4], [963, 963, 2], [1058, 254, 4], [193, 234, 2], [299, 230, 4], [533, 533, 4], [770, 770, 2], [281, 294, 2], [352, 255, 2], [267, 375, 2], [593, 497, 2], [312, 269, 2], [258, 374, 2], [279, 216, 2], [840, 840, 2], [875, 875, 2], [242, 199, 2], [307, 230, 4], [416, 579, 1], [749, 749, 2], [624, 289, 2], [1027, 345, 5], [1027, 1126, 3], [229, 229, 1], [1617, 1617, 2], [393, 261, 2], [1384, 181, 2], [208, 208, 1], [338, 547, 2], [368, 368, 3], [242, 1093, 1], [1231, 300, 4], [485, 485, 1], [280, 1038, 2], [237, 69, 1], [552, 256, 2], [562, 562, 2], [317, 210, 2], [318, 301, 1], [213, 213, 3], [416, 579, 2], [308, 440, 1], [1026, 360, 4], [201, 276, 2], [1123, 410, 2], [683, 683, 2], [848, 848, 2], [384, 384, 4], [405, 701, 2], [214, 345, 2], [654, 654, 2], [483, 288, 2], [205, 232, 1], [331, 419, 1], [439, 254, 2], [1170, 260, 4], [190, 341, 2], [675, 375, 2], [838, 838, 2], [68, 68, 3], [333, 288, 2], [475, 662, 2], [98, 98, 1], [1027, 350, 5], [565, 565, 3], [469, 354, 2], [245, 387, 2], [1028, 1092, 5], [1244, 66, 2], [1141, 319, 1], [1124, 1124, 2], [281, 1118, 2], [249, 571, 2], [330, 465, 1], [502, 502, 3], [508, 390, 1], [872, 872, 2], [480, 399, 2], [722, 137, 1], [400, 277, 2], [470, 470, 1], [474, 474, 4], [1036, 1073, 4], [1042, 222, 2], [1027, 1072, 5], [338, 261, 2], [553, 262, 2], [217, 322, 1], [201, 253, 2], [303, 303, 2], [513, 247, 2], [597, 410, 1], [1027, 1063, 1], [201, 196, 2], [445, 445, 5], [307, 324, 1], [193, 482, 2], [1046, 246, 4], [326, 321, 1], [251, 314, 2], [890, 634, 1], [182, 218, 1], [1028, 379, 5], [575, 575, 4], [1052, 414, 2], [230, 1099, 3], [1031, 289, 3], [309, 244, 1], [190, 523, 2], [336, 440, 1], [300, 418, 1], [842, 842, 2], [296, 280, 2], [578, 246, 2], [372, 343, 3], [1029, 653, 4], [271, 334, 2], [490, 262, 2], [207, 207, 3], [234, 391, 3], [637, 884, 1], [561, 418, 1], [450, 294, 2], [240, 354, 2], [210, 316, 2], [260, 284, 2], [245, 196, 2], [437, 250, 2], [1030, 1187, 1], [767, 767, 2], [823, 823, 2], [201, 273, 2], [314, 256, 2], [359, 267, 2], [549, 247, 2], [348, 188, 2], [873, 873, 2], [363, 268, 2], [1055, 1055, 3], [63, 61, 1], [1199, 330, 4], [776, 776, 2], [200, 239, 2], [433, 310, 2], [1403, 286, 4], [234, 229, 3], [301, 318, 1], [313, 313, 7], [284, 260, 2], [1029, 651, 4], [1288, 1027, 1], [219, 228, 2], [538, 266, 2], [1096, 1096, 4], [195, 226, 1], [205, 205, 3], [353, 353, 6], [258, 364, 2], [828, 828, 2], [585, 422, 1], [607, 607, 2], [652, 652, 3], [1182, 237, 4], [1030, 1188, 1], [397, 397, 3], [295, 1025, 2], [1028, 1084, 5], [404, 514, 2], [361, 361, 4], [471, 316, 2], [535, 535, 3], [265, 1044, 2], [339, 510, 2], [1177, 285, 4], [261, 338, 2], [863, 863, 2], [488, 488, 2], [321, 227, 2], [499, 499, 4], [312, 251, 2], [462, 260, 2], [62, 378, 1], [1038, 174, 6], [847, 847, 2], [455, 296, 2], [1113, 1113, 4], [217, 188, 1], [1207, 327, 4], [242, 315, 2], [511, 325, 2], [1218, 275, 7], [240, 394, 2], [324, 235, 4], [631, 289, 2], [1028, 1091, 5], [74, 1740, 1], [650, 650, 2], [466, 444, 1], [1040, 254, 6], [279, 429, 2], [640, 640, 3], [2060, 182, 1], [225, 225, 4], [269, 273, 1], [614, 214, 2], [1027, 1072, 1], [198, 243, 1], [564, 564, 3], [453, 251, 2], [617, 289, 2], [561, 788, 1], [190, 525, 2], [306, 306, 1], [1097, 1027, 1], [1169, 1028, 1], [302, 302, 4], [582, 419, 1], [188, 254, 1], [294, 280, 2], [496, 236, 2], [256, 449, 2], [491, 491, 4], [279, 362, 2], [1028, 1092, 3], [1331, 430, 1], [309, 244, 2], [674, 674, 2], [63, 64, 2], [964, 964, 2], [1040, 247, 6], [1027, 1080, 3], [1121, 1264, 2], [310, 419, 1], [1028, 1091, 3], [443, 443, 5], [1031, 349, 1], [193, 460, 2], [270, 270, 6], [1054, 217, 4], [1045, 539, 6], [251, 453, 2], [197, 223, 2], [1028, 1169, 3], [235, 1120, 2], [372, 260, 2], [196, 245, 2], [229, 1102, 3], [20, 21, 1], [1056, 1056, 3], [296, 281, 2], [176, 174, 5], [1282, 1282, 2], [63, 1116, 1], [256, 314, 2], [638, 638, 2], [312, 388, 2], [1028, 379, 3], [1057, 246, 4], [1252, 275, 6], [486, 252, 2], [323, 226, 2], [265, 247, 2], [273, 269, 1], [492, 252, 2], [234, 318, 4], [1109, 1109, 4], [764, 764, 2], [494, 494, 2], [241, 210, 1], [1031, 1354, 1], [190, 344, 2], [190, 567, 2], [573, 248, 2], [637, 410, 1], [955, 955, 2], [194, 194, 3], [647, 892, 1], [214, 350, 2], [275, 1150, 2], [351, 351, 6], [361, 396, 2], [268, 363, 2], [261, 356, 2], [209, 209, 1], [230, 235, 3], [265, 248, 2], [333, 577, 2], [970, 970, 2], [245, 358, 2], [1042, 277, 6], [301, 301, 6], [1041, 272, 6], [1028, 1173, 3], [599, 599, 3], [214, 201, 2], [1262, 1047, 4], [1031, 1112, 1], [174, 1378, 2], [69, 237, 1], [702, 166, 2], [373, 526, 2], [294, 277, 2], [190, 560, 2], [380, 380, 1], [694, 694, 2], [432, 288, 1], [643, 643, 2], [343, 193, 2], [268, 497, 2], [636, 418, 1], [859, 859, 2], [1028, 1084, 3], [227, 227, 4], [76, 77, 1], [711, 711, 2], [988, 988, 2], [324, 307, 1], [275, 385, 2], [334, 334, 4], [1422, 287, 4], [503, 503, 3], [271, 383, 2], [1152, 267, 7], [1173, 1028, 1], [71, 73, 1], [390, 508, 1], [1222, 328, 4], [1033, 369, 6], [235, 313, 2], [584, 440, 1], [273, 201, 2], [541, 541, 4], [30, 30, 1], [241, 399, 2], [373, 687, 2], [1248, 360, 4], [1338, 422, 1], [206, 206, 3], [780, 780, 2], [326, 1093, 2], [407, 371, 1], [524, 524, 1], [383, 271, 2], [469, 1049, 2], [330, 465, 2], [472, 276, 2], [392, 305, 1], [1030, 1203, 1], [241, 412, 2], [493, 493, 3], [586, 398, 1], [72, 1007, 1], [243, 310, 2], [317, 317, 5], [382, 504, 2], [323, 319, 1], [1033, 259, 6], [241, 367, 2], [495, 358, 2], [1146, 1028, 1], [253, 253, 7], [1348, 444, 1], [309, 413, 1], [195, 225, 2], [602, 327, 2], [1707, 103, 2], [755, 755, 2], [318, 500, 2], [758, 758, 2], [434, 434, 4], [490, 347, 2], [387, 387, 4], [275, 277, 2], [1028, 1146, 3], [174, 260, 2], [741, 437, 2], [1025, 190, 1], [1061, 269, 4], [68, 212, 2], [185, 185, 3], [188, 265, 1], [240, 240, 6], [258, 258, 6], [700, 700, 3], [1038, 1026, 1], [1027, 365, 5], [280, 1161, 2], [569, 61, 1], [196, 367, 2], [487, 329, 2], [1040, 248, 6], [284, 425, 3], [1036, 328, 4], [598, 259, 2], [1162, 1162, 4], [339, 214, 2], [381, 245, 2], [264, 313, 1], [309, 430, 1], [543, 608, 2], [370, 295, 2], [264, 519, 2], [1030, 193, 5], [255, 255, 5], [701, 701, 2], [421, 404, 2], [1027, 366, 5], [1168, 1030, 1], [257, 349, 2], [639, 639, 2], [1041, 269, 6], [324, 266, 1], [574, 574, 3], [1045, 545, 6], [1266, 1048, 4], [320, 519, 2], [1249, 199, 1], [1042, 260, 6], [229, 234, 3], [362, 1039, 2], [475, 475, 3], [66, 66, 3], [262, 322, 2], [246, 1033, 2], [1030, 409, 1], [244, 308, 1], [512, 512, 3], [439, 402, 2], [219, 228, 3], [210, 342, 2], [401, 251, 2], [290, 290, 1], [389, 235, 3], [352, 202, 2], [1030, 447, 1], [58, 57, 1], [1035, 332, 6], [394, 394, 4], [423, 396, 2], [623, 214, 2], [283, 1154, 1], [627, 289, 2], [582, 433, 1], [1024, 196, 4], [1041, 251, 6], [230, 230, 1], [463, 293, 2], [591, 249, 2], [375, 201, 2], [472, 288, 2], [1298, 413, 1], [1365, 436, 4], [217, 267, 2], [280, 284, 2], [518, 236, 2], [225, 195, 1], [162, 732, 2], [505, 505, 3], [175, 175, 7], [320, 234, 2], [1052, 426, 2], [246, 267, 2], [417, 536, 2], [417, 424, 2], [1062, 295, 4], [664, 664, 2], [550, 671, 2], [340, 340, 6], [193, 474, 2], [1042, 281, 6], [271, 461, 2], [357, 357, 4], [190, 552, 2], [325, 188, 2], [259, 1053, 2], [238, 238, 3], [250, 276, 2], [254, 254, 1], [297, 297, 1], [406, 261, 2], [1028, 1131, 1], [1041, 273, 6], [1189, 272, 4], [308, 244, 1], [323, 226, 1], [393, 393, 1], [613, 454, 1], [523, 256, 2], [1028, 388, 3], [1052, 431, 2], [895, 895, 2], [1003, 1003, 1], [1030, 403, 1], [277, 1142, 2], [374, 276, 2], [886, 886, 2], [1156, 315, 1], [462, 294, 2], [312, 295, 2], [1038, 1026, 3], [176, 1408, 2], [641, 251, 2], [1071, 296, 4], [285, 448, 2], [338, 622, 2], [377, 377, 1], [1036, 327, 4], [283, 63, 1], [1059, 367, 4], [479, 256, 2], [670, 256, 2], [271, 395, 2], [330, 231, 2], [979, 979, 2], [391, 234, 3], [215, 220, 2], [540, 540, 4], [468, 260, 2], [1429, 354, 4], [572, 572, 3], [262, 1119, 2], [307, 266, 1], [478, 336, 1], [305, 392, 1], [285, 363, 2], [1174, 321, 1], [1042, 284, 6], [384, 384, 1], [1072, 1027, 1], [278, 278, 6], [483, 483, 1], [500, 318, 3], [261, 464, 2], [559, 236, 2], [450, 450, 2], [1268, 277, 2], [1111, 69, 2], [1212, 305, 1], [605, 605, 1], [714, 352, 2], [332, 240, 3], [482, 482, 4], [917, 917, 2], [372, 372, 3], [110, 680, 1], [561, 820, 1], [1256, 399, 4], [277, 275, 2], [359, 216, 2], [1221, 225, 4], [772, 61, 1], [1030, 1205, 1], [232, 65, 1], [1163, 1163, 2], [253, 361, 2], [1390, 70, 2], [470, 288, 2], [667, 667, 2], [370, 245, 3], [443, 260, 2], [1059, 1049, 4], [196, 240, 2], [506, 506, 1], [232, 66, 1], [262, 487, 2], [502, 551, 2], [300, 243, 1], [258, 201, 2], [248, 1044, 2], [588, 413, 1], [1064, 1064, 4], [390, 508, 2], [193, 499, 2], [585, 817, 1], [460, 425, 2], [366, 366, 3], [310, 433, 1], [21, 22, 1], [362, 515, 2], [296, 284, 2], [790, 790, 2], [240, 196, 2], [768, 768, 2], [200, 1224, 1], [708, 708, 2], [382, 368, 1], [538, 324, 3], [1039, 334, 4], [1031, 249, 3], [534, 534, 3], [419, 331, 1], [991, 991, 2], [265, 246, 1], [329, 217, 2], [456, 456, 5], [201, 258, 2], [796, 796, 1], [1197, 273, 4], [1038, 176, 6], [1319, 418, 1], [748, 748, 2], [1041, 256, 6], [127, 127, 1], [378, 283, 1], [319, 1290, 1], [1031, 249, 5], [509, 509, 1], [62, 526, 1], [1028, 1135, 1], [568, 568, 1], [1030, 1168, 3], [587, 328, 2], [62, 889, 1], [193, 462, 2], [299, 313, 1], [1025, 449, 4], [72, 775, 1], [202, 252, 2], [321, 457, 1], [1275, 70, 2], [391, 229, 2], [1045, 1029, 3], [1099, 1099, 4], [1341, 480, 4], [695, 695, 1], [402, 364, 2], [389, 230, 3], [330, 231, 1], [657, 657, 2], [226, 195, 1], [805, 73, 1], [221, 221, 1], [1131, 1028, 1], [1324, 451, 4], [429, 279, 1], [596, 413, 1], [404, 395, 2], [501, 501, 2], [400, 400, 4], [1258, 281, 4], [266, 307, 1], [890, 29, 1], [1303, 438, 4], [247, 1044, 2], [373, 337, 1], [250, 268, 2], [261, 245, 2], [1025, 353, 4], [1042, 294, 6], [244, 461, 2], [432, 432, 3], [214, 188, 1], [547, 547, 3], [1025, 477, 4], [924, 924, 2], [1028, 1104, 1], [210, 241, 1], [304, 320, 2], [481, 386, 2], [253, 355, 2], [556, 556, 2], [69, 237, 2], [430, 336, 1], [1039, 188, 4], [952, 952, 2], [1036, 1024, 4], [226, 323, 1], [454, 613, 1], [1718, 27, 2], [72, 392, 1], [1260, 428, 1], [403, 403, 4], [1040, 265, 6], [1415, 457, 1], [1042, 275, 6], [193, 445, 2], [552, 552, 3], [1354, 1031, 1], [23, 23, 2], [222, 281, 2], [1070, 1070, 1], [339, 1058, 2], [259, 328, 2], [745, 635, 1], [1035, 1035, 1], [247, 1046, 2], [905, 905, 2], [563, 563, 1], [618, 618, 3], [198, 231, 1], [314, 295, 2], [313, 299, 1], [248, 265, 2], [495, 1049, 2], [193, 522, 2], [974, 974, 2], [385, 275, 2], [471, 293, 2], [510, 619, 2], [1060, 409, 2], [1059, 354, 4], [411, 229, 2], [110, 1460, 1], [193, 468, 2], [62, 729, 1], [202, 412, 2], [333, 255, 2], [849, 849, 2], [301, 266, 1], [953, 953, 2], [914, 914, 2], [254, 1033, 2], [783, 783, 2], [1026, 343, 4], [993, 993, 2], [1198, 68, 2], [1457, 358, 4], [1218, 277, 7], [1053, 345, 4], [230, 234, 3], [414, 256, 2], [594, 594, 3], [324, 307, 2], [257, 279, 2], [1041, 295, 6], [267, 359, 2], [691, 691, 2], [1028, 388, 5], [525, 251, 2], [1070, 1070, 3], [341, 341, 6], [1047, 174, 1], [247, 265, 2], [896, 17, 1], [415, 234, 3], [1030, 1114, 1], [246, 1044, 2], [325, 516, 2], [190, 564, 2], [365, 365, 3], [342, 342, 6], [26, 788, 1], [391, 229, 3], [1073, 259, 1], [637, 446, 1], [686, 686, 2], [299, 313, 2], [843, 61, 1], [1027, 1080, 5], [442, 642, 2], [251, 312, 2], [387, 387, 1], [1031, 1112, 5], [222, 280, 2], [698, 778, 2], [217, 1057, 2], [369, 369, 1], [676, 676, 3], [273, 295, 2], [487, 553, 2], [544, 252, 2], [76, 1593, 1], [193, 484, 2], [507, 507, 3], [679, 679, 2], [1039, 338, 4], [730, 267, 2], [590, 590, 3], [692, 246, 2], [773, 773, 2], [1218, 260, 7], [268, 395, 2], [685, 685, 1], [1079, 254, 6], [235, 389, 3], [1388, 446, 1], [245, 261, 2], [285, 429, 2], [518, 518, 2], [1074, 1074, 3], [318, 266, 2], [554, 252, 2], [236, 219, 3], [1028, 401, 1], [422, 308, 1], [681, 294, 2], [1310, 59, 2], [1313, 419, 1], [264, 304, 2], [709, 247, 2], [350, 217, 2], [1025, 453, 4], [1068, 1068, 4], [243, 243, 4], [1102, 1102, 4], [645, 433, 1], [1443, 182, 2], [496, 496, 2], [532, 241, 2], [852, 852, 2], [1293, 320, 4], [420, 292, 2], [455, 455, 2], [606, 606, 3], [1050, 214, 1], [1349, 433, 1], [1175, 323, 1], [542, 1036, 2], [74, 775, 1], [353, 256, 2], [721, 248, 2], [253, 240, 2], [360, 566, 2], [1042, 296, 6], [520, 296, 2], [959, 959, 2], [1048, 176, 1], [318, 301, 2], [1135, 1028, 1], [408, 408, 2], [1367, 67, 2], [951, 951, 2], [364, 255, 2], [562, 272, 2], [210, 340, 2], [271, 240, 2], [517, 332, 2], [1027, 365, 3], [321, 227, 1], [246, 424, 2], [586, 457, 1], [64, 66, 1], [908, 634, 1], [1252, 260, 6], [234, 320, 2], [253, 201, 2], [1361, 1361, 1], [188, 214, 1], [576, 576, 1], [1188, 1030, 1], [326, 466, 1], [585, 446, 1], [1249, 199, 4], [195, 225, 1], [1060, 403, 2], [345, 217, 2], [1881, 61, 3], [1148, 1325, 2], [176, 260, 2], [198, 231, 2], [394, 240, 2], [490, 268, 2], [1097, 265, 6], [216, 216, 6], [531, 241, 2], [1586, 1586, 2], [239, 1123, 1], [422, 308, 2], [71, 70, 2], [327, 1055, 2], [514, 329, 2], [258, 245, 2], [259, 1073, 2], [1329, 406, 4], [1722, 101, 2], [379, 273, 2], [1320, 65, 2], [266, 301, 1], [684, 497, 2], [276, 472, 2], [343, 343, 5], [313, 299, 2], [229, 411, 2], [1061, 251, 4], [600, 600, 3], [1041, 312, 6], [1218, 284, 7], [1027, 1080, 1], [1187, 1030, 1], [612, 612, 3], [277, 400, 2], [1353, 440, 1], [228, 228, 7], [276, 374, 2], [416, 416, 3], [762, 248, 2], [535, 329, 2], [320, 304, 2], [560, 251, 2], [198, 227, 2], [302, 302, 1], [582, 856, 1], [1027, 345, 3], [1071, 294, 4], [194, 68, 1], [668, 106, 1], [538, 538, 3], [407, 407, 3], [759, 247, 2], [1798, 208, 2], [356, 261, 2], [647, 996, 1], [489, 489, 2], [1633, 597, 2], [521, 521, 4], [1027, 350, 3], [1251, 68, 2], [234, 1125, 2], [504, 382, 1], [476, 381, 2], [677, 267, 2], [417, 393, 2], [530, 530, 1], [596, 444, 1], [1194, 269, 4], [315, 444, 1], [1017, 1017, 2], [460, 281, 2], [1028, 414, 1], [911, 911, 2], [1279, 278, 4], [316, 210, 2], [571, 1049, 2], [254, 1046, 2], [586, 788, 1], [175, 270, 2], [280, 222, 2], [536, 329, 2], [693, 693, 2], [1254, 195, 1], [344, 344, 6], [283, 64, 1], [405, 216, 2], [662, 662, 1], [1295, 359, 4], [375, 188, 2], [668, 954, 1], [212, 69, 1], [527, 236, 2], [347, 1082, 2], [248, 1046, 2], [473, 473, 2], [313, 498, 2], [412, 201, 2], [217, 265, 2], [491, 251, 2], [257, 548, 2], [266, 438, 1], [1813, 660, 2], [1028, 1131, 5], [239, 323, 1], [277, 281, 2], [138, 760, 1], [217, 1051, 2], [740, 267, 2], [1059, 358, 4], [295, 312, 2], [214, 1058, 2], [415, 230, 2], [242, 321, 2], [310, 243, 1], [193, 572, 2], [1126, 1027, 1], [1203, 1030, 1], [259, 327, 2], [998, 998, 2], [253, 434, 2], [1027, 366, 3], [492, 317, 2], [235, 411, 3], [1040, 259, 2], [704, 704, 2], [193, 520, 2], [235, 230, 4], [1116, 1106, 2], [1042, 280, 6], [558, 1036, 2], [1071, 294, 2], [1024, 421, 4], [731, 731, 2], [1031, 349, 3], [193, 581, 2], [467, 467, 2], [348, 348, 4], [285, 464, 2], [219, 236, 2], [315, 225, 1], [636, 454, 1], [1104, 1028, 1], [174, 546, 4], [247, 1033, 2], [448, 359, 2], [214, 614, 2], [339, 550, 2], [264, 304, 1], [659, 478, 1], [1241, 258, 4], [1064, 1064, 3], [265, 1033, 2], [448, 322, 2], [102, 820, 1], [1041, 314, 6], [1024, 424, 4], [188, 549, 2], [342, 210, 2], [1225, 244, 4], [1098, 539, 2], [65, 232, 1], [347, 578, 2], [985, 985, 2], [425, 284, 3], [1063, 1027, 1], [1428, 220, 4], [468, 643, 2], [502, 210, 2], [1138, 1138, 4], [486, 316, 2], [1071, 296, 2], [1426, 340, 4], [226, 226, 4], [929, 929, 2], [1057, 1117, 4], [315, 326, 1], [269, 332, 3], [330, 319, 1], [262, 1082, 2], [216, 261, 2], [223, 197, 2], [255, 459, 2], [621, 437, 1], [193, 1083, 2], [288, 432, 1], [404, 421, 2], [320, 299, 2], [217, 285, 2], [428, 428, 3], [279, 279, 6], [300, 243, 2], [324, 324, 6], [445, 277, 2], [371, 475, 1], [610, 610, 3], [196, 196, 5], [275, 360, 3], [1062, 256, 4], [345, 267, 2], [636, 820, 1], [281, 296, 2], [493, 307, 3], [355, 276, 2], [272, 477, 2], [1044, 1044, 3], [622, 622, 3], [418, 331, 1], [1028, 1135, 5], [1053, 350, 4], [234, 230, 3], [112, 111, 1], [1030, 1200, 1], [1103, 70, 2], [1261, 357, 4], [1307, 370, 4], [264, 299, 2], [690, 249, 2], [1014, 1014, 2], [1191, 63, 1], [295, 314, 2], [1025, 1025, 1], [1029, 436, 4], [313, 235, 2], [1205, 1030, 1], [584, 817, 1], [301, 318, 2], [287, 287, 1], [305, 71, 1], [560, 560, 2], [217, 1033, 2], [230, 389, 2], [315, 242, 1], [308, 244, 2], [351, 351, 7], [1155, 1155, 1], [72, 592, 1], [188, 235, 2], [338, 1055, 2], [440, 336, 1], [234, 229, 4], [794, 399, 2], [1252, 277, 6], [1282, 75, 2], [322, 535, 2], [485, 394, 2], [1191, 378, 1], [334, 1056, 2], [246, 421, 2], [388, 272, 2], [1028, 1104, 5], [381, 442, 2], [395, 271, 2], [585, 884, 1], [1341, 620, 4], [746, 296, 2], [174, 176, 4], [384, 240, 2], [516, 357, 2], [861, 861, 2], [238, 210, 2], [281, 277, 2], [214, 1046, 2], [798, 798, 2], [703, 296, 2], [484, 260, 2], [487, 646, 2], [1098, 545, 2], [241, 471, 2], [250, 437, 2], [511, 276, 2], [451, 452, 1], [1121, 1124, 2], [462, 657, 2], [319, 323, 1], [837, 837, 2], [1060, 441, 2], [193, 235, 2], [613, 419, 1], [1028, 1131, 3], [593, 593, 1], [637, 1015, 1], [441, 294, 2], [328, 1056, 2], [243, 300, 1], [198, 227, 1], [1337, 331, 2], [575, 236, 2], [687, 687, 1], [1031, 202, 5], [1240, 232, 1], [1182, 237, 1], [680, 410, 1], [1300, 390, 4], [216, 271, 2], [579, 416, 1], [278, 175, 2], [588, 892, 1], [1038, 222, 6], [230, 415, 2], [1845, 19, 2], [67, 1077, 2], [477, 272, 2], [603, 175, 2], [337, 373, 2], [904, 498, 2], [229, 391, 3], [503, 292, 2], [489, 236, 2], [1252, 284, 6], [258, 442, 2], [1038, 360, 6], [722, 452, 1], [574, 325, 2], [393, 268, 2], [280, 1127, 2], [281, 460, 2], [380, 245, 2], [382, 504, 1], [500, 318, 2], [645, 903, 1], [1208, 259, 4], [107, 1513, 1], [286, 286, 1], [1199, 330, 1], [193, 521, 2], [214, 623, 2], [353, 353, 7], [1071, 260, 2], [1107, 1107, 4], [188, 542, 2], [369, 515, 2], [468, 296, 2], [1299, 348, 4], [522, 522, 4], [18, 817, 1], [321, 326, 1], [456, 273, 2], [1036, 254, 4], [174, 270, 2], [188, 583, 2], [279, 383, 2], [245, 380, 2], [765, 765, 1], [1035, 196, 6], [217, 1117, 2], [350, 267, 2], [347, 791, 2], [1257, 296, 4], [567, 273, 2], [301, 324, 1], [448, 285, 2], [981, 981, 2], [1031, 349, 5], [295, 273, 2], [723, 457, 1], [1025, 479, 4], [188, 234, 2], [248, 1033, 2], [190, 618, 2], [987, 987, 2], [1116, 1244, 2], [216, 359, 2], [219, 344, 2], [241, 463, 2], [343, 372, 3], [1027, 1216, 1], [307, 324, 2], [174, 277, 2], [229, 235, 3], [304, 304, 7], [492, 306, 2], [938, 938, 2], [322, 1119, 2], [448, 697, 2], [466, 457, 1], [527, 527, 2], [1024, 375, 4], [368, 335, 1], [1060, 435, 2], [69, 1111, 1], [1060, 447, 2], [1637, 197, 4], [589, 429, 2], [176, 557, 4], [453, 453, 5], [1030, 1122, 1], [243, 310, 1], [513, 513, 3], [226, 195, 2], [255, 333, 2], [435, 296, 2], [588, 854, 1], [230, 389, 3], [797, 797, 1], [1071, 280, 4], [62, 807, 1], [174, 546, 3], [269, 256, 2], [16, 954, 1], [1322, 284, 2], [188, 595, 2], [486, 306, 2], [511, 347, 2], [1074, 1074, 1], [1078, 1047, 2], [1441, 342, 4], [194, 67, 1], [449, 272, 2], [1255, 294, 4], [377, 240, 2], [671, 510, 2], [231, 330, 1], [1025, 491, 4], [188, 229, 2], [411, 235, 3], [596, 854, 1], [638, 260, 2], [1026, 1026, 3], [299, 320, 2], [752, 294, 2], [261, 216, 2], [770, 352, 2], [1028, 1135, 3], [66, 205, 2], [406, 381, 2], [737, 100, 1], [1224, 200, 4], [1029, 352, 4], [251, 401, 2], [1027, 1216, 3], [1068, 1068, 3], [217, 362, 1], [1071, 280, 2], [371, 371, 4], [1030, 1114, 5], [1348, 326, 1], [249, 591, 2], [288, 214, 2], [321, 242, 1], [756, 357, 2], [202, 289, 1], [395, 404, 2], [562, 562, 3], [632, 632, 3], [659, 17, 1], [1028, 1104, 3], [188, 216, 2], [1114, 1030, 1], [514, 404, 2], [1744, 62, 1], [220, 220, 4], [497, 497, 3], [814, 814, 2], [345, 1024, 2], [548, 257, 2], [188, 507, 2], [202, 469, 2], [1030, 1187, 3], [1440, 297, 4], [1212, 305, 4], [930, 930, 1], [188, 230, 2], [234, 415, 3], [1036, 348, 4], [190, 672, 2], [502, 551, 1], [14, 14, 1], [188, 558, 2], [390, 571, 2], [229, 391, 2], [349, 257, 2], [1027, 1363, 1], [264, 320, 2], [268, 393, 2], [549, 265, 2], [266, 318, 2], [1040, 262, 2], [250, 246, 2], [659, 440, 1], [1031, 367, 1], [1094, 262, 6], [474, 277, 2], [581, 581, 2], [824, 824, 2], [1030, 1128, 1], [426, 312, 2], [621, 437, 2], [250, 376, 2], [1083, 193, 1], [60, 62, 1], [890, 28, 1], [1629, 67, 4], [231, 198, 1], [279, 356, 2], [295, 1104, 2], [319, 330, 1], [343, 260, 3], [414, 269, 2], [609, 792, 2], [329, 1057, 2], [387, 245, 2], [499, 275, 2], [194, 205, 1], [698, 459, 2], [1030, 1203, 3], [203, 203, 4], [313, 304, 1], [1027, 1360, 1], [1142, 277, 5], [274, 274, 3], [322, 563, 2], [1085, 1198, 2], [1260, 760, 1], [612, 325, 2], [240, 377, 2], [350, 265, 2], [246, 1066, 2], [248, 267, 2], [254, 259, 3], [417, 766, 2], [369, 767, 2], [599, 308, 2], [1033, 362, 6], [1044, 265, 4], [628, 628, 3], [1100, 1136, 2], [430, 309, 1], [406, 580, 2], [541, 261, 2], [378, 569, 1], [299, 299, 7], [340, 210, 2], [276, 355, 2], [583, 583, 2], [425, 425, 4], [109, 903, 1], [1040, 267, 6], [1080, 1027, 1], [482, 284, 2], [244, 394, 2], [587, 357, 2], [1030, 1133, 1], [1024, 1113, 4], [1060, 458, 2], [1046, 359, 4], [70, 237, 1], [176, 1081, 2], [815, 289, 2], [516, 288, 2], [582, 903, 1], [673, 673, 3], [249, 241, 2], [1084, 251, 4], [255, 257, 2], [799, 799, 3], [1025, 456, 4], [607, 607, 3], [1070, 1289, 1], [629, 629, 3], [1030, 1114, 3], [1033, 334, 6], [1029, 202, 3], [258, 483, 2], [385, 385, 4], [1007, 73, 1], [680, 24, 1], [1250, 243, 4], [379, 251, 2], [559, 559, 2], [523, 523, 4], [176, 275, 2], [1036, 1073, 1], [1254, 195, 4], [201, 201, 7], [567, 567, 2], [1147, 196, 4], [469, 253, 2], [1264, 64, 2], [255, 361, 2], [1049, 1049, 3], [1330, 198, 1], [310, 243, 2], [254, 423, 2], [307, 266, 2], [566, 566, 4], [633, 633, 3], [555, 555, 4], [719, 719, 3], [66, 68, 1], [548, 543, 2], [1030, 409, 5], [227, 198, 1], [373, 283, 2], [977, 977, 2], [304, 313, 1], [363, 285, 2], [1218, 280, 7], [1209, 216, 4], [1154, 1154, 1], [1035, 1025, 1], [1116, 63, 2], [281, 260, 2], [398, 398, 3], [715, 367, 2], [188, 1117, 2], [240, 384, 2], [426, 273, 2], [1093, 1312, 2], [733, 248, 2], [264, 313, 2], [217, 1054, 2], [332, 517, 2], [193, 616, 2], [599, 355, 2], [994, 994, 2], [65, 67, 1], [345, 265, 2], [537, 625, 2], [902, 493, 2], [529, 529, 5], [235, 229, 3], [375, 375, 4], [1246, 253, 4], [293, 293, 1], [18, 854, 1], [505, 301, 3], [809, 809, 2], [190, 641, 2], [356, 580, 2], [234, 320, 5], [259, 339, 1], [716, 716, 1], [1028, 431, 1], [219, 219, 6], [1399, 396, 4], [420, 660, 1], [572, 572, 2], [176, 557, 3], [712, 327, 2], [174, 1078, 2], [176, 284, 2], [228, 467, 2], [431, 314, 2], [1031, 1157, 1], [239, 330, 1], [550, 550, 3], [350, 1024, 2], [256, 479, 2], [324, 235, 2], [1388, 319, 1], [279, 515, 2], [472, 568, 2], [753, 753, 2], [1006, 1006, 2], [739, 739, 2], [252, 486, 2], [782, 442, 2], [401, 272, 2], [1413, 402, 4], [678, 678, 2], [185, 1361, 1], [202, 1482, 2], [301, 266, 2], [577, 577, 3], [1471, 465, 1], [202, 495, 2], [212, 68, 2], [240, 271, 2], [504, 504, 3], [67, 194, 1], [190, 682, 2], [1359, 336, 2], [520, 275, 2], [269, 414, 2], [190, 245, 2], [449, 261, 2], [611, 381, 2], [281, 360, 3], [728, 247, 2], [545, 545, 2], [237, 70, 1], [627, 627, 1], [63, 526, 1], [228, 501, 2], [229, 411, 3], [931, 100, 1], [234, 318, 2], [1030, 1188, 3], [1039, 1046, 4], [1073, 1050, 2], [464, 261, 2], [533, 533, 2], [500, 887, 2], [270, 174, 2], [291, 291, 4], [139, 139, 1], [252, 492, 2], [268, 490, 2], [1033, 338, 6], [1265, 345, 7], [267, 247, 2], [1030, 1205, 3], [137, 827, 1], [417, 217, 2], [725, 725, 3], [112, 113, 1], [1031, 354, 1], [1286, 313, 4], [1497, 510, 4], [643, 468, 2], [642, 374, 2], [1030, 1127, 1], [656, 656, 3], [431, 272, 2], [528, 615, 2], [578, 437, 2], [662, 71, 1], [1028, 426, 1], [1252, 280, 6], [1310, 1310, 2], [584, 896, 1], [1026, 234, 4], [289, 216, 2], [228, 473, 2], [507, 265, 2], [1798, 207, 2], [230, 415, 3], [337, 524, 1], [742, 470, 2], [1220, 1031, 1], [294, 441, 2], [454, 636, 1], [278, 176, 2], [234, 248, 2], [269, 1061, 2], [273, 312, 2], [436, 268, 2], [1134, 325, 2], [451, 452, 2], [102, 892, 1], [249, 376, 2], [1027, 1311, 1], [649, 649, 3], [65, 1244, 1], [252, 554, 2], [304, 320, 1], [403, 403, 3], [966, 966, 2], [316, 486, 2], [204, 266, 2], [317, 492, 2], [235, 217, 2], [323, 239, 1], [663, 663, 3], [680, 465, 1], [190, 240, 2], [202, 624, 2], [461, 461, 4], [1027, 1306, 1], [496, 496, 5], [932, 932, 2], [214, 365, 2], [279, 429, 1], [645, 465, 1], [1213, 1213, 4], [65, 1106, 2], [220, 215, 2], [1030, 275, 7], [425, 460, 2], [247, 267, 2], [320, 304, 1], [284, 482, 2], [1033, 359, 6], [640, 332, 2], [608, 333, 2], [214, 366, 2], [188, 573, 2], [970, 519, 2], [273, 456, 2], [370, 1109, 2], [264, 299, 1], [1012, 1012, 2], [194, 205, 2], [251, 641, 2], [307, 318, 1], [1031, 397, 1], [227, 198, 2], [1120, 1120, 2], [273, 379, 2], [281, 222, 2], [294, 450, 2], [367, 241, 2], [443, 277, 2], [553, 553, 3], [574, 327, 2], [1122, 1030, 1], [1294, 308, 4], [174, 312, 2], [348, 568, 2], [1035, 351, 6], [251, 525, 2], [408, 635, 1], [586, 1002, 1], [832, 832, 2], [1150, 275, 5], [613, 856, 1], [395, 377, 2], [278, 282, 2], [445, 280, 2], [1931, 166, 4], [276, 276, 6], [1005, 1005, 2], [313, 264, 1], [1038, 1038, 3], [364, 258, 3], [667, 444, 1], [383, 279, 2], [825, 825, 2], [602, 357, 2], [434, 244, 2], [284, 280, 2], [484, 484, 5], [176, 277, 2], [314, 272, 2], [1112, 1029, 4], [174, 275, 2], [256, 414, 2], [898, 551, 2], [193, 630, 2], [217, 595, 2], [738, 349, 2], [1105, 242, 4], [424, 1055, 2], [512, 292, 2], [534, 334, 2], [1265, 350, 7], [565, 565, 4], [322, 262, 2], [1028, 401, 5], [256, 523, 2], [865, 865, 2], [418, 300, 1], [1081, 1048, 2], [212, 212, 3], [411, 229, 3], [190, 236, 2], [253, 470, 2], [394, 244, 2], [397, 196, 2], [1031, 358, 1], [254, 1058, 2], [264, 320, 1], [193, 230, 2], [254, 439, 2], [1102, 229, 5], [1127, 1030, 1], [64, 65, 3], [299, 320, 1], [1026, 460, 4], [66, 1085, 2], [356, 279, 2], [732, 162, 2], [745, 438, 2], [267, 248, 2], [436, 376, 2], [260, 174, 2], [619, 333, 2], [1156, 1156, 4], [62, 579, 1], [1364, 219, 4], [217, 216, 2], [249, 1162, 2], [325, 511, 2], [367, 1029, 2], [616, 616, 2], [373, 526, 1], [210, 238, 2], [289, 1153, 2], [230, 235, 4], [284, 1172, 2], [1265, 366, 7], [202, 617, 2], [214, 1036, 1], [341, 341, 7], [1211, 309, 1], [259, 598, 2], [488, 488, 5], [1419, 404, 4], [463, 463, 4], [657, 462, 2], [359, 515, 2], [386, 481, 2], [387, 374, 2], [1033, 405, 6], [380, 364, 2], [1844, 104, 2], [252, 544, 2], [323, 239, 2], [870, 870, 2], [1038, 193, 3], [305, 392, 2], [348, 511, 2], [305, 70, 2], [815, 815, 2], [396, 423, 2], [97, 98, 1], [540, 343, 2], [196, 265, 2], [207, 207, 1], [324, 266, 2], [334, 262, 2], [528, 587, 2], [495, 258, 2], [1024, 439, 4], [199, 199, 4], [272, 314, 2], [347, 490, 2], [436, 1076, 2], [313, 304, 2], [320, 299, 1], [1764, 23, 2], [351, 529, 4], [1035, 1025, 3], [1030, 1237, 1], [1484, 302, 4], [250, 250, 5], [260, 443, 2], [451, 451, 3], [684, 490, 2], [251, 491, 2], [494, 494, 5], [1074, 1339, 1], [307, 307, 1], [563, 362, 2], [399, 1256, 1], [1385, 412, 4], [345, 246, 2], [318, 234, 2], [535, 605, 2], [1044, 1050, 1], [1096, 332, 4], [599, 434, 2], [202, 631, 2], [661, 661, 3], [1071, 277, 2], [1025, 562, 4], [245, 248, 2], [270, 175, 2], [626, 626, 4], [1265, 365, 7], [311, 311, 3], [60, 889, 1], [729, 729, 2], [525, 525, 4], [231, 231, 4], [1829, 24, 2], [200, 472, 2], [284, 296, 2], [354, 1029, 2], [367, 196, 2], [678, 325, 2], [1027, 1202, 3], [288, 333, 2], [1214, 201, 4], [222, 222, 4], [260, 462, 2], [549, 549, 3], [566, 360, 2], [1064, 1380, 1], [242, 326, 2], [1024, 423, 4], [1191, 1191, 1], [1195, 246, 4], [1272, 227, 4], [473, 228, 2], [376, 1029, 2], [520, 708, 2], [1100, 1251, 2], [77, 77, 1], [193, 1118, 2], [410, 971, 1], [644, 644, 3], [1133, 1030, 1], [1328, 204, 4], [380, 257, 2], [1030, 1234, 1], [233, 233, 1], [1182, 237, 3], [1736, 635, 2], [193, 555, 2], [1271, 275, 4], [415, 230, 3], [388, 256, 2], [801, 267, 2], [723, 1002, 1], [241, 531, 2], [241, 532, 2], [1071, 281, 4], [318, 318, 6], [328, 259, 2], [1225, 244, 1], [435, 1026, 2], [1035, 479, 6], [72, 695, 1], [897, 267, 2], [381, 611, 2], [344, 219, 2], [534, 514, 2], [430, 430, 3], [459, 375, 2], [234, 217, 2], [464, 724, 2], [1256, 399, 1], [807, 807, 1], [382, 368, 3], [841, 841, 2], [624, 349, 2], [409, 409, 4], [1025, 560, 4], [176, 278, 2], [63, 283, 1], [174, 280, 2], [1023, 1023, 2], [206, 206, 1], [277, 294, 2], [329, 706, 2], [361, 361, 1], [424, 417, 2], [30, 31, 1], [188, 513, 2], [396, 214, 2], [1035, 449, 6], [271, 216, 2], [70, 475, 1], [669, 364, 2], [1022, 1022, 2], [1025, 567, 4], [276, 511, 2], [317, 463, 2], [301, 204, 2], [1039, 1117, 4], [1051, 217, 1], [1028, 414, 5], [371, 407, 2], [393, 417, 2], [304, 313, 2], [188, 648, 2], [337, 373, 1], [515, 362, 2], [413, 413, 3], [1066, 246, 6], [541, 236, 2], [229, 234, 4], [273, 426, 2], [232, 1240, 1], [1030, 435, 1], [285, 429, 1], [803, 267, 2], [1099, 230, 5], [537, 602, 2], [547, 338, 2], [367, 412, 2], [1044, 259, 4], [668, 996, 1], [521, 275, 2], [1332, 369, 4], [1647, 28, 2], [1033, 347, 6], [327, 259, 2], [390, 352, 2], [536, 417, 2], [188, 201, 2], [1218, 281, 7], [471, 471, 4], [1041, 196, 2], [1071, 284, 2], [185, 200, 1], [231, 198, 2], [596, 931, 1], [723, 100, 1], [972, 634, 1], [1030, 1133, 5], [1071, 281, 2], [726, 328, 2], [272, 388, 2], [570, 775, 1], [592, 71, 1], [638, 638, 3], [883, 883, 2], [1693, 59, 2], [201, 1049, 2], [394, 434, 2], [196, 267, 2], [501, 228, 2], [190, 216, 2], [190, 769, 2], [256, 552, 2], [298, 298, 4], [595, 595, 2], [261, 449, 2], [264, 498, 1], [642, 310, 2], [955, 503, 2], [64, 283, 1], [304, 304, 1], [1039, 362, 4], [62, 786, 1], [260, 468, 2], [497, 268, 2], [1030, 441, 1], [689, 689, 3], [1280, 228, 4], [256, 670, 2], [350, 214, 2], [65, 205, 1], [1075, 379, 4], [176, 280, 2], [363, 605, 2], [403, 1026, 2], [377, 355, 2], [267, 1046, 2], [1044, 248, 4], [1231, 300, 1], [107, 908, 1], [539, 539, 2], [441, 277, 2], [276, 250, 2], [316, 316, 6], [521, 294, 2], [487, 593, 2], [1085, 1077, 2], [543, 543, 3], [1509, 208, 4], [581, 296, 2], [379, 269, 2], [406, 747, 2], [1118, 193, 1], [188, 322, 2], [195, 244, 1], [1058, 1036, 4], [1392, 448, 4], [346, 346, 4], [642, 442, 2], [265, 196, 2], [1030, 1122, 5], [1058, 1164, 4], [324, 301, 1], [345, 214, 2], [383, 384, 2], [625, 625, 3], [702, 702, 3], [429, 285, 2], [928, 928, 2], [1346, 247, 6], [1044, 247, 4], [356, 380, 2], [381, 476, 2], [409, 1026, 2], [639, 639, 3], [257, 312, 2], [385, 360, 3], [1283, 280, 4], [920, 920, 2], [1031, 1274, 1], [272, 449, 2], [363, 593, 2], [757, 483, 2], [1031, 1157, 3], [1047, 1078, 1], [1015, 597, 1], [401, 295, 2], [239, 330, 2], [378, 526, 2], [400, 445, 2], [67, 1251, 1], [423, 1056, 2], [613, 908, 1], [1035, 453, 6], [256, 269, 2], [447, 1026, 2], [1430, 442, 4], [1045, 202, 3], [478, 647, 1], [230, 299, 5], [249, 690, 2], [919, 919, 2], [190, 228, 2], [967, 967, 2], [418, 561, 1], [307, 318, 2], [573, 573, 3], [941, 941, 2], [1033, 325, 6], [174, 1026, 2], [435, 284, 2], [237, 212, 2], [260, 1038, 2], [615, 615, 3], [1035, 353, 6], [308, 226, 2], [1030, 1122, 3], [510, 961, 2], [1274, 1031, 1], [1033, 348, 6], [467, 228, 2], [201, 1036, 2], [301, 324, 2], [421, 1056, 2], [349, 1112, 2], [1027, 1202, 1], [1134, 327, 2], [1050, 188, 6], [1276, 261, 4], [201, 412, 2], [1075, 388, 4], [255, 259, 2], [459, 718, 2], [498, 292, 2], [1041, 370, 2], [246, 1057, 2], [345, 248, 2], [419, 1313, 1], [614, 1036, 2], [575, 174, 4], [1304, 226, 4], [1148, 1103, 2], [217, 1138, 2], [266, 500, 1], [445, 400, 2], [541, 370, 2], [235, 313, 5], [339, 528, 2], [202, 591, 2], [350, 254, 2], [603, 278, 2], [1028, 401, 3], [1555, 391, 4], [715, 376, 2], [217, 583, 2], [1155, 210, 1], [553, 553, 1], [556, 556, 4], [771, 332, 2], [288, 472, 2], [1051, 322, 6], [253, 469, 2], [338, 262, 2], [1356, 248, 6], [1415, 326, 1], [1619, 102, 2], [441, 1026, 2], [478, 659, 1], [330, 239, 1], [200, 568, 2], [304, 229, 5], [349, 1253, 2], [474, 474, 5], [176, 281, 2], [285, 530, 2], [1553, 389, 4], [71, 592, 1], [1134, 328, 2], [881, 881, 2], [242, 225, 1], [299, 264, 1], [317, 317, 6], [244, 434, 2], [268, 268, 5], [734, 734, 2], [190, 754, 2], [300, 580, 2], [1064, 1242, 3], [477, 477, 5], [956, 956, 2], [379, 426, 2], [188, 655, 2], [1252, 281, 6], [235, 247, 2], [1355, 318, 4], [312, 273, 2], [464, 665, 2], [612, 328, 2], [1030, 1128, 5], [559, 176, 4], [235, 324, 2], [402, 214, 2], [70, 508, 1], [219, 353, 2], [456, 269, 2], [1617, 105, 2], [110, 884, 1], [187, 187, 2], [236, 518, 2], [1053, 365, 4], [245, 258, 3], [1025, 523, 4], [1071, 275, 2], [1437, 434, 4], [429, 589, 2], [1030, 1200, 3], [16, 1503, 1], [63, 1121, 1], [459, 369, 2], [658, 658, 3], [1030, 1133, 3], [2019, 21, 2], [246, 265, 1], [272, 562, 2], [571, 571, 3], [1025, 525, 4], [1047, 1262, 5], [1200, 1030, 1], [2411, 181, 4], [204, 386, 2], [521, 674, 2], [354, 240, 2], [1027, 1040, 3], [461, 271, 2], [1094, 1039, 5], [257, 384, 2], [288, 516, 2], [309, 225, 2], [409, 277, 2], [515, 279, 2], [1290, 597, 2], [254, 217, 1], [1939, 679, 2], [480, 130, 2], [1593, 75, 2], [176, 1026, 2], [296, 455, 2], [63, 1264, 1], [946, 946, 2], [1030, 1127, 5], [699, 699, 3], [937, 937, 2], [1388, 637, 1], [255, 364, 2], [301, 505, 3], [393, 387, 2], [209, 209, 4], [620, 620, 3], [1167, 1167, 4], [246, 1051, 2], [697, 697, 3], [1035, 190, 3], [241, 249, 2], [307, 493, 3], [439, 1055, 2], [219, 341, 2], [1282, 1585, 2], [622, 338, 2], [1030, 1127, 3], [691, 601, 1], [1068, 1416, 1], [358, 1029, 2], [237, 371, 2], [461, 244, 2], [572, 294, 2], [1308, 1308, 2], [350, 247, 2], [1031, 1220, 3], [1192, 1192, 4], [822, 822, 3], [269, 456, 2], [430, 1331, 1], [1267, 561, 1], [67, 1198, 1], [259, 357, 2], [335, 335, 4], [1025, 552, 4], [193, 607, 2], [407, 68, 1], [343, 540, 2], [458, 1026, 2], [1033, 327, 6], [57, 57, 1], [240, 247, 2], [265, 254, 2], [280, 275, 2], [354, 469, 2], [675, 357, 2], [199, 225, 2], [619, 619, 3], [1602, 551, 4], [299, 267, 2], [340, 340, 7], [405, 490, 2], [796, 796, 2], [342, 316, 1], [230, 234, 4], [922, 922, 2], [378, 526, 1], [175, 278, 2], [500, 266, 1], [174, 284, 2], [188, 246, 1], [737, 1312, 1], [310, 231, 2], [355, 253, 3], [671, 963, 2], [1031, 1059, 1], [282, 278, 2], [1177, 1177, 4], [447, 275, 2], [273, 567, 2], [370, 541, 2], [497, 437, 2], [193, 565, 2], [176, 314, 2], [717, 717, 2], [654, 327, 2], [1058, 339, 4], [1250, 243, 1], [296, 435, 2], [979, 538, 2], [174, 281, 2], [1048, 1081, 1], [1042, 343, 2], [254, 265, 2], [308, 226, 1], [221, 292, 2], [594, 307, 2], [1386, 371, 4], [458, 260, 2], [193, 278, 2], [390, 249, 2], [479, 479, 5], [499, 499, 5], [973, 973, 2], [1125, 1125, 2], [304, 267, 2], [350, 246, 2], [374, 258, 3], [1406, 416, 1], [262, 334, 2], [352, 1297, 2], [1028, 414, 3], [235, 299, 1], [190, 779, 2], [376, 250, 2], [1195, 1195, 4], [174, 251, 2], [270, 270, 7], [519, 320, 3], [196, 397, 2], [669, 442, 2], [1031, 1153, 1], [1035, 491, 6], [306, 452, 2], [476, 1055, 2], [482, 279, 2], [578, 692, 2], [623, 1036, 2], [1054, 1082, 4], [354, 289, 2], [785, 785, 3], [232, 382, 1], [398, 561, 1], [531, 531, 4], [912, 912, 2], [237, 69, 2], [288, 483, 2], [396, 528, 2], [443, 443, 6], [524, 346, 1], [984, 984, 2], [253, 328, 3], [587, 587, 3], [1030, 447, 5], [213, 213, 4], [357, 259, 2], [450, 450, 3], [628, 334, 2], [942, 111, 1], [1030, 403, 5], [972, 103, 1], [1049, 1029, 4], [696, 252, 2], [522, 275, 2], [257, 254, 2], [352, 577, 2], [358, 245, 2], [1111, 70, 3], [1136, 70, 2], [1951, 162, 4], [18, 1503, 1], [402, 439, 2], [576, 576, 3], [414, 273, 2], [1281, 205, 1], [65, 1198, 1], [193, 400, 2], [372, 372, 4], [277, 1038, 2], [404, 217, 2], [532, 532, 4], [190, 670, 2], [239, 323, 2], [226, 308, 1], [590, 301, 2], [872, 872, 1], [1269, 245, 4], [236, 496, 2], [236, 527, 2], [431, 388, 2], [304, 503, 3], [318, 307, 1], [1471, 319, 1], [232, 382, 2], [288, 470, 2], [304, 264, 1], [481, 386, 1], [1047, 174, 2], [204, 301, 2], [433, 419, 1], [418, 1319, 1], [1352, 324, 4], [16, 996, 1], [321, 1174, 1], [360, 360, 5], [461, 394, 2], [418, 636, 1], [547, 536, 2], [262, 363, 2], [761, 332, 2], [506, 833, 2], [1218, 296, 7], [315, 242, 2], [464, 285, 2], [190, 750, 2], [214, 1040, 2], [271, 383, 3], [333, 259, 2], [266, 307, 2], [816, 412, 2], [716, 472, 2], [1077, 67, 3], [399, 241, 1], [666, 666, 3], [214, 217, 2], [322, 363, 2], [266, 301, 2], [564, 564, 4], [366, 1024, 2], [704, 704, 3], [733, 733, 2], [1003, 73, 1], [257, 380, 2], [422, 585, 1], [974, 505, 2], [1027, 1053, 1], [1128, 1030, 1], [813, 813, 2], [167, 167, 2], [542, 542, 2], [1798, 206, 2], [320, 264, 1], [14, 13, 1], [438, 887, 2], [1438, 417, 4], [1558, 209, 4], [353, 219, 2], [1584, 411, 4], [71, 695, 1], [250, 377, 2], [265, 1054, 2], [344, 344, 7], [1025, 341, 4], [631, 631, 3], [894, 894, 2], [1083, 1083, 2], [590, 391, 2], [266, 324, 2], [234, 318, 5], [422, 440, 1], [295, 370, 3], [193, 639, 2], [68, 1100, 2], [310, 231, 1], [342, 316, 2], [235, 230, 5], [262, 338, 2], [559, 176, 3], [960, 960, 2], [253, 517, 2], [448, 706, 2], [875, 875, 3], [312, 426, 2], [501, 501, 5], [345, 247, 2], [660, 760, 1], [1782, 17, 2], [589, 429, 1], [916, 916, 2], [251, 1086, 2], [188, 1057, 2], [237, 212, 1], [1048, 1266, 5], [314, 431, 2], [1747, 72, 1], [1039, 329, 4], [361, 255, 2], [309, 413, 2], [572, 281, 2], [1224, 1224, 1], [299, 512, 3], [1094, 322, 6], [486, 486, 4], [786, 786, 1], [176, 175, 2], [254, 214, 1], [386, 481, 1], [430, 588, 1], [1044, 246, 4], [185, 199, 1], [606, 606, 1], [459, 255, 2], [693, 693, 3], [1267, 586, 1], [64, 1116, 2], [794, 679, 1], [235, 389, 2], [327, 248, 3], [628, 485, 2], [476, 863, 2], [2163, 29, 2], [1011, 1011, 1], [1793, 634, 2], [348, 348, 1], [513, 267, 2], [1030, 1128, 3], [1031, 376, 1], [249, 880, 2], [110, 597, 1], [256, 353, 2], [460, 284, 2], [608, 608, 3], [637, 597, 1], [271, 530, 2], [1172, 284, 5], [99, 1529, 1], [223, 223, 1], [428, 264, 1], [407, 69, 1], [1218, 294, 7], [266, 204, 2], [136, 136, 2], [300, 227, 2], [394, 485, 2], [767, 698, 2], [296, 474, 2], [402, 537, 2], [359, 322, 2], [1260, 1260, 1], [272, 401, 2], [594, 389, 2], [183, 183, 2], [475, 71, 1], [1166, 1166, 4], [1042, 1317, 2], [219, 351, 2], [423, 384, 2], [63, 1400, 1], [1028, 273, 7], [234, 229, 5], [256, 1089, 2], [272, 431, 2], [508, 577, 2], [1282, 1139, 2], [325, 574, 2], [812, 812, 3], [240, 253, 3], [455, 455, 3], [438, 635, 2], [534, 322, 2], [246, 217, 1], [365, 1024, 2], [325, 612, 2], [492, 964, 2], [1028, 1052, 1], [251, 1096, 3], [387, 393, 2], [688, 688, 3], [1053, 366, 4], [260, 372, 2], [300, 398, 2], [395, 268, 2], [277, 474, 2], [307, 230, 5], [403, 284, 2], [514, 806, 2], [947, 947, 2], [295, 401, 2], [420, 292, 1], [334, 644, 2], [438, 902, 2], [797, 432, 2], [1042, 1464, 2], [324, 301, 2], [444, 596, 1], [390, 316, 2], [174, 546, 5], [217, 655, 2], [714, 714, 3], [216, 405, 2], [810, 434, 2], [260, 176, 2], [345, 254, 2], [1035, 477, 6], [194, 68, 2], [320, 234, 5], [1029, 196, 4], [250, 314, 2], [280, 343, 3], [383, 383, 5], [246, 188, 1], [358, 289, 2], [630, 294, 2], [1088, 409, 4], [313, 235, 5], [1393, 1121, 2], [269, 453, 1], [403, 275, 2], [210, 317, 1], [309, 309, 4], [174, 175, 2], [175, 174, 2], [403, 435, 2], [1033, 328, 6], [190, 705, 2], [192, 181, 1], [422, 584, 1], [229, 248, 2], [303, 303, 3], [491, 491, 5], [652, 652, 4], [258, 374, 3], [777, 265, 2], [1063, 1107, 4], [1447, 1031, 1], [258, 327, 3], [347, 511, 2], [409, 441, 2], [188, 623, 2], [380, 523, 2], [743, 743, 2], [217, 648, 2], [1028, 272, 7], [518, 518, 5], [1290, 1290, 2], [551, 502, 1], [176, 270, 2], [523, 380, 2], [150, 150, 2], [307, 265, 2], [1038, 1118, 3], [410, 1123, 1], [239, 231, 1], [1004, 1004, 2], [236, 559, 2], [295, 477, 2], [617, 617, 3], [229, 304, 5], [386, 204, 2], [866, 463, 2], [604, 276, 2], [1041, 351, 2], [616, 616, 3], [1310, 1565, 2], [591, 591, 3], [1042, 1268, 2], [210, 1155, 1], [350, 248, 2], [948, 948, 2], [1046, 1051, 1], [254, 188, 1], [320, 519, 3], [466, 1641, 1], [234, 391, 4], [66, 335, 1], [409, 260, 2], [273, 453, 2], [366, 267, 2], [371, 237, 1], [1041, 456, 2], [161, 161, 2], [221, 197, 2], [176, 174, 4], [283, 232, 3], [396, 1058, 2], [774, 265, 2], [1298, 413, 4], [201, 288, 1], [324, 204, 2], [728, 728, 2], [433, 582, 1], [387, 552, 2], [341, 219, 2], [573, 267, 2], [239, 446, 1], [768, 768, 3], [1025, 344, 4], [316, 342, 1], [526, 373, 2], [570, 71, 1], [819, 509, 2], [1292, 246, 6], [253, 240, 3], [366, 265, 2], [1033, 188, 5], [1075, 401, 4], [251, 560, 2], [362, 563, 1], [763, 763, 3], [357, 516, 2], [365, 267, 2], [388, 431, 2], [404, 793, 2], [72, 1660, 1], [804, 470, 2], [1316, 257, 4], [885, 471, 2], [351, 529, 3], [236, 575, 2], [674, 674, 3], [128, 129, 1], [727, 727, 3], [1237, 1030, 1], [269, 379, 2], [1140, 1140, 3], [259, 1110, 2], [476, 712, 2], [791, 347, 2], [1626, 415, 4], [2134, 25, 2], [296, 468, 2], [498, 313, 3], [460, 425, 3], [190, 201, 2], [271, 271, 7], [277, 174, 2], [343, 1206, 3], [1007, 1007, 1], [1035, 562, 6], [322, 416, 2], [439, 439, 4], [26, 903, 1], [720, 720, 3], [329, 329, 1], [512, 299, 3], [1650, 109, 2], [234, 391, 2], [354, 1327, 2], [1027, 1227, 1], [1309, 279, 4], [4886, 17, 1], [214, 1044, 1], [384, 361, 2], [535, 535, 1], [718, 339, 2], [367, 249, 2], [69, 1275, 1], [273, 174, 2], [667, 100, 1], [1335, 268, 4], [430, 647, 1], [1031, 1153, 3], [260, 484, 2], [581, 581, 3], [643, 643, 3], [1026, 474, 4], [1030, 458, 1], [1792, 191, 1], [4069, 182, 1], [245, 245, 6], [327, 602, 2], [645, 109, 1], [954, 15, 1], [1025, 618, 4], [281, 174, 2], [65, 64, 2], [101, 102, 1], [202, 696, 2], [247, 1087, 2], [361, 384, 2], [949, 949, 2], [1026, 443, 4], [368, 382, 2], [1051, 262, 6], [843, 579, 1], [1105, 242, 3], [325, 678, 2], [493, 902, 2], [151, 151, 3], [280, 445, 2], [1019, 1019, 2], [1040, 328, 2], [1153, 1031, 1], [444, 1093, 1], [1035, 567, 6], [108, 109, 1], [229, 235, 4], [253, 443, 2], [570, 392, 2], [735, 735, 3], [1046, 334, 4], [1221, 225, 1], [1234, 1030, 1], [68, 407, 1], [550, 598, 2], [153, 154, 2], [276, 214, 2], [322, 285, 1], [429, 589, 1], [237, 371, 1], [294, 482, 2], [515, 369, 2], [377, 377, 5], [551, 502, 2], [758, 758, 3], [435, 435, 2], [1028, 269, 7], [1152, 365, 7], [208, 208, 4], [321, 398, 2], [279, 482, 2], [1308, 634, 2], [284, 1038, 2], [294, 462, 2], [730, 730, 2], [691, 601, 2], [695, 71, 1], [292, 503, 2], [340, 317, 2], [184, 184, 2], [236, 489, 2], [273, 1061, 2], [307, 204, 2], [277, 445, 2], [1035, 560, 6], [1325, 70, 2], [685, 394, 2], [231, 310, 1], [349, 1045, 2], [375, 675, 2], [668, 1382, 1], [1030, 1151, 5], [1085, 66, 3], [281, 176, 2], [387, 632, 2], [457, 1093, 1], [107, 856, 1], [568, 357, 2], [281, 1151, 2], [26, 856, 1], [374, 258, 1], [188, 1024, 1], [255, 201, 3], [128, 745, 1], [627, 710, 2], [72, 1740, 1], [199, 185, 1], [296, 1038, 2], [328, 587, 2], [196, 201, 3], [248, 1055, 3], [317, 340, 1], [1026, 482, 4], [246, 1039, 2], [566, 261, 2], [665, 356, 2], [877, 877, 2], [294, 1038, 2], [475, 371, 1], [1049, 412, 4], [1096, 269, 1], [65, 1116, 1], [317, 342, 1], [621, 319, 1], [748, 748, 3], [1080, 1113, 4], [517, 253, 2], [254, 1036, 2], [365, 265, 2], [381, 406, 2], [610, 411, 2], [1193, 1193, 4], [308, 440, 2], [316, 340, 1], [275, 520, 2], [379, 256, 2], [280, 447, 2], [1312, 1312, 2], [282, 215, 2], [1062, 272, 4], [1670, 722, 1], [331, 331, 3], [335, 204, 2], [355, 355, 5], [546, 228, 2], [1882, 100, 2], [1987, 634, 1], [217, 1171, 2], [1647, 27, 2], [193, 638, 2], [421, 421, 4], [611, 611, 3], [1026, 1118, 1], [1031, 1447, 1], [336, 336, 3], [539, 202, 2], [1104, 256, 4], [1031, 1623, 1], [1256, 1256, 1], [1809, 609, 4], [175, 176, 2], [388, 251, 2], [1088, 403, 4], [1629, 1077, 4], [378, 1191, 1], [312, 1131, 2], [325, 1053, 2], [544, 544, 4], [580, 406, 2], [629, 415, 2], [853, 265, 2], [250, 437, 1], [1009, 1009, 2], [360, 676, 2], [453, 269, 1], [540, 445, 2], [188, 614, 2], [490, 684, 2], [205, 194, 3], [254, 1079, 2], [268, 216, 1], [258, 364, 3], [262, 717, 2], [225, 242, 1], [498, 264, 1], [808, 808, 3], [839, 265, 2], [340, 316, 1], [1026, 445, 4], [1035, 456, 6], [299, 235, 1], [1075, 431, 4], [1152, 366, 7], [70, 392, 1], [211, 189, 2], [557, 176, 4], [247, 1056, 3], [138, 137, 1], [441, 260, 2], [443, 253, 2], [288, 675, 2], [174, 256, 2], [262, 188, 2], [293, 463, 2], [485, 726, 2], [234, 230, 4], [342, 317, 1], [709, 709, 2], [312, 257, 2], [516, 773, 2], [862, 862, 2], [1026, 462, 4], [1154, 283, 3], [389, 600, 3], [300, 227, 1], [174, 462, 2], [267, 1033, 2], [333, 357, 2], [755, 755, 3], [68, 67, 2], [738, 397, 2], [1204, 1204, 4], [354, 249, 2], [457, 586, 1], [1031, 358, 3], [736, 736, 3], [384, 257, 2], [210, 342, 1], [405, 1039, 2], [781, 781, 3], [1270, 444, 1], [426, 379, 2], [318, 500, 3], [339, 537, 2], [850, 509, 2], [917, 352, 2], [383, 271, 3], [235, 324, 5], [244, 195, 1], [176, 272, 2], [553, 487, 2], [619, 619, 1], [327, 574, 2], [426, 251, 2], [592, 481, 1], [622, 476, 2], [279, 601, 2], [467, 467, 5], [1227, 1027, 1], [190, 263, 2], [1300, 390, 1], [541, 449, 2], [1027, 1180, 3], [1119, 1119, 3], [246, 345, 2], [259, 550, 2], [424, 424, 4], [558, 558, 2], [499, 284, 2], [1105, 1771, 1], [1324, 451, 1], [176, 520, 2], [216, 268, 3], [276, 276, 7], [290, 290, 3], [896, 584, 1], [210, 316, 1], [1045, 653, 6], [174, 273, 2], [515, 359, 2], [419, 582, 1], [512, 1017, 2], [1049, 1112, 4], [200, 185, 1], [1046, 338, 4], [1013, 1013, 2], [1296, 256, 6], [1076, 436, 4], [1415, 723, 1], [836, 506, 2], [202, 815, 2], [330, 239, 2], [526, 373, 1], [1010, 1010, 2], [1021, 1021, 2], [1042, 1490, 2], [1284, 240, 4], [337, 524, 3], [360, 753, 2], [1477, 71, 1], [538, 324, 2], [565, 280, 2], [1330, 198, 4], [243, 442, 2], [306, 486, 2], [536, 828, 2], [554, 554, 4], [1028, 426, 5], [435, 275, 2], [650, 328, 2], [66, 1320, 1], [259, 1107, 2], [332, 640, 2], [570, 392, 1], [246, 250, 2], [270, 176, 2], [630, 630, 2], [1278, 1041, 2], [202, 1336, 2], [258, 495, 2], [277, 1122, 2], [305, 1212, 1], [1030, 1234, 3], [230, 247, 2], [446, 585, 1], [1031, 1153, 5], [245, 370, 3], [66, 368, 1], [128, 1736, 1], [204, 307, 2], [216, 268, 1], [254, 1050, 2], [351, 251, 2], [1030, 1151, 1], [188, 257, 2], [473, 473, 5], [534, 530, 2], [661, 470, 2], [188, 707, 2], [193, 270, 2], [657, 657, 3], [262, 1094, 2], [1045, 651, 6], [1348, 596, 1], [510, 756, 2], [309, 430, 2], [62, 898, 1], [314, 1061, 2], [503, 304, 3], [72, 70, 1], [1387, 362, 4], [214, 246, 1], [605, 363, 2], [740, 740, 2], [1036, 375, 4], [1104, 295, 4], [1059, 376, 4], [218, 218, 1], [716, 200, 2], [327, 712, 2], [418, 398, 1], [2147, 137, 2], [193, 681, 2], [244, 195, 2], [1114, 275, 4], [174, 219, 2], [1027, 1185, 3], [1030, 1237, 3], [1161, 280, 5], [1267, 1267, 1], [1628, 506, 4], [248, 507, 2], [1044, 325, 4], [328, 253, 3], [360, 739, 2], [615, 225, 2], [669, 669, 3], [272, 176, 2], [388, 269, 2], [396, 396, 4], [475, 662, 1], [1360, 1027, 1], [266, 1303, 2], [358, 495, 2], [1029, 316, 4], [1353, 440, 3], [63, 1393, 1], [485, 924, 2], [510, 671, 2], [403, 260, 2], [626, 343, 2], [783, 783, 3], [1025, 564, 4], [1075, 414, 4], [1035, 552, 6], [226, 200, 2], [1275, 1111, 2], [749, 749, 3], [1240, 232, 4], [166, 702, 2], [1046, 362, 4], [174, 343, 2], [395, 395, 1], [268, 436, 2], [301, 229, 5], [423, 423, 4], [1647, 29, 2], [185, 200, 2], [288, 571, 2], [499, 261, 2], [705, 705, 3], [785, 799, 2], [1141, 239, 4], [1175, 1175, 4], [1726, 106, 2], [409, 275, 2], [28, 634, 1], [1040, 327, 2], [69, 71, 1], [282, 220, 2], [349, 289, 2], [402, 1058, 2], [258, 201, 3], [267, 345, 2], [366, 217, 2], [374, 387, 2], [1147, 196, 1], [1156, 444, 1], [285, 322, 1], [369, 698, 2], [629, 299, 2], [800, 800, 2], [405, 405, 1], [667, 931, 1], [761, 761, 2], [1029, 241, 4], [126, 127, 1], [235, 304, 1], [301, 265, 2], [934, 934, 2], [314, 176, 2], [428, 1260, 1], [724, 406, 2], [304, 235, 1], [480, 1192, 2], [391, 234, 4], [453, 273, 2], [465, 680, 1], [318, 307, 2], [374, 642, 2], [219, 174, 2], [210, 340, 1], [1062, 273, 4], [1068, 1277, 3], [72, 662, 1], [771, 771, 2], [608, 608, 1], [641, 641, 3], [294, 681, 2], [306, 492, 2], [2060, 2060, 1], [199, 225, 1], [848, 848, 3], [485, 1056, 2], [1281, 66, 1], [251, 351, 2], [1047, 175, 2], [1189, 1189, 4], [199, 1249, 1], [247, 513, 2], [519, 292, 2], [361, 253, 3], [1031, 354, 3], [258, 245, 3], [1027, 1233, 1], [244, 244, 4], [248, 573, 2], [278, 174, 2], [314, 1135, 2], [1036, 254, 1], [246, 1072, 2], [317, 252, 1], [321, 300, 1], [212, 194, 1], [214, 1051, 2], [603, 266, 2], [661, 355, 2], [1041, 353, 2], [1428, 1428, 4], [259, 255, 2], [397, 289, 2], [320, 264, 2], [1162, 249, 4], [272, 1061, 2], [276, 474, 2], [312, 1091, 2], [368, 335, 3], [475, 305, 1], [524, 524, 3], [845, 845, 2], [247, 549, 2], [228, 546, 2], [299, 264, 2], [593, 497, 1], [613, 634, 1], [683, 536, 2], [897, 1113, 2], [1024, 595, 4], [1124, 64, 2], [1523, 349, 4], [216, 279, 1], [277, 441, 2], [1031, 367, 3], [1252, 294, 6], [63, 569, 1], [319, 1123, 2], [1039, 1138, 4], [1935, 702, 4], [1026, 520, 4], [1071, 277, 4], [310, 419, 2], [741, 347, 2], [315, 309, 1], [514, 694, 2], [1088, 447, 4], [248, 1090, 2], [283, 504, 1], [494, 494, 6], [1048, 175, 1], [276, 201, 3], [1228, 1228, 4], [247, 1054, 2], [2339, 111, 2], [829, 829, 2], [275, 1114, 2], [555, 281, 2], [1027, 1227, 3], [26, 1718, 1], [656, 384, 2], [276, 348, 3], [345, 365, 2], [5403, 109, 1], [232, 337, 1], [356, 356, 5], [502, 710, 2], [530, 271, 2], [1249, 1249, 1], [259, 325, 2], [488, 488, 6], [757, 757, 1], [1088, 441, 4], [1136, 69, 3], [176, 256, 2], [259, 333, 2], [381, 632, 2], [1026, 499, 4], [1040, 325, 2], [235, 229, 4], [403, 281, 2], [1512, 365, 6], [313, 264, 2], [533, 533, 5], [1035, 525, 6], [1042, 360, 2], [1338, 585, 1], [299, 230, 5], [640, 640, 4], [1028, 426, 3], [196, 196, 6], [202, 715, 2], [697, 416, 2], [1221, 1221, 4], [68, 407, 2], [188, 250, 2], [191, 1792, 1], [267, 254, 1], [376, 367, 2], [465, 645, 1], [606, 380, 2], [1088, 435, 4], [214, 254, 1], [589, 729, 1], [547, 322, 2], [701, 701, 1], [1040, 348, 2], [324, 538, 3], [389, 235, 4], [248, 1054, 2], [318, 234, 5], [390, 1300, 1], [646, 646, 1], [1042, 1322, 2], [1333, 271, 4], [284, 460, 2], [1084, 273, 4], [16, 2352, 1], [259, 1140, 2], [708, 520, 2], [342, 252, 1], [281, 555, 2], [388, 295, 2], [615, 528, 2], [230, 307, 5], [321, 242, 2], [479, 273, 2], [1471, 680, 1], [190, 795, 2], [447, 280, 2], [1039, 1057, 4], [1040, 1145, 2], [1252, 296, 6], [288, 201, 3], [312, 174, 2], [483, 602, 2], [789, 789, 2], [1031, 1274, 3], [279, 216, 3], [649, 649, 1], [1030, 409, 3], [257, 255, 3], [1024, 583, 4], [227, 625, 2], [293, 471, 2], [301, 301, 1], [394, 685, 2], [427, 427, 1], [866, 399, 2], [431, 256, 2], [575, 575, 2], [1067, 217, 4], [309, 225, 1], [927, 927, 2], [1030, 1144, 1], [269, 1092, 2], [441, 441, 2], [489, 489, 5], [1025, 672, 4], [1026, 1083, 4], [1028, 295, 7], [1341, 1341, 4], [304, 264, 2], [337, 232, 2], [1025, 769, 4], [1745, 597, 2], [296, 703, 2], [63, 65, 1], [246, 350, 2], [496, 496, 6], [391, 391, 5], [1365, 710, 4], [243, 198, 1], [261, 356, 3], [402, 402, 4], [560, 560, 4], [1512, 366, 6], [379, 295, 2], [522, 522, 5], [267, 350, 2], [1331, 647, 1], [1027, 1233, 3], [1036, 265, 4], [1071, 284, 4], [1363, 1027, 1], [398, 586, 1], [1324, 827, 1], [190, 257, 2], [1030, 1149, 1], [72, 797, 1], [318, 265, 2], [314, 250, 2], [579, 416, 2], [508, 70, 1], [3823, 21, 1], [174, 278, 2], [747, 406, 2], [2034, 129, 2], [240, 1167, 2], [324, 265, 2], [517, 456, 2], [823, 823, 1], [68, 69, 3], [193, 703, 2], [216, 279, 3], [362, 217, 1], [518, 353, 4], [435, 403, 2], [435, 260, 2], [1251, 70, 2], [272, 491, 2], [411, 658, 2], [621, 1819, 2], [1297, 249, 4], [270, 719, 2], [65, 66, 3], [650, 348, 2], [1094, 359, 6], [1098, 653, 2], [314, 1092, 2], [328, 612, 2], [1029, 317, 4], [1111, 1103, 2], [2106, 732, 4], [190, 830, 2], [248, 345, 2], [60, 2198, 1], [262, 935, 2], [704, 343, 2], [316, 241, 1], [744, 246, 2], [1174, 1174, 4], [318, 204, 2], [1162, 349, 4], [834, 834, 2], [284, 176, 2], [477, 295, 2], [152, 152, 2], [389, 235, 2], [438, 974, 2], [1152, 350, 7], [283, 373, 1], [305, 475, 1], [339, 1036, 2], [419, 454, 1], [580, 300, 2], [252, 342, 1], [564, 269, 2], [654, 348, 2], [847, 537, 2], [527, 527, 5], [563, 997, 2], [275, 1038, 2], [1047, 175, 1], [292, 420, 2], [174, 482, 2], [188, 730, 2], [351, 529, 5], [335, 855, 2], [358, 1334, 2], [880, 249, 2], [227, 242, 1], [267, 365, 2], [1233, 1027, 1], [226, 239, 1], [784, 784, 2], [241, 317, 2], [1026, 468, 4], [285, 363, 1], [338, 699, 2], [1362, 310, 4], [442, 381, 2], [788, 561, 1], [23, 22, 1], [413, 588, 1], [442, 243, 2], [665, 665, 3], [670, 1109, 2], [229, 234, 5], [323, 308, 1], [371, 237, 2], [431, 251, 2], [200, 226, 1], [241, 316, 2], [304, 633, 2], [1201, 230, 6], [239, 226, 1], [377, 525, 2], [700, 700, 4], [1035, 523, 6], [259, 1044, 2], [296, 746, 2], [1747, 570, 1], [382, 232, 1], [886, 886, 3], [247, 350, 2], [255, 255, 6], [190, 857, 2], [354, 349, 2], [358, 249, 2], [1374, 254, 6], [439, 380, 2], [721, 721, 2], [782, 782, 1], [1061, 1096, 4], [1152, 345, 7], [193, 455, 2], [193, 494, 2], [387, 250, 2], [401, 312, 2], [478, 1941, 1], [307, 307, 7], [557, 228, 2], [1091, 295, 4], [1545, 379, 7], [258, 214, 2], [842, 684, 2], [71, 662, 1], [1074, 1468, 3], [1412, 194, 1], [517, 453, 2], [2314, 75, 2], [195, 195, 4], [751, 260, 2], [1060, 1030, 1], [1298, 596, 1], [68, 1367, 1], [713, 374, 2], [1460, 1460, 2], [370, 370, 5], [962, 962, 2], [297, 297, 5], [414, 272, 2], [503, 955, 2], [217, 234, 2], [1048, 176, 2], [230, 235, 5], [364, 380, 2], [505, 974, 2], [577, 333, 2], [1031, 367, 5], [1059, 289, 4], [474, 276, 2], [317, 241, 1], [548, 543, 1], [1008, 1008, 2], [246, 692, 2], [342, 210, 1], [67, 66, 2], [247, 759, 2], [1120, 235, 5], [1041, 477, 2], [216, 196, 1], [240, 269, 2], [802, 802, 3], [340, 316, 2], [663, 406, 2], [1567, 461, 4], [1088, 458, 4], [27, 28, 1], [275, 385, 3], [286, 286, 5], [618, 618, 4], [1125, 234, 5], [200, 231, 1], [230, 234, 5], [484, 484, 6], [714, 469, 2], [723, 326, 1], [458, 281, 2], [1530, 393, 4], [240, 1096, 2], [253, 361, 3], [693, 343, 2], [1025, 682, 4], [379, 379, 2], [1030, 1151, 3], [497, 437, 1], [525, 377, 2], [280, 176, 2], [294, 752, 2], [313, 498, 3], [357, 348, 2], [449, 449, 5], [545, 202, 2], [778, 718, 2], [229, 301, 5], [337, 232, 1], [822, 381, 2], [706, 329, 2], [1001, 1001, 2], [279, 383, 3], [325, 348, 2], [1423, 295, 4], [204, 324, 2], [492, 492, 4], [197, 197, 3], [389, 389, 5], [433, 645, 1], [609, 609, 4], [174, 222, 2], [260, 281, 2], [550, 259, 2], [1062, 312, 4], [1400, 64, 2], [193, 488, 2], [283, 65, 1], [296, 520, 2], [334, 664, 2], [346, 407, 3], [68, 70, 1], [266, 493, 1], [546, 546, 2], [1028, 431, 5], [1061, 273, 4], [362, 362, 4], [598, 598, 3], [1458, 374, 4], [271, 395, 3], [320, 267, 2], [375, 459, 2], [190, 250, 2], [273, 479, 2], [673, 673, 4], [742, 742, 1], [607, 607, 4], [1450, 1148, 2], [315, 315, 4], [429, 285, 1], [366, 254, 2], [426, 256, 2], [1030, 447, 3], [1166, 214, 4], [1297, 1049, 4], [386, 237, 1], [577, 571, 2], [604, 796, 1], [679, 129, 1], [265, 1046, 2], [458, 294, 2], [190, 219, 2], [277, 443, 2], [576, 416, 2], [1040, 1073, 2], [1178, 1178, 4], [1270, 457, 1], [228, 557, 2], [261, 541, 2], [471, 885, 2], [766, 766, 3], [188, 248, 1], [274, 270, 2], [313, 267, 2], [481, 592, 2], [1053, 259, 4], [468, 643, 3], [472, 200, 2], [896, 659, 1], [975, 975, 2], [1091, 272, 4], [1477, 392, 1], [332, 332, 5], [486, 988, 2], [753, 753, 3], [1212, 70, 1], [175, 1158, 3], [190, 891, 2], [288, 201, 1], [809, 824, 2], [1016, 1016, 2], [246, 1069, 2], [972, 636, 1], [540, 443, 2], [610, 304, 2], [1030, 403, 3], [215, 215, 4], [225, 199, 1], [475, 305, 2], [1024, 542, 4], [1057, 1245, 4], [725, 278, 2], [1041, 453, 2], [174, 272, 2], [518, 353, 3], [327, 258, 3], [384, 423, 2], [188, 740, 2], [190, 860, 2], [334, 322, 2], [663, 393, 2], [690, 690, 3], [1818, 222, 4], [284, 1133, 2], [302, 302, 5], [773, 339, 2], [265, 345, 2], [551, 898, 2], [214, 339, 2], [252, 340, 1], [807, 687, 2], [1183, 1183, 4], [378, 64, 1], [622, 406, 2], [1210, 229, 6], [1298, 588, 1], [246, 365, 2], [1366, 1044, 3], [19, 817, 1], [31, 31, 1], [201, 253, 3], [952, 594, 2], [1042, 445, 2], [1098, 352, 2], [625, 537, 2], [717, 359, 2], [1026, 1118, 4], [1105, 199, 1], [386, 237, 2], [576, 322, 2], [425, 425, 5], [953, 953, 1], [1400, 1116, 2], [1844, 103, 2], [260, 1128, 2], [431, 269, 2], [434, 599, 2], [454, 419, 1], [504, 64, 1], [882, 882, 3], [262, 262, 1], [462, 174, 2], [388, 388, 2], [411, 411, 5], [250, 196, 1], [287, 287, 5], [1270, 1105, 1], [1338, 584, 1], [333, 333, 4], [66, 1106, 1], [176, 251, 2], [835, 835, 2], [1337, 1337, 2], [1031, 1396, 1], [1062, 1109, 4], [1134, 348, 2], [228, 219, 2], [391, 234, 2], [553, 684, 2], [102, 1722, 1], [770, 770, 3], [1062, 314, 4], [435, 281, 2], [1036, 247, 4], [299, 299, 1], [1029, 342, 4], [460, 566, 2], [1026, 1083, 1], [341, 473, 3], [384, 383, 2], [446, 1123, 1], [1026, 572, 4], [275, 521, 2], [1061, 312, 4], [1489, 432, 1], [174, 269, 2], [438, 1242, 1], [1545, 388, 7], [674, 521, 2], [722, 451, 1], [781, 278, 2], [1057, 404, 4], [205, 67, 1], [265, 350, 2], [372, 280, 2], [372, 1206, 2], [1024, 549, 4], [279, 257, 3], [654, 374, 2], [1211, 1211, 4], [338, 322, 2], [392, 570, 1], [464, 547, 2], [739, 739, 3], [1154, 378, 1], [1060, 174, 2], [1395, 1052, 1], [447, 277, 2], [1798, 209, 2], [153, 153, 3], [481, 592, 1], [606, 381, 2], [259, 678, 2], [1151, 281, 4], [367, 289, 2], [696, 696, 3], [151, 151, 1], [270, 763, 2], [357, 602, 2], [1041, 491, 2], [234, 415, 2], [249, 913, 2], [628, 461, 2], [330, 310, 1], [351, 219, 2], [360, 176, 2], [579, 843, 1], [1470, 375, 4], [245, 1109, 2], [615, 361, 2], [624, 624, 1], [252, 289, 2], [414, 314, 2], [1197, 1197, 4], [217, 1046, 1], [317, 210, 1], [399, 1070, 2], [568, 472, 2], [1026, 522, 4], [1455, 381, 4], [380, 439, 2], [1044, 348, 4], [637, 585, 1], [409, 280, 2], [413, 596, 1], [711, 711, 3], [1028, 431, 3], [188, 777, 2], [1024, 507, 4], [357, 328, 2], [1134, 357, 2], [252, 451, 1], [266, 538, 1], [1026, 555, 4], [1027, 1180, 1], [1027, 1185, 1], [1076, 627, 4], [176, 273, 2], [562, 562, 4], [58, 1693, 1], [930, 930, 2], [1048, 175, 2], [308, 422, 2], [534, 1023, 2], [601, 548, 2], [1041, 449, 2], [214, 1066, 2], [385, 385, 5], [346, 407, 1], [366, 345, 2], [391, 229, 4], [689, 383, 2], [332, 1167, 3], [578, 741, 2], [981, 981, 1], [999, 999, 2], [2342, 192, 2], [190, 992, 2], [1102, 1102, 3], [397, 349, 2], [358, 349, 2], [1075, 426, 4], [1098, 651, 2], [217, 448, 2], [254, 350, 2], [1212, 1212, 1], [1281, 205, 4], [246, 1067, 2], [330, 1199, 1], [253, 355, 3], [1099, 1099, 3], [1028, 1449, 1], [230, 389, 4], [414, 312, 2], [2168, 668, 1], [193, 734, 2], [1666, 509, 4], [234, 304, 1], [264, 519, 1], [683, 683, 3], [942, 22, 1], [1061, 272, 4], [69, 371, 2], [576, 535, 2], [819, 819, 3], [1031, 397, 3], [352, 1059, 2], [531, 342, 3], [859, 528, 2], [260, 458, 2], [581, 280, 2], [689, 461, 2], [19, 1717, 1], [248, 762, 2], [324, 235, 5], [440, 584, 1], [765, 319, 1], [995, 995, 2], [1164, 1073, 2], [231, 200, 2], [428, 660, 1], [559, 176, 5], [837, 837, 3], [1110, 259, 6], [1306, 1027, 1], [163, 163, 2], [243, 406, 2], [793, 793, 3], [368, 382, 1], [369, 369, 4], [569, 63, 1], [671, 550, 2], [676, 676, 4], [249, 289, 2], [261, 245, 3], [314, 401, 2], [1055, 327, 4], [1056, 328, 4], [1365, 1365, 4], [261, 393, 3], [426, 269, 2], [552, 552, 4], [774, 774, 2], [1033, 196, 6], [190, 821, 2], [364, 625, 2], [708, 708, 3], [1029, 412, 4], [1141, 239, 3], [196, 295, 2], [367, 715, 2], [373, 283, 1], [325, 1073, 2], [415, 415, 5], [438, 979, 2], [1191, 62, 1], [1782, 15, 2], [1024, 558, 4], [66, 67, 3], [275, 176, 2], [300, 418, 2], [357, 327, 2], [1121, 1163, 2], [1388, 585, 1], [267, 1044, 2], [438, 1242, 2], [275, 499, 2], [357, 756, 2], [497, 684, 2], [532, 340, 2], [642, 642, 3], [1030, 1144, 5], [1063, 214, 4], [480, 620, 3], [641, 1096, 2], [2233, 760, 2], [190, 869, 2], [201, 276, 3], [288, 375, 2], [326, 326, 3], [498, 904, 2], [575, 575, 5], [931, 596, 1], [1071, 260, 4], [1091, 312, 4], [335, 194, 1], [352, 714, 2], [216, 216, 7], [449, 1109, 2], [267, 265, 2], [942, 1633, 1], [1349, 433, 4], [491, 272, 2], [681, 681, 3], [719, 719, 2], [808, 270, 2], [1052, 174, 2], [1138, 329, 4], [230, 217, 2], [284, 435, 2], [277, 176, 2], [335, 194, 2], [840, 402, 2], [514, 938, 2], [1039, 246, 4], [476, 861, 2], [619, 510, 2], [201, 255, 3], [276, 472, 1], [465, 1123, 1], [577, 1162, 2], [616, 281, 2], [1231, 1231, 4], [479, 258, 2], [1052, 332, 2], [1153, 436, 4], [2578, 59, 2], [301, 234, 1], [370, 652, 2], [426, 295, 2], [1028, 312, 7], [1382, 1382, 2], [242, 227, 1], [256, 388, 2], [1285, 1285, 4], [214, 248, 1], [275, 174, 2], [644, 334, 2], [650, 355, 2], [241, 317, 1], [820, 561, 1], [1415, 586, 1], [188, 247, 1], [441, 409, 2], [467, 228, 3], [788, 586, 1], [1348, 667, 1], [254, 813, 2], [1033, 1024, 5], [365, 217, 2], [1157, 349, 6], [1170, 1083, 4], [357, 587, 2], [373, 64, 2], [470, 587, 2], [563, 322, 2], [855, 855, 2], [251, 379, 2], [459, 698, 2], [1006, 537, 2], [887, 500, 2], [323, 323, 4], [424, 387, 2], [1144, 1030, 1], [365, 254, 2], [401, 273, 2], [406, 243, 2], [68, 371, 1], [632, 381, 2], [725, 725, 2], [1512, 345, 6], [320, 320, 7], [1031, 354, 5], [646, 646, 3], [1027, 1036, 1], [307, 594, 2], [680, 597, 1], [1196, 1196, 4], [274, 220, 2], [316, 340, 2], [341, 473, 4], [563, 429, 2], [253, 214, 2], [454, 418, 1], [493, 266, 1], [593, 319, 1], [918, 918, 3], [1744, 569, 1], [252, 317, 1], [1057, 417, 4], [268, 395, 3], [299, 234, 1], [405, 285, 2], [431, 295, 2], [249, 397, 2], [543, 255, 2], [329, 487, 1], [1291, 1291, 4], [5282, 106, 1], [174, 236, 2], [580, 356, 2], [706, 448, 2], [804, 804, 1], [893, 893, 3], [1046, 1046, 3], [1512, 350, 6], [193, 746, 2], [304, 234, 1], [1304, 226, 1], [1525, 292, 4], [1540, 508, 4], [1651, 379, 6], [210, 289, 2], [1025, 779, 4], [374, 713, 2], [268, 216, 3], [630, 630, 3], [1084, 269, 4], [338, 686, 2], [370, 236, 2], [959, 528, 2], [1313, 582, 1], [1378, 1047, 4], [1030, 1149, 5], [1311, 1027, 1], [1343, 446, 1], [275, 280, 2], [400, 400, 5], [538, 266, 1], [246, 366, 2], [257, 257, 5], [1036, 1050, 1], [1272, 227, 1], [176, 269, 2], [1072, 1143, 4], [1331, 1331, 1], [300, 321, 1], [325, 327, 2], [1149, 1030, 1], [97, 97, 1], [1026, 235, 4], [399, 885, 2], [453, 517, 2], [810, 810, 1], [997, 997, 2], [444, 667, 1], [234, 299, 1], [421, 377, 2], [1056, 334, 4], [567, 567, 4], [219, 344, 3], [656, 656, 1], [816, 816, 3], [1066, 217, 6], [501, 501, 6], [65, 65, 4], [204, 318, 2], [387, 424, 2], [176, 236, 2], [301, 301, 7], [440, 659, 1], [324, 230, 1], [328, 247, 3], [185, 199, 2], [204, 511, 2], [805, 805, 2], [1063, 369, 4], [253, 443, 3], [414, 295, 2], [631, 354, 2], [777, 777, 2], [1534, 383, 4], [475, 70, 1], [1070, 1410, 3], [1206, 1206, 4], [380, 356, 2], [514, 534, 2], [357, 568, 2], [426, 272, 2], [462, 657, 3], [227, 364, 2], [1190, 1190, 4], [2244, 775, 2], [61, 62, 1], [434, 394, 2], [229, 235, 5], [1319, 561, 1], [365, 214, 2], [605, 605, 3], [107, 1632, 1], [261, 566, 2], [408, 290, 2], [226, 200, 1], [688, 361, 2], [1030, 1144, 3], [1138, 217, 4], [385, 281, 2], [398, 418, 1], [485, 849, 2], [250, 387, 2], [514, 1014, 2], [677, 1113, 2], [18, 896, 1], [313, 299, 3], [767, 767, 1], [267, 366, 2], [363, 262, 2], [1359, 1359, 2], [264, 512, 1], [284, 174, 2], [547, 1022, 2], [926, 926, 2], [248, 248, 1], [529, 529, 6], [648, 1039, 2], [697, 448, 2], [241, 316, 1], [833, 833, 3], [1117, 1117, 4], [391, 633, 2], [556, 556, 5], [669, 300, 2], [308, 308, 4], [477, 216, 2], [844, 844, 2], [1248, 1248, 4], [1677, 463, 4], [422, 422, 3], [1025, 641, 4], [254, 345, 2], [359, 717, 2], [482, 174, 2], [811, 246, 2], [267, 246, 2], [1894, 660, 2], [193, 752, 2], [294, 521, 2], [333, 1140, 2], [1026, 484, 4], [69, 305, 1], [176, 474, 2], [376, 1344, 2], [477, 236, 2], [1053, 325, 4], [1313, 1313, 1], [1529, 1529, 2], [113, 113, 1], [240, 240, 7], [245, 261, 3], [225, 199, 2], [316, 210, 1], [362, 322, 2], [1053, 328, 4], [357, 375, 2], [1041, 479, 2], [1069, 217, 4], [2708, 182, 4], [25, 24, 1], [524, 346, 3], [1369, 231, 4], [64, 504, 1]]} \ No newline at end of file +{ + "spatial_merges": [ + [ + 152, + 164 + ], + [ + 133, + 183 + ], + [ + 22, + 105 + ], + [ + 67, + 184 + ], + [ + 185, + 186 + ], + [ + 181, + 187 + ], + [ + 175, + 182 + ], + [ + 187, + 189 + ], + [ + 181, + 184 + ], + [ + 181, + 183 + ], + [ + 175, + 188 + ], + [ + 181, + 186 + ], + [ + 21, + 105 + ], + [ + 67, + 185 + ], + [ + 133, + 181 + ], + [ + 23, + 105 + ], + [ + 22, + 104 + ], + [ + 22, + 106 + ], + [ + 68, + 185 + ], + [ + 182, + 187 + ], + [ + 134, + 192 + ], + [ + 132, + 192 + ], + [ + 66, + 191 + ], + [ + 153, + 164 + ], + [ + 151, + 164 + ], + [ + 152, + 165 + ], + [ + 152, + 163 + ], + [ + 182, + 184 + ], + [ + 183, + 189 + ], + [ + 68, + 191 + ], + [ + 186, + 189 + ], + [ + 191, + 201 + ], + [ + 175, + 194 + ], + [ + 66, + 185 + ], + [ + 185, + 205 + ], + [ + 182, + 183 + ], + [ + 184, + 189 + ], + [ + 67, + 175 + ], + [ + 134, + 181 + ], + [ + 175, + 196 + ], + [ + 132, + 181 + ], + [ + 133, + 189 + ], + [ + 21, + 104 + ], + [ + 21, + 106 + ], + [ + 23, + 104 + ], + [ + 134, + 211 + ], + [ + 197, + 207 + ], + [ + 197, + 206 + ], + [ + 23, + 106 + ], + [ + 65, + 191 + ], + [ + 133, + 182 + ], + [ + 197, + 208 + ], + [ + 197, + 209 + ], + [ + 132, + 211 + ], + [ + 69, + 191 + ], + [ + 182, + 186 + ], + [ + 22, + 107 + ], + [ + 67, + 195 + ], + [ + 132, + 218 + ], + [ + 22, + 103 + ], + [ + 24, + 105 + ], + [ + 20, + 105 + ], + [ + 67, + 198 + ], + [ + 194, + 200 + ], + [ + 194, + 195 + ], + [ + 194, + 198 + ], + [ + 201, + 210 + ], + [ + 67, + 200 + ], + [ + 195, + 213 + ], + [ + 134, + 218 + ], + [ + 68, + 195 + ], + [ + 194, + 199 + ], + [ + 68, + 199 + ], + [ + 198, + 213 + ], + [ + 67, + 199 + ], + [ + 68, + 198 + ], + [ + 199, + 212 + ], + [ + 195, + 215 + ], + [ + 66, + 198 + ], + [ + 200, + 205 + ], + [ + 196, + 224 + ], + [ + 135, + 192 + ], + [ + 196, + 204 + ], + [ + 131, + 192 + ], + [ + 196, + 203 + ], + [ + 66, + 200 + ], + [ + 196, + 228 + ], + [ + 175, + 203 + ], + [ + 66, + 195 + ], + [ + 216, + 219 + ], + [ + 201, + 219 + ], + [ + 203, + 220 + ], + [ + 198, + 215 + ], + [ + 68, + 200 + ], + [ + 175, + 214 + ], + [ + 175, + 204 + ], + [ + 66, + 199 + ], + [ + 203, + 222 + ], + [ + 204, + 222 + ], + [ + 204, + 220 + ], + [ + 64, + 191 + ], + [ + 175, + 217 + ], + [ + 65, + 185 + ], + [ + 153, + 163 + ], + [ + 151, + 165 + ], + [ + 69, + 185 + ], + [ + 210, + 216 + ], + [ + 131, + 181 + ], + [ + 175, + 212 + ], + [ + 135, + 181 + ], + [ + 132, + 182 + ], + [ + 199, + 215 + ], + [ + 196, + 236 + ], + [ + 200, + 215 + ], + [ + 151, + 163 + ], + [ + 175, + 205 + ], + [ + 206, + 221 + ], + [ + 24, + 104 + ], + [ + 207, + 223 + ], + [ + 153, + 165 + ], + [ + 134, + 189 + ], + [ + 207, + 221 + ], + [ + 70, + 191 + ], + [ + 134, + 182 + ], + [ + 206, + 223 + ], + [ + 20, + 106 + ], + [ + 20, + 104 + ], + [ + 24, + 106 + ], + [ + 132, + 189 + ], + [ + 199, + 213 + ], + [ + 209, + 221 + ], + [ + 200, + 213 + ], + [ + 21, + 103 + ], + [ + 206, + 233 + ], + [ + 207, + 233 + ], + [ + 208, + 223 + ], + [ + 22, + 108 + ], + [ + 208, + 221 + ], + [ + 23, + 103 + ], + [ + 185, + 232 + ], + [ + 21, + 107 + ], + [ + 209, + 223 + ], + [ + 201, + 204 + ], + [ + 22, + 102 + ], + [ + 198, + 212 + ], + [ + 195, + 212 + ], + [ + 200, + 232 + ], + [ + 23, + 107 + ], + [ + 25, + 105 + ], + [ + 228, + 240 + ], + [ + 69, + 199 + ], + [ + 195, + 205 + ], + [ + 67, + 204 + ], + [ + 19, + 105 + ], + [ + 65, + 203 + ], + [ + 198, + 205 + ], + [ + 199, + 237 + ], + [ + 208, + 233 + ], + [ + 206, + 224 + ], + [ + 209, + 233 + ], + [ + 195, + 274 + ], + [ + 207, + 224 + ], + [ + 196, + 230 + ], + [ + 67, + 203 + ], + [ + 204, + 250 + ], + [ + 200, + 212 + ], + [ + 199, + 238 + ], + [ + 196, + 229 + ], + [ + 208, + 224 + ], + [ + 210, + 255 + ], + [ + 209, + 224 + ], + [ + 195, + 238 + ], + [ + 68, + 226 + ], + [ + 66, + 227 + ], + [ + 185, + 237 + ], + [ + 198, + 238 + ], + [ + 203, + 216 + ], + [ + 198, + 282 + ], + [ + 68, + 225 + ], + [ + 199, + 205 + ], + [ + 65, + 200 + ], + [ + 68, + 227 + ], + [ + 196, + 234 + ], + [ + 196, + 235 + ], + [ + 196, + 241 + ], + [ + 66, + 204 + ], + [ + 203, + 257 + ], + [ + 236, + 245 + ], + [ + 69, + 203 + ], + [ + 195, + 220 + ], + [ + 64, + 203 + ], + [ + 68, + 231 + ], + [ + 201, + 203 + ], + [ + 200, + 238 + ], + [ + 67, + 226 + ], + [ + 63, + 191 + ], + [ + 206, + 263 + ], + [ + 67, + 227 + ], + [ + 67, + 243 + ], + [ + 65, + 204 + ], + [ + 66, + 225 + ], + [ + 67, + 225 + ], + [ + 198, + 220 + ], + [ + 69, + 204 + ], + [ + 67, + 231 + ], + [ + 207, + 263 + ], + [ + 197, + 286 + ], + [ + 69, + 210 + ], + [ + 197, + 287 + ], + [ + 71, + 191 + ], + [ + 66, + 231 + ], + [ + 67, + 244 + ], + [ + 66, + 226 + ], + [ + 212, + 225 + ], + [ + 196, + 252 + ], + [ + 24, + 103 + ], + [ + 131, + 218 + ], + [ + 175, + 201 + ], + [ + 208, + 263 + ], + [ + 212, + 227 + ], + [ + 222, + 229 + ], + [ + 205, + 226 + ], + [ + 204, + 216 + ], + [ + 66, + 243 + ], + [ + 68, + 203 + ], + [ + 130, + 181 + ], + [ + 222, + 230 + ], + [ + 22, + 109 + ], + [ + 197, + 297 + ], + [ + 201, + 241 + ], + [ + 20, + 103 + ], + [ + 209, + 263 + ], + [ + 197, + 302 + ], + [ + 64, + 185 + ], + [ + 205, + 231 + ], + [ + 25, + 104 + ], + [ + 25, + 106 + ], + [ + 136, + 181 + ], + [ + 194, + 226 + ], + [ + 20, + 107 + ], + [ + 194, + 225 + ], + [ + 194, + 231 + ], + [ + 175, + 216 + ], + [ + 174, + 202 + ], + [ + 131, + 182 + ], + [ + 136, + 192 + ], + [ + 65, + 199 + ], + [ + 19, + 104 + ], + [ + 176, + 202 + ], + [ + 70, + 185 + ], + [ + 24, + 107 + ], + [ + 68, + 244 + ], + [ + 176, + 188 + ], + [ + 210, + 268 + ], + [ + 67, + 239 + ], + [ + 130, + 192 + ], + [ + 194, + 227 + ], + [ + 19, + 106 + ], + [ + 174, + 188 + ], + [ + 68, + 243 + ], + [ + 195, + 291 + ], + [ + 21, + 102 + ], + [ + 201, + 270 + ], + [ + 21, + 108 + ], + [ + 222, + 235 + ], + [ + 203, + 285 + ], + [ + 219, + 261 + ], + [ + 199, + 220 + ], + [ + 135, + 218 + ], + [ + 135, + 182 + ], + [ + 219, + 253 + ], + [ + 26, + 105 + ], + [ + 200, + 220 + ], + [ + 201, + 228 + ], + [ + 23, + 102 + ], + [ + 222, + 234 + ], + [ + 203, + 255 + ], + [ + 216, + 278 + ], + [ + 66, + 244 + ], + [ + 215, + 225 + ], + [ + 207, + 293 + ], + [ + 65, + 198 + ], + [ + 23, + 108 + ], + [ + 22, + 101 + ], + [ + 209, + 303 + ], + [ + 215, + 226 + ], + [ + 210, + 253 + ], + [ + 69, + 195 + ], + [ + 206, + 293 + ], + [ + 69, + 200 + ], + [ + 206, + 303 + ], + [ + 200, + 291 + ], + [ + 70, + 203 + ], + [ + 194, + 243 + ], + [ + 216, + 236 + ], + [ + 18, + 105 + ], + [ + 219, + 258 + ], + [ + 131, + 211 + ], + [ + 70, + 204 + ], + [ + 199, + 298 + ], + [ + 69, + 198 + ], + [ + 195, + 298 + ], + [ + 194, + 244 + ], + [ + 206, + 306 + ], + [ + 232, + 239 + ], + [ + 175, + 230 + ], + [ + 208, + 311 + ], + [ + 204, + 268 + ], + [ + 219, + 271 + ], + [ + 207, + 306 + ], + [ + 206, + 290 + ], + [ + 175, + 229 + ], + [ + 210, + 258 + ], + [ + 207, + 311 + ], + [ + 66, + 239 + ], + [ + 209, + 292 + ], + [ + 198, + 298 + ], + [ + 208, + 290 + ], + [ + 207, + 303 + ], + [ + 65, + 210 + ], + [ + 207, + 292 + ], + [ + 64, + 204 + ], + [ + 207, + 290 + ], + [ + 150, + 164 + ], + [ + 204, + 245 + ], + [ + 70, + 210 + ], + [ + 154, + 164 + ], + [ + 199, + 305 + ], + [ + 204, + 276 + ], + [ + 206, + 292 + ], + [ + 203, + 240 + ], + [ + 226, + 232 + ], + [ + 203, + 279 + ], + [ + 204, + 288 + ], + [ + 228, + 253 + ], + [ + 209, + 311 + ], + [ + 208, + 292 + ], + [ + 215, + 231 + ], + [ + 215, + 227 + ], + [ + 198, + 291 + ], + [ + 213, + 227 + ], + [ + 66, + 203 + ], + [ + 213, + 226 + ], + [ + 63, + 203 + ], + [ + 206, + 311 + ], + [ + 225, + 237 + ], + [ + 208, + 303 + ], + [ + 65, + 195 + ], + [ + 209, + 293 + ], + [ + 208, + 293 + ], + [ + 175, + 234 + ], + [ + 195, + 232 + ], + [ + 200, + 283 + ], + [ + 231, + 232 + ], + [ + 227, + 237 + ], + [ + 209, + 290 + ], + [ + 196, + 316 + ], + [ + 253, + 270 + ], + [ + 236, + 261 + ], + [ + 201, + 230 + ], + [ + 68, + 242 + ], + [ + 209, + 306 + ], + [ + 196, + 317 + ], + [ + 174, + 252 + ], + [ + 198, + 232 + ], + [ + 67, + 242 + ], + [ + 204, + 240 + ], + [ + 237, + 242 + ], + [ + 64, + 210 + ], + [ + 213, + 231 + ], + [ + 205, + 239 + ], + [ + 208, + 306 + ], + [ + 201, + 278 + ], + [ + 175, + 235 + ], + [ + 176, + 252 + ], + [ + 201, + 229 + ], + [ + 176, + 241 + ], + [ + 213, + 225 + ], + [ + 25, + 103 + ], + [ + 219, + 279 + ], + [ + 199, + 232 + ], + [ + 216, + 228 + ], + [ + 216, + 270 + ], + [ + 261, + 278 + ], + [ + 219, + 276 + ], + [ + 200, + 237 + ], + [ + 62, + 191 + ], + [ + 72, + 191 + ], + [ + 210, + 288 + ], + [ + 199, + 282 + ], + [ + 203, + 245 + ], + [ + 204, + 258 + ], + [ + 174, + 241 + ], + [ + 185, + 283 + ], + [ + 210, + 333 + ], + [ + 239, + 335 + ], + [ + 63, + 185 + ], + [ + 66, + 300 + ], + [ + 200, + 274 + ], + [ + 25, + 107 + ], + [ + 216, + 229 + ], + [ + 19, + 107 + ], + [ + 20, + 108 + ], + [ + 24, + 102 + ], + [ + 195, + 237 + ], + [ + 19, + 103 + ], + [ + 64, + 199 + ], + [ + 223, + 287 + ], + [ + 210, + 276 + ], + [ + 71, + 204 + ], + [ + 65, + 239 + ], + [ + 223, + 286 + ], + [ + 216, + 230 + ], + [ + 20, + 102 + ], + [ + 22, + 110 + ], + [ + 212, + 242 + ], + [ + 68, + 308 + ], + [ + 221, + 286 + ], + [ + 66, + 242 + ], + [ + 198, + 237 + ], + [ + 175, + 266 + ], + [ + 68, + 239 + ], + [ + 64, + 200 + ], + [ + 67, + 300 + ], + [ + 175, + 259 + ], + [ + 69, + 242 + ], + [ + 135, + 211 + ], + [ + 221, + 297 + ], + [ + 67, + 331 + ], + [ + 204, + 253 + ], + [ + 26, + 106 + ], + [ + 201, + 234 + ], + [ + 69, + 225 + ], + [ + 200, + 282 + ], + [ + 210, + 261 + ], + [ + 201, + 236 + ], + [ + 70, + 199 + ], + [ + 131, + 189 + ], + [ + 67, + 319 + ], + [ + 205, + 243 + ], + [ + 201, + 235 + ], + [ + 210, + 279 + ], + [ + 69, + 227 + ], + [ + 270, + 271 + ], + [ + 210, + 285 + ], + [ + 205, + 244 + ], + [ + 221, + 302 + ], + [ + 199, + 274 + ], + [ + 210, + 271 + ], + [ + 67, + 310 + ], + [ + 221, + 287 + ], + [ + 27, + 105 + ], + [ + 129, + 181 + ], + [ + 26, + 104 + ], + [ + 21, + 109 + ], + [ + 195, + 282 + ], + [ + 175, + 262 + ], + [ + 228, + 271 + ], + [ + 240, + 351 + ], + [ + 68, + 310 + ], + [ + 220, + 226 + ], + [ + 203, + 271 + ], + [ + 24, + 108 + ], + [ + 239, + 283 + ], + [ + 18, + 104 + ], + [ + 216, + 235 + ], + [ + 67, + 308 + ], + [ + 212, + 226 + ], + [ + 196, + 340 + ], + [ + 236, + 258 + ], + [ + 196, + 342 + ], + [ + 212, + 231 + ], + [ + 216, + 234 + ], + [ + 67, + 309 + ], + [ + 220, + 225 + ], + [ + 223, + 297 + ], + [ + 18, + 106 + ], + [ + 137, + 181 + ], + [ + 69, + 226 + ], + [ + 71, + 203 + ], + [ + 66, + 310 + ], + [ + 205, + 225 + ], + [ + 65, + 227 + ], + [ + 223, + 302 + ], + [ + 21, + 101 + ], + [ + 17, + 105 + ], + [ + 68, + 300 + ], + [ + 245, + 353 + ], + [ + 242, + 305 + ], + [ + 228, + 257 + ], + [ + 226, + 291 + ], + [ + 220, + 227 + ], + [ + 203, + 288 + ], + [ + 258, + 278 + ], + [ + 203, + 250 + ], + [ + 204, + 255 + ], + [ + 130, + 182 + ], + [ + 23, + 109 + ], + [ + 229, + 450 + ], + [ + 228, + 250 + ], + [ + 65, + 231 + ], + [ + 239, + 368 + ], + [ + 67, + 336 + ], + [ + 205, + 227 + ], + [ + 64, + 264 + ], + [ + 68, + 309 + ], + [ + 66, + 309 + ], + [ + 201, + 252 + ], + [ + 65, + 242 + ], + [ + 194, + 239 + ], + [ + 226, + 274 + ], + [ + 65, + 226 + ], + [ + 71, + 210 + ], + [ + 216, + 252 + ], + [ + 185, + 373 + ], + [ + 242, + 407 + ], + [ + 203, + 261 + ], + [ + 175, + 264 + ], + [ + 204, + 285 + ], + [ + 152, + 166 + ], + [ + 230, + 455 + ], + [ + 225, + 274 + ], + [ + 228, + 245 + ], + [ + 200, + 337 + ], + [ + 204, + 257 + ], + [ + 220, + 231 + ], + [ + 230, + 240 + ], + [ + 210, + 363 + ], + [ + 225, + 346 + ], + [ + 212, + 243 + ], + [ + 69, + 231 + ], + [ + 210, + 361 + ], + [ + 241, + 250 + ], + [ + 70, + 200 + ], + [ + 203, + 268 + ], + [ + 203, + 333 + ], + [ + 175, + 299 + ], + [ + 66, + 308 + ], + [ + 229, + 245 + ], + [ + 136, + 182 + ], + [ + 23, + 101 + ], + [ + 65, + 243 + ], + [ + 175, + 301 + ], + [ + 212, + 244 + ], + [ + 233, + 297 + ], + [ + 229, + 240 + ], + [ + 63, + 199 + ], + [ + 196, + 299 + ], + [ + 231, + 335 + ], + [ + 152, + 162 + ], + [ + 230, + 245 + ], + [ + 198, + 274 + ], + [ + 233, + 302 + ], + [ + 233, + 286 + ], + [ + 22, + 100 + ], + [ + 252, + 257 + ], + [ + 227, + 282 + ], + [ + 196, + 304 + ], + [ + 266, + 437 + ], + [ + 69, + 244 + ], + [ + 203, + 253 + ], + [ + 230, + 250 + ], + [ + 129, + 192 + ], + [ + 176, + 246 + ], + [ + 66, + 331 + ], + [ + 225, + 298 + ], + [ + 233, + 287 + ], + [ + 219, + 268 + ], + [ + 234, + 372 + ], + [ + 174, + 254 + ], + [ + 231, + 282 + ], + [ + 219, + 255 + ], + [ + 174, + 316 + ], + [ + 185, + 305 + ], + [ + 69, + 243 + ], + [ + 176, + 317 + ], + [ + 235, + 240 + ], + [ + 137, + 192 + ], + [ + 228, + 377 + ], + [ + 234, + 245 + ], + [ + 175, + 313 + ], + [ + 65, + 225 + ], + [ + 66, + 319 + ], + [ + 205, + 310 + ], + [ + 242, + 346 + ], + [ + 219, + 356 + ], + [ + 236, + 257 + ], + [ + 210, + 364 + ], + [ + 228, + 384 + ], + [ + 62, + 203 + ], + [ + 204, + 333 + ], + [ + 196, + 301 + ], + [ + 73, + 191 + ], + [ + 199, + 337 + ], + [ + 196, + 307 + ], + [ + 242, + 371 + ], + [ + 236, + 250 + ], + [ + 70, + 242 + ], + [ + 175, + 318 + ], + [ + 68, + 331 + ], + [ + 227, + 298 + ], + [ + 227, + 238 + ], + [ + 220, + 244 + ], + [ + 63, + 204 + ], + [ + 229, + 257 + ], + [ + 25, + 102 + ], + [ + 225, + 238 + ], + [ + 227, + 346 + ], + [ + 250, + 266 + ], + [ + 135, + 189 + ], + [ + 205, + 308 + ], + [ + 130, + 218 + ], + [ + 240, + 341 + ], + [ + 69, + 239 + ], + [ + 71, + 185 + ], + [ + 226, + 335 + ], + [ + 244, + 274 + ], + [ + 226, + 238 + ], + [ + 196, + 320 + ], + [ + 195, + 337 + ], + [ + 196, + 313 + ], + [ + 70, + 195 + ], + [ + 72, + 204 + ], + [ + 232, + 323 + ], + [ + 63, + 264 + ], + [ + 175, + 304 + ], + [ + 64, + 235 + ], + [ + 68, + 336 + ], + [ + 229, + 250 + ], + [ + 175, + 307 + ], + [ + 194, + 242 + ], + [ + 204, + 363 + ], + [ + 216, + 241 + ], + [ + 241, + 288 + ], + [ + 19, + 108 + ], + [ + 174, + 214 + ], + [ + 154, + 163 + ], + [ + 26, + 103 + ], + [ + 245, + 344 + ], + [ + 236, + 381 + ], + [ + 70, + 198 + ], + [ + 65, + 235 + ], + [ + 64, + 229 + ], + [ + 230, + 372 + ], + [ + 136, + 218 + ], + [ + 232, + 330 + ], + [ + 203, + 258 + ], + [ + 201, + 341 + ], + [ + 176, + 217 + ], + [ + 64, + 230 + ], + [ + 150, + 165 + ], + [ + 236, + 380 + ], + [ + 270, + 276 + ], + [ + 150, + 163 + ], + [ + 270, + 355 + ], + [ + 198, + 337 + ], + [ + 196, + 318 + ], + [ + 212, + 300 + ], + [ + 224, + 286 + ], + [ + 239, + 382 + ], + [ + 62, + 185 + ], + [ + 231, + 238 + ], + [ + 236, + 387 + ], + [ + 235, + 385 + ], + [ + 237, + 321 + ], + [ + 215, + 244 + ], + [ + 194, + 309 + ], + [ + 154, + 165 + ], + [ + 204, + 261 + ], + [ + 194, + 310 + ], + [ + 196, + 324 + ], + [ + 19, + 102 + ], + [ + 68, + 204 + ], + [ + 26, + 107 + ], + [ + 250, + 341 + ], + [ + 174, + 247 + ], + [ + 237, + 315 + ], + [ + 216, + 344 + ], + [ + 194, + 300 + ], + [ + 219, + 355 + ], + [ + 194, + 331 + ], + [ + 235, + 250 + ], + [ + 203, + 361 + ], + [ + 207, + 427 + ], + [ + 174, + 249 + ], + [ + 278, + 279 + ], + [ + 236, + 240 + ], + [ + 65, + 234 + ], + [ + 230, + 257 + ], + [ + 65, + 266 + ], + [ + 212, + 309 + ], + [ + 174, + 354 + ], + [ + 228, + 394 + ], + [ + 245, + 341 + ], + [ + 224, + 287 + ], + [ + 196, + 467 + ], + [ + 230, + 400 + ], + [ + 201, + 316 + ], + [ + 64, + 234 + ], + [ + 220, + 243 + ], + [ + 65, + 229 + ], + [ + 20, + 109 + ], + [ + 206, + 427 + ], + [ + 213, + 243 + ], + [ + 208, + 408 + ], + [ + 240, + 344 + ], + [ + 61, + 191 + ], + [ + 28, + 105 + ], + [ + 257, + 344 + ], + [ + 18, + 103 + ], + [ + 175, + 320 + ], + [ + 231, + 291 + ], + [ + 66, + 336 + ], + [ + 18, + 107 + ], + [ + 196, + 264 + ], + [ + 63, + 210 + ], + [ + 229, + 372 + ], + [ + 234, + 240 + ], + [ + 235, + 245 + ], + [ + 206, + 408 + ], + [ + 25, + 108 + ], + [ + 209, + 420 + ], + [ + 67, + 229 + ], + [ + 222, + 313 + ], + [ + 176, + 289 + ], + [ + 27, + 106 + ], + [ + 234, + 250 + ], + [ + 234, + 257 + ], + [ + 67, + 234 + ], + [ + 65, + 230 + ], + [ + 201, + 317 + ], + [ + 198, + 386 + ], + [ + 176, + 358 + ], + [ + 66, + 323 + ], + [ + 252, + 255 + ], + [ + 175, + 324 + ], + [ + 66, + 330 + ], + [ + 69, + 234 + ], + [ + 216, + 351 + ], + [ + 194, + 308 + ], + [ + 197, + 509 + ], + [ + 194, + 336 + ], + [ + 229, + 255 + ], + [ + 176, + 210 + ], + [ + 224, + 302 + ], + [ + 69, + 230 + ], + [ + 67, + 230 + ], + [ + 64, + 242 + ], + [ + 20, + 101 + ], + [ + 68, + 321 + ], + [ + 235, + 257 + ], + [ + 224, + 297 + ], + [ + 230, + 268 + ], + [ + 229, + 425 + ], + [ + 278, + 356 + ], + [ + 226, + 283 + ], + [ + 197, + 506 + ], + [ + 203, + 276 + ], + [ + 68, + 315 + ], + [ + 22, + 111 + ], + [ + 229, + 385 + ], + [ + 222, + 318 + ], + [ + 176, + 247 + ], + [ + 69, + 229 + ], + [ + 70, + 230 + ], + [ + 203, + 364 + ], + [ + 70, + 229 + ], + [ + 176, + 354 + ], + [ + 71, + 199 + ], + [ + 286, + 290 + ], + [ + 67, + 264 + ], + [ + 16, + 105 + ], + [ + 207, + 420 + ], + [ + 66, + 321 + ], + [ + 230, + 255 + ], + [ + 174, + 358 + ], + [ + 225, + 305 + ], + [ + 205, + 323 + ], + [ + 199, + 392 + ], + [ + 219, + 374 + ], + [ + 242, + 392 + ], + [ + 207, + 452 + ], + [ + 229, + 268 + ], + [ + 200, + 373 + ], + [ + 64, + 198 + ], + [ + 204, + 432 + ], + [ + 176, + 342 + ], + [ + 208, + 420 + ], + [ + 67, + 410 + ], + [ + 27, + 104 + ], + [ + 241, + 276 + ], + [ + 207, + 408 + ], + [ + 200, + 386 + ], + [ + 204, + 279 + ], + [ + 195, + 386 + ], + [ + 235, + 400 + ], + [ + 209, + 408 + ], + [ + 204, + 271 + ], + [ + 65, + 264 + ], + [ + 222, + 301 + ], + [ + 176, + 248 + ], + [ + 205, + 330 + ], + [ + 208, + 427 + ], + [ + 234, + 255 + ], + [ + 287, + 290 + ], + [ + 206, + 452 + ], + [ + 174, + 340 + ], + [ + 201, + 353 + ], + [ + 69, + 264 + ], + [ + 196, + 489 + ], + [ + 232, + 310 + ], + [ + 231, + 283 + ], + [ + 203, + 383 + ], + [ + 17, + 104 + ], + [ + 199, + 283 + ], + [ + 209, + 427 + ], + [ + 231, + 368 + ], + [ + 196, + 473 + ], + [ + 236, + 356 + ], + [ + 24, + 101 + ], + [ + 72, + 210 + ], + [ + 63, + 200 + ], + [ + 174, + 317 + ], + [ + 227, + 305 + ], + [ + 72, + 203 + ], + [ + 67, + 235 + ], + [ + 64, + 195 + ], + [ + 66, + 315 + ], + [ + 70, + 239 + ], + [ + 210, + 395 + ], + [ + 212, + 315 + ], + [ + 232, + 308 + ], + [ + 21, + 110 + ], + [ + 226, + 368 + ], + [ + 206, + 420 + ], + [ + 235, + 255 + ], + [ + 212, + 321 + ], + [ + 228, + 355 + ], + [ + 176, + 316 + ], + [ + 232, + 243 + ], + [ + 232, + 244 + ] + ], + "temporal_merges": [ + [ + 188, + 188, + 2 + ], + [ + 190, + 190, + 2 + ], + [ + 193, + 193, + 2 + ], + [ + 1024, + 1024, + 4 + ], + [ + 1025, + 1025, + 4 + ], + [ + 202, + 202, + 2 + ], + [ + 1026, + 1026, + 4 + ], + [ + 1029, + 1029, + 4 + ], + [ + 1027, + 1027, + 1 + ], + [ + 1024, + 188, + 4 + ], + [ + 1028, + 1028, + 1 + ], + [ + 1025, + 190, + 4 + ], + [ + 214, + 214, + 2 + ], + [ + 1030, + 1030, + 1 + ], + [ + 1026, + 193, + 4 + ], + [ + 217, + 217, + 2 + ], + [ + 188, + 188, + 4 + ], + [ + 190, + 190, + 4 + ], + [ + 193, + 193, + 4 + ], + [ + 1031, + 1031, + 1 + ], + [ + 188, + 214, + 2 + ], + [ + 1029, + 202, + 4 + ], + [ + 188, + 217, + 2 + ], + [ + 174, + 174, + 3 + ], + [ + 176, + 176, + 3 + ], + [ + 249, + 249, + 2 + ], + [ + 1024, + 214, + 4 + ], + [ + 1024, + 217, + 4 + ], + [ + 190, + 1025, + 4 + ], + [ + 214, + 188, + 2 + ], + [ + 188, + 246, + 2 + ], + [ + 248, + 248, + 2 + ], + [ + 247, + 247, + 2 + ], + [ + 262, + 262, + 2 + ], + [ + 259, + 259, + 2 + ], + [ + 249, + 202, + 2 + ], + [ + 193, + 1026, + 4 + ], + [ + 190, + 251, + 2 + ], + [ + 190, + 256, + 2 + ], + [ + 188, + 254, + 2 + ], + [ + 266, + 266, + 2 + ], + [ + 1033, + 217, + 6 + ], + [ + 1024, + 246, + 4 + ], + [ + 188, + 247, + 2 + ], + [ + 264, + 264, + 2 + ], + [ + 188, + 248, + 2 + ], + [ + 241, + 241, + 2 + ], + [ + 193, + 193, + 6 + ], + [ + 188, + 265, + 2 + ], + [ + 214, + 214, + 3 + ], + [ + 252, + 252, + 2 + ], + [ + 1025, + 190, + 6 + ], + [ + 289, + 289, + 2 + ], + [ + 67, + 67, + 1 + ], + [ + 174, + 174, + 4 + ], + [ + 1024, + 254, + 4 + ], + [ + 188, + 267, + 2 + ], + [ + 176, + 176, + 4 + ], + [ + 246, + 246, + 2 + ], + [ + 260, + 260, + 3 + ], + [ + 190, + 269, + 2 + ], + [ + 66, + 66, + 1 + ], + [ + 1025, + 251, + 4 + ], + [ + 1024, + 247, + 4 + ], + [ + 1026, + 193, + 6 + ], + [ + 1025, + 256, + 4 + ], + [ + 1024, + 248, + 4 + ], + [ + 190, + 272, + 2 + ], + [ + 190, + 273, + 2 + ], + [ + 326, + 326, + 1 + ], + [ + 1039, + 217, + 4 + ], + [ + 1033, + 214, + 6 + ], + [ + 251, + 251, + 2 + ], + [ + 1024, + 265, + 4 + ], + [ + 202, + 202, + 4 + ], + [ + 230, + 230, + 2 + ], + [ + 68, + 68, + 1 + ], + [ + 1035, + 256, + 6 + ], + [ + 229, + 229, + 2 + ], + [ + 71, + 71, + 1 + ], + [ + 190, + 295, + 2 + ], + [ + 242, + 242, + 2 + ], + [ + 65, + 65, + 1 + ], + [ + 254, + 254, + 2 + ], + [ + 1035, + 251, + 6 + ], + [ + 256, + 256, + 2 + ], + [ + 1036, + 214, + 4 + ], + [ + 70, + 70, + 1 + ], + [ + 202, + 249, + 2 + ], + [ + 267, + 267, + 2 + ], + [ + 193, + 275, + 2 + ], + [ + 1033, + 246, + 6 + ], + [ + 64, + 64, + 1 + ], + [ + 262, + 217, + 2 + ], + [ + 281, + 281, + 3 + ], + [ + 329, + 329, + 2 + ], + [ + 235, + 235, + 3 + ], + [ + 62, + 62, + 1 + ], + [ + 193, + 277, + 2 + ], + [ + 319, + 319, + 1 + ], + [ + 63, + 63, + 1 + ], + [ + 234, + 234, + 3 + ], + [ + 1024, + 267, + 4 + ], + [ + 193, + 280, + 2 + ], + [ + 193, + 260, + 2 + ], + [ + 1025, + 272, + 4 + ], + [ + 1025, + 273, + 4 + ], + [ + 190, + 312, + 2 + ], + [ + 1025, + 269, + 4 + ], + [ + 193, + 284, + 2 + ], + [ + 214, + 214, + 4 + ], + [ + 190, + 314, + 2 + ], + [ + 69, + 69, + 1 + ], + [ + 1027, + 1033, + 3 + ], + [ + 322, + 322, + 2 + ], + [ + 73, + 73, + 1 + ], + [ + 339, + 339, + 2 + ], + [ + 239, + 239, + 2 + ], + [ + 277, + 277, + 3 + ], + [ + 265, + 265, + 2 + ], + [ + 193, + 294, + 2 + ], + [ + 217, + 217, + 3 + ], + [ + 1025, + 295, + 4 + ], + [ + 196, + 196, + 2 + ], + [ + 72, + 72, + 1 + ], + [ + 193, + 296, + 2 + ], + [ + 275, + 275, + 3 + ], + [ + 193, + 281, + 2 + ], + [ + 1027, + 1033, + 1 + ], + [ + 202, + 289, + 2 + ], + [ + 283, + 283, + 2 + ], + [ + 210, + 210, + 2 + ], + [ + 315, + 315, + 2 + ], + [ + 249, + 1029, + 2 + ], + [ + 175, + 175, + 2 + ], + [ + 1035, + 273, + 6 + ], + [ + 1035, + 272, + 6 + ], + [ + 280, + 280, + 3 + ], + [ + 352, + 352, + 2 + ], + [ + 61, + 61, + 1 + ], + [ + 259, + 259, + 3 + ], + [ + 1035, + 269, + 6 + ], + [ + 325, + 325, + 2 + ], + [ + 332, + 332, + 2 + ], + [ + 1026, + 275, + 4 + ], + [ + 1025, + 312, + 4 + ], + [ + 260, + 260, + 2 + ], + [ + 188, + 1039, + 2 + ], + [ + 284, + 284, + 3 + ], + [ + 1025, + 314, + 4 + ], + [ + 321, + 321, + 2 + ], + [ + 323, + 323, + 2 + ], + [ + 251, + 251, + 3 + ], + [ + 285, + 285, + 2 + ], + [ + 304, + 304, + 2 + ], + [ + 1035, + 295, + 6 + ], + [ + 188, + 345, + 2 + ], + [ + 1033, + 254, + 6 + ], + [ + 237, + 237, + 2 + ], + [ + 307, + 307, + 2 + ], + [ + 1033, + 247, + 6 + ], + [ + 188, + 350, + 2 + ], + [ + 1033, + 248, + 6 + ], + [ + 1026, + 277, + 4 + ], + [ + 1026, + 260, + 4 + ], + [ + 272, + 272, + 2 + ], + [ + 299, + 299, + 2 + ], + [ + 378, + 378, + 2 + ], + [ + 236, + 236, + 2 + ], + [ + 288, + 288, + 2 + ], + [ + 269, + 269, + 2 + ], + [ + 347, + 347, + 2 + ], + [ + 301, + 301, + 2 + ], + [ + 273, + 273, + 2 + ], + [ + 66, + 67, + 1 + ], + [ + 330, + 330, + 2 + ], + [ + 1026, + 281, + 4 + ], + [ + 230, + 230, + 3 + ], + [ + 1040, + 217, + 2 + ], + [ + 1026, + 284, + 4 + ], + [ + 334, + 334, + 2 + ], + [ + 1026, + 280, + 4 + ], + [ + 343, + 343, + 2 + ], + [ + 327, + 327, + 2 + ], + [ + 259, + 214, + 2 + ], + [ + 216, + 216, + 2 + ], + [ + 229, + 229, + 3 + ], + [ + 309, + 309, + 2 + ], + [ + 305, + 305, + 2 + ], + [ + 270, + 270, + 2 + ], + [ + 201, + 201, + 2 + ], + [ + 1030, + 1038, + 3 + ], + [ + 1040, + 214, + 2 + ], + [ + 256, + 256, + 3 + ], + [ + 1030, + 1038, + 1 + ], + [ + 1035, + 312, + 6 + ], + [ + 1029, + 289, + 4 + ], + [ + 225, + 225, + 2 + ], + [ + 328, + 328, + 2 + ], + [ + 235, + 235, + 2 + ], + [ + 200, + 200, + 2 + ], + [ + 244, + 244, + 2 + ], + [ + 1035, + 314, + 6 + ], + [ + 188, + 365, + 2 + ], + [ + 338, + 338, + 2 + ], + [ + 174, + 174, + 5 + ], + [ + 188, + 1036, + 2 + ], + [ + 300, + 300, + 2 + ], + [ + 234, + 234, + 2 + ], + [ + 188, + 366, + 2 + ], + [ + 1026, + 294, + 4 + ], + [ + 247, + 247, + 3 + ], + [ + 248, + 248, + 3 + ], + [ + 1026, + 296, + 4 + ], + [ + 176, + 176, + 5 + ], + [ + 1027, + 1024, + 5 + ], + [ + 232, + 232, + 2 + ], + [ + 258, + 258, + 2 + ], + [ + 266, + 266, + 1 + ], + [ + 1033, + 265, + 6 + ], + [ + 64, + 65, + 1 + ], + [ + 262, + 262, + 3 + ], + [ + 253, + 253, + 2 + ], + [ + 246, + 246, + 3 + ], + [ + 360, + 360, + 2 + ], + [ + 199, + 199, + 2 + ], + [ + 243, + 243, + 2 + ], + [ + 68, + 69, + 1 + ], + [ + 1038, + 1030, + 1 + ], + [ + 202, + 349, + 2 + ], + [ + 195, + 195, + 2 + ], + [ + 294, + 294, + 2 + ], + [ + 399, + 399, + 2 + ], + [ + 296, + 296, + 2 + ], + [ + 281, + 281, + 2 + ], + [ + 188, + 188, + 1 + ], + [ + 428, + 428, + 2 + ], + [ + 357, + 357, + 2 + ], + [ + 174, + 174, + 2 + ], + [ + 269, + 190, + 2 + ], + [ + 62, + 63, + 1 + ], + [ + 1027, + 1024, + 3 + ], + [ + 176, + 176, + 2 + ], + [ + 398, + 398, + 2 + ], + [ + 277, + 277, + 4 + ], + [ + 245, + 245, + 2 + ], + [ + 326, + 326, + 2 + ], + [ + 275, + 275, + 2 + ], + [ + 227, + 227, + 2 + ], + [ + 254, + 254, + 3 + ], + [ + 1029, + 249, + 4 + ], + [ + 70, + 71, + 1 + ], + [ + 261, + 261, + 2 + ], + [ + 264, + 264, + 1 + ], + [ + 251, + 251, + 4 + ], + [ + 278, + 278, + 2 + ], + [ + 228, + 228, + 2 + ], + [ + 205, + 205, + 2 + ], + [ + 74, + 74, + 1 + ], + [ + 280, + 280, + 2 + ], + [ + 240, + 240, + 2 + ], + [ + 317, + 317, + 2 + ], + [ + 313, + 313, + 2 + ], + [ + 217, + 188, + 2 + ], + [ + 1033, + 267, + 6 + ], + [ + 241, + 241, + 3 + ], + [ + 410, + 410, + 1 + ], + [ + 316, + 316, + 2 + ], + [ + 1040, + 246, + 2 + ], + [ + 320, + 320, + 2 + ], + [ + 308, + 308, + 2 + ], + [ + 359, + 359, + 2 + ], + [ + 1041, + 256, + 2 + ], + [ + 249, + 352, + 2 + ], + [ + 413, + 413, + 2 + ], + [ + 348, + 348, + 2 + ], + [ + 390, + 390, + 2 + ], + [ + 251, + 190, + 2 + ], + [ + 217, + 322, + 2 + ], + [ + 438, + 438, + 2 + ], + [ + 226, + 226, + 2 + ], + [ + 1036, + 1036, + 4 + ], + [ + 1024, + 345, + 4 + ], + [ + 370, + 370, + 2 + ], + [ + 454, + 454, + 1 + ], + [ + 279, + 279, + 2 + ], + [ + 60, + 60, + 1 + ], + [ + 1024, + 350, + 4 + ], + [ + 466, + 466, + 1 + ], + [ + 419, + 419, + 2 + ], + [ + 273, + 190, + 2 + ], + [ + 1041, + 269, + 2 + ], + [ + 257, + 257, + 2 + ], + [ + 260, + 260, + 4 + ], + [ + 202, + 367, + 2 + ], + [ + 418, + 418, + 2 + ], + [ + 65, + 66, + 1 + ], + [ + 272, + 190, + 2 + ], + [ + 284, + 284, + 4 + ], + [ + 242, + 242, + 1 + ], + [ + 451, + 451, + 2 + ], + [ + 72, + 71, + 1 + ], + [ + 256, + 190, + 2 + ], + [ + 202, + 354, + 2 + ], + [ + 204, + 204, + 2 + ], + [ + 406, + 406, + 2 + ], + [ + 198, + 198, + 2 + ], + [ + 430, + 430, + 2 + ], + [ + 369, + 369, + 2 + ], + [ + 271, + 271, + 2 + ], + [ + 202, + 358, + 2 + ], + [ + 268, + 268, + 2 + ], + [ + 1049, + 249, + 4 + ], + [ + 331, + 331, + 1 + ], + [ + 422, + 422, + 2 + ], + [ + 252, + 252, + 3 + ], + [ + 246, + 188, + 2 + ], + [ + 480, + 480, + 2 + ], + [ + 193, + 193, + 1 + ], + [ + 319, + 319, + 2 + ], + [ + 202, + 376, + 2 + ], + [ + 214, + 214, + 1 + ], + [ + 1040, + 247, + 2 + ], + [ + 1041, + 272, + 2 + ], + [ + 444, + 444, + 2 + ], + [ + 433, + 433, + 2 + ], + [ + 1041, + 273, + 2 + ], + [ + 174, + 174, + 6 + ], + [ + 324, + 324, + 2 + ], + [ + 440, + 440, + 2 + ], + [ + 1045, + 289, + 6 + ], + [ + 318, + 318, + 2 + ], + [ + 1040, + 248, + 2 + ], + [ + 217, + 262, + 2 + ], + [ + 1027, + 214, + 3 + ], + [ + 336, + 336, + 1 + ], + [ + 1024, + 365, + 4 + ], + [ + 185, + 185, + 2 + ], + [ + 310, + 310, + 2 + ], + [ + 1024, + 366, + 4 + ], + [ + 219, + 219, + 2 + ], + [ + 436, + 436, + 2 + ], + [ + 1027, + 214, + 1 + ], + [ + 67, + 68, + 1 + ], + [ + 234, + 234, + 4 + ], + [ + 231, + 231, + 2 + ], + [ + 235, + 235, + 4 + ], + [ + 1038, + 275, + 6 + ], + [ + 176, + 176, + 6 + ], + [ + 276, + 276, + 2 + ], + [ + 1040, + 254, + 2 + ], + [ + 247, + 188, + 2 + ], + [ + 1024, + 1039, + 4 + ], + [ + 248, + 188, + 2 + ], + [ + 1047, + 1047, + 2 + ], + [ + 1041, + 251, + 2 + ], + [ + 266, + 266, + 3 + ], + [ + 254, + 188, + 2 + ], + [ + 478, + 478, + 1 + ], + [ + 265, + 265, + 3 + ], + [ + 181, + 181, + 1 + ], + [ + 412, + 412, + 2 + ], + [ + 371, + 371, + 2 + ], + [ + 362, + 362, + 2 + ], + [ + 446, + 446, + 2 + ], + [ + 230, + 230, + 4 + ], + [ + 70, + 69, + 1 + ], + [ + 250, + 250, + 2 + ], + [ + 448, + 448, + 2 + ], + [ + 62, + 61, + 1 + ], + [ + 262, + 329, + 2 + ], + [ + 1028, + 256, + 3 + ], + [ + 1029, + 349, + 4 + ], + [ + 332, + 332, + 3 + ], + [ + 229, + 229, + 4 + ], + [ + 396, + 396, + 2 + ], + [ + 64, + 63, + 1 + ], + [ + 217, + 217, + 4 + ], + [ + 190, + 379, + 2 + ], + [ + 286, + 286, + 2 + ], + [ + 1028, + 256, + 1 + ], + [ + 269, + 269, + 3 + ], + [ + 416, + 416, + 2 + ], + [ + 260, + 193, + 2 + ], + [ + 1048, + 1048, + 2 + ], + [ + 294, + 193, + 2 + ], + [ + 241, + 241, + 1 + ], + [ + 267, + 267, + 3 + ], + [ + 194, + 194, + 2 + ], + [ + 402, + 402, + 2 + ], + [ + 325, + 214, + 2 + ], + [ + 457, + 457, + 2 + ], + [ + 264, + 264, + 3 + ], + [ + 239, + 239, + 1 + ], + [ + 296, + 193, + 2 + ], + [ + 404, + 404, + 2 + ], + [ + 280, + 193, + 2 + ], + [ + 255, + 255, + 2 + ], + [ + 287, + 287, + 2 + ], + [ + 295, + 295, + 2 + ], + [ + 1028, + 251, + 3 + ], + [ + 272, + 272, + 3 + ], + [ + 340, + 340, + 2 + ], + [ + 1039, + 1039, + 4 + ], + [ + 220, + 220, + 2 + ], + [ + 354, + 354, + 2 + ], + [ + 442, + 442, + 2 + ], + [ + 190, + 388, + 2 + ], + [ + 1027, + 214, + 5 + ], + [ + 304, + 304, + 3 + ], + [ + 1028, + 256, + 5 + ], + [ + 1038, + 277, + 6 + ], + [ + 1038, + 281, + 6 + ], + [ + 434, + 434, + 2 + ], + [ + 417, + 417, + 2 + ], + [ + 273, + 273, + 3 + ], + [ + 297, + 297, + 2 + ], + [ + 342, + 342, + 2 + ], + [ + 299, + 299, + 3 + ], + [ + 182, + 182, + 1 + ], + [ + 1041, + 295, + 2 + ], + [ + 214, + 259, + 2 + ], + [ + 315, + 315, + 1 + ], + [ + 1045, + 249, + 6 + ], + [ + 382, + 382, + 2 + ], + [ + 1025, + 379, + 4 + ], + [ + 72, + 73, + 1 + ], + [ + 1028, + 251, + 1 + ], + [ + 1028, + 251, + 5 + ], + [ + 307, + 307, + 3 + ], + [ + 1027, + 217, + 5 + ], + [ + 381, + 381, + 2 + ], + [ + 1027, + 217, + 3 + ], + [ + 358, + 358, + 2 + ], + [ + 374, + 374, + 2 + ], + [ + 1038, + 284, + 6 + ], + [ + 109, + 109, + 1 + ], + [ + 1040, + 265, + 2 + ], + [ + 210, + 210, + 1 + ], + [ + 283, + 283, + 1 + ], + [ + 275, + 275, + 4 + ], + [ + 277, + 277, + 2 + ], + [ + 1056, + 247, + 4 + ], + [ + 323, + 323, + 1 + ], + [ + 252, + 252, + 1 + ], + [ + 1038, + 260, + 6 + ], + [ + 375, + 375, + 2 + ], + [ + 465, + 465, + 2 + ], + [ + 1055, + 248, + 4 + ], + [ + 301, + 301, + 3 + ], + [ + 1042, + 280, + 2 + ], + [ + 294, + 294, + 3 + ], + [ + 343, + 343, + 3 + ], + [ + 392, + 392, + 2 + ], + [ + 1025, + 388, + 4 + ], + [ + 202, + 397, + 2 + ], + [ + 174, + 174, + 7 + ], + [ + 296, + 296, + 3 + ], + [ + 1076, + 289, + 4 + ], + [ + 1040, + 267, + 2 + ], + [ + 302, + 302, + 2 + ], + [ + 373, + 373, + 2 + ], + [ + 265, + 188, + 2 + ], + [ + 328, + 214, + 2 + ], + [ + 212, + 212, + 2 + ], + [ + 432, + 432, + 2 + ], + [ + 281, + 281, + 4 + ], + [ + 327, + 327, + 3 + ], + [ + 190, + 401, + 2 + ], + [ + 202, + 1059, + 2 + ], + [ + 1041, + 312, + 2 + ], + [ + 259, + 254, + 2 + ], + [ + 267, + 188, + 2 + ], + [ + 510, + 510, + 2 + ], + [ + 201, + 201, + 3 + ], + [ + 176, + 176, + 7 + ], + [ + 217, + 217, + 1 + ], + [ + 352, + 249, + 2 + ], + [ + 262, + 246, + 2 + ], + [ + 17, + 17, + 1 + ], + [ + 321, + 321, + 1 + ], + [ + 253, + 253, + 3 + ], + [ + 1027, + 217, + 1 + ], + [ + 66, + 66, + 2 + ], + [ + 1038, + 280, + 6 + ], + [ + 208, + 208, + 2 + ], + [ + 1041, + 314, + 2 + ], + [ + 347, + 246, + 2 + ], + [ + 1033, + 1027, + 1 + ], + [ + 106, + 106, + 1 + ], + [ + 259, + 1036, + 2 + ], + [ + 236, + 236, + 3 + ], + [ + 237, + 237, + 1 + ], + [ + 259, + 339, + 2 + ], + [ + 256, + 256, + 4 + ], + [ + 275, + 193, + 2 + ], + [ + 314, + 190, + 2 + ], + [ + 258, + 258, + 3 + ], + [ + 322, + 329, + 2 + ], + [ + 349, + 349, + 2 + ], + [ + 214, + 1024, + 2 + ], + [ + 292, + 292, + 2 + ], + [ + 1029, + 367, + 4 + ], + [ + 277, + 193, + 2 + ], + [ + 295, + 190, + 2 + ], + [ + 100, + 100, + 1 + ], + [ + 393, + 393, + 2 + ], + [ + 232, + 205, + 2 + ], + [ + 330, + 330, + 1 + ], + [ + 312, + 190, + 2 + ], + [ + 383, + 383, + 2 + ], + [ + 175, + 175, + 3 + ], + [ + 313, + 313, + 3 + ], + [ + 244, + 244, + 1 + ], + [ + 284, + 193, + 2 + ], + [ + 1029, + 376, + 4 + ], + [ + 508, + 508, + 2 + ], + [ + 325, + 325, + 3 + ], + [ + 1044, + 1027, + 1 + ], + [ + 216, + 216, + 3 + ], + [ + 334, + 334, + 3 + ], + [ + 1028, + 1035, + 1 + ], + [ + 202, + 1049, + 2 + ], + [ + 70, + 70, + 2 + ], + [ + 337, + 337, + 2 + ], + [ + 1027, + 1044, + 3 + ], + [ + 67, + 67, + 2 + ], + [ + 68, + 68, + 2 + ], + [ + 1025, + 401, + 4 + ], + [ + 389, + 389, + 2 + ], + [ + 1028, + 1035, + 3 + ], + [ + 391, + 391, + 2 + ], + [ + 305, + 305, + 1 + ], + [ + 357, + 214, + 2 + ], + [ + 209, + 209, + 2 + ], + [ + 320, + 320, + 3 + ], + [ + 394, + 394, + 2 + ], + [ + 476, + 476, + 2 + ], + [ + 1042, + 260, + 2 + ], + [ + 203, + 203, + 2 + ], + [ + 328, + 328, + 3 + ], + [ + 60, + 61, + 1 + ], + [ + 429, + 429, + 2 + ], + [ + 461, + 461, + 2 + ], + [ + 487, + 487, + 2 + ], + [ + 1029, + 354, + 4 + ], + [ + 284, + 284, + 2 + ], + [ + 360, + 360, + 3 + ], + [ + 475, + 475, + 2 + ], + [ + 338, + 338, + 3 + ], + [ + 285, + 285, + 1 + ], + [ + 367, + 367, + 2 + ], + [ + 327, + 214, + 2 + ], + [ + 348, + 214, + 2 + ], + [ + 1038, + 296, + 6 + ], + [ + 502, + 502, + 2 + ], + [ + 270, + 270, + 3 + ], + [ + 281, + 193, + 2 + ], + [ + 355, + 355, + 2 + ], + [ + 1038, + 294, + 6 + ], + [ + 411, + 411, + 2 + ], + [ + 74, + 73, + 1 + ], + [ + 22, + 22, + 1 + ], + [ + 234, + 234, + 5 + ], + [ + 1042, + 275, + 2 + ], + [ + 1027, + 1044, + 1 + ], + [ + 1029, + 358, + 4 + ], + [ + 243, + 243, + 1 + ], + [ + 261, + 261, + 3 + ], + [ + 75, + 75, + 1 + ], + [ + 485, + 485, + 2 + ], + [ + 1047, + 174, + 6 + ], + [ + 346, + 346, + 2 + ], + [ + 356, + 356, + 2 + ], + [ + 322, + 217, + 2 + ], + [ + 481, + 481, + 2 + ], + [ + 65, + 65, + 2 + ], + [ + 269, + 269, + 4 + ], + [ + 551, + 551, + 2 + ], + [ + 378, + 378, + 1 + ], + [ + 188, + 188, + 3 + ], + [ + 248, + 248, + 4 + ], + [ + 1025, + 414, + 4 + ], + [ + 272, + 272, + 4 + ], + [ + 247, + 247, + 4 + ], + [ + 235, + 235, + 5 + ], + [ + 1042, + 294, + 2 + ], + [ + 240, + 240, + 3 + ], + [ + 1027, + 246, + 3 + ], + [ + 1042, + 277, + 2 + ], + [ + 1024, + 1036, + 4 + ], + [ + 359, + 217, + 2 + ], + [ + 190, + 414, + 2 + ], + [ + 105, + 105, + 1 + ], + [ + 1042, + 296, + 2 + ], + [ + 102, + 102, + 1 + ], + [ + 1027, + 246, + 5 + ], + [ + 339, + 339, + 3 + ], + [ + 309, + 309, + 1 + ], + [ + 1059, + 249, + 4 + ], + [ + 228, + 228, + 3 + ], + [ + 464, + 464, + 2 + ], + [ + 415, + 415, + 2 + ], + [ + 364, + 364, + 2 + ], + [ + 506, + 506, + 2 + ], + [ + 1077, + 1077, + 2 + ], + [ + 329, + 329, + 3 + ], + [ + 273, + 273, + 4 + ], + [ + 108, + 108, + 1 + ], + [ + 597, + 597, + 1 + ], + [ + 1050, + 1027, + 1 + ], + [ + 1048, + 176, + 6 + ], + [ + 335, + 335, + 2 + ], + [ + 197, + 197, + 2 + ], + [ + 245, + 245, + 3 + ], + [ + 324, + 324, + 3 + ], + [ + 318, + 318, + 3 + ], + [ + 1093, + 326, + 2 + ], + [ + 1027, + 1050, + 1 + ], + [ + 69, + 69, + 2 + ], + [ + 280, + 280, + 4 + ], + [ + 333, + 333, + 2 + ], + [ + 200, + 200, + 1 + ], + [ + 28, + 28, + 1 + ], + [ + 188, + 262, + 2 + ], + [ + 1042, + 284, + 2 + ], + [ + 110, + 110, + 1 + ], + [ + 1035, + 1028, + 1 + ], + [ + 249, + 249, + 4 + ], + [ + 1027, + 1051, + 3 + ], + [ + 300, + 300, + 1 + ], + [ + 251, + 251, + 5 + ], + [ + 260, + 260, + 5 + ], + [ + 363, + 363, + 2 + ], + [ + 225, + 225, + 1 + ], + [ + 368, + 368, + 2 + ], + [ + 1103, + 71, + 2 + ], + [ + 1031, + 1045, + 1 + ], + [ + 230, + 230, + 5 + ], + [ + 190, + 426, + 2 + ], + [ + 1057, + 262, + 4 + ], + [ + 1027, + 1051, + 1 + ], + [ + 509, + 509, + 2 + ], + [ + 398, + 398, + 1 + ], + [ + 1030, + 1026, + 5 + ], + [ + 288, + 288, + 3 + ], + [ + 452, + 452, + 2 + ], + [ + 361, + 361, + 2 + ], + [ + 202, + 202, + 1 + ], + [ + 63, + 64, + 1 + ], + [ + 278, + 278, + 3 + ], + [ + 229, + 229, + 5 + ], + [ + 190, + 431, + 2 + ], + [ + 463, + 463, + 2 + ], + [ + 370, + 370, + 3 + ], + [ + 1028, + 273, + 3 + ], + [ + 1025, + 426, + 4 + ], + [ + 65, + 1085, + 1 + ], + [ + 395, + 395, + 2 + ], + [ + 1033, + 345, + 6 + ], + [ + 1028, + 273, + 1 + ], + [ + 334, + 217, + 2 + ], + [ + 1024, + 1024, + 1 + ], + [ + 271, + 271, + 3 + ], + [ + 1033, + 350, + 6 + ], + [ + 1049, + 1049, + 4 + ], + [ + 1029, + 397, + 4 + ], + [ + 317, + 317, + 3 + ], + [ + 353, + 353, + 3 + ], + [ + 59, + 59, + 1 + ], + [ + 1028, + 273, + 5 + ], + [ + 1058, + 259, + 4 + ], + [ + 1024, + 188, + 1 + ], + [ + 1042, + 281, + 2 + ], + [ + 493, + 493, + 2 + ], + [ + 316, + 316, + 3 + ], + [ + 498, + 498, + 2 + ], + [ + 232, + 232, + 1 + ], + [ + 196, + 196, + 3 + ], + [ + 1027, + 246, + 1 + ], + [ + 1025, + 431, + 4 + ], + [ + 1031, + 1045, + 3 + ], + [ + 470, + 470, + 2 + ], + [ + 103, + 103, + 1 + ], + [ + 436, + 289, + 2 + ], + [ + 561, + 561, + 1 + ], + [ + 312, + 312, + 2 + ], + [ + 471, + 471, + 2 + ], + [ + 422, + 422, + 1 + ], + [ + 459, + 459, + 2 + ], + [ + 332, + 332, + 4 + ], + [ + 238, + 238, + 2 + ], + [ + 1028, + 272, + 5 + ], + [ + 18, + 18, + 1 + ], + [ + 27, + 27, + 1 + ], + [ + 1028, + 272, + 1 + ], + [ + 195, + 195, + 1 + ], + [ + 445, + 445, + 2 + ], + [ + 101, + 101, + 1 + ], + [ + 338, + 217, + 2 + ], + [ + 503, + 503, + 2 + ], + [ + 380, + 380, + 2 + ], + [ + 107, + 107, + 1 + ], + [ + 279, + 279, + 3 + ], + [ + 1027, + 1046, + 3 + ], + [ + 1028, + 269, + 1 + ], + [ + 336, + 336, + 2 + ], + [ + 331, + 331, + 2 + ], + [ + 351, + 351, + 3 + ], + [ + 483, + 483, + 2 + ], + [ + 269, + 251, + 1 + ], + [ + 413, + 413, + 1 + ], + [ + 635, + 635, + 1 + ], + [ + 486, + 486, + 2 + ], + [ + 256, + 256, + 5 + ], + [ + 516, + 516, + 2 + ], + [ + 1139, + 73, + 2 + ], + [ + 295, + 295, + 3 + ], + [ + 526, + 526, + 2 + ], + [ + 1028, + 269, + 5 + ], + [ + 569, + 569, + 2 + ], + [ + 319, + 410, + 1 + ], + [ + 266, + 438, + 2 + ], + [ + 570, + 570, + 2 + ], + [ + 199, + 199, + 1 + ], + [ + 437, + 437, + 2 + ], + [ + 314, + 314, + 2 + ], + [ + 64, + 1106, + 1 + ], + [ + 504, + 504, + 2 + ], + [ + 1027, + 1050, + 3 + ], + [ + 1028, + 272, + 3 + ], + [ + 1027, + 188, + 5 + ], + [ + 246, + 217, + 2 + ], + [ + 1026, + 409, + 4 + ], + [ + 327, + 248, + 2 + ], + [ + 193, + 403, + 2 + ], + [ + 276, + 276, + 3 + ], + [ + 535, + 535, + 2 + ], + [ + 26, + 26, + 1 + ], + [ + 214, + 1044, + 2 + ], + [ + 23, + 23, + 1 + ], + [ + 328, + 247, + 2 + ], + [ + 500, + 500, + 2 + ], + [ + 322, + 322, + 3 + ], + [ + 377, + 377, + 2 + ], + [ + 193, + 409, + 2 + ], + [ + 405, + 405, + 2 + ], + [ + 242, + 242, + 3 + ], + [ + 433, + 433, + 1 + ], + [ + 194, + 212, + 2 + ], + [ + 241, + 241, + 4 + ], + [ + 1028, + 269, + 3 + ], + [ + 492, + 492, + 2 + ], + [ + 505, + 505, + 2 + ], + [ + 1026, + 403, + 4 + ], + [ + 254, + 259, + 2 + ], + [ + 262, + 1039, + 2 + ], + [ + 285, + 285, + 3 + ], + [ + 16, + 16, + 1 + ], + [ + 1036, + 188, + 4 + ], + [ + 407, + 407, + 2 + ], + [ + 210, + 210, + 3 + ], + [ + 219, + 219, + 3 + ], + [ + 308, + 308, + 1 + ], + [ + 69, + 70, + 1 + ], + [ + 251, + 269, + 1 + ], + [ + 349, + 202, + 2 + ], + [ + 362, + 217, + 2 + ], + [ + 191, + 191, + 2 + ], + [ + 634, + 634, + 1 + ], + [ + 227, + 227, + 1 + ], + [ + 347, + 265, + 2 + ], + [ + 387, + 387, + 2 + ], + [ + 294, + 294, + 4 + ], + [ + 480, + 620, + 2 + ], + [ + 1077, + 67, + 2 + ], + [ + 71, + 71, + 2 + ], + [ + 226, + 226, + 1 + ], + [ + 1027, + 1065, + 1 + ], + [ + 293, + 293, + 2 + ], + [ + 268, + 268, + 3 + ], + [ + 216, + 216, + 1 + ], + [ + 497, + 497, + 2 + ], + [ + 1027, + 1046, + 5 + ], + [ + 466, + 326, + 1 + ], + [ + 609, + 609, + 2 + ], + [ + 418, + 418, + 1 + ], + [ + 375, + 214, + 2 + ], + [ + 128, + 128, + 1 + ], + [ + 660, + 660, + 1 + ], + [ + 341, + 341, + 3 + ], + [ + 514, + 514, + 2 + ], + [ + 260, + 280, + 1 + ], + [ + 384, + 384, + 2 + ], + [ + 222, + 222, + 2 + ], + [ + 621, + 621, + 1 + ], + [ + 1033, + 366, + 6 + ], + [ + 1033, + 365, + 6 + ], + [ + 64, + 64, + 2 + ], + [ + 419, + 419, + 1 + ], + [ + 296, + 296, + 4 + ], + [ + 1030, + 275, + 3 + ], + [ + 299, + 299, + 4 + ], + [ + 264, + 428, + 2 + ], + [ + 376, + 376, + 2 + ], + [ + 24, + 24, + 1 + ], + [ + 1030, + 275, + 1 + ], + [ + 1027, + 247, + 1 + ], + [ + 528, + 528, + 2 + ], + [ + 1074, + 252, + 4 + ], + [ + 1035, + 379, + 6 + ], + [ + 519, + 519, + 2 + ], + [ + 325, + 265, + 2 + ], + [ + 1030, + 275, + 5 + ], + [ + 202, + 1076, + 2 + ], + [ + 340, + 340, + 3 + ], + [ + 1027, + 248, + 1 + ], + [ + 446, + 446, + 1 + ], + [ + 512, + 512, + 2 + ], + [ + 586, + 586, + 1 + ], + [ + 104, + 104, + 1 + ], + [ + 19, + 19, + 1 + ], + [ + 304, + 304, + 4 + ], + [ + 254, + 214, + 2 + ], + [ + 423, + 423, + 2 + ], + [ + 339, + 259, + 2 + ], + [ + 198, + 198, + 1 + ], + [ + 472, + 472, + 2 + ], + [ + 359, + 359, + 3 + ], + [ + 66, + 67, + 2 + ], + [ + 307, + 307, + 4 + ], + [ + 196, + 196, + 1 + ], + [ + 1064, + 266, + 4 + ], + [ + 288, + 288, + 1 + ], + [ + 62, + 1124, + 1 + ], + [ + 390, + 390, + 1 + ], + [ + 424, + 424, + 2 + ], + [ + 1065, + 1027, + 1 + ], + [ + 585, + 585, + 1 + ], + [ + 306, + 306, + 2 + ], + [ + 280, + 260, + 1 + ], + [ + 584, + 584, + 1 + ], + [ + 582, + 582, + 1 + ], + [ + 412, + 249, + 2 + ], + [ + 310, + 310, + 1 + ], + [ + 255, + 255, + 3 + ], + [ + 444, + 444, + 1 + ], + [ + 430, + 430, + 1 + ], + [ + 603, + 603, + 2 + ], + [ + 1030, + 280, + 1 + ], + [ + 193, + 447, + 2 + ], + [ + 315, + 315, + 3 + ], + [ + 1070, + 241, + 4 + ], + [ + 1040, + 345, + 2 + ], + [ + 325, + 1036, + 2 + ], + [ + 234, + 234, + 6 + ], + [ + 1027, + 1044, + 5 + ], + [ + 62, + 1163, + 1 + ], + [ + 99, + 99, + 1 + ], + [ + 357, + 357, + 3 + ], + [ + 348, + 348, + 3 + ], + [ + 416, + 416, + 1 + ], + [ + 257, + 257, + 3 + ], + [ + 201, + 201, + 4 + ], + [ + 205, + 205, + 1 + ], + [ + 343, + 343, + 4 + ], + [ + 342, + 342, + 3 + ], + [ + 536, + 536, + 2 + ], + [ + 63, + 63, + 2 + ], + [ + 1026, + 447, + 4 + ], + [ + 138, + 138, + 1 + ], + [ + 460, + 460, + 2 + ], + [ + 537, + 537, + 2 + ], + [ + 253, + 253, + 4 + ], + [ + 1033, + 1024, + 1 + ], + [ + 456, + 456, + 2 + ], + [ + 369, + 254, + 2 + ], + [ + 440, + 440, + 1 + ], + [ + 1027, + 247, + 5 + ], + [ + 1035, + 388, + 6 + ], + [ + 477, + 477, + 2 + ], + [ + 1027, + 248, + 5 + ], + [ + 596, + 596, + 1 + ], + [ + 421, + 421, + 2 + ], + [ + 301, + 301, + 4 + ], + [ + 588, + 588, + 1 + ], + [ + 577, + 577, + 2 + ], + [ + 188, + 259, + 2 + ], + [ + 1040, + 350, + 2 + ], + [ + 246, + 262, + 2 + ], + [ + 399, + 399, + 1 + ], + [ + 223, + 223, + 2 + ], + [ + 1030, + 260, + 1 + ], + [ + 1068, + 264, + 4 + ], + [ + 289, + 289, + 3 + ], + [ + 212, + 237, + 2 + ], + [ + 235, + 235, + 6 + ], + [ + 277, + 277, + 5 + ], + [ + 469, + 469, + 2 + ], + [ + 1045, + 1031, + 1 + ], + [ + 344, + 344, + 3 + ], + [ + 193, + 435, + 2 + ], + [ + 1027, + 1024, + 1 + ], + [ + 231, + 231, + 1 + ], + [ + 439, + 439, + 2 + ], + [ + 193, + 174, + 2 + ], + [ + 193, + 441, + 2 + ], + [ + 166, + 166, + 2 + ], + [ + 322, + 322, + 1 + ], + [ + 548, + 548, + 2 + ], + [ + 443, + 443, + 2 + ], + [ + 702, + 702, + 2 + ], + [ + 1078, + 174, + 2 + ], + [ + 1026, + 441, + 4 + ], + [ + 214, + 254, + 2 + ], + [ + 679, + 679, + 1 + ], + [ + 1028, + 256, + 7 + ], + [ + 668, + 668, + 1 + ], + [ + 352, + 352, + 3 + ], + [ + 449, + 449, + 2 + ], + [ + 1100, + 68, + 2 + ], + [ + 578, + 578, + 2 + ], + [ + 1027, + 247, + 3 + ], + [ + 258, + 258, + 4 + ], + [ + 313, + 313, + 4 + ], + [ + 1033, + 1024, + 3 + ], + [ + 490, + 490, + 2 + ], + [ + 162, + 162, + 2 + ], + [ + 1026, + 435, + 4 + ], + [ + 457, + 457, + 1 + ], + [ + 1082, + 246, + 4 + ], + [ + 1051, + 1027, + 1 + ], + [ + 206, + 206, + 2 + ], + [ + 579, + 579, + 1 + ], + [ + 207, + 207, + 2 + ], + [ + 193, + 176, + 2 + ], + [ + 1027, + 1046, + 1 + ], + [ + 1027, + 248, + 3 + ], + [ + 215, + 215, + 2 + ], + [ + 517, + 517, + 2 + ], + [ + 321, + 321, + 3 + ], + [ + 1030, + 277, + 1 + ], + [ + 283, + 232, + 2 + ], + [ + 1028, + 312, + 1 + ], + [ + 252, + 252, + 4 + ], + [ + 236, + 236, + 4 + ], + [ + 1081, + 176, + 2 + ], + [ + 250, + 250, + 3 + ], + [ + 386, + 386, + 2 + ], + [ + 338, + 248, + 2 + ], + [ + 1085, + 66, + 2 + ], + [ + 202, + 539, + 2 + ], + [ + 201, + 201, + 1 + ], + [ + 269, + 251, + 2 + ], + [ + 334, + 247, + 2 + ], + [ + 1119, + 329, + 4 + ], + [ + 465, + 465, + 1 + ], + [ + 225, + 225, + 3 + ], + [ + 1028, + 314, + 1 + ], + [ + 175, + 175, + 4 + ], + [ + 221, + 221, + 2 + ], + [ + 272, + 272, + 5 + ], + [ + 538, + 538, + 2 + ], + [ + 454, + 454, + 2 + ], + [ + 190, + 174, + 2 + ], + [ + 320, + 320, + 4 + ], + [ + 204, + 204, + 1 + ], + [ + 1030, + 260, + 5 + ], + [ + 259, + 259, + 4 + ], + [ + 360, + 385, + 2 + ], + [ + 230, + 230, + 6 + ], + [ + 347, + 347, + 3 + ], + [ + 214, + 327, + 2 + ], + [ + 1026, + 458, + 4 + ], + [ + 281, + 281, + 5 + ], + [ + 396, + 396, + 3 + ], + [ + 1028, + 295, + 5 + ], + [ + 214, + 328, + 2 + ], + [ + 239, + 239, + 3 + ], + [ + 1095, + 1027, + 1 + ], + [ + 323, + 323, + 3 + ], + [ + 613, + 613, + 1 + ], + [ + 345, + 188, + 2 + ], + [ + 267, + 267, + 4 + ], + [ + 592, + 592, + 2 + ], + [ + 229, + 229, + 6 + ], + [ + 240, + 332, + 2 + ], + [ + 1046, + 1027, + 1 + ], + [ + 202, + 545, + 2 + ], + [ + 1030, + 284, + 1 + ], + [ + 68, + 69, + 2 + ], + [ + 1028, + 312, + 5 + ], + [ + 290, + 290, + 2 + ], + [ + 541, + 541, + 2 + ], + [ + 722, + 722, + 1 + ], + [ + 21, + 21, + 1 + ], + [ + 249, + 349, + 2 + ], + [ + 309, + 309, + 3 + ], + [ + 402, + 402, + 3 + ], + [ + 1035, + 401, + 6 + ], + [ + 251, + 269, + 2 + ], + [ + 1033, + 1033, + 1 + ], + [ + 348, + 246, + 2 + ], + [ + 244, + 244, + 3 + ], + [ + 1040, + 366, + 2 + ], + [ + 261, + 261, + 4 + ], + [ + 174, + 1047, + 2 + ], + [ + 1027, + 188, + 3 + ], + [ + 1098, + 289, + 2 + ], + [ + 65, + 66, + 2 + ], + [ + 129, + 129, + 1 + ], + [ + 71, + 70, + 1 + ], + [ + 410, + 319, + 1 + ], + [ + 637, + 637, + 1 + ], + [ + 392, + 305, + 2 + ], + [ + 193, + 458, + 2 + ], + [ + 275, + 275, + 5 + ], + [ + 188, + 217, + 1 + ], + [ + 273, + 273, + 5 + ], + [ + 370, + 245, + 2 + ], + [ + 1040, + 1134, + 2 + ], + [ + 1028, + 314, + 5 + ], + [ + 214, + 325, + 2 + ], + [ + 176, + 1048, + 2 + ], + [ + 1040, + 365, + 2 + ], + [ + 495, + 495, + 2 + ], + [ + 515, + 515, + 2 + ], + [ + 1024, + 262, + 4 + ], + [ + 249, + 1045, + 2 + ], + [ + 74, + 1139, + 1 + ], + [ + 283, + 378, + 2 + ], + [ + 295, + 256, + 1 + ], + [ + 438, + 266, + 2 + ], + [ + 466, + 737, + 1 + ], + [ + 214, + 246, + 2 + ], + [ + 216, + 216, + 4 + ], + [ + 218, + 218, + 2 + ], + [ + 71, + 72, + 1 + ], + [ + 249, + 412, + 2 + ], + [ + 1123, + 319, + 2 + ], + [ + 1030, + 280, + 5 + ], + [ + 284, + 284, + 5 + ], + [ + 580, + 580, + 2 + ], + [ + 237, + 237, + 3 + ], + [ + 1052, + 251, + 2 + ], + [ + 190, + 176, + 2 + ], + [ + 1024, + 188, + 3 + ], + [ + 1028, + 295, + 1 + ], + [ + 357, + 1036, + 2 + ], + [ + 1057, + 1057, + 4 + ], + [ + 205, + 194, + 2 + ], + [ + 329, + 262, + 2 + ], + [ + 406, + 406, + 3 + ], + [ + 362, + 254, + 2 + ], + [ + 1136, + 69, + 2 + ], + [ + 645, + 645, + 1 + ], + [ + 636, + 636, + 1 + ], + [ + 74, + 75, + 1 + ], + [ + 1028, + 295, + 3 + ], + [ + 330, + 330, + 3 + ], + [ + 1027, + 1095, + 1 + ], + [ + 428, + 428, + 1 + ], + [ + 300, + 300, + 3 + ], + [ + 451, + 451, + 1 + ], + [ + 369, + 369, + 3 + ], + [ + 1028, + 1089, + 1 + ], + [ + 462, + 462, + 2 + ], + [ + 1033, + 188, + 3 + ], + [ + 397, + 397, + 2 + ], + [ + 1029, + 1059, + 4 + ], + [ + 371, + 371, + 1 + ], + [ + 550, + 550, + 2 + ], + [ + 1030, + 280, + 3 + ], + [ + 1028, + 1101, + 1 + ], + [ + 1101, + 1028, + 1 + ], + [ + 312, + 312, + 3 + ], + [ + 266, + 266, + 4 + ], + [ + 404, + 404, + 3 + ], + [ + 270, + 270, + 4 + ], + [ + 1035, + 414, + 6 + ], + [ + 243, + 243, + 3 + ], + [ + 242, + 326, + 1 + ], + [ + 732, + 732, + 2 + ], + [ + 453, + 453, + 2 + ], + [ + 1028, + 312, + 3 + ], + [ + 190, + 332, + 2 + ], + [ + 214, + 265, + 2 + ], + [ + 174, + 176, + 7 + ], + [ + 217, + 246, + 2 + ], + [ + 350, + 188, + 2 + ], + [ + 228, + 228, + 4 + ], + [ + 353, + 353, + 4 + ], + [ + 234, + 234, + 7 + ], + [ + 511, + 511, + 2 + ], + [ + 190, + 370, + 2 + ], + [ + 318, + 318, + 4 + ], + [ + 324, + 324, + 4 + ], + [ + 540, + 540, + 2 + ], + [ + 1030, + 277, + 5 + ], + [ + 217, + 1046, + 2 + ], + [ + 374, + 374, + 3 + ], + [ + 339, + 339, + 1 + ], + [ + 60, + 59, + 1 + ], + [ + 647, + 647, + 1 + ], + [ + 68, + 67, + 1 + ], + [ + 468, + 468, + 2 + ], + [ + 1028, + 314, + 3 + ], + [ + 382, + 382, + 1 + ], + [ + 351, + 351, + 4 + ], + [ + 264, + 264, + 4 + ], + [ + 25, + 25, + 1 + ], + [ + 294, + 294, + 5 + ], + [ + 260, + 280, + 2 + ], + [ + 327, + 1036, + 2 + ], + [ + 354, + 202, + 2 + ], + [ + 417, + 417, + 3 + ], + [ + 1030, + 284, + 5 + ], + [ + 1052, + 269, + 2 + ], + [ + 1028, + 1086, + 1 + ], + [ + 314, + 314, + 3 + ], + [ + 227, + 227, + 3 + ], + [ + 543, + 543, + 2 + ], + [ + 1045, + 349, + 6 + ], + [ + 137, + 137, + 1 + ], + [ + 611, + 611, + 2 + ], + [ + 530, + 530, + 2 + ], + [ + 265, + 246, + 2 + ], + [ + 1113, + 267, + 4 + ], + [ + 214, + 247, + 2 + ], + [ + 328, + 1036, + 2 + ], + [ + 275, + 281, + 1 + ], + [ + 389, + 389, + 3 + ], + [ + 375, + 375, + 3 + ], + [ + 1052, + 256, + 2 + ], + [ + 1053, + 254, + 4 + ], + [ + 329, + 487, + 2 + ], + [ + 240, + 240, + 4 + ], + [ + 391, + 391, + 3 + ], + [ + 1108, + 1028, + 1 + ], + [ + 29, + 29, + 1 + ], + [ + 185, + 185, + 1 + ], + [ + 1028, + 1108, + 1 + ], + [ + 1027, + 265, + 1 + ], + [ + 1027, + 1066, + 1 + ], + [ + 478, + 478, + 2 + ], + [ + 534, + 534, + 2 + ], + [ + 257, + 257, + 1 + ], + [ + 235, + 235, + 7 + ], + [ + 1052, + 273, + 2 + ], + [ + 438, + 745, + 2 + ], + [ + 245, + 245, + 1 + ], + [ + 282, + 282, + 2 + ], + [ + 64, + 65, + 2 + ], + [ + 659, + 659, + 1 + ], + [ + 1105, + 242, + 1 + ], + [ + 1100, + 69, + 2 + ], + [ + 174, + 1047, + 4 + ], + [ + 279, + 279, + 1 + ], + [ + 667, + 667, + 1 + ], + [ + 280, + 260, + 2 + ], + [ + 296, + 296, + 5 + ], + [ + 599, + 599, + 2 + ], + [ + 214, + 248, + 2 + ], + [ + 474, + 474, + 2 + ], + [ + 1035, + 426, + 6 + ], + [ + 20, + 20, + 1 + ], + [ + 271, + 271, + 4 + ], + [ + 1031, + 1029, + 5 + ], + [ + 256, + 295, + 2 + ], + [ + 1058, + 1058, + 4 + ], + [ + 1056, + 1056, + 4 + ], + [ + 358, + 202, + 2 + ], + [ + 1030, + 260, + 3 + ], + [ + 1041, + 379, + 2 + ], + [ + 1163, + 61, + 2 + ], + [ + 1099, + 230, + 4 + ], + [ + 700, + 700, + 2 + ], + [ + 479, + 479, + 2 + ], + [ + 1111, + 70, + 2 + ], + [ + 424, + 248, + 2 + ], + [ + 281, + 275, + 1 + ], + [ + 367, + 202, + 2 + ], + [ + 429, + 429, + 1 + ], + [ + 1052, + 272, + 2 + ], + [ + 1027, + 254, + 1 + ], + [ + 217, + 334, + 2 + ], + [ + 1124, + 63, + 2 + ], + [ + 695, + 508, + 2 + ], + [ + 1055, + 1055, + 4 + ], + [ + 383, + 383, + 3 + ], + [ + 571, + 571, + 2 + ], + [ + 188, + 369, + 2 + ], + [ + 408, + 408, + 1 + ], + [ + 151, + 151, + 2 + ], + [ + 352, + 1049, + 2 + ], + [ + 1102, + 229, + 4 + ], + [ + 280, + 1026, + 2 + ], + [ + 1035, + 431, + 6 + ], + [ + 373, + 373, + 1 + ], + [ + 1085, + 67, + 2 + ], + [ + 251, + 332, + 2 + ], + [ + 385, + 385, + 2 + ], + [ + 524, + 524, + 2 + ], + [ + 214, + 348, + 2 + ], + [ + 432, + 432, + 1 + ], + [ + 420, + 420, + 1 + ], + [ + 322, + 576, + 2 + ], + [ + 360, + 360, + 4 + ], + [ + 72, + 1103, + 1 + ], + [ + 760, + 760, + 1 + ], + [ + 1024, + 1024, + 3 + ], + [ + 226, + 226, + 3 + ], + [ + 66, + 1077, + 1 + ], + [ + 233, + 233, + 2 + ], + [ + 217, + 359, + 2 + ], + [ + 256, + 295, + 1 + ], + [ + 1028, + 1025, + 5 + ], + [ + 322, + 285, + 2 + ], + [ + 308, + 308, + 3 + ], + [ + 376, + 202, + 2 + ], + [ + 775, + 73, + 1 + ], + [ + 381, + 381, + 3 + ], + [ + 278, + 278, + 4 + ], + [ + 1107, + 254, + 4 + ], + [ + 250, + 250, + 1 + ], + [ + 411, + 411, + 3 + ], + [ + 1093, + 1093, + 2 + ], + [ + 289, + 202, + 2 + ], + [ + 188, + 362, + 2 + ], + [ + 566, + 566, + 2 + ], + [ + 1027, + 267, + 1 + ], + [ + 1098, + 349, + 2 + ], + [ + 482, + 482, + 2 + ], + [ + 1030, + 277, + 3 + ], + [ + 1121, + 63, + 2 + ], + [ + 553, + 553, + 2 + ], + [ + 350, + 350, + 2 + ], + [ + 345, + 345, + 2 + ], + [ + 176, + 1048, + 4 + ], + [ + 445, + 445, + 3 + ], + [ + 304, + 229, + 3 + ], + [ + 286, + 286, + 3 + ], + [ + 237, + 305, + 2 + ], + [ + 283, + 283, + 3 + ], + [ + 217, + 338, + 2 + ], + [ + 230, + 299, + 3 + ], + [ + 393, + 393, + 3 + ], + [ + 680, + 680, + 1 + ], + [ + 295, + 256, + 2 + ], + [ + 423, + 247, + 2 + ], + [ + 476, + 248, + 2 + ], + [ + 421, + 247, + 2 + ], + [ + 240, + 240, + 1 + ], + [ + 1027, + 265, + 5 + ], + [ + 547, + 547, + 2 + ], + [ + 415, + 415, + 3 + ], + [ + 434, + 434, + 3 + ], + [ + 1030, + 281, + 5 + ], + [ + 1028, + 1025, + 1 + ], + [ + 268, + 268, + 1 + ], + [ + 193, + 222, + 2 + ], + [ + 190, + 190, + 1 + ], + [ + 410, + 597, + 1 + ], + [ + 332, + 251, + 2 + ], + [ + 484, + 484, + 2 + ], + [ + 1041, + 388, + 2 + ], + [ + 352, + 349, + 2 + ], + [ + 436, + 710, + 2 + ], + [ + 1027, + 254, + 5 + ], + [ + 355, + 355, + 3 + ], + [ + 1074, + 1074, + 4 + ], + [ + 153, + 153, + 2 + ], + [ + 287, + 287, + 3 + ], + [ + 1029, + 1076, + 4 + ], + [ + 230, + 235, + 1 + ], + [ + 1039, + 262, + 4 + ], + [ + 276, + 276, + 4 + ], + [ + 1038, + 409, + 6 + ], + [ + 378, + 63, + 1 + ], + [ + 301, + 229, + 3 + ], + [ + 364, + 364, + 3 + ], + [ + 531, + 531, + 2 + ], + [ + 1158, + 175, + 4 + ], + [ + 620, + 620, + 2 + ], + [ + 297, + 297, + 3 + ], + [ + 260, + 260, + 6 + ], + [ + 568, + 568, + 2 + ], + [ + 266, + 1064, + 1 + ], + [ + 253, + 253, + 1 + ], + [ + 235, + 230, + 1 + ], + [ + 76, + 76, + 1 + ], + [ + 444, + 315, + 2 + ], + [ + 291, + 291, + 2 + ], + [ + 1147, + 1147, + 1 + ], + [ + 316, + 316, + 4 + ], + [ + 442, + 442, + 3 + ], + [ + 1038, + 403, + 6 + ], + [ + 258, + 258, + 1 + ], + [ + 188, + 334, + 2 + ], + [ + 269, + 1025, + 2 + ], + [ + 1053, + 246, + 4 + ], + [ + 1030, + 284, + 3 + ], + [ + 341, + 341, + 4 + ], + [ + 317, + 317, + 4 + ], + [ + 217, + 362, + 2 + ], + [ + 448, + 448, + 3 + ], + [ + 1027, + 1066, + 3 + ], + [ + 68, + 1136, + 1 + ], + [ + 195, + 195, + 3 + ], + [ + 1089, + 1028, + 1 + ], + [ + 242, + 1105, + 1 + ], + [ + 1029, + 539, + 4 + ], + [ + 646, + 646, + 2 + ], + [ + 294, + 1026, + 2 + ], + [ + 245, + 245, + 4 + ], + [ + 111, + 111, + 1 + ], + [ + 194, + 194, + 1 + ], + [ + 337, + 337, + 1 + ], + [ + 192, + 192, + 1 + ], + [ + 1064, + 266, + 1 + ], + [ + 449, + 449, + 3 + ], + [ + 622, + 622, + 2 + ], + [ + 1041, + 401, + 2 + ], + [ + 356, + 356, + 3 + ], + [ + 1027, + 254, + 3 + ], + [ + 241, + 1070, + 1 + ], + [ + 1052, + 295, + 2 + ], + [ + 299, + 230, + 3 + ], + [ + 15, + 15, + 1 + ], + [ + 1052, + 312, + 2 + ], + [ + 307, + 230, + 3 + ], + [ + 443, + 443, + 3 + ], + [ + 642, + 642, + 2 + ], + [ + 737, + 737, + 1 + ], + [ + 229, + 304, + 3 + ], + [ + 277, + 277, + 6 + ], + [ + 340, + 340, + 4 + ], + [ + 544, + 544, + 2 + ], + [ + 279, + 279, + 4 + ], + [ + 339, + 357, + 2 + ], + [ + 219, + 219, + 4 + ], + [ + 267, + 254, + 2 + ], + [ + 371, + 371, + 3 + ], + [ + 1086, + 1028, + 1 + ], + [ + 200, + 200, + 3 + ], + [ + 296, + 1026, + 2 + ], + [ + 488, + 488, + 3 + ], + [ + 188, + 1055, + 2 + ], + [ + 249, + 249, + 3 + ], + [ + 1027, + 1054, + 3 + ], + [ + 1052, + 314, + 2 + ], + [ + 363, + 329, + 2 + ], + [ + 213, + 213, + 2 + ], + [ + 188, + 338, + 2 + ], + [ + 188, + 1056, + 2 + ], + [ + 260, + 1026, + 2 + ], + [ + 532, + 532, + 2 + ], + [ + 332, + 240, + 2 + ], + [ + 354, + 354, + 3 + ], + [ + 589, + 589, + 2 + ], + [ + 554, + 554, + 2 + ], + [ + 392, + 392, + 1 + ], + [ + 347, + 250, + 2 + ], + [ + 199, + 199, + 3 + ], + [ + 262, + 262, + 4 + ], + [ + 628, + 628, + 2 + ], + [ + 188, + 1094, + 2 + ], + [ + 439, + 248, + 2 + ], + [ + 1029, + 545, + 4 + ], + [ + 210, + 210, + 4 + ], + [ + 499, + 499, + 2 + ], + [ + 1028, + 1062, + 1 + ], + [ + 302, + 302, + 3 + ], + [ + 1053, + 265, + 4 + ], + [ + 361, + 361, + 3 + ], + [ + 485, + 247, + 2 + ], + [ + 204, + 204, + 3 + ], + [ + 201, + 201, + 5 + ], + [ + 1036, + 1036, + 3 + ], + [ + 366, + 366, + 2 + ], + [ + 343, + 280, + 2 + ], + [ + 277, + 1026, + 2 + ], + [ + 344, + 344, + 4 + ], + [ + 275, + 281, + 2 + ], + [ + 508, + 390, + 2 + ], + [ + 174, + 176, + 6 + ], + [ + 269, + 269, + 5 + ], + [ + 1384, + 1384, + 2 + ], + [ + 246, + 1054, + 2 + ], + [ + 234, + 229, + 1 + ], + [ + 466, + 1093, + 1 + ], + [ + 367, + 367, + 3 + ], + [ + 405, + 217, + 2 + ], + [ + 264, + 1068, + 1 + ], + [ + 196, + 196, + 4 + ], + [ + 298, + 298, + 2 + ], + [ + 1039, + 322, + 4 + ], + [ + 333, + 333, + 3 + ], + [ + 342, + 342, + 4 + ], + [ + 1045, + 376, + 6 + ], + [ + 313, + 313, + 5 + ], + [ + 1027, + 1087, + 1 + ], + [ + 285, + 416, + 2 + ], + [ + 723, + 723, + 1 + ], + [ + 518, + 518, + 3 + ], + [ + 253, + 253, + 5 + ], + [ + 1027, + 1090, + 1 + ], + [ + 232, + 205, + 1 + ], + [ + 230, + 307, + 3 + ], + [ + 292, + 292, + 1 + ], + [ + 229, + 234, + 1 + ], + [ + 188, + 327, + 2 + ], + [ + 1024, + 259, + 4 + ], + [ + 231, + 231, + 3 + ], + [ + 1027, + 1115, + 1 + ], + [ + 382, + 368, + 2 + ], + [ + 188, + 328, + 2 + ], + [ + 1028, + 1061, + 1 + ], + [ + 188, + 348, + 2 + ], + [ + 110, + 109, + 1 + ], + [ + 214, + 1033, + 2 + ], + [ + 502, + 502, + 1 + ], + [ + 369, + 267, + 2 + ], + [ + 1027, + 265, + 3 + ], + [ + 66, + 65, + 1 + ], + [ + 1053, + 247, + 4 + ], + [ + 456, + 456, + 3 + ], + [ + 190, + 190, + 3 + ], + [ + 627, + 627, + 2 + ], + [ + 346, + 407, + 2 + ], + [ + 193, + 193, + 3 + ], + [ + 1063, + 254, + 4 + ], + [ + 460, + 460, + 3 + ], + [ + 1060, + 280, + 2 + ], + [ + 246, + 1024, + 2 + ], + [ + 496, + 496, + 3 + ], + [ + 819, + 819, + 2 + ], + [ + 1041, + 414, + 2 + ], + [ + 214, + 357, + 2 + ], + [ + 1038, + 447, + 6 + ], + [ + 1078, + 1078, + 2 + ], + [ + 375, + 267, + 2 + ], + [ + 229, + 301, + 3 + ], + [ + 370, + 256, + 2 + ], + [ + 1028, + 1025, + 3 + ], + [ + 425, + 425, + 2 + ], + [ + 188, + 359, + 2 + ], + [ + 399, + 241, + 2 + ], + [ + 248, + 327, + 2 + ], + [ + 563, + 563, + 2 + ], + [ + 254, + 217, + 2 + ], + [ + 358, + 358, + 3 + ], + [ + 62, + 569, + 1 + ], + [ + 343, + 372, + 2 + ], + [ + 741, + 741, + 2 + ], + [ + 310, + 310, + 3 + ], + [ + 576, + 576, + 2 + ], + [ + 239, + 319, + 2 + ], + [ + 412, + 412, + 3 + ], + [ + 394, + 394, + 3 + ], + [ + 323, + 446, + 2 + ], + [ + 1068, + 264, + 1 + ], + [ + 1029, + 1049, + 4 + ], + [ + 288, + 357, + 2 + ], + [ + 606, + 606, + 2 + ], + [ + 312, + 312, + 4 + ], + [ + 188, + 325, + 2 + ], + [ + 396, + 259, + 2 + ], + [ + 284, + 1026, + 2 + ], + [ + 1116, + 65, + 2 + ], + [ + 1028, + 1062, + 3 + ], + [ + 475, + 475, + 1 + ], + [ + 239, + 319, + 1 + ], + [ + 1115, + 1027, + 1 + ], + [ + 402, + 259, + 2 + ], + [ + 365, + 365, + 2 + ], + [ + 362, + 362, + 3 + ], + [ + 237, + 305, + 1 + ], + [ + 561, + 561, + 2 + ], + [ + 246, + 265, + 2 + ], + [ + 1081, + 1081, + 2 + ], + [ + 1106, + 65, + 2 + ], + [ + 1066, + 1027, + 1 + ], + [ + 299, + 299, + 5 + ], + [ + 304, + 304, + 5 + ], + [ + 67, + 68, + 2 + ], + [ + 255, + 255, + 4 + ], + [ + 491, + 491, + 3 + ], + [ + 1060, + 294, + 2 + ], + [ + 453, + 453, + 3 + ], + [ + 381, + 381, + 1 + ], + [ + 1030, + 281, + 1 + ], + [ + 1134, + 1040, + 2 + ], + [ + 1028, + 1089, + 3 + ], + [ + 249, + 469, + 2 + ], + [ + 343, + 260, + 2 + ], + [ + 261, + 261, + 1 + ], + [ + 188, + 347, + 2 + ], + [ + 413, + 315, + 2 + ], + [ + 395, + 395, + 3 + ], + [ + 1064, + 266, + 3 + ], + [ + 481, + 481, + 1 + ], + [ + 212, + 212, + 1 + ], + [ + 329, + 535, + 2 + ], + [ + 494, + 494, + 3 + ], + [ + 1047, + 174, + 5 + ], + [ + 276, + 276, + 1 + ], + [ + 1042, + 403, + 2 + ], + [ + 320, + 320, + 5 + ], + [ + 1028, + 1061, + 3 + ], + [ + 380, + 380, + 3 + ], + [ + 1048, + 176, + 5 + ], + [ + 295, + 295, + 4 + ], + [ + 314, + 273, + 2 + ], + [ + 1053, + 248, + 4 + ], + [ + 477, + 477, + 3 + ], + [ + 1042, + 409, + 2 + ], + [ + 457, + 321, + 2 + ], + [ + 398, + 321, + 2 + ], + [ + 687, + 687, + 2 + ], + [ + 1062, + 1028, + 1 + ], + [ + 190, + 351, + 2 + ], + [ + 246, + 347, + 2 + ], + [ + 697, + 697, + 2 + ], + [ + 1060, + 296, + 2 + ], + [ + 214, + 375, + 2 + ], + [ + 1061, + 1028, + 1 + ], + [ + 349, + 349, + 3 + ], + [ + 377, + 377, + 3 + ], + [ + 461, + 461, + 3 + ], + [ + 1025, + 174, + 4 + ], + [ + 1028, + 1086, + 3 + ], + [ + 275, + 1026, + 2 + ], + [ + 284, + 284, + 6 + ], + [ + 190, + 196, + 2 + ], + [ + 216, + 285, + 2 + ], + [ + 307, + 307, + 5 + ], + [ + 459, + 259, + 2 + ], + [ + 70, + 305, + 1 + ], + [ + 258, + 258, + 5 + ], + [ + 335, + 335, + 1 + ], + [ + 188, + 405, + 2 + ], + [ + 1039, + 1039, + 3 + ], + [ + 890, + 890, + 1 + ], + [ + 334, + 404, + 2 + ], + [ + 1072, + 265, + 4 + ], + [ + 326, + 242, + 1 + ], + [ + 328, + 328, + 4 + ], + [ + 454, + 331, + 1 + ], + [ + 1030, + 281, + 3 + ], + [ + 710, + 710, + 2 + ], + [ + 1053, + 1036, + 4 + ], + [ + 268, + 268, + 4 + ], + [ + 745, + 745, + 2 + ], + [ + 58, + 58, + 1 + ], + [ + 289, + 289, + 1 + ], + [ + 1038, + 441, + 6 + ], + [ + 942, + 942, + 1 + ], + [ + 254, + 369, + 2 + ], + [ + 262, + 404, + 2 + ], + [ + 437, + 437, + 1 + ], + [ + 480, + 236, + 2 + ], + [ + 788, + 788, + 1 + ], + [ + 72, + 71, + 2 + ], + [ + 1041, + 426, + 2 + ], + [ + 662, + 662, + 2 + ], + [ + 463, + 463, + 3 + ], + [ + 72, + 1139, + 1 + ], + [ + 833, + 833, + 2 + ], + [ + 520, + 520, + 2 + ], + [ + 794, + 794, + 2 + ], + [ + 632, + 632, + 2 + ], + [ + 203, + 203, + 1 + ], + [ + 1045, + 367, + 6 + ], + [ + 254, + 1024, + 2 + ], + [ + 1096, + 251, + 4 + ], + [ + 1047, + 174, + 7 + ], + [ + 1041, + 431, + 2 + ], + [ + 247, + 217, + 2 + ], + [ + 462, + 462, + 3 + ], + [ + 283, + 232, + 1 + ], + [ + 1109, + 256, + 4 + ], + [ + 400, + 400, + 2 + ], + [ + 70, + 1103, + 1 + ], + [ + 62, + 772, + 1 + ], + [ + 176, + 296, + 2 + ], + [ + 325, + 325, + 4 + ], + [ + 1027, + 1054, + 1 + ], + [ + 489, + 489, + 3 + ], + [ + 574, + 574, + 2 + ], + [ + 16, + 17, + 1 + ], + [ + 1068, + 264, + 3 + ], + [ + 1038, + 435, + 6 + ], + [ + 1028, + 251, + 7 + ], + [ + 262, + 417, + 2 + ], + [ + 348, + 1036, + 2 + ], + [ + 1027, + 1054, + 5 + ], + [ + 214, + 267, + 2 + ], + [ + 1049, + 202, + 4 + ], + [ + 336, + 244, + 1 + ], + [ + 1027, + 267, + 5 + ], + [ + 225, + 315, + 2 + ], + [ + 685, + 685, + 2 + ], + [ + 850, + 850, + 2 + ], + [ + 313, + 235, + 3 + ], + [ + 247, + 328, + 2 + ], + [ + 230, + 234, + 1 + ], + [ + 272, + 272, + 7 + ], + [ + 827, + 827, + 1 + ], + [ + 1025, + 176, + 4 + ], + [ + 323, + 446, + 1 + ], + [ + 220, + 220, + 3 + ], + [ + 836, + 836, + 2 + ], + [ + 501, + 501, + 3 + ], + [ + 288, + 201, + 2 + ], + [ + 265, + 347, + 2 + ], + [ + 1048, + 176, + 7 + ], + [ + 471, + 471, + 3 + ], + [ + 60, + 1163, + 1 + ], + [ + 333, + 339, + 2 + ], + [ + 269, + 273, + 2 + ], + [ + 1027, + 1087, + 3 + ], + [ + 174, + 294, + 2 + ], + [ + 301, + 301, + 5 + ], + [ + 314, + 314, + 4 + ], + [ + 526, + 526, + 1 + ], + [ + 671, + 671, + 2 + ], + [ + 601, + 601, + 2 + ], + [ + 1121, + 61, + 2 + ], + [ + 331, + 454, + 1 + ], + [ + 390, + 390, + 3 + ], + [ + 360, + 281, + 2 + ], + [ + 378, + 63, + 2 + ], + [ + 626, + 626, + 2 + ], + [ + 1027, + 1090, + 3 + ], + [ + 387, + 387, + 3 + ], + [ + 570, + 570, + 1 + ], + [ + 247, + 334, + 2 + ], + [ + 1027, + 267, + 3 + ], + [ + 214, + 1050, + 2 + ], + [ + 402, + 327, + 2 + ], + [ + 244, + 336, + 1 + ], + [ + 174, + 193, + 2 + ], + [ + 1025, + 370, + 4 + ], + [ + 217, + 329, + 2 + ], + [ + 555, + 555, + 2 + ], + [ + 594, + 594, + 2 + ], + [ + 246, + 248, + 2 + ], + [ + 551, + 551, + 1 + ], + [ + 285, + 216, + 2 + ], + [ + 107, + 106, + 1 + ], + [ + 379, + 190, + 2 + ], + [ + 198, + 198, + 3 + ], + [ + 234, + 230, + 1 + ], + [ + 176, + 193, + 2 + ], + [ + 521, + 521, + 2 + ], + [ + 217, + 1024, + 2 + ], + [ + 1060, + 275, + 2 + ], + [ + 479, + 479, + 3 + ], + [ + 280, + 280, + 5 + ], + [ + 265, + 265, + 4 + ], + [ + 338, + 417, + 2 + ], + [ + 70, + 305, + 2 + ], + [ + 619, + 619, + 2 + ], + [ + 249, + 495, + 2 + ], + [ + 1045, + 354, + 6 + ], + [ + 468, + 468, + 3 + ], + [ + 366, + 188, + 2 + ], + [ + 652, + 652, + 2 + ], + [ + 1070, + 241, + 1 + ], + [ + 608, + 608, + 2 + ], + [ + 1030, + 294, + 1 + ], + [ + 235, + 313, + 3 + ], + [ + 1038, + 458, + 6 + ], + [ + 1045, + 397, + 6 + ], + [ + 1028, + 1061, + 5 + ], + [ + 322, + 448, + 2 + ], + [ + 1030, + 296, + 1 + ], + [ + 369, + 257, + 2 + ], + [ + 1027, + 1069, + 3 + ], + [ + 695, + 695, + 2 + ], + [ + 522, + 522, + 2 + ], + [ + 1027, + 1067, + 3 + ], + [ + 427, + 427, + 2 + ], + [ + 1443, + 1443, + 2 + ], + [ + 1141, + 239, + 1 + ], + [ + 238, + 238, + 1 + ], + [ + 99, + 100, + 1 + ], + [ + 1042, + 447, + 2 + ], + [ + 326, + 242, + 2 + ], + [ + 1098, + 376, + 2 + ], + [ + 1116, + 64, + 2 + ], + [ + 1028, + 1062, + 5 + ], + [ + 320, + 234, + 3 + ], + [ + 430, + 309, + 2 + ], + [ + 1140, + 339, + 4 + ], + [ + 267, + 267, + 1 + ], + [ + 559, + 559, + 3 + ], + [ + 384, + 384, + 3 + ], + [ + 649, + 649, + 2 + ], + [ + 604, + 604, + 2 + ], + [ + 281, + 275, + 2 + ], + [ + 277, + 277, + 7 + ], + [ + 1045, + 358, + 6 + ], + [ + 319, + 239, + 1 + ], + [ + 225, + 309, + 2 + ], + [ + 175, + 175, + 1 + ], + [ + 304, + 229, + 2 + ], + [ + 365, + 188, + 2 + ], + [ + 493, + 307, + 2 + ], + [ + 285, + 416, + 1 + ], + [ + 1162, + 352, + 4 + ], + [ + 247, + 1024, + 2 + ], + [ + 372, + 343, + 2 + ], + [ + 473, + 473, + 3 + ], + [ + 66, + 205, + 1 + ], + [ + 523, + 523, + 2 + ], + [ + 586, + 586, + 2 + ], + [ + 474, + 474, + 3 + ], + [ + 889, + 61, + 1 + ], + [ + 1047, + 1047, + 1 + ], + [ + 504, + 504, + 1 + ], + [ + 261, + 261, + 5 + ], + [ + 469, + 249, + 2 + ], + [ + 596, + 596, + 2 + ], + [ + 235, + 324, + 3 + ], + [ + 359, + 448, + 2 + ], + [ + 466, + 667, + 1 + ], + [ + 260, + 1083, + 2 + ], + [ + 363, + 363, + 1 + ], + [ + 190, + 353, + 2 + ], + [ + 817, + 817, + 1 + ], + [ + 590, + 590, + 2 + ], + [ + 112, + 112, + 1 + ], + [ + 399, + 399, + 3 + ], + [ + 1026, + 193, + 1 + ], + [ + 1148, + 71, + 2 + ], + [ + 593, + 593, + 2 + ], + [ + 273, + 314, + 2 + ], + [ + 312, + 272, + 2 + ], + [ + 318, + 318, + 5 + ], + [ + 246, + 246, + 1 + ], + [ + 451, + 252, + 2 + ], + [ + 1121, + 62, + 2 + ], + [ + 577, + 352, + 2 + ], + [ + 517, + 517, + 3 + ], + [ + 610, + 610, + 2 + ], + [ + 260, + 343, + 2 + ], + [ + 1042, + 435, + 2 + ], + [ + 247, + 1067, + 2 + ], + [ + 254, + 254, + 4 + ], + [ + 272, + 312, + 2 + ], + [ + 1025, + 332, + 4 + ], + [ + 1098, + 354, + 2 + ], + [ + 259, + 396, + 2 + ], + [ + 1143, + 265, + 4 + ], + [ + 229, + 304, + 2 + ], + [ + 330, + 433, + 2 + ], + [ + 684, + 684, + 2 + ], + [ + 266, + 500, + 2 + ], + [ + 262, + 553, + 2 + ], + [ + 1060, + 260, + 2 + ], + [ + 256, + 370, + 2 + ], + [ + 582, + 582, + 2 + ], + [ + 248, + 338, + 2 + ], + [ + 428, + 264, + 2 + ], + [ + 422, + 323, + 1 + ], + [ + 464, + 464, + 3 + ], + [ + 820, + 820, + 1 + ], + [ + 236, + 236, + 5 + ], + [ + 1030, + 294, + 5 + ], + [ + 1042, + 441, + 2 + ], + [ + 210, + 252, + 2 + ], + [ + 497, + 497, + 1 + ], + [ + 598, + 598, + 2 + ], + [ + 1026, + 174, + 4 + ], + [ + 248, + 1024, + 2 + ], + [ + 336, + 244, + 2 + ], + [ + 72, + 805, + 1 + ], + [ + 394, + 394, + 1 + ], + [ + 486, + 486, + 3 + ], + [ + 498, + 498, + 3 + ], + [ + 271, + 271, + 1 + ], + [ + 410, + 637, + 1 + ], + [ + 228, + 228, + 5 + ], + [ + 1090, + 1027, + 1 + ], + [ + 656, + 656, + 2 + ], + [ + 376, + 289, + 2 + ], + [ + 954, + 954, + 1 + ], + [ + 234, + 320, + 3 + ], + [ + 267, + 217, + 2 + ], + [ + 248, + 217, + 2 + ], + [ + 1027, + 1079, + 1 + ], + [ + 1033, + 1073, + 3 + ], + [ + 527, + 527, + 3 + ], + [ + 1111, + 1111, + 2 + ], + [ + 216, + 289, + 2 + ], + [ + 484, + 484, + 3 + ], + [ + 492, + 492, + 3 + ], + [ + 378, + 569, + 2 + ], + [ + 359, + 1039, + 2 + ], + [ + 258, + 327, + 2 + ], + [ + 418, + 300, + 2 + ], + [ + 668, + 478, + 1 + ], + [ + 273, + 269, + 2 + ], + [ + 1105, + 1105, + 1 + ], + [ + 267, + 1024, + 2 + ], + [ + 423, + 423, + 3 + ], + [ + 262, + 490, + 2 + ], + [ + 510, + 510, + 3 + ], + [ + 1028, + 1159, + 1 + ], + [ + 230, + 230, + 7 + ], + [ + 248, + 1069, + 2 + ], + [ + 1060, + 277, + 2 + ], + [ + 245, + 370, + 2 + ], + [ + 373, + 337, + 2 + ], + [ + 605, + 605, + 2 + ], + [ + 1282, + 73, + 2 + ], + [ + 388, + 190, + 2 + ], + [ + 201, + 288, + 2 + ], + [ + 612, + 612, + 2 + ], + [ + 482, + 482, + 3 + ], + [ + 792, + 609, + 2 + ], + [ + 254, + 1063, + 2 + ], + [ + 689, + 689, + 2 + ], + [ + 1030, + 296, + 5 + ], + [ + 229, + 235, + 1 + ], + [ + 1030, + 1026, + 3 + ], + [ + 424, + 424, + 3 + ], + [ + 326, + 444, + 1 + ], + [ + 565, + 565, + 2 + ], + [ + 640, + 640, + 2 + ], + [ + 1087, + 1027, + 1 + ], + [ + 235, + 229, + 1 + ], + [ + 109, + 108, + 1 + ], + [ + 406, + 406, + 1 + ], + [ + 584, + 584, + 2 + ], + [ + 1310, + 61, + 2 + ], + [ + 385, + 360, + 2 + ], + [ + 588, + 588, + 2 + ], + [ + 585, + 585, + 2 + ], + [ + 663, + 663, + 2 + ], + [ + 1048, + 1048, + 1 + ], + [ + 368, + 368, + 1 + ], + [ + 319, + 465, + 1 + ], + [ + 348, + 276, + 2 + ], + [ + 696, + 696, + 2 + ], + [ + 1184, + 1027, + 1 + ], + [ + 775, + 775, + 1 + ], + [ + 467, + 467, + 3 + ], + [ + 346, + 346, + 1 + ], + [ + 1036, + 259, + 4 + ], + [ + 323, + 422, + 1 + ], + [ + 1186, + 1027, + 1 + ], + [ + 459, + 459, + 3 + ], + [ + 1042, + 458, + 2 + ], + [ + 28, + 27, + 1 + ], + [ + 240, + 251, + 2 + ], + [ + 227, + 321, + 2 + ], + [ + 407, + 371, + 2 + ], + [ + 421, + 421, + 3 + ], + [ + 329, + 363, + 2 + ], + [ + 587, + 587, + 2 + ], + [ + 324, + 324, + 5 + ], + [ + 1054, + 1027, + 1 + ], + [ + 470, + 470, + 3 + ], + [ + 265, + 325, + 2 + ], + [ + 1028, + 1160, + 1 + ], + [ + 1029, + 202, + 1 + ], + [ + 398, + 300, + 2 + ], + [ + 1156, + 315, + 4 + ], + [ + 548, + 548, + 1 + ], + [ + 71, + 392, + 1 + ], + [ + 273, + 1025, + 2 + ], + [ + 1075, + 251, + 4 + ], + [ + 294, + 284, + 2 + ], + [ + 1060, + 284, + 2 + ], + [ + 262, + 268, + 2 + ], + [ + 413, + 309, + 2 + ], + [ + 546, + 546, + 3 + ], + [ + 332, + 269, + 2 + ], + [ + 600, + 600, + 2 + ], + [ + 419, + 419, + 3 + ], + [ + 235, + 230, + 2 + ], + [ + 102, + 101, + 1 + ], + [ + 533, + 533, + 3 + ], + [ + 661, + 661, + 2 + ], + [ + 246, + 246, + 4 + ], + [ + 270, + 270, + 5 + ], + [ + 1098, + 367, + 2 + ], + [ + 208, + 208, + 3 + ], + [ + 1024, + 1027, + 1 + ], + [ + 176, + 174, + 7 + ], + [ + 432, + 288, + 2 + ], + [ + 505, + 301, + 2 + ], + [ + 1075, + 256, + 4 + ], + [ + 216, + 216, + 5 + ], + [ + 724, + 724, + 2 + ], + [ + 251, + 1025, + 2 + ], + [ + 1057, + 217, + 4 + ], + [ + 669, + 669, + 2 + ], + [ + 396, + 328, + 2 + ], + [ + 277, + 296, + 2 + ], + [ + 247, + 485, + 2 + ], + [ + 507, + 507, + 2 + ], + [ + 1027, + 1097, + 1 + ], + [ + 234, + 229, + 2 + ], + [ + 330, + 433, + 1 + ], + [ + 1064, + 1064, + 1 + ], + [ + 1098, + 358, + 2 + ], + [ + 305, + 237, + 2 + ], + [ + 257, + 257, + 4 + ], + [ + 254, + 362, + 2 + ], + [ + 1123, + 1123, + 2 + ], + [ + 410, + 680, + 1 + ], + [ + 1157, + 249, + 6 + ], + [ + 571, + 249, + 2 + ], + [ + 284, + 294, + 2 + ], + [ + 634, + 454, + 1 + ], + [ + 624, + 624, + 2 + ], + [ + 205, + 66, + 1 + ], + [ + 439, + 439, + 3 + ], + [ + 323, + 422, + 2 + ], + [ + 1085, + 1085, + 2 + ], + [ + 629, + 629, + 2 + ], + [ + 444, + 326, + 1 + ], + [ + 254, + 267, + 2 + ], + [ + 503, + 304, + 2 + ], + [ + 193, + 360, + 2 + ], + [ + 438, + 438, + 1 + ], + [ + 247, + 214, + 2 + ], + [ + 65, + 64, + 1 + ], + [ + 1070, + 241, + 3 + ], + [ + 480, + 480, + 3 + ], + [ + 307, + 493, + 2 + ], + [ + 266, + 493, + 2 + ], + [ + 579, + 579, + 2 + ], + [ + 591, + 591, + 2 + ], + [ + 353, + 353, + 2 + ], + [ + 265, + 214, + 2 + ], + [ + 256, + 1062, + 2 + ], + [ + 296, + 277, + 2 + ], + [ + 227, + 300, + 2 + ], + [ + 130, + 130, + 2 + ], + [ + 251, + 1061, + 2 + ], + [ + 232, + 283, + 2 + ], + [ + 295, + 295, + 5 + ], + [ + 854, + 854, + 1 + ], + [ + 401, + 190, + 2 + ], + [ + 1054, + 246, + 4 + ], + [ + 68, + 212, + 1 + ], + [ + 28, + 29, + 1 + ], + [ + 1028, + 1130, + 1 + ], + [ + 797, + 797, + 2 + ], + [ + 265, + 1024, + 2 + ], + [ + 1031, + 1029, + 3 + ], + [ + 299, + 230, + 2 + ], + [ + 541, + 541, + 3 + ], + [ + 472, + 472, + 1 + ], + [ + 201, + 214, + 2 + ], + [ + 372, + 372, + 2 + ], + [ + 269, + 332, + 2 + ], + [ + 557, + 557, + 3 + ], + [ + 128, + 635, + 1 + ], + [ + 259, + 188, + 2 + ], + [ + 67, + 1100, + 1 + ], + [ + 253, + 253, + 6 + ], + [ + 202, + 653, + 2 + ], + [ + 440, + 308, + 2 + ], + [ + 248, + 214, + 2 + ], + [ + 476, + 476, + 3 + ], + [ + 414, + 190, + 2 + ], + [ + 230, + 299, + 2 + ], + [ + 63, + 62, + 1 + ], + [ + 1202, + 217, + 6 + ], + [ + 272, + 1025, + 2 + ], + [ + 341, + 341, + 2 + ], + [ + 1028, + 1165, + 1 + ], + [ + 334, + 271, + 2 + ], + [ + 229, + 234, + 2 + ], + [ + 442, + 442, + 1 + ], + [ + 495, + 249, + 2 + ], + [ + 232, + 283, + 1 + ], + [ + 923, + 923, + 2 + ], + [ + 1026, + 176, + 4 + ], + [ + 256, + 1025, + 2 + ], + [ + 568, + 348, + 2 + ], + [ + 483, + 483, + 3 + ], + [ + 322, + 1039, + 2 + ], + [ + 433, + 330, + 1 + ], + [ + 412, + 1049, + 2 + ], + [ + 229, + 301, + 2 + ], + [ + 382, + 382, + 3 + ], + [ + 1027, + 1067, + 1 + ], + [ + 665, + 665, + 2 + ], + [ + 436, + 436, + 3 + ], + [ + 357, + 339, + 2 + ], + [ + 1028, + 1129, + 1 + ], + [ + 529, + 529, + 3 + ], + [ + 202, + 651, + 2 + ], + [ + 747, + 747, + 2 + ], + [ + 18, + 17, + 1 + ], + [ + 1159, + 1028, + 1 + ], + [ + 252, + 451, + 2 + ], + [ + 1060, + 281, + 2 + ], + [ + 175, + 175, + 5 + ], + [ + 971, + 971, + 1 + ], + [ + 234, + 318, + 3 + ], + [ + 564, + 564, + 2 + ], + [ + 505, + 266, + 2 + ], + [ + 434, + 434, + 1 + ], + [ + 217, + 405, + 2 + ], + [ + 625, + 625, + 2 + ], + [ + 67, + 66, + 1 + ], + [ + 1160, + 1028, + 1 + ], + [ + 499, + 499, + 3 + ], + [ + 212, + 68, + 1 + ], + [ + 445, + 445, + 4 + ], + [ + 26, + 27, + 1 + ], + [ + 615, + 615, + 2 + ], + [ + 884, + 884, + 1 + ], + [ + 324, + 235, + 3 + ], + [ + 676, + 676, + 2 + ], + [ + 1058, + 214, + 4 + ], + [ + 255, + 255, + 1 + ], + [ + 1027, + 1069, + 1 + ], + [ + 375, + 1036, + 2 + ], + [ + 193, + 343, + 2 + ], + [ + 344, + 344, + 2 + ], + [ + 259, + 402, + 2 + ], + [ + 307, + 230, + 2 + ], + [ + 281, + 360, + 2 + ], + [ + 392, + 71, + 1 + ], + [ + 247, + 246, + 2 + ], + [ + 500, + 266, + 2 + ], + [ + 275, + 275, + 6 + ], + [ + 321, + 398, + 1 + ], + [ + 250, + 250, + 4 + ], + [ + 466, + 723, + 1 + ], + [ + 525, + 525, + 3 + ], + [ + 239, + 200, + 2 + ], + [ + 519, + 320, + 2 + ], + [ + 72, + 570, + 1 + ], + [ + 374, + 374, + 1 + ], + [ + 267, + 369, + 2 + ], + [ + 248, + 246, + 2 + ], + [ + 337, + 524, + 2 + ], + [ + 602, + 602, + 2 + ], + [ + 69, + 69, + 3 + ], + [ + 856, + 856, + 1 + ], + [ + 319, + 446, + 1 + ], + [ + 331, + 243, + 2 + ], + [ + 281, + 1026, + 2 + ], + [ + 457, + 326, + 1 + ], + [ + 240, + 240, + 5 + ], + [ + 241, + 241, + 5 + ], + [ + 190, + 453, + 2 + ], + [ + 351, + 351, + 2 + ], + [ + 209, + 209, + 3 + ], + [ + 23, + 24, + 1 + ], + [ + 273, + 273, + 7 + ], + [ + 540, + 540, + 3 + ], + [ + 1121, + 1121, + 2 + ], + [ + 715, + 715, + 2 + ], + [ + 244, + 336, + 2 + ], + [ + 631, + 631, + 2 + ], + [ + 1030, + 294, + 3 + ], + [ + 216, + 196, + 2 + ], + [ + 188, + 196, + 2 + ], + [ + 575, + 575, + 3 + ], + [ + 550, + 339, + 2 + ], + [ + 491, + 491, + 2 + ], + [ + 190, + 449, + 2 + ], + [ + 1116, + 1116, + 2 + ], + [ + 1030, + 296, + 3 + ], + [ + 205, + 194, + 1 + ], + [ + 1027, + 1079, + 3 + ], + [ + 729, + 729, + 1 + ], + [ + 331, + 243, + 1 + ], + [ + 256, + 245, + 2 + ], + [ + 1059, + 349, + 4 + ], + [ + 285, + 322, + 2 + ], + [ + 613, + 613, + 2 + ], + [ + 270, + 270, + 1 + ], + [ + 549, + 549, + 2 + ], + [ + 199, + 242, + 2 + ], + [ + 939, + 939, + 2 + ], + [ + 1024, + 369, + 4 + ], + [ + 1028, + 1132, + 1 + ], + [ + 1073, + 1040, + 1 + ], + [ + 276, + 348, + 2 + ], + [ + 201, + 249, + 2 + ], + [ + 1167, + 332, + 4 + ], + [ + 278, + 278, + 1 + ], + [ + 403, + 193, + 2 + ], + [ + 503, + 264, + 2 + ], + [ + 239, + 200, + 1 + ], + [ + 1111, + 71, + 2 + ], + [ + 1029, + 1029, + 1 + ], + [ + 327, + 258, + 2 + ], + [ + 496, + 496, + 4 + ], + [ + 271, + 271, + 5 + ], + [ + 294, + 174, + 2 + ], + [ + 444, + 315, + 1 + ], + [ + 279, + 279, + 5 + ], + [ + 312, + 312, + 5 + ], + [ + 514, + 514, + 3 + ], + [ + 301, + 229, + 2 + ], + [ + 249, + 201, + 2 + ], + [ + 425, + 425, + 3 + ], + [ + 329, + 322, + 2 + ], + [ + 478, + 668, + 1 + ], + [ + 326, + 457, + 1 + ], + [ + 452, + 452, + 1 + ], + [ + 892, + 892, + 1 + ], + [ + 1148, + 73, + 2 + ], + [ + 338, + 338, + 4 + ], + [ + 1166, + 325, + 4 + ], + [ + 357, + 288, + 2 + ], + [ + 272, + 295, + 2 + ], + [ + 903, + 903, + 1 + ], + [ + 138, + 660, + 1 + ], + [ + 843, + 843, + 1 + ], + [ + 362, + 563, + 2 + ], + [ + 335, + 335, + 3 + ], + [ + 1165, + 1028, + 1 + ], + [ + 102, + 103, + 1 + ], + [ + 409, + 193, + 2 + ], + [ + 74, + 1593, + 1 + ], + [ + 236, + 219, + 2 + ], + [ + 334, + 534, + 2 + ], + [ + 412, + 367, + 2 + ], + [ + 290, + 223, + 2 + ], + [ + 799, + 799, + 2 + ], + [ + 512, + 299, + 2 + ], + [ + 1075, + 272, + 4 + ], + [ + 370, + 370, + 4 + ], + [ + 488, + 488, + 4 + ], + [ + 398, + 321, + 1 + ], + [ + 284, + 284, + 7 + ], + [ + 104, + 103, + 1 + ], + [ + 896, + 896, + 1 + ], + [ + 617, + 617, + 2 + ], + [ + 443, + 443, + 4 + ], + [ + 688, + 688, + 2 + ], + [ + 1070, + 1070, + 4 + ], + [ + 738, + 738, + 2 + ], + [ + 99, + 98, + 1 + ], + [ + 418, + 418, + 3 + ], + [ + 254, + 247, + 2 + ], + [ + 230, + 235, + 2 + ], + [ + 391, + 391, + 4 + ], + [ + 1040, + 217, + 6 + ], + [ + 66, + 194, + 1 + ], + [ + 766, + 766, + 2 + ], + [ + 253, + 328, + 2 + ], + [ + 389, + 389, + 4 + ], + [ + 1046, + 322, + 4 + ], + [ + 272, + 256, + 2 + ], + [ + 245, + 256, + 2 + ], + [ + 318, + 234, + 3 + ], + [ + 897, + 897, + 2 + ], + [ + 528, + 528, + 3 + ], + [ + 1075, + 273, + 4 + ], + [ + 246, + 214, + 2 + ], + [ + 397, + 202, + 2 + ], + [ + 280, + 343, + 2 + ], + [ + 487, + 487, + 3 + ], + [ + 633, + 633, + 2 + ], + [ + 1036, + 1053, + 4 + ], + [ + 260, + 343, + 3 + ], + [ + 60, + 1693, + 1 + ], + [ + 69, + 70, + 2 + ], + [ + 296, + 176, + 2 + ], + [ + 232, + 232, + 3 + ], + [ + 274, + 274, + 2 + ], + [ + 107, + 108, + 1 + ], + [ + 542, + 214, + 2 + ], + [ + 243, + 331, + 1 + ], + [ + 1270, + 466, + 1 + ], + [ + 1106, + 1106, + 2 + ], + [ + 621, + 621, + 2 + ], + [ + 363, + 363, + 3 + ], + [ + 188, + 421, + 2 + ], + [ + 675, + 675, + 2 + ], + [ + 203, + 203, + 3 + ], + [ + 212, + 237, + 1 + ], + [ + 1027, + 365, + 1 + ], + [ + 201, + 325, + 2 + ], + [ + 1152, + 254, + 7 + ], + [ + 1191, + 378, + 4 + ], + [ + 426, + 190, + 2 + ], + [ + 244, + 309, + 2 + ], + [ + 251, + 240, + 2 + ], + [ + 1075, + 269, + 4 + ], + [ + 516, + 516, + 3 + ], + [ + 249, + 367, + 2 + ], + [ + 1080, + 267, + 4 + ], + [ + 816, + 816, + 2 + ], + [ + 188, + 424, + 2 + ], + [ + 314, + 314, + 5 + ], + [ + 518, + 518, + 4 + ], + [ + 1044, + 1024, + 4 + ], + [ + 1068, + 1068, + 1 + ], + [ + 327, + 327, + 4 + ], + [ + 285, + 216, + 1 + ], + [ + 199, + 242, + 1 + ], + [ + 1027, + 1067, + 5 + ], + [ + 592, + 481, + 2 + ], + [ + 508, + 508, + 1 + ], + [ + 513, + 513, + 2 + ], + [ + 313, + 313, + 6 + ], + [ + 248, + 476, + 2 + ], + [ + 252, + 210, + 2 + ], + [ + 1028, + 379, + 1 + ], + [ + 328, + 253, + 2 + ], + [ + 76, + 75, + 1 + ], + [ + 340, + 340, + 5 + ], + [ + 792, + 792, + 2 + ], + [ + 469, + 469, + 3 + ], + [ + 618, + 618, + 2 + ], + [ + 404, + 262, + 2 + ], + [ + 512, + 264, + 2 + ], + [ + 405, + 405, + 3 + ], + [ + 246, + 247, + 2 + ], + [ + 1178, + 304, + 4 + ], + [ + 931, + 931, + 1 + ], + [ + 1152, + 248, + 7 + ], + [ + 58, + 59, + 1 + ], + [ + 229, + 229, + 7 + ], + [ + 294, + 275, + 2 + ], + [ + 1057, + 329, + 4 + ], + [ + 280, + 277, + 2 + ], + [ + 765, + 765, + 2 + ], + [ + 475, + 371, + 2 + ], + [ + 446, + 319, + 1 + ], + [ + 386, + 386, + 1 + ], + [ + 1152, + 247, + 7 + ], + [ + 603, + 603, + 3 + ], + [ + 1138, + 322, + 4 + ], + [ + 429, + 429, + 3 + ], + [ + 422, + 323, + 2 + ], + [ + 305, + 237, + 1 + ], + [ + 493, + 266, + 2 + ], + [ + 558, + 214, + 2 + ], + [ + 536, + 536, + 3 + ], + [ + 465, + 330, + 2 + ], + [ + 210, + 252, + 1 + ], + [ + 636, + 636, + 2 + ], + [ + 273, + 251, + 2 + ], + [ + 230, + 307, + 2 + ], + [ + 419, + 310, + 2 + ], + [ + 255, + 352, + 2 + ], + [ + 1033, + 262, + 6 + ], + [ + 362, + 279, + 2 + ], + [ + 248, + 424, + 2 + ], + [ + 315, + 413, + 1 + ], + [ + 1027, + 1069, + 5 + ], + [ + 720, + 720, + 2 + ], + [ + 431, + 190, + 2 + ], + [ + 1027, + 1097, + 3 + ], + [ + 435, + 193, + 2 + ], + [ + 296, + 260, + 2 + ], + [ + 498, + 264, + 2 + ], + [ + 334, + 1039, + 2 + ], + [ + 573, + 573, + 2 + ], + [ + 315, + 413, + 2 + ], + [ + 782, + 782, + 2 + ], + [ + 216, + 268, + 2 + ], + [ + 200, + 239, + 1 + ], + [ + 383, + 383, + 4 + ], + [ + 760, + 660, + 1 + ], + [ + 908, + 908, + 1 + ], + [ + 1028, + 1179, + 1 + ], + [ + 342, + 342, + 5 + ], + [ + 347, + 347, + 1 + ], + [ + 449, + 449, + 4 + ], + [ + 519, + 264, + 2 + ], + [ + 742, + 742, + 2 + ], + [ + 188, + 375, + 2 + ], + [ + 494, + 494, + 4 + ], + [ + 266, + 505, + 2 + ], + [ + 373, + 373, + 3 + ], + [ + 807, + 807, + 2 + ], + [ + 325, + 201, + 2 + ], + [ + 485, + 485, + 3 + ], + [ + 254, + 1044, + 2 + ], + [ + 356, + 356, + 1 + ], + [ + 456, + 456, + 4 + ], + [ + 64, + 1124, + 1 + ], + [ + 346, + 346, + 3 + ], + [ + 691, + 691, + 1 + ], + [ + 294, + 260, + 2 + ], + [ + 537, + 537, + 3 + ], + [ + 277, + 280, + 2 + ], + [ + 454, + 634, + 1 + ], + [ + 1148, + 1148, + 2 + ], + [ + 254, + 248, + 2 + ], + [ + 566, + 566, + 3 + ], + [ + 196, + 201, + 2 + ], + [ + 355, + 355, + 1 + ], + [ + 256, + 272, + 2 + ], + [ + 440, + 308, + 1 + ], + [ + 328, + 396, + 2 + ], + [ + 647, + 430, + 1 + ], + [ + 255, + 201, + 2 + ], + [ + 189, + 189, + 2 + ], + [ + 698, + 698, + 2 + ], + [ + 268, + 262, + 2 + ], + [ + 460, + 460, + 4 + ], + [ + 257, + 369, + 2 + ], + [ + 1076, + 1076, + 4 + ], + [ + 1183, + 307, + 4 + ], + [ + 225, + 195, + 2 + ], + [ + 316, + 316, + 5 + ], + [ + 1190, + 299, + 4 + ], + [ + 288, + 288, + 4 + ], + [ + 1024, + 362, + 4 + ], + [ + 1285, + 317, + 4 + ], + [ + 374, + 258, + 2 + ], + [ + 265, + 217, + 2 + ], + [ + 266, + 538, + 2 + ], + [ + 552, + 552, + 2 + ], + [ + 1027, + 1126, + 1 + ], + [ + 245, + 258, + 2 + ], + [ + 275, + 360, + 2 + ], + [ + 190, + 477, + 2 + ], + [ + 1155, + 210, + 4 + ], + [ + 304, + 503, + 2 + ], + [ + 556, + 556, + 3 + ], + [ + 62, + 64, + 1 + ], + [ + 278, + 278, + 5 + ], + [ + 294, + 403, + 2 + ], + [ + 128, + 127, + 1 + ], + [ + 417, + 262, + 2 + ], + [ + 251, + 332, + 3 + ], + [ + 942, + 597, + 1 + ], + [ + 1046, + 262, + 4 + ], + [ + 645, + 645, + 2 + ], + [ + 351, + 351, + 5 + ], + [ + 376, + 376, + 3 + ], + [ + 261, + 406, + 2 + ], + [ + 433, + 330, + 2 + ], + [ + 658, + 658, + 2 + ], + [ + 898, + 898, + 2 + ], + [ + 757, + 757, + 2 + ], + [ + 1026, + 222, + 4 + ], + [ + 364, + 258, + 2 + ], + [ + 696, + 289, + 2 + ], + [ + 360, + 275, + 2 + ], + [ + 1028, + 388, + 1 + ], + [ + 176, + 174, + 6 + ], + [ + 1513, + 106, + 2 + ], + [ + 314, + 1025, + 2 + ], + [ + 234, + 320, + 4 + ], + [ + 226, + 308, + 2 + ], + [ + 741, + 578, + 2 + ], + [ + 644, + 644, + 2 + ], + [ + 501, + 501, + 4 + ], + [ + 1130, + 1028, + 1 + ], + [ + 202, + 196, + 2 + ], + [ + 70, + 71, + 2 + ], + [ + 247, + 421, + 2 + ], + [ + 295, + 272, + 2 + ], + [ + 1075, + 295, + 4 + ], + [ + 273, + 256, + 2 + ], + [ + 1027, + 366, + 1 + ], + [ + 129, + 679, + 1 + ], + [ + 301, + 505, + 2 + ], + [ + 1067, + 1027, + 1 + ], + [ + 202, + 241, + 2 + ], + [ + 1118, + 281, + 5 + ], + [ + 441, + 193, + 2 + ], + [ + 1053, + 267, + 4 + ], + [ + 1154, + 283, + 4 + ], + [ + 260, + 296, + 2 + ], + [ + 1074, + 252, + 3 + ], + [ + 312, + 1025, + 2 + ], + [ + 385, + 385, + 3 + ], + [ + 523, + 523, + 3 + ], + [ + 230, + 299, + 4 + ], + [ + 181, + 192, + 1 + ], + [ + 18, + 19, + 1 + ], + [ + 338, + 1039, + 2 + ], + [ + 202, + 352, + 2 + ], + [ + 1174, + 321, + 4 + ], + [ + 427, + 293, + 2 + ], + [ + 216, + 279, + 2 + ], + [ + 378, + 283, + 2 + ], + [ + 16, + 15, + 1 + ], + [ + 327, + 402, + 2 + ], + [ + 1069, + 1027, + 1 + ], + [ + 400, + 400, + 3 + ], + [ + 453, + 453, + 4 + ], + [ + 242, + 199, + 1 + ], + [ + 246, + 348, + 2 + ], + [ + 1050, + 1050, + 3 + ], + [ + 276, + 276, + 5 + ], + [ + 411, + 411, + 4 + ], + [ + 269, + 1084, + 2 + ], + [ + 190, + 491, + 2 + ], + [ + 393, + 393, + 4 + ], + [ + 217, + 254, + 2 + ], + [ + 413, + 315, + 1 + ], + [ + 498, + 313, + 2 + ], + [ + 353, + 353, + 5 + ], + [ + 227, + 300, + 1 + ], + [ + 70, + 69, + 2 + ], + [ + 1152, + 265, + 7 + ], + [ + 714, + 714, + 2 + ], + [ + 1024, + 334, + 4 + ], + [ + 718, + 718, + 2 + ], + [ + 311, + 311, + 2 + ], + [ + 412, + 241, + 2 + ], + [ + 219, + 219, + 5 + ], + [ + 452, + 451, + 2 + ], + [ + 1028, + 1226, + 1 + ], + [ + 446, + 323, + 1 + ], + [ + 229, + 304, + 4 + ], + [ + 260, + 294, + 2 + ], + [ + 333, + 333, + 1 + ], + [ + 1049, + 1059, + 4 + ], + [ + 230, + 234, + 2 + ], + [ + 416, + 285, + 2 + ], + [ + 1192, + 236, + 4 + ], + [ + 65, + 65, + 3 + ], + [ + 595, + 217, + 2 + ], + [ + 1223, + 235, + 4 + ], + [ + 67, + 67, + 3 + ], + [ + 522, + 522, + 3 + ], + [ + 68, + 237, + 1 + ], + [ + 961, + 961, + 2 + ], + [ + 793, + 793, + 2 + ], + [ + 1117, + 262, + 4 + ], + [ + 504, + 382, + 2 + ], + [ + 265, + 405, + 2 + ], + [ + 368, + 335, + 2 + ], + [ + 1028, + 1219, + 1 + ], + [ + 299, + 299, + 6 + ], + [ + 510, + 339, + 2 + ], + [ + 520, + 520, + 3 + ], + [ + 259, + 259, + 1 + ], + [ + 398, + 300, + 1 + ], + [ + 369, + 459, + 2 + ], + [ + 1027, + 1063, + 3 + ], + [ + 249, + 354, + 2 + ], + [ + 490, + 490, + 3 + ], + [ + 252, + 1074, + 1 + ], + [ + 336, + 430, + 1 + ], + [ + 337, + 337, + 3 + ], + [ + 1024, + 325, + 4 + ], + [ + 272, + 251, + 2 + ], + [ + 458, + 193, + 2 + ], + [ + 195, + 244, + 2 + ], + [ + 442, + 258, + 2 + ], + [ + 1141, + 1141, + 1 + ], + [ + 245, + 245, + 5 + ], + [ + 1129, + 1028, + 1 + ], + [ + 217, + 248, + 2 + ], + [ + 359, + 359, + 4 + ], + [ + 222, + 193, + 2 + ], + [ + 30, + 29, + 1 + ], + [ + 1031, + 289, + 5 + ], + [ + 659, + 659, + 2 + ], + [ + 1586, + 22, + 2 + ], + [ + 285, + 285, + 4 + ], + [ + 334, + 628, + 2 + ], + [ + 462, + 462, + 4 + ], + [ + 217, + 247, + 2 + ], + [ + 1181, + 1027, + 1 + ], + [ + 314, + 251, + 2 + ], + [ + 1042, + 174, + 2 + ], + [ + 690, + 690, + 2 + ], + [ + 531, + 531, + 3 + ], + [ + 1027, + 345, + 1 + ], + [ + 1529, + 100, + 2 + ], + [ + 324, + 538, + 2 + ], + [ + 417, + 338, + 2 + ], + [ + 197, + 221, + 2 + ], + [ + 280, + 277, + 1 + ], + [ + 229, + 235, + 2 + ], + [ + 350, + 350, + 3 + ], + [ + 215, + 215, + 3 + ], + [ + 1119, + 1119, + 4 + ], + [ + 225, + 309, + 1 + ], + [ + 296, + 275, + 2 + ], + [ + 1024, + 1056, + 4 + ], + [ + 226, + 323, + 2 + ], + [ + 292, + 292, + 3 + ], + [ + 415, + 415, + 4 + ], + [ + 105, + 106, + 1 + ], + [ + 246, + 1046, + 2 + ], + [ + 174, + 190, + 2 + ], + [ + 205, + 66, + 2 + ], + [ + 289, + 627, + 2 + ], + [ + 1024, + 338, + 4 + ], + [ + 72, + 1003, + 1 + ], + [ + 234, + 230, + 2 + ], + [ + 699, + 699, + 2 + ], + [ + 727, + 727, + 2 + ], + [ + 1030, + 1026, + 1 + ], + [ + 201, + 375, + 2 + ], + [ + 214, + 1036, + 3 + ], + [ + 210, + 317, + 2 + ], + [ + 712, + 712, + 2 + ], + [ + 713, + 713, + 2 + ], + [ + 1503, + 17, + 2 + ], + [ + 495, + 495, + 3 + ], + [ + 438, + 266, + 1 + ], + [ + 1075, + 314, + 4 + ], + [ + 305, + 70, + 1 + ], + [ + 1132, + 1028, + 1 + ], + [ + 635, + 408, + 1 + ], + [ + 296, + 409, + 2 + ], + [ + 457, + 321, + 1 + ], + [ + 265, + 1072, + 2 + ], + [ + 716, + 716, + 2 + ], + [ + 277, + 280, + 1 + ], + [ + 328, + 188, + 2 + ], + [ + 261, + 261, + 6 + ], + [ + 500, + 500, + 3 + ], + [ + 247, + 254, + 2 + ], + [ + 198, + 243, + 2 + ], + [ + 434, + 253, + 2 + ], + [ + 175, + 175, + 6 + ], + [ + 429, + 279, + 2 + ], + [ + 249, + 358, + 2 + ], + [ + 247, + 423, + 2 + ], + [ + 228, + 228, + 1 + ], + [ + 250, + 196, + 2 + ], + [ + 419, + 310, + 1 + ], + [ + 355, + 355, + 4 + ], + [ + 240, + 253, + 2 + ], + [ + 425, + 284, + 2 + ], + [ + 1198, + 66, + 2 + ], + [ + 63, + 378, + 1 + ], + [ + 489, + 489, + 4 + ], + [ + 521, + 521, + 3 + ], + [ + 1057, + 1057, + 3 + ], + [ + 1042, + 176, + 2 + ], + [ + 193, + 174, + 4 + ], + [ + 673, + 673, + 2 + ], + [ + 396, + 361, + 2 + ], + [ + 149, + 149, + 2 + ], + [ + 259, + 1058, + 3 + ], + [ + 756, + 756, + 2 + ], + [ + 313, + 235, + 4 + ], + [ + 364, + 402, + 2 + ], + [ + 332, + 190, + 2 + ], + [ + 583, + 217, + 2 + ], + [ + 327, + 188, + 2 + ], + [ + 465, + 330, + 1 + ], + [ + 1038, + 1038, + 1 + ], + [ + 1082, + 1082, + 4 + ], + [ + 202, + 436, + 2 + ], + [ + 464, + 464, + 1 + ], + [ + 666, + 666, + 2 + ], + [ + 1098, + 397, + 2 + ], + [ + 256, + 273, + 2 + ], + [ + 268, + 216, + 2 + ], + [ + 1088, + 275, + 4 + ], + [ + 1083, + 260, + 5 + ], + [ + 269, + 312, + 2 + ], + [ + 291, + 291, + 3 + ], + [ + 1024, + 348, + 4 + ], + [ + 1224, + 200, + 1 + ], + [ + 1100, + 1100, + 2 + ], + [ + 1024, + 1055, + 4 + ], + [ + 972, + 972, + 1 + ], + [ + 620, + 480, + 2 + ], + [ + 381, + 381, + 4 + ], + [ + 248, + 254, + 2 + ], + [ + 1028, + 1130, + 3 + ], + [ + 532, + 532, + 3 + ], + [ + 1196, + 301, + 4 + ], + [ + 722, + 827, + 1 + ], + [ + 318, + 266, + 1 + ], + [ + 543, + 543, + 1 + ], + [ + 791, + 791, + 2 + ], + [ + 294, + 281, + 2 + ], + [ + 468, + 468, + 4 + ], + [ + 374, + 374, + 4 + ], + [ + 264, + 428, + 1 + ], + [ + 190, + 479, + 2 + ], + [ + 26, + 25, + 1 + ], + [ + 1075, + 312, + 4 + ], + [ + 473, + 473, + 4 + ], + [ + 1025, + 196, + 4 + ], + [ + 735, + 735, + 2 + ], + [ + 1052, + 379, + 2 + ], + [ + 544, + 544, + 3 + ], + [ + 210, + 241, + 2 + ], + [ + 404, + 334, + 2 + ], + [ + 1049, + 352, + 4 + ], + [ + 356, + 356, + 4 + ], + [ + 1031, + 1029, + 1 + ], + [ + 1243, + 1027, + 1 + ], + [ + 472, + 472, + 3 + ], + [ + 276, + 201, + 2 + ], + [ + 248, + 439, + 2 + ], + [ + 110, + 111, + 1 + ], + [ + 1028, + 1146, + 1 + ], + [ + 1211, + 309, + 4 + ], + [ + 227, + 321, + 1 + ], + [ + 345, + 345, + 3 + ], + [ + 390, + 577, + 2 + ], + [ + 1024, + 405, + 4 + ], + [ + 506, + 506, + 3 + ], + [ + 380, + 380, + 4 + ], + [ + 511, + 511, + 3 + ], + [ + 304, + 229, + 4 + ], + [ + 1232, + 234, + 4 + ], + [ + 202, + 316, + 2 + ], + [ + 230, + 307, + 4 + ], + [ + 904, + 904, + 2 + ], + [ + 1120, + 235, + 6 + ], + [ + 70, + 70, + 3 + ], + [ + 889, + 889, + 1 + ], + [ + 1030, + 1168, + 1 + ], + [ + 887, + 887, + 2 + ], + [ + 1024, + 347, + 4 + ], + [ + 329, + 514, + 2 + ], + [ + 1041, + 174, + 2 + ], + [ + 1040, + 214, + 6 + ], + [ + 164, + 164, + 2 + ], + [ + 222, + 222, + 3 + ], + [ + 440, + 440, + 3 + ], + [ + 267, + 1080, + 2 + ], + [ + 1382, + 478, + 2 + ], + [ + 554, + 554, + 3 + ], + [ + 559, + 559, + 4 + ], + [ + 1041, + 332, + 2 + ], + [ + 407, + 407, + 1 + ], + [ + 810, + 810, + 2 + ], + [ + 1059, + 1059, + 4 + ], + [ + 527, + 527, + 4 + ], + [ + 193, + 176, + 4 + ], + [ + 692, + 692, + 2 + ], + [ + 336, + 478, + 1 + ], + [ + 155, + 155, + 2 + ], + [ + 1028, + 1129, + 3 + ], + [ + 242, + 315, + 1 + ], + [ + 822, + 822, + 2 + ], + [ + 1024, + 359, + 4 + ], + [ + 1106, + 66, + 2 + ], + [ + 1308, + 454, + 2 + ], + [ + 69, + 68, + 1 + ], + [ + 463, + 241, + 2 + ], + [ + 188, + 423, + 2 + ], + [ + 243, + 300, + 2 + ], + [ + 272, + 1091, + 2 + ], + [ + 196, + 250, + 2 + ], + [ + 361, + 253, + 2 + ], + [ + 1036, + 1044, + 4 + ], + [ + 1219, + 1028, + 1 + ], + [ + 1041, + 1278, + 2 + ], + [ + 1195, + 347, + 4 + ], + [ + 176, + 190, + 2 + ], + [ + 805, + 805, + 1 + ], + [ + 1002, + 1002, + 1 + ], + [ + 461, + 461, + 1 + ], + [ + 1179, + 1028, + 1 + ], + [ + 289, + 436, + 2 + ], + [ + 474, + 296, + 2 + ], + [ + 320, + 234, + 4 + ], + [ + 1027, + 350, + 1 + ], + [ + 1045, + 1029, + 1 + ], + [ + 1077, + 68, + 2 + ], + [ + 1028, + 1092, + 1 + ], + [ + 1103, + 1103, + 2 + ], + [ + 202, + 317, + 2 + ], + [ + 272, + 216, + 2 + ], + [ + 195, + 226, + 2 + ], + [ + 256, + 312, + 2 + ], + [ + 260, + 277, + 2 + ], + [ + 487, + 487, + 1 + ], + [ + 1074, + 252, + 1 + ], + [ + 341, + 341, + 5 + ], + [ + 1028, + 1132, + 3 + ], + [ + 1028, + 1169, + 1 + ], + [ + 420, + 420, + 2 + ], + [ + 251, + 273, + 2 + ], + [ + 403, + 294, + 2 + ], + [ + 516, + 325, + 2 + ], + [ + 802, + 802, + 2 + ], + [ + 471, + 241, + 2 + ], + [ + 284, + 281, + 2 + ], + [ + 229, + 301, + 4 + ], + [ + 589, + 589, + 1 + ], + [ + 299, + 512, + 2 + ], + [ + 188, + 1110, + 2 + ], + [ + 288, + 432, + 2 + ], + [ + 339, + 333, + 2 + ], + [ + 483, + 258, + 2 + ], + [ + 1228, + 338, + 4 + ], + [ + 529, + 529, + 4 + ], + [ + 20, + 19, + 1 + ], + [ + 371, + 475, + 2 + ], + [ + 305, + 305, + 3 + ], + [ + 1088, + 281, + 4 + ], + [ + 584, + 422, + 1 + ], + [ + 726, + 726, + 2 + ], + [ + 1291, + 316, + 4 + ], + [ + 283, + 378, + 1 + ], + [ + 598, + 550, + 2 + ], + [ + 64, + 63, + 2 + ], + [ + 216, + 217, + 2 + ], + [ + 343, + 280, + 3 + ], + [ + 560, + 560, + 3 + ], + [ + 1025, + 1028, + 1 + ], + [ + 1058, + 1058, + 3 + ], + [ + 447, + 193, + 2 + ], + [ + 601, + 601, + 1 + ], + [ + 306, + 306, + 3 + ], + [ + 470, + 253, + 2 + ], + [ + 1139, + 1139, + 2 + ], + [ + 312, + 256, + 2 + ], + [ + 482, + 294, + 2 + ], + [ + 264, + 503, + 2 + ], + [ + 481, + 481, + 3 + ], + [ + 220, + 220, + 1 + ], + [ + 235, + 230, + 3 + ], + [ + 282, + 282, + 3 + ], + [ + 465, + 319, + 1 + ], + [ + 1134, + 259, + 2 + ], + [ + 1028, + 1091, + 1 + ], + [ + 1260, + 428, + 4 + ], + [ + 240, + 332, + 3 + ], + [ + 300, + 398, + 1 + ], + [ + 1105, + 326, + 1 + ], + [ + 467, + 467, + 4 + ], + [ + 1031, + 289, + 1 + ], + [ + 1460, + 109, + 2 + ], + [ + 216, + 272, + 2 + ], + [ + 996, + 996, + 1 + ], + [ + 174, + 176, + 5 + ], + [ + 307, + 307, + 6 + ], + [ + 446, + 323, + 2 + ], + [ + 322, + 534, + 2 + ], + [ + 201, + 255, + 2 + ], + [ + 1027, + 1063, + 5 + ], + [ + 231, + 310, + 2 + ], + [ + 535, + 646, + 2 + ], + [ + 205, + 232, + 2 + ], + [ + 231, + 330, + 2 + ], + [ + 279, + 257, + 2 + ], + [ + 295, + 370, + 2 + ], + [ + 736, + 736, + 2 + ], + [ + 1088, + 294, + 4 + ], + [ + 706, + 706, + 2 + ], + [ + 252, + 210, + 1 + ], + [ + 772, + 772, + 1 + ], + [ + 298, + 298, + 3 + ], + [ + 1084, + 1028, + 1 + ], + [ + 190, + 562, + 2 + ], + [ + 277, + 260, + 2 + ], + [ + 546, + 546, + 4 + ], + [ + 778, + 778, + 2 + ], + [ + 524, + 346, + 2 + ], + [ + 647, + 478, + 1 + ], + [ + 214, + 542, + 2 + ], + [ + 269, + 314, + 2 + ], + [ + 284, + 275, + 2 + ], + [ + 1028, + 1173, + 1 + ], + [ + 477, + 477, + 4 + ], + [ + 569, + 569, + 1 + ], + [ + 409, + 296, + 2 + ], + [ + 1028, + 1084, + 1 + ], + [ + 191, + 191, + 1 + ], + [ + 1024, + 327, + 4 + ], + [ + 318, + 234, + 4 + ], + [ + 349, + 1029, + 2 + ], + [ + 515, + 515, + 3 + ], + [ + 379, + 314, + 2 + ], + [ + 604, + 604, + 1 + ], + [ + 250, + 347, + 2 + ], + [ + 357, + 357, + 1 + ], + [ + 196, + 216, + 2 + ], + [ + 416, + 285, + 1 + ], + [ + 1226, + 1028, + 1 + ], + [ + 235, + 229, + 2 + ], + [ + 269, + 272, + 2 + ], + [ + 509, + 509, + 3 + ], + [ + 1267, + 398, + 1 + ], + [ + 1092, + 1028, + 1 + ], + [ + 188, + 439, + 2 + ], + [ + 196, + 257, + 2 + ], + [ + 786, + 786, + 2 + ], + [ + 1036, + 325, + 4 + ], + [ + 377, + 377, + 4 + ], + [ + 463, + 317, + 2 + ], + [ + 349, + 352, + 2 + ], + [ + 173, + 173, + 2 + ], + [ + 555, + 555, + 3 + ], + [ + 242, + 321, + 1 + ], + [ + 62, + 843, + 1 + ], + [ + 243, + 331, + 2 + ], + [ + 228, + 228, + 6 + ], + [ + 423, + 254, + 2 + ], + [ + 466, + 100, + 1 + ], + [ + 225, + 315, + 1 + ], + [ + 399, + 794, + 2 + ], + [ + 266, + 324, + 1 + ], + [ + 355, + 253, + 2 + ], + [ + 320, + 320, + 6 + ], + [ + 1033, + 1033, + 3 + ], + [ + 315, + 225, + 2 + ], + [ + 866, + 866, + 2 + ], + [ + 275, + 284, + 2 + ], + [ + 326, + 1312, + 1 + ], + [ + 24, + 25, + 1 + ], + [ + 1088, + 260, + 4 + ], + [ + 264, + 498, + 2 + ], + [ + 1112, + 1031, + 1 + ], + [ + 406, + 406, + 4 + ], + [ + 392, + 71, + 2 + ], + [ + 204, + 204, + 4 + ], + [ + 1343, + 410, + 1 + ], + [ + 588, + 430, + 1 + ], + [ + 239, + 1141, + 1 + ], + [ + 806, + 806, + 2 + ], + [ + 275, + 296, + 2 + ], + [ + 177, + 177, + 2 + ], + [ + 785, + 785, + 2 + ], + [ + 1024, + 328, + 4 + ], + [ + 1088, + 296, + 4 + ], + [ + 611, + 611, + 1 + ], + [ + 484, + 484, + 4 + ], + [ + 214, + 558, + 2 + ], + [ + 329, + 536, + 2 + ], + [ + 322, + 547, + 2 + ], + [ + 235, + 313, + 4 + ], + [ + 211, + 211, + 2 + ], + [ + 1206, + 343, + 4 + ], + [ + 266, + 318, + 1 + ], + [ + 1361, + 185, + 1 + ], + [ + 1045, + 1045, + 1 + ], + [ + 362, + 362, + 1 + ], + [ + 244, + 308, + 2 + ], + [ + 251, + 272, + 2 + ], + [ + 360, + 385, + 3 + ], + [ + 286, + 286, + 4 + ], + [ + 1028, + 190, + 5 + ], + [ + 421, + 246, + 2 + ], + [ + 1027, + 1072, + 3 + ], + [ + 1175, + 323, + 4 + ], + [ + 1290, + 410, + 2 + ], + [ + 1041, + 176, + 2 + ], + [ + 537, + 402, + 2 + ], + [ + 525, + 525, + 2 + ], + [ + 885, + 885, + 2 + ], + [ + 570, + 73, + 1 + ], + [ + 413, + 309, + 1 + ], + [ + 1088, + 280, + 4 + ], + [ + 14, + 15, + 1 + ], + [ + 1031, + 249, + 1 + ], + [ + 1026, + 1026, + 1 + ], + [ + 280, + 296, + 2 + ], + [ + 1040, + 246, + 6 + ], + [ + 304, + 304, + 6 + ], + [ + 1088, + 277, + 4 + ], + [ + 609, + 609, + 3 + ], + [ + 202, + 342, + 2 + ], + [ + 383, + 383, + 1 + ], + [ + 395, + 395, + 4 + ], + [ + 424, + 246, + 2 + ], + [ + 519, + 519, + 3 + ], + [ + 389, + 230, + 2 + ], + [ + 241, + 210, + 2 + ], + [ + 267, + 214, + 2 + ], + [ + 268, + 250, + 2 + ], + [ + 332, + 1096, + 2 + ], + [ + 138, + 139, + 1 + ], + [ + 1091, + 1028, + 1 + ], + [ + 528, + 396, + 2 + ], + [ + 1031, + 1112, + 3 + ], + [ + 259, + 459, + 2 + ], + [ + 105, + 104, + 1 + ], + [ + 902, + 902, + 2 + ], + [ + 297, + 297, + 4 + ], + [ + 1052, + 388, + 2 + ], + [ + 448, + 448, + 1 + ], + [ + 293, + 293, + 3 + ], + [ + 479, + 479, + 4 + ], + [ + 64, + 64, + 3 + ], + [ + 314, + 269, + 2 + ], + [ + 236, + 236, + 6 + ], + [ + 257, + 196, + 2 + ], + [ + 314, + 379, + 2 + ], + [ + 201, + 201, + 6 + ], + [ + 284, + 425, + 2 + ], + [ + 388, + 312, + 2 + ], + [ + 329, + 646, + 2 + ], + [ + 528, + 339, + 2 + ], + [ + 1154, + 283, + 1 + ], + [ + 968, + 968, + 2 + ], + [ + 1031, + 1220, + 1 + ], + [ + 275, + 294, + 2 + ], + [ + 376, + 436, + 2 + ], + [ + 1088, + 284, + 4 + ], + [ + 287, + 287, + 4 + ], + [ + 193, + 443, + 2 + ], + [ + 386, + 386, + 3 + ], + [ + 648, + 217, + 2 + ], + [ + 1039, + 359, + 4 + ], + [ + 216, + 285, + 1 + ], + [ + 557, + 557, + 4 + ], + [ + 271, + 271, + 6 + ], + [ + 580, + 580, + 3 + ], + [ + 1079, + 1027, + 1 + ], + [ + 476, + 476, + 1 + ], + [ + 1125, + 234, + 6 + ], + [ + 331, + 418, + 1 + ], + [ + 1035, + 370, + 6 + ], + [ + 1052, + 401, + 2 + ], + [ + 1035, + 174, + 6 + ], + [ + 433, + 310, + 1 + ], + [ + 1148, + 72, + 2 + ], + [ + 326, + 315, + 1 + ], + [ + 526, + 63, + 1 + ], + [ + 537, + 339, + 2 + ], + [ + 1015, + 1015, + 1 + ], + [ + 194, + 212, + 1 + ], + [ + 511, + 348, + 2 + ], + [ + 99, + 737, + 1 + ], + [ + 592, + 592, + 1 + ], + [ + 1140, + 1140, + 4 + ], + [ + 273, + 1092, + 2 + ], + [ + 364, + 364, + 4 + ], + [ + 280, + 294, + 2 + ], + [ + 257, + 255, + 2 + ], + [ + 308, + 422, + 1 + ], + [ + 244, + 309, + 1 + ], + [ + 530, + 530, + 3 + ], + [ + 301, + 229, + 4 + ], + [ + 517, + 517, + 4 + ], + [ + 202, + 340, + 2 + ], + [ + 190, + 456, + 2 + ], + [ + 1193, + 288, + 4 + ], + [ + 449, + 256, + 2 + ], + [ + 1035, + 176, + 6 + ], + [ + 567, + 567, + 3 + ], + [ + 101, + 100, + 1 + ], + [ + 264, + 512, + 2 + ], + [ + 1051, + 1051, + 3 + ], + [ + 1213, + 270, + 4 + ], + [ + 405, + 265, + 2 + ], + [ + 882, + 882, + 2 + ], + [ + 578, + 347, + 2 + ], + [ + 1025, + 351, + 4 + ], + [ + 235, + 324, + 4 + ], + [ + 655, + 217, + 2 + ], + [ + 261, + 393, + 2 + ], + [ + 507, + 248, + 2 + ], + [ + 1632, + 108, + 2 + ], + [ + 1044, + 254, + 4 + ], + [ + 245, + 381, + 2 + ], + [ + 1136, + 1136, + 2 + ], + [ + 344, + 344, + 5 + ], + [ + 561, + 398, + 1 + ], + [ + 349, + 249, + 2 + ], + [ + 452, + 451, + 1 + ], + [ + 272, + 269, + 2 + ], + [ + 281, + 284, + 2 + ], + [ + 626, + 626, + 3 + ], + [ + 804, + 804, + 2 + ], + [ + 1204, + 334, + 4 + ], + [ + 1158, + 1158, + 4 + ], + [ + 963, + 963, + 2 + ], + [ + 1058, + 254, + 4 + ], + [ + 193, + 234, + 2 + ], + [ + 299, + 230, + 4 + ], + [ + 533, + 533, + 4 + ], + [ + 770, + 770, + 2 + ], + [ + 281, + 294, + 2 + ], + [ + 352, + 255, + 2 + ], + [ + 267, + 375, + 2 + ], + [ + 593, + 497, + 2 + ], + [ + 312, + 269, + 2 + ], + [ + 258, + 374, + 2 + ], + [ + 279, + 216, + 2 + ], + [ + 840, + 840, + 2 + ], + [ + 875, + 875, + 2 + ], + [ + 242, + 199, + 2 + ], + [ + 307, + 230, + 4 + ], + [ + 416, + 579, + 1 + ], + [ + 749, + 749, + 2 + ], + [ + 624, + 289, + 2 + ], + [ + 1027, + 345, + 5 + ], + [ + 1027, + 1126, + 3 + ], + [ + 229, + 229, + 1 + ], + [ + 1617, + 1617, + 2 + ], + [ + 393, + 261, + 2 + ], + [ + 1384, + 181, + 2 + ], + [ + 208, + 208, + 1 + ], + [ + 338, + 547, + 2 + ], + [ + 368, + 368, + 3 + ], + [ + 242, + 1093, + 1 + ], + [ + 1231, + 300, + 4 + ], + [ + 485, + 485, + 1 + ], + [ + 280, + 1038, + 2 + ], + [ + 237, + 69, + 1 + ], + [ + 552, + 256, + 2 + ], + [ + 562, + 562, + 2 + ], + [ + 317, + 210, + 2 + ], + [ + 318, + 301, + 1 + ], + [ + 213, + 213, + 3 + ], + [ + 416, + 579, + 2 + ], + [ + 308, + 440, + 1 + ], + [ + 1026, + 360, + 4 + ], + [ + 201, + 276, + 2 + ], + [ + 1123, + 410, + 2 + ], + [ + 683, + 683, + 2 + ], + [ + 848, + 848, + 2 + ], + [ + 384, + 384, + 4 + ], + [ + 405, + 701, + 2 + ], + [ + 214, + 345, + 2 + ], + [ + 654, + 654, + 2 + ], + [ + 483, + 288, + 2 + ], + [ + 205, + 232, + 1 + ], + [ + 331, + 419, + 1 + ], + [ + 439, + 254, + 2 + ], + [ + 1170, + 260, + 4 + ], + [ + 190, + 341, + 2 + ], + [ + 675, + 375, + 2 + ], + [ + 838, + 838, + 2 + ], + [ + 68, + 68, + 3 + ], + [ + 333, + 288, + 2 + ], + [ + 475, + 662, + 2 + ], + [ + 98, + 98, + 1 + ], + [ + 1027, + 350, + 5 + ], + [ + 565, + 565, + 3 + ], + [ + 469, + 354, + 2 + ], + [ + 245, + 387, + 2 + ], + [ + 1028, + 1092, + 5 + ], + [ + 1244, + 66, + 2 + ], + [ + 1141, + 319, + 1 + ], + [ + 1124, + 1124, + 2 + ], + [ + 281, + 1118, + 2 + ], + [ + 249, + 571, + 2 + ], + [ + 330, + 465, + 1 + ], + [ + 502, + 502, + 3 + ], + [ + 508, + 390, + 1 + ], + [ + 872, + 872, + 2 + ], + [ + 480, + 399, + 2 + ], + [ + 722, + 137, + 1 + ], + [ + 400, + 277, + 2 + ], + [ + 470, + 470, + 1 + ], + [ + 474, + 474, + 4 + ], + [ + 1036, + 1073, + 4 + ], + [ + 1042, + 222, + 2 + ], + [ + 1027, + 1072, + 5 + ], + [ + 338, + 261, + 2 + ], + [ + 553, + 262, + 2 + ], + [ + 217, + 322, + 1 + ], + [ + 201, + 253, + 2 + ], + [ + 303, + 303, + 2 + ], + [ + 513, + 247, + 2 + ], + [ + 597, + 410, + 1 + ], + [ + 1027, + 1063, + 1 + ], + [ + 201, + 196, + 2 + ], + [ + 445, + 445, + 5 + ], + [ + 307, + 324, + 1 + ], + [ + 193, + 482, + 2 + ], + [ + 1046, + 246, + 4 + ], + [ + 326, + 321, + 1 + ], + [ + 251, + 314, + 2 + ], + [ + 890, + 634, + 1 + ], + [ + 182, + 218, + 1 + ], + [ + 1028, + 379, + 5 + ], + [ + 575, + 575, + 4 + ], + [ + 1052, + 414, + 2 + ], + [ + 230, + 1099, + 3 + ], + [ + 1031, + 289, + 3 + ], + [ + 309, + 244, + 1 + ], + [ + 190, + 523, + 2 + ], + [ + 336, + 440, + 1 + ], + [ + 300, + 418, + 1 + ], + [ + 842, + 842, + 2 + ], + [ + 296, + 280, + 2 + ], + [ + 578, + 246, + 2 + ], + [ + 372, + 343, + 3 + ], + [ + 1029, + 653, + 4 + ], + [ + 271, + 334, + 2 + ], + [ + 490, + 262, + 2 + ], + [ + 207, + 207, + 3 + ], + [ + 234, + 391, + 3 + ], + [ + 637, + 884, + 1 + ], + [ + 561, + 418, + 1 + ], + [ + 450, + 294, + 2 + ], + [ + 240, + 354, + 2 + ], + [ + 210, + 316, + 2 + ], + [ + 260, + 284, + 2 + ], + [ + 245, + 196, + 2 + ], + [ + 437, + 250, + 2 + ], + [ + 1030, + 1187, + 1 + ], + [ + 767, + 767, + 2 + ], + [ + 823, + 823, + 2 + ], + [ + 201, + 273, + 2 + ], + [ + 314, + 256, + 2 + ], + [ + 359, + 267, + 2 + ], + [ + 549, + 247, + 2 + ], + [ + 348, + 188, + 2 + ], + [ + 873, + 873, + 2 + ], + [ + 363, + 268, + 2 + ], + [ + 1055, + 1055, + 3 + ], + [ + 63, + 61, + 1 + ], + [ + 1199, + 330, + 4 + ], + [ + 776, + 776, + 2 + ], + [ + 200, + 239, + 2 + ], + [ + 433, + 310, + 2 + ], + [ + 1403, + 286, + 4 + ], + [ + 234, + 229, + 3 + ], + [ + 301, + 318, + 1 + ], + [ + 313, + 313, + 7 + ], + [ + 284, + 260, + 2 + ], + [ + 1029, + 651, + 4 + ], + [ + 1288, + 1027, + 1 + ], + [ + 219, + 228, + 2 + ], + [ + 538, + 266, + 2 + ], + [ + 1096, + 1096, + 4 + ], + [ + 195, + 226, + 1 + ], + [ + 205, + 205, + 3 + ], + [ + 353, + 353, + 6 + ], + [ + 258, + 364, + 2 + ], + [ + 828, + 828, + 2 + ], + [ + 585, + 422, + 1 + ], + [ + 607, + 607, + 2 + ], + [ + 652, + 652, + 3 + ], + [ + 1182, + 237, + 4 + ], + [ + 1030, + 1188, + 1 + ], + [ + 397, + 397, + 3 + ], + [ + 295, + 1025, + 2 + ], + [ + 1028, + 1084, + 5 + ], + [ + 404, + 514, + 2 + ], + [ + 361, + 361, + 4 + ], + [ + 471, + 316, + 2 + ], + [ + 535, + 535, + 3 + ], + [ + 265, + 1044, + 2 + ], + [ + 339, + 510, + 2 + ], + [ + 1177, + 285, + 4 + ], + [ + 261, + 338, + 2 + ], + [ + 863, + 863, + 2 + ], + [ + 488, + 488, + 2 + ], + [ + 321, + 227, + 2 + ], + [ + 499, + 499, + 4 + ], + [ + 312, + 251, + 2 + ], + [ + 462, + 260, + 2 + ], + [ + 62, + 378, + 1 + ], + [ + 1038, + 174, + 6 + ], + [ + 847, + 847, + 2 + ], + [ + 455, + 296, + 2 + ], + [ + 1113, + 1113, + 4 + ], + [ + 217, + 188, + 1 + ], + [ + 1207, + 327, + 4 + ], + [ + 242, + 315, + 2 + ], + [ + 511, + 325, + 2 + ], + [ + 1218, + 275, + 7 + ], + [ + 240, + 394, + 2 + ], + [ + 324, + 235, + 4 + ], + [ + 631, + 289, + 2 + ], + [ + 1028, + 1091, + 5 + ], + [ + 74, + 1740, + 1 + ], + [ + 650, + 650, + 2 + ], + [ + 466, + 444, + 1 + ], + [ + 1040, + 254, + 6 + ], + [ + 279, + 429, + 2 + ], + [ + 640, + 640, + 3 + ], + [ + 2060, + 182, + 1 + ], + [ + 225, + 225, + 4 + ], + [ + 269, + 273, + 1 + ], + [ + 614, + 214, + 2 + ], + [ + 1027, + 1072, + 1 + ], + [ + 198, + 243, + 1 + ], + [ + 564, + 564, + 3 + ], + [ + 453, + 251, + 2 + ], + [ + 617, + 289, + 2 + ], + [ + 561, + 788, + 1 + ], + [ + 190, + 525, + 2 + ], + [ + 306, + 306, + 1 + ], + [ + 1097, + 1027, + 1 + ], + [ + 1169, + 1028, + 1 + ], + [ + 302, + 302, + 4 + ], + [ + 582, + 419, + 1 + ], + [ + 188, + 254, + 1 + ], + [ + 294, + 280, + 2 + ], + [ + 496, + 236, + 2 + ], + [ + 256, + 449, + 2 + ], + [ + 491, + 491, + 4 + ], + [ + 279, + 362, + 2 + ], + [ + 1028, + 1092, + 3 + ], + [ + 1331, + 430, + 1 + ], + [ + 309, + 244, + 2 + ], + [ + 674, + 674, + 2 + ], + [ + 63, + 64, + 2 + ], + [ + 964, + 964, + 2 + ], + [ + 1040, + 247, + 6 + ], + [ + 1027, + 1080, + 3 + ], + [ + 1121, + 1264, + 2 + ], + [ + 310, + 419, + 1 + ], + [ + 1028, + 1091, + 3 + ], + [ + 443, + 443, + 5 + ], + [ + 1031, + 349, + 1 + ], + [ + 193, + 460, + 2 + ], + [ + 270, + 270, + 6 + ], + [ + 1054, + 217, + 4 + ], + [ + 1045, + 539, + 6 + ], + [ + 251, + 453, + 2 + ], + [ + 197, + 223, + 2 + ], + [ + 1028, + 1169, + 3 + ], + [ + 235, + 1120, + 2 + ], + [ + 372, + 260, + 2 + ], + [ + 196, + 245, + 2 + ], + [ + 229, + 1102, + 3 + ], + [ + 20, + 21, + 1 + ], + [ + 1056, + 1056, + 3 + ], + [ + 296, + 281, + 2 + ], + [ + 176, + 174, + 5 + ], + [ + 1282, + 1282, + 2 + ], + [ + 63, + 1116, + 1 + ], + [ + 256, + 314, + 2 + ], + [ + 638, + 638, + 2 + ], + [ + 312, + 388, + 2 + ], + [ + 1028, + 379, + 3 + ], + [ + 1057, + 246, + 4 + ], + [ + 1252, + 275, + 6 + ], + [ + 486, + 252, + 2 + ], + [ + 323, + 226, + 2 + ], + [ + 265, + 247, + 2 + ], + [ + 273, + 269, + 1 + ], + [ + 492, + 252, + 2 + ], + [ + 234, + 318, + 4 + ], + [ + 1109, + 1109, + 4 + ], + [ + 764, + 764, + 2 + ], + [ + 494, + 494, + 2 + ], + [ + 241, + 210, + 1 + ], + [ + 1031, + 1354, + 1 + ], + [ + 190, + 344, + 2 + ], + [ + 190, + 567, + 2 + ], + [ + 573, + 248, + 2 + ], + [ + 637, + 410, + 1 + ], + [ + 955, + 955, + 2 + ], + [ + 194, + 194, + 3 + ], + [ + 647, + 892, + 1 + ], + [ + 214, + 350, + 2 + ], + [ + 275, + 1150, + 2 + ], + [ + 351, + 351, + 6 + ], + [ + 361, + 396, + 2 + ], + [ + 268, + 363, + 2 + ], + [ + 261, + 356, + 2 + ], + [ + 209, + 209, + 1 + ], + [ + 230, + 235, + 3 + ], + [ + 265, + 248, + 2 + ], + [ + 333, + 577, + 2 + ], + [ + 970, + 970, + 2 + ], + [ + 245, + 358, + 2 + ], + [ + 1042, + 277, + 6 + ], + [ + 301, + 301, + 6 + ], + [ + 1041, + 272, + 6 + ], + [ + 1028, + 1173, + 3 + ], + [ + 599, + 599, + 3 + ], + [ + 214, + 201, + 2 + ], + [ + 1262, + 1047, + 4 + ], + [ + 1031, + 1112, + 1 + ], + [ + 174, + 1378, + 2 + ], + [ + 69, + 237, + 1 + ], + [ + 702, + 166, + 2 + ], + [ + 373, + 526, + 2 + ], + [ + 294, + 277, + 2 + ], + [ + 190, + 560, + 2 + ], + [ + 380, + 380, + 1 + ], + [ + 694, + 694, + 2 + ], + [ + 432, + 288, + 1 + ], + [ + 643, + 643, + 2 + ], + [ + 343, + 193, + 2 + ], + [ + 268, + 497, + 2 + ], + [ + 636, + 418, + 1 + ], + [ + 859, + 859, + 2 + ], + [ + 1028, + 1084, + 3 + ], + [ + 227, + 227, + 4 + ], + [ + 76, + 77, + 1 + ], + [ + 711, + 711, + 2 + ], + [ + 988, + 988, + 2 + ], + [ + 324, + 307, + 1 + ], + [ + 275, + 385, + 2 + ], + [ + 334, + 334, + 4 + ], + [ + 1422, + 287, + 4 + ], + [ + 503, + 503, + 3 + ], + [ + 271, + 383, + 2 + ], + [ + 1152, + 267, + 7 + ], + [ + 1173, + 1028, + 1 + ], + [ + 71, + 73, + 1 + ], + [ + 390, + 508, + 1 + ], + [ + 1222, + 328, + 4 + ], + [ + 1033, + 369, + 6 + ], + [ + 235, + 313, + 2 + ], + [ + 584, + 440, + 1 + ], + [ + 273, + 201, + 2 + ], + [ + 541, + 541, + 4 + ], + [ + 30, + 30, + 1 + ], + [ + 241, + 399, + 2 + ], + [ + 373, + 687, + 2 + ], + [ + 1248, + 360, + 4 + ], + [ + 1338, + 422, + 1 + ], + [ + 206, + 206, + 3 + ], + [ + 780, + 780, + 2 + ], + [ + 326, + 1093, + 2 + ], + [ + 407, + 371, + 1 + ], + [ + 524, + 524, + 1 + ], + [ + 383, + 271, + 2 + ], + [ + 469, + 1049, + 2 + ], + [ + 330, + 465, + 2 + ], + [ + 472, + 276, + 2 + ], + [ + 392, + 305, + 1 + ], + [ + 1030, + 1203, + 1 + ], + [ + 241, + 412, + 2 + ], + [ + 493, + 493, + 3 + ], + [ + 586, + 398, + 1 + ], + [ + 72, + 1007, + 1 + ], + [ + 243, + 310, + 2 + ], + [ + 317, + 317, + 5 + ], + [ + 382, + 504, + 2 + ], + [ + 323, + 319, + 1 + ], + [ + 1033, + 259, + 6 + ], + [ + 241, + 367, + 2 + ], + [ + 495, + 358, + 2 + ], + [ + 1146, + 1028, + 1 + ], + [ + 253, + 253, + 7 + ], + [ + 1348, + 444, + 1 + ], + [ + 309, + 413, + 1 + ], + [ + 195, + 225, + 2 + ], + [ + 602, + 327, + 2 + ], + [ + 1707, + 103, + 2 + ], + [ + 755, + 755, + 2 + ], + [ + 318, + 500, + 2 + ], + [ + 758, + 758, + 2 + ], + [ + 434, + 434, + 4 + ], + [ + 490, + 347, + 2 + ], + [ + 387, + 387, + 4 + ], + [ + 275, + 277, + 2 + ], + [ + 1028, + 1146, + 3 + ], + [ + 174, + 260, + 2 + ], + [ + 741, + 437, + 2 + ], + [ + 1025, + 190, + 1 + ], + [ + 1061, + 269, + 4 + ], + [ + 68, + 212, + 2 + ], + [ + 185, + 185, + 3 + ], + [ + 188, + 265, + 1 + ], + [ + 240, + 240, + 6 + ], + [ + 258, + 258, + 6 + ], + [ + 700, + 700, + 3 + ], + [ + 1038, + 1026, + 1 + ], + [ + 1027, + 365, + 5 + ], + [ + 280, + 1161, + 2 + ], + [ + 569, + 61, + 1 + ], + [ + 196, + 367, + 2 + ], + [ + 487, + 329, + 2 + ], + [ + 1040, + 248, + 6 + ], + [ + 284, + 425, + 3 + ], + [ + 1036, + 328, + 4 + ], + [ + 598, + 259, + 2 + ], + [ + 1162, + 1162, + 4 + ], + [ + 339, + 214, + 2 + ], + [ + 381, + 245, + 2 + ], + [ + 264, + 313, + 1 + ], + [ + 309, + 430, + 1 + ], + [ + 543, + 608, + 2 + ], + [ + 370, + 295, + 2 + ], + [ + 264, + 519, + 2 + ], + [ + 1030, + 193, + 5 + ], + [ + 255, + 255, + 5 + ], + [ + 701, + 701, + 2 + ], + [ + 421, + 404, + 2 + ], + [ + 1027, + 366, + 5 + ], + [ + 1168, + 1030, + 1 + ], + [ + 257, + 349, + 2 + ], + [ + 639, + 639, + 2 + ], + [ + 1041, + 269, + 6 + ], + [ + 324, + 266, + 1 + ], + [ + 574, + 574, + 3 + ], + [ + 1045, + 545, + 6 + ], + [ + 1266, + 1048, + 4 + ], + [ + 320, + 519, + 2 + ], + [ + 1249, + 199, + 1 + ], + [ + 1042, + 260, + 6 + ], + [ + 229, + 234, + 3 + ], + [ + 362, + 1039, + 2 + ], + [ + 475, + 475, + 3 + ], + [ + 66, + 66, + 3 + ], + [ + 262, + 322, + 2 + ], + [ + 246, + 1033, + 2 + ], + [ + 1030, + 409, + 1 + ], + [ + 244, + 308, + 1 + ], + [ + 512, + 512, + 3 + ], + [ + 439, + 402, + 2 + ], + [ + 219, + 228, + 3 + ], + [ + 210, + 342, + 2 + ], + [ + 401, + 251, + 2 + ], + [ + 290, + 290, + 1 + ], + [ + 389, + 235, + 3 + ], + [ + 352, + 202, + 2 + ], + [ + 1030, + 447, + 1 + ], + [ + 58, + 57, + 1 + ], + [ + 1035, + 332, + 6 + ], + [ + 394, + 394, + 4 + ], + [ + 423, + 396, + 2 + ], + [ + 623, + 214, + 2 + ], + [ + 283, + 1154, + 1 + ], + [ + 627, + 289, + 2 + ], + [ + 582, + 433, + 1 + ], + [ + 1024, + 196, + 4 + ], + [ + 1041, + 251, + 6 + ], + [ + 230, + 230, + 1 + ], + [ + 463, + 293, + 2 + ], + [ + 591, + 249, + 2 + ], + [ + 375, + 201, + 2 + ], + [ + 472, + 288, + 2 + ], + [ + 1298, + 413, + 1 + ], + [ + 1365, + 436, + 4 + ], + [ + 217, + 267, + 2 + ], + [ + 280, + 284, + 2 + ], + [ + 518, + 236, + 2 + ], + [ + 225, + 195, + 1 + ], + [ + 162, + 732, + 2 + ], + [ + 505, + 505, + 3 + ], + [ + 175, + 175, + 7 + ], + [ + 320, + 234, + 2 + ], + [ + 1052, + 426, + 2 + ], + [ + 246, + 267, + 2 + ], + [ + 417, + 536, + 2 + ], + [ + 417, + 424, + 2 + ], + [ + 1062, + 295, + 4 + ], + [ + 664, + 664, + 2 + ], + [ + 550, + 671, + 2 + ], + [ + 340, + 340, + 6 + ], + [ + 193, + 474, + 2 + ], + [ + 1042, + 281, + 6 + ], + [ + 271, + 461, + 2 + ], + [ + 357, + 357, + 4 + ], + [ + 190, + 552, + 2 + ], + [ + 325, + 188, + 2 + ], + [ + 259, + 1053, + 2 + ], + [ + 238, + 238, + 3 + ], + [ + 250, + 276, + 2 + ], + [ + 254, + 254, + 1 + ], + [ + 297, + 297, + 1 + ], + [ + 406, + 261, + 2 + ], + [ + 1028, + 1131, + 1 + ], + [ + 1041, + 273, + 6 + ], + [ + 1189, + 272, + 4 + ], + [ + 308, + 244, + 1 + ], + [ + 323, + 226, + 1 + ], + [ + 393, + 393, + 1 + ], + [ + 613, + 454, + 1 + ], + [ + 523, + 256, + 2 + ], + [ + 1028, + 388, + 3 + ], + [ + 1052, + 431, + 2 + ], + [ + 895, + 895, + 2 + ], + [ + 1003, + 1003, + 1 + ], + [ + 1030, + 403, + 1 + ], + [ + 277, + 1142, + 2 + ], + [ + 374, + 276, + 2 + ], + [ + 886, + 886, + 2 + ], + [ + 1156, + 315, + 1 + ], + [ + 462, + 294, + 2 + ], + [ + 312, + 295, + 2 + ], + [ + 1038, + 1026, + 3 + ], + [ + 176, + 1408, + 2 + ], + [ + 641, + 251, + 2 + ], + [ + 1071, + 296, + 4 + ], + [ + 285, + 448, + 2 + ], + [ + 338, + 622, + 2 + ], + [ + 377, + 377, + 1 + ], + [ + 1036, + 327, + 4 + ], + [ + 283, + 63, + 1 + ], + [ + 1059, + 367, + 4 + ], + [ + 479, + 256, + 2 + ], + [ + 670, + 256, + 2 + ], + [ + 271, + 395, + 2 + ], + [ + 330, + 231, + 2 + ], + [ + 979, + 979, + 2 + ], + [ + 391, + 234, + 3 + ], + [ + 215, + 220, + 2 + ], + [ + 540, + 540, + 4 + ], + [ + 468, + 260, + 2 + ], + [ + 1429, + 354, + 4 + ], + [ + 572, + 572, + 3 + ], + [ + 262, + 1119, + 2 + ], + [ + 307, + 266, + 1 + ], + [ + 478, + 336, + 1 + ], + [ + 305, + 392, + 1 + ], + [ + 285, + 363, + 2 + ], + [ + 1174, + 321, + 1 + ], + [ + 1042, + 284, + 6 + ], + [ + 384, + 384, + 1 + ], + [ + 1072, + 1027, + 1 + ], + [ + 278, + 278, + 6 + ], + [ + 483, + 483, + 1 + ], + [ + 500, + 318, + 3 + ], + [ + 261, + 464, + 2 + ], + [ + 559, + 236, + 2 + ], + [ + 450, + 450, + 2 + ], + [ + 1268, + 277, + 2 + ], + [ + 1111, + 69, + 2 + ], + [ + 1212, + 305, + 1 + ], + [ + 605, + 605, + 1 + ], + [ + 714, + 352, + 2 + ], + [ + 332, + 240, + 3 + ], + [ + 482, + 482, + 4 + ], + [ + 917, + 917, + 2 + ], + [ + 372, + 372, + 3 + ], + [ + 110, + 680, + 1 + ], + [ + 561, + 820, + 1 + ], + [ + 1256, + 399, + 4 + ], + [ + 277, + 275, + 2 + ], + [ + 359, + 216, + 2 + ], + [ + 1221, + 225, + 4 + ], + [ + 772, + 61, + 1 + ], + [ + 1030, + 1205, + 1 + ], + [ + 232, + 65, + 1 + ], + [ + 1163, + 1163, + 2 + ], + [ + 253, + 361, + 2 + ], + [ + 1390, + 70, + 2 + ], + [ + 470, + 288, + 2 + ], + [ + 667, + 667, + 2 + ], + [ + 370, + 245, + 3 + ], + [ + 443, + 260, + 2 + ], + [ + 1059, + 1049, + 4 + ], + [ + 196, + 240, + 2 + ], + [ + 506, + 506, + 1 + ], + [ + 232, + 66, + 1 + ], + [ + 262, + 487, + 2 + ], + [ + 502, + 551, + 2 + ], + [ + 300, + 243, + 1 + ], + [ + 258, + 201, + 2 + ], + [ + 248, + 1044, + 2 + ], + [ + 588, + 413, + 1 + ], + [ + 1064, + 1064, + 4 + ], + [ + 390, + 508, + 2 + ], + [ + 193, + 499, + 2 + ], + [ + 585, + 817, + 1 + ], + [ + 460, + 425, + 2 + ], + [ + 366, + 366, + 3 + ], + [ + 310, + 433, + 1 + ], + [ + 21, + 22, + 1 + ], + [ + 362, + 515, + 2 + ], + [ + 296, + 284, + 2 + ], + [ + 790, + 790, + 2 + ], + [ + 240, + 196, + 2 + ], + [ + 768, + 768, + 2 + ], + [ + 200, + 1224, + 1 + ], + [ + 708, + 708, + 2 + ], + [ + 382, + 368, + 1 + ], + [ + 538, + 324, + 3 + ], + [ + 1039, + 334, + 4 + ], + [ + 1031, + 249, + 3 + ], + [ + 534, + 534, + 3 + ], + [ + 419, + 331, + 1 + ], + [ + 991, + 991, + 2 + ], + [ + 265, + 246, + 1 + ], + [ + 329, + 217, + 2 + ], + [ + 456, + 456, + 5 + ], + [ + 201, + 258, + 2 + ], + [ + 796, + 796, + 1 + ], + [ + 1197, + 273, + 4 + ], + [ + 1038, + 176, + 6 + ], + [ + 1319, + 418, + 1 + ], + [ + 748, + 748, + 2 + ], + [ + 1041, + 256, + 6 + ], + [ + 127, + 127, + 1 + ], + [ + 378, + 283, + 1 + ], + [ + 319, + 1290, + 1 + ], + [ + 1031, + 249, + 5 + ], + [ + 509, + 509, + 1 + ], + [ + 62, + 526, + 1 + ], + [ + 1028, + 1135, + 1 + ], + [ + 568, + 568, + 1 + ], + [ + 1030, + 1168, + 3 + ], + [ + 587, + 328, + 2 + ], + [ + 62, + 889, + 1 + ], + [ + 193, + 462, + 2 + ], + [ + 299, + 313, + 1 + ], + [ + 1025, + 449, + 4 + ], + [ + 72, + 775, + 1 + ], + [ + 202, + 252, + 2 + ], + [ + 321, + 457, + 1 + ], + [ + 1275, + 70, + 2 + ], + [ + 391, + 229, + 2 + ], + [ + 1045, + 1029, + 3 + ], + [ + 1099, + 1099, + 4 + ], + [ + 1341, + 480, + 4 + ], + [ + 695, + 695, + 1 + ], + [ + 402, + 364, + 2 + ], + [ + 389, + 230, + 3 + ], + [ + 330, + 231, + 1 + ], + [ + 657, + 657, + 2 + ], + [ + 226, + 195, + 1 + ], + [ + 805, + 73, + 1 + ], + [ + 221, + 221, + 1 + ], + [ + 1131, + 1028, + 1 + ], + [ + 1324, + 451, + 4 + ], + [ + 429, + 279, + 1 + ], + [ + 596, + 413, + 1 + ], + [ + 404, + 395, + 2 + ], + [ + 501, + 501, + 2 + ], + [ + 400, + 400, + 4 + ], + [ + 1258, + 281, + 4 + ], + [ + 266, + 307, + 1 + ], + [ + 890, + 29, + 1 + ], + [ + 1303, + 438, + 4 + ], + [ + 247, + 1044, + 2 + ], + [ + 373, + 337, + 1 + ], + [ + 250, + 268, + 2 + ], + [ + 261, + 245, + 2 + ], + [ + 1025, + 353, + 4 + ], + [ + 1042, + 294, + 6 + ], + [ + 244, + 461, + 2 + ], + [ + 432, + 432, + 3 + ], + [ + 214, + 188, + 1 + ], + [ + 547, + 547, + 3 + ], + [ + 1025, + 477, + 4 + ], + [ + 924, + 924, + 2 + ], + [ + 1028, + 1104, + 1 + ], + [ + 210, + 241, + 1 + ], + [ + 304, + 320, + 2 + ], + [ + 481, + 386, + 2 + ], + [ + 253, + 355, + 2 + ], + [ + 556, + 556, + 2 + ], + [ + 69, + 237, + 2 + ], + [ + 430, + 336, + 1 + ], + [ + 1039, + 188, + 4 + ], + [ + 952, + 952, + 2 + ], + [ + 1036, + 1024, + 4 + ], + [ + 226, + 323, + 1 + ], + [ + 454, + 613, + 1 + ], + [ + 1718, + 27, + 2 + ], + [ + 72, + 392, + 1 + ], + [ + 1260, + 428, + 1 + ], + [ + 403, + 403, + 4 + ], + [ + 1040, + 265, + 6 + ], + [ + 1415, + 457, + 1 + ], + [ + 1042, + 275, + 6 + ], + [ + 193, + 445, + 2 + ], + [ + 552, + 552, + 3 + ], + [ + 1354, + 1031, + 1 + ], + [ + 23, + 23, + 2 + ], + [ + 222, + 281, + 2 + ], + [ + 1070, + 1070, + 1 + ], + [ + 339, + 1058, + 2 + ], + [ + 259, + 328, + 2 + ], + [ + 745, + 635, + 1 + ], + [ + 1035, + 1035, + 1 + ], + [ + 247, + 1046, + 2 + ], + [ + 905, + 905, + 2 + ], + [ + 563, + 563, + 1 + ], + [ + 618, + 618, + 3 + ], + [ + 198, + 231, + 1 + ], + [ + 314, + 295, + 2 + ], + [ + 313, + 299, + 1 + ], + [ + 248, + 265, + 2 + ], + [ + 495, + 1049, + 2 + ], + [ + 193, + 522, + 2 + ], + [ + 974, + 974, + 2 + ], + [ + 385, + 275, + 2 + ], + [ + 471, + 293, + 2 + ], + [ + 510, + 619, + 2 + ], + [ + 1060, + 409, + 2 + ], + [ + 1059, + 354, + 4 + ], + [ + 411, + 229, + 2 + ], + [ + 110, + 1460, + 1 + ], + [ + 193, + 468, + 2 + ], + [ + 62, + 729, + 1 + ], + [ + 202, + 412, + 2 + ], + [ + 333, + 255, + 2 + ], + [ + 849, + 849, + 2 + ], + [ + 301, + 266, + 1 + ], + [ + 953, + 953, + 2 + ], + [ + 914, + 914, + 2 + ], + [ + 254, + 1033, + 2 + ], + [ + 783, + 783, + 2 + ], + [ + 1026, + 343, + 4 + ], + [ + 993, + 993, + 2 + ], + [ + 1198, + 68, + 2 + ], + [ + 1457, + 358, + 4 + ], + [ + 1218, + 277, + 7 + ], + [ + 1053, + 345, + 4 + ], + [ + 230, + 234, + 3 + ], + [ + 414, + 256, + 2 + ], + [ + 594, + 594, + 3 + ], + [ + 324, + 307, + 2 + ], + [ + 257, + 279, + 2 + ], + [ + 1041, + 295, + 6 + ], + [ + 267, + 359, + 2 + ], + [ + 691, + 691, + 2 + ], + [ + 1028, + 388, + 5 + ], + [ + 525, + 251, + 2 + ], + [ + 1070, + 1070, + 3 + ], + [ + 341, + 341, + 6 + ], + [ + 1047, + 174, + 1 + ], + [ + 247, + 265, + 2 + ], + [ + 896, + 17, + 1 + ], + [ + 415, + 234, + 3 + ], + [ + 1030, + 1114, + 1 + ], + [ + 246, + 1044, + 2 + ], + [ + 325, + 516, + 2 + ], + [ + 190, + 564, + 2 + ], + [ + 365, + 365, + 3 + ], + [ + 342, + 342, + 6 + ], + [ + 26, + 788, + 1 + ], + [ + 391, + 229, + 3 + ], + [ + 1073, + 259, + 1 + ], + [ + 637, + 446, + 1 + ], + [ + 686, + 686, + 2 + ], + [ + 299, + 313, + 2 + ], + [ + 843, + 61, + 1 + ], + [ + 1027, + 1080, + 5 + ], + [ + 442, + 642, + 2 + ], + [ + 251, + 312, + 2 + ], + [ + 387, + 387, + 1 + ], + [ + 1031, + 1112, + 5 + ], + [ + 222, + 280, + 2 + ], + [ + 698, + 778, + 2 + ], + [ + 217, + 1057, + 2 + ], + [ + 369, + 369, + 1 + ], + [ + 676, + 676, + 3 + ], + [ + 273, + 295, + 2 + ], + [ + 487, + 553, + 2 + ], + [ + 544, + 252, + 2 + ], + [ + 76, + 1593, + 1 + ], + [ + 193, + 484, + 2 + ], + [ + 507, + 507, + 3 + ], + [ + 679, + 679, + 2 + ], + [ + 1039, + 338, + 4 + ], + [ + 730, + 267, + 2 + ], + [ + 590, + 590, + 3 + ], + [ + 692, + 246, + 2 + ], + [ + 773, + 773, + 2 + ], + [ + 1218, + 260, + 7 + ], + [ + 268, + 395, + 2 + ], + [ + 685, + 685, + 1 + ], + [ + 1079, + 254, + 6 + ], + [ + 235, + 389, + 3 + ], + [ + 1388, + 446, + 1 + ], + [ + 245, + 261, + 2 + ], + [ + 285, + 429, + 2 + ], + [ + 518, + 518, + 2 + ], + [ + 1074, + 1074, + 3 + ], + [ + 318, + 266, + 2 + ], + [ + 554, + 252, + 2 + ], + [ + 236, + 219, + 3 + ], + [ + 1028, + 401, + 1 + ], + [ + 422, + 308, + 1 + ], + [ + 681, + 294, + 2 + ], + [ + 1310, + 59, + 2 + ], + [ + 1313, + 419, + 1 + ], + [ + 264, + 304, + 2 + ], + [ + 709, + 247, + 2 + ], + [ + 350, + 217, + 2 + ], + [ + 1025, + 453, + 4 + ], + [ + 1068, + 1068, + 4 + ], + [ + 243, + 243, + 4 + ], + [ + 1102, + 1102, + 4 + ], + [ + 645, + 433, + 1 + ], + [ + 1443, + 182, + 2 + ], + [ + 496, + 496, + 2 + ], + [ + 532, + 241, + 2 + ], + [ + 852, + 852, + 2 + ], + [ + 1293, + 320, + 4 + ], + [ + 420, + 292, + 2 + ], + [ + 455, + 455, + 2 + ], + [ + 606, + 606, + 3 + ], + [ + 1050, + 214, + 1 + ], + [ + 1349, + 433, + 1 + ], + [ + 1175, + 323, + 1 + ], + [ + 542, + 1036, + 2 + ], + [ + 74, + 775, + 1 + ], + [ + 353, + 256, + 2 + ], + [ + 721, + 248, + 2 + ], + [ + 253, + 240, + 2 + ], + [ + 360, + 566, + 2 + ], + [ + 1042, + 296, + 6 + ], + [ + 520, + 296, + 2 + ], + [ + 959, + 959, + 2 + ], + [ + 1048, + 176, + 1 + ], + [ + 318, + 301, + 2 + ], + [ + 1135, + 1028, + 1 + ], + [ + 408, + 408, + 2 + ], + [ + 1367, + 67, + 2 + ], + [ + 951, + 951, + 2 + ], + [ + 364, + 255, + 2 + ], + [ + 562, + 272, + 2 + ], + [ + 210, + 340, + 2 + ], + [ + 271, + 240, + 2 + ], + [ + 517, + 332, + 2 + ], + [ + 1027, + 365, + 3 + ], + [ + 321, + 227, + 1 + ], + [ + 246, + 424, + 2 + ], + [ + 586, + 457, + 1 + ], + [ + 64, + 66, + 1 + ], + [ + 908, + 634, + 1 + ], + [ + 1252, + 260, + 6 + ], + [ + 234, + 320, + 2 + ], + [ + 253, + 201, + 2 + ], + [ + 1361, + 1361, + 1 + ], + [ + 188, + 214, + 1 + ], + [ + 576, + 576, + 1 + ], + [ + 1188, + 1030, + 1 + ], + [ + 326, + 466, + 1 + ], + [ + 585, + 446, + 1 + ], + [ + 1249, + 199, + 4 + ], + [ + 195, + 225, + 1 + ], + [ + 1060, + 403, + 2 + ], + [ + 345, + 217, + 2 + ], + [ + 1881, + 61, + 3 + ], + [ + 1148, + 1325, + 2 + ], + [ + 176, + 260, + 2 + ], + [ + 198, + 231, + 2 + ], + [ + 394, + 240, + 2 + ], + [ + 490, + 268, + 2 + ], + [ + 1097, + 265, + 6 + ], + [ + 216, + 216, + 6 + ], + [ + 531, + 241, + 2 + ], + [ + 1586, + 1586, + 2 + ], + [ + 239, + 1123, + 1 + ], + [ + 422, + 308, + 2 + ], + [ + 71, + 70, + 2 + ], + [ + 327, + 1055, + 2 + ], + [ + 514, + 329, + 2 + ], + [ + 258, + 245, + 2 + ], + [ + 259, + 1073, + 2 + ], + [ + 1329, + 406, + 4 + ], + [ + 1722, + 101, + 2 + ], + [ + 379, + 273, + 2 + ], + [ + 1320, + 65, + 2 + ], + [ + 266, + 301, + 1 + ], + [ + 684, + 497, + 2 + ], + [ + 276, + 472, + 2 + ], + [ + 343, + 343, + 5 + ], + [ + 313, + 299, + 2 + ], + [ + 229, + 411, + 2 + ], + [ + 1061, + 251, + 4 + ], + [ + 600, + 600, + 3 + ], + [ + 1041, + 312, + 6 + ], + [ + 1218, + 284, + 7 + ], + [ + 1027, + 1080, + 1 + ], + [ + 1187, + 1030, + 1 + ], + [ + 612, + 612, + 3 + ], + [ + 277, + 400, + 2 + ], + [ + 1353, + 440, + 1 + ], + [ + 228, + 228, + 7 + ], + [ + 276, + 374, + 2 + ], + [ + 416, + 416, + 3 + ], + [ + 762, + 248, + 2 + ], + [ + 535, + 329, + 2 + ], + [ + 320, + 304, + 2 + ], + [ + 560, + 251, + 2 + ], + [ + 198, + 227, + 2 + ], + [ + 302, + 302, + 1 + ], + [ + 582, + 856, + 1 + ], + [ + 1027, + 345, + 3 + ], + [ + 1071, + 294, + 4 + ], + [ + 194, + 68, + 1 + ], + [ + 668, + 106, + 1 + ], + [ + 538, + 538, + 3 + ], + [ + 407, + 407, + 3 + ], + [ + 759, + 247, + 2 + ], + [ + 1798, + 208, + 2 + ], + [ + 356, + 261, + 2 + ], + [ + 647, + 996, + 1 + ], + [ + 489, + 489, + 2 + ], + [ + 1633, + 597, + 2 + ], + [ + 521, + 521, + 4 + ], + [ + 1027, + 350, + 3 + ], + [ + 1251, + 68, + 2 + ], + [ + 234, + 1125, + 2 + ], + [ + 504, + 382, + 1 + ], + [ + 476, + 381, + 2 + ], + [ + 677, + 267, + 2 + ], + [ + 417, + 393, + 2 + ], + [ + 530, + 530, + 1 + ], + [ + 596, + 444, + 1 + ], + [ + 1194, + 269, + 4 + ], + [ + 315, + 444, + 1 + ], + [ + 1017, + 1017, + 2 + ], + [ + 460, + 281, + 2 + ], + [ + 1028, + 414, + 1 + ], + [ + 911, + 911, + 2 + ], + [ + 1279, + 278, + 4 + ], + [ + 316, + 210, + 2 + ], + [ + 571, + 1049, + 2 + ], + [ + 254, + 1046, + 2 + ], + [ + 586, + 788, + 1 + ], + [ + 175, + 270, + 2 + ], + [ + 280, + 222, + 2 + ], + [ + 536, + 329, + 2 + ], + [ + 693, + 693, + 2 + ], + [ + 1254, + 195, + 1 + ], + [ + 344, + 344, + 6 + ], + [ + 283, + 64, + 1 + ], + [ + 405, + 216, + 2 + ], + [ + 662, + 662, + 1 + ], + [ + 1295, + 359, + 4 + ], + [ + 375, + 188, + 2 + ], + [ + 668, + 954, + 1 + ], + [ + 212, + 69, + 1 + ], + [ + 527, + 236, + 2 + ], + [ + 347, + 1082, + 2 + ], + [ + 248, + 1046, + 2 + ], + [ + 473, + 473, + 2 + ], + [ + 313, + 498, + 2 + ], + [ + 412, + 201, + 2 + ], + [ + 217, + 265, + 2 + ], + [ + 491, + 251, + 2 + ], + [ + 257, + 548, + 2 + ], + [ + 266, + 438, + 1 + ], + [ + 1813, + 660, + 2 + ], + [ + 1028, + 1131, + 5 + ], + [ + 239, + 323, + 1 + ], + [ + 277, + 281, + 2 + ], + [ + 138, + 760, + 1 + ], + [ + 217, + 1051, + 2 + ], + [ + 740, + 267, + 2 + ], + [ + 1059, + 358, + 4 + ], + [ + 295, + 312, + 2 + ], + [ + 214, + 1058, + 2 + ], + [ + 415, + 230, + 2 + ], + [ + 242, + 321, + 2 + ], + [ + 310, + 243, + 1 + ], + [ + 193, + 572, + 2 + ], + [ + 1126, + 1027, + 1 + ], + [ + 1203, + 1030, + 1 + ], + [ + 259, + 327, + 2 + ], + [ + 998, + 998, + 2 + ], + [ + 253, + 434, + 2 + ], + [ + 1027, + 366, + 3 + ], + [ + 492, + 317, + 2 + ], + [ + 235, + 411, + 3 + ], + [ + 1040, + 259, + 2 + ], + [ + 704, + 704, + 2 + ], + [ + 193, + 520, + 2 + ], + [ + 235, + 230, + 4 + ], + [ + 1116, + 1106, + 2 + ], + [ + 1042, + 280, + 6 + ], + [ + 558, + 1036, + 2 + ], + [ + 1071, + 294, + 2 + ], + [ + 1024, + 421, + 4 + ], + [ + 731, + 731, + 2 + ], + [ + 1031, + 349, + 3 + ], + [ + 193, + 581, + 2 + ], + [ + 467, + 467, + 2 + ], + [ + 348, + 348, + 4 + ], + [ + 285, + 464, + 2 + ], + [ + 219, + 236, + 2 + ], + [ + 315, + 225, + 1 + ], + [ + 636, + 454, + 1 + ], + [ + 1104, + 1028, + 1 + ], + [ + 174, + 546, + 4 + ], + [ + 247, + 1033, + 2 + ], + [ + 448, + 359, + 2 + ], + [ + 214, + 614, + 2 + ], + [ + 339, + 550, + 2 + ], + [ + 264, + 304, + 1 + ], + [ + 659, + 478, + 1 + ], + [ + 1241, + 258, + 4 + ], + [ + 1064, + 1064, + 3 + ], + [ + 265, + 1033, + 2 + ], + [ + 448, + 322, + 2 + ], + [ + 102, + 820, + 1 + ], + [ + 1041, + 314, + 6 + ], + [ + 1024, + 424, + 4 + ], + [ + 188, + 549, + 2 + ], + [ + 342, + 210, + 2 + ], + [ + 1225, + 244, + 4 + ], + [ + 1098, + 539, + 2 + ], + [ + 65, + 232, + 1 + ], + [ + 347, + 578, + 2 + ], + [ + 985, + 985, + 2 + ], + [ + 425, + 284, + 3 + ], + [ + 1063, + 1027, + 1 + ], + [ + 1428, + 220, + 4 + ], + [ + 468, + 643, + 2 + ], + [ + 502, + 210, + 2 + ], + [ + 1138, + 1138, + 4 + ], + [ + 486, + 316, + 2 + ], + [ + 1071, + 296, + 2 + ], + [ + 1426, + 340, + 4 + ], + [ + 226, + 226, + 4 + ], + [ + 929, + 929, + 2 + ], + [ + 1057, + 1117, + 4 + ], + [ + 315, + 326, + 1 + ], + [ + 269, + 332, + 3 + ], + [ + 330, + 319, + 1 + ], + [ + 262, + 1082, + 2 + ], + [ + 216, + 261, + 2 + ], + [ + 223, + 197, + 2 + ], + [ + 255, + 459, + 2 + ], + [ + 621, + 437, + 1 + ], + [ + 193, + 1083, + 2 + ], + [ + 288, + 432, + 1 + ], + [ + 404, + 421, + 2 + ], + [ + 320, + 299, + 2 + ], + [ + 217, + 285, + 2 + ], + [ + 428, + 428, + 3 + ], + [ + 279, + 279, + 6 + ], + [ + 300, + 243, + 2 + ], + [ + 324, + 324, + 6 + ], + [ + 445, + 277, + 2 + ], + [ + 371, + 475, + 1 + ], + [ + 610, + 610, + 3 + ], + [ + 196, + 196, + 5 + ], + [ + 275, + 360, + 3 + ], + [ + 1062, + 256, + 4 + ], + [ + 345, + 267, + 2 + ], + [ + 636, + 820, + 1 + ], + [ + 281, + 296, + 2 + ], + [ + 493, + 307, + 3 + ], + [ + 355, + 276, + 2 + ], + [ + 272, + 477, + 2 + ], + [ + 1044, + 1044, + 3 + ], + [ + 622, + 622, + 3 + ], + [ + 418, + 331, + 1 + ], + [ + 1028, + 1135, + 5 + ], + [ + 1053, + 350, + 4 + ], + [ + 234, + 230, + 3 + ], + [ + 112, + 111, + 1 + ], + [ + 1030, + 1200, + 1 + ], + [ + 1103, + 70, + 2 + ], + [ + 1261, + 357, + 4 + ], + [ + 1307, + 370, + 4 + ], + [ + 264, + 299, + 2 + ], + [ + 690, + 249, + 2 + ], + [ + 1014, + 1014, + 2 + ], + [ + 1191, + 63, + 1 + ], + [ + 295, + 314, + 2 + ], + [ + 1025, + 1025, + 1 + ], + [ + 1029, + 436, + 4 + ], + [ + 313, + 235, + 2 + ], + [ + 1205, + 1030, + 1 + ], + [ + 584, + 817, + 1 + ], + [ + 301, + 318, + 2 + ], + [ + 287, + 287, + 1 + ], + [ + 305, + 71, + 1 + ], + [ + 560, + 560, + 2 + ], + [ + 217, + 1033, + 2 + ], + [ + 230, + 389, + 2 + ], + [ + 315, + 242, + 1 + ], + [ + 308, + 244, + 2 + ], + [ + 351, + 351, + 7 + ], + [ + 1155, + 1155, + 1 + ], + [ + 72, + 592, + 1 + ], + [ + 188, + 235, + 2 + ], + [ + 338, + 1055, + 2 + ], + [ + 440, + 336, + 1 + ], + [ + 234, + 229, + 4 + ], + [ + 794, + 399, + 2 + ], + [ + 1252, + 277, + 6 + ], + [ + 1282, + 75, + 2 + ], + [ + 322, + 535, + 2 + ], + [ + 485, + 394, + 2 + ], + [ + 1191, + 378, + 1 + ], + [ + 334, + 1056, + 2 + ], + [ + 246, + 421, + 2 + ], + [ + 388, + 272, + 2 + ], + [ + 1028, + 1104, + 5 + ], + [ + 381, + 442, + 2 + ], + [ + 395, + 271, + 2 + ], + [ + 585, + 884, + 1 + ], + [ + 1341, + 620, + 4 + ], + [ + 746, + 296, + 2 + ], + [ + 174, + 176, + 4 + ], + [ + 384, + 240, + 2 + ], + [ + 516, + 357, + 2 + ], + [ + 861, + 861, + 2 + ], + [ + 238, + 210, + 2 + ], + [ + 281, + 277, + 2 + ], + [ + 214, + 1046, + 2 + ], + [ + 798, + 798, + 2 + ], + [ + 703, + 296, + 2 + ], + [ + 484, + 260, + 2 + ], + [ + 487, + 646, + 2 + ], + [ + 1098, + 545, + 2 + ], + [ + 241, + 471, + 2 + ], + [ + 250, + 437, + 2 + ], + [ + 511, + 276, + 2 + ], + [ + 451, + 452, + 1 + ], + [ + 1121, + 1124, + 2 + ], + [ + 462, + 657, + 2 + ], + [ + 319, + 323, + 1 + ], + [ + 837, + 837, + 2 + ], + [ + 1060, + 441, + 2 + ], + [ + 193, + 235, + 2 + ], + [ + 613, + 419, + 1 + ], + [ + 1028, + 1131, + 3 + ], + [ + 593, + 593, + 1 + ], + [ + 637, + 1015, + 1 + ], + [ + 441, + 294, + 2 + ], + [ + 328, + 1056, + 2 + ], + [ + 243, + 300, + 1 + ], + [ + 198, + 227, + 1 + ], + [ + 1337, + 331, + 2 + ], + [ + 575, + 236, + 2 + ], + [ + 687, + 687, + 1 + ], + [ + 1031, + 202, + 5 + ], + [ + 1240, + 232, + 1 + ], + [ + 1182, + 237, + 1 + ], + [ + 680, + 410, + 1 + ], + [ + 1300, + 390, + 4 + ], + [ + 216, + 271, + 2 + ], + [ + 579, + 416, + 1 + ], + [ + 278, + 175, + 2 + ], + [ + 588, + 892, + 1 + ], + [ + 1038, + 222, + 6 + ], + [ + 230, + 415, + 2 + ], + [ + 1845, + 19, + 2 + ], + [ + 67, + 1077, + 2 + ], + [ + 477, + 272, + 2 + ], + [ + 603, + 175, + 2 + ], + [ + 337, + 373, + 2 + ], + [ + 904, + 498, + 2 + ], + [ + 229, + 391, + 3 + ], + [ + 503, + 292, + 2 + ], + [ + 489, + 236, + 2 + ], + [ + 1252, + 284, + 6 + ], + [ + 258, + 442, + 2 + ], + [ + 1038, + 360, + 6 + ], + [ + 722, + 452, + 1 + ], + [ + 574, + 325, + 2 + ], + [ + 393, + 268, + 2 + ], + [ + 280, + 1127, + 2 + ], + [ + 281, + 460, + 2 + ], + [ + 380, + 245, + 2 + ], + [ + 382, + 504, + 1 + ], + [ + 500, + 318, + 2 + ], + [ + 645, + 903, + 1 + ], + [ + 1208, + 259, + 4 + ], + [ + 107, + 1513, + 1 + ], + [ + 286, + 286, + 1 + ], + [ + 1199, + 330, + 1 + ], + [ + 193, + 521, + 2 + ], + [ + 214, + 623, + 2 + ], + [ + 353, + 353, + 7 + ], + [ + 1071, + 260, + 2 + ], + [ + 1107, + 1107, + 4 + ], + [ + 188, + 542, + 2 + ], + [ + 369, + 515, + 2 + ], + [ + 468, + 296, + 2 + ], + [ + 1299, + 348, + 4 + ], + [ + 522, + 522, + 4 + ], + [ + 18, + 817, + 1 + ], + [ + 321, + 326, + 1 + ], + [ + 456, + 273, + 2 + ], + [ + 1036, + 254, + 4 + ], + [ + 174, + 270, + 2 + ], + [ + 188, + 583, + 2 + ], + [ + 279, + 383, + 2 + ], + [ + 245, + 380, + 2 + ], + [ + 765, + 765, + 1 + ], + [ + 1035, + 196, + 6 + ], + [ + 217, + 1117, + 2 + ], + [ + 350, + 267, + 2 + ], + [ + 347, + 791, + 2 + ], + [ + 1257, + 296, + 4 + ], + [ + 567, + 273, + 2 + ], + [ + 301, + 324, + 1 + ], + [ + 448, + 285, + 2 + ], + [ + 981, + 981, + 2 + ], + [ + 1031, + 349, + 5 + ], + [ + 295, + 273, + 2 + ], + [ + 723, + 457, + 1 + ], + [ + 1025, + 479, + 4 + ], + [ + 188, + 234, + 2 + ], + [ + 248, + 1033, + 2 + ], + [ + 190, + 618, + 2 + ], + [ + 987, + 987, + 2 + ], + [ + 1116, + 1244, + 2 + ], + [ + 216, + 359, + 2 + ], + [ + 219, + 344, + 2 + ], + [ + 241, + 463, + 2 + ], + [ + 343, + 372, + 3 + ], + [ + 1027, + 1216, + 1 + ], + [ + 307, + 324, + 2 + ], + [ + 174, + 277, + 2 + ], + [ + 229, + 235, + 3 + ], + [ + 304, + 304, + 7 + ], + [ + 492, + 306, + 2 + ], + [ + 938, + 938, + 2 + ], + [ + 322, + 1119, + 2 + ], + [ + 448, + 697, + 2 + ], + [ + 466, + 457, + 1 + ], + [ + 527, + 527, + 2 + ], + [ + 1024, + 375, + 4 + ], + [ + 368, + 335, + 1 + ], + [ + 1060, + 435, + 2 + ], + [ + 69, + 1111, + 1 + ], + [ + 1060, + 447, + 2 + ], + [ + 1637, + 197, + 4 + ], + [ + 589, + 429, + 2 + ], + [ + 176, + 557, + 4 + ], + [ + 453, + 453, + 5 + ], + [ + 1030, + 1122, + 1 + ], + [ + 243, + 310, + 1 + ], + [ + 513, + 513, + 3 + ], + [ + 226, + 195, + 2 + ], + [ + 255, + 333, + 2 + ], + [ + 435, + 296, + 2 + ], + [ + 588, + 854, + 1 + ], + [ + 230, + 389, + 3 + ], + [ + 797, + 797, + 1 + ], + [ + 1071, + 280, + 4 + ], + [ + 62, + 807, + 1 + ], + [ + 174, + 546, + 3 + ], + [ + 269, + 256, + 2 + ], + [ + 16, + 954, + 1 + ], + [ + 1322, + 284, + 2 + ], + [ + 188, + 595, + 2 + ], + [ + 486, + 306, + 2 + ], + [ + 511, + 347, + 2 + ], + [ + 1074, + 1074, + 1 + ], + [ + 1078, + 1047, + 2 + ], + [ + 1441, + 342, + 4 + ], + [ + 194, + 67, + 1 + ], + [ + 449, + 272, + 2 + ], + [ + 1255, + 294, + 4 + ], + [ + 377, + 240, + 2 + ], + [ + 671, + 510, + 2 + ], + [ + 231, + 330, + 1 + ], + [ + 1025, + 491, + 4 + ], + [ + 188, + 229, + 2 + ], + [ + 411, + 235, + 3 + ], + [ + 596, + 854, + 1 + ], + [ + 638, + 260, + 2 + ], + [ + 1026, + 1026, + 3 + ], + [ + 299, + 320, + 2 + ], + [ + 752, + 294, + 2 + ], + [ + 261, + 216, + 2 + ], + [ + 770, + 352, + 2 + ], + [ + 1028, + 1135, + 3 + ], + [ + 66, + 205, + 2 + ], + [ + 406, + 381, + 2 + ], + [ + 737, + 100, + 1 + ], + [ + 1224, + 200, + 4 + ], + [ + 1029, + 352, + 4 + ], + [ + 251, + 401, + 2 + ], + [ + 1027, + 1216, + 3 + ], + [ + 1068, + 1068, + 3 + ], + [ + 217, + 362, + 1 + ], + [ + 1071, + 280, + 2 + ], + [ + 371, + 371, + 4 + ], + [ + 1030, + 1114, + 5 + ], + [ + 1348, + 326, + 1 + ], + [ + 249, + 591, + 2 + ], + [ + 288, + 214, + 2 + ], + [ + 321, + 242, + 1 + ], + [ + 756, + 357, + 2 + ], + [ + 202, + 289, + 1 + ], + [ + 395, + 404, + 2 + ], + [ + 562, + 562, + 3 + ], + [ + 632, + 632, + 3 + ], + [ + 659, + 17, + 1 + ], + [ + 1028, + 1104, + 3 + ], + [ + 188, + 216, + 2 + ], + [ + 1114, + 1030, + 1 + ], + [ + 514, + 404, + 2 + ], + [ + 1744, + 62, + 1 + ], + [ + 220, + 220, + 4 + ], + [ + 497, + 497, + 3 + ], + [ + 814, + 814, + 2 + ], + [ + 345, + 1024, + 2 + ], + [ + 548, + 257, + 2 + ], + [ + 188, + 507, + 2 + ], + [ + 202, + 469, + 2 + ], + [ + 1030, + 1187, + 3 + ], + [ + 1440, + 297, + 4 + ], + [ + 1212, + 305, + 4 + ], + [ + 930, + 930, + 1 + ], + [ + 188, + 230, + 2 + ], + [ + 234, + 415, + 3 + ], + [ + 1036, + 348, + 4 + ], + [ + 190, + 672, + 2 + ], + [ + 502, + 551, + 1 + ], + [ + 14, + 14, + 1 + ], + [ + 188, + 558, + 2 + ], + [ + 390, + 571, + 2 + ], + [ + 229, + 391, + 2 + ], + [ + 349, + 257, + 2 + ], + [ + 1027, + 1363, + 1 + ], + [ + 264, + 320, + 2 + ], + [ + 268, + 393, + 2 + ], + [ + 549, + 265, + 2 + ], + [ + 266, + 318, + 2 + ], + [ + 1040, + 262, + 2 + ], + [ + 250, + 246, + 2 + ], + [ + 659, + 440, + 1 + ], + [ + 1031, + 367, + 1 + ], + [ + 1094, + 262, + 6 + ], + [ + 474, + 277, + 2 + ], + [ + 581, + 581, + 2 + ], + [ + 824, + 824, + 2 + ], + [ + 1030, + 1128, + 1 + ], + [ + 426, + 312, + 2 + ], + [ + 621, + 437, + 2 + ], + [ + 250, + 376, + 2 + ], + [ + 1083, + 193, + 1 + ], + [ + 60, + 62, + 1 + ], + [ + 890, + 28, + 1 + ], + [ + 1629, + 67, + 4 + ], + [ + 231, + 198, + 1 + ], + [ + 279, + 356, + 2 + ], + [ + 295, + 1104, + 2 + ], + [ + 319, + 330, + 1 + ], + [ + 343, + 260, + 3 + ], + [ + 414, + 269, + 2 + ], + [ + 609, + 792, + 2 + ], + [ + 329, + 1057, + 2 + ], + [ + 387, + 245, + 2 + ], + [ + 499, + 275, + 2 + ], + [ + 194, + 205, + 1 + ], + [ + 698, + 459, + 2 + ], + [ + 1030, + 1203, + 3 + ], + [ + 203, + 203, + 4 + ], + [ + 313, + 304, + 1 + ], + [ + 1027, + 1360, + 1 + ], + [ + 1142, + 277, + 5 + ], + [ + 274, + 274, + 3 + ], + [ + 322, + 563, + 2 + ], + [ + 1085, + 1198, + 2 + ], + [ + 1260, + 760, + 1 + ], + [ + 612, + 325, + 2 + ], + [ + 240, + 377, + 2 + ], + [ + 350, + 265, + 2 + ], + [ + 246, + 1066, + 2 + ], + [ + 248, + 267, + 2 + ], + [ + 254, + 259, + 3 + ], + [ + 417, + 766, + 2 + ], + [ + 369, + 767, + 2 + ], + [ + 599, + 308, + 2 + ], + [ + 1033, + 362, + 6 + ], + [ + 1044, + 265, + 4 + ], + [ + 628, + 628, + 3 + ], + [ + 1100, + 1136, + 2 + ], + [ + 430, + 309, + 1 + ], + [ + 406, + 580, + 2 + ], + [ + 541, + 261, + 2 + ], + [ + 378, + 569, + 1 + ], + [ + 299, + 299, + 7 + ], + [ + 340, + 210, + 2 + ], + [ + 276, + 355, + 2 + ], + [ + 583, + 583, + 2 + ], + [ + 425, + 425, + 4 + ], + [ + 109, + 903, + 1 + ], + [ + 1040, + 267, + 6 + ], + [ + 1080, + 1027, + 1 + ], + [ + 482, + 284, + 2 + ], + [ + 244, + 394, + 2 + ], + [ + 587, + 357, + 2 + ], + [ + 1030, + 1133, + 1 + ], + [ + 1024, + 1113, + 4 + ], + [ + 1060, + 458, + 2 + ], + [ + 1046, + 359, + 4 + ], + [ + 70, + 237, + 1 + ], + [ + 176, + 1081, + 2 + ], + [ + 815, + 289, + 2 + ], + [ + 516, + 288, + 2 + ], + [ + 582, + 903, + 1 + ], + [ + 673, + 673, + 3 + ], + [ + 249, + 241, + 2 + ], + [ + 1084, + 251, + 4 + ], + [ + 255, + 257, + 2 + ], + [ + 799, + 799, + 3 + ], + [ + 1025, + 456, + 4 + ], + [ + 607, + 607, + 3 + ], + [ + 1070, + 1289, + 1 + ], + [ + 629, + 629, + 3 + ], + [ + 1030, + 1114, + 3 + ], + [ + 1033, + 334, + 6 + ], + [ + 1029, + 202, + 3 + ], + [ + 258, + 483, + 2 + ], + [ + 385, + 385, + 4 + ], + [ + 1007, + 73, + 1 + ], + [ + 680, + 24, + 1 + ], + [ + 1250, + 243, + 4 + ], + [ + 379, + 251, + 2 + ], + [ + 559, + 559, + 2 + ], + [ + 523, + 523, + 4 + ], + [ + 176, + 275, + 2 + ], + [ + 1036, + 1073, + 1 + ], + [ + 1254, + 195, + 4 + ], + [ + 201, + 201, + 7 + ], + [ + 567, + 567, + 2 + ], + [ + 1147, + 196, + 4 + ], + [ + 469, + 253, + 2 + ], + [ + 1264, + 64, + 2 + ], + [ + 255, + 361, + 2 + ], + [ + 1049, + 1049, + 3 + ], + [ + 1330, + 198, + 1 + ], + [ + 310, + 243, + 2 + ], + [ + 254, + 423, + 2 + ], + [ + 307, + 266, + 2 + ], + [ + 566, + 566, + 4 + ], + [ + 633, + 633, + 3 + ], + [ + 555, + 555, + 4 + ], + [ + 719, + 719, + 3 + ], + [ + 66, + 68, + 1 + ], + [ + 548, + 543, + 2 + ], + [ + 1030, + 409, + 5 + ], + [ + 227, + 198, + 1 + ], + [ + 373, + 283, + 2 + ], + [ + 977, + 977, + 2 + ], + [ + 304, + 313, + 1 + ], + [ + 363, + 285, + 2 + ], + [ + 1218, + 280, + 7 + ], + [ + 1209, + 216, + 4 + ], + [ + 1154, + 1154, + 1 + ], + [ + 1035, + 1025, + 1 + ], + [ + 1116, + 63, + 2 + ], + [ + 281, + 260, + 2 + ], + [ + 398, + 398, + 3 + ], + [ + 715, + 367, + 2 + ], + [ + 188, + 1117, + 2 + ], + [ + 240, + 384, + 2 + ], + [ + 426, + 273, + 2 + ], + [ + 1093, + 1312, + 2 + ], + [ + 733, + 248, + 2 + ], + [ + 264, + 313, + 2 + ], + [ + 217, + 1054, + 2 + ], + [ + 332, + 517, + 2 + ], + [ + 193, + 616, + 2 + ], + [ + 599, + 355, + 2 + ], + [ + 994, + 994, + 2 + ], + [ + 65, + 67, + 1 + ], + [ + 345, + 265, + 2 + ], + [ + 537, + 625, + 2 + ], + [ + 902, + 493, + 2 + ], + [ + 529, + 529, + 5 + ], + [ + 235, + 229, + 3 + ], + [ + 375, + 375, + 4 + ], + [ + 1246, + 253, + 4 + ], + [ + 293, + 293, + 1 + ], + [ + 18, + 854, + 1 + ], + [ + 505, + 301, + 3 + ], + [ + 809, + 809, + 2 + ], + [ + 190, + 641, + 2 + ], + [ + 356, + 580, + 2 + ], + [ + 234, + 320, + 5 + ], + [ + 259, + 339, + 1 + ], + [ + 716, + 716, + 1 + ], + [ + 1028, + 431, + 1 + ], + [ + 219, + 219, + 6 + ], + [ + 1399, + 396, + 4 + ], + [ + 420, + 660, + 1 + ], + [ + 572, + 572, + 2 + ], + [ + 176, + 557, + 3 + ], + [ + 712, + 327, + 2 + ], + [ + 174, + 1078, + 2 + ], + [ + 176, + 284, + 2 + ], + [ + 228, + 467, + 2 + ], + [ + 431, + 314, + 2 + ], + [ + 1031, + 1157, + 1 + ], + [ + 239, + 330, + 1 + ], + [ + 550, + 550, + 3 + ], + [ + 350, + 1024, + 2 + ], + [ + 256, + 479, + 2 + ], + [ + 324, + 235, + 2 + ], + [ + 1388, + 319, + 1 + ], + [ + 279, + 515, + 2 + ], + [ + 472, + 568, + 2 + ], + [ + 753, + 753, + 2 + ], + [ + 1006, + 1006, + 2 + ], + [ + 739, + 739, + 2 + ], + [ + 252, + 486, + 2 + ], + [ + 782, + 442, + 2 + ], + [ + 401, + 272, + 2 + ], + [ + 1413, + 402, + 4 + ], + [ + 678, + 678, + 2 + ], + [ + 185, + 1361, + 1 + ], + [ + 202, + 1482, + 2 + ], + [ + 301, + 266, + 2 + ], + [ + 577, + 577, + 3 + ], + [ + 1471, + 465, + 1 + ], + [ + 202, + 495, + 2 + ], + [ + 212, + 68, + 2 + ], + [ + 240, + 271, + 2 + ], + [ + 504, + 504, + 3 + ], + [ + 67, + 194, + 1 + ], + [ + 190, + 682, + 2 + ], + [ + 1359, + 336, + 2 + ], + [ + 520, + 275, + 2 + ], + [ + 269, + 414, + 2 + ], + [ + 190, + 245, + 2 + ], + [ + 449, + 261, + 2 + ], + [ + 611, + 381, + 2 + ], + [ + 281, + 360, + 3 + ], + [ + 728, + 247, + 2 + ], + [ + 545, + 545, + 2 + ], + [ + 237, + 70, + 1 + ], + [ + 627, + 627, + 1 + ], + [ + 63, + 526, + 1 + ], + [ + 228, + 501, + 2 + ], + [ + 229, + 411, + 3 + ], + [ + 931, + 100, + 1 + ], + [ + 234, + 318, + 2 + ], + [ + 1030, + 1188, + 3 + ], + [ + 1039, + 1046, + 4 + ], + [ + 1073, + 1050, + 2 + ], + [ + 464, + 261, + 2 + ], + [ + 533, + 533, + 2 + ], + [ + 500, + 887, + 2 + ], + [ + 270, + 174, + 2 + ], + [ + 291, + 291, + 4 + ], + [ + 139, + 139, + 1 + ], + [ + 252, + 492, + 2 + ], + [ + 268, + 490, + 2 + ], + [ + 1033, + 338, + 6 + ], + [ + 1265, + 345, + 7 + ], + [ + 267, + 247, + 2 + ], + [ + 1030, + 1205, + 3 + ], + [ + 137, + 827, + 1 + ], + [ + 417, + 217, + 2 + ], + [ + 725, + 725, + 3 + ], + [ + 112, + 113, + 1 + ], + [ + 1031, + 354, + 1 + ], + [ + 1286, + 313, + 4 + ], + [ + 1497, + 510, + 4 + ], + [ + 643, + 468, + 2 + ], + [ + 642, + 374, + 2 + ], + [ + 1030, + 1127, + 1 + ], + [ + 656, + 656, + 3 + ], + [ + 431, + 272, + 2 + ], + [ + 528, + 615, + 2 + ], + [ + 578, + 437, + 2 + ], + [ + 662, + 71, + 1 + ], + [ + 1028, + 426, + 1 + ], + [ + 1252, + 280, + 6 + ], + [ + 1310, + 1310, + 2 + ], + [ + 584, + 896, + 1 + ], + [ + 1026, + 234, + 4 + ], + [ + 289, + 216, + 2 + ], + [ + 228, + 473, + 2 + ], + [ + 507, + 265, + 2 + ], + [ + 1798, + 207, + 2 + ], + [ + 230, + 415, + 3 + ], + [ + 337, + 524, + 1 + ], + [ + 742, + 470, + 2 + ], + [ + 1220, + 1031, + 1 + ], + [ + 294, + 441, + 2 + ], + [ + 454, + 636, + 1 + ], + [ + 278, + 176, + 2 + ], + [ + 234, + 248, + 2 + ], + [ + 269, + 1061, + 2 + ], + [ + 273, + 312, + 2 + ], + [ + 436, + 268, + 2 + ], + [ + 1134, + 325, + 2 + ], + [ + 451, + 452, + 2 + ], + [ + 102, + 892, + 1 + ], + [ + 249, + 376, + 2 + ], + [ + 1027, + 1311, + 1 + ], + [ + 649, + 649, + 3 + ], + [ + 65, + 1244, + 1 + ], + [ + 252, + 554, + 2 + ], + [ + 304, + 320, + 1 + ], + [ + 403, + 403, + 3 + ], + [ + 966, + 966, + 2 + ], + [ + 316, + 486, + 2 + ], + [ + 204, + 266, + 2 + ], + [ + 317, + 492, + 2 + ], + [ + 235, + 217, + 2 + ], + [ + 323, + 239, + 1 + ], + [ + 663, + 663, + 3 + ], + [ + 680, + 465, + 1 + ], + [ + 190, + 240, + 2 + ], + [ + 202, + 624, + 2 + ], + [ + 461, + 461, + 4 + ], + [ + 1027, + 1306, + 1 + ], + [ + 496, + 496, + 5 + ], + [ + 932, + 932, + 2 + ], + [ + 214, + 365, + 2 + ], + [ + 279, + 429, + 1 + ], + [ + 645, + 465, + 1 + ], + [ + 1213, + 1213, + 4 + ], + [ + 65, + 1106, + 2 + ], + [ + 220, + 215, + 2 + ], + [ + 1030, + 275, + 7 + ], + [ + 425, + 460, + 2 + ], + [ + 247, + 267, + 2 + ], + [ + 320, + 304, + 1 + ], + [ + 284, + 482, + 2 + ], + [ + 1033, + 359, + 6 + ], + [ + 640, + 332, + 2 + ], + [ + 608, + 333, + 2 + ], + [ + 214, + 366, + 2 + ], + [ + 188, + 573, + 2 + ], + [ + 970, + 519, + 2 + ], + [ + 273, + 456, + 2 + ], + [ + 370, + 1109, + 2 + ], + [ + 264, + 299, + 1 + ], + [ + 1012, + 1012, + 2 + ], + [ + 194, + 205, + 2 + ], + [ + 251, + 641, + 2 + ], + [ + 307, + 318, + 1 + ], + [ + 1031, + 397, + 1 + ], + [ + 227, + 198, + 2 + ], + [ + 1120, + 1120, + 2 + ], + [ + 273, + 379, + 2 + ], + [ + 281, + 222, + 2 + ], + [ + 294, + 450, + 2 + ], + [ + 367, + 241, + 2 + ], + [ + 443, + 277, + 2 + ], + [ + 553, + 553, + 3 + ], + [ + 574, + 327, + 2 + ], + [ + 1122, + 1030, + 1 + ], + [ + 1294, + 308, + 4 + ], + [ + 174, + 312, + 2 + ], + [ + 348, + 568, + 2 + ], + [ + 1035, + 351, + 6 + ], + [ + 251, + 525, + 2 + ], + [ + 408, + 635, + 1 + ], + [ + 586, + 1002, + 1 + ], + [ + 832, + 832, + 2 + ], + [ + 1150, + 275, + 5 + ], + [ + 613, + 856, + 1 + ], + [ + 395, + 377, + 2 + ], + [ + 278, + 282, + 2 + ], + [ + 445, + 280, + 2 + ], + [ + 1931, + 166, + 4 + ], + [ + 276, + 276, + 6 + ], + [ + 1005, + 1005, + 2 + ], + [ + 313, + 264, + 1 + ], + [ + 1038, + 1038, + 3 + ], + [ + 364, + 258, + 3 + ], + [ + 667, + 444, + 1 + ], + [ + 383, + 279, + 2 + ], + [ + 825, + 825, + 2 + ], + [ + 602, + 357, + 2 + ], + [ + 434, + 244, + 2 + ], + [ + 284, + 280, + 2 + ], + [ + 484, + 484, + 5 + ], + [ + 176, + 277, + 2 + ], + [ + 314, + 272, + 2 + ], + [ + 1112, + 1029, + 4 + ], + [ + 174, + 275, + 2 + ], + [ + 256, + 414, + 2 + ], + [ + 898, + 551, + 2 + ], + [ + 193, + 630, + 2 + ], + [ + 217, + 595, + 2 + ], + [ + 738, + 349, + 2 + ], + [ + 1105, + 242, + 4 + ], + [ + 424, + 1055, + 2 + ], + [ + 512, + 292, + 2 + ], + [ + 534, + 334, + 2 + ], + [ + 1265, + 350, + 7 + ], + [ + 565, + 565, + 4 + ], + [ + 322, + 262, + 2 + ], + [ + 1028, + 401, + 5 + ], + [ + 256, + 523, + 2 + ], + [ + 865, + 865, + 2 + ], + [ + 418, + 300, + 1 + ], + [ + 1081, + 1048, + 2 + ], + [ + 212, + 212, + 3 + ], + [ + 411, + 229, + 3 + ], + [ + 190, + 236, + 2 + ], + [ + 253, + 470, + 2 + ], + [ + 394, + 244, + 2 + ], + [ + 397, + 196, + 2 + ], + [ + 1031, + 358, + 1 + ], + [ + 254, + 1058, + 2 + ], + [ + 264, + 320, + 1 + ], + [ + 193, + 230, + 2 + ], + [ + 254, + 439, + 2 + ], + [ + 1102, + 229, + 5 + ], + [ + 1127, + 1030, + 1 + ], + [ + 64, + 65, + 3 + ], + [ + 299, + 320, + 1 + ], + [ + 1026, + 460, + 4 + ], + [ + 66, + 1085, + 2 + ], + [ + 356, + 279, + 2 + ], + [ + 732, + 162, + 2 + ], + [ + 745, + 438, + 2 + ], + [ + 267, + 248, + 2 + ], + [ + 436, + 376, + 2 + ], + [ + 260, + 174, + 2 + ], + [ + 619, + 333, + 2 + ], + [ + 1156, + 1156, + 4 + ], + [ + 62, + 579, + 1 + ], + [ + 1364, + 219, + 4 + ], + [ + 217, + 216, + 2 + ], + [ + 249, + 1162, + 2 + ], + [ + 325, + 511, + 2 + ], + [ + 367, + 1029, + 2 + ], + [ + 616, + 616, + 2 + ], + [ + 373, + 526, + 1 + ], + [ + 210, + 238, + 2 + ], + [ + 289, + 1153, + 2 + ], + [ + 230, + 235, + 4 + ], + [ + 284, + 1172, + 2 + ], + [ + 1265, + 366, + 7 + ], + [ + 202, + 617, + 2 + ], + [ + 214, + 1036, + 1 + ], + [ + 341, + 341, + 7 + ], + [ + 1211, + 309, + 1 + ], + [ + 259, + 598, + 2 + ], + [ + 488, + 488, + 5 + ], + [ + 1419, + 404, + 4 + ], + [ + 463, + 463, + 4 + ], + [ + 657, + 462, + 2 + ], + [ + 359, + 515, + 2 + ], + [ + 386, + 481, + 2 + ], + [ + 387, + 374, + 2 + ], + [ + 1033, + 405, + 6 + ], + [ + 380, + 364, + 2 + ], + [ + 1844, + 104, + 2 + ], + [ + 252, + 544, + 2 + ], + [ + 323, + 239, + 2 + ], + [ + 870, + 870, + 2 + ], + [ + 1038, + 193, + 3 + ], + [ + 305, + 392, + 2 + ], + [ + 348, + 511, + 2 + ], + [ + 305, + 70, + 2 + ], + [ + 815, + 815, + 2 + ], + [ + 396, + 423, + 2 + ], + [ + 97, + 98, + 1 + ], + [ + 540, + 343, + 2 + ], + [ + 196, + 265, + 2 + ], + [ + 207, + 207, + 1 + ], + [ + 324, + 266, + 2 + ], + [ + 334, + 262, + 2 + ], + [ + 528, + 587, + 2 + ], + [ + 495, + 258, + 2 + ], + [ + 1024, + 439, + 4 + ], + [ + 199, + 199, + 4 + ], + [ + 272, + 314, + 2 + ], + [ + 347, + 490, + 2 + ], + [ + 436, + 1076, + 2 + ], + [ + 313, + 304, + 2 + ], + [ + 320, + 299, + 1 + ], + [ + 1764, + 23, + 2 + ], + [ + 351, + 529, + 4 + ], + [ + 1035, + 1025, + 3 + ], + [ + 1030, + 1237, + 1 + ], + [ + 1484, + 302, + 4 + ], + [ + 250, + 250, + 5 + ], + [ + 260, + 443, + 2 + ], + [ + 451, + 451, + 3 + ], + [ + 684, + 490, + 2 + ], + [ + 251, + 491, + 2 + ], + [ + 494, + 494, + 5 + ], + [ + 1074, + 1339, + 1 + ], + [ + 307, + 307, + 1 + ], + [ + 563, + 362, + 2 + ], + [ + 399, + 1256, + 1 + ], + [ + 1385, + 412, + 4 + ], + [ + 345, + 246, + 2 + ], + [ + 318, + 234, + 2 + ], + [ + 535, + 605, + 2 + ], + [ + 1044, + 1050, + 1 + ], + [ + 1096, + 332, + 4 + ], + [ + 599, + 434, + 2 + ], + [ + 202, + 631, + 2 + ], + [ + 661, + 661, + 3 + ], + [ + 1071, + 277, + 2 + ], + [ + 1025, + 562, + 4 + ], + [ + 245, + 248, + 2 + ], + [ + 270, + 175, + 2 + ], + [ + 626, + 626, + 4 + ], + [ + 1265, + 365, + 7 + ], + [ + 311, + 311, + 3 + ], + [ + 60, + 889, + 1 + ], + [ + 729, + 729, + 2 + ], + [ + 525, + 525, + 4 + ], + [ + 231, + 231, + 4 + ], + [ + 1829, + 24, + 2 + ], + [ + 200, + 472, + 2 + ], + [ + 284, + 296, + 2 + ], + [ + 354, + 1029, + 2 + ], + [ + 367, + 196, + 2 + ], + [ + 678, + 325, + 2 + ], + [ + 1027, + 1202, + 3 + ], + [ + 288, + 333, + 2 + ], + [ + 1214, + 201, + 4 + ], + [ + 222, + 222, + 4 + ], + [ + 260, + 462, + 2 + ], + [ + 549, + 549, + 3 + ], + [ + 566, + 360, + 2 + ], + [ + 1064, + 1380, + 1 + ], + [ + 242, + 326, + 2 + ], + [ + 1024, + 423, + 4 + ], + [ + 1191, + 1191, + 1 + ], + [ + 1195, + 246, + 4 + ], + [ + 1272, + 227, + 4 + ], + [ + 473, + 228, + 2 + ], + [ + 376, + 1029, + 2 + ], + [ + 520, + 708, + 2 + ], + [ + 1100, + 1251, + 2 + ], + [ + 77, + 77, + 1 + ], + [ + 193, + 1118, + 2 + ], + [ + 410, + 971, + 1 + ], + [ + 644, + 644, + 3 + ], + [ + 1133, + 1030, + 1 + ], + [ + 1328, + 204, + 4 + ], + [ + 380, + 257, + 2 + ], + [ + 1030, + 1234, + 1 + ], + [ + 233, + 233, + 1 + ], + [ + 1182, + 237, + 3 + ], + [ + 1736, + 635, + 2 + ], + [ + 193, + 555, + 2 + ], + [ + 1271, + 275, + 4 + ], + [ + 415, + 230, + 3 + ], + [ + 388, + 256, + 2 + ], + [ + 801, + 267, + 2 + ], + [ + 723, + 1002, + 1 + ], + [ + 241, + 531, + 2 + ], + [ + 241, + 532, + 2 + ], + [ + 1071, + 281, + 4 + ], + [ + 318, + 318, + 6 + ], + [ + 328, + 259, + 2 + ], + [ + 1225, + 244, + 1 + ], + [ + 435, + 1026, + 2 + ], + [ + 1035, + 479, + 6 + ], + [ + 72, + 695, + 1 + ], + [ + 897, + 267, + 2 + ], + [ + 381, + 611, + 2 + ], + [ + 344, + 219, + 2 + ], + [ + 534, + 514, + 2 + ], + [ + 430, + 430, + 3 + ], + [ + 459, + 375, + 2 + ], + [ + 234, + 217, + 2 + ], + [ + 464, + 724, + 2 + ], + [ + 1256, + 399, + 1 + ], + [ + 807, + 807, + 1 + ], + [ + 382, + 368, + 3 + ], + [ + 841, + 841, + 2 + ], + [ + 624, + 349, + 2 + ], + [ + 409, + 409, + 4 + ], + [ + 1025, + 560, + 4 + ], + [ + 176, + 278, + 2 + ], + [ + 63, + 283, + 1 + ], + [ + 174, + 280, + 2 + ], + [ + 1023, + 1023, + 2 + ], + [ + 206, + 206, + 1 + ], + [ + 277, + 294, + 2 + ], + [ + 329, + 706, + 2 + ], + [ + 361, + 361, + 1 + ], + [ + 424, + 417, + 2 + ], + [ + 30, + 31, + 1 + ], + [ + 188, + 513, + 2 + ], + [ + 396, + 214, + 2 + ], + [ + 1035, + 449, + 6 + ], + [ + 271, + 216, + 2 + ], + [ + 70, + 475, + 1 + ], + [ + 669, + 364, + 2 + ], + [ + 1022, + 1022, + 2 + ], + [ + 1025, + 567, + 4 + ], + [ + 276, + 511, + 2 + ], + [ + 317, + 463, + 2 + ], + [ + 301, + 204, + 2 + ], + [ + 1039, + 1117, + 4 + ], + [ + 1051, + 217, + 1 + ], + [ + 1028, + 414, + 5 + ], + [ + 371, + 407, + 2 + ], + [ + 393, + 417, + 2 + ], + [ + 304, + 313, + 2 + ], + [ + 188, + 648, + 2 + ], + [ + 337, + 373, + 1 + ], + [ + 515, + 362, + 2 + ], + [ + 413, + 413, + 3 + ], + [ + 1066, + 246, + 6 + ], + [ + 541, + 236, + 2 + ], + [ + 229, + 234, + 4 + ], + [ + 273, + 426, + 2 + ], + [ + 232, + 1240, + 1 + ], + [ + 1030, + 435, + 1 + ], + [ + 285, + 429, + 1 + ], + [ + 803, + 267, + 2 + ], + [ + 1099, + 230, + 5 + ], + [ + 537, + 602, + 2 + ], + [ + 547, + 338, + 2 + ], + [ + 367, + 412, + 2 + ], + [ + 1044, + 259, + 4 + ], + [ + 668, + 996, + 1 + ], + [ + 521, + 275, + 2 + ], + [ + 1332, + 369, + 4 + ], + [ + 1647, + 28, + 2 + ], + [ + 1033, + 347, + 6 + ], + [ + 327, + 259, + 2 + ], + [ + 390, + 352, + 2 + ], + [ + 536, + 417, + 2 + ], + [ + 188, + 201, + 2 + ], + [ + 1218, + 281, + 7 + ], + [ + 471, + 471, + 4 + ], + [ + 1041, + 196, + 2 + ], + [ + 1071, + 284, + 2 + ], + [ + 185, + 200, + 1 + ], + [ + 231, + 198, + 2 + ], + [ + 596, + 931, + 1 + ], + [ + 723, + 100, + 1 + ], + [ + 972, + 634, + 1 + ], + [ + 1030, + 1133, + 5 + ], + [ + 1071, + 281, + 2 + ], + [ + 726, + 328, + 2 + ], + [ + 272, + 388, + 2 + ], + [ + 570, + 775, + 1 + ], + [ + 592, + 71, + 1 + ], + [ + 638, + 638, + 3 + ], + [ + 883, + 883, + 2 + ], + [ + 1693, + 59, + 2 + ], + [ + 201, + 1049, + 2 + ], + [ + 394, + 434, + 2 + ], + [ + 196, + 267, + 2 + ], + [ + 501, + 228, + 2 + ], + [ + 190, + 216, + 2 + ], + [ + 190, + 769, + 2 + ], + [ + 256, + 552, + 2 + ], + [ + 298, + 298, + 4 + ], + [ + 595, + 595, + 2 + ], + [ + 261, + 449, + 2 + ], + [ + 264, + 498, + 1 + ], + [ + 642, + 310, + 2 + ], + [ + 955, + 503, + 2 + ], + [ + 64, + 283, + 1 + ], + [ + 304, + 304, + 1 + ], + [ + 1039, + 362, + 4 + ], + [ + 62, + 786, + 1 + ], + [ + 260, + 468, + 2 + ], + [ + 497, + 268, + 2 + ], + [ + 1030, + 441, + 1 + ], + [ + 689, + 689, + 3 + ], + [ + 1280, + 228, + 4 + ], + [ + 256, + 670, + 2 + ], + [ + 350, + 214, + 2 + ], + [ + 65, + 205, + 1 + ], + [ + 1075, + 379, + 4 + ], + [ + 176, + 280, + 2 + ], + [ + 363, + 605, + 2 + ], + [ + 403, + 1026, + 2 + ], + [ + 377, + 355, + 2 + ], + [ + 267, + 1046, + 2 + ], + [ + 1044, + 248, + 4 + ], + [ + 1231, + 300, + 1 + ], + [ + 107, + 908, + 1 + ], + [ + 539, + 539, + 2 + ], + [ + 441, + 277, + 2 + ], + [ + 276, + 250, + 2 + ], + [ + 316, + 316, + 6 + ], + [ + 521, + 294, + 2 + ], + [ + 487, + 593, + 2 + ], + [ + 1085, + 1077, + 2 + ], + [ + 543, + 543, + 3 + ], + [ + 1509, + 208, + 4 + ], + [ + 581, + 296, + 2 + ], + [ + 379, + 269, + 2 + ], + [ + 406, + 747, + 2 + ], + [ + 1118, + 193, + 1 + ], + [ + 188, + 322, + 2 + ], + [ + 195, + 244, + 1 + ], + [ + 1058, + 1036, + 4 + ], + [ + 1392, + 448, + 4 + ], + [ + 346, + 346, + 4 + ], + [ + 642, + 442, + 2 + ], + [ + 265, + 196, + 2 + ], + [ + 1030, + 1122, + 5 + ], + [ + 1058, + 1164, + 4 + ], + [ + 324, + 301, + 1 + ], + [ + 345, + 214, + 2 + ], + [ + 383, + 384, + 2 + ], + [ + 625, + 625, + 3 + ], + [ + 702, + 702, + 3 + ], + [ + 429, + 285, + 2 + ], + [ + 928, + 928, + 2 + ], + [ + 1346, + 247, + 6 + ], + [ + 1044, + 247, + 4 + ], + [ + 356, + 380, + 2 + ], + [ + 381, + 476, + 2 + ], + [ + 409, + 1026, + 2 + ], + [ + 639, + 639, + 3 + ], + [ + 257, + 312, + 2 + ], + [ + 385, + 360, + 3 + ], + [ + 1283, + 280, + 4 + ], + [ + 920, + 920, + 2 + ], + [ + 1031, + 1274, + 1 + ], + [ + 272, + 449, + 2 + ], + [ + 363, + 593, + 2 + ], + [ + 757, + 483, + 2 + ], + [ + 1031, + 1157, + 3 + ], + [ + 1047, + 1078, + 1 + ], + [ + 1015, + 597, + 1 + ], + [ + 401, + 295, + 2 + ], + [ + 239, + 330, + 2 + ], + [ + 378, + 526, + 2 + ], + [ + 400, + 445, + 2 + ], + [ + 67, + 1251, + 1 + ], + [ + 423, + 1056, + 2 + ], + [ + 613, + 908, + 1 + ], + [ + 1035, + 453, + 6 + ], + [ + 256, + 269, + 2 + ], + [ + 447, + 1026, + 2 + ], + [ + 1430, + 442, + 4 + ], + [ + 1045, + 202, + 3 + ], + [ + 478, + 647, + 1 + ], + [ + 230, + 299, + 5 + ], + [ + 249, + 690, + 2 + ], + [ + 919, + 919, + 2 + ], + [ + 190, + 228, + 2 + ], + [ + 967, + 967, + 2 + ], + [ + 418, + 561, + 1 + ], + [ + 307, + 318, + 2 + ], + [ + 573, + 573, + 3 + ], + [ + 941, + 941, + 2 + ], + [ + 1033, + 325, + 6 + ], + [ + 174, + 1026, + 2 + ], + [ + 435, + 284, + 2 + ], + [ + 237, + 212, + 2 + ], + [ + 260, + 1038, + 2 + ], + [ + 615, + 615, + 3 + ], + [ + 1035, + 353, + 6 + ], + [ + 308, + 226, + 2 + ], + [ + 1030, + 1122, + 3 + ], + [ + 510, + 961, + 2 + ], + [ + 1274, + 1031, + 1 + ], + [ + 1033, + 348, + 6 + ], + [ + 467, + 228, + 2 + ], + [ + 201, + 1036, + 2 + ], + [ + 301, + 324, + 2 + ], + [ + 421, + 1056, + 2 + ], + [ + 349, + 1112, + 2 + ], + [ + 1027, + 1202, + 1 + ], + [ + 1134, + 327, + 2 + ], + [ + 1050, + 188, + 6 + ], + [ + 1276, + 261, + 4 + ], + [ + 201, + 412, + 2 + ], + [ + 1075, + 388, + 4 + ], + [ + 255, + 259, + 2 + ], + [ + 459, + 718, + 2 + ], + [ + 498, + 292, + 2 + ], + [ + 1041, + 370, + 2 + ], + [ + 246, + 1057, + 2 + ], + [ + 345, + 248, + 2 + ], + [ + 419, + 1313, + 1 + ], + [ + 614, + 1036, + 2 + ], + [ + 575, + 174, + 4 + ], + [ + 1304, + 226, + 4 + ], + [ + 1148, + 1103, + 2 + ], + [ + 217, + 1138, + 2 + ], + [ + 266, + 500, + 1 + ], + [ + 445, + 400, + 2 + ], + [ + 541, + 370, + 2 + ], + [ + 235, + 313, + 5 + ], + [ + 339, + 528, + 2 + ], + [ + 202, + 591, + 2 + ], + [ + 350, + 254, + 2 + ], + [ + 603, + 278, + 2 + ], + [ + 1028, + 401, + 3 + ], + [ + 1555, + 391, + 4 + ], + [ + 715, + 376, + 2 + ], + [ + 217, + 583, + 2 + ], + [ + 1155, + 210, + 1 + ], + [ + 553, + 553, + 1 + ], + [ + 556, + 556, + 4 + ], + [ + 771, + 332, + 2 + ], + [ + 288, + 472, + 2 + ], + [ + 1051, + 322, + 6 + ], + [ + 253, + 469, + 2 + ], + [ + 338, + 262, + 2 + ], + [ + 1356, + 248, + 6 + ], + [ + 1415, + 326, + 1 + ], + [ + 1619, + 102, + 2 + ], + [ + 441, + 1026, + 2 + ], + [ + 478, + 659, + 1 + ], + [ + 330, + 239, + 1 + ], + [ + 200, + 568, + 2 + ], + [ + 304, + 229, + 5 + ], + [ + 349, + 1253, + 2 + ], + [ + 474, + 474, + 5 + ], + [ + 176, + 281, + 2 + ], + [ + 285, + 530, + 2 + ], + [ + 1553, + 389, + 4 + ], + [ + 71, + 592, + 1 + ], + [ + 1134, + 328, + 2 + ], + [ + 881, + 881, + 2 + ], + [ + 242, + 225, + 1 + ], + [ + 299, + 264, + 1 + ], + [ + 317, + 317, + 6 + ], + [ + 244, + 434, + 2 + ], + [ + 268, + 268, + 5 + ], + [ + 734, + 734, + 2 + ], + [ + 190, + 754, + 2 + ], + [ + 300, + 580, + 2 + ], + [ + 1064, + 1242, + 3 + ], + [ + 477, + 477, + 5 + ], + [ + 956, + 956, + 2 + ], + [ + 379, + 426, + 2 + ], + [ + 188, + 655, + 2 + ], + [ + 1252, + 281, + 6 + ], + [ + 235, + 247, + 2 + ], + [ + 1355, + 318, + 4 + ], + [ + 312, + 273, + 2 + ], + [ + 464, + 665, + 2 + ], + [ + 612, + 328, + 2 + ], + [ + 1030, + 1128, + 5 + ], + [ + 559, + 176, + 4 + ], + [ + 235, + 324, + 2 + ], + [ + 402, + 214, + 2 + ], + [ + 70, + 508, + 1 + ], + [ + 219, + 353, + 2 + ], + [ + 456, + 269, + 2 + ], + [ + 1617, + 105, + 2 + ], + [ + 110, + 884, + 1 + ], + [ + 187, + 187, + 2 + ], + [ + 236, + 518, + 2 + ], + [ + 1053, + 365, + 4 + ], + [ + 245, + 258, + 3 + ], + [ + 1025, + 523, + 4 + ], + [ + 1071, + 275, + 2 + ], + [ + 1437, + 434, + 4 + ], + [ + 429, + 589, + 2 + ], + [ + 1030, + 1200, + 3 + ], + [ + 16, + 1503, + 1 + ], + [ + 63, + 1121, + 1 + ], + [ + 459, + 369, + 2 + ], + [ + 658, + 658, + 3 + ], + [ + 1030, + 1133, + 3 + ], + [ + 2019, + 21, + 2 + ], + [ + 246, + 265, + 1 + ], + [ + 272, + 562, + 2 + ], + [ + 571, + 571, + 3 + ], + [ + 1025, + 525, + 4 + ], + [ + 1047, + 1262, + 5 + ], + [ + 1200, + 1030, + 1 + ], + [ + 2411, + 181, + 4 + ], + [ + 204, + 386, + 2 + ], + [ + 521, + 674, + 2 + ], + [ + 354, + 240, + 2 + ], + [ + 1027, + 1040, + 3 + ], + [ + 461, + 271, + 2 + ], + [ + 1094, + 1039, + 5 + ], + [ + 257, + 384, + 2 + ], + [ + 288, + 516, + 2 + ], + [ + 309, + 225, + 2 + ], + [ + 409, + 277, + 2 + ], + [ + 515, + 279, + 2 + ], + [ + 1290, + 597, + 2 + ], + [ + 254, + 217, + 1 + ], + [ + 1939, + 679, + 2 + ], + [ + 480, + 130, + 2 + ], + [ + 1593, + 75, + 2 + ], + [ + 176, + 1026, + 2 + ], + [ + 296, + 455, + 2 + ], + [ + 63, + 1264, + 1 + ], + [ + 946, + 946, + 2 + ], + [ + 1030, + 1127, + 5 + ], + [ + 699, + 699, + 3 + ], + [ + 937, + 937, + 2 + ], + [ + 1388, + 637, + 1 + ], + [ + 255, + 364, + 2 + ], + [ + 301, + 505, + 3 + ], + [ + 393, + 387, + 2 + ], + [ + 209, + 209, + 4 + ], + [ + 620, + 620, + 3 + ], + [ + 1167, + 1167, + 4 + ], + [ + 246, + 1051, + 2 + ], + [ + 697, + 697, + 3 + ], + [ + 1035, + 190, + 3 + ], + [ + 241, + 249, + 2 + ], + [ + 307, + 493, + 3 + ], + [ + 439, + 1055, + 2 + ], + [ + 219, + 341, + 2 + ], + [ + 1282, + 1585, + 2 + ], + [ + 622, + 338, + 2 + ], + [ + 1030, + 1127, + 3 + ], + [ + 691, + 601, + 1 + ], + [ + 1068, + 1416, + 1 + ], + [ + 358, + 1029, + 2 + ], + [ + 237, + 371, + 2 + ], + [ + 461, + 244, + 2 + ], + [ + 572, + 294, + 2 + ], + [ + 1308, + 1308, + 2 + ], + [ + 350, + 247, + 2 + ], + [ + 1031, + 1220, + 3 + ], + [ + 1192, + 1192, + 4 + ], + [ + 822, + 822, + 3 + ], + [ + 269, + 456, + 2 + ], + [ + 430, + 1331, + 1 + ], + [ + 1267, + 561, + 1 + ], + [ + 67, + 1198, + 1 + ], + [ + 259, + 357, + 2 + ], + [ + 335, + 335, + 4 + ], + [ + 1025, + 552, + 4 + ], + [ + 193, + 607, + 2 + ], + [ + 407, + 68, + 1 + ], + [ + 343, + 540, + 2 + ], + [ + 458, + 1026, + 2 + ], + [ + 1033, + 327, + 6 + ], + [ + 57, + 57, + 1 + ], + [ + 240, + 247, + 2 + ], + [ + 265, + 254, + 2 + ], + [ + 280, + 275, + 2 + ], + [ + 354, + 469, + 2 + ], + [ + 675, + 357, + 2 + ], + [ + 199, + 225, + 2 + ], + [ + 619, + 619, + 3 + ], + [ + 1602, + 551, + 4 + ], + [ + 299, + 267, + 2 + ], + [ + 340, + 340, + 7 + ], + [ + 405, + 490, + 2 + ], + [ + 796, + 796, + 2 + ], + [ + 342, + 316, + 1 + ], + [ + 230, + 234, + 4 + ], + [ + 922, + 922, + 2 + ], + [ + 378, + 526, + 1 + ], + [ + 175, + 278, + 2 + ], + [ + 500, + 266, + 1 + ], + [ + 174, + 284, + 2 + ], + [ + 188, + 246, + 1 + ], + [ + 737, + 1312, + 1 + ], + [ + 310, + 231, + 2 + ], + [ + 355, + 253, + 3 + ], + [ + 671, + 963, + 2 + ], + [ + 1031, + 1059, + 1 + ], + [ + 282, + 278, + 2 + ], + [ + 1177, + 1177, + 4 + ], + [ + 447, + 275, + 2 + ], + [ + 273, + 567, + 2 + ], + [ + 370, + 541, + 2 + ], + [ + 497, + 437, + 2 + ], + [ + 193, + 565, + 2 + ], + [ + 176, + 314, + 2 + ], + [ + 717, + 717, + 2 + ], + [ + 654, + 327, + 2 + ], + [ + 1058, + 339, + 4 + ], + [ + 1250, + 243, + 1 + ], + [ + 296, + 435, + 2 + ], + [ + 979, + 538, + 2 + ], + [ + 174, + 281, + 2 + ], + [ + 1048, + 1081, + 1 + ], + [ + 1042, + 343, + 2 + ], + [ + 254, + 265, + 2 + ], + [ + 308, + 226, + 1 + ], + [ + 221, + 292, + 2 + ], + [ + 594, + 307, + 2 + ], + [ + 1386, + 371, + 4 + ], + [ + 458, + 260, + 2 + ], + [ + 193, + 278, + 2 + ], + [ + 390, + 249, + 2 + ], + [ + 479, + 479, + 5 + ], + [ + 499, + 499, + 5 + ], + [ + 973, + 973, + 2 + ], + [ + 1125, + 1125, + 2 + ], + [ + 304, + 267, + 2 + ], + [ + 350, + 246, + 2 + ], + [ + 374, + 258, + 3 + ], + [ + 1406, + 416, + 1 + ], + [ + 262, + 334, + 2 + ], + [ + 352, + 1297, + 2 + ], + [ + 1028, + 414, + 3 + ], + [ + 235, + 299, + 1 + ], + [ + 190, + 779, + 2 + ], + [ + 376, + 250, + 2 + ], + [ + 1195, + 1195, + 4 + ], + [ + 174, + 251, + 2 + ], + [ + 270, + 270, + 7 + ], + [ + 519, + 320, + 3 + ], + [ + 196, + 397, + 2 + ], + [ + 669, + 442, + 2 + ], + [ + 1031, + 1153, + 1 + ], + [ + 1035, + 491, + 6 + ], + [ + 306, + 452, + 2 + ], + [ + 476, + 1055, + 2 + ], + [ + 482, + 279, + 2 + ], + [ + 578, + 692, + 2 + ], + [ + 623, + 1036, + 2 + ], + [ + 1054, + 1082, + 4 + ], + [ + 354, + 289, + 2 + ], + [ + 785, + 785, + 3 + ], + [ + 232, + 382, + 1 + ], + [ + 398, + 561, + 1 + ], + [ + 531, + 531, + 4 + ], + [ + 912, + 912, + 2 + ], + [ + 237, + 69, + 2 + ], + [ + 288, + 483, + 2 + ], + [ + 396, + 528, + 2 + ], + [ + 443, + 443, + 6 + ], + [ + 524, + 346, + 1 + ], + [ + 984, + 984, + 2 + ], + [ + 253, + 328, + 3 + ], + [ + 587, + 587, + 3 + ], + [ + 1030, + 447, + 5 + ], + [ + 213, + 213, + 4 + ], + [ + 357, + 259, + 2 + ], + [ + 450, + 450, + 3 + ], + [ + 628, + 334, + 2 + ], + [ + 942, + 111, + 1 + ], + [ + 1030, + 403, + 5 + ], + [ + 972, + 103, + 1 + ], + [ + 1049, + 1029, + 4 + ], + [ + 696, + 252, + 2 + ], + [ + 522, + 275, + 2 + ], + [ + 257, + 254, + 2 + ], + [ + 352, + 577, + 2 + ], + [ + 358, + 245, + 2 + ], + [ + 1111, + 70, + 3 + ], + [ + 1136, + 70, + 2 + ], + [ + 1951, + 162, + 4 + ], + [ + 18, + 1503, + 1 + ], + [ + 402, + 439, + 2 + ], + [ + 576, + 576, + 3 + ], + [ + 414, + 273, + 2 + ], + [ + 1281, + 205, + 1 + ], + [ + 65, + 1198, + 1 + ], + [ + 193, + 400, + 2 + ], + [ + 372, + 372, + 4 + ], + [ + 277, + 1038, + 2 + ], + [ + 404, + 217, + 2 + ], + [ + 532, + 532, + 4 + ], + [ + 190, + 670, + 2 + ], + [ + 239, + 323, + 2 + ], + [ + 226, + 308, + 1 + ], + [ + 590, + 301, + 2 + ], + [ + 872, + 872, + 1 + ], + [ + 1269, + 245, + 4 + ], + [ + 236, + 496, + 2 + ], + [ + 236, + 527, + 2 + ], + [ + 431, + 388, + 2 + ], + [ + 304, + 503, + 3 + ], + [ + 318, + 307, + 1 + ], + [ + 1471, + 319, + 1 + ], + [ + 232, + 382, + 2 + ], + [ + 288, + 470, + 2 + ], + [ + 304, + 264, + 1 + ], + [ + 481, + 386, + 1 + ], + [ + 1047, + 174, + 2 + ], + [ + 204, + 301, + 2 + ], + [ + 433, + 419, + 1 + ], + [ + 418, + 1319, + 1 + ], + [ + 1352, + 324, + 4 + ], + [ + 16, + 996, + 1 + ], + [ + 321, + 1174, + 1 + ], + [ + 360, + 360, + 5 + ], + [ + 461, + 394, + 2 + ], + [ + 418, + 636, + 1 + ], + [ + 547, + 536, + 2 + ], + [ + 262, + 363, + 2 + ], + [ + 761, + 332, + 2 + ], + [ + 506, + 833, + 2 + ], + [ + 1218, + 296, + 7 + ], + [ + 315, + 242, + 2 + ], + [ + 464, + 285, + 2 + ], + [ + 190, + 750, + 2 + ], + [ + 214, + 1040, + 2 + ], + [ + 271, + 383, + 3 + ], + [ + 333, + 259, + 2 + ], + [ + 266, + 307, + 2 + ], + [ + 816, + 412, + 2 + ], + [ + 716, + 472, + 2 + ], + [ + 1077, + 67, + 3 + ], + [ + 399, + 241, + 1 + ], + [ + 666, + 666, + 3 + ], + [ + 214, + 217, + 2 + ], + [ + 322, + 363, + 2 + ], + [ + 266, + 301, + 2 + ], + [ + 564, + 564, + 4 + ], + [ + 366, + 1024, + 2 + ], + [ + 704, + 704, + 3 + ], + [ + 733, + 733, + 2 + ], + [ + 1003, + 73, + 1 + ], + [ + 257, + 380, + 2 + ], + [ + 422, + 585, + 1 + ], + [ + 974, + 505, + 2 + ], + [ + 1027, + 1053, + 1 + ], + [ + 1128, + 1030, + 1 + ], + [ + 813, + 813, + 2 + ], + [ + 167, + 167, + 2 + ], + [ + 542, + 542, + 2 + ], + [ + 1798, + 206, + 2 + ], + [ + 320, + 264, + 1 + ], + [ + 14, + 13, + 1 + ], + [ + 438, + 887, + 2 + ], + [ + 1438, + 417, + 4 + ], + [ + 1558, + 209, + 4 + ], + [ + 353, + 219, + 2 + ], + [ + 1584, + 411, + 4 + ], + [ + 71, + 695, + 1 + ], + [ + 250, + 377, + 2 + ], + [ + 265, + 1054, + 2 + ], + [ + 344, + 344, + 7 + ], + [ + 1025, + 341, + 4 + ], + [ + 631, + 631, + 3 + ], + [ + 894, + 894, + 2 + ], + [ + 1083, + 1083, + 2 + ], + [ + 590, + 391, + 2 + ], + [ + 266, + 324, + 2 + ], + [ + 234, + 318, + 5 + ], + [ + 422, + 440, + 1 + ], + [ + 295, + 370, + 3 + ], + [ + 193, + 639, + 2 + ], + [ + 68, + 1100, + 2 + ], + [ + 310, + 231, + 1 + ], + [ + 342, + 316, + 2 + ], + [ + 235, + 230, + 5 + ], + [ + 262, + 338, + 2 + ], + [ + 559, + 176, + 3 + ], + [ + 960, + 960, + 2 + ], + [ + 253, + 517, + 2 + ], + [ + 448, + 706, + 2 + ], + [ + 875, + 875, + 3 + ], + [ + 312, + 426, + 2 + ], + [ + 501, + 501, + 5 + ], + [ + 345, + 247, + 2 + ], + [ + 660, + 760, + 1 + ], + [ + 1782, + 17, + 2 + ], + [ + 589, + 429, + 1 + ], + [ + 916, + 916, + 2 + ], + [ + 251, + 1086, + 2 + ], + [ + 188, + 1057, + 2 + ], + [ + 237, + 212, + 1 + ], + [ + 1048, + 1266, + 5 + ], + [ + 314, + 431, + 2 + ], + [ + 1747, + 72, + 1 + ], + [ + 1039, + 329, + 4 + ], + [ + 361, + 255, + 2 + ], + [ + 309, + 413, + 2 + ], + [ + 572, + 281, + 2 + ], + [ + 1224, + 1224, + 1 + ], + [ + 299, + 512, + 3 + ], + [ + 1094, + 322, + 6 + ], + [ + 486, + 486, + 4 + ], + [ + 786, + 786, + 1 + ], + [ + 176, + 175, + 2 + ], + [ + 254, + 214, + 1 + ], + [ + 386, + 481, + 1 + ], + [ + 430, + 588, + 1 + ], + [ + 1044, + 246, + 4 + ], + [ + 185, + 199, + 1 + ], + [ + 606, + 606, + 1 + ], + [ + 459, + 255, + 2 + ], + [ + 693, + 693, + 3 + ], + [ + 1267, + 586, + 1 + ], + [ + 64, + 1116, + 2 + ], + [ + 794, + 679, + 1 + ], + [ + 235, + 389, + 2 + ], + [ + 327, + 248, + 3 + ], + [ + 628, + 485, + 2 + ], + [ + 476, + 863, + 2 + ], + [ + 2163, + 29, + 2 + ], + [ + 1011, + 1011, + 1 + ], + [ + 1793, + 634, + 2 + ], + [ + 348, + 348, + 1 + ], + [ + 513, + 267, + 2 + ], + [ + 1030, + 1128, + 3 + ], + [ + 1031, + 376, + 1 + ], + [ + 249, + 880, + 2 + ], + [ + 110, + 597, + 1 + ], + [ + 256, + 353, + 2 + ], + [ + 460, + 284, + 2 + ], + [ + 608, + 608, + 3 + ], + [ + 637, + 597, + 1 + ], + [ + 271, + 530, + 2 + ], + [ + 1172, + 284, + 5 + ], + [ + 99, + 1529, + 1 + ], + [ + 223, + 223, + 1 + ], + [ + 428, + 264, + 1 + ], + [ + 407, + 69, + 1 + ], + [ + 1218, + 294, + 7 + ], + [ + 266, + 204, + 2 + ], + [ + 136, + 136, + 2 + ], + [ + 300, + 227, + 2 + ], + [ + 394, + 485, + 2 + ], + [ + 767, + 698, + 2 + ], + [ + 296, + 474, + 2 + ], + [ + 402, + 537, + 2 + ], + [ + 359, + 322, + 2 + ], + [ + 1260, + 1260, + 1 + ], + [ + 272, + 401, + 2 + ], + [ + 594, + 389, + 2 + ], + [ + 183, + 183, + 2 + ], + [ + 475, + 71, + 1 + ], + [ + 1166, + 1166, + 4 + ], + [ + 1042, + 1317, + 2 + ], + [ + 219, + 351, + 2 + ], + [ + 423, + 384, + 2 + ], + [ + 63, + 1400, + 1 + ], + [ + 1028, + 273, + 7 + ], + [ + 234, + 229, + 5 + ], + [ + 256, + 1089, + 2 + ], + [ + 272, + 431, + 2 + ], + [ + 508, + 577, + 2 + ], + [ + 1282, + 1139, + 2 + ], + [ + 325, + 574, + 2 + ], + [ + 812, + 812, + 3 + ], + [ + 240, + 253, + 3 + ], + [ + 455, + 455, + 3 + ], + [ + 438, + 635, + 2 + ], + [ + 534, + 322, + 2 + ], + [ + 246, + 217, + 1 + ], + [ + 365, + 1024, + 2 + ], + [ + 325, + 612, + 2 + ], + [ + 492, + 964, + 2 + ], + [ + 1028, + 1052, + 1 + ], + [ + 251, + 1096, + 3 + ], + [ + 387, + 393, + 2 + ], + [ + 688, + 688, + 3 + ], + [ + 1053, + 366, + 4 + ], + [ + 260, + 372, + 2 + ], + [ + 300, + 398, + 2 + ], + [ + 395, + 268, + 2 + ], + [ + 277, + 474, + 2 + ], + [ + 307, + 230, + 5 + ], + [ + 403, + 284, + 2 + ], + [ + 514, + 806, + 2 + ], + [ + 947, + 947, + 2 + ], + [ + 295, + 401, + 2 + ], + [ + 420, + 292, + 1 + ], + [ + 334, + 644, + 2 + ], + [ + 438, + 902, + 2 + ], + [ + 797, + 432, + 2 + ], + [ + 1042, + 1464, + 2 + ], + [ + 324, + 301, + 2 + ], + [ + 444, + 596, + 1 + ], + [ + 390, + 316, + 2 + ], + [ + 174, + 546, + 5 + ], + [ + 217, + 655, + 2 + ], + [ + 714, + 714, + 3 + ], + [ + 216, + 405, + 2 + ], + [ + 810, + 434, + 2 + ], + [ + 260, + 176, + 2 + ], + [ + 345, + 254, + 2 + ], + [ + 1035, + 477, + 6 + ], + [ + 194, + 68, + 2 + ], + [ + 320, + 234, + 5 + ], + [ + 1029, + 196, + 4 + ], + [ + 250, + 314, + 2 + ], + [ + 280, + 343, + 3 + ], + [ + 383, + 383, + 5 + ], + [ + 246, + 188, + 1 + ], + [ + 358, + 289, + 2 + ], + [ + 630, + 294, + 2 + ], + [ + 1088, + 409, + 4 + ], + [ + 313, + 235, + 5 + ], + [ + 1393, + 1121, + 2 + ], + [ + 269, + 453, + 1 + ], + [ + 403, + 275, + 2 + ], + [ + 210, + 317, + 1 + ], + [ + 309, + 309, + 4 + ], + [ + 174, + 175, + 2 + ], + [ + 175, + 174, + 2 + ], + [ + 403, + 435, + 2 + ], + [ + 1033, + 328, + 6 + ], + [ + 190, + 705, + 2 + ], + [ + 192, + 181, + 1 + ], + [ + 422, + 584, + 1 + ], + [ + 229, + 248, + 2 + ], + [ + 303, + 303, + 3 + ], + [ + 491, + 491, + 5 + ], + [ + 652, + 652, + 4 + ], + [ + 258, + 374, + 3 + ], + [ + 777, + 265, + 2 + ], + [ + 1063, + 1107, + 4 + ], + [ + 1447, + 1031, + 1 + ], + [ + 258, + 327, + 3 + ], + [ + 347, + 511, + 2 + ], + [ + 409, + 441, + 2 + ], + [ + 188, + 623, + 2 + ], + [ + 380, + 523, + 2 + ], + [ + 743, + 743, + 2 + ], + [ + 217, + 648, + 2 + ], + [ + 1028, + 272, + 7 + ], + [ + 518, + 518, + 5 + ], + [ + 1290, + 1290, + 2 + ], + [ + 551, + 502, + 1 + ], + [ + 176, + 270, + 2 + ], + [ + 523, + 380, + 2 + ], + [ + 150, + 150, + 2 + ], + [ + 307, + 265, + 2 + ], + [ + 1038, + 1118, + 3 + ], + [ + 410, + 1123, + 1 + ], + [ + 239, + 231, + 1 + ], + [ + 1004, + 1004, + 2 + ], + [ + 236, + 559, + 2 + ], + [ + 295, + 477, + 2 + ], + [ + 617, + 617, + 3 + ], + [ + 229, + 304, + 5 + ], + [ + 386, + 204, + 2 + ], + [ + 866, + 463, + 2 + ], + [ + 604, + 276, + 2 + ], + [ + 1041, + 351, + 2 + ], + [ + 616, + 616, + 3 + ], + [ + 1310, + 1565, + 2 + ], + [ + 591, + 591, + 3 + ], + [ + 1042, + 1268, + 2 + ], + [ + 210, + 1155, + 1 + ], + [ + 350, + 248, + 2 + ], + [ + 948, + 948, + 2 + ], + [ + 1046, + 1051, + 1 + ], + [ + 254, + 188, + 1 + ], + [ + 320, + 519, + 3 + ], + [ + 466, + 1641, + 1 + ], + [ + 234, + 391, + 4 + ], + [ + 66, + 335, + 1 + ], + [ + 409, + 260, + 2 + ], + [ + 273, + 453, + 2 + ], + [ + 366, + 267, + 2 + ], + [ + 371, + 237, + 1 + ], + [ + 1041, + 456, + 2 + ], + [ + 161, + 161, + 2 + ], + [ + 221, + 197, + 2 + ], + [ + 176, + 174, + 4 + ], + [ + 283, + 232, + 3 + ], + [ + 396, + 1058, + 2 + ], + [ + 774, + 265, + 2 + ], + [ + 1298, + 413, + 4 + ], + [ + 201, + 288, + 1 + ], + [ + 324, + 204, + 2 + ], + [ + 728, + 728, + 2 + ], + [ + 433, + 582, + 1 + ], + [ + 387, + 552, + 2 + ], + [ + 341, + 219, + 2 + ], + [ + 573, + 267, + 2 + ], + [ + 239, + 446, + 1 + ], + [ + 768, + 768, + 3 + ], + [ + 1025, + 344, + 4 + ], + [ + 316, + 342, + 1 + ], + [ + 526, + 373, + 2 + ], + [ + 570, + 71, + 1 + ], + [ + 819, + 509, + 2 + ], + [ + 1292, + 246, + 6 + ], + [ + 253, + 240, + 3 + ], + [ + 366, + 265, + 2 + ], + [ + 1033, + 188, + 5 + ], + [ + 1075, + 401, + 4 + ], + [ + 251, + 560, + 2 + ], + [ + 362, + 563, + 1 + ], + [ + 763, + 763, + 3 + ], + [ + 357, + 516, + 2 + ], + [ + 365, + 267, + 2 + ], + [ + 388, + 431, + 2 + ], + [ + 404, + 793, + 2 + ], + [ + 72, + 1660, + 1 + ], + [ + 804, + 470, + 2 + ], + [ + 1316, + 257, + 4 + ], + [ + 885, + 471, + 2 + ], + [ + 351, + 529, + 3 + ], + [ + 236, + 575, + 2 + ], + [ + 674, + 674, + 3 + ], + [ + 128, + 129, + 1 + ], + [ + 727, + 727, + 3 + ], + [ + 1237, + 1030, + 1 + ], + [ + 269, + 379, + 2 + ], + [ + 1140, + 1140, + 3 + ], + [ + 259, + 1110, + 2 + ], + [ + 476, + 712, + 2 + ], + [ + 791, + 347, + 2 + ], + [ + 1626, + 415, + 4 + ], + [ + 2134, + 25, + 2 + ], + [ + 296, + 468, + 2 + ], + [ + 498, + 313, + 3 + ], + [ + 460, + 425, + 3 + ], + [ + 190, + 201, + 2 + ], + [ + 271, + 271, + 7 + ], + [ + 277, + 174, + 2 + ], + [ + 343, + 1206, + 3 + ], + [ + 1007, + 1007, + 1 + ], + [ + 1035, + 562, + 6 + ], + [ + 322, + 416, + 2 + ], + [ + 439, + 439, + 4 + ], + [ + 26, + 903, + 1 + ], + [ + 720, + 720, + 3 + ], + [ + 329, + 329, + 1 + ], + [ + 512, + 299, + 3 + ], + [ + 1650, + 109, + 2 + ], + [ + 234, + 391, + 2 + ], + [ + 354, + 1327, + 2 + ], + [ + 1027, + 1227, + 1 + ], + [ + 1309, + 279, + 4 + ], + [ + 4886, + 17, + 1 + ], + [ + 214, + 1044, + 1 + ], + [ + 384, + 361, + 2 + ], + [ + 535, + 535, + 1 + ], + [ + 718, + 339, + 2 + ], + [ + 367, + 249, + 2 + ], + [ + 69, + 1275, + 1 + ], + [ + 273, + 174, + 2 + ], + [ + 667, + 100, + 1 + ], + [ + 1335, + 268, + 4 + ], + [ + 430, + 647, + 1 + ], + [ + 1031, + 1153, + 3 + ], + [ + 260, + 484, + 2 + ], + [ + 581, + 581, + 3 + ], + [ + 643, + 643, + 3 + ], + [ + 1026, + 474, + 4 + ], + [ + 1030, + 458, + 1 + ], + [ + 1792, + 191, + 1 + ], + [ + 4069, + 182, + 1 + ], + [ + 245, + 245, + 6 + ], + [ + 327, + 602, + 2 + ], + [ + 645, + 109, + 1 + ], + [ + 954, + 15, + 1 + ], + [ + 1025, + 618, + 4 + ], + [ + 281, + 174, + 2 + ], + [ + 65, + 64, + 2 + ], + [ + 101, + 102, + 1 + ], + [ + 202, + 696, + 2 + ], + [ + 247, + 1087, + 2 + ], + [ + 361, + 384, + 2 + ], + [ + 949, + 949, + 2 + ], + [ + 1026, + 443, + 4 + ], + [ + 368, + 382, + 2 + ], + [ + 1051, + 262, + 6 + ], + [ + 843, + 579, + 1 + ], + [ + 1105, + 242, + 3 + ], + [ + 325, + 678, + 2 + ], + [ + 493, + 902, + 2 + ], + [ + 151, + 151, + 3 + ], + [ + 280, + 445, + 2 + ], + [ + 1019, + 1019, + 2 + ], + [ + 1040, + 328, + 2 + ], + [ + 1153, + 1031, + 1 + ], + [ + 444, + 1093, + 1 + ], + [ + 1035, + 567, + 6 + ], + [ + 108, + 109, + 1 + ], + [ + 229, + 235, + 4 + ], + [ + 253, + 443, + 2 + ], + [ + 570, + 392, + 2 + ], + [ + 735, + 735, + 3 + ], + [ + 1046, + 334, + 4 + ], + [ + 1221, + 225, + 1 + ], + [ + 1234, + 1030, + 1 + ], + [ + 68, + 407, + 1 + ], + [ + 550, + 598, + 2 + ], + [ + 153, + 154, + 2 + ], + [ + 276, + 214, + 2 + ], + [ + 322, + 285, + 1 + ], + [ + 429, + 589, + 1 + ], + [ + 237, + 371, + 1 + ], + [ + 294, + 482, + 2 + ], + [ + 515, + 369, + 2 + ], + [ + 377, + 377, + 5 + ], + [ + 551, + 502, + 2 + ], + [ + 758, + 758, + 3 + ], + [ + 435, + 435, + 2 + ], + [ + 1028, + 269, + 7 + ], + [ + 1152, + 365, + 7 + ], + [ + 208, + 208, + 4 + ], + [ + 321, + 398, + 2 + ], + [ + 279, + 482, + 2 + ], + [ + 1308, + 634, + 2 + ], + [ + 284, + 1038, + 2 + ], + [ + 294, + 462, + 2 + ], + [ + 730, + 730, + 2 + ], + [ + 691, + 601, + 2 + ], + [ + 695, + 71, + 1 + ], + [ + 292, + 503, + 2 + ], + [ + 340, + 317, + 2 + ], + [ + 184, + 184, + 2 + ], + [ + 236, + 489, + 2 + ], + [ + 273, + 1061, + 2 + ], + [ + 307, + 204, + 2 + ], + [ + 277, + 445, + 2 + ], + [ + 1035, + 560, + 6 + ], + [ + 1325, + 70, + 2 + ], + [ + 685, + 394, + 2 + ], + [ + 231, + 310, + 1 + ], + [ + 349, + 1045, + 2 + ], + [ + 375, + 675, + 2 + ], + [ + 668, + 1382, + 1 + ], + [ + 1030, + 1151, + 5 + ], + [ + 1085, + 66, + 3 + ], + [ + 281, + 176, + 2 + ], + [ + 387, + 632, + 2 + ], + [ + 457, + 1093, + 1 + ], + [ + 107, + 856, + 1 + ], + [ + 568, + 357, + 2 + ], + [ + 281, + 1151, + 2 + ], + [ + 26, + 856, + 1 + ], + [ + 374, + 258, + 1 + ], + [ + 188, + 1024, + 1 + ], + [ + 255, + 201, + 3 + ], + [ + 128, + 745, + 1 + ], + [ + 627, + 710, + 2 + ], + [ + 72, + 1740, + 1 + ], + [ + 199, + 185, + 1 + ], + [ + 296, + 1038, + 2 + ], + [ + 328, + 587, + 2 + ], + [ + 196, + 201, + 3 + ], + [ + 248, + 1055, + 3 + ], + [ + 317, + 340, + 1 + ], + [ + 1026, + 482, + 4 + ], + [ + 246, + 1039, + 2 + ], + [ + 566, + 261, + 2 + ], + [ + 665, + 356, + 2 + ], + [ + 877, + 877, + 2 + ], + [ + 294, + 1038, + 2 + ], + [ + 475, + 371, + 1 + ], + [ + 1049, + 412, + 4 + ], + [ + 1096, + 269, + 1 + ], + [ + 65, + 1116, + 1 + ], + [ + 317, + 342, + 1 + ], + [ + 621, + 319, + 1 + ], + [ + 748, + 748, + 3 + ], + [ + 1080, + 1113, + 4 + ], + [ + 517, + 253, + 2 + ], + [ + 254, + 1036, + 2 + ], + [ + 365, + 265, + 2 + ], + [ + 381, + 406, + 2 + ], + [ + 610, + 411, + 2 + ], + [ + 1193, + 1193, + 4 + ], + [ + 308, + 440, + 2 + ], + [ + 316, + 340, + 1 + ], + [ + 275, + 520, + 2 + ], + [ + 379, + 256, + 2 + ], + [ + 280, + 447, + 2 + ], + [ + 1312, + 1312, + 2 + ], + [ + 282, + 215, + 2 + ], + [ + 1062, + 272, + 4 + ], + [ + 1670, + 722, + 1 + ], + [ + 331, + 331, + 3 + ], + [ + 335, + 204, + 2 + ], + [ + 355, + 355, + 5 + ], + [ + 546, + 228, + 2 + ], + [ + 1882, + 100, + 2 + ], + [ + 1987, + 634, + 1 + ], + [ + 217, + 1171, + 2 + ], + [ + 1647, + 27, + 2 + ], + [ + 193, + 638, + 2 + ], + [ + 421, + 421, + 4 + ], + [ + 611, + 611, + 3 + ], + [ + 1026, + 1118, + 1 + ], + [ + 1031, + 1447, + 1 + ], + [ + 336, + 336, + 3 + ], + [ + 539, + 202, + 2 + ], + [ + 1104, + 256, + 4 + ], + [ + 1031, + 1623, + 1 + ], + [ + 1256, + 1256, + 1 + ], + [ + 1809, + 609, + 4 + ], + [ + 175, + 176, + 2 + ], + [ + 388, + 251, + 2 + ], + [ + 1088, + 403, + 4 + ], + [ + 1629, + 1077, + 4 + ], + [ + 378, + 1191, + 1 + ], + [ + 312, + 1131, + 2 + ], + [ + 325, + 1053, + 2 + ], + [ + 544, + 544, + 4 + ], + [ + 580, + 406, + 2 + ], + [ + 629, + 415, + 2 + ], + [ + 853, + 265, + 2 + ], + [ + 250, + 437, + 1 + ], + [ + 1009, + 1009, + 2 + ], + [ + 360, + 676, + 2 + ], + [ + 453, + 269, + 1 + ], + [ + 540, + 445, + 2 + ], + [ + 188, + 614, + 2 + ], + [ + 490, + 684, + 2 + ], + [ + 205, + 194, + 3 + ], + [ + 254, + 1079, + 2 + ], + [ + 268, + 216, + 1 + ], + [ + 258, + 364, + 3 + ], + [ + 262, + 717, + 2 + ], + [ + 225, + 242, + 1 + ], + [ + 498, + 264, + 1 + ], + [ + 808, + 808, + 3 + ], + [ + 839, + 265, + 2 + ], + [ + 340, + 316, + 1 + ], + [ + 1026, + 445, + 4 + ], + [ + 1035, + 456, + 6 + ], + [ + 299, + 235, + 1 + ], + [ + 1075, + 431, + 4 + ], + [ + 1152, + 366, + 7 + ], + [ + 70, + 392, + 1 + ], + [ + 211, + 189, + 2 + ], + [ + 557, + 176, + 4 + ], + [ + 247, + 1056, + 3 + ], + [ + 138, + 137, + 1 + ], + [ + 441, + 260, + 2 + ], + [ + 443, + 253, + 2 + ], + [ + 288, + 675, + 2 + ], + [ + 174, + 256, + 2 + ], + [ + 262, + 188, + 2 + ], + [ + 293, + 463, + 2 + ], + [ + 485, + 726, + 2 + ], + [ + 234, + 230, + 4 + ], + [ + 342, + 317, + 1 + ], + [ + 709, + 709, + 2 + ], + [ + 312, + 257, + 2 + ], + [ + 516, + 773, + 2 + ], + [ + 862, + 862, + 2 + ], + [ + 1026, + 462, + 4 + ], + [ + 1154, + 283, + 3 + ], + [ + 389, + 600, + 3 + ], + [ + 300, + 227, + 1 + ], + [ + 174, + 462, + 2 + ], + [ + 267, + 1033, + 2 + ], + [ + 333, + 357, + 2 + ], + [ + 755, + 755, + 3 + ], + [ + 68, + 67, + 2 + ], + [ + 738, + 397, + 2 + ], + [ + 1204, + 1204, + 4 + ], + [ + 354, + 249, + 2 + ], + [ + 457, + 586, + 1 + ], + [ + 1031, + 358, + 3 + ], + [ + 736, + 736, + 3 + ], + [ + 384, + 257, + 2 + ], + [ + 210, + 342, + 1 + ], + [ + 405, + 1039, + 2 + ], + [ + 781, + 781, + 3 + ], + [ + 1270, + 444, + 1 + ], + [ + 426, + 379, + 2 + ], + [ + 318, + 500, + 3 + ], + [ + 339, + 537, + 2 + ], + [ + 850, + 509, + 2 + ], + [ + 917, + 352, + 2 + ], + [ + 383, + 271, + 3 + ], + [ + 235, + 324, + 5 + ], + [ + 244, + 195, + 1 + ], + [ + 176, + 272, + 2 + ], + [ + 553, + 487, + 2 + ], + [ + 619, + 619, + 1 + ], + [ + 327, + 574, + 2 + ], + [ + 426, + 251, + 2 + ], + [ + 592, + 481, + 1 + ], + [ + 622, + 476, + 2 + ], + [ + 279, + 601, + 2 + ], + [ + 467, + 467, + 5 + ], + [ + 1227, + 1027, + 1 + ], + [ + 190, + 263, + 2 + ], + [ + 1300, + 390, + 1 + ], + [ + 541, + 449, + 2 + ], + [ + 1027, + 1180, + 3 + ], + [ + 1119, + 1119, + 3 + ], + [ + 246, + 345, + 2 + ], + [ + 259, + 550, + 2 + ], + [ + 424, + 424, + 4 + ], + [ + 558, + 558, + 2 + ], + [ + 499, + 284, + 2 + ], + [ + 1105, + 1771, + 1 + ], + [ + 1324, + 451, + 1 + ], + [ + 176, + 520, + 2 + ], + [ + 216, + 268, + 3 + ], + [ + 276, + 276, + 7 + ], + [ + 290, + 290, + 3 + ], + [ + 896, + 584, + 1 + ], + [ + 210, + 316, + 1 + ], + [ + 1045, + 653, + 6 + ], + [ + 174, + 273, + 2 + ], + [ + 515, + 359, + 2 + ], + [ + 419, + 582, + 1 + ], + [ + 512, + 1017, + 2 + ], + [ + 1049, + 1112, + 4 + ], + [ + 200, + 185, + 1 + ], + [ + 1046, + 338, + 4 + ], + [ + 1013, + 1013, + 2 + ], + [ + 1296, + 256, + 6 + ], + [ + 1076, + 436, + 4 + ], + [ + 1415, + 723, + 1 + ], + [ + 836, + 506, + 2 + ], + [ + 202, + 815, + 2 + ], + [ + 330, + 239, + 2 + ], + [ + 526, + 373, + 1 + ], + [ + 1010, + 1010, + 2 + ], + [ + 1021, + 1021, + 2 + ], + [ + 1042, + 1490, + 2 + ], + [ + 1284, + 240, + 4 + ], + [ + 337, + 524, + 3 + ], + [ + 360, + 753, + 2 + ], + [ + 1477, + 71, + 1 + ], + [ + 538, + 324, + 2 + ], + [ + 565, + 280, + 2 + ], + [ + 1330, + 198, + 4 + ], + [ + 243, + 442, + 2 + ], + [ + 306, + 486, + 2 + ], + [ + 536, + 828, + 2 + ], + [ + 554, + 554, + 4 + ], + [ + 1028, + 426, + 5 + ], + [ + 435, + 275, + 2 + ], + [ + 650, + 328, + 2 + ], + [ + 66, + 1320, + 1 + ], + [ + 259, + 1107, + 2 + ], + [ + 332, + 640, + 2 + ], + [ + 570, + 392, + 1 + ], + [ + 246, + 250, + 2 + ], + [ + 270, + 176, + 2 + ], + [ + 630, + 630, + 2 + ], + [ + 1278, + 1041, + 2 + ], + [ + 202, + 1336, + 2 + ], + [ + 258, + 495, + 2 + ], + [ + 277, + 1122, + 2 + ], + [ + 305, + 1212, + 1 + ], + [ + 1030, + 1234, + 3 + ], + [ + 230, + 247, + 2 + ], + [ + 446, + 585, + 1 + ], + [ + 1031, + 1153, + 5 + ], + [ + 245, + 370, + 3 + ], + [ + 66, + 368, + 1 + ], + [ + 128, + 1736, + 1 + ], + [ + 204, + 307, + 2 + ], + [ + 216, + 268, + 1 + ], + [ + 254, + 1050, + 2 + ], + [ + 351, + 251, + 2 + ], + [ + 1030, + 1151, + 1 + ], + [ + 188, + 257, + 2 + ], + [ + 473, + 473, + 5 + ], + [ + 534, + 530, + 2 + ], + [ + 661, + 470, + 2 + ], + [ + 188, + 707, + 2 + ], + [ + 193, + 270, + 2 + ], + [ + 657, + 657, + 3 + ], + [ + 262, + 1094, + 2 + ], + [ + 1045, + 651, + 6 + ], + [ + 1348, + 596, + 1 + ], + [ + 510, + 756, + 2 + ], + [ + 309, + 430, + 2 + ], + [ + 62, + 898, + 1 + ], + [ + 314, + 1061, + 2 + ], + [ + 503, + 304, + 3 + ], + [ + 72, + 70, + 1 + ], + [ + 1387, + 362, + 4 + ], + [ + 214, + 246, + 1 + ], + [ + 605, + 363, + 2 + ], + [ + 740, + 740, + 2 + ], + [ + 1036, + 375, + 4 + ], + [ + 1104, + 295, + 4 + ], + [ + 1059, + 376, + 4 + ], + [ + 218, + 218, + 1 + ], + [ + 716, + 200, + 2 + ], + [ + 327, + 712, + 2 + ], + [ + 418, + 398, + 1 + ], + [ + 2147, + 137, + 2 + ], + [ + 193, + 681, + 2 + ], + [ + 244, + 195, + 2 + ], + [ + 1114, + 275, + 4 + ], + [ + 174, + 219, + 2 + ], + [ + 1027, + 1185, + 3 + ], + [ + 1030, + 1237, + 3 + ], + [ + 1161, + 280, + 5 + ], + [ + 1267, + 1267, + 1 + ], + [ + 1628, + 506, + 4 + ], + [ + 248, + 507, + 2 + ], + [ + 1044, + 325, + 4 + ], + [ + 328, + 253, + 3 + ], + [ + 360, + 739, + 2 + ], + [ + 615, + 225, + 2 + ], + [ + 669, + 669, + 3 + ], + [ + 272, + 176, + 2 + ], + [ + 388, + 269, + 2 + ], + [ + 396, + 396, + 4 + ], + [ + 475, + 662, + 1 + ], + [ + 1360, + 1027, + 1 + ], + [ + 266, + 1303, + 2 + ], + [ + 358, + 495, + 2 + ], + [ + 1029, + 316, + 4 + ], + [ + 1353, + 440, + 3 + ], + [ + 63, + 1393, + 1 + ], + [ + 485, + 924, + 2 + ], + [ + 510, + 671, + 2 + ], + [ + 403, + 260, + 2 + ], + [ + 626, + 343, + 2 + ], + [ + 783, + 783, + 3 + ], + [ + 1025, + 564, + 4 + ], + [ + 1075, + 414, + 4 + ], + [ + 1035, + 552, + 6 + ], + [ + 226, + 200, + 2 + ], + [ + 1275, + 1111, + 2 + ], + [ + 749, + 749, + 3 + ], + [ + 1240, + 232, + 4 + ], + [ + 166, + 702, + 2 + ], + [ + 1046, + 362, + 4 + ], + [ + 174, + 343, + 2 + ], + [ + 395, + 395, + 1 + ], + [ + 268, + 436, + 2 + ], + [ + 301, + 229, + 5 + ], + [ + 423, + 423, + 4 + ], + [ + 1647, + 29, + 2 + ], + [ + 185, + 200, + 2 + ], + [ + 288, + 571, + 2 + ], + [ + 499, + 261, + 2 + ], + [ + 705, + 705, + 3 + ], + [ + 785, + 799, + 2 + ], + [ + 1141, + 239, + 4 + ], + [ + 1175, + 1175, + 4 + ], + [ + 1726, + 106, + 2 + ], + [ + 409, + 275, + 2 + ], + [ + 28, + 634, + 1 + ], + [ + 1040, + 327, + 2 + ], + [ + 69, + 71, + 1 + ], + [ + 282, + 220, + 2 + ], + [ + 349, + 289, + 2 + ], + [ + 402, + 1058, + 2 + ], + [ + 258, + 201, + 3 + ], + [ + 267, + 345, + 2 + ], + [ + 366, + 217, + 2 + ], + [ + 374, + 387, + 2 + ], + [ + 1147, + 196, + 1 + ], + [ + 1156, + 444, + 1 + ], + [ + 285, + 322, + 1 + ], + [ + 369, + 698, + 2 + ], + [ + 629, + 299, + 2 + ], + [ + 800, + 800, + 2 + ], + [ + 405, + 405, + 1 + ], + [ + 667, + 931, + 1 + ], + [ + 761, + 761, + 2 + ], + [ + 1029, + 241, + 4 + ], + [ + 126, + 127, + 1 + ], + [ + 235, + 304, + 1 + ], + [ + 301, + 265, + 2 + ], + [ + 934, + 934, + 2 + ], + [ + 314, + 176, + 2 + ], + [ + 428, + 1260, + 1 + ], + [ + 724, + 406, + 2 + ], + [ + 304, + 235, + 1 + ], + [ + 480, + 1192, + 2 + ], + [ + 391, + 234, + 4 + ], + [ + 453, + 273, + 2 + ], + [ + 465, + 680, + 1 + ], + [ + 318, + 307, + 2 + ], + [ + 374, + 642, + 2 + ], + [ + 219, + 174, + 2 + ], + [ + 210, + 340, + 1 + ], + [ + 1062, + 273, + 4 + ], + [ + 1068, + 1277, + 3 + ], + [ + 72, + 662, + 1 + ], + [ + 771, + 771, + 2 + ], + [ + 608, + 608, + 1 + ], + [ + 641, + 641, + 3 + ], + [ + 294, + 681, + 2 + ], + [ + 306, + 492, + 2 + ], + [ + 2060, + 2060, + 1 + ], + [ + 199, + 225, + 1 + ], + [ + 848, + 848, + 3 + ], + [ + 485, + 1056, + 2 + ], + [ + 1281, + 66, + 1 + ], + [ + 251, + 351, + 2 + ], + [ + 1047, + 175, + 2 + ], + [ + 1189, + 1189, + 4 + ], + [ + 199, + 1249, + 1 + ], + [ + 247, + 513, + 2 + ], + [ + 519, + 292, + 2 + ], + [ + 361, + 253, + 3 + ], + [ + 1031, + 354, + 3 + ], + [ + 258, + 245, + 3 + ], + [ + 1027, + 1233, + 1 + ], + [ + 244, + 244, + 4 + ], + [ + 248, + 573, + 2 + ], + [ + 278, + 174, + 2 + ], + [ + 314, + 1135, + 2 + ], + [ + 1036, + 254, + 1 + ], + [ + 246, + 1072, + 2 + ], + [ + 317, + 252, + 1 + ], + [ + 321, + 300, + 1 + ], + [ + 212, + 194, + 1 + ], + [ + 214, + 1051, + 2 + ], + [ + 603, + 266, + 2 + ], + [ + 661, + 355, + 2 + ], + [ + 1041, + 353, + 2 + ], + [ + 1428, + 1428, + 4 + ], + [ + 259, + 255, + 2 + ], + [ + 397, + 289, + 2 + ], + [ + 320, + 264, + 2 + ], + [ + 1162, + 249, + 4 + ], + [ + 272, + 1061, + 2 + ], + [ + 276, + 474, + 2 + ], + [ + 312, + 1091, + 2 + ], + [ + 368, + 335, + 3 + ], + [ + 475, + 305, + 1 + ], + [ + 524, + 524, + 3 + ], + [ + 845, + 845, + 2 + ], + [ + 247, + 549, + 2 + ], + [ + 228, + 546, + 2 + ], + [ + 299, + 264, + 2 + ], + [ + 593, + 497, + 1 + ], + [ + 613, + 634, + 1 + ], + [ + 683, + 536, + 2 + ], + [ + 897, + 1113, + 2 + ], + [ + 1024, + 595, + 4 + ], + [ + 1124, + 64, + 2 + ], + [ + 1523, + 349, + 4 + ], + [ + 216, + 279, + 1 + ], + [ + 277, + 441, + 2 + ], + [ + 1031, + 367, + 3 + ], + [ + 1252, + 294, + 6 + ], + [ + 63, + 569, + 1 + ], + [ + 319, + 1123, + 2 + ], + [ + 1039, + 1138, + 4 + ], + [ + 1935, + 702, + 4 + ], + [ + 1026, + 520, + 4 + ], + [ + 1071, + 277, + 4 + ], + [ + 310, + 419, + 2 + ], + [ + 741, + 347, + 2 + ], + [ + 315, + 309, + 1 + ], + [ + 514, + 694, + 2 + ], + [ + 1088, + 447, + 4 + ], + [ + 248, + 1090, + 2 + ], + [ + 283, + 504, + 1 + ], + [ + 494, + 494, + 6 + ], + [ + 1048, + 175, + 1 + ], + [ + 276, + 201, + 3 + ], + [ + 1228, + 1228, + 4 + ], + [ + 247, + 1054, + 2 + ], + [ + 2339, + 111, + 2 + ], + [ + 829, + 829, + 2 + ], + [ + 275, + 1114, + 2 + ], + [ + 555, + 281, + 2 + ], + [ + 1027, + 1227, + 3 + ], + [ + 26, + 1718, + 1 + ], + [ + 656, + 384, + 2 + ], + [ + 276, + 348, + 3 + ], + [ + 345, + 365, + 2 + ], + [ + 5403, + 109, + 1 + ], + [ + 232, + 337, + 1 + ], + [ + 356, + 356, + 5 + ], + [ + 502, + 710, + 2 + ], + [ + 530, + 271, + 2 + ], + [ + 1249, + 1249, + 1 + ], + [ + 259, + 325, + 2 + ], + [ + 488, + 488, + 6 + ], + [ + 757, + 757, + 1 + ], + [ + 1088, + 441, + 4 + ], + [ + 1136, + 69, + 3 + ], + [ + 176, + 256, + 2 + ], + [ + 259, + 333, + 2 + ], + [ + 381, + 632, + 2 + ], + [ + 1026, + 499, + 4 + ], + [ + 1040, + 325, + 2 + ], + [ + 235, + 229, + 4 + ], + [ + 403, + 281, + 2 + ], + [ + 1512, + 365, + 6 + ], + [ + 313, + 264, + 2 + ], + [ + 533, + 533, + 5 + ], + [ + 1035, + 525, + 6 + ], + [ + 1042, + 360, + 2 + ], + [ + 1338, + 585, + 1 + ], + [ + 299, + 230, + 5 + ], + [ + 640, + 640, + 4 + ], + [ + 1028, + 426, + 3 + ], + [ + 196, + 196, + 6 + ], + [ + 202, + 715, + 2 + ], + [ + 697, + 416, + 2 + ], + [ + 1221, + 1221, + 4 + ], + [ + 68, + 407, + 2 + ], + [ + 188, + 250, + 2 + ], + [ + 191, + 1792, + 1 + ], + [ + 267, + 254, + 1 + ], + [ + 376, + 367, + 2 + ], + [ + 465, + 645, + 1 + ], + [ + 606, + 380, + 2 + ], + [ + 1088, + 435, + 4 + ], + [ + 214, + 254, + 1 + ], + [ + 589, + 729, + 1 + ], + [ + 547, + 322, + 2 + ], + [ + 701, + 701, + 1 + ], + [ + 1040, + 348, + 2 + ], + [ + 324, + 538, + 3 + ], + [ + 389, + 235, + 4 + ], + [ + 248, + 1054, + 2 + ], + [ + 318, + 234, + 5 + ], + [ + 390, + 1300, + 1 + ], + [ + 646, + 646, + 1 + ], + [ + 1042, + 1322, + 2 + ], + [ + 1333, + 271, + 4 + ], + [ + 284, + 460, + 2 + ], + [ + 1084, + 273, + 4 + ], + [ + 16, + 2352, + 1 + ], + [ + 259, + 1140, + 2 + ], + [ + 708, + 520, + 2 + ], + [ + 342, + 252, + 1 + ], + [ + 281, + 555, + 2 + ], + [ + 388, + 295, + 2 + ], + [ + 615, + 528, + 2 + ], + [ + 230, + 307, + 5 + ], + [ + 321, + 242, + 2 + ], + [ + 479, + 273, + 2 + ], + [ + 1471, + 680, + 1 + ], + [ + 190, + 795, + 2 + ], + [ + 447, + 280, + 2 + ], + [ + 1039, + 1057, + 4 + ], + [ + 1040, + 1145, + 2 + ], + [ + 1252, + 296, + 6 + ], + [ + 288, + 201, + 3 + ], + [ + 312, + 174, + 2 + ], + [ + 483, + 602, + 2 + ], + [ + 789, + 789, + 2 + ], + [ + 1031, + 1274, + 3 + ], + [ + 279, + 216, + 3 + ], + [ + 649, + 649, + 1 + ], + [ + 1030, + 409, + 3 + ], + [ + 257, + 255, + 3 + ], + [ + 1024, + 583, + 4 + ], + [ + 227, + 625, + 2 + ], + [ + 293, + 471, + 2 + ], + [ + 301, + 301, + 1 + ], + [ + 394, + 685, + 2 + ], + [ + 427, + 427, + 1 + ], + [ + 866, + 399, + 2 + ], + [ + 431, + 256, + 2 + ], + [ + 575, + 575, + 2 + ], + [ + 1067, + 217, + 4 + ], + [ + 309, + 225, + 1 + ], + [ + 927, + 927, + 2 + ], + [ + 1030, + 1144, + 1 + ], + [ + 269, + 1092, + 2 + ], + [ + 441, + 441, + 2 + ], + [ + 489, + 489, + 5 + ], + [ + 1025, + 672, + 4 + ], + [ + 1026, + 1083, + 4 + ], + [ + 1028, + 295, + 7 + ], + [ + 1341, + 1341, + 4 + ], + [ + 304, + 264, + 2 + ], + [ + 337, + 232, + 2 + ], + [ + 1025, + 769, + 4 + ], + [ + 1745, + 597, + 2 + ], + [ + 296, + 703, + 2 + ], + [ + 63, + 65, + 1 + ], + [ + 246, + 350, + 2 + ], + [ + 496, + 496, + 6 + ], + [ + 391, + 391, + 5 + ], + [ + 1365, + 710, + 4 + ], + [ + 243, + 198, + 1 + ], + [ + 261, + 356, + 3 + ], + [ + 402, + 402, + 4 + ], + [ + 560, + 560, + 4 + ], + [ + 1512, + 366, + 6 + ], + [ + 379, + 295, + 2 + ], + [ + 522, + 522, + 5 + ], + [ + 267, + 350, + 2 + ], + [ + 1331, + 647, + 1 + ], + [ + 1027, + 1233, + 3 + ], + [ + 1036, + 265, + 4 + ], + [ + 1071, + 284, + 4 + ], + [ + 1363, + 1027, + 1 + ], + [ + 398, + 586, + 1 + ], + [ + 1324, + 827, + 1 + ], + [ + 190, + 257, + 2 + ], + [ + 1030, + 1149, + 1 + ], + [ + 72, + 797, + 1 + ], + [ + 318, + 265, + 2 + ], + [ + 314, + 250, + 2 + ], + [ + 579, + 416, + 2 + ], + [ + 508, + 70, + 1 + ], + [ + 3823, + 21, + 1 + ], + [ + 174, + 278, + 2 + ], + [ + 747, + 406, + 2 + ], + [ + 2034, + 129, + 2 + ], + [ + 240, + 1167, + 2 + ], + [ + 324, + 265, + 2 + ], + [ + 517, + 456, + 2 + ], + [ + 823, + 823, + 1 + ], + [ + 68, + 69, + 3 + ], + [ + 193, + 703, + 2 + ], + [ + 216, + 279, + 3 + ], + [ + 362, + 217, + 1 + ], + [ + 518, + 353, + 4 + ], + [ + 435, + 403, + 2 + ], + [ + 435, + 260, + 2 + ], + [ + 1251, + 70, + 2 + ], + [ + 272, + 491, + 2 + ], + [ + 411, + 658, + 2 + ], + [ + 621, + 1819, + 2 + ], + [ + 1297, + 249, + 4 + ], + [ + 270, + 719, + 2 + ], + [ + 65, + 66, + 3 + ], + [ + 650, + 348, + 2 + ], + [ + 1094, + 359, + 6 + ], + [ + 1098, + 653, + 2 + ], + [ + 314, + 1092, + 2 + ], + [ + 328, + 612, + 2 + ], + [ + 1029, + 317, + 4 + ], + [ + 1111, + 1103, + 2 + ], + [ + 2106, + 732, + 4 + ], + [ + 190, + 830, + 2 + ], + [ + 248, + 345, + 2 + ], + [ + 60, + 2198, + 1 + ], + [ + 262, + 935, + 2 + ], + [ + 704, + 343, + 2 + ], + [ + 316, + 241, + 1 + ], + [ + 744, + 246, + 2 + ], + [ + 1174, + 1174, + 4 + ], + [ + 318, + 204, + 2 + ], + [ + 1162, + 349, + 4 + ], + [ + 834, + 834, + 2 + ], + [ + 284, + 176, + 2 + ], + [ + 477, + 295, + 2 + ], + [ + 152, + 152, + 2 + ], + [ + 389, + 235, + 2 + ], + [ + 438, + 974, + 2 + ], + [ + 1152, + 350, + 7 + ], + [ + 283, + 373, + 1 + ], + [ + 305, + 475, + 1 + ], + [ + 339, + 1036, + 2 + ], + [ + 419, + 454, + 1 + ], + [ + 580, + 300, + 2 + ], + [ + 252, + 342, + 1 + ], + [ + 564, + 269, + 2 + ], + [ + 654, + 348, + 2 + ], + [ + 847, + 537, + 2 + ], + [ + 527, + 527, + 5 + ], + [ + 563, + 997, + 2 + ], + [ + 275, + 1038, + 2 + ], + [ + 1047, + 175, + 1 + ], + [ + 292, + 420, + 2 + ], + [ + 174, + 482, + 2 + ], + [ + 188, + 730, + 2 + ], + [ + 351, + 529, + 5 + ], + [ + 335, + 855, + 2 + ], + [ + 358, + 1334, + 2 + ], + [ + 880, + 249, + 2 + ], + [ + 227, + 242, + 1 + ], + [ + 267, + 365, + 2 + ], + [ + 1233, + 1027, + 1 + ], + [ + 226, + 239, + 1 + ], + [ + 784, + 784, + 2 + ], + [ + 241, + 317, + 2 + ], + [ + 1026, + 468, + 4 + ], + [ + 285, + 363, + 1 + ], + [ + 338, + 699, + 2 + ], + [ + 1362, + 310, + 4 + ], + [ + 442, + 381, + 2 + ], + [ + 788, + 561, + 1 + ], + [ + 23, + 22, + 1 + ], + [ + 413, + 588, + 1 + ], + [ + 442, + 243, + 2 + ], + [ + 665, + 665, + 3 + ], + [ + 670, + 1109, + 2 + ], + [ + 229, + 234, + 5 + ], + [ + 323, + 308, + 1 + ], + [ + 371, + 237, + 2 + ], + [ + 431, + 251, + 2 + ], + [ + 200, + 226, + 1 + ], + [ + 241, + 316, + 2 + ], + [ + 304, + 633, + 2 + ], + [ + 1201, + 230, + 6 + ], + [ + 239, + 226, + 1 + ], + [ + 377, + 525, + 2 + ], + [ + 700, + 700, + 4 + ], + [ + 1035, + 523, + 6 + ], + [ + 259, + 1044, + 2 + ], + [ + 296, + 746, + 2 + ], + [ + 1747, + 570, + 1 + ], + [ + 382, + 232, + 1 + ], + [ + 886, + 886, + 3 + ], + [ + 247, + 350, + 2 + ], + [ + 255, + 255, + 6 + ], + [ + 190, + 857, + 2 + ], + [ + 354, + 349, + 2 + ], + [ + 358, + 249, + 2 + ], + [ + 1374, + 254, + 6 + ], + [ + 439, + 380, + 2 + ], + [ + 721, + 721, + 2 + ], + [ + 782, + 782, + 1 + ], + [ + 1061, + 1096, + 4 + ], + [ + 1152, + 345, + 7 + ], + [ + 193, + 455, + 2 + ], + [ + 193, + 494, + 2 + ], + [ + 387, + 250, + 2 + ], + [ + 401, + 312, + 2 + ], + [ + 478, + 1941, + 1 + ], + [ + 307, + 307, + 7 + ], + [ + 557, + 228, + 2 + ], + [ + 1091, + 295, + 4 + ], + [ + 1545, + 379, + 7 + ], + [ + 258, + 214, + 2 + ], + [ + 842, + 684, + 2 + ], + [ + 71, + 662, + 1 + ], + [ + 1074, + 1468, + 3 + ], + [ + 1412, + 194, + 1 + ], + [ + 517, + 453, + 2 + ], + [ + 2314, + 75, + 2 + ], + [ + 195, + 195, + 4 + ], + [ + 751, + 260, + 2 + ], + [ + 1060, + 1030, + 1 + ], + [ + 1298, + 596, + 1 + ], + [ + 68, + 1367, + 1 + ], + [ + 713, + 374, + 2 + ], + [ + 1460, + 1460, + 2 + ], + [ + 370, + 370, + 5 + ], + [ + 962, + 962, + 2 + ], + [ + 297, + 297, + 5 + ], + [ + 414, + 272, + 2 + ], + [ + 503, + 955, + 2 + ], + [ + 217, + 234, + 2 + ], + [ + 1048, + 176, + 2 + ], + [ + 230, + 235, + 5 + ], + [ + 364, + 380, + 2 + ], + [ + 505, + 974, + 2 + ], + [ + 577, + 333, + 2 + ], + [ + 1031, + 367, + 5 + ], + [ + 1059, + 289, + 4 + ], + [ + 474, + 276, + 2 + ], + [ + 317, + 241, + 1 + ], + [ + 548, + 543, + 1 + ], + [ + 1008, + 1008, + 2 + ], + [ + 246, + 692, + 2 + ], + [ + 342, + 210, + 1 + ], + [ + 67, + 66, + 2 + ], + [ + 247, + 759, + 2 + ], + [ + 1120, + 235, + 5 + ], + [ + 1041, + 477, + 2 + ], + [ + 216, + 196, + 1 + ], + [ + 240, + 269, + 2 + ], + [ + 802, + 802, + 3 + ], + [ + 340, + 316, + 2 + ], + [ + 663, + 406, + 2 + ], + [ + 1567, + 461, + 4 + ], + [ + 1088, + 458, + 4 + ], + [ + 27, + 28, + 1 + ], + [ + 275, + 385, + 3 + ], + [ + 286, + 286, + 5 + ], + [ + 618, + 618, + 4 + ], + [ + 1125, + 234, + 5 + ], + [ + 200, + 231, + 1 + ], + [ + 230, + 234, + 5 + ], + [ + 484, + 484, + 6 + ], + [ + 714, + 469, + 2 + ], + [ + 723, + 326, + 1 + ], + [ + 458, + 281, + 2 + ], + [ + 1530, + 393, + 4 + ], + [ + 240, + 1096, + 2 + ], + [ + 253, + 361, + 3 + ], + [ + 693, + 343, + 2 + ], + [ + 1025, + 682, + 4 + ], + [ + 379, + 379, + 2 + ], + [ + 1030, + 1151, + 3 + ], + [ + 497, + 437, + 1 + ], + [ + 525, + 377, + 2 + ], + [ + 280, + 176, + 2 + ], + [ + 294, + 752, + 2 + ], + [ + 313, + 498, + 3 + ], + [ + 357, + 348, + 2 + ], + [ + 449, + 449, + 5 + ], + [ + 545, + 202, + 2 + ], + [ + 778, + 718, + 2 + ], + [ + 229, + 301, + 5 + ], + [ + 337, + 232, + 1 + ], + [ + 822, + 381, + 2 + ], + [ + 706, + 329, + 2 + ], + [ + 1001, + 1001, + 2 + ], + [ + 279, + 383, + 3 + ], + [ + 325, + 348, + 2 + ], + [ + 1423, + 295, + 4 + ], + [ + 204, + 324, + 2 + ], + [ + 492, + 492, + 4 + ], + [ + 197, + 197, + 3 + ], + [ + 389, + 389, + 5 + ], + [ + 433, + 645, + 1 + ], + [ + 609, + 609, + 4 + ], + [ + 174, + 222, + 2 + ], + [ + 260, + 281, + 2 + ], + [ + 550, + 259, + 2 + ], + [ + 1062, + 312, + 4 + ], + [ + 1400, + 64, + 2 + ], + [ + 193, + 488, + 2 + ], + [ + 283, + 65, + 1 + ], + [ + 296, + 520, + 2 + ], + [ + 334, + 664, + 2 + ], + [ + 346, + 407, + 3 + ], + [ + 68, + 70, + 1 + ], + [ + 266, + 493, + 1 + ], + [ + 546, + 546, + 2 + ], + [ + 1028, + 431, + 5 + ], + [ + 1061, + 273, + 4 + ], + [ + 362, + 362, + 4 + ], + [ + 598, + 598, + 3 + ], + [ + 1458, + 374, + 4 + ], + [ + 271, + 395, + 3 + ], + [ + 320, + 267, + 2 + ], + [ + 375, + 459, + 2 + ], + [ + 190, + 250, + 2 + ], + [ + 273, + 479, + 2 + ], + [ + 673, + 673, + 4 + ], + [ + 742, + 742, + 1 + ], + [ + 607, + 607, + 4 + ], + [ + 1450, + 1148, + 2 + ], + [ + 315, + 315, + 4 + ], + [ + 429, + 285, + 1 + ], + [ + 366, + 254, + 2 + ], + [ + 426, + 256, + 2 + ], + [ + 1030, + 447, + 3 + ], + [ + 1166, + 214, + 4 + ], + [ + 1297, + 1049, + 4 + ], + [ + 386, + 237, + 1 + ], + [ + 577, + 571, + 2 + ], + [ + 604, + 796, + 1 + ], + [ + 679, + 129, + 1 + ], + [ + 265, + 1046, + 2 + ], + [ + 458, + 294, + 2 + ], + [ + 190, + 219, + 2 + ], + [ + 277, + 443, + 2 + ], + [ + 576, + 416, + 2 + ], + [ + 1040, + 1073, + 2 + ], + [ + 1178, + 1178, + 4 + ], + [ + 1270, + 457, + 1 + ], + [ + 228, + 557, + 2 + ], + [ + 261, + 541, + 2 + ], + [ + 471, + 885, + 2 + ], + [ + 766, + 766, + 3 + ], + [ + 188, + 248, + 1 + ], + [ + 274, + 270, + 2 + ], + [ + 313, + 267, + 2 + ], + [ + 481, + 592, + 2 + ], + [ + 1053, + 259, + 4 + ], + [ + 468, + 643, + 3 + ], + [ + 472, + 200, + 2 + ], + [ + 896, + 659, + 1 + ], + [ + 975, + 975, + 2 + ], + [ + 1091, + 272, + 4 + ], + [ + 1477, + 392, + 1 + ], + [ + 332, + 332, + 5 + ], + [ + 486, + 988, + 2 + ], + [ + 753, + 753, + 3 + ], + [ + 1212, + 70, + 1 + ], + [ + 175, + 1158, + 3 + ], + [ + 190, + 891, + 2 + ], + [ + 288, + 201, + 1 + ], + [ + 809, + 824, + 2 + ], + [ + 1016, + 1016, + 2 + ], + [ + 246, + 1069, + 2 + ], + [ + 972, + 636, + 1 + ], + [ + 540, + 443, + 2 + ], + [ + 610, + 304, + 2 + ], + [ + 1030, + 403, + 3 + ], + [ + 215, + 215, + 4 + ], + [ + 225, + 199, + 1 + ], + [ + 475, + 305, + 2 + ], + [ + 1024, + 542, + 4 + ], + [ + 1057, + 1245, + 4 + ], + [ + 725, + 278, + 2 + ], + [ + 1041, + 453, + 2 + ], + [ + 174, + 272, + 2 + ], + [ + 518, + 353, + 3 + ], + [ + 327, + 258, + 3 + ], + [ + 384, + 423, + 2 + ], + [ + 188, + 740, + 2 + ], + [ + 190, + 860, + 2 + ], + [ + 334, + 322, + 2 + ], + [ + 663, + 393, + 2 + ], + [ + 690, + 690, + 3 + ], + [ + 1818, + 222, + 4 + ], + [ + 284, + 1133, + 2 + ], + [ + 302, + 302, + 5 + ], + [ + 773, + 339, + 2 + ], + [ + 265, + 345, + 2 + ], + [ + 551, + 898, + 2 + ], + [ + 214, + 339, + 2 + ], + [ + 252, + 340, + 1 + ], + [ + 807, + 687, + 2 + ], + [ + 1183, + 1183, + 4 + ], + [ + 378, + 64, + 1 + ], + [ + 622, + 406, + 2 + ], + [ + 1210, + 229, + 6 + ], + [ + 1298, + 588, + 1 + ], + [ + 246, + 365, + 2 + ], + [ + 1366, + 1044, + 3 + ], + [ + 19, + 817, + 1 + ], + [ + 31, + 31, + 1 + ], + [ + 201, + 253, + 3 + ], + [ + 952, + 594, + 2 + ], + [ + 1042, + 445, + 2 + ], + [ + 1098, + 352, + 2 + ], + [ + 625, + 537, + 2 + ], + [ + 717, + 359, + 2 + ], + [ + 1026, + 1118, + 4 + ], + [ + 1105, + 199, + 1 + ], + [ + 386, + 237, + 2 + ], + [ + 576, + 322, + 2 + ], + [ + 425, + 425, + 5 + ], + [ + 953, + 953, + 1 + ], + [ + 1400, + 1116, + 2 + ], + [ + 1844, + 103, + 2 + ], + [ + 260, + 1128, + 2 + ], + [ + 431, + 269, + 2 + ], + [ + 434, + 599, + 2 + ], + [ + 454, + 419, + 1 + ], + [ + 504, + 64, + 1 + ], + [ + 882, + 882, + 3 + ], + [ + 262, + 262, + 1 + ], + [ + 462, + 174, + 2 + ], + [ + 388, + 388, + 2 + ], + [ + 411, + 411, + 5 + ], + [ + 250, + 196, + 1 + ], + [ + 287, + 287, + 5 + ], + [ + 1270, + 1105, + 1 + ], + [ + 1338, + 584, + 1 + ], + [ + 333, + 333, + 4 + ], + [ + 66, + 1106, + 1 + ], + [ + 176, + 251, + 2 + ], + [ + 835, + 835, + 2 + ], + [ + 1337, + 1337, + 2 + ], + [ + 1031, + 1396, + 1 + ], + [ + 1062, + 1109, + 4 + ], + [ + 1134, + 348, + 2 + ], + [ + 228, + 219, + 2 + ], + [ + 391, + 234, + 2 + ], + [ + 553, + 684, + 2 + ], + [ + 102, + 1722, + 1 + ], + [ + 770, + 770, + 3 + ], + [ + 1062, + 314, + 4 + ], + [ + 435, + 281, + 2 + ], + [ + 1036, + 247, + 4 + ], + [ + 299, + 299, + 1 + ], + [ + 1029, + 342, + 4 + ], + [ + 460, + 566, + 2 + ], + [ + 1026, + 1083, + 1 + ], + [ + 341, + 473, + 3 + ], + [ + 384, + 383, + 2 + ], + [ + 446, + 1123, + 1 + ], + [ + 1026, + 572, + 4 + ], + [ + 275, + 521, + 2 + ], + [ + 1061, + 312, + 4 + ], + [ + 1489, + 432, + 1 + ], + [ + 174, + 269, + 2 + ], + [ + 438, + 1242, + 1 + ], + [ + 1545, + 388, + 7 + ], + [ + 674, + 521, + 2 + ], + [ + 722, + 451, + 1 + ], + [ + 781, + 278, + 2 + ], + [ + 1057, + 404, + 4 + ], + [ + 205, + 67, + 1 + ], + [ + 265, + 350, + 2 + ], + [ + 372, + 280, + 2 + ], + [ + 372, + 1206, + 2 + ], + [ + 1024, + 549, + 4 + ], + [ + 279, + 257, + 3 + ], + [ + 654, + 374, + 2 + ], + [ + 1211, + 1211, + 4 + ], + [ + 338, + 322, + 2 + ], + [ + 392, + 570, + 1 + ], + [ + 464, + 547, + 2 + ], + [ + 739, + 739, + 3 + ], + [ + 1154, + 378, + 1 + ], + [ + 1060, + 174, + 2 + ], + [ + 1395, + 1052, + 1 + ], + [ + 447, + 277, + 2 + ], + [ + 1798, + 209, + 2 + ], + [ + 153, + 153, + 3 + ], + [ + 481, + 592, + 1 + ], + [ + 606, + 381, + 2 + ], + [ + 259, + 678, + 2 + ], + [ + 1151, + 281, + 4 + ], + [ + 367, + 289, + 2 + ], + [ + 696, + 696, + 3 + ], + [ + 151, + 151, + 1 + ], + [ + 270, + 763, + 2 + ], + [ + 357, + 602, + 2 + ], + [ + 1041, + 491, + 2 + ], + [ + 234, + 415, + 2 + ], + [ + 249, + 913, + 2 + ], + [ + 628, + 461, + 2 + ], + [ + 330, + 310, + 1 + ], + [ + 351, + 219, + 2 + ], + [ + 360, + 176, + 2 + ], + [ + 579, + 843, + 1 + ], + [ + 1470, + 375, + 4 + ], + [ + 245, + 1109, + 2 + ], + [ + 615, + 361, + 2 + ], + [ + 624, + 624, + 1 + ], + [ + 252, + 289, + 2 + ], + [ + 414, + 314, + 2 + ], + [ + 1197, + 1197, + 4 + ], + [ + 217, + 1046, + 1 + ], + [ + 317, + 210, + 1 + ], + [ + 399, + 1070, + 2 + ], + [ + 568, + 472, + 2 + ], + [ + 1026, + 522, + 4 + ], + [ + 1455, + 381, + 4 + ], + [ + 380, + 439, + 2 + ], + [ + 1044, + 348, + 4 + ], + [ + 637, + 585, + 1 + ], + [ + 409, + 280, + 2 + ], + [ + 413, + 596, + 1 + ], + [ + 711, + 711, + 3 + ], + [ + 1028, + 431, + 3 + ], + [ + 188, + 777, + 2 + ], + [ + 1024, + 507, + 4 + ], + [ + 357, + 328, + 2 + ], + [ + 1134, + 357, + 2 + ], + [ + 252, + 451, + 1 + ], + [ + 266, + 538, + 1 + ], + [ + 1026, + 555, + 4 + ], + [ + 1027, + 1180, + 1 + ], + [ + 1027, + 1185, + 1 + ], + [ + 1076, + 627, + 4 + ], + [ + 176, + 273, + 2 + ], + [ + 562, + 562, + 4 + ], + [ + 58, + 1693, + 1 + ], + [ + 930, + 930, + 2 + ], + [ + 1048, + 175, + 2 + ], + [ + 308, + 422, + 2 + ], + [ + 534, + 1023, + 2 + ], + [ + 601, + 548, + 2 + ], + [ + 1041, + 449, + 2 + ], + [ + 214, + 1066, + 2 + ], + [ + 385, + 385, + 5 + ], + [ + 346, + 407, + 1 + ], + [ + 366, + 345, + 2 + ], + [ + 391, + 229, + 4 + ], + [ + 689, + 383, + 2 + ], + [ + 332, + 1167, + 3 + ], + [ + 578, + 741, + 2 + ], + [ + 981, + 981, + 1 + ], + [ + 999, + 999, + 2 + ], + [ + 2342, + 192, + 2 + ], + [ + 190, + 992, + 2 + ], + [ + 1102, + 1102, + 3 + ], + [ + 397, + 349, + 2 + ], + [ + 358, + 349, + 2 + ], + [ + 1075, + 426, + 4 + ], + [ + 1098, + 651, + 2 + ], + [ + 217, + 448, + 2 + ], + [ + 254, + 350, + 2 + ], + [ + 1212, + 1212, + 1 + ], + [ + 1281, + 205, + 4 + ], + [ + 246, + 1067, + 2 + ], + [ + 330, + 1199, + 1 + ], + [ + 253, + 355, + 3 + ], + [ + 1099, + 1099, + 3 + ], + [ + 1028, + 1449, + 1 + ], + [ + 230, + 389, + 4 + ], + [ + 414, + 312, + 2 + ], + [ + 2168, + 668, + 1 + ], + [ + 193, + 734, + 2 + ], + [ + 1666, + 509, + 4 + ], + [ + 234, + 304, + 1 + ], + [ + 264, + 519, + 1 + ], + [ + 683, + 683, + 3 + ], + [ + 942, + 22, + 1 + ], + [ + 1061, + 272, + 4 + ], + [ + 69, + 371, + 2 + ], + [ + 576, + 535, + 2 + ], + [ + 819, + 819, + 3 + ], + [ + 1031, + 397, + 3 + ], + [ + 352, + 1059, + 2 + ], + [ + 531, + 342, + 3 + ], + [ + 859, + 528, + 2 + ], + [ + 260, + 458, + 2 + ], + [ + 581, + 280, + 2 + ], + [ + 689, + 461, + 2 + ], + [ + 19, + 1717, + 1 + ], + [ + 248, + 762, + 2 + ], + [ + 324, + 235, + 5 + ], + [ + 440, + 584, + 1 + ], + [ + 765, + 319, + 1 + ], + [ + 995, + 995, + 2 + ], + [ + 1164, + 1073, + 2 + ], + [ + 231, + 200, + 2 + ], + [ + 428, + 660, + 1 + ], + [ + 559, + 176, + 5 + ], + [ + 837, + 837, + 3 + ], + [ + 1110, + 259, + 6 + ], + [ + 1306, + 1027, + 1 + ], + [ + 163, + 163, + 2 + ], + [ + 243, + 406, + 2 + ], + [ + 793, + 793, + 3 + ], + [ + 368, + 382, + 1 + ], + [ + 369, + 369, + 4 + ], + [ + 569, + 63, + 1 + ], + [ + 671, + 550, + 2 + ], + [ + 676, + 676, + 4 + ], + [ + 249, + 289, + 2 + ], + [ + 261, + 245, + 3 + ], + [ + 314, + 401, + 2 + ], + [ + 1055, + 327, + 4 + ], + [ + 1056, + 328, + 4 + ], + [ + 1365, + 1365, + 4 + ], + [ + 261, + 393, + 3 + ], + [ + 426, + 269, + 2 + ], + [ + 552, + 552, + 4 + ], + [ + 774, + 774, + 2 + ], + [ + 1033, + 196, + 6 + ], + [ + 190, + 821, + 2 + ], + [ + 364, + 625, + 2 + ], + [ + 708, + 708, + 3 + ], + [ + 1029, + 412, + 4 + ], + [ + 1141, + 239, + 3 + ], + [ + 196, + 295, + 2 + ], + [ + 367, + 715, + 2 + ], + [ + 373, + 283, + 1 + ], + [ + 325, + 1073, + 2 + ], + [ + 415, + 415, + 5 + ], + [ + 438, + 979, + 2 + ], + [ + 1191, + 62, + 1 + ], + [ + 1782, + 15, + 2 + ], + [ + 1024, + 558, + 4 + ], + [ + 66, + 67, + 3 + ], + [ + 275, + 176, + 2 + ], + [ + 300, + 418, + 2 + ], + [ + 357, + 327, + 2 + ], + [ + 1121, + 1163, + 2 + ], + [ + 1388, + 585, + 1 + ], + [ + 267, + 1044, + 2 + ], + [ + 438, + 1242, + 2 + ], + [ + 275, + 499, + 2 + ], + [ + 357, + 756, + 2 + ], + [ + 497, + 684, + 2 + ], + [ + 532, + 340, + 2 + ], + [ + 642, + 642, + 3 + ], + [ + 1030, + 1144, + 5 + ], + [ + 1063, + 214, + 4 + ], + [ + 480, + 620, + 3 + ], + [ + 641, + 1096, + 2 + ], + [ + 2233, + 760, + 2 + ], + [ + 190, + 869, + 2 + ], + [ + 201, + 276, + 3 + ], + [ + 288, + 375, + 2 + ], + [ + 326, + 326, + 3 + ], + [ + 498, + 904, + 2 + ], + [ + 575, + 575, + 5 + ], + [ + 931, + 596, + 1 + ], + [ + 1071, + 260, + 4 + ], + [ + 1091, + 312, + 4 + ], + [ + 335, + 194, + 1 + ], + [ + 352, + 714, + 2 + ], + [ + 216, + 216, + 7 + ], + [ + 449, + 1109, + 2 + ], + [ + 267, + 265, + 2 + ], + [ + 942, + 1633, + 1 + ], + [ + 1349, + 433, + 4 + ], + [ + 491, + 272, + 2 + ], + [ + 681, + 681, + 3 + ], + [ + 719, + 719, + 2 + ], + [ + 808, + 270, + 2 + ], + [ + 1052, + 174, + 2 + ], + [ + 1138, + 329, + 4 + ], + [ + 230, + 217, + 2 + ], + [ + 284, + 435, + 2 + ], + [ + 277, + 176, + 2 + ], + [ + 335, + 194, + 2 + ], + [ + 840, + 402, + 2 + ], + [ + 514, + 938, + 2 + ], + [ + 1039, + 246, + 4 + ], + [ + 476, + 861, + 2 + ], + [ + 619, + 510, + 2 + ], + [ + 201, + 255, + 3 + ], + [ + 276, + 472, + 1 + ], + [ + 465, + 1123, + 1 + ], + [ + 577, + 1162, + 2 + ], + [ + 616, + 281, + 2 + ], + [ + 1231, + 1231, + 4 + ], + [ + 479, + 258, + 2 + ], + [ + 1052, + 332, + 2 + ], + [ + 1153, + 436, + 4 + ], + [ + 2578, + 59, + 2 + ], + [ + 301, + 234, + 1 + ], + [ + 370, + 652, + 2 + ], + [ + 426, + 295, + 2 + ], + [ + 1028, + 312, + 7 + ], + [ + 1382, + 1382, + 2 + ], + [ + 242, + 227, + 1 + ], + [ + 256, + 388, + 2 + ], + [ + 1285, + 1285, + 4 + ], + [ + 214, + 248, + 1 + ], + [ + 275, + 174, + 2 + ], + [ + 644, + 334, + 2 + ], + [ + 650, + 355, + 2 + ], + [ + 241, + 317, + 1 + ], + [ + 820, + 561, + 1 + ], + [ + 1415, + 586, + 1 + ], + [ + 188, + 247, + 1 + ], + [ + 441, + 409, + 2 + ], + [ + 467, + 228, + 3 + ], + [ + 788, + 586, + 1 + ], + [ + 1348, + 667, + 1 + ], + [ + 254, + 813, + 2 + ], + [ + 1033, + 1024, + 5 + ], + [ + 365, + 217, + 2 + ], + [ + 1157, + 349, + 6 + ], + [ + 1170, + 1083, + 4 + ], + [ + 357, + 587, + 2 + ], + [ + 373, + 64, + 2 + ], + [ + 470, + 587, + 2 + ], + [ + 563, + 322, + 2 + ], + [ + 855, + 855, + 2 + ], + [ + 251, + 379, + 2 + ], + [ + 459, + 698, + 2 + ], + [ + 1006, + 537, + 2 + ], + [ + 887, + 500, + 2 + ], + [ + 323, + 323, + 4 + ], + [ + 424, + 387, + 2 + ], + [ + 1144, + 1030, + 1 + ], + [ + 365, + 254, + 2 + ], + [ + 401, + 273, + 2 + ], + [ + 406, + 243, + 2 + ], + [ + 68, + 371, + 1 + ], + [ + 632, + 381, + 2 + ], + [ + 725, + 725, + 2 + ], + [ + 1512, + 345, + 6 + ], + [ + 320, + 320, + 7 + ], + [ + 1031, + 354, + 5 + ], + [ + 646, + 646, + 3 + ], + [ + 1027, + 1036, + 1 + ], + [ + 307, + 594, + 2 + ], + [ + 680, + 597, + 1 + ], + [ + 1196, + 1196, + 4 + ], + [ + 274, + 220, + 2 + ], + [ + 316, + 340, + 2 + ], + [ + 341, + 473, + 4 + ], + [ + 563, + 429, + 2 + ], + [ + 253, + 214, + 2 + ], + [ + 454, + 418, + 1 + ], + [ + 493, + 266, + 1 + ], + [ + 593, + 319, + 1 + ], + [ + 918, + 918, + 3 + ], + [ + 1744, + 569, + 1 + ], + [ + 252, + 317, + 1 + ], + [ + 1057, + 417, + 4 + ], + [ + 268, + 395, + 3 + ], + [ + 299, + 234, + 1 + ], + [ + 405, + 285, + 2 + ], + [ + 431, + 295, + 2 + ], + [ + 249, + 397, + 2 + ], + [ + 543, + 255, + 2 + ], + [ + 329, + 487, + 1 + ], + [ + 1291, + 1291, + 4 + ], + [ + 5282, + 106, + 1 + ], + [ + 174, + 236, + 2 + ], + [ + 580, + 356, + 2 + ], + [ + 706, + 448, + 2 + ], + [ + 804, + 804, + 1 + ], + [ + 893, + 893, + 3 + ], + [ + 1046, + 1046, + 3 + ], + [ + 1512, + 350, + 6 + ], + [ + 193, + 746, + 2 + ], + [ + 304, + 234, + 1 + ], + [ + 1304, + 226, + 1 + ], + [ + 1525, + 292, + 4 + ], + [ + 1540, + 508, + 4 + ], + [ + 1651, + 379, + 6 + ], + [ + 210, + 289, + 2 + ], + [ + 1025, + 779, + 4 + ], + [ + 374, + 713, + 2 + ], + [ + 268, + 216, + 3 + ], + [ + 630, + 630, + 3 + ], + [ + 1084, + 269, + 4 + ], + [ + 338, + 686, + 2 + ], + [ + 370, + 236, + 2 + ], + [ + 959, + 528, + 2 + ], + [ + 1313, + 582, + 1 + ], + [ + 1378, + 1047, + 4 + ], + [ + 1030, + 1149, + 5 + ], + [ + 1311, + 1027, + 1 + ], + [ + 1343, + 446, + 1 + ], + [ + 275, + 280, + 2 + ], + [ + 400, + 400, + 5 + ], + [ + 538, + 266, + 1 + ], + [ + 246, + 366, + 2 + ], + [ + 257, + 257, + 5 + ], + [ + 1036, + 1050, + 1 + ], + [ + 1272, + 227, + 1 + ], + [ + 176, + 269, + 2 + ], + [ + 1072, + 1143, + 4 + ], + [ + 1331, + 1331, + 1 + ], + [ + 300, + 321, + 1 + ], + [ + 325, + 327, + 2 + ], + [ + 1149, + 1030, + 1 + ], + [ + 97, + 97, + 1 + ], + [ + 1026, + 235, + 4 + ], + [ + 399, + 885, + 2 + ], + [ + 453, + 517, + 2 + ], + [ + 810, + 810, + 1 + ], + [ + 997, + 997, + 2 + ], + [ + 444, + 667, + 1 + ], + [ + 234, + 299, + 1 + ], + [ + 421, + 377, + 2 + ], + [ + 1056, + 334, + 4 + ], + [ + 567, + 567, + 4 + ], + [ + 219, + 344, + 3 + ], + [ + 656, + 656, + 1 + ], + [ + 816, + 816, + 3 + ], + [ + 1066, + 217, + 6 + ], + [ + 501, + 501, + 6 + ], + [ + 65, + 65, + 4 + ], + [ + 204, + 318, + 2 + ], + [ + 387, + 424, + 2 + ], + [ + 176, + 236, + 2 + ], + [ + 301, + 301, + 7 + ], + [ + 440, + 659, + 1 + ], + [ + 324, + 230, + 1 + ], + [ + 328, + 247, + 3 + ], + [ + 185, + 199, + 2 + ], + [ + 204, + 511, + 2 + ], + [ + 805, + 805, + 2 + ], + [ + 1063, + 369, + 4 + ], + [ + 253, + 443, + 3 + ], + [ + 414, + 295, + 2 + ], + [ + 631, + 354, + 2 + ], + [ + 777, + 777, + 2 + ], + [ + 1534, + 383, + 4 + ], + [ + 475, + 70, + 1 + ], + [ + 1070, + 1410, + 3 + ], + [ + 1206, + 1206, + 4 + ], + [ + 380, + 356, + 2 + ], + [ + 514, + 534, + 2 + ], + [ + 357, + 568, + 2 + ], + [ + 426, + 272, + 2 + ], + [ + 462, + 657, + 3 + ], + [ + 227, + 364, + 2 + ], + [ + 1190, + 1190, + 4 + ], + [ + 2244, + 775, + 2 + ], + [ + 61, + 62, + 1 + ], + [ + 434, + 394, + 2 + ], + [ + 229, + 235, + 5 + ], + [ + 1319, + 561, + 1 + ], + [ + 365, + 214, + 2 + ], + [ + 605, + 605, + 3 + ], + [ + 107, + 1632, + 1 + ], + [ + 261, + 566, + 2 + ], + [ + 408, + 290, + 2 + ], + [ + 226, + 200, + 1 + ], + [ + 688, + 361, + 2 + ], + [ + 1030, + 1144, + 3 + ], + [ + 1138, + 217, + 4 + ], + [ + 385, + 281, + 2 + ], + [ + 398, + 418, + 1 + ], + [ + 485, + 849, + 2 + ], + [ + 250, + 387, + 2 + ], + [ + 514, + 1014, + 2 + ], + [ + 677, + 1113, + 2 + ], + [ + 18, + 896, + 1 + ], + [ + 313, + 299, + 3 + ], + [ + 767, + 767, + 1 + ], + [ + 267, + 366, + 2 + ], + [ + 363, + 262, + 2 + ], + [ + 1359, + 1359, + 2 + ], + [ + 264, + 512, + 1 + ], + [ + 284, + 174, + 2 + ], + [ + 547, + 1022, + 2 + ], + [ + 926, + 926, + 2 + ], + [ + 248, + 248, + 1 + ], + [ + 529, + 529, + 6 + ], + [ + 648, + 1039, + 2 + ], + [ + 697, + 448, + 2 + ], + [ + 241, + 316, + 1 + ], + [ + 833, + 833, + 3 + ], + [ + 1117, + 1117, + 4 + ], + [ + 391, + 633, + 2 + ], + [ + 556, + 556, + 5 + ], + [ + 669, + 300, + 2 + ], + [ + 308, + 308, + 4 + ], + [ + 477, + 216, + 2 + ], + [ + 844, + 844, + 2 + ], + [ + 1248, + 1248, + 4 + ], + [ + 1677, + 463, + 4 + ], + [ + 422, + 422, + 3 + ], + [ + 1025, + 641, + 4 + ], + [ + 254, + 345, + 2 + ], + [ + 359, + 717, + 2 + ], + [ + 482, + 174, + 2 + ], + [ + 811, + 246, + 2 + ], + [ + 267, + 246, + 2 + ], + [ + 1894, + 660, + 2 + ], + [ + 193, + 752, + 2 + ], + [ + 294, + 521, + 2 + ], + [ + 333, + 1140, + 2 + ], + [ + 1026, + 484, + 4 + ], + [ + 69, + 305, + 1 + ], + [ + 176, + 474, + 2 + ], + [ + 376, + 1344, + 2 + ], + [ + 477, + 236, + 2 + ], + [ + 1053, + 325, + 4 + ], + [ + 1313, + 1313, + 1 + ], + [ + 1529, + 1529, + 2 + ], + [ + 113, + 113, + 1 + ], + [ + 240, + 240, + 7 + ], + [ + 245, + 261, + 3 + ], + [ + 225, + 199, + 2 + ], + [ + 316, + 210, + 1 + ], + [ + 362, + 322, + 2 + ], + [ + 1053, + 328, + 4 + ], + [ + 357, + 375, + 2 + ], + [ + 1041, + 479, + 2 + ], + [ + 1069, + 217, + 4 + ], + [ + 2708, + 182, + 4 + ], + [ + 25, + 24, + 1 + ], + [ + 524, + 346, + 3 + ], + [ + 1369, + 231, + 4 + ], + [ + 64, + 504, + 1 + ] + ] +} diff --git a/variants/extended-1st-10mm-8k/profiles/joint/primitives.npz b/variants/extended-1st-10mm-8k/profiles/joint/primitives.npz index 1bfcb546b8dfda088eefb623ab59fa79ebfed288..fca3682bc570414725b0be9cf5578ee0df57f06a 100644 --- a/variants/extended-1st-10mm-8k/profiles/joint/primitives.npz +++ b/variants/extended-1st-10mm-8k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7424271014df93fbf66a292a1b04aa0f8b999c7c3cf06f965278149d0e41f3e7 +oid sha256:8b7ac30aa699627d62397f7253a6d781c1d9cdea2e49f4f4ecf852fa8436e2c1 size 2834 diff --git a/variants/extended-1st-10mm-8k/router_config.yaml b/variants/extended-1st-10mm-8k/router_config.yaml index b4c3ff78a1f8dee44ebd4ce2f858c23db5fd929e..8be0e99f190ed5f3aed9daa04b0b5768a561a248 100644 --- a/variants/extended-1st-10mm-8k/router_config.yaml +++ b/variants/extended-1st-10mm-8k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-1mm-16k/config.json b/variants/extended-1st-1mm-16k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-1mm-16k/config.json +++ b/variants/extended-1st-1mm-16k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-1mm-16k/profiles/eef/primitives.npz b/variants/extended-1st-1mm-16k/profiles/eef/primitives.npz index c820267995e274355db50a20506f9978c3974a4d..501494faeaf05a7fb2bf3736f9665c8f68d5e5f1 100644 --- a/variants/extended-1st-1mm-16k/profiles/eef/primitives.npz +++ b/variants/extended-1st-1mm-16k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b +oid sha256:562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359 size 7406 diff --git a/variants/extended-1st-1mm-16k/profiles/joint/primitives.npz b/variants/extended-1st-1mm-16k/profiles/joint/primitives.npz index ffb31d7e9eb0dac8e9c4e55e97649d48f390fd62..eb4dab217c88f6b533f66f2bee18382fedd1ca86 100644 --- a/variants/extended-1st-1mm-16k/profiles/joint/primitives.npz +++ b/variants/extended-1st-1mm-16k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47222b9b4172f82899756a90757c3b7b679fc9ef8d54984d736518e9cc5cb3d0 +oid sha256:06226ceadec064c2b1c8b8ad3cf6fc71174e2ea63ab82cd08e63b86b380769f5 size 8922 diff --git a/variants/extended-1st-1mm-16k/router_config.yaml b/variants/extended-1st-1mm-16k/router_config.yaml index 77f26a18d9880f79629546ccd4845f5217538ea6..557d7f94204e12572e39868e2773533351622a42 100644 --- a/variants/extended-1st-1mm-16k/router_config.yaml +++ b/variants/extended-1st-1mm-16k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-1mm-2k/config.json b/variants/extended-1st-1mm-2k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-1mm-2k/config.json +++ b/variants/extended-1st-1mm-2k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-1mm-2k/profiles/eef/primitives.npz b/variants/extended-1st-1mm-2k/profiles/eef/primitives.npz index c820267995e274355db50a20506f9978c3974a4d..501494faeaf05a7fb2bf3736f9665c8f68d5e5f1 100644 --- a/variants/extended-1st-1mm-2k/profiles/eef/primitives.npz +++ b/variants/extended-1st-1mm-2k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b +oid sha256:562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359 size 7406 diff --git a/variants/extended-1st-1mm-2k/router_config.yaml b/variants/extended-1st-1mm-2k/router_config.yaml index 73d2824d8ce21f0adb5895e1a284de42d8c159ef..71c5c60dc694b540992af5e48faefbfc5ceb189e 100644 --- a/variants/extended-1st-1mm-2k/router_config.yaml +++ b/variants/extended-1st-1mm-2k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: eef token_offset: 0 @@ -12,9 +12,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -25,17 +28,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -46,17 +52,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -67,10 +76,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -81,17 +92,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -102,10 +116,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -116,5 +132,5 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 diff --git a/variants/extended-1st-1mm-4k/config.json b/variants/extended-1st-1mm-4k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-1mm-4k/config.json +++ b/variants/extended-1st-1mm-4k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-1mm-4k/profiles/eef/primitives.npz b/variants/extended-1st-1mm-4k/profiles/eef/primitives.npz index c820267995e274355db50a20506f9978c3974a4d..501494faeaf05a7fb2bf3736f9665c8f68d5e5f1 100644 --- a/variants/extended-1st-1mm-4k/profiles/eef/primitives.npz +++ b/variants/extended-1st-1mm-4k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b +oid sha256:562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359 size 7406 diff --git a/variants/extended-1st-1mm-4k/profiles/joint/primitives.npz b/variants/extended-1st-1mm-4k/profiles/joint/primitives.npz index ffb31d7e9eb0dac8e9c4e55e97649d48f390fd62..eb4dab217c88f6b533f66f2bee18382fedd1ca86 100644 --- a/variants/extended-1st-1mm-4k/profiles/joint/primitives.npz +++ b/variants/extended-1st-1mm-4k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47222b9b4172f82899756a90757c3b7b679fc9ef8d54984d736518e9cc5cb3d0 +oid sha256:06226ceadec064c2b1c8b8ad3cf6fc71174e2ea63ab82cd08e63b86b380769f5 size 8922 diff --git a/variants/extended-1st-1mm-4k/router_config.yaml b/variants/extended-1st-1mm-4k/router_config.yaml index 81d84daf4080562f963786a16f9881c12a86f27f..d6c4bfda4d941eb0ce694af93ba6a0b8bfdf4caa 100644 --- a/variants/extended-1st-1mm-4k/router_config.yaml +++ b/variants/extended-1st-1mm-4k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-1mm-8k/config.json b/variants/extended-1st-1mm-8k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-1mm-8k/config.json +++ b/variants/extended-1st-1mm-8k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-1mm-8k/profiles/eef/primitives.npz b/variants/extended-1st-1mm-8k/profiles/eef/primitives.npz index c820267995e274355db50a20506f9978c3974a4d..501494faeaf05a7fb2bf3736f9665c8f68d5e5f1 100644 --- a/variants/extended-1st-1mm-8k/profiles/eef/primitives.npz +++ b/variants/extended-1st-1mm-8k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b393814f311daf6b609475c9cf943bfc9dde617b6b4249bb404df50d98b2526b +oid sha256:562b7b0fddb4c1df44e662a0f07ff5576e84372b9c6529f859ef83e883eea359 size 7406 diff --git a/variants/extended-1st-1mm-8k/profiles/joint/primitives.npz b/variants/extended-1st-1mm-8k/profiles/joint/primitives.npz index ffb31d7e9eb0dac8e9c4e55e97649d48f390fd62..eb4dab217c88f6b533f66f2bee18382fedd1ca86 100644 --- a/variants/extended-1st-1mm-8k/profiles/joint/primitives.npz +++ b/variants/extended-1st-1mm-8k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47222b9b4172f82899756a90757c3b7b679fc9ef8d54984d736518e9cc5cb3d0 +oid sha256:06226ceadec064c2b1c8b8ad3cf6fc71174e2ea63ab82cd08e63b86b380769f5 size 8922 diff --git a/variants/extended-1st-1mm-8k/router_config.yaml b/variants/extended-1st-1mm-8k/router_config.yaml index 22c0cbd57a8f52be2a44cdcf2342c4101b05f4e4..a07e95eefc70d3d634b331058521d90ffc20b771 100644 --- a/variants/extended-1st-1mm-8k/router_config.yaml +++ b/variants/extended-1st-1mm-8k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-5mm-16k/config.json b/variants/extended-1st-5mm-16k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-5mm-16k/config.json +++ b/variants/extended-1st-5mm-16k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-5mm-16k/profiles/eef/primitives.npz b/variants/extended-1st-5mm-16k/profiles/eef/primitives.npz index 44372132bdbeb1e64c5a6c3604b6626e35133ae0..5b476e918c133e6ff22fbd3aa9adce431e4c2df8 100644 --- a/variants/extended-1st-5mm-16k/profiles/eef/primitives.npz +++ b/variants/extended-1st-5mm-16k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072 +oid sha256:0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322 size 3038 diff --git a/variants/extended-1st-5mm-16k/profiles/joint/primitives.npz b/variants/extended-1st-5mm-16k/profiles/joint/primitives.npz index 8a36f3a1a93481bf6084a73c66ef43deed8c4b23..5164a5a6c7760295114df12a8bd84e4dbea501b3 100644 --- a/variants/extended-1st-5mm-16k/profiles/joint/primitives.npz +++ b/variants/extended-1st-5mm-16k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa +oid sha256:926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191 size 3514 diff --git a/variants/extended-1st-5mm-16k/router_config.yaml b/variants/extended-1st-5mm-16k/router_config.yaml index 2382899a23a7b482961c2092f4dc05534122c60f..f47bd95225856eb4424219129446c58f00206e1a 100644 --- a/variants/extended-1st-5mm-16k/router_config.yaml +++ b/variants/extended-1st-5mm-16k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-5mm-1k/config.json b/variants/extended-1st-5mm-1k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-5mm-1k/config.json +++ b/variants/extended-1st-5mm-1k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-5mm-1k/profiles/eef/primitives.npz b/variants/extended-1st-5mm-1k/profiles/eef/primitives.npz index 44372132bdbeb1e64c5a6c3604b6626e35133ae0..5b476e918c133e6ff22fbd3aa9adce431e4c2df8 100644 --- a/variants/extended-1st-5mm-1k/profiles/eef/primitives.npz +++ b/variants/extended-1st-5mm-1k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072 +oid sha256:0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322 size 3038 diff --git a/variants/extended-1st-5mm-1k/profiles/joint/primitives.npz b/variants/extended-1st-5mm-1k/profiles/joint/primitives.npz index 8a36f3a1a93481bf6084a73c66ef43deed8c4b23..5164a5a6c7760295114df12a8bd84e4dbea501b3 100644 --- a/variants/extended-1st-5mm-1k/profiles/joint/primitives.npz +++ b/variants/extended-1st-5mm-1k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa +oid sha256:926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191 size 3514 diff --git a/variants/extended-1st-5mm-1k/router_config.yaml b/variants/extended-1st-5mm-1k/router_config.yaml index b3a1a40502b668e214944fbce67cf72ed596bb64..deebae04c2212be7da5918e1bdf13c0226905ed6 100644 --- a/variants/extended-1st-5mm-1k/router_config.yaml +++ b/variants/extended-1st-5mm-1k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-5mm-2k/config.json b/variants/extended-1st-5mm-2k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-5mm-2k/config.json +++ b/variants/extended-1st-5mm-2k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-5mm-2k/profiles/eef/primitives.npz b/variants/extended-1st-5mm-2k/profiles/eef/primitives.npz index 44372132bdbeb1e64c5a6c3604b6626e35133ae0..5b476e918c133e6ff22fbd3aa9adce431e4c2df8 100644 --- a/variants/extended-1st-5mm-2k/profiles/eef/primitives.npz +++ b/variants/extended-1st-5mm-2k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072 +oid sha256:0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322 size 3038 diff --git a/variants/extended-1st-5mm-2k/profiles/joint/primitives.npz b/variants/extended-1st-5mm-2k/profiles/joint/primitives.npz index 8a36f3a1a93481bf6084a73c66ef43deed8c4b23..5164a5a6c7760295114df12a8bd84e4dbea501b3 100644 --- a/variants/extended-1st-5mm-2k/profiles/joint/primitives.npz +++ b/variants/extended-1st-5mm-2k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa +oid sha256:926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191 size 3514 diff --git a/variants/extended-1st-5mm-2k/router_config.yaml b/variants/extended-1st-5mm-2k/router_config.yaml index 605d719e3962bec20371d08b5ee287ad50306bc2..1f1450619a946e8d0b9189aa8a501a4896b16220 100644 --- a/variants/extended-1st-5mm-2k/router_config.yaml +++ b/variants/extended-1st-5mm-2k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-5mm-4k/config.json b/variants/extended-1st-5mm-4k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-5mm-4k/config.json +++ b/variants/extended-1st-5mm-4k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-5mm-4k/profiles/eef/primitives.npz b/variants/extended-1st-5mm-4k/profiles/eef/primitives.npz index 44372132bdbeb1e64c5a6c3604b6626e35133ae0..5b476e918c133e6ff22fbd3aa9adce431e4c2df8 100644 --- a/variants/extended-1st-5mm-4k/profiles/eef/primitives.npz +++ b/variants/extended-1st-5mm-4k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072 +oid sha256:0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322 size 3038 diff --git a/variants/extended-1st-5mm-4k/profiles/joint/primitives.npz b/variants/extended-1st-5mm-4k/profiles/joint/primitives.npz index 8a36f3a1a93481bf6084a73c66ef43deed8c4b23..5164a5a6c7760295114df12a8bd84e4dbea501b3 100644 --- a/variants/extended-1st-5mm-4k/profiles/joint/primitives.npz +++ b/variants/extended-1st-5mm-4k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa +oid sha256:926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191 size 3514 diff --git a/variants/extended-1st-5mm-4k/router_config.yaml b/variants/extended-1st-5mm-4k/router_config.yaml index 0e487c968ac84cc34721489f7e757618dd85c559..079eb793916cff3a20ddf0039ded1ddb6795d276 100644 --- a/variants/extended-1st-5mm-4k/router_config.yaml +++ b/variants/extended-1st-5mm-4k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-1st-5mm-8k/config.json b/variants/extended-1st-5mm-8k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-1st-5mm-8k/config.json +++ b/variants/extended-1st-5mm-8k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-1st-5mm-8k/profiles/eef/primitives.npz b/variants/extended-1st-5mm-8k/profiles/eef/primitives.npz index 44372132bdbeb1e64c5a6c3604b6626e35133ae0..5b476e918c133e6ff22fbd3aa9adce431e4c2df8 100644 --- a/variants/extended-1st-5mm-8k/profiles/eef/primitives.npz +++ b/variants/extended-1st-5mm-8k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072 +oid sha256:0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322 size 3038 diff --git a/variants/extended-1st-5mm-8k/profiles/joint/primitives.npz b/variants/extended-1st-5mm-8k/profiles/joint/primitives.npz index 8a36f3a1a93481bf6084a73c66ef43deed8c4b23..5164a5a6c7760295114df12a8bd84e4dbea501b3 100644 --- a/variants/extended-1st-5mm-8k/profiles/joint/primitives.npz +++ b/variants/extended-1st-5mm-8k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa +oid sha256:926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191 size 3514 diff --git a/variants/extended-1st-5mm-8k/router_config.yaml b/variants/extended-1st-5mm-8k/router_config.yaml index e7d2047cd87678bbb66d707fbcf344f593c01d80..eaf191924a4deda706b8b2db3b4e3690153a30c6 100644 --- a/variants/extended-1st-5mm-8k/router_config.yaml +++ b/variants/extended-1st-5mm-8k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-10mm-16k/config.json b/variants/extended-2nd-10mm-16k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-10mm-16k/config.json +++ b/variants/extended-2nd-10mm-16k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-10mm-16k/profiles/eef/primitives.npz b/variants/extended-2nd-10mm-16k/profiles/eef/primitives.npz index 0a388d7ac9833a5d94a96bc6ad61b83802f422ac..0b37f2be76abc3b1082361237a2987d0d70203db 100644 --- a/variants/extended-2nd-10mm-16k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-10mm-16k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7 +oid sha256:cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b size 2246 diff --git a/variants/extended-2nd-10mm-16k/profiles/joint/primitives.npz b/variants/extended-2nd-10mm-16k/profiles/joint/primitives.npz index 72abe4be954e7f430681910172a061940bb297b7..ca04a69878a5d9ee317674464672abff3e20b64a 100644 --- a/variants/extended-2nd-10mm-16k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-10mm-16k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2 +oid sha256:5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a size 2714 diff --git a/variants/extended-2nd-10mm-16k/router_config.yaml b/variants/extended-2nd-10mm-16k/router_config.yaml index bf9fb1201d641ce57d888d269f84717d4d57c78e..5bfe4e60fc466b0326c3c2e01ae094d44801c8d8 100644 --- a/variants/extended-2nd-10mm-16k/router_config.yaml +++ b/variants/extended-2nd-10mm-16k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-10mm-1k/config.json b/variants/extended-2nd-10mm-1k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-10mm-1k/config.json +++ b/variants/extended-2nd-10mm-1k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-10mm-1k/profiles/eef/primitives.npz b/variants/extended-2nd-10mm-1k/profiles/eef/primitives.npz index 0a388d7ac9833a5d94a96bc6ad61b83802f422ac..0b37f2be76abc3b1082361237a2987d0d70203db 100644 --- a/variants/extended-2nd-10mm-1k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-10mm-1k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7 +oid sha256:cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b size 2246 diff --git a/variants/extended-2nd-10mm-1k/profiles/joint/primitives.npz b/variants/extended-2nd-10mm-1k/profiles/joint/primitives.npz index 72abe4be954e7f430681910172a061940bb297b7..ca04a69878a5d9ee317674464672abff3e20b64a 100644 --- a/variants/extended-2nd-10mm-1k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-10mm-1k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2 +oid sha256:5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a size 2714 diff --git a/variants/extended-2nd-10mm-1k/router_config.yaml b/variants/extended-2nd-10mm-1k/router_config.yaml index 5aab002c07df21d62fc8abf1c63640f50b23d7f5..ec382f97b24befb4cdbd05aabd6818dd6d321692 100644 --- a/variants/extended-2nd-10mm-1k/router_config.yaml +++ b/variants/extended-2nd-10mm-1k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-10mm-2k/config.json b/variants/extended-2nd-10mm-2k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-10mm-2k/config.json +++ b/variants/extended-2nd-10mm-2k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-10mm-2k/profiles/eef/primitives.npz b/variants/extended-2nd-10mm-2k/profiles/eef/primitives.npz index 0a388d7ac9833a5d94a96bc6ad61b83802f422ac..0b37f2be76abc3b1082361237a2987d0d70203db 100644 --- a/variants/extended-2nd-10mm-2k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-10mm-2k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7 +oid sha256:cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b size 2246 diff --git a/variants/extended-2nd-10mm-2k/profiles/joint/primitives.npz b/variants/extended-2nd-10mm-2k/profiles/joint/primitives.npz index 72abe4be954e7f430681910172a061940bb297b7..ca04a69878a5d9ee317674464672abff3e20b64a 100644 --- a/variants/extended-2nd-10mm-2k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-10mm-2k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2 +oid sha256:5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a size 2714 diff --git a/variants/extended-2nd-10mm-2k/router_config.yaml b/variants/extended-2nd-10mm-2k/router_config.yaml index 49316bc66251615f3049733cb6a0aae84b4aa22f..d719e5a72521eba25ab78b03e6f82e10c426dc31 100644 --- a/variants/extended-2nd-10mm-2k/router_config.yaml +++ b/variants/extended-2nd-10mm-2k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-10mm-4k/config.json b/variants/extended-2nd-10mm-4k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-10mm-4k/config.json +++ b/variants/extended-2nd-10mm-4k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-10mm-4k/profiles/eef/primitives.npz b/variants/extended-2nd-10mm-4k/profiles/eef/primitives.npz index 0a388d7ac9833a5d94a96bc6ad61b83802f422ac..0b37f2be76abc3b1082361237a2987d0d70203db 100644 --- a/variants/extended-2nd-10mm-4k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-10mm-4k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7 +oid sha256:cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b size 2246 diff --git a/variants/extended-2nd-10mm-4k/profiles/joint/primitives.npz b/variants/extended-2nd-10mm-4k/profiles/joint/primitives.npz index 72abe4be954e7f430681910172a061940bb297b7..ca04a69878a5d9ee317674464672abff3e20b64a 100644 --- a/variants/extended-2nd-10mm-4k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-10mm-4k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2 +oid sha256:5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a size 2714 diff --git a/variants/extended-2nd-10mm-4k/router_config.yaml b/variants/extended-2nd-10mm-4k/router_config.yaml index fb3e307ebd93e9ddd4731981f4f0c8b34ee013d2..ae0f135d18dafd54f416aca9e426e33b7cb476cf 100644 --- a/variants/extended-2nd-10mm-4k/router_config.yaml +++ b/variants/extended-2nd-10mm-4k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-10mm-8k/config.json b/variants/extended-2nd-10mm-8k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-10mm-8k/config.json +++ b/variants/extended-2nd-10mm-8k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-10mm-8k/profiles/eef/primitives.npz b/variants/extended-2nd-10mm-8k/profiles/eef/primitives.npz index 0a388d7ac9833a5d94a96bc6ad61b83802f422ac..0b37f2be76abc3b1082361237a2987d0d70203db 100644 --- a/variants/extended-2nd-10mm-8k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-10mm-8k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9169a8a287537d95d2cfd6e77ff99068ae68c8f96b1592b6439b77cf659c70c7 +oid sha256:cf6a4c5cde78d34eb6ace994eb6d7e1957601696d60d9820bc788124b2a66d7b size 2246 diff --git a/variants/extended-2nd-10mm-8k/profiles/joint/primitives.npz b/variants/extended-2nd-10mm-8k/profiles/joint/primitives.npz index 72abe4be954e7f430681910172a061940bb297b7..ca04a69878a5d9ee317674464672abff3e20b64a 100644 --- a/variants/extended-2nd-10mm-8k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-10mm-8k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ef3c45f7d98dfc9150b5613ed1a966b13e261219fd9b3b88d5212c725b8f9a2 +oid sha256:5d851023a6e85985b30cc9eeb2df25948ac083dee0b8083c0a67f153bcb2f73a size 2714 diff --git a/variants/extended-2nd-10mm-8k/router_config.yaml b/variants/extended-2nd-10mm-8k/router_config.yaml index a78ec7942af88e903da1cdec72bcb21cbda52dc6..e056084d61b3f66337505cbe1381d1277a91e315 100644 --- a/variants/extended-2nd-10mm-8k/router_config.yaml +++ b/variants/extended-2nd-10mm-8k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-1mm-16k/config.json b/variants/extended-2nd-1mm-16k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-1mm-16k/config.json +++ b/variants/extended-2nd-1mm-16k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-1mm-16k/profiles/eef/primitives.npz b/variants/extended-2nd-1mm-16k/profiles/eef/primitives.npz index 2b88b1436bfa3b9b33443e17b973236b27ac7b92..57cbf91fdfafb556f79b3e28436892d706c91d90 100644 --- a/variants/extended-2nd-1mm-16k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-1mm-16k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378 +oid sha256:e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840 size 3806 diff --git a/variants/extended-2nd-1mm-16k/profiles/joint/primitives.npz b/variants/extended-2nd-1mm-16k/profiles/joint/primitives.npz index 60f8b727d417c367e131a409b7e727769dc2d2b7..d83b0cbfdf57979fd8dc6779dfdccf731a790039 100644 --- a/variants/extended-2nd-1mm-16k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-1mm-16k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b53d754ac5d71978ae8756380b2be58fa1ca53f7c281123e52f8ede281be1fd8 +oid sha256:54a2f0c8fb757b0feb9638cd9871b07ca79a204518ef9c461dedf865485ee083 size 7066 diff --git a/variants/extended-2nd-1mm-16k/router_config.yaml b/variants/extended-2nd-1mm-16k/router_config.yaml index 5129a45127846c13e3ea6640027d5bd48d8f303e..4ab996f0d95624b6b534e64424becfa0069ead46 100644 --- a/variants/extended-2nd-1mm-16k/router_config.yaml +++ b/variants/extended-2nd-1mm-16k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-1mm-2k/config.json b/variants/extended-2nd-1mm-2k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-1mm-2k/config.json +++ b/variants/extended-2nd-1mm-2k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-1mm-2k/profiles/eef/primitives.npz b/variants/extended-2nd-1mm-2k/profiles/eef/primitives.npz index 2b88b1436bfa3b9b33443e17b973236b27ac7b92..57cbf91fdfafb556f79b3e28436892d706c91d90 100644 --- a/variants/extended-2nd-1mm-2k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-1mm-2k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378 +oid sha256:e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840 size 3806 diff --git a/variants/extended-2nd-1mm-2k/router_config.yaml b/variants/extended-2nd-1mm-2k/router_config.yaml index abf683cd9058a20ae61b4f17350b25ec54707308..7b2bafdc02def2b8093bdb50370cfb85e0875e06 100644 --- a/variants/extended-2nd-1mm-2k/router_config.yaml +++ b/variants/extended-2nd-1mm-2k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: eef token_offset: 0 @@ -12,9 +12,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -25,17 +28,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -46,17 +52,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -67,10 +76,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -81,17 +92,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -102,10 +116,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -116,5 +132,5 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 diff --git a/variants/extended-2nd-1mm-4k/config.json b/variants/extended-2nd-1mm-4k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-1mm-4k/config.json +++ b/variants/extended-2nd-1mm-4k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-1mm-4k/profiles/eef/primitives.npz b/variants/extended-2nd-1mm-4k/profiles/eef/primitives.npz index 2b88b1436bfa3b9b33443e17b973236b27ac7b92..57cbf91fdfafb556f79b3e28436892d706c91d90 100644 --- a/variants/extended-2nd-1mm-4k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-1mm-4k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378 +oid sha256:e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840 size 3806 diff --git a/variants/extended-2nd-1mm-4k/profiles/joint/primitives.npz b/variants/extended-2nd-1mm-4k/profiles/joint/primitives.npz index 60f8b727d417c367e131a409b7e727769dc2d2b7..d83b0cbfdf57979fd8dc6779dfdccf731a790039 100644 --- a/variants/extended-2nd-1mm-4k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-1mm-4k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b53d754ac5d71978ae8756380b2be58fa1ca53f7c281123e52f8ede281be1fd8 +oid sha256:54a2f0c8fb757b0feb9638cd9871b07ca79a204518ef9c461dedf865485ee083 size 7066 diff --git a/variants/extended-2nd-1mm-4k/router_config.yaml b/variants/extended-2nd-1mm-4k/router_config.yaml index 5ab7917bb6dd77cdd636c37f50f574e5a346c5d9..e4fedc5aa6151a15c134e8b860e5d7b426bf769f 100644 --- a/variants/extended-2nd-1mm-4k/router_config.yaml +++ b/variants/extended-2nd-1mm-4k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-1mm-8k/config.json b/variants/extended-2nd-1mm-8k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-1mm-8k/config.json +++ b/variants/extended-2nd-1mm-8k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-1mm-8k/profiles/eef/primitives.npz b/variants/extended-2nd-1mm-8k/profiles/eef/primitives.npz index 2b88b1436bfa3b9b33443e17b973236b27ac7b92..57cbf91fdfafb556f79b3e28436892d706c91d90 100644 --- a/variants/extended-2nd-1mm-8k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-1mm-8k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e513d565ffc1527eb0420e27c490470f35a7d9ed667daa4f73ebcfc25c8b5378 +oid sha256:e2d52417c14e866c0b93de3288568156c41357f1b7c4c32e1c0ce91b3e6f7840 size 3806 diff --git a/variants/extended-2nd-1mm-8k/profiles/joint/primitives.npz b/variants/extended-2nd-1mm-8k/profiles/joint/primitives.npz index 60f8b727d417c367e131a409b7e727769dc2d2b7..d83b0cbfdf57979fd8dc6779dfdccf731a790039 100644 --- a/variants/extended-2nd-1mm-8k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-1mm-8k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b53d754ac5d71978ae8756380b2be58fa1ca53f7c281123e52f8ede281be1fd8 +oid sha256:54a2f0c8fb757b0feb9638cd9871b07ca79a204518ef9c461dedf865485ee083 size 7066 diff --git a/variants/extended-2nd-1mm-8k/router_config.yaml b/variants/extended-2nd-1mm-8k/router_config.yaml index 504ec1d13ca57a5200be41827b45e7c5446103d3..be7caacfa12fa7c81b658d8dbb104044ea2eb6a1 100644 --- a/variants/extended-2nd-1mm-8k/router_config.yaml +++ b/variants/extended-2nd-1mm-8k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-5mm-16k/config.json b/variants/extended-2nd-5mm-16k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-5mm-16k/config.json +++ b/variants/extended-2nd-5mm-16k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-5mm-16k/profiles/eef/primitives.npz b/variants/extended-2nd-5mm-16k/profiles/eef/primitives.npz index 3b532ce78a59ff2c56ae800907bc19bf5bf8bf32..1e80b1ab9fb762618c14a9d390871505d6ac99b2 100644 --- a/variants/extended-2nd-5mm-16k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-5mm-16k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537 +oid sha256:fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840 size 2414 diff --git a/variants/extended-2nd-5mm-16k/profiles/joint/primitives.npz b/variants/extended-2nd-5mm-16k/profiles/joint/primitives.npz index 13e57400768bd35278682c540ac052afedc2879e..c21660557c083c5b15d63318bf61324126a41a9f 100644 --- a/variants/extended-2nd-5mm-16k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-5mm-16k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf +oid sha256:74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1 size 3194 diff --git a/variants/extended-2nd-5mm-16k/router_config.yaml b/variants/extended-2nd-5mm-16k/router_config.yaml index 9c5c3b084cc352cb7dfd8c74996e9a84ca98f7a5..ca3810274189f85900b06fb49e6b867abefc56f7 100644 --- a/variants/extended-2nd-5mm-16k/router_config.yaml +++ b/variants/extended-2nd-5mm-16k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-5mm-1k/config.json b/variants/extended-2nd-5mm-1k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-5mm-1k/config.json +++ b/variants/extended-2nd-5mm-1k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-5mm-1k/profiles/eef/primitives.npz b/variants/extended-2nd-5mm-1k/profiles/eef/primitives.npz index 3b532ce78a59ff2c56ae800907bc19bf5bf8bf32..1e80b1ab9fb762618c14a9d390871505d6ac99b2 100644 --- a/variants/extended-2nd-5mm-1k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-5mm-1k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537 +oid sha256:fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840 size 2414 diff --git a/variants/extended-2nd-5mm-1k/profiles/joint/primitives.npz b/variants/extended-2nd-5mm-1k/profiles/joint/primitives.npz index 13e57400768bd35278682c540ac052afedc2879e..c21660557c083c5b15d63318bf61324126a41a9f 100644 --- a/variants/extended-2nd-5mm-1k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-5mm-1k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf +oid sha256:74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1 size 3194 diff --git a/variants/extended-2nd-5mm-1k/router_config.yaml b/variants/extended-2nd-5mm-1k/router_config.yaml index e295439ffdfcab1a232b5cbafd0ad140efad6780..8cee4650725e30c65d69b4015e90aba6c1d4fe12 100644 --- a/variants/extended-2nd-5mm-1k/router_config.yaml +++ b/variants/extended-2nd-5mm-1k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-5mm-2k/config.json b/variants/extended-2nd-5mm-2k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-5mm-2k/config.json +++ b/variants/extended-2nd-5mm-2k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-5mm-2k/profiles/eef/primitives.npz b/variants/extended-2nd-5mm-2k/profiles/eef/primitives.npz index 3b532ce78a59ff2c56ae800907bc19bf5bf8bf32..1e80b1ab9fb762618c14a9d390871505d6ac99b2 100644 --- a/variants/extended-2nd-5mm-2k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-5mm-2k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537 +oid sha256:fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840 size 2414 diff --git a/variants/extended-2nd-5mm-2k/profiles/joint/primitives.npz b/variants/extended-2nd-5mm-2k/profiles/joint/primitives.npz index 13e57400768bd35278682c540ac052afedc2879e..c21660557c083c5b15d63318bf61324126a41a9f 100644 --- a/variants/extended-2nd-5mm-2k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-5mm-2k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf +oid sha256:74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1 size 3194 diff --git a/variants/extended-2nd-5mm-2k/router_config.yaml b/variants/extended-2nd-5mm-2k/router_config.yaml index 0c740ec4a156fb8ef1c0657f22aa294c58724bba..7972dcf6298b3b9c39f5d758a630b102aead4ebf 100644 --- a/variants/extended-2nd-5mm-2k/router_config.yaml +++ b/variants/extended-2nd-5mm-2k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-5mm-4k/config.json b/variants/extended-2nd-5mm-4k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-5mm-4k/config.json +++ b/variants/extended-2nd-5mm-4k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-5mm-4k/profiles/eef/primitives.npz b/variants/extended-2nd-5mm-4k/profiles/eef/primitives.npz index 3b532ce78a59ff2c56ae800907bc19bf5bf8bf32..1e80b1ab9fb762618c14a9d390871505d6ac99b2 100644 --- a/variants/extended-2nd-5mm-4k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-5mm-4k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537 +oid sha256:fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840 size 2414 diff --git a/variants/extended-2nd-5mm-4k/profiles/joint/primitives.npz b/variants/extended-2nd-5mm-4k/profiles/joint/primitives.npz index 13e57400768bd35278682c540ac052afedc2879e..c21660557c083c5b15d63318bf61324126a41a9f 100644 --- a/variants/extended-2nd-5mm-4k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-5mm-4k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf +oid sha256:74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1 size 3194 diff --git a/variants/extended-2nd-5mm-4k/router_config.yaml b/variants/extended-2nd-5mm-4k/router_config.yaml index 21fa9b0a9552f80d8936cb5fd8b6e468e2ddbcde..9673ec5e323f75f6a2dde169bf0fb8ac1afb65b2 100644 --- a/variants/extended-2nd-5mm-4k/router_config.yaml +++ b/variants/extended-2nd-5mm-4k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/extended-2nd-5mm-8k/config.json b/variants/extended-2nd-5mm-8k/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/extended-2nd-5mm-8k/config.json +++ b/variants/extended-2nd-5mm-8k/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/extended-2nd-5mm-8k/profiles/eef/primitives.npz b/variants/extended-2nd-5mm-8k/profiles/eef/primitives.npz index 3b532ce78a59ff2c56ae800907bc19bf5bf8bf32..1e80b1ab9fb762618c14a9d390871505d6ac99b2 100644 --- a/variants/extended-2nd-5mm-8k/profiles/eef/primitives.npz +++ b/variants/extended-2nd-5mm-8k/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537 +oid sha256:fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840 size 2414 diff --git a/variants/extended-2nd-5mm-8k/profiles/joint/primitives.npz b/variants/extended-2nd-5mm-8k/profiles/joint/primitives.npz index 13e57400768bd35278682c540ac052afedc2879e..c21660557c083c5b15d63318bf61324126a41a9f 100644 --- a/variants/extended-2nd-5mm-8k/profiles/joint/primitives.npz +++ b/variants/extended-2nd-5mm-8k/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf +oid sha256:74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1 size 3194 diff --git a/variants/extended-2nd-5mm-8k/router_config.yaml b/variants/extended-2nd-5mm-8k/router_config.yaml index c73c6e51cb5702ace0688634016d6cc520bb15cc..d76a376d0e088223b12acb53efec9d91d2013b8f 100644 --- a/variants/extended-2nd-5mm-8k/router_config.yaml +++ b/variants/extended-2nd-5mm-8k/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/paper-1st/config.json b/variants/paper-1st/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/paper-1st/config.json +++ b/variants/paper-1st/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/paper-1st/profiles/eef/primitives.npz b/variants/paper-1st/profiles/eef/primitives.npz index 44372132bdbeb1e64c5a6c3604b6626e35133ae0..5b476e918c133e6ff22fbd3aa9adce431e4c2df8 100644 --- a/variants/paper-1st/profiles/eef/primitives.npz +++ b/variants/paper-1st/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c98f587c6bf5b4b278e166126cae6c21de48682e55ea56da8c3ea411121072 +oid sha256:0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322 size 3038 diff --git a/variants/paper-1st/profiles/joint/primitives.npz b/variants/paper-1st/profiles/joint/primitives.npz index 8a36f3a1a93481bf6084a73c66ef43deed8c4b23..5164a5a6c7760295114df12a8bd84e4dbea501b3 100644 --- a/variants/paper-1st/profiles/joint/primitives.npz +++ b/variants/paper-1st/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d1853b1ef4425f474a78c24162a110e77e01a23c00040d09eccdf42302666fa +oid sha256:926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191 size 3514 diff --git a/variants/paper-1st/router_config.yaml b/variants/paper-1st/router_config.yaml index cb7506e9d5f21ebb94e12d2003e240183eb6d2c6..19bece30d4260a633a75fec2651d119ea3b459d3 100644 --- a/variants/paper-1st/router_config.yaml +++ b/variants/paper-1st/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/paper-2nd/config.json b/variants/paper-2nd/config.json index fe98b52e0a07faed76f56cff0aee215091a4a2d3..fe4e3698816e3859a4c783c816109fc46125b044 100644 --- a/variants/paper-2nd/config.json +++ b/variants/paper-2nd/config.json @@ -1,4 +1,7 @@ { "model_type": "actioncodec2", - "processor_class": "ActionCodec2" + "processor_class": "ActionCodec2", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } } diff --git a/variants/paper-2nd/profiles/eef/primitives.npz b/variants/paper-2nd/profiles/eef/primitives.npz index 3b532ce78a59ff2c56ae800907bc19bf5bf8bf32..1e80b1ab9fb762618c14a9d390871505d6ac99b2 100644 --- a/variants/paper-2nd/profiles/eef/primitives.npz +++ b/variants/paper-2nd/profiles/eef/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9da1d7bf2a81745a57f36cce40b9cd7487e46329552c1d71e4332a2ebad7a537 +oid sha256:fcd5de109a900717abf00b61c957fc434dd0e8a2e24fe251ded6616da47da840 size 2414 diff --git a/variants/paper-2nd/profiles/joint/primitives.npz b/variants/paper-2nd/profiles/joint/primitives.npz index 13e57400768bd35278682c540ac052afedc2879e..c21660557c083c5b15d63318bf61324126a41a9f 100644 --- a/variants/paper-2nd/profiles/joint/primitives.npz +++ b/variants/paper-2nd/profiles/joint/primitives.npz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d99ffa7f635fea19316e18126cf9772bef3fc9dd7b8cd1ff95df001fb3c831cf +oid sha256:74af338c80d89d48f3dee8585279e68f848fd0b6075f01792b0fff92ae51e4e1 size 3194 diff --git a/variants/paper-2nd/router_config.yaml b/variants/paper-2nd/router_config.yaml index 4ff00115340395b1ce6c0257dcb2703e6bb9f2bf..c57a49db29d67171ac3ca4002159afa431d3eb56 100644 --- a/variants/paper-2nd/router_config.yaml +++ b/variants/paper-2nd/router_config.yaml @@ -1,5 +1,5 @@ model_type: actioncodec2_router -config_version: 3 +config_version: 4 profiles: - name: joint token_offset: 0 @@ -16,9 +16,12 @@ presets: source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -29,17 +32,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_abs input_dim: 7 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -47,18 +53,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_abs input_dim: 8 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -67,18 +77,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_eef_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -89,17 +103,20 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint6_delta input_dim: 7 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -107,18 +124,22 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: single_joint7_delta input_dim: 8 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -127,18 +148,22 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -149,10 +174,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -163,17 +190,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_abs input_dim: 14 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -181,11 +211,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -193,18 +226,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_abs input_dim: 16 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -213,11 +250,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -226,18 +266,22 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_eef_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 0 - 1 @@ -248,10 +292,12 @@ presets: - 5 rotation_format: rotation_vector gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: eef + gripper_threshold: 0.8 + gripper_open_is_high: true position_dims: - 7 - 8 @@ -262,17 +308,20 @@ presets: - 12 rotation_format: rotation_vector gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint6_delta input_dim: 14 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -280,11 +329,14 @@ presets: - 3 - 4 - 5 + joint_wrap: pi gripper_dim: 6 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 7 - 8 @@ -292,18 +344,22 @@ presets: - 10 - 11 - 12 + joint_wrap: pi gripper_dim: 13 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 - name: dual_joint7_delta input_dim: 16 input: delta source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: left_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 0 - 1 @@ -312,11 +368,14 @@ presets: - 4 - 5 - 6 + joint_wrap: pi gripper_dim: 7 - gripper_threshold: 0.8 - gripper_open_is_high: true + gripper_closed_value: 0.0 + gripper_open_value: 1.0 right_arm: space: joint + gripper_threshold: 0.8 + gripper_open_is_high: true joint_dims: - 8 - 9 @@ -325,15 +384,17 @@ presets: - 12 - 13 - 14 + joint_wrap: pi gripper_dim: 15 - gripper_threshold: 0.8 - gripper_open_is_high: true -- name: single_joint6_abs_continuous_gripper + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper input_dim: 6 input: absolute source_hz: 15.0 target_hz: 15.0 interpolation: cubic + token_order: time_major components: arm: space: joint @@ -344,3 +405,4 @@ presets: - 3 - 4 - 5 + joint_wrap: pi diff --git a/variants/sparse-high-dynamic-21bin/config.json b/variants/sparse-high-dynamic-21bin/config.json new file mode 100644 index 0000000000000000000000000000000000000000..f7d16472edea73c2ca2aff65a40b062aff408c4a --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/config.json @@ -0,0 +1,7 @@ +{ + "model_type": "actioncodec2_sparse", + "processor_class": "ActionCodec2Sparse", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-high-dynamic-21bin/processor_config.json b/variants/sparse-high-dynamic-21bin/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..b1ec8b351044eaac6c53ec754866abd50d881551 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/processor_config.json @@ -0,0 +1,61 @@ +{ + "processor_class": "ActionCodec2Sparse", + "action_space": "single_eef_delta", + "fitted_profiles": [ + "eef", + "joint" + ], + "preprocessing": { + "eef": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": [ + 0, + 1, + 2 + ], + "gripper_mode": "twenty", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "eef", + "context_frames": 1, + "motion_limits": null, + "translation_limit": 0.00125, + "rotation_limit": 0.005 + }, + "joint": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": null, + "gripper_mode": "twenty", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "joint", + "context_frames": 1, + "motion_limits": [ + 0.001, + 0.001, + 0.0015, + 0.001875, + 0.00375, + 0.005, + 0.005 + ], + "translation_limit": null, + "rotation_limit": null + } + }, + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-high-dynamic-21bin/profiles/eef/config.json b/variants/sparse-high-dynamic-21bin/profiles/eef/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/eef/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-high-dynamic-21bin/profiles/eef/config.yaml b/variants/sparse-high-dynamic-21bin/profiles/eef/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..248189501db1a7f3bbf027a665d0faa77b797e20 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/eef/config.yaml @@ -0,0 +1,78 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 7 + components: + translation_m: + dims: + start: 0 + stop: 3 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -2.0 + max: 2.0 + order_1: + min: -0.13333333333333333 + max: 0.13333333333333333 + distortion_limit: 0.005 + primitive_selection: smooth + orientation_so3: + dims: + start: 3 + stop: 6 + space: so3 + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -3.141592653589793 + max: 3.141592653589793 + order_1: + min: -0.4166666666666667 + max: 0.4166666666666667 + distortion_limit: 0.02 + primitive_selection: momentum_lazy + representation: rotation_vector + multiplication: right + gripper_open_command: + dims: + - 6 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.025 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - translation_m + - orientation_so3 + bpe: + spatial_vocab_size: 304 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 1.8 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-high-dynamic-21bin/profiles/eef/primitives.npz b/variants/sparse-high-dynamic-21bin/profiles/eef/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..5ece2101d5df985ca874fe39bd91a418263144b4 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/eef/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a2c15f170af85cabcd51ae6b330ae7692cccdd02766957958482440212ccd24 +size 3882 diff --git a/variants/sparse-high-dynamic-21bin/profiles/eef/processor_config.json b/variants/sparse-high-dynamic-21bin/profiles/eef/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/eef/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-high-dynamic-21bin/profiles/eef/sparse_bpe.json b/variants/sparse-high-dynamic-21bin/profiles/eef/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..f3c1513577fe6c06ae55325d15bb7bff385fe473 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/eef/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[29,29,29,67,67,67,21],"zero":[14,14,14,33,33,33,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[303,303,1],[303,183,1],[303,182,1],[303,116,1],[303,117,1],[303,69,1],[303,70,1],[304,304,2],[305,70,1],[306,69,1],[303,249,1],[303,248,1],[14,14,2],[13,13,2],[41,41,2],[42,42,2],[248,248,1],[249,249,1],[303,14,1],[308,69,1],[307,69,1],[303,13,1],[304,69,2],[307,70,1],[305,117,1],[305,116,1],[306,116,1],[306,117,1],[303,41,1],[303,42,1],[308,70,1],[311,311,4],[304,70,2],[316,316,4],[317,317,4],[307,41,1],[308,42,1],[318,318,4],[319,319,4],[118,118,1],[115,115,1],[304,182,2],[312,116,1],[304,116,2],[312,117,1],[305,69,1],[304,117,2],[184,184,1],[306,70,1],[309,249,1],[313,117,1],[313,116,1],[181,181,1],[309,248,1],[317,13,4],[316,14,4],[304,183,2],[310,248,1],[307,307,1],[310,249,1],[308,308,1],[311,304,4],[14,14,3],[318,41,4],[319,42,4],[12,12,2],[250,250,1],[304,249,2],[247,247,1],[13,13,3],[304,248,2],[71,71,2],[15,15,2],[41,307,0],[320,248,2],[306,306,1],[305,305,1],[321,249,2],[42,308,0],[43,43,2],[40,40,2],[14,14,4],[313,306,1],[304,309,2],[307,248,1],[308,249,1],[303,115,1],[303,118,1],[68,68,2],[305,13,1],[310,184,1],[305,312,1],[304,41,2],[304,42,2],[315,315,1],[305,248,1],[314,314,1],[306,41,1],[306,42,1],[326,182,2],[306,309,1],[305,249,1],[304,14,2],[301,302,1],[13,13,4],[306,313,1],[305,42,1],[305,41,1],[336,183,2],[306,249,1],[307,249,1],[309,181,1],[308,248,1],[320,320,2],[306,248,1],[321,321,2],[305,310,1],[307,318,1],[304,310,2],[304,13,2],[312,312,1],[303,184,1],[306,14,1],[308,319,1],[314,42,1],[315,41,1],[70,183,0],[307,14,1],[303,316,1],[311,69,4],[69,302,0],[304,308,2],[309,42,1],[303,181,1],[304,307,2],[119,119,1],[330,70,1],[309,41,1],[304,306,2],[303,317,1],[304,322,2],[305,14,1],[114,114,1],[300,302,1],[69,283,0],[312,248,1],[308,14,1],[308,13,1],[328,69,1],[309,14,1],[304,314,2],[284,283,1],[313,249,1],[331,70,1],[310,41,1],[309,306,1],[329,69,1],[307,13,1],[315,42,1],[343,118,2],[312,249,1],[344,115,2],[314,41,1],[303,293,1],[304,315,2],[303,294,1],[310,42,1],[185,185,1],[303,295,1],[313,248,1],[303,292,1],[303,318,1],[180,180,1],[303,296,1],[306,13,1],[303,298,1],[304,325,2],[303,297,1],[303,319,1],[303,291,1],[313,313,1],[304,332,2],[285,303,0],[303,299,1],[310,13,1],[304,333,2],[304,305,2],[315,320,2],[314,321,2],[303,250,1],[303,247,1],[312,305,1],[303,290,1],[315,14,1],[303,286,1],[311,70,4],[310,351,1],[312,41,1],[314,14,1],[369,12,4],[116,302,0],[318,307,0],[313,42,1],[312,42,1],[319,308,0],[311,182,4],[116,283,0],[117,302,0],[323,42,1],[117,283,0],[313,41,1],[314,13,1],[248,315,0],[324,41,1],[327,41,1],[311,116,4],[343,343,2],[310,305,1],[309,309,1],[344,344,2],[303,289,1],[328,42,1],[375,71,4],[316,316,3],[376,15,4],[311,117,4],[249,314,0],[315,13,1],[329,41,1],[356,356,2],[317,317,3],[306,307,1],[247,320,1],[309,13,1],[250,321,1],[312,13,1],[306,308,1],[331,42,1],[330,41,1],[305,307,1],[334,42,1],[303,287,1],[305,308,1],[341,307,0],[251,251,1],[303,288,1],[246,246,1],[383,43,4],[309,303,1],[342,308,0],[44,44,2],[315,307,1],[326,116,2],[314,308,1],[351,184,2],[326,117,2],[310,310,1],[303,338,1],[313,14,1],[384,40,4],[320,307,0],[311,183,4],[310,14,1],[321,308,0],[303,301,1],[307,42,1],[118,118,2],[323,249,1],[356,181,2],[323,308,1],[303,337,1],[327,248,1],[11,11,2],[115,115,2],[339,307,1],[182,302,0],[39,39,2],[340,308,1],[70,283,0],[370,250,2],[303,300,1],[324,307,1],[308,41,1],[372,247,2],[324,248,1],[311,14,4],[317,12,4],[328,328,1],[329,329,1],[14,306,0],[334,249,1],[331,331,1],[313,13,1],[310,303,1],[298,407,1],[330,330,1],[309,307,1],[309,308,1],[305,71,1],[311,249,4],[336,116,2],[303,284,1],[314,307,1],[14,307,0],[16,16,2],[327,307,1],[311,248,4],[285,283,1],[182,283,0],[326,249,2],[315,308,1],[183,283,0],[336,117,2],[392,68,4],[72,72,2],[351,351,2],[346,41,1],[14,305,0],[13,305,0],[311,41,4],[334,308,1],[14,308,0],[348,42,1],[309,314,1],[305,349,1],[311,42,4],[322,41,1],[303,343,1],[318,318,3],[303,344,1],[322,42,1],[181,306,0],[319,319,3],[326,248,2],[13,308,0],[303,309,1],[303,307,1],[320,305,0],[69,182,0],[354,42,1],[15,316,2],[306,314,1],[324,249,1],[332,307,1],[115,307,0],[309,118,1],[300,455,4],[306,315,1],[333,308,1],[303,308,1],[323,248,1],[309,315,1],[13,307,0],[347,41,2],[321,305,0],[284,447,4],[355,41,1],[321,306,0],[183,302,0],[184,305,0],[350,42,2],[301,298,1],[320,306,0],[309,345,1],[303,407,1],[334,248,1],[303,486,1],[370,370,2],[312,14,1],[311,13,4],[320,308,0],[321,307,0],[305,315,1],[310,118,1],[285,288,1],[306,352,1],[372,372,2],[327,249,1],[309,322,1],[325,41,1],[310,307,1],[325,42,1],[308,340,1],[369,369,4],[305,314,1],[14,309,0],[303,341,1],[310,115,1],[303,342,1],[302,311,0],[303,310,1],[307,339,1],[120,120,1],[43,319,2],[376,376,4],[12,317,2],[117,284,0],[40,318,2],[320,312,0],[303,358,1],[13,306,0],[250,314,0],[303,359,1],[185,184,1],[308,323,1],[448,182,0],[336,248,2],[309,356,1],[310,308,1],[247,247,2],[346,329,1],[348,328,1],[116,284,0],[309,115,1],[311,309,4],[322,309,1],[307,324,1],[306,326,1],[307,332,1],[67,67,1],[316,15,4],[354,331,1],[14,315,0],[113,113,1],[181,180,1],[11,12,2],[14,314,0],[184,312,0],[249,302,0],[321,313,0],[303,71,1],[308,333,1],[295,299,1],[355,330,1],[307,341,1],[308,342,1],[321,312,0],[303,285,1],[336,249,2],[430,283,0],[383,383,4],[306,324,1],[315,305,1],[119,343,1],[311,326,4],[248,302,0],[119,118,1],[306,323,1],[314,305,1],[286,290,1],[305,303,1],[114,344,1],[311,310,4],[306,316,1],[13,41,0],[44,43,2],[306,303,1],[14,41,0],[305,338,1],[13,42,0],[249,250,1],[314,309,1],[307,315,1],[305,317,1],[320,313,0],[314,306,1],[301,299,1],[318,40,4],[14,42,0],[118,308,0],[114,115,1],[384,384,4],[375,375,4],[181,313,0],[310,315,1],[314,353,1],[339,248,1],[319,43,4],[310,312,1],[309,68,3],[309,304,1],[307,303,1],[39,40,2],[315,357,1],[315,306,1],[185,351,1],[306,337,1],[307,327,1],[311,306,4],[434,182,0],[311,325,4],[287,297,2],[315,309,1],[308,303,1],[303,447,1],[305,327,1],[308,305,1],[311,345,4],[307,306,1],[311,322,4],[313,308,1],[340,249,1],[331,354,1],[179,179,1],[305,316,1],[311,336,4],[13,310,0],[330,355,1],[72,71,2],[308,334,1],[289,294,1],[311,307,4],[308,314,1],[328,348,1],[305,334,1],[310,314,1],[304,313,2],[305,309,1],[308,306,1],[346,346,1],[286,283,1],[311,332,4],[358,12,6],[247,315,0],[311,333,4],[184,329,0],[251,250,1],[69,282,0],[307,305,1],[181,331,0],[70,302,0],[311,308,4],[181,330,0],[41,306,0],[13,314,0],[326,183,2],[352,352,1],[13,315,0],[313,307,1],[334,184,1],[42,306,0],[186,186,1],[297,287,2],[348,348,1],[303,356,1],[310,317,1],[329,346,1],[312,71,3],[16,15,2],[359,316,5],[306,317,1],[321,309,0],[347,307,2],[310,338,1],[304,312,2],[42,305,0],[41,305,0],[314,303,1],[326,306,2],[311,314,4],[306,68,1],[248,283,0],[41,315,0],[14,316,3],[350,308,2],[302,365,0],[320,309,0],[293,288,1],[182,282,0],[118,328,0],[42,314,0],[13,312,0],[311,315,4],[311,347,4],[291,296,1],[476,180,2],[329,248,1],[325,310,1],[315,303,1],[351,310,0],[13,309,0],[349,248,1],[324,306,1],[249,283,0],[311,350,4],[309,313,1],[115,330,0],[358,317,5],[323,306,1],[327,184,1],[320,378,2],[354,354,1],[118,331,0],[307,309,1],[312,307,1],[353,314,1],[349,305,1],[311,360,4],[311,305,4],[14,15,2],[340,248,1],[303,306,1],[323,323,1],[301,479,0],[310,360,1],[313,314,1],[312,338,1],[321,381,2],[312,308,1],[357,315,1],[303,305,1],[316,14,5],[349,249,1],[308,309,1],[303,314,1],[303,315,1],[184,328,0],[352,248,1],[355,355,1],[367,307,0],[251,370,1],[310,71,3],[339,249,1],[115,329,0],[310,325,1],[119,120,1],[308,315,1],[352,306,1],[317,369,4],[247,378,1],[293,598,1],[42,307,0],[303,372,1],[313,309,1],[668,303,1],[68,68,1],[41,116,0],[368,308,0],[183,282,0],[298,299,2],[324,324,1],[343,303,0],[310,337,1],[392,392,4],[13,12,2],[344,303,0],[313,315,1],[330,248,1],[446,114,2],[318,362,0],[43,554,2],[365,249,6],[361,315,1],[307,314,1],[303,455,1],[296,291,1],[327,327,1],[316,359,3],[41,308,0],[334,305,1],[328,319,1],[42,117,0],[317,13,5],[320,310,0],[41,314,0],[327,305,1],[336,182,2],[352,249,1],[309,326,1],[312,315,1],[306,353,1],[312,310,1],[289,611,1],[365,248,6],[321,250,2],[322,307,1],[364,308,2],[359,15,6],[306,304,1],[324,14,1],[42,315,0],[332,347,1],[40,580,2],[303,302,1],[363,314,1],[331,249,1],[329,318,1],[309,316,1],[346,248,1],[303,351,1],[328,249,1],[303,283,1],[312,317,1],[323,14,1],[306,357,1],[356,180,2],[305,337,1],[333,350,1],[304,339,2],[314,319,1],[246,245,1],[321,310,0],[362,307,2],[251,252,1],[325,12,3],[303,368,1],[305,319,1],[303,367,1],[324,181,1],[183,284,0],[323,13,1],[246,372,1],[353,42,1],[345,309,2],[341,327,0],[434,183,0],[334,334,1],[312,314,1],[295,290,1],[70,282,0],[43,44,2],[331,319,1],[326,14,2],[305,318,1],[250,381,1],[302,335,0],[306,319,1],[439,439,2],[306,322,1],[303,370,1],[361,41,1],[14,310,0],[328,248,1],[246,247,1],[294,295,1],[41,309,0],[371,314,2],[40,39,2],[795,292,1],[333,118,1],[323,319,1],[330,318,1],[284,286,1],[379,309,2],[320,324,0],[315,310,1],[327,318,1],[304,340,2],[299,407,1],[305,336,1],[312,420,1],[315,318,1],[14,313,0],[333,309,1],[13,249,0],[365,41,6],[334,13,1],[42,309,0],[317,358,3],[471,185,2],[345,117,2],[332,115,1],[332,309,1],[310,181,1],[328,13,1],[306,318,1],[70,284,0],[320,329,0],[313,68,3],[322,304,1],[323,181,1],[345,116,2],[365,42,6],[347,183,2],[320,327,0],[114,113,1],[305,361,1],[374,315,2],[322,308,1],[334,319,1],[316,376,4],[320,330,0],[322,326,1],[433,182,4],[467,469,1],[71,184,0],[314,250,2],[365,13,6],[321,323,0],[14,249,0],[350,183,2],[377,248,1],[328,308,1],[357,41,1],[365,309,6],[321,331,0],[305,115,1],[362,248,2],[306,118,1],[305,118,1],[367,40,6],[368,43,6],[305,363,1],[365,14,6],[846,292,1],[325,308,1],[292,291,1],[41,248,0],[306,115,1],[316,316,5],[329,307,1],[312,395,1],[324,13,1],[313,317,1],[303,119,1],[337,337,1],[315,361,1],[42,249,0],[364,249,2],[329,13,1],[301,487,0],[327,13,1],[247,417,1],[331,248,1],[349,349,1],[326,42,2],[305,304,1],[314,363,1],[348,319,1],[306,338,1],[310,304,1],[285,814,1],[331,308,1],[346,318,1],[576,12,4],[16,376,2],[334,342,1],[330,307,1],[307,310,1],[364,333,2],[314,310,1],[328,14,1],[325,309,1],[326,345,2],[322,306,1],[355,248,1],[312,318,1],[382,249,1],[467,474,1],[362,332,2],[326,41,2],[354,249,1],[179,180,1],[330,14,1],[798,303,1],[182,284,0],[299,302,1],[305,325,1],[14,248,0],[386,309,2],[322,314,1],[329,14,1],[331,13,1],[348,249,1],[296,297,1],[324,318,1],[307,367,1],[327,14,1],[15,608,2],[321,328,0],[322,315,1],[117,285,0],[332,315,1],[116,285,0],[363,42,1],[331,14,1],[303,114,1],[333,314,1],[338,338,1],[308,317,1],[13,248,0],[340,13,1],[306,310,1],[341,362,0],[339,14,1],[45,45,1],[69,284,0],[304,377,2],[408,12,2],[11,369,2],[329,249,1],[296,290,1],[332,304,1],[328,342,1],[381,250,3],[446,446,2],[71,72,2],[365,310,6],[315,115,1],[330,13,1],[305,342,1],[385,15,2],[304,382,2],[325,307,1],[314,313,1],[303,68,1],[338,317,3],[308,310,1],[308,368,1],[283,335,0],[354,319,1],[333,304,1],[345,41,2],[349,42,1],[330,249,1],[306,366,1],[356,309,0],[339,40,3],[321,334,0],[305,322,1],[181,476,1],[310,318,1],[345,42,2],[11,10,2],[310,336,1],[116,282,0],[439,119,2],[252,252,1],[185,186,1],[315,312,1],[341,329,0],[343,463,2],[245,245,1],[315,313,1],[365,325,6],[365,306,6],[116,286,0],[305,375,1],[309,337,1],[314,118,1],[307,316,1],[344,465,2],[340,43,3],[309,333,1],[360,41,2],[38,38,1],[303,282,1],[312,115,1],[753,736,2],[305,373,1],[73,73,1],[117,286,0],[324,42,1],[315,319,1],[307,337,1],[348,342,1],[349,41,1],[303,325,1],[322,305,1],[292,293,1],[310,319,1],[15,359,2],[353,306,1],[307,313,1],[339,13,1],[309,319,1],[360,42,2],[14,304,0],[312,319,1],[486,288,1],[471,471,2],[309,332,1],[305,358,1],[341,346,0],[41,302,0],[334,14,1],[285,284,1],[386,313,2],[71,618,2],[303,375,1],[303,322,1],[308,313,1],[320,323,0],[374,41,2],[472,477,1],[117,282,0],[121,121,1],[347,248,2],[350,249,2],[312,320,1],[181,355,0],[371,42,2],[305,329,1],[42,302,0],[315,247,2],[353,41,1],[337,306,0],[305,328,1],[310,316,1],[314,317,1],[307,317,1],[342,364,0],[303,313,1],[305,320,1],[332,310,1],[365,307,6],[326,322,2],[360,305,2],[321,324,0],[345,306,2],[352,41,1],[284,498,0],[250,250,2],[479,407,2],[314,312,1],[314,318,1],[327,351,1],[326,304,2],[336,41,2],[670,283,2],[334,351,1],[355,318,1],[309,317,1],[67,68,2],[357,306,1],[365,333,6],[315,317,1],[308,338,1],[496,498,1],[421,307,1],[71,310,0],[347,14,2],[323,41,1],[327,341,1],[313,118,1],[287,878,1],[312,118,1],[357,42,1],[116,287,0],[365,332,6],[340,14,1],[306,331,1],[365,308,6],[312,303,1],[181,354,0],[398,315,2],[296,293,2],[400,314,2],[427,308,1],[247,372,2],[366,307,0],[306,330,1],[309,305,1],[112,112,1],[336,13,2],[313,316,1],[306,325,1],[320,328,0],[117,287,0],[13,313,0],[44,383,2],[43,368,2],[364,319,2],[311,430,4],[285,289,1],[665,294,2],[309,318,1],[448,117,0],[308,316,1],[363,41,1],[310,342,1],[305,321,1],[361,42,1],[430,302,0],[320,346,0],[312,316,1],[365,322,6],[70,510,0],[448,116,0],[42,248,0],[380,41,2],[352,42,1],[486,283,1],[336,42,2],[321,354,0],[430,284,0],[320,355,0],[350,333,2],[320,331,0],[391,308,1],[321,330,0],[16,17,2],[362,14,2],[315,378,2],[307,184,1],[292,297,1],[310,332,1],[40,367,2],[365,314,6],[678,934,2],[303,333,1],[472,487,1],[306,386,1],[390,307,1],[285,287,1],[312,342,1],[305,341,1],[347,332,2],[12,358,2],[382,248,1],[345,313,2],[365,315,6],[568,479,1],[306,359,1],[300,477,0],[332,303,1],[325,306,1],[336,305,2],[312,327,1],[309,184,1],[310,333,1],[348,248,1],[364,13,2],[250,419,1],[304,404,2],[343,314,0],[321,329,0],[116,288,0],[322,115,1],[548,548,2],[550,550,2],[315,316,1],[380,42,2],[310,341,1],[313,319,1],[323,314,1],[322,303,1],[345,14,2],[348,13,1],[306,342,1],[379,41,2],[308,184,1],[377,249,1],[310,395,1],[483,474,1],[370,303,0],[364,248,2],[312,346,1],[325,118,1],[362,249,2],[352,337,1],[306,341,1],[344,315,0],[481,474,1],[665,871,2],[350,14,2],[330,309,1],[331,41,1],[310,322,1],[308,312,1],[334,41,1],[119,463,1],[325,305,1],[330,42,1],[325,304,1],[325,315,1],[308,337,1],[467,549,1],[325,314,1],[330,341,1],[364,14,2],[313,303,1],[312,394,1],[337,307,0],[327,42,1],[314,342,1],[70,513,0],[117,288,0],[312,358,1],[324,313,1],[331,342,1],[312,361,1],[323,313,1],[331,309,1],[312,393,1],[360,310,2],[306,320,1],[329,42,1],[324,315,1],[360,248,2],[328,452,1],[366,308,0],[312,321,1],[958,303,1],[356,303,0],[68,313,0],[14,302,0],[306,321,1],[431,307,1],[314,316,1],[39,384,2],[379,42,2],[338,305,0],[312,373,1],[306,333,1],[12,576,2],[329,460,1],[322,332,1],[670,284,2],[312,337,1],[299,295,1],[181,352,0],[312,334,1],[328,41,1],[380,310,2],[184,346,0],[753,296,2],[362,318,2],[322,333,1],[345,248,2],[343,305,0],[312,329,1],[119,696,1],[332,40,3],[297,294,2],[13,317,3],[114,465,1],[570,119,1],[344,305,0],[320,339,0],[324,356,1],[66,66,1],[345,249,2],[434,117,0],[41,249,0],[577,114,1],[351,303,0],[300,301,5],[338,308,0],[305,333,1],[306,332,1],[324,309,1],[321,348,0],[301,297,1],[554,43,4],[347,249,2],[333,43,3],[360,249,2],[678,293,2],[304,353,2],[325,303,1],[322,118,1],[307,338,1],[391,319,1],[323,309,1],[434,116,0],[306,343,1],[322,310,1],[313,318,1],[13,335,0],[314,381,2],[371,41,2],[68,309,0],[378,247,3],[323,340,1],[321,340,0],[350,248,2],[315,304,1],[312,363,1],[325,115,1],[310,306,1],[357,14,1],[364,340,2],[650,287,3],[308,181,1],[474,481,1],[71,351,0],[332,306,1],[312,341,1],[315,341,1],[390,318,1],[374,42,2],[309,325,1],[333,303,1],[307,329,1],[305,366,1],[332,314,1],[296,297,2],[310,358,1],[327,329,1],[324,339,1],[362,339,2],[387,306,3],[350,13,2],[315,184,1],[41,283,0],[342,334,0],[354,13,1],[333,306,1],[338,303,0],[307,181,1],[14,376,2],[312,348,1],[305,359,1],[476,476,2],[510,183,0],[330,315,1],[287,524,0],[323,356,1],[309,409,1],[513,183,0],[372,303,0],[308,331,1],[312,328,1],[362,13,2],[320,334,0],[313,115,1],[308,328,1],[286,455,1],[318,384,4],[326,314,2],[568,298,2],[472,469,1],[323,342,1],[306,344,1],[365,305,6],[580,40,4],[322,15,3],[380,248,2],[119,520,1],[355,13,1],[369,317,4],[415,180,2],[42,283,0],[114,727,1],[314,115,1],[347,13,2],[305,332,1],[338,310,0],[333,310,1],[353,14,1],[330,440,1],[373,308,0],[303,332,1],[337,316,3],[346,13,1],[392,68,1],[302,304,0],[298,301,1],[315,118,1],[303,465,1],[314,304,1],[650,1108,1],[469,524,1],[303,463,1],[323,331,1],[68,392,1],[366,309,0],[319,364,0],[14,316,1],[483,545,1],[307,330,1],[513,182,0],[347,339,2],[72,375,2],[403,117,2],[337,316,1],[403,306,2],[380,249,2],[307,304,1],[314,184,1],[305,378,1],[360,14,2],[387,14,3],[334,328,1],[383,383,3],[379,248,2],[354,248,1],[303,523,1],[299,472,0],[250,370,2],[310,185,1],[333,315,1],[71,71,3],[394,41,1],[302,309,0],[321,327,0],[361,305,1],[307,312,1],[310,327,1],[361,13,1],[379,249,2],[333,322,1],[659,1042,1],[412,117,2],[13,283,0],[323,382,1],[324,341,1],[398,41,2],[316,316,1],[736,407,2],[437,180,2],[309,247,1],[324,330,1],[306,358,1],[332,322,1],[318,367,3],[360,13,2],[325,336,1],[346,249,1],[450,308,1],[331,457,1],[348,14,1],[1022,824,2],[313,337,1],[349,13,1],[305,381,1],[345,326,2],[346,14,1],[412,116,2],[299,294,1],[293,549,0],[510,182,0],[400,42,2],[350,340,2],[324,377,1],[394,42,1],[399,41,1],[451,308,1],[306,378,1],[331,314,1],[309,359,1],[307,322,1],[349,14,1],[283,282,1],[504,182,0],[304,584,2],[288,291,2],[608,15,4],[70,248,0],[310,373,1],[353,308,1],[295,487,0],[179,178,1],[306,381,1],[327,315,1],[324,314,1],[572,180,3],[360,312,2],[303,520,1],[386,42,2],[363,13,1],[317,308,0],[380,305,2],[723,67,2],[405,42,1],[324,303,1],[328,314,1],[403,116,2],[327,339,1],[355,249,1],[309,379,1],[118,439,1],[401,248,1],[315,322,1],[300,297,1],[249,284,0],[315,332,1],[511,182,0],[319,368,3],[393,248,1],[323,303,1],[329,341,1],[479,938,1],[424,248,2],[347,377,2],[114,523,1],[292,545,0],[314,322,1],[386,41,2],[313,331,1],[314,338,1],[333,305,1],[371,14,2],[366,306,0],[337,308,0],[325,332,1],[402,249,1],[184,348,0],[315,338,1],[316,307,0],[304,357,2],[650,286,3],[313,321,1],[296,481,0],[355,14,1],[447,303,0],[310,334,1],[317,317,1],[340,323,1],[286,284,1],[374,14,2],[363,305,1],[483,477,1],[313,330,1],[249,282,0],[568,487,1],[350,382,2],[315,337,1],[318,115,0],[339,324,1],[393,249,1],[380,13,2],[375,375,1],[68,68,3],[13,302,0],[328,310,1],[353,13,1],[313,322,1],[304,366,2],[317,317,5],[310,344,1],[247,550,1],[329,315,1],[304,324,2],[393,41,1],[446,113,2],[248,284,0],[549,496,1],[179,476,1],[286,496,0],[379,14,2],[314,333,1],[289,469,0],[305,343,1],[323,315,1],[298,299,3],[479,477,1],[10,10,2],[325,333,1],[71,312,0],[332,305,1],[357,307,1],[288,611,1],[338,307,0],[304,400,2],[183,285,0],[305,344,1],[337,303,0],[349,309,1],[292,481,0],[327,377,1],[334,340,1],[354,14,1],[313,320,1],[304,385,2],[326,13,2],[373,307,0],[300,298,1],[247,246,1],[70,249,0],[326,315,2],[402,248,1],[319,118,0],[310,352,1],[383,383,1],[313,353,1],[309,250,1],[399,42,1],[461,307,1],[401,249,1],[429,315,1],[393,42,1],[310,412,1],[384,384,3],[428,314,1],[14,283,0],[326,307,2],[343,306,0],[326,308,2],[248,282,0],[312,378,1],[312,411,1],[309,366,1],[336,360,2],[440,330,1],[184,185,1],[345,13,2],[605,498,1],[419,381,4],[302,308,0],[315,342,1],[455,303,0],[329,310,1],[1152,483,2],[309,323,1],[392,392,1],[313,323,1],[770,295,2],[304,323,2],[452,328,1],[284,287,1],[295,1110,2],[13,317,1],[314,341,1],[322,313,1],[309,324,1],[584,477,1],[306,385,1],[396,347,2],[307,356,1],[368,319,5],[312,410,1],[367,318,5],[183,286,0],[460,329,1],[678,294,2],[316,359,1],[334,382,1],[304,398,2],[119,391,0],[302,307,0],[349,308,1],[313,324,1],[500,310,1],[114,390,0],[304,362,2],[307,115,2],[346,341,1],[631,303,1],[393,305,1],[439,120,2],[339,327,1],[405,41,1],[457,331,1],[328,71,1],[320,247,2],[369,369,3],[338,317,1],[121,120,1],[303,324,1],[313,415,1],[357,13,1],[397,350,2],[696,120,2],[300,301,1],[387,345,3],[304,364,2],[308,356,1],[314,181,1],[304,316,2],[313,354,1],[314,323,1],[425,71,1],[770,294,2],[327,337,1],[359,359,3],[334,314,1],[386,249,2],[184,349,0],[306,373,1],[342,303,0],[440,41,1],[417,378,4],[332,325,1],[306,355,1],[337,309,0],[424,249,2],[307,71,1],[327,303,1],[342,331,0],[305,324,1],[305,323,1],[306,354,1],[300,296,1],[306,347,1],[338,358,3],[353,307,1],[341,330,0],[357,308,1],[310,250,1],[291,477,0],[336,325,2],[329,71,1],[315,324,1],[406,309,2],[306,339,1],[305,340,1],[283,309,0],[375,375,3],[633,303,1],[370,583,2],[795,291,1],[358,358,3],[182,285,0],[303,323,1],[1263,1038,2],[642,284,0],[388,318,1],[409,42,2],[112,113,1],[361,307,1],[306,340,1],[313,366,1],[386,248,2],[511,183,0],[305,348,1],[349,307,1],[313,357,1],[306,387,1],[313,355,1],[303,446,1],[659,545,0],[284,288,1],[333,325,1],[316,308,0],[312,344,1],[389,319,1],[14,335,0],[308,322,1],[409,41,2],[317,307,0],[304,380,2],[341,315,0],[361,14,1],[483,296,2],[479,668,1],[314,337,1],[297,407,1],[305,339,1],[352,13,1],[43,308,0],[305,346,1],[306,350,1],[486,284,1],[312,381,1],[185,845,1],[67,67,2],[486,287,1],[341,303,0],[377,14,1],[302,322,0],[320,348,0],[411,305,1],[251,583,1],[395,42,2],[419,321,4],[304,373,2],[304,420,2],[314,325,1],[426,313,1],[309,353,1],[382,13,1],[504,183,0],[395,41,2],[309,338,1],[338,312,0],[115,327,0],[315,181,1],[415,42,1],[187,187,1],[342,328,0],[424,41,2],[310,343,1],[372,587,2],[40,307,0],[387,42,3],[118,323,0],[306,289,1],[182,286,0],[293,469,0],[250,548,1],[443,12,5],[304,361,2],[471,186,2],[70,504,0],[1168,943,3],[312,325,1],[352,14,1],[376,376,3],[379,306,2],[302,314,0],[315,325,1],[115,324,0],[310,247,1],[310,378,1],[319,343,0],[410,305,1],[483,498,1],[299,481,0],[317,358,1],[713,246,1],[314,324,1],[322,347,1],[310,363,1],[309,357,1],[303,439,1],[344,306,0],[327,367,1],[308,325,1],[332,362,1],[283,311,0],[374,307,2],[312,399,1],[395,248,2],[401,313,1],[366,305,0],[351,558,2],[308,71,1],[320,354,0],[342,314,0],[309,404,1],[342,323,0],[315,362,1],[727,113,2],[402,313,1],[334,303,1],[315,323,1],[467,598,2],[387,41,3],[417,417,4],[519,41,4],[339,362,1],[374,13,2],[392,392,3],[306,371,1],[670,288,2],[322,345,1],[363,14,1],[315,333,1],[118,334,0],[315,327,1],[310,361,1],[424,42,2],[344,314,0],[178,178,1],[377,13,1],[384,384,1],[307,396,1],[308,397,1],[393,312,1],[183,288,0],[440,440,1],[315,347,1],[320,340,0],[309,442,1],[391,389,1],[330,314,1],[350,314,2],[185,558,1],[313,338,1],[329,305,1],[401,306,1],[430,510,0],[321,355,0],[348,308,1],[307,325,1],[659,1339,1],[182,287,0],[341,324,0],[306,382,1],[352,310,1],[358,317,3],[415,41,1],[337,305,0],[380,14,2],[337,310,0],[70,511,0],[371,13,2],[307,359,1],[467,288,2],[529,42,4],[304,379,2],[386,14,2],[659,286,1],[366,314,0],[294,472,0],[512,249,1],[313,381,1],[390,388,1],[736,302,2],[316,305,0],[325,369,3],[304,334,2],[336,14,2],[309,403,1],[304,363,2],[395,13,2],[402,306,1],[398,42,2],[292,287,1],[329,314,1],[457,42,1],[419,419,4],[331,315,1],[550,246,2],[303,533,1],[312,405,1],[363,184,1],[340,334,1],[421,362,1],[328,305,1],[309,343,1],[331,323,1],[306,377,1],[373,305,0],[328,334,1],[1088,1288,2],[312,343,1],[409,249,2],[409,248,2],[301,481,0],[69,249,0],[340,364,1],[344,309,0],[371,308,2],[250,251,1],[400,41,2],[382,14,1],[496,474,1],[320,349,0],[366,315,0],[395,249,2],[313,359,1],[330,324,1],[452,42,1],[361,184,1],[445,305,1],[313,379,1],[307,351,1],[532,329,1],[309,381,1],[286,289,1],[518,248,1],[448,183,0],[302,332,0],[314,332,1],[341,306,0],[333,364,1],[69,248,0],[310,380,1],[327,310,1],[319,383,4],[284,1252,1],[305,362,1],[12,729,2],[304,327,2],[741,284,2],[115,446,1],[302,315,0],[671,370,4],[305,364,1],[659,287,1],[1135,598,3],[346,367,1],[323,368,1],[427,364,1],[307,366,1],[328,315,1],[321,339,0],[342,306,0],[183,287,0],[314,345,1],[328,338,1],[317,319,0],[308,381,1],[314,364,1],[334,338,1],[407,303,0],[313,343,1],[396,14,2],[351,315,0],[363,308,1],[430,513,0],[305,347,1],[309,378,1],[397,14,2],[375,71,1],[302,333,0],[313,378,1],[324,316,1],[554,44,4],[307,378,1],[310,359,1],[318,327,0],[325,184,1],[331,306,1],[182,288,0],[286,524,0],[309,371,1],[426,306,1],[389,308,1],[318,344,0],[650,297,1],[300,301,6],[334,368,1],[680,372,4],[329,367,1],[322,181,1],[116,289,0],[310,381,1],[17,17,2],[41,335,0],[422,13,3],[43,759,2],[329,327,1],[391,328,1],[300,1195,1],[305,377,1],[314,350,1],[517,248,1],[305,382,1],[404,42,2],[303,312,1],[303,327,1],[403,249,2],[305,350,1],[304,317,2],[313,456,1],[449,41,1],[489,308,3],[331,353,1],[295,477,0],[304,408,2],[310,420,1],[306,374,1],[330,357,1],[315,339,1],[330,306,1],[369,576,4],[460,41,1],[185,394,0],[388,307,1],[185,619,1],[417,320,4],[345,308,2],[334,312,1],[14,333,0],[485,307,3],[300,481,0],[309,406,1],[321,346,0],[300,959,1],[118,354,0],[326,333,2],[314,389,1],[315,360,1],[40,40,1],[390,330,1],[322,311,1],[14,332,0],[322,360,1],[322,350,1],[331,368,1],[345,307,2],[71,375,1],[412,248,2],[326,332,2],[41,347,0],[308,358,1],[324,367,1],[343,315,0],[16,528,2],[309,347,1],[303,353,1],[314,362,1],[316,309,0],[70,285,0],[302,306,0],[304,319,2],[305,367,1],[305,368,1],[355,42,1],[341,310,0],[390,329,1],[314,347,1],[525,328,1],[315,388,1],[403,42,2],[303,611,1],[330,367,1],[338,358,1],[382,319,1],[541,331,1],[43,43,4],[337,359,1],[309,533,1],[181,413,0],[457,457,1],[391,331,1],[308,366,1],[306,362,1],[309,311,1],[303,15,1],[42,335,0],[315,345,1],[348,41,1],[292,483,0],[309,349,1],[321,349,0],[306,364,1],[538,250,3],[308,373,1],[12,11,2],[310,393,1],[328,368,1],[303,349,1],[326,326,2],[342,342,1],[314,334,1],[315,350,1],[306,368,1],[309,350,1],[348,368,1],[317,318,0],[325,350,1],[403,248,2],[306,367,1],[314,340,1],[337,359,3],[310,320,1],[323,333,1],[304,318,2],[303,357,1],[305,526,1],[404,41,2],[312,702,1],[351,314,0],[548,251,2],[13,332,0],[312,336,1],[334,315,1],[346,42,1],[542,330,1],[324,332,1],[305,385,1],[404,14,2],[309,385,1],[354,308,1],[352,679,1],[409,14,2],[523,344,4],[314,360,1],[117,289,0],[333,435,1],[372,246,2],[377,318,1],[312,367,1],[356,476,2],[354,41,1],[310,329,1],[438,332,3],[302,347,0],[544,249,1],[346,307,1],[376,316,4],[248,247,1],[40,40,4],[327,338,1],[403,41,2],[310,328,1],[709,117,0],[354,368,1],[325,373,4],[394,14,1],[315,364,1],[351,334,0],[13,369,2],[304,431,2],[324,337,1],[313,386,1],[1457,545,2],[418,307,1],[302,326,0],[474,483,1],[403,14,2],[305,371,1],[296,447,1],[355,307,1],[474,545,1],[618,71,4],[12,12,3],[444,42,3],[309,374,1],[319,323,0],[358,317,1],[314,327,1],[308,359,1],[330,337,1],[309,321,1],[315,377,1],[313,473,1],[505,303,1],[289,290,1],[304,402,2],[650,846,1],[309,331,1],[322,316,4],[464,42,1],[304,487,2],[305,641,1],[309,402,1],[341,341,1],[430,282,0],[116,301,0],[360,308,2],[118,348,0],[302,325,0],[412,249,2],[316,318,0],[339,315,1],[320,352,0],[334,310,1],[13,333,0],[184,471,1],[312,425,1],[413,308,1],[309,401,1],[371,307,2],[299,301,1],[303,180,1],[324,68,3],[312,380,1],[329,338,1],[472,524,1],[185,425,0],[303,334,1],[394,13,1],[322,366,4],[845,186,2],[69,285,0],[118,119,1],[304,401,2],[325,317,4],[456,42,1],[410,14,1],[333,326,1],[709,116,0],[831,183,0],[302,345,0],[304,428,2],[338,306,0],[508,303,1],[305,658,1],[312,359,1],[384,580,4],[353,181,1],[484,42,2],[332,324,1],[305,374,1],[328,525,1],[462,315,1],[184,399,0],[117,301,0],[405,308,1],[115,346,0],[554,759,4],[360,307,2],[432,316,4],[314,370,2],[520,343,4],[313,326,1],[526,375,1],[419,250,4],[373,13,6],[303,43,1],[321,352,0],[283,310,0],[618,72,4],[351,308,0],[115,114,1],[306,311,1],[330,542,1],[181,418,0],[302,350,0],[360,336,2],[71,327,0],[309,426,1],[376,608,4],[40,786,2],[318,329,0],[253,253,1],[305,425,1],[293,1038,1],[707,471,2],[319,328,0],[309,320,1],[247,388,0],[42,511,0],[304,426,2],[412,41,2],[336,336,2],[411,14,1],[469,549,1],[359,307,0],[332,438,1],[467,1038,2],[334,337,1],[315,367,1],[44,45,2],[70,286,0],[435,333,3],[399,307,1],[322,387,1],[385,307,0],[477,469,1],[479,299,3],[332,326,1],[304,943,2],[185,500,0],[1088,472,2],[433,116,4],[68,181,0],[313,358,1],[433,117,4],[352,307,1],[329,532,1],[378,362,0],[115,355,0],[304,429,2],[306,327,1],[314,356,1],[434,249,0],[302,310,0],[341,305,0],[342,305,0],[331,337,1],[309,180,1],[41,504,0],[374,308,2],[327,312,1],[340,314,1],[353,313,1],[396,13,2],[304,432,2],[379,13,2],[325,345,1],[430,285,0],[444,41,3],[381,364,0],[385,308,0],[304,443,2],[576,11,4],[605,545,1],[373,310,0],[309,330,1],[342,348,0],[361,308,1],[333,323,1],[307,358,1],[421,40,5],[309,358,1],[582,248,0],[318,324,0],[536,247,3],[357,181,1],[298,294,1],[284,545,0],[312,368,1],[412,42,2],[39,38,2],[299,1528,1],[723,723,2],[117,290,0],[323,68,3],[331,541,1],[422,42,3],[314,382,1],[381,370,3],[308,567,1],[366,313,0],[402,14,1],[466,314,1],[69,286,0],[310,321,1],[16,644,2],[343,439,2],[389,14,1],[303,526,1],[401,14,1],[15,15,3],[448,249,0],[422,41,3],[306,666,1],[391,416,1],[315,417,2],[363,307,1],[473,41,1],[549,524,1],[420,41,2],[306,661,1],[323,316,1],[325,347,1],[388,14,1],[246,587,1],[325,360,1],[449,42,1],[642,282,0],[184,405,0],[422,305,3],[314,358,1],[410,312,1],[1004,245,2],[503,503,1],[315,418,1],[397,13,2],[310,367,1],[322,319,1],[299,987,0],[314,414,1],[434,248,0],[299,1717,1],[181,440,0],[43,43,3],[306,291,1],[420,13,2],[283,365,0],[469,487,1],[334,317,1],[352,308,1],[1007,252,2],[516,283,0],[303,12,1],[322,397,1],[336,307,2],[311,313,4],[336,315,2],[310,356,1],[412,305,2],[452,452,1],[484,41,2],[314,368,1],[344,446,2],[389,13,1],[484,313,2],[305,357,1],[316,319,0],[315,399,1],[306,392,1],[309,413,1],[244,244,1],[379,326,2],[315,416,1],[390,414,1],[308,118,2],[305,353,1],[442,326,3],[306,334,1],[302,406,0],[354,342,1],[320,362,0],[412,13,2],[318,330,0],[43,43,1],[670,287,2],[307,564,1],[283,304,0],[322,396,1],[116,290,0],[336,308,2],[420,42,2],[351,327,0],[305,394,1],[1796,959,1],[398,398,2],[314,373,1],[314,405,1],[323,337,1],[306,290,1],[283,307,0],[325,326,1],[302,397,0],[359,316,1],[380,380,2],[283,306,0],[342,310,0],[361,312,1],[379,313,2],[322,371,1],[358,308,0],[71,394,0],[443,317,4],[314,413,1],[370,548,2],[309,342,1],[372,550,2],[393,310,1],[315,356,1],[400,400,2],[411,312,1],[430,286,0],[448,248,0],[40,40,3],[68,415,0],[251,671,1],[333,371,1],[347,315,2],[424,312,2],[297,447,1],[349,303,1],[428,14,1],[325,312,1],[404,314,2],[464,41,1],[338,317,5],[322,184,1],[559,42,2],[329,303,1],[15,15,1],[422,360,3],[547,303,1],[309,341,1],[313,373,1],[304,445,2],[302,396,0],[322,374,1],[347,42,2],[807,180,2],[283,325,0],[306,437,1],[307,319,1],[433,249,4],[359,308,0],[315,334,1],[187,186,1],[329,361,1],[355,367,1],[391,342,1],[340,383,3],[309,289,1],[487,481,1],[283,308,0],[424,13,2],[304,297,2],[372,247,3],[314,339,1],[386,326,2],[307,373,1],[341,40,3],[302,371,0],[460,460,1],[307,390,1],[400,14,2],[292,288,1],[314,366,1],[315,366,1],[352,303,1],[401,13,1],[388,13,1],[291,474,0],[328,303,1],[69,287,0],[582,249,0],[436,14,1],[363,250,2],[283,336,0],[309,340,1],[350,41,2],[553,303,1],[286,288,1],[309,373,1],[310,408,1],[312,740,1],[402,13,1],[322,318,1],[416,319,1],[333,184,1],[304,300,2],[325,318,1],[286,605,0],[344,114,2],[313,385,1],[398,14,2],[369,729,4],[338,314,0],[382,323,1],[337,315,0],[327,332,1],[417,247,4],[2178,878,2],[309,368,1],[304,411,2],[387,322,3],[1458,611,4],[372,536,2],[304,410,2],[306,389,1],[306,388,1],[378,307,0],[554,383,4],[485,347,3],[333,343,1],[381,308,0],[556,41,2],[72,73,2],[441,14,1],[310,366,1],[750,439,2],[70,287,0],[338,12,3],[315,340,1],[426,309,1],[325,311,1],[332,308,1],[429,14,1],[304,393,2],[307,349,1],[327,317,1],[370,308,0],[321,364,0],[499,117,4],[313,437,1],[332,345,1],[399,14,1],[354,314,1],[339,384,3],[309,290,1],[310,411,1],[315,358,1],[325,319,1],[333,345,1],[499,116,4],[303,587,1],[250,389,0],[302,305,0],[830,548,2],[295,293,2],[71,334,0],[302,374,0],[328,363,1],[544,248,1],[512,248,1],[314,349,1],[327,346,1],[313,340,1],[353,303,1],[414,318,1],[427,43,5],[350,397,2],[359,316,3],[433,306,4],[315,373,1],[456,41,1],[533,180,4],[429,13,1],[700,183,0],[313,733,1],[331,303,1],[250,353,0],[338,315,0],[307,357,1],[353,409,1],[70,872,0],[68,323,0],[347,396,2],[428,13,1],[332,184,1],[329,337,1],[66,67,1],[1577,959,1],[421,785,1],[326,406,2],[377,324,1],[306,247,1],[454,41,3],[332,374,1],[369,11,4],[350,319,2],[1135,1052,3],[399,308,1],[309,418,1],[309,509,1],[576,729,4],[936,303,1],[330,388,1],[309,367,1],[249,370,1],[774,446,2],[317,305,0],[312,408,1],[343,119,2],[433,248,4],[355,341,1],[432,15,5],[112,111,1],[310,368,1],[313,333,1],[292,290,1],[302,336,0],[326,442,2],[327,314,1],[181,457,0],[355,315,1],[121,696,1],[482,308,1],[416,308,1],[415,13,1],[367,362,0],[315,349,1],[361,395,1],[522,309,2],[351,307,0],[68,324,0],[312,339,1],[584,481,1],[430,287,0],[12,12,1],[518,249,1],[348,525,1],[352,316,1],[390,341,1],[517,249,1],[368,364,0],[582,182,0],[310,374,1],[313,342,1],[405,307,1],[70,700,0],[480,41,3],[309,396,1],[394,312,1],[414,307,1],[328,317,1],[332,327,1],[310,347,1],[378,308,0],[333,307,1],[475,307,1],[345,304,2],[367,327,0],[339,303,1],[523,303,0],[309,344,1],[413,307,1],[419,308,0],[580,39,4],[122,122,1],[418,14,1],[538,381,3],[286,285,1],[305,389,1],[310,410,1],[405,14,1],[418,308,1],[330,313,1],[503,503,3],[309,397,1],[427,797,1],[68,354,0],[305,388,1],[357,313,1],[42,284,0],[45,44,2],[319,334,0],[299,1022,1],[70,716,0],[118,340,0],[303,558,1],[435,14,3],[530,283,0],[310,350,1],[346,315,1],[310,424,1],[310,423,1],[115,339,0],[284,1042,1],[316,315,0],[318,306,0],[342,43,3],[304,386,2],[355,542,1],[344,310,0],[358,338,1],[302,387,0],[314,359,1],[309,339,1],[312,445,1],[322,336,1],[352,379,1],[304,320,2],[295,447,1],[312,366,1],[302,360,0],[313,332,1],[303,392,1],[328,389,1],[283,326,0],[345,314,2],[362,42,2],[337,314,0],[246,680,1],[305,247,1],[323,317,1],[394,346,1],[1350,1110,3],[332,336,1],[364,364,2],[321,370,2],[373,312,0],[303,583,1],[354,541,1],[316,304,0],[367,324,0],[183,301,0],[404,307,2],[608,376,4],[315,359,1],[306,408,1],[355,313,1],[536,378,3],[952,113,3],[287,455,1],[413,14,1],[871,611,2],[302,423,0],[415,313,1],[346,532,1],[304,462,2],[404,315,2],[598,303,0],[533,356,4],[489,350,3],[71,352,0],[283,314,0],[331,389,1],[318,305,0],[497,315,1],[502,314,1],[357,303,1],[383,551,1],[329,388,1],[473,42,1],[795,474,0],[345,322,2],[348,338,1],[313,339,1],[330,316,1],[252,548,1],[309,382,1],[520,463,4],[368,323,0],[325,396,1],[569,307,1],[327,316,1],[304,349,2],[1124,472,1],[283,315,0],[330,303,1],[1254,73,2],[42,513,0],[361,303,1],[41,510,0],[306,398,1],[416,14,1],[362,362,2],[375,72,4],[386,13,2],[308,391,1],[304,298,2],[306,400,1],[300,295,1],[310,490,1],[308,353,1],[331,313,1],[347,318,2],[414,14,1],[363,312,1],[440,248,1],[291,545,0],[334,333,1],[309,377,1],[326,371,2],[326,325,2],[341,312,0],[550,245,2],[604,41,2],[716,183,0],[247,357,0],[491,307,1],[793,116,0],[480,42,3],[294,1288,0],[580,786,4],[1249,38,2],[406,307,2],[283,345,0],[793,117,0],[337,15,3],[378,372,3],[394,348,1],[433,345,4],[307,381,1],[317,310,0],[353,309,1],[458,13,1],[326,311,2],[363,303,1],[323,305,1],[314,71,1],[307,289,1],[359,337,1],[325,181,1],[379,379,2],[333,334,1],[312,641,1],[1227,10,4],[327,115,2],[310,371,1],[66,723,1],[306,250,1],[314,377,1],[247,399,0],[416,13,1],[331,317,1],[463,439,3],[322,376,3],[308,345,1],[478,306,1],[340,303,1],[492,308,1],[299,1195,1],[69,335,0],[338,342,0],[323,354,1],[316,337,1],[417,307,0],[322,357,1],[421,14,1],[315,494,1],[333,313,1],[304,321,2],[319,306,0],[351,471,2],[353,345,1],[907,294,2],[1395,17,4],[341,390,0],[364,41,2],[1063,186,3],[70,288,0],[311,412,4],[368,334,0],[378,380,0],[312,340,1],[328,118,2],[435,13,3],[74,74,1],[300,479,0],[318,303,0],[336,314,2],[324,401,1],[329,115,2],[310,399,1],[344,312,0],[402,309,1],[617,392,1],[319,314,0],[360,314,2],[332,313,1],[433,14,4],[249,285,0],[495,71,2],[319,305,0],[377,320,0],[375,618,4],[523,465,4],[70,749,0],[318,346,0],[315,372,2],[475,362,1],[665,293,2],[542,355,1],[315,380,1],[364,397,2],[316,303,0],[348,314,1],[427,13,1],[325,397,1],[986,40,6],[332,384,3],[330,68,1],[807,807,2],[317,306,0],[398,13,2],[325,371,1],[339,306,1],[400,13,2],[313,368,1],[402,323,1],[1033,303,1],[584,297,2],[324,305,1],[319,331,0],[329,317,1],[413,13,1],[1369,976,3],[311,377,4],[248,285,0],[316,306,0],[316,314,0],[343,309,0],[286,814,1],[408,308,0],[551,383,1],[362,396,2],[586,308,1],[348,312,1],[332,360,1],[41,284,0],[179,879,1],[44,1189,1],[250,764,1],[347,322,2],[311,516,4],[323,381,1],[336,304,2],[307,345,1],[330,353,1],[363,395,1],[404,308,2],[303,361,1],[310,339,1],[303,251,1],[341,314,0],[247,361,0],[318,315,0],[70,732,0],[322,324,1],[358,307,0],[954,43,6],[337,352,0],[370,538,2],[312,332,1],[331,357,1],[340,305,1],[465,446,3],[338,329,0],[315,382,1],[616,42,2],[377,327,1],[711,309,1],[112,727,1],[470,13,1],[69,700,0],[343,310,0],[380,349,2],[333,360,1],[506,306,1],[338,309,0],[323,567,1],[528,528,3],[541,354,1],[1741,290,1],[333,311,1],[498,496,1],[303,552,1],[303,619,1],[530,302,0],[66,65,1],[310,577,1],[491,378,4],[511,249,0],[283,332,0],[333,336,1],[308,289,1],[305,422,1],[303,755,1],[292,598,1],[392,67,1],[15,852,2],[308,349,1],[296,483,0],[626,328,1],[322,353,1],[357,309,1],[313,341,1],[414,13,1],[499,248,4],[404,181,2],[329,316,1],[617,68,1],[250,405,0],[315,71,1],[291,290,1],[334,348,1],[330,115,2],[642,287,0],[528,528,1],[305,702,1],[299,668,0],[182,301,0],[247,418,0],[46,46,1],[411,327,1],[310,405,1],[250,413,0],[347,314,2],[373,314,0],[325,374,1],[345,315,2],[283,322,0],[337,327,0],[525,348,1],[643,331,1],[371,309,2],[401,309,1],[563,307,0],[324,409,1],[340,306,1],[382,334,1],[620,329,1],[307,353,1],[312,658,1],[332,311,1],[372,307,0],[303,363,1],[314,419,2],[492,381,4],[12,1138,2],[338,341,0],[42,350,0],[324,564,1],[313,367,1],[324,115,2],[324,355,1],[116,291,0],[343,312,0],[313,382,1],[460,248,1],[287,284,1],[463,119,3],[312,500,1],[332,181,1],[299,297,1],[427,14,1],[504,248,0],[357,409,1],[1920,598,3],[491,305,1],[305,398,1],[328,316,1],[320,421,0],[462,14,1],[406,326,2],[286,549,0],[306,733,1],[389,41,1],[69,288,0],[313,661,1],[299,477,0],[356,307,0],[377,315,1],[532,346,1],[315,351,1],[303,362,1],[1236,245,2],[283,333,0],[357,345,1],[452,248,1],[605,447,5],[311,530,4],[437,476,2],[929,439,2],[283,305,0],[483,481,1],[284,753,1],[313,304,1],[334,118,2],[418,13,1],[465,114,3],[620,346,1],[442,13,3],[302,438,0],[303,572,1],[327,378,1],[358,310,0],[390,446,2],[824,303,0],[317,338,1],[444,309,3],[314,493,1],[831,117,0],[1088,295,3],[303,747,1],[486,814,1],[322,323,1],[341,388,0],[331,118,2],[390,114,2],[249,335,0],[551,551,1],[324,378,1],[373,306,0],[382,321,0],[350,315,2],[454,14,3],[333,181,1],[356,308,0],[303,246,1],[317,314,0],[479,299,4],[337,330,0],[482,364,1],[770,1022,2],[311,339,4],[362,322,2],[290,498,0],[324,345,1],[360,315,2],[414,42,1],[516,302,0],[71,346,0],[308,357,1],[323,389,1],[308,304,1],[370,251,2],[642,286,0],[331,316,1],[337,313,0],[466,14,1],[323,364,1],[116,292,0],[308,371,1],[387,13,3],[526,526,1],[384,39,4],[306,416,1],[410,334,1],[305,400,1],[387,304,3],[520,303,0],[320,372,2],[339,309,1],[338,328,0],[339,314,1],[403,404,2],[498,290,2],[69,301,0],[70,117,0],[907,1471,1],[323,402,1],[359,309,0],[1399,407,2],[328,337,1],[303,185,1],[478,313,1],[120,439,1],[338,334,0],[514,306,1],[340,315,1],[310,417,1],[302,444,0],[483,292,2],[303,364,1],[425,375,1],[303,352,1],[436,13,1],[659,1996,1],[349,628,1],[312,333,1],[338,327,0],[313,344,1],[438,13,3],[339,421,1],[503,369,1],[457,248,1],[302,435,0],[326,379,2],[302,489,0],[308,318,1],[367,346,0],[831,116,0],[467,481,1],[1108,455,3],[315,344,1],[408,307,0],[355,309,1],[392,617,1],[284,335,0],[305,740,1],[324,317,1],[388,42,1],[500,303,1],[306,414,1],[315,289,1],[326,347,2],[391,439,2],[1841,472,2],[310,382,1],[533,533,4],[305,250,1],[303,553,1],[330,660,1],[415,354,1],[441,13,1],[310,471,1],[70,579,0],[374,347,2],[498,524,1],[626,348,1],[311,403,4],[330,317,1],[333,406,1],[336,395,2],[45,43,2],[283,422,0],[332,317,1],[283,387,0],[307,360,1],[308,321,1],[389,342,1],[182,335,0],[310,377,1],[608,852,4],[559,249,2],[325,313,1],[328,416,1],[333,383,3],[617,67,1],[391,340,1],[310,340,1],[283,360,0],[378,379,0],[305,417,1],[323,118,2],[700,182,0],[311,382,4],[308,674,1],[342,315,0],[305,416,1],[324,362,1],[391,119,2],[393,12,3],[13,329,0],[358,358,1],[326,516,2],[308,360,1],[310,419,1],[350,371,2],[326,374,2],[37,37,1],[327,388,1],[453,306,1],[452,249,1],[354,309,1],[349,314,1],[560,310,2],[326,530,2],[337,385,3],[499,249,4],[618,812,4],[327,306,1],[415,14,1],[68,723,1],[312,382,1],[340,309,1],[303,547,1],[415,355,1],[468,14,3],[305,289,1],[324,388,1],[324,366,1],[670,1611,2],[321,404,0],[324,359,1],[515,314,1],[323,345,1],[318,314,0],[328,361,1],[353,319,1],[323,338,1],[336,412,2],[327,352,1],[326,350,2],[348,334,1],[305,414,1],[375,526,1],[302,442,0],[307,374,1],[466,13,1],[475,40,5],[619,351,4],[283,423,0],[328,309,1],[332,371,1],[373,315,0],[395,14,2],[474,297,2],[250,363,0],[302,485,0],[332,316,1],[459,13,2],[487,987,1],[303,671,1],[313,377,1],[336,322,2],[311,340,4],[341,309,0],[323,409,1],[248,286,0],[324,322,1],[342,312,0],[307,385,1],[472,1052,2],[509,309,4],[305,419,1],[327,564,1],[303,432,1],[325,422,1],[441,306,1],[642,285,0],[291,498,0],[576,369,4],[248,288,0],[310,396,1],[295,469,0],[491,306,1],[336,333,2],[349,315,1],[360,322,2],[415,476,2],[440,249,1],[381,380,0],[421,13,1],[871,455,2],[390,339,1],[309,387,1],[314,343,1],[707,185,2],[69,716,0],[352,359,1],[345,404,2],[741,287,2],[314,331,1],[306,419,1],[462,13,1],[183,289,0],[284,1520,1],[562,306,1],[314,289,1],[328,391,1],[319,348,0],[378,364,0],[313,325,1],[332,406,1],[317,312,0],[318,347,0],[396,304,2],[436,306,1],[337,331,0],[313,768,1],[458,14,1],[770,1717,2],[328,312,1],[563,384,1],[356,324,0],[554,554,4],[306,294,1],[568,481,1],[342,309,0],[381,379,0],[615,248,0],[38,39,2],[345,387,2],[660,330,1],[435,340,3],[472,1160,2],[311,312,4],[334,316,1],[356,323,0],[293,474,0],[331,643,1],[336,332,2],[327,362,1],[333,374,1],[310,397,1],[315,385,1],[349,323,1],[310,570,1],[330,414,1],[118,389,0],[307,361,1],[306,288,1],[313,666,1],[394,449,1],[312,377,1],[328,340,1],[311,459,4],[69,117,0],[339,305,1],[307,321,1],[314,385,1],[358,305,0],[492,306,1],[111,111,1],[332,344,1],[329,309,1],[68,67,1],[247,416,0],[315,368,1],[181,456,0],[330,366,1],[184,460,0],[351,363,0],[467,1317,1],[320,431,0],[423,308,2],[314,380,1],[342,391,0],[303,443,1],[302,454,0],[338,590,3],[384,40,1],[303,369,1],[331,416,1],[347,306,2],[44,551,2],[302,422,0],[337,341,0],[359,367,0],[388,306,1],[333,353,1],[526,375,3],[361,310,1],[563,563,3],[39,40,1],[492,305,1],[249,286,0],[343,313,0],[401,324,1],[438,339,3],[394,329,1],[303,680,1],[486,289,1],[319,309,0],[334,364,1],[716,182,0],[1231,252,2],[318,309,0],[347,345,2],[409,13,2],[312,417,1],[382,118,0],[520,520,4],[181,879,1],[248,335,0],[371,350,2],[415,306,1],[484,14,2],[538,370,3],[329,414,1],[333,317,1],[349,316,1],[314,367,1],[354,353,1],[307,675,1],[457,249,1],[467,1777,1],[359,305,0],[13,319,0],[346,327,1],[545,524,1],[389,305,1],[303,471,1],[354,323,1],[374,309,2],[314,379,1],[355,306,1],[510,248,0],[302,433,0],[397,304,2],[531,315,1],[9,10,2],[438,396,3],[1037,550,2],[1252,407,4],[316,310,0],[327,505,1],[375,71,3],[534,12,4],[307,517,1],[397,322,2],[501,13,1],[299,469,0],[72,72,1],[304,395,2],[308,363,1],[314,326,1],[424,424,2],[302,468,0],[848,303,1],[361,318,1],[412,420,2],[486,1611,1],[750,119,2],[287,290,1],[332,519,1],[350,322,2],[250,830,1],[312,419,1],[321,427,0],[347,309,2],[449,13,1],[555,339,2],[696,696,2],[1591,1840,3],[437,306,1],[320,404,0],[2612,304,2],[331,413,1],[312,322,1],[334,358,1],[410,310,1],[283,499,0],[337,324,0],[482,43,5],[572,476,3],[318,355,0],[387,406,3],[394,328,1],[329,339,1],[391,323,1],[774,114,2],[115,388,0],[347,374,2],[330,359,1],[371,306,2],[399,327,1],[310,465,1],[315,379,1],[340,427,1],[373,12,2],[428,353,1],[431,339,1],[1168,298,3],[317,309,0],[350,304,2],[583,548,3],[522,522,2],[302,529,0],[308,354,1],[358,368,0],[377,115,0],[993,303,1],[430,511,0],[349,821,1],[432,303,1],[736,301,2],[291,481,0],[312,621,1],[435,397,3],[347,304,2],[308,378,1],[350,306,2],[376,852,4],[319,315,0],[563,563,1],[14,284,0],[563,384,3],[309,441,1],[354,306,1],[302,480,0],[302,519,0],[338,12,5],[13,284,0],[71,71,1],[430,288,0],[372,372,3],[303,339,1],[395,305,2],[113,446,1],[307,401,1],[354,313,1],[374,306,2],[334,306,1],[390,324,1],[437,68,1],[1958,976,3],[333,316,1],[568,297,2],[303,503,1],[411,310,1],[470,14,1],[551,383,5],[309,444,1],[342,118,0],[347,305,2],[396,322,2],[307,355,1],[513,249,0],[323,366,1],[334,410,1],[501,305,1],[341,355,0],[327,359,1],[308,385,1],[309,296,1],[342,343,0],[250,414,0],[302,509,0],[317,315,0],[363,310,1],[425,305,1],[418,324,1],[409,326,2],[288,496,0],[334,381,1],[445,312,1],[383,43,1],[557,340,2],[387,314,3],[374,345,2],[342,389,0],[1399,447,2],[329,363,1],[371,345,2],[437,330,1],[549,290,2],[310,311,1],[604,248,2],[308,351,1],[366,310,0],[371,322,2],[341,344,0],[323,353,1],[346,620,1],[328,626,1],[349,319,1],[177,177,1],[437,331,1],[184,449,0],[181,473,0],[42,322,0],[323,322,1],[650,477,0],[332,423,1],[406,308,2],[349,324,1],[430,700,0],[328,358,1],[297,943,2],[388,305,1],[487,472,1],[382,314,1],[350,309,2],[397,314,2],[464,13,1],[523,523,4],[251,493,0],[283,347,0],[307,547,1],[317,313,0],[315,330,1],[422,14,3],[363,319,1],[539,305,1],[300,407,1],[316,313,0],[334,352,1],[507,13,1],[182,289,0],[320,461,0],[328,323,1],[337,312,0],[315,329,1],[350,345,2],[328,373,1],[332,357,1],[338,408,3],[253,252,1],[310,458,1],[334,567,1],[536,306,0],[13,318,0],[416,41,1],[314,330,1],[350,305,2],[346,361,1],[387,315,3],[389,306,1],[397,309,2],[320,394,0],[367,329,0],[506,13,1],[556,248,2],[45,759,2],[396,309,2],[425,329,1],[431,42,1],[612,249,0],[374,305,2],[381,362,0]]} diff --git a/variants/sparse-high-dynamic-21bin/profiles/joint/config.json b/variants/sparse-high-dynamic-21bin/profiles/joint/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/joint/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-high-dynamic-21bin/profiles/joint/config.yaml b/variants/sparse-high-dynamic-21bin/profiles/joint/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6e5ada620fb2724eb161425b9781ae4c0bf570f6 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/joint/config.yaml @@ -0,0 +1,63 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 8 + components: + generalized_joint_position: + dims: + start: 0 + stop: 7 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -6.283185307179586 + max: 6.283185307179586 + order_1: + min: -0.525 + max: 0.525 + distortion_limit: + - 0.004 + - 0.004 + - 0.006 + - 0.0075 + - 0.015 + - 0.02 + - 0.02 + primitive_selection: smooth + gripper_open_command: + dims: + - 7 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.025 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - generalized_joint_position + bpe: + spatial_vocab_size: 536 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 2.0 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-high-dynamic-21bin/profiles/joint/primitives.npz b/variants/sparse-high-dynamic-21bin/profiles/joint/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..c6db85fcbf1cfd6ae987ad4bf1a9c434e5551190 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/joint/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90ca4e7791af583c4bcaddfce14186da3b22fe69e7bbe14b139eb26a172c8c25 +size 4270 diff --git a/variants/sparse-high-dynamic-21bin/profiles/joint/processor_config.json b/variants/sparse-high-dynamic-21bin/profiles/joint/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/joint/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-high-dynamic-21bin/profiles/joint/sparse_bpe.json b/variants/sparse-high-dynamic-21bin/profiles/joint/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..d6fe95257dcb2649420c0398a9c6fd64818f881d --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/profiles/joint/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[133,133,89,71,37,29,29,21],"zero":[66,66,44,35,18,14,14,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[535,198,1],[535,197,1],[535,535,1],[535,387,1],[535,386,1],[535,65,1],[535,66,1],[535,308,1],[535,307,1],[538,538,2],[536,307,1],[536,308,1],[535,440,1],[535,439,1],[537,307,1],[537,308,1],[472,472,2],[471,471,2],[65,65,2],[199,199,2],[66,66,2],[536,387,1],[196,196,1],[536,386,1],[439,439,2],[539,307,1],[440,440,2],[537,386,1],[64,64,1],[540,308,1],[539,308,1],[535,306,1],[535,309,1],[67,67,1],[537,387,1],[540,307,1],[385,385,1],[388,388,1],[535,536,1],[541,307,1],[541,308,1],[195,195,1],[200,200,1],[542,307,1],[535,537,1],[542,308,1],[545,545,4],[500,500,3],[499,499,3],[535,471,1],[535,472,1],[306,306,2],[539,65,1],[309,309,1],[535,305,1],[63,63,1],[535,310,1],[68,68,1],[196,537,0],[540,66,1],[538,387,2],[194,194,1],[388,539,0],[536,65,1],[538,386,2],[385,540,0],[201,201,1],[536,66,1],[196,195,1],[545,538,4],[547,386,1],[550,387,1],[384,384,1],[547,387,1],[553,471,4],[552,472,4],[440,440,3],[555,199,4],[546,387,1],[439,439,3],[538,308,2],[389,389,1],[537,66,1],[64,541,0],[537,65,1],[550,386,1],[536,536,1],[538,307,2],[67,542,0],[539,66,1],[540,65,1],[64,63,1],[535,311,1],[535,304,1],[551,386,1],[193,193,1],[67,68,1],[538,66,2],[538,65,2],[305,305,1],[199,199,1],[69,69,1],[552,552,4],[553,553,4],[202,202,1],[62,62,1],[309,543,0],[472,472,3],[310,310,1],[194,195,1],[471,471,3],[539,554,1],[558,558,2],[200,201,1],[546,386,1],[385,384,1],[438,438,2],[441,441,2],[560,439,4],[562,440,4],[564,564,2],[388,389,1],[306,306,1],[549,439,3],[548,440,3],[196,577,1],[537,537,1],[309,568,0],[196,551,0],[535,199,1],[538,536,2],[500,500,4],[499,499,4],[555,555,4],[569,569,2],[554,64,1],[192,192,1],[540,556,1],[535,312,1],[551,387,1],[535,303,1],[538,537,2],[65,541,0],[573,573,2],[572,572,2],[472,472,4],[471,471,4],[203,203,1],[306,544,0],[556,67,1],[309,310,1],[539,440,1],[194,193,1],[533,534,1],[538,542,2],[535,499,1],[66,542,0],[536,440,1],[535,500,1],[538,541,2],[383,383,1],[539,439,1],[544,439,1],[536,199,2],[543,440,1],[69,68,1],[70,70,1],[64,591,1],[540,439,1],[62,63,1],[390,390,1],[194,577,1],[67,593,1],[578,200,2],[560,560,4],[540,440,1],[562,562,4],[554,65,4],[198,534,0],[202,201,1],[61,61,1],[304,304,1],[470,470,2],[473,473,2],[536,546,1],[471,535,0],[537,439,1],[556,66,4],[311,311,1],[558,195,2],[472,535,0],[536,439,1],[516,515,1],[191,191,1],[539,539,1],[555,200,1],[306,567,0],[196,550,0],[554,541,0],[388,561,0],[197,534,0],[196,563,0],[535,546,1],[385,565,0],[385,608,1],[564,64,2],[557,65,1],[535,313,1],[544,199,1],[538,543,2],[540,540,1],[549,560,3],[192,193,1],[538,574,2],[541,440,1],[548,562,3],[196,570,0],[556,542,0],[204,204,1],[536,554,1],[536,574,1],[544,440,1],[388,617,1],[532,534,1],[578,578,2],[538,539,2],[541,439,1],[537,440,1],[67,66,1],[535,302,1],[583,583,2],[566,65,1],[543,439,1],[388,557,0],[539,471,1],[385,571,0],[305,590,0],[542,542,1],[538,580,2],[584,584,2],[541,541,1],[587,306,1],[535,551,1],[546,65,1],[602,201,2],[561,65,1],[538,540,2],[564,63,2],[542,440,1],[547,65,1],[542,439,1],[385,559,0],[383,384,1],[305,567,0],[538,544,2],[543,543,1],[62,591,1],[536,556,1],[69,593,1],[569,68,2],[577,195,2],[202,203,1],[388,566,0],[536,535,1],[539,472,1],[308,515,0],[307,515,0],[536,471,1],[545,66,4],[540,472,1],[390,389,1],[544,544,1],[555,199,1],[536,472,1],[545,65,4],[309,565,0],[305,304,1],[69,70,1],[535,558,1],[592,310,2],[200,199,1],[546,546,1],[71,71,1],[569,67,2],[387,534,0],[194,631,1],[62,61,1],[311,310,1],[540,471,1],[537,551,1],[538,535,2],[538,440,2],[536,544,1],[539,541,1],[190,190,1],[544,306,2],[385,563,0],[559,66,1],[572,384,2],[570,65,1],[537,472,1],[547,66,1],[541,64,2],[546,66,1],[305,306,1],[499,499,2],[538,439,2],[500,500,2],[571,66,1],[537,535,1],[60,60,1],[597,195,2],[471,539,0],[573,389,2],[303,303,1],[587,305,1],[535,524,1],[535,525,1],[309,551,0],[537,543,1],[517,515,1],[563,66,1],[554,554,4],[553,553,3],[537,556,1],[535,523,1],[552,552,3],[543,472,1],[550,65,1],[536,541,1],[535,526,1],[536,559,1],[565,66,1],[543,471,1],[67,579,0],[544,472,1],[205,205,1],[537,471,1],[589,589,2],[535,314,1],[536,542,1],[200,602,1],[535,527,1],[312,312,1],[192,191,1],[550,66,1],[202,602,1],[535,520,1],[535,519,1],[535,522,1],[382,382,1],[535,521,1],[386,534,0],[535,518,1],[587,567,0],[613,200,1],[587,587,1],[544,471,1],[533,530,1],[551,65,1],[388,570,0],[535,528,1],[309,566,0],[391,391,1],[535,559,1],[309,547,0],[535,557,1],[539,199,1],[535,547,1],[568,310,2],[67,581,0],[536,539,1],[64,576,0],[309,592,0],[535,529,1],[530,689,1],[64,575,0],[545,308,4],[540,542,1],[578,201,2],[591,63,2],[537,580,1],[541,472,1],[593,68,2],[597,597,2],[204,203,1],[549,438,3],[548,441,3],[536,540,1],[383,608,1],[535,301,1],[536,557,1],[540,199,1],[551,66,1],[537,542,1],[543,535,1],[567,306,2],[539,573,2],[197,515,0],[536,543,1],[537,554,1],[542,472,1],[542,471,1],[198,515,0],[540,572,2],[571,65,1],[536,547,1],[545,387,4],[535,550,1],[387,514,0],[390,617,1],[541,471,1],[440,543,0],[538,472,2],[535,563,1],[561,66,1],[535,531,1],[439,544,0],[537,541,1],[535,555,1],[538,471,2],[535,517,1],[189,189,1],[652,438,4],[565,65,1],[71,70,1],[537,540,1],[653,441,4],[309,644,1],[556,556,4],[440,539,0],[543,558,1],[311,628,0],[545,386,4],[587,544,0],[537,544,1],[583,500,6],[192,631,1],[386,514,0],[539,535,1],[584,499,6],[309,576,0],[577,577,2],[578,199,2],[472,540,0],[72,72,1],[535,516,1],[60,61,1],[307,534,0],[559,65,1],[303,304,1],[545,307,4],[537,539,1],[596,307,2],[439,539,0],[388,588,0],[661,195,3],[437,438,2],[309,581,0],[629,304,2],[206,206,1],[544,535,1],[551,551,1],[439,540,0],[542,67,2],[600,308,2],[541,539,1],[190,191,1],[311,312,1],[440,536,0],[442,441,2],[439,537,0],[604,558,2],[640,201,2],[472,539,0],[597,193,2],[535,570,1],[608,384,2],[548,471,1],[308,534,0],[59,59,1],[516,518,1],[651,572,2],[545,542,4],[557,557,1],[637,68,2],[440,540,0],[566,66,1],[555,536,0],[535,553,1],[387,515,0],[641,63,2],[383,382,1],[555,555,1],[564,627,2],[199,536,0],[302,302,1],[535,552,1],[539,306,1],[543,542,1],[589,310,2],[313,313,1],[559,559,1],[537,550,1],[549,472,1],[544,546,1],[543,541,1],[573,535,0],[499,499,5],[532,728,4],[500,500,5],[617,389,2],[386,515,0],[557,66,1],[569,632,2],[535,594,1],[545,541,4],[390,391,1],[69,702,1],[385,595,0],[440,471,0],[544,536,1],[516,519,1],[543,199,1],[439,535,0],[549,471,1],[537,563,1],[560,560,3],[545,536,4],[543,540,1],[440,535,0],[204,205,1],[526,527,1],[196,607,0],[544,539,1],[538,548,2],[439,472,0],[557,554,1],[202,683,1],[562,562,3],[470,553,2],[669,200,1],[535,315,1],[198,514,0],[517,520,1],[543,537,1],[533,531,1],[544,541,1],[473,552,2],[604,604,2],[471,540,0],[644,310,2],[385,606,0],[537,570,1],[62,716,1],[545,580,4],[548,472,1],[547,440,1],[568,543,1],[305,629,0],[545,537,4],[657,573,2],[568,589,2],[563,65,1],[546,536,1],[538,549,2],[543,536,1],[564,591,2],[596,65,2],[544,542,1],[498,498,2],[545,574,4],[569,593,2],[540,554,1],[540,535,1],[525,524,1],[65,534,0],[439,471,0],[539,556,1],[188,188,1],[501,501,2],[647,64,2],[542,540,1],[535,543,1],[568,568,1],[472,544,0],[64,588,0],[531,689,1],[539,536,1],[200,636,1],[196,621,0],[66,534,0],[471,543,0],[311,592,0],[524,525,1],[567,544,1],[555,546,0],[631,193,2],[531,534,1],[192,729,1],[207,207,1],[535,544,1],[440,541,0],[471,544,0],[472,543,0],[537,500,1],[307,387,0],[613,200,3],[64,671,1],[499,499,6],[528,759,1],[204,683,1],[198,516,0],[574,65,2],[539,561,1],[609,65,1],[471,536,0],[539,557,1],[197,514,0],[703,63,3],[547,547,1],[708,68,3],[672,193,2],[600,66,2],[572,535,0],[707,195,3],[590,304,2],[381,381,1],[567,567,1],[535,300,1],[540,536,1],[472,536,0],[628,310,2],[472,541,0],[528,529,1],[574,66,2],[550,439,1],[537,558,2],[439,536,0],[392,392,1],[199,200,1],[440,472,0],[543,539,1],[197,516,0],[190,189,1],[196,630,0],[308,386,0],[540,559,1],[71,72,1],[439,542,0],[500,500,6],[605,66,6],[561,561,1],[538,585,2],[515,514,1],[589,540,0],[73,73,1],[471,542,0],[206,205,1],[563,563,1],[570,66,1],[605,65,6],[541,536,1],[635,539,0],[637,637,2],[303,676,0],[437,437,2],[388,607,0],[574,574,2],[542,535,1],[535,539,1],[529,759,1],[648,558,4],[578,636,2],[612,548,0],[543,551,1],[596,308,2],[440,537,0],[550,550,1],[442,442,2],[538,586,2],[615,549,0],[439,541,0],[472,537,0],[305,658,1],[313,312,1],[640,640,2],[543,568,1],[471,541,0],[522,518,1],[538,499,2],[542,536,1],[544,567,1],[627,627,2],[471,537,0],[535,530,1],[561,554,1],[306,546,0],[539,544,1],[384,572,1],[67,685,1],[641,641,2],[563,556,1],[303,302,1],[60,59,1],[580,66,2],[440,544,0],[538,500,2],[535,64,1],[559,556,1],[569,535,0],[388,614,0],[305,717,1],[440,542,0],[564,535,0],[566,554,1],[549,652,3],[598,573,2],[600,307,2],[541,535,1],[580,65,2],[67,595,0],[527,526,1],[548,562,2],[308,387,0],[570,554,1],[388,609,0],[602,602,2],[517,521,1],[439,543,0],[545,543,4],[551,537,1],[544,537,1],[540,306,1],[58,58,1],[540,537,1],[674,312,2],[540,565,1],[661,577,3],[472,542,0],[575,541,1],[314,314,1],[668,499,2],[557,440,1],[549,560,2],[208,208,1],[529,519,2],[583,583,1],[307,386,0],[389,573,1],[547,536,1],[548,653,3],[499,584,2],[522,523,1],[632,632,2],[594,558,2],[535,196,1],[539,566,1],[561,439,1],[540,543,1],[607,65,1],[718,470,4],[597,645,2],[667,500,2],[571,439,1],[301,301,1],[545,539,4],[559,536,1],[648,195,4],[601,572,2],[565,565,1],[546,554,1],[311,644,1],[591,591,2],[535,532,1],[578,709,2],[530,531,2],[535,67,1],[546,544,1],[576,541,1],[525,520,1],[540,541,1],[557,536,1],[539,570,1],[307,514,0],[606,66,1],[542,543,1],[719,473,4],[523,522,1],[187,187,1],[579,542,1],[578,649,2],[593,593,2],[571,556,1],[540,309,1],[71,702,1],[539,537,1],[544,540,1],[664,387,1],[517,519,1],[621,66,1],[537,306,1],[539,542,1],[525,911,1],[637,70,2],[594,65,1],[560,438,4],[538,556,2],[547,554,1],[535,540,1],[551,543,1],[535,598,1],[679,573,4],[562,441,4],[544,561,1],[540,563,1],[696,384,2],[308,514,0],[613,555,1],[199,201,1],[557,539,1],[65,515,0],[541,543,1],[575,544,1],[605,308,6],[539,543,1],[540,385,2],[66,515,0],[641,61,2],[680,572,4],[581,542,1],[541,544,1],[545,540,4],[619,64,2],[540,571,1],[536,199,3],[60,716,1],[522,527,1],[570,570,1],[566,440,1],[546,439,1],[545,544,4],[381,382,1],[614,65,1],[521,856,1],[561,539,1],[584,584,1],[209,209,1],[536,499,1],[558,577,2],[792,63,3],[188,189,1],[597,577,2],[544,560,1],[601,65,1],[517,516,1],[565,440,1],[616,65,2],[594,66,1],[616,66,2],[546,556,1],[542,544,1],[500,583,2],[552,611,3],[73,72,1],[706,389,2],[608,608,2],[541,306,1],[553,470,4],[539,388,2],[194,558,1],[575,575,1],[541,537,1],[538,554,2],[542,537,1],[635,635,2],[794,68,3],[656,564,4],[632,569,2],[543,547,1],[740,384,3],[392,391,1],[627,564,2],[529,528,1],[673,67,2],[543,562,1],[640,203,2],[311,674,0],[535,604,1],[194,196,1],[669,200,5],[672,191,2],[535,316,1],[543,576,1],[535,514,1],[545,596,4],[579,544,1],[566,539,1],[623,65,2],[306,561,0],[385,621,0],[303,629,0],[610,553,5],[202,780,1],[645,645,2],[543,565,1],[543,500,1],[528,523,1],[473,474,2],[383,886,1],[656,63,4],[195,196,1],[544,499,1],[539,562,1],[552,472,5],[543,566,1],[67,603,0],[541,199,1],[891,200,3],[568,309,2],[539,560,1],[540,544,1],[535,542,1],[521,520,1],[670,569,4],[540,560,1],[580,580,2],[385,630,0],[550,537,1],[196,194,1],[622,536,2],[549,654,3],[565,556,1],[540,562,1],[579,439,1],[550,544,1],[539,499,1],[548,535,1],[206,207,1],[754,203,2],[717,304,2],[542,306,1],[587,590,0],[571,571,1],[559,540,1],[597,631,2],[617,617,2],[543,581,1],[623,66,2],[58,59,1],[64,599,0],[587,561,0],[535,541,1],[310,592,0],[605,307,6],[190,729,1],[539,500,1],[390,899,1],[548,655,3],[589,541,0],[549,535,1],[195,193,1],[550,556,1],[557,471,1],[579,579,1],[548,440,4],[758,389,3],[589,542,0],[74,74,1],[315,315,1],[558,604,2],[649,649,2],[545,600,4],[557,439,1],[670,68,4],[547,556,1],[683,203,2],[821,193,3],[536,636,2],[65,387,0],[67,625,0],[561,544,1],[566,566,1],[542,199,1],[537,499,1],[563,439,1],[590,635,2],[651,651,2],[628,312,2],[536,500,1],[676,304,2],[555,613,1],[598,66,1],[576,576,1],[313,314,1],[309,606,0],[575,439,1],[520,521,1],[589,539,0],[519,518,1],[539,305,1],[198,307,0],[469,469,1],[549,306,1],[536,306,1],[571,544,1],[552,535,0],[559,440,1],[553,471,5],[578,602,2],[309,609,0],[563,540,1],[565,540,1],[567,658,2],[622,622,2],[657,657,2],[535,533,1],[548,612,3],[605,536,6],[549,615,3],[563,537,1],[703,591,3],[541,564,2],[667,667,2],[301,302,1],[605,537,6],[201,200,1],[671,64,3],[672,672,2],[553,610,3],[668,668,2],[605,542,6],[708,593,3],[597,688,2],[536,538,1],[380,380,1],[535,601,1],[536,599,1],[199,546,0],[558,196,2],[576,440,1],[581,581,1],[611,552,5],[186,186,1],[66,386,0],[551,440,1],[67,618,0],[535,569,1],[543,548,1],[572,385,2],[313,743,0],[471,548,0],[309,630,0],[536,603,1],[648,535,0],[529,689,1],[57,57,1],[1282,524,1],[605,541,6],[592,592,1],[635,304,2],[535,299,1],[543,664,1],[555,547,0],[550,554,1],[573,388,2],[65,308,0],[195,194,1],[546,440,1],[702,70,2],[549,439,4],[204,872,1],[544,575,1],[535,515,1],[570,539,1],[531,530,1],[523,1146,1],[656,64,4],[565,543,1],[535,564,1],[724,310,2],[472,552,3],[542,539,1],[572,608,2],[535,624,1],[540,500,1],[546,720,1],[589,537,0],[540,499,1],[202,200,1],[393,393,1],[208,207,1],[894,526,2],[559,439,1],[549,544,1],[438,437,2],[653,653,4],[570,537,1],[606,65,1],[640,602,2],[200,780,1],[622,574,2],[640,715,2],[571,540,1],[566,543,1],[696,696,2],[637,593,2],[576,543,1],[541,575,1],[536,562,1],[555,559,0],[533,532,1],[542,569,2],[553,535,0],[526,911,1],[472,549,0],[590,305,2],[581,440,1],[528,529,2],[531,527,1],[551,554,1],[499,584,4],[191,193,1],[535,613,1],[652,652,4],[555,557,0],[540,558,1],[63,64,1],[552,473,4],[650,66,1],[441,442,2],[66,308,0],[524,1207,1],[551,556,1],[716,61,2],[568,592,1],[707,577,3],[641,591,2],[564,539,0],[197,801,0],[539,596,1],[561,440,1],[199,547,0],[560,615,4],[535,619,1],[544,571,1],[541,540,1],[471,553,3],[581,543,1],[578,731,2],[587,546,0],[818,70,2],[637,701,2],[536,548,1],[535,664,1],[190,958,1],[570,439,1],[198,802,0],[65,307,0],[544,562,1],[544,550,1],[589,548,0],[1082,527,2],[765,302,2],[500,583,4],[300,300,1],[641,705,2],[188,187,1],[543,594,1],[544,579,1],[439,549,0],[545,440,4],[604,193,2],[66,307,0],[663,310,2],[542,633,1],[552,539,0],[537,196,2],[547,543,1],[553,539,0],[614,66,1],[1077,200,3],[200,202,1],[846,61,2],[706,706,2],[209,210,1],[557,541,1],[472,548,0],[560,615,1],[572,651,2],[537,538,1],[440,548,0],[630,66,1],[547,471,1],[542,579,1],[535,610,1],[199,557,0],[546,471,1],[562,612,4],[894,1316,2],[517,518,1],[541,634,1],[590,567,1],[561,471,1],[675,65,1],[535,573,1],[311,879,1],[575,64,2],[609,554,1],[71,981,1],[197,517,0],[524,523,1],[545,439,4],[516,514,1],[592,644,2],[536,666,1],[62,64,1],[537,560,1],[499,499,7],[535,548,1],[587,571,0],[740,608,3],[535,728,1],[539,588,1],[583,500,5],[557,472,1],[598,388,2],[539,558,1],[199,649,1],[303,717,1],[535,611,1],[544,549,1],[535,549,1],[543,560,1],[552,540,0],[539,548,1],[553,540,0],[530,531,1],[547,472,1],[563,440,1],[206,872,1],[69,569,1],[559,554,1],[544,558,1],[713,64,3],[197,518,0],[550,472,1],[714,387,0],[604,661,2],[528,527,1],[590,590,1],[198,386,0],[201,203,1],[604,648,2],[546,472,1],[548,306,1],[573,617,2],[562,612,1],[576,64,2],[696,382,2],[500,537,0],[535,572,1],[549,549,1],[584,499,5],[613,536,0],[567,305,2],[709,636,3],[561,472,1],[474,474,2],[588,541,1],[588,539,1],[471,549,0],[569,764,2],[535,385,1],[198,308,0],[544,555,1],[540,589,1],[587,550,0],[619,564,2],[73,74,1],[542,556,3],[549,539,1],[443,443,1],[605,543,6],[548,548,1],[537,620,1],[758,617,3],[563,472,1],[521,522,1],[627,64,2],[500,539,0],[190,192,1],[313,674,0],[538,551,2],[549,540,1],[75,75,1],[631,631,2],[542,581,1],[706,391,2],[60,1016,1],[715,200,2],[315,314,1],[1111,523,2],[535,388,1],[541,309,1],[709,199,3],[645,558,2],[500,543,0],[669,200,3],[62,564,1],[499,536,0],[539,309,1],[570,440,1],[598,539,1],[436,436,1],[600,65,2],[1130,1068,2],[565,439,1],[553,548,0],[537,618,1],[658,539,0],[547,439,1],[499,544,0],[613,613,1],[552,543,0],[68,67,1],[200,731,1],[559,472,1],[834,572,3],[552,549,0],[536,560,1],[596,66,2],[624,569,2],[548,543,1],[541,576,1],[686,540,0],[561,306,2],[537,549,1],[550,471,1],[729,191,2],[535,639,1],[573,657,2],[718,718,4],[304,629,0],[385,650,0],[548,309,1],[599,536,1],[553,543,0],[548,540,1],[553,544,0],[535,638,1],[198,387,0],[540,595,1],[719,719,4],[499,539,0],[548,539,1],[1225,515,2],[723,67,3],[537,562,1],[609,440,1],[518,521,1],[532,528,1],[607,66,1],[68,70,1],[500,536,0],[627,656,2],[532,533,1],[548,541,1],[303,765,0],[587,575,0],[610,470,6],[308,516,0],[624,67,2],[548,542,1],[574,541,2],[310,568,0],[594,537,1],[58,57,1],[386,516,0],[564,671,2],[597,194,2],[306,571,0],[574,542,2],[549,542,1],[546,199,2],[552,544,0],[743,312,2],[701,569,2],[559,471,1],[381,380,1],[196,688,1],[597,847,2],[439,550,0],[538,603,2],[650,65,1],[538,599,2],[549,541,1],[306,575,0],[201,202,1],[565,472,1],[540,600,1],[596,541,2],[383,572,1],[538,691,2],[705,64,2],[195,558,1],[538,694,2],[566,471,1],[538,588,2],[630,65,1],[63,61,1],[551,439,1],[559,547,1],[438,560,2],[548,536,1],[574,666,2],[65,514,0],[603,536,1],[688,688,2],[830,191,2],[307,516,0],[197,519,0],[438,549,0],[196,193,1],[526,525,1],[557,556,1],[570,541,1],[539,635,1],[499,541,0],[535,317,1],[66,514,0],[565,471,1],[532,533,5],[587,579,0],[441,548,0],[589,536,0],[387,516,0],[849,573,3],[1080,1339,2],[570,471,1],[632,670,2],[537,309,1],[788,572,2],[571,472,1],[601,540,1],[555,665,0],[186,187,1],[585,470,3],[645,196,2],[611,611,3],[566,439,1],[56,57,1],[588,440,1],[559,606,1],[621,556,1],[315,316,1],[568,471,1],[601,385,2],[542,309,1],[441,562,2],[538,595,2],[536,309,1],[543,612,1],[68,69,1],[500,500,7],[546,541,1],[535,534,1],[521,518,1],[563,471,1],[569,685,2],[392,393,1],[605,539,6],[592,568,1],[550,440,1],[557,199,2],[571,440,1],[648,648,4],[672,748,2],[563,542,1],[540,680,2],[580,543,2],[973,193,3],[567,590,1],[532,530,1],[544,615,1],[536,549,1],[186,185,1],[306,579,0],[546,622,1],[538,618,2],[535,585,1],[624,542,1],[541,560,1],[607,554,1],[676,302,2],[565,199,1],[499,537,0],[571,471,1],[705,564,2],[637,702,2],[604,688,2],[195,688,1],[714,307,0],[679,389,4],[545,471,4],[656,656,4],[649,200,2],[696,608,2],[559,542,1],[390,573,1],[566,472,1],[440,547,0],[561,541,1],[724,312,2],[568,472,1],[538,547,2],[543,549,1],[925,384,3],[540,651,2],[766,583,4],[598,554,1],[530,531,3],[605,544,6],[619,541,1],[553,549,0],[567,472,1],[610,610,3],[662,662,2],[614,546,1],[539,549,1],[551,472,1],[791,543,2],[499,540,0],[537,677,1],[535,586,1],[561,556,1],[557,547,1],[574,544,2],[568,686,2],[63,62,1],[558,543,0],[542,632,2],[806,573,2],[200,203,1],[197,520,0],[567,471,1],[535,606,1],[536,665,1],[540,549,1],[545,472,4],[635,305,2],[580,542,2],[613,546,0],[566,541,1],[568,644,2],[597,707,2],[661,796,3],[613,199,1],[211,210,1],[542,562,1],[604,725,2],[736,386,0],[500,540,0],[557,609,1],[69,67,1],[588,439,1],[1045,1593,1],[500,541,0],[1045,1443,1],[306,590,0],[541,627,2],[500,542,0],[584,499,2],[538,620,2],[565,554,1],[64,626,0],[605,540,6],[575,472,1],[558,535,0],[706,617,2],[542,560,1],[737,385,0],[545,548,4],[571,554,1],[578,808,2],[604,194,2],[850,304,2],[301,300,1],[306,550,0],[523,524,1],[607,570,1],[537,548,1],[552,548,0],[595,542,1],[946,389,3],[600,542,2],[534,542,0],[205,203,1],[533,529,1],[551,471,1],[877,602,3],[680,384,4],[193,195,1],[525,526,1],[379,379,1],[641,716,2],[575,440,1],[580,541,2],[856,514,2],[534,541,0],[714,386,0],[802,387,0],[439,500,0],[701,701,2],[381,886,1],[586,541,1],[714,308,0],[545,549,4],[544,548,1],[599,440,1],[540,548,1],[670,670,4],[541,562,1],[576,472,1],[535,759,1],[636,201,2],[595,540,1],[538,550,2],[1054,70,3],[570,472,1],[736,387,0],[606,547,1],[647,541,1],[67,69,1],[64,620,0],[543,196,1],[589,549,0],[621,65,1],[552,537,0],[546,542,1],[579,471,1],[535,566,1],[552,542,0],[522,521,1],[792,591,3],[75,74,1],[539,612,1],[540,547,1],[728,514,2],[875,314,2],[553,541,0],[569,708,2],[437,993,2],[586,473,3],[392,899,1],[192,194,1],[198,517,0],[754,754,2],[556,581,0],[526,1123,1],[614,557,1],[72,70,1],[894,535,0],[536,520,1],[611,473,6],[583,500,7],[303,1032,1],[471,557,0],[595,439,1],[191,189,1],[538,581,2],[574,543,2],[891,199,3],[533,952,0],[627,741,2],[546,557,1],[736,307,0],[882,602,3],[760,201,4],[301,926,0],[540,311,1],[715,715,2],[535,725,1],[563,554,1],[553,536,0],[964,310,3],[552,541,0],[645,707,2],[649,203,2],[794,593,3],[584,499,7],[537,561,1],[535,679,1],[565,536,1],[579,472,1],[536,575,1],[59,61,1],[559,199,2],[705,705,2],[607,607,1],[821,631,3],[200,797,1],[586,535,1],[628,628,1],[585,535,1],[642,543,1],[599,541,1],[609,66,1],[553,537,0],[440,534,0],[879,312,2],[394,394,1],[551,825,1],[499,542,0],[549,537,1],[538,546,2],[564,703,2],[535,298,1],[585,542,1],[559,543,1],[198,518,0],[549,309,1],[306,305,1],[552,536,0],[537,854,1],[305,851,1],[525,1068,1],[535,648,1],[672,631,2],[550,570,1],[56,55,1],[1170,1312,3],[539,615,1],[515,516,1],[442,1006,2],[978,577,4],[1074,203,3],[549,536,1],[540,724,1],[748,195,2],[202,816,1],[1090,61,3],[469,470,2],[812,539,0],[547,541,1],[635,541,0],[664,65,1],[735,65,1],[575,539,1],[540,615,1],[551,541,1],[563,550,1],[75,76,1],[474,473,2],[667,583,2],[68,569,1],[1106,498,4],[538,557,2],[585,539,1],[66,440,0],[576,539,1],[663,568,1],[640,683,2],[197,974,0],[572,543,0],[579,440,1],[439,561,0],[606,606,1],[669,555,1],[536,612,1],[662,537,2],[576,439,1],[575,546,1],[636,535,0],[620,537,1],[543,616,1],[535,689,1],[563,621,1],[830,189,2],[520,519,1],[668,584,2],[518,1373,1],[614,554,1],[192,645,1],[66,439,0],[307,820,0],[559,565,1],[696,788,2],[581,471,1],[595,440,1],[775,584,4],[550,539,1],[537,589,1],[575,471,1],[644,644,2],[637,813,2],[64,62,1],[603,542,1],[439,534,0],[551,542,1],[388,675,0],[539,657,2],[632,70,2],[541,588,1],[538,563,2],[686,686,2],[807,544,2],[516,889,0],[531,529,1],[517,514,1],[209,208,1],[766,583,1],[548,544,1],[627,703,2],[545,585,4],[569,919,2],[547,199,2],[1116,501,4],[560,544,0],[533,532,2],[539,553,1],[618,537,1],[540,626,1],[535,200,1],[545,586,4],[518,522,1],[1058,1668,2],[540,612,1],[669,613,1],[775,584,1],[65,516,0],[63,564,1],[535,607,1],[604,196,2],[554,538,0],[629,717,2],[559,546,1],[562,543,0],[542,548,1],[536,634,1],[184,185,1],[672,729,2],[530,529,1],[632,708,2],[316,316,1],[555,744,0],[579,536,1],[550,607,1],[573,544,0],[193,194,1],[440,499,0],[752,388,0],[438,993,2],[540,384,2],[570,561,1],[539,625,1],[299,299,1],[534,605,0],[440,515,0],[566,536,1],[682,470,2],[658,541,0],[651,680,2],[539,679,2],[532,529,1],[306,635,1],[576,471,1],[891,555,3],[565,547,1],[594,196,2],[649,760,2],[567,777,2],[206,1136,1],[1082,526,2],[681,473,2],[65,820,0],[627,61,2],[553,542,0],[588,471,1],[535,856,1],[546,614,1],[539,552,1],[565,542,1],[536,523,1],[606,556,1],[547,557,1],[198,519,0],[534,582,0],[305,777,1],[660,441,5],[546,535,1],[574,539,2],[538,576,2],[570,544,1],[572,544,0],[439,515,0],[658,540,0],[531,533,1],[536,524,1],[580,544,2],[438,1202,2],[641,822,2],[192,195,1],[632,67,2],[556,538,0],[535,657,1],[566,557,1],[308,820,0],[202,578,1],[574,440,2],[649,578,2],[530,533,1],[783,564,3],[706,806,2],[609,557,1],[996,205,2],[536,738,1],[539,304,1],[730,539,2],[66,516,0],[439,571,0],[628,311,2],[535,571,1],[725,558,3],[306,851,1],[658,542,0],[199,731,1],[754,205,2],[192,190,1],[574,540,2],[598,440,1],[536,633,1],[547,539,1],[620,541,1],[886,382,2],[639,553,3],[579,546,1],[841,584,4],[541,548,1],[542,595,1],[603,440,1],[536,561,1],[541,549,1],[550,561,1],[516,520,1],[823,540,0],[192,189,1],[528,526,1],[607,561,1],[549,543,1],[583,500,1],[538,559,2],[554,576,0],[313,875,0],[614,561,1],[794,569,3],[188,958,1],[564,916,2],[754,683,2],[843,583,4],[536,519,1],[520,518,1],[542,549,1],[732,567,1],[583,667,1],[544,623,1],[684,544,1],[535,661,1],[537,581,1],[543,604,1],[736,308,0],[610,539,0],[853,852,1],[540,552,1],[538,575,2],[439,563,0],[500,766,2],[441,1006,2],[659,438,5],[384,385,1],[537,615,1],[818,72,2],[795,569,3],[312,674,0],[543,648,1],[580,677,2],[472,499,0],[77,76,1],[625,539,1],[550,499,1],[437,652,2],[547,542,1],[628,592,1],[200,808,1],[546,574,1],[539,64,1],[548,537,1],[540,642,1],[866,527,2],[515,536,0],[899,391,2],[597,796,2],[535,621,1],[566,556,1],[584,668,1],[535,609,1],[210,210,1],[440,565,0],[527,1123,1],[441,1215,2],[664,66,1],[537,616,1],[1058,523,2],[558,544,0],[543,611,1],[537,576,1],[740,572,3],[198,520,0],[471,561,0],[550,542,1],[199,578,1],[73,981,1],[536,616,1],[709,731,3],[814,535,1],[618,542,1],[638,552,3],[537,633,1],[669,555,3],[442,653,2],[544,654,1],[894,525,2],[206,204,1],[559,867,1],[586,540,1],[557,499,1],[546,738,1],[614,614,1],[525,527,1],[537,571,1],[538,570,2],[65,440,0],[573,543,0],[205,207,1],[539,611,1],[472,500,0],[559,622,1],[678,541,1],[521,523,1],[645,920,2],[601,556,1],[540,611,1],[610,544,0],[308,888,0],[307,888,0],[1017,1373,2],[536,565,1],[640,882,2],[581,439,1],[792,564,3],[543,655,1],[536,650,1],[635,542,0],[539,589,1],[573,541,0],[1147,203,3],[471,500,0],[580,540,2],[586,539,1],[540,811,1],[598,439,1],[540,553,1],[379,380,1],[637,69,2],[546,539,1],[1017,522,2],[566,535,1],[304,590,0],[301,765,0],[701,67,2],[548,199,1],[550,541,1],[776,541,2],[200,665,0],[188,1325,1],[640,797,2],[643,472,6],[307,945,0],[536,585,1],[626,541,1],[563,571,1],[525,524,2],[625,542,1],[610,543,0],[518,519,1],[59,60,1],[517,883,0],[531,526,1],[537,572,1],[537,634,1],[536,589,1],[675,66,1],[517,884,0],[626,540,1],[551,563,1],[73,71,1],[389,388,1],[515,543,0],[565,606,1],[635,549,0],[536,586,1],[872,205,2],[728,535,0],[556,579,0],[536,606,1],[546,599,1],[558,540,0],[65,439,0],[850,539,0],[819,685,3],[535,318,1],[56,56,1],[472,515,0],[538,579,2],[557,561,1],[551,535,1],[546,561,1],[551,576,1],[571,542,1],[535,561,1],[536,614,1],[515,541,0],[1426,200,3],[471,499,0],[715,816,2],[628,724,2],[743,314,2],[656,741,4],[575,535,1],[603,439,1],[543,552,1],[547,540,1],[536,576,1],[594,439,1],[616,542,2],[657,679,2],[520,1289,1],[588,472,1],[305,544,0],[1080,525,2],[581,472,1],[551,630,1],[535,680,1],[313,879,1],[317,317,1],[562,539,0],[615,544,0],[686,541,0],[58,60,1],[532,897,0],[544,612,1],[388,742,0],[635,540,0],[68,813,1],[1135,191,3],[536,787,1],[640,1009,2],[773,542,2],[535,583,1],[575,199,1],[535,733,1],[601,439,1],[547,500,1],[536,769,1],[634,539,2],[628,644,2],[515,542,0],[756,574,3],[536,522,1],[621,621,1],[543,557,1],[670,67,4],[610,540,0],[639,539,0],[547,609,1],[535,584,1],[543,499,1],[537,607,1],[185,185,1],[673,542,1],[197,802,0],[669,669,1],[310,311,1],[754,921,2],[534,545,0],[570,556,1],[748,645,2],[544,611,1],[550,540,1],[527,526,2],[598,679,2],[198,945,0],[573,536,0],[739,66,1],[536,596,1],[669,613,3],[639,553,1],[636,649,2],[566,199,1],[637,1021,2],[538,561,2],[642,568,1],[601,440,1],[1013,572,3],[63,822,1],[536,521,1],[536,581,1],[658,549,0],[520,856,1],[534,539,0],[537,586,1],[578,780,2],[544,720,1],[641,1027,2],[72,71,1],[199,559,0],[544,557,1],[646,539,0],[535,576,1],[613,555,3],[551,581,1],[692,542,1],[540,737,1],[77,78,1],[537,621,1],[599,439,1],[616,541,2],[640,202,2],[1163,382,2],[546,559,1],[58,1016,1],[641,62,2],[532,533,6],[540,633,1],[662,580,2],[537,585,1],[537,552,1],[537,579,1],[546,603,1],[547,559,1],[926,302,2],[1058,524,2],[536,615,1],[535,614,1],[575,561,1],[536,623,1],[440,557,0],[536,579,1],[564,544,0],[595,472,1],[1115,189,2],[198,801,0],[540,606,1],[547,606,1],[299,300,1],[570,550,1],[840,539,0],[206,208,1],[612,543,0],[570,607,1],[566,500,1],[558,796,2],[394,393,1],[629,629,1],[577,193,2],[569,544,0],[604,535,0],[539,585,1],[560,540,0],[564,543,0],[471,515,0],[65,386,0],[610,548,0],[532,689,1],[594,440,1],[560,539,0],[771,66,1],[636,200,2],[537,778,1],[678,64,2],[627,783,2],[581,535,1],[1175,391,2],[609,609,1],[686,542,0],[579,67,2],[563,544,1],[537,623,1],[538,565,2],[65,714,0],[536,671,1],[198,533,0],[499,775,2],[866,878,1],[561,567,1],[661,978,3],[531,530,2],[543,553,1],[709,602,3],[543,559,1],[557,614,1],[551,565,1],[579,535,1],[818,702,2],[211,212,1],[587,614,0],[544,552,1],[472,561,0],[586,542,1],[555,1143,1],[535,911,1],[1103,591,4],[209,207,1],[543,615,1],[665,622,1],[646,471,6],[537,565,1],[571,535,1],[632,819,2],[662,551,2],[580,539,2],[610,535,0],[672,192,2],[563,630,1],[638,535,0],[310,312,1],[572,542,0],[539,643,1],[536,609,1],[565,559,1],[384,651,1],[639,540,0],[645,194,2],[563,499,1],[758,573,3],[534,633,0],[579,199,1],[597,558,2],[535,752,1],[549,552,1],[550,621,1],[585,543,1],[557,500,1],[535,630,1],[852,853,1],[639,544,0],[731,200,3],[625,440,1],[645,847,2],[616,440,2],[550,306,2],[618,439,1],[845,594,2],[596,596,2],[575,567,1],[846,59,2],[1108,593,4],[541,499,1],[580,439,2],[54,55,1],[571,306,2],[639,535,0],[718,553,4],[537,575,1],[570,500,1],[586,544,1],[197,533,0],[526,878,0],[638,539,0],[536,566,1],[551,540,1],[543,309,2],[597,1133,2],[607,439,1],[672,880,2],[395,395,1],[541,589,1],[629,590,1],[620,439,1],[578,544,0],[585,544,1],[655,548,0],[554,575,0],[559,541,1],[748,748,2],[549,611,1],[537,642,1],[577,796,2],[632,813,2],[569,540,0],[599,472,1],[67,70,1],[684,567,1],[585,540,1],[184,183,1],[595,471,1],[801,387,0],[599,539,1],[920,193,4],[958,189,2],[311,815,0],[537,611,1],[720,65,2],[539,658,1],[388,767,0],[195,604,1],[517,982,0],[597,821,2],[627,822,2],[685,67,3],[590,629,1],[536,713,1],[725,535,0],[311,568,0],[549,959,3],[534,544,0],[534,540,0],[526,527,2],[202,204,1],[315,1078,0],[548,963,3],[586,543,1],[523,522,2],[579,567,1],[471,547,0],[544,733,1],[830,830,2],[540,663,1],[641,792,2],[686,539,0],[304,305,1],[557,546,1],[834,651,3],[654,560,5],[703,916,3],[536,545,1],[539,303,1],[585,541,1],[599,546,1],[67,813,1],[540,638,1],[542,500,1],[562,653,4],[559,650,1],[744,544,1],[190,193,1],[581,540,1],[639,543,0],[619,440,1],[549,199,1],[313,1277,1],[383,385,1],[623,541,2],[525,852,0],[537,600,1],[637,794,2],[801,386,0],[655,441,6],[538,778,2],[542,663,1],[1058,1612,2],[683,683,2],[1264,1650,2],[534,634,0],[540,643,1],[1032,302,2],[544,500,1],[549,500,1],[516,884,0],[520,522,1],[640,780,2],[537,612,1],[563,500,1],[674,674,1],[201,816,1],[542,589,1],[548,499,1],[623,439,2],[626,440,1],[635,548,0],[707,558,3],[528,910,0],[310,628,0],[579,540,1],[649,709,2],[521,519,1],[680,680,4],[541,663,1],[1037,312,2],[543,643,1],[626,439,1],[846,716,2],[563,565,1],[539,594,1],[547,535,1],[606,559,1],[542,625,1],[850,302,2],[665,536,1],[788,788,2],[389,657,1],[536,572,1],[543,646,1],[440,566,0],[524,519,1],[738,65,2],[557,566,1],[560,652,4],[558,661,2],[570,551,1],[515,537,0],[605,440,6],[559,574,1],[679,679,4],[795,632,3],[72,74,1],[378,378,1],[613,669,1],[537,643,1],[654,438,6],[720,66,2],[555,603,0],[66,714,0],[818,961,2],[71,73,1],[543,64,1],[536,571,1],[440,551,0],[1735,856,4],[741,671,3],[197,521,0],[636,602,2],[54,53,1],[592,628,1],[472,547,0],[562,540,0],[523,518,1],[557,544,1],[576,535,1],[1047,573,3],[939,386,0],[567,199,1],[535,650,1],[849,657,3],[603,546,1],[544,594,1],[68,632,1],[76,76,1],[536,552,1],[638,543,0],[571,199,1],[544,553,1],[539,550,1],[543,574,1],[537,553,1],[708,919,3],[752,65,1],[733,65,1],[542,499,1],[639,548,0],[641,916,2],[540,646,1],[531,528,1],[797,797,2],[540,586,1],[555,599,0],[608,572,2],[536,553,1],[546,575,1],[606,440,1],[748,194,2],[576,566,1],[607,550,1],[760,760,4],[541,626,1],[627,62,2],[637,919,2],[654,549,0],[756,65,3],[472,563,0],[543,580,1],[569,543,0],[470,470,1],[536,611,1],[544,643,1],[624,439,1],[536,600,1],[550,571,1],[542,642,1],[541,554,3],[441,441,1],[471,566,0],[536,749,1],[191,190,1],[499,557,0],[696,925,2],[539,642,1],[550,563,1],[499,561,0],[738,66,2],[586,719,3],[564,564,3],[205,204,1],[438,438,1],[472,557,0],[589,309,2],[733,66,1],[655,562,5],[578,535,0],[537,675,1],[715,882,2],[552,719,4],[806,806,2],[817,66,2],[539,547,1],[632,69,2],[717,539,0],[471,546,0],[548,553,1],[574,439,2],[565,535,1],[567,561,1],[568,576,1],[515,540,0],[574,538,2],[568,565,1],[619,656,2],[638,544,0],[817,546,2],[777,539,0],[580,662,2],[541,642,1],[543,385,1],[605,439,6],[724,724,2],[696,886,2],[529,530,1],[544,735,1],[625,439,1],[581,67,2],[536,646,1],[535,195,1],[541,305,1],[706,899,2],[70,68,1],[544,646,1],[846,983,2],[756,66,3],[537,630,1],[541,500,1],[539,634,1],[551,568,1],[381,1571,1],[537,566,1],[539,575,1],[472,565,0],[600,600,2],[1054,702,3],[539,646,1],[539,687,1],[543,563,1],[539,540,1],[535,575,1],[544,570,1],[472,571,0],[638,549,0],[535,670,1],[541,599,1],[1355,203,2],[536,643,1],[574,633,2],[471,565,0],[579,571,1],[537,832,1],[66,888,0],[548,552,1],[543,725,1],[549,305,1],[64,61,1],[539,586,1],[311,1087,1],[559,535,1],[614,439,1],[623,542,2],[213,212,1],[588,557,1],[594,648,2],[561,570,1],[524,853,0],[539,752,1],[548,611,1],[561,573,2],[713,541,0],[620,440,1],[543,572,1],[664,309,0],[66,736,0],[546,540,1],[317,316,1],[746,540,2],[739,65,1],[610,549,0],[59,57,1],[535,1043,1],[472,550,0],[546,699,1],[897,759,2],[544,388,1],[192,830,1],[588,588,1],[1077,555,3],[1717,200,5],[471,570,0],[551,500,1],[706,946,2],[543,700,1],[621,439,1],[666,666,3],[543,585,1],[676,303,2],[187,189,1],[581,568,1],[885,518,2],[309,675,0],[542,305,1],[577,558,2],[539,898,1],[542,603,1],[529,528,2],[650,556,1],[543,586,1],[610,537,0],[540,686,1],[63,627,1],[561,199,1],[532,910,0],[630,565,1],[934,387,0],[532,1443,1],[192,1180,1],[527,1134,1],[576,547,1],[561,607,1],[772,304,2],[60,58,1],[544,698,1],[606,565,1],[617,573,2],[802,386,0],[585,718,3],[723,542,0],[500,547,0],[644,540,0],[1445,382,3],[440,514,0],[571,499,1],[535,297,1],[574,634,2],[550,560,1],[601,680,2],[539,546,1],[557,543,1],[559,544,1],[312,310,1],[548,589,1],[811,66,1],[309,815,0],[535,581,1],[787,66,1],[1136,207,2],[561,535,1],[610,541,0],[596,440,2],[567,575,1],[550,535,1],[315,875,0],[64,822,1],[536,901,1],[764,569,2],[737,66,1],[206,203,1],[472,566,0],[555,609,0],[568,874,2],[537,654,1],[599,471,1],[472,559,0],[525,523,1],[539,609,1],[534,543,0],[306,587,1],[778,66,2],[799,547,2],[1194,203,2],[392,1626,1],[439,560,1],[543,601,1],[306,304,1],[521,520,2],[622,546,2],[526,1134,1],[535,636,1],[534,536,0],[298,298,1],[537,646,1],[522,889,0],[1628,1380,3],[544,196,1],[540,654,1],[705,792,2],[576,536,1],[596,634,2],[547,562,1],[638,552,1],[658,548,0],[535,535,3],[543,598,1],[543,739,1],[61,63,1],[537,774,1],[1281,207,2],[537,685,1],[1493,391,3],[539,607,1],[539,812,1],[799,559,2],[585,536,1],[618,440,1],[551,570,1],[571,560,1],[633,540,2],[568,566,1],[201,797,1],[778,65,2],[553,718,4],[616,616,2],[614,544,1],[65,736,0],[571,567,1],[621,563,1],[580,440,2],[1758,535,1],[471,563,0],[547,566,1],[539,655,1],[472,546,0],[64,647,0],[624,670,2],[471,550,0],[952,689,2],[961,68,2],[473,611,2],[387,517,0],[664,551,1],[539,697,1],[538,519,2],[584,499,1],[70,69,1],[544,586,1],[540,594,1],[542,612,1],[536,598,1],[544,598,1],[537,545,1],[541,612,1],[653,653,1],[715,578,2],[515,605,0],[515,539,0],[701,794,2],[538,662,2],[707,796,3],[535,656,1],[771,65,1],[574,749,2],[939,387,0],[532,527,1],[500,557,0],[561,557,1],[649,797,2],[619,439,1],[638,540,0],[986,539,0],[686,548,0],[775,498,4],[818,71,2],[535,651,1],[563,551,1],[575,536,1],[472,534,0],[686,537,0],[766,501,4],[307,517,0],[389,390,1],[515,544,0],[677,580,3],[622,440,2],[546,744,1],[558,542,0],[524,1591,1],[546,579,1],[624,440,1],[652,652,1],[590,717,2],[384,383,1],[524,1324,1],[540,196,1],[475,475,1],[957,516,2],[471,551,0],[514,582,0],[523,528,1],[561,499,1],[549,560,4],[957,982,1],[561,537,1],[1090,716,3],[586,536,1],[558,541,0],[539,654,1],[539,647,1],[669,555,5],[543,633,1],[546,567,1],[1120,568,2],[562,548,0],[535,579,1],[604,1008,2],[537,896,1],[565,500,1],[572,740,2],[471,534,0],[306,614,0],[531,532,1],[539,576,1],[543,661,1],[594,556,1],[472,551,0],[596,544,2],[658,536,0],[537,583,1],[590,840,2],[562,544,0],[637,569,2],[754,204,2],[540,655,1],[594,554,1],[620,551,1],[628,823,2],[518,517,1],[566,609,1],[548,642,1],[539,564,1],[211,211,1],[603,622,1],[540,704,1],[535,565,1],[537,671,1],[1003,193,2],[555,606,0],[599,622,1],[783,627,3],[197,522,0],[567,892,2],[810,387,4],[812,541,0],[600,556,2],[878,866,1],[811,65,1],[636,578,2],[639,549,0],[818,981,2],[557,542,1],[574,622,2],[585,548,1],[645,193,2],[543,583,1],[186,188,1],[308,517,0],[534,537,0],[615,540,0],[309,739,0],[531,910,0],[469,468,1],[590,306,2],[628,674,1],[549,553,1],[663,543,1],[546,560,1],[804,386,4],[632,795,2],[636,915,2],[1165,300,2],[471,571,0],[544,710,1],[533,910,0],[471,588,0],[630,556,1],[760,578,4],[200,744,0],[562,536,0],[575,499,1],[581,565,1],[649,877,2],[545,499,4],[547,565,1],[709,808,3],[544,585,1],[540,305,1],[546,650,1],[543,712,1],[543,634,1],[539,196,1],[572,1013,2],[540,585,1],[539,538,1],[788,925,2],[524,522,1],[672,1158,2],[543,564,1],[731,199,3],[983,63,2],[439,514,0],[537,573,1],[813,813,2],[542,690,1],[559,571,1],[206,921,1],[541,557,1],[586,537,1],[649,915,2],[540,550,1],[552,611,1],[603,471,1],[599,544,1],[536,685,1],[524,861,0],[2104,518,3],[596,554,2],[1011,688,3],[536,64,1],[387,518,0],[580,633,2],[841,584,1],[567,579,1],[539,614,1],[527,866,0],[539,610,1],[536,734,1],[621,550,1],[764,571,0],[973,631,3],[72,73,1],[536,723,1],[788,385,2],[536,588,1],[566,562,1],[1263,602,4],[542,611,1],[385,383,1],[651,382,2],[386,517,0],[1045,1282,1],[472,576,0],[561,560,1],[609,547,1],[758,1285,3],[1331,70,3],[308,518,0],[472,570,0],[934,386,0],[499,550,0],[604,631,2],[586,549,1],[384,382,1],[535,675,1],[581,500,1],[599,557,1],[543,619,1],[567,541,1],[544,601,1],[630,563,1],[649,816,2],[574,545,2],[536,573,1],[585,537,1],[542,615,1],[621,571,1],[191,192,1],[703,1309,3],[541,615,1],[388,835,0],[580,616,2],[555,650,0],[594,551,1],[548,305,1],[561,550,1],[574,616,2],[540,579,1],[846,60,2],[317,318,1],[313,311,1],[854,65,1],[55,55,1],[532,1231,0],[542,670,2],[1372,61,3],[540,310,1],[561,546,1],[544,771,1],[639,537,0],[536,655,1],[558,539,0],[996,207,2],[538,518,2],[545,500,4],[647,440,1],[758,1047,3],[536,528,1],[470,610,2],[554,534,0],[760,636,4],[68,708,1],[595,595,1],[543,798,1],[732,544,1],[596,439,2],[598,471,1],[642,440,1],[302,765,0],[843,583,1],[307,518,0],[390,388,1],[519,520,1],[1079,308,0],[66,984,0],[535,438,1],[976,584,1],[563,541,1],[1190,535,0],[537,601,1],[389,391,1],[740,1235,3],[204,207,1],[541,656,2],[566,678,1],[537,638,1],[630,551,1],[537,595,1],[535,441,1],[515,580,0],[569,569,3],[195,661,1],[581,536,1],[500,544,0],[1045,529,1],[540,546,1],[1143,199,1],[599,547,1],[729,729,2],[65,984,0],[725,604,3],[622,554,2],[885,889,1],[696,383,2],[623,623,2],[539,663,1],[542,585,1],[535,798,1],[540,711,1],[184,184,1],[440,562,1],[581,547,1],[566,576,1],[814,577,3],[603,472,1],[471,559,0],[675,554,1],[499,548,0],[701,69,2],[561,614,1],[613,199,3],[600,439,2],[676,850,2],[308,519,0],[540,834,2],[940,608,4],[71,1192,1],[550,579,1],[565,562,1],[808,200,3],[552,552,1],[851,539,0],[812,542,0],[537,723,1],[541,586,1],[847,558,3],[472,575,0],[570,566,1],[530,526,1],[301,1032,1],[540,539,1],[59,58,1],[65,1015,0],[537,713,1],[1248,304,3],[601,472,1],[612,539,0],[567,840,2],[799,557,2],[543,624,1],[560,549,0],[574,471,2],[537,588,1],[639,541,0],[522,523,2],[665,535,1],[548,663,1],[567,304,2],[546,499,1],[553,553,1],[593,569,2],[544,580,1],[686,589,2],[543,610,1],[618,551,1],[600,633,2],[540,823,1],[544,610,1],[387,519,0],[530,534,1],[822,822,2],[546,779,1],[308,974,0],[71,74,1],[641,564,2],[534,690,0],[541,695,1],[544,828,1],[679,535,0],[198,974,0],[544,385,1],[649,202,2],[524,526,1],[657,535,0],[735,573,2],[182,183,1],[60,57,1],[550,500,1],[574,472,2],[658,537,0],[539,619,1],[540,581,1],[549,659,1],[534,580,0],[524,525,2],[588,561,1],[514,605,0],[559,499,1],[696,1028,2],[832,66,1],[638,548,0],[705,62,2],[1419,526,2],[1074,683,3],[576,568,1],[910,759,2],[671,564,3],[972,583,1],[598,472,1],[623,539,2],[191,1180,1],[542,618,1],[312,311,1],[537,596,1],[548,660,1],[1264,526,2],[548,585,1],[541,977,1],[536,610,1],[933,617,4],[542,552,1],[706,1053,2],[858,64,3],[540,610,1],[471,579,0],[535,319,1],[568,581,1],[698,544,1],[666,542,3],[1154,307,0],[555,614,0],[538,625,2],[567,571,1],[559,603,1],[72,1192,1],[386,518,0],[442,443,2],[198,521,0],[587,607,0],[541,63,2],[806,946,2],[740,1013,3],[187,188,1],[533,532,3],[565,563,1],[539,684,1],[542,994,1],[566,547,1],[576,500,1],[536,525,1],[551,539,1],[527,528,1],[541,596,1],[536,753,1],[191,830,1],[567,635,2],[555,955,0],[1021,569,3],[557,927,1],[65,801,0],[548,562,4],[570,306,1],[471,581,0],[846,1016,2],[437,436,2],[544,574,1],[630,630,1],[636,877,2],[700,543,1],[622,556,2],[825,65,2],[531,878,0],[314,875,0],[543,654,1],[540,67,1],[897,529,2],[2104,519,3],[774,66,4],[554,440,0],[536,605,1],[535,645,1],[536,584,1],[541,783,2],[749,65,4],[979,200,3],[536,601,1],[874,310,4],[524,884,0],[633,690,2],[551,662,1],[544,563,1],[500,549,0],[534,574,0],[576,557,1],[537,753,1],[544,634,1],[543,855,1],[594,471,1],[544,655,1],[964,644,3],[541,611,1],[724,644,2],[547,612,1],[579,499,1],[638,542,0],[470,469,2],[570,675,1],[549,586,1],[1264,2195,2],[544,619,1],[543,67,1],[570,499,1],[551,562,1],[706,390,2],[737,65,1],[591,564,2],[195,515,0],[439,546,0],[517,887,0],[880,830,2],[440,500,0],[580,634,2],[672,973,2],[537,734,1],[666,574,3],[77,77,1],[616,540,2],[952,534,2],[968,310,2],[600,543,2],[676,717,2],[1094,568,2],[592,311,2],[604,821,2],[996,872,2],[1343,538,2],[61,62,1],[544,757,1],[570,542,1],[601,471,1],[989,65,2],[597,1161,2],[795,708,3],[536,654,1],[518,520,1],[611,539,0],[537,598,1],[885,861,1],[687,539,1],[577,688,2],[1194,204,2],[565,568,1],[584,841,5],[541,574,1],[749,66,4],[541,546,1],[812,549,0],[191,194,1],[307,519,0],[474,719,2],[1106,1106,4],[535,771,1],[544,613,1],[549,303,1],[1017,521,2],[702,702,2],[544,622,1],[209,1627,1],[537,663,1],[561,575,1],[703,564,3],[538,626,2],[880,189,2],[60,1270,1],[72,961,1],[544,64,1],[559,900,1],[540,673,1],[550,615,1],[561,536,1],[576,551,1],[592,815,1],[543,768,1],[795,670,3],[517,728,1],[599,574,1],[543,388,1],[586,548,1],[1079,307,0],[201,199,1],[535,667,1],[600,440,2],[1301,302,2],[620,472,1],[536,595,1],[568,664,1],[919,569,3],[571,579,1],[542,580,1],[544,624,1],[783,656,3],[735,66,1],[543,606,1],[685,764,3],[1111,522,2],[791,791,2],[524,523,2],[636,760,2],[661,535,0],[685,569,3],[1504,74,2],[541,547,1],[604,992,2],[186,189,1],[439,557,0],[607,544,1],[643,540,0],[198,522,0],[439,499,0],[583,972,1],[2312,535,1],[594,472,1],[539,772,1],[560,560,1],[603,547,1],[715,202,2],[575,306,2],[581,551,1],[610,542,0],[308,945,0],[651,1028,2],[563,535,1],[1283,501,2],[539,732,1],[646,544,0],[825,66,2],[534,695,0],[671,671,3],[585,549,1],[1017,1612,2],[65,802,0],[380,382,1],[588,566,1],[634,695,2],[619,471,1],[542,546,1],[543,573,1],[544,633,1],[665,200,2],[541,598,1],[588,570,1],[603,574,1],[650,559,1],[535,669,1],[71,69,1],[541,620,1],[772,590,1],[519,521,1],[201,578,1],[826,547,3],[536,699,1],[789,567,1],[528,1134,1],[652,438,1],[549,615,4],[309,767,0],[1144,64,4],[562,562,1],[541,553,1],[540,710,1],[538,571,2],[676,676,1],[541,561,1],[806,388,2],[205,921,1],[611,544,0],[534,596,0],[565,551,1],[588,499,1],[643,539,0],[925,572,3],[536,537,1],[605,471,6],[880,880,2],[653,548,0],[1258,525,2],[551,580,1],[536,67,1],[567,546,1]]} diff --git a/variants/sparse-high-dynamic-21bin/sparse_router_config.yaml b/variants/sparse-high-dynamic-21bin/sparse_router_config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..043af2f812147477b3bccc1dfedc390d012367e5 --- /dev/null +++ b/variants/sparse-high-dynamic-21bin/sparse_router_config.yaml @@ -0,0 +1,372 @@ +model_type: actioncodec2_sparse_router +config_version: 1 +profiles: +- name: joint + token_offset: 0 + token_budget: 4096 + artifact_fingerprint: 73e6b8ccbbf0364f1b73f2b8c0030ba136a13cce3b5c5462351451ea3fbf4b49 +- name: eef + token_offset: 4096 + token_budget: 4096 + artifact_fingerprint: 3ee4a993de53bc1676dc3a6662f700dc53e64225dc4bfce04da8ac527bd4b9b6 +presets: +- name: dual_eef_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_eef_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_abs + input_dim: 16 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_delta + input_dim: 16 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper + input_dim: 6 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi +- name: single_joint6_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_abs + input_dim: 8 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_delta + input_dim: 8 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 diff --git a/variants/sparse-high-dynamic-2bin/config.json b/variants/sparse-high-dynamic-2bin/config.json new file mode 100644 index 0000000000000000000000000000000000000000..f7d16472edea73c2ca2aff65a40b062aff408c4a --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/config.json @@ -0,0 +1,7 @@ +{ + "model_type": "actioncodec2_sparse", + "processor_class": "ActionCodec2Sparse", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-high-dynamic-2bin/processor_config.json b/variants/sparse-high-dynamic-2bin/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..74792b92bae7cde47c556e7007e0658014afd7b9 --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/processor_config.json @@ -0,0 +1,61 @@ +{ + "processor_class": "ActionCodec2Sparse", + "action_space": "single_eef_delta", + "fitted_profiles": [ + "eef", + "joint" + ], + "preprocessing": { + "eef": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": [ + 0, + 1, + 2 + ], + "gripper_mode": "binary", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "eef", + "context_frames": 1, + "motion_limits": null, + "translation_limit": 0.00125, + "rotation_limit": 0.005 + }, + "joint": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": null, + "gripper_mode": "binary", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "joint", + "context_frames": 1, + "motion_limits": [ + 0.001, + 0.001, + 0.0015, + 0.001875, + 0.00375, + 0.005, + 0.005 + ], + "translation_limit": null, + "rotation_limit": null + } + }, + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-high-dynamic-2bin/profiles/eef/config.json b/variants/sparse-high-dynamic-2bin/profiles/eef/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/eef/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-high-dynamic-2bin/profiles/eef/config.yaml b/variants/sparse-high-dynamic-2bin/profiles/eef/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..91bce7afa786cd19a4dea7e8280a8f5538bc0cb2 --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/eef/config.yaml @@ -0,0 +1,78 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 7 + components: + translation_m: + dims: + start: 0 + stop: 3 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -2.0 + max: 2.0 + order_1: + min: -0.13333333333333333 + max: 0.13333333333333333 + distortion_limit: 0.005 + primitive_selection: smooth + orientation_so3: + dims: + start: 3 + stop: 6 + space: so3 + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -3.141592653589793 + max: 3.141592653589793 + order_1: + min: -0.4166666666666667 + max: 0.4166666666666667 + distortion_limit: 0.02 + primitive_selection: momentum_lazy + representation: rotation_vector + multiplication: right + gripper_open_command: + dims: + - 6 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - translation_m + - orientation_so3 + bpe: + spatial_vocab_size: 285 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 1.8 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-high-dynamic-2bin/profiles/eef/primitives.npz b/variants/sparse-high-dynamic-2bin/profiles/eef/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..f61fe58118458413ce3a5167db7c381c5a932499 --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/eef/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ffa50a3dcb13ab27c6c4b47f1ad542ae184e86658dbcec23a8199e42aefdb99 +size 3806 diff --git a/variants/sparse-high-dynamic-2bin/profiles/eef/processor_config.json b/variants/sparse-high-dynamic-2bin/profiles/eef/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/eef/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-high-dynamic-2bin/profiles/eef/sparse_bpe.json b/variants/sparse-high-dynamic-2bin/profiles/eef/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..381c2995da427a06f02d32da2809f613ddfdd14d --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/eef/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[29,29,29,67,67,67,2],"zero":[14,14,14,33,33,33,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[284,284,1],[284,183,1],[284,182,1],[284,116,1],[284,117,1],[284,69,1],[285,285,2],[284,70,1],[286,70,1],[287,69,1],[284,249,1],[284,248,1],[14,14,2],[13,13,2],[41,41,2],[42,42,2],[248,248,1],[249,249,1],[284,14,1],[285,69,2],[289,69,1],[288,69,1],[284,13,1],[288,70,1],[286,117,1],[286,116,1],[287,116,1],[287,117,1],[284,41,1],[289,70,1],[284,42,1],[291,291,4],[285,70,2],[297,297,4],[298,298,4],[288,41,1],[289,42,1],[299,299,4],[300,300,4],[285,182,2],[118,118,1],[115,115,1],[285,116,2],[285,117,2],[293,116,1],[293,117,1],[286,69,1],[184,184,1],[287,70,1],[294,117,1],[290,249,1],[294,116,1],[181,181,1],[290,248,1],[285,183,2],[298,13,4],[297,14,4],[288,288,1],[292,248,1],[289,289,1],[291,285,4],[292,249,1],[14,14,3],[299,41,4],[285,249,2],[300,42,4],[285,248,2],[12,12,2],[250,250,1],[247,247,1],[13,13,3],[71,71,2],[287,287,1],[286,286,1],[15,15,2],[41,288,0],[301,248,2],[302,249,2],[42,289,0],[183,282,0],[43,43,2],[40,40,2],[182,282,0],[294,287,1],[14,14,4],[285,290,2],[286,293,1],[288,248,1],[284,115,1],[284,118,1],[289,249,1],[68,68,2],[285,14,2],[286,13,1],[292,184,1],[296,296,1],[295,295,1],[285,41,2],[287,290,1],[304,182,2],[285,42,2],[286,248,1],[287,41,1],[287,42,1],[286,249,1],[287,294,1],[116,282,0],[317,183,2],[117,282,0],[13,13,4],[286,42,1],[286,41,1],[286,292,1],[287,249,1],[290,181,1],[288,249,1],[301,301,2],[285,292,2],[289,248,1],[287,248,1],[302,302,2],[69,283,0],[285,13,2],[293,293,1],[285,288,2],[299,288,0],[284,184,1],[285,289,2],[287,14,1],[300,289,0],[295,42,1],[291,69,4],[296,41,1],[284,297,1],[285,287,2],[285,303,2],[282,291,0],[284,181,1],[119,119,1],[290,42,1],[311,70,1],[288,14,1],[284,298,1],[290,41,1],[114,114,1],[285,295,2],[286,14,1],[285,296,2],[284,283,1],[290,287,1],[70,282,0],[309,69,1],[293,248,1],[294,294,1],[289,14,1],[289,13,1],[312,70,1],[310,69,1],[290,14,1],[325,118,2],[292,41,1],[284,282,1],[326,115,2],[69,282,0],[249,295,0],[288,13,1],[291,70,4],[285,307,2],[296,42,1],[185,185,1],[292,42,1],[180,180,1],[285,313,2],[293,249,1],[295,41,1],[70,364,0],[116,283,0],[285,286,2],[294,249,1],[285,315,2],[284,250,1],[294,248,1],[287,13,1],[284,247,1],[288,299,1],[117,283,0],[293,286,1],[289,300,1],[296,301,2],[292,13,1],[283,291,0],[292,332,1],[296,14,1],[293,41,1],[284,299,1],[352,12,4],[294,42,1],[295,14,1],[284,300,1],[293,42,1],[292,286,1],[305,42,1],[295,302,2],[248,296,0],[294,41,1],[306,41,1],[308,41,1],[287,288,1],[325,325,2],[326,326,2],[290,290,1],[287,289,1],[291,182,4],[297,297,3],[356,71,4],[359,15,4],[309,42,1],[298,298,3],[310,41,1],[337,337,2],[286,288,1],[69,367,0],[286,289,1],[295,13,1],[296,13,1],[247,301,1],[312,42,1],[290,13,1],[250,302,1],[311,41,1],[291,116,4],[314,42,1],[293,13,1],[322,288,0],[296,288,1],[251,251,1],[304,116,2],[295,289,1],[246,246,1],[284,319,1],[323,289,0],[291,117,4],[304,117,2],[365,43,4],[44,44,2],[183,283,0],[292,292,1],[332,184,2],[182,283,0],[294,14,1],[366,40,4],[284,318,1],[320,288,1],[301,288,0],[305,289,1],[302,289,0],[284,290,1],[321,289,1],[306,288,1],[292,14,1],[118,118,2],[337,181,2],[11,11,2],[308,248,1],[305,249,1],[115,115,2],[291,183,4],[39,39,2],[248,282,0],[288,42,1],[249,282,0],[353,250,2],[309,309,1],[310,310,1],[354,247,2],[306,248,1],[292,284,1],[14,288,0],[317,116,2],[298,12,4],[289,41,1],[312,312,1],[295,288,1],[311,311,1],[14,287,0],[308,288,1],[290,288,1],[296,289,1],[290,289,1],[294,13,1],[317,117,2],[314,249,1],[286,71,1],[304,249,2],[16,16,2],[14,289,0],[314,289,1],[376,68,4],[284,332,1],[72,72,2],[14,286,0],[291,249,4],[291,248,4],[304,248,2],[13,286,0],[14,290,0],[329,41,1],[13,289,0],[299,299,3],[286,331,1],[284,325,1],[330,42,1],[300,300,3],[290,284,1],[284,326,1],[287,295,1],[313,288,1],[290,295,1],[303,41,1],[181,287,0],[287,296,1],[303,42,1],[315,289,1],[291,41,4],[115,288,0],[327,41,2],[334,42,1],[291,42,4],[13,288,0],[303,290,1],[15,297,2],[284,288,1],[301,286,0],[118,289,0],[328,42,2],[306,249,1],[302,286,0],[305,248,1],[336,41,1],[284,289,1],[302,287,0],[286,296,1],[290,296,1],[292,288,1],[286,295,1],[287,333,1],[353,353,2],[184,286,0],[314,248,1],[302,288,0],[293,14,1],[290,324,1],[354,354,2],[301,287,0],[284,322,1],[284,323,1],[289,321,1],[352,352,4],[307,41,1],[308,249,1],[292,115,1],[301,289,0],[307,42,1],[288,320,1],[292,289,1],[291,14,4],[290,118,1],[43,300,2],[290,303,1],[317,248,2],[120,120,1],[287,304,1],[40,299,2],[70,283,0],[12,298,2],[359,359,4],[284,340,1],[284,341,1],[301,293,0],[282,345,0],[291,13,4],[332,332,2],[330,309,1],[329,310,1],[185,184,1],[250,295,0],[290,337,1],[13,287,0],[292,118,1],[288,313,1],[290,115,1],[334,312,1],[247,247,2],[289,305,1],[295,287,1],[296,287,1],[296,286,1],[288,306,1],[14,41,0],[406,182,0],[336,311,1],[67,67,1],[297,15,4],[317,249,2],[181,180,1],[113,113,1],[184,293,0],[289,315,1],[14,42,0],[249,283,0],[11,12,2],[295,286,1],[302,294,0],[282,316,0],[302,293,0],[248,283,0],[295,290,1],[13,41,0],[291,290,4],[365,365,4],[282,290,0],[119,325,1],[296,290,1],[13,42,0],[114,326,1],[292,296,1],[287,306,1],[296,338,1],[44,43,2],[288,322,1],[295,335,1],[286,284,1],[292,293,1],[287,305,1],[287,284,1],[72,71,2],[294,289,1],[286,319,1],[294,288,1],[119,118,1],[287,297,1],[299,40,4],[291,292,4],[114,115,1],[286,298,1],[366,366,4],[356,356,4],[291,304,4],[249,250,1],[289,323,1],[300,43,4],[181,294,0],[39,40,2],[283,345,0],[320,248,1],[285,294,2],[327,288,2],[290,68,3],[292,295,1],[286,314,1],[286,308,1],[286,290,1],[312,334,1],[14,296,0],[287,318,1],[311,336,1],[284,292,1],[328,289,2],[288,308,1],[301,294,0],[14,295,0],[13,292,0],[286,297,1],[179,179,1],[285,283,2],[309,330,1],[321,249,1],[71,292,0],[291,317,4],[291,307,4],[329,329,1],[285,293,2],[291,303,4],[288,296,1],[284,337,1],[291,287,4],[340,12,6],[291,288,4],[285,282,2],[289,314,1],[13,296,0],[185,332,1],[304,183,2],[184,310,0],[41,287,0],[289,295,1],[181,311,0],[13,295,0],[289,287,1],[289,286,1],[288,287,1],[291,324,4],[181,312,0],[330,330,1],[251,250,1],[42,287,0],[304,287,2],[288,286,1],[333,333,1],[247,296,0],[310,329,1],[186,186,1],[314,184,1],[307,292,1],[282,292,0],[291,313,4],[291,315,4],[13,293,0],[41,286,0],[70,391,0],[291,289,4],[16,15,2],[341,297,5],[42,286,0],[287,68,1],[41,296,0],[14,297,3],[302,290,0],[283,316,0],[340,298,5],[42,295,0],[284,287,1],[118,309,0],[116,364,0],[293,71,3],[117,364,0],[306,287,1],[13,290,0],[69,393,0],[305,287,1],[348,288,0],[456,180,2],[294,290,1],[69,391,0],[301,361,2],[310,248,1],[70,393,0],[350,289,0],[298,352,4],[284,353,1],[342,288,2],[334,334,1],[296,292,1],[284,295,1],[293,288,1],[291,295,4],[335,295,1],[331,248,1],[293,289,1],[284,286,1],[115,311,0],[294,295,1],[284,354,1],[301,290,0],[41,282,0],[344,289,2],[305,305,1],[42,282,0],[118,312,0],[338,296,1],[331,286,1],[302,362,2],[284,296,1],[308,184,1],[293,292,1],[288,290,1],[291,327,4],[292,339,1],[14,15,2],[13,298,3],[336,336,1],[283,290,0],[291,296,4],[297,14,5],[321,248,1],[289,290,1],[293,319,1],[292,319,1],[333,287,1],[184,309,0],[291,328,4],[294,296,1],[42,288,0],[14,282,0],[117,367,0],[306,306,1],[324,290,2],[326,284,0],[119,120,1],[333,248,1],[291,339,4],[115,310,0],[291,286,4],[325,284,0],[331,249,1],[301,292,0],[41,289,0],[303,288,1],[357,290,2],[116,367,0],[320,249,1],[68,68,1],[296,343,1],[247,361,1],[292,307,1],[41,295,0],[308,308,1],[314,286,1],[376,376,4],[429,114,2],[317,182,2],[299,342,0],[282,287,0],[43,529,2],[302,292,0],[13,12,2],[308,286,1],[297,341,3],[315,290,1],[311,248,1],[304,14,2],[300,309,0],[298,13,5],[300,344,0],[285,320,2],[346,295,1],[313,290,1],[324,117,2],[313,327,1],[284,348,1],[287,335,1],[284,350,1],[42,290,0],[41,290,0],[324,116,2],[284,71,1],[250,362,1],[302,305,0],[406,183,0],[287,298,1],[251,353,1],[42,296,0],[299,310,0],[306,14,1],[341,15,6],[315,328,1],[333,249,1],[40,552,2],[349,295,2],[282,285,0],[292,318,1],[345,249,6],[288,295,1],[289,296,1],[286,343,1],[329,248,1],[303,304,1],[293,295,1],[287,338,1],[293,296,1],[314,314,1],[285,321,2],[345,248,6],[337,180,2],[312,249,1],[245,245,1],[251,252,1],[246,354,1],[286,317,1],[305,181,1],[306,181,1],[296,284,1],[307,12,3],[309,249,1],[295,284,1],[292,298,1],[13,282,0],[322,308,0],[286,318,1],[282,288,0],[303,289,1],[327,183,2],[290,294,1],[70,530,0],[351,296,2],[43,44,2],[283,287,0],[423,423,2],[293,397,1],[302,312,0],[14,292,0],[305,14,1],[328,183,2],[454,185,2],[246,247,1],[285,433,2],[297,297,5],[301,306,0],[299,308,0],[368,290,2],[40,39,2],[309,248,1],[282,295,0],[298,340,3],[299,311,0],[282,289,0],[416,182,4],[315,118,1],[304,42,2],[335,42,1],[313,115,1],[285,360,2],[301,310,0],[283,288,0],[302,309,0],[307,290,1],[301,308,0],[286,115,1],[288,284,1],[307,289,1],[41,248,0],[282,296,0],[297,359,4],[284,119,1],[285,446,2],[312,300,1],[301,311,0],[114,113,1],[343,296,1],[342,248,2],[71,184,0],[286,118,1],[293,298,1],[287,118,1],[285,363,2],[293,371,1],[292,181,1],[286,346,1],[294,68,3],[304,41,2],[287,115,1],[345,41,6],[314,13,1],[304,324,2],[451,183,4],[303,287,1],[305,13,1],[345,42,6],[300,295,0],[315,295,1],[344,249,2],[42,249,0],[14,294,0],[350,43,6],[348,40,6],[312,289,1],[339,286,2],[360,248,1],[299,296,0],[303,295,1],[322,310,0],[289,284,1],[323,309,0],[338,41,1],[323,314,0],[318,318,1],[345,13,6],[324,287,2],[331,331,1],[343,41,1],[330,249,1],[319,298,3],[306,13,1],[247,401,1],[345,290,6],[547,12,4],[16,359,2],[319,319,1],[295,250,2],[312,248,1],[302,250,2],[307,288,1],[342,313,2],[363,249,1],[334,249,1],[345,14,6],[286,300,1],[311,288,1],[292,317,1],[309,13,1],[303,296,1],[41,283,0],[287,300,1],[344,315,2],[283,289,0],[332,292,0],[311,14,1],[308,13,1],[310,13,1],[282,286,0],[295,346,1],[310,288,1],[313,296,1],[309,289,1],[284,114,1],[179,180,1],[336,248,1],[283,295,0],[294,298,1],[42,283,0],[71,72,2],[14,283,0],[15,579,2],[286,299,1],[302,314,0],[284,68,1],[308,14,1],[305,300,1],[322,342,0],[14,248,0],[310,14,1],[287,303,1],[304,303,2],[324,41,2],[45,45,1],[324,42,2],[299,306,0],[394,12,2],[295,292,1],[11,352,2],[290,297,1],[312,14,1],[285,335,2],[285,383,2],[460,116,0],[320,14,1],[309,14,1],[317,286,2],[346,42,1],[312,13,1],[429,429,2],[283,296,0],[293,115,1],[345,292,6],[287,292,1],[369,15,2],[460,117,0],[323,344,0],[296,115,1],[362,250,3],[311,13,1],[321,13,1],[339,41,2],[288,292,1],[71,584,2],[328,249,2],[339,42,2],[282,303,0],[423,119,2],[181,456,1],[13,248,0],[320,40,3],[282,304,0],[11,10,2],[300,314,0],[325,444,2],[331,42,1],[287,299,1],[299,329,0],[185,186,1],[252,252,1],[295,294,1],[286,310,1],[322,329,0],[286,356,1],[326,447,2],[313,292,1],[293,297,1],[38,38,1],[303,286,1],[282,307,0],[73,73,1],[311,249,1],[327,248,2],[337,290,0],[327,14,2],[296,293,1],[289,292,1],[334,300,1],[321,43,3],[15,341,2],[71,293,0],[318,288,0],[338,287,1],[351,41,2],[13,249,0],[286,309,1],[300,330,0],[292,297,1],[335,287,1],[368,294,2],[331,41,1],[306,42,1],[296,294,1],[295,118,1],[286,307,1],[381,295,2],[406,116,0],[454,454,2],[380,296,2],[349,42,2],[314,14,1],[317,41,2],[318,287,0],[286,303,1],[310,249,1],[345,307,6],[358,292,2],[323,330,0],[345,287,6],[301,305,0],[339,292,2],[313,287,1],[121,121,1],[406,117,0],[374,289,1],[288,348,1],[315,287,1],[320,13,1],[70,461,0],[181,336,0],[302,306,0],[290,304,1],[315,292,1],[14,249,0],[286,355,1],[287,319,1],[308,332,1],[293,284,1],[285,306,2],[70,470,0],[373,288,1],[284,294,1],[286,301,1],[247,354,2],[289,350,1],[294,118,1],[293,301,1],[69,364,0],[347,288,0],[314,332,1],[286,340,1],[324,294,2],[250,250,2],[307,287,1],[333,41,1],[284,303,1],[299,366,4],[297,288,0],[285,338,2],[322,296,0],[317,42,2],[312,290,1],[298,298,1],[287,311,1],[67,68,2],[323,295,0],[317,13,2],[358,41,2],[321,14,1],[342,14,2],[327,313,2],[285,305,2],[301,336,0],[246,245,1],[290,315,1],[293,118,1],[287,347,1],[42,248,0],[303,292,1],[112,112,1],[301,309,0],[286,302,1],[302,334,0],[44,365,2],[328,315,2],[335,41,1],[295,293,1],[285,347,2],[43,350,2],[290,318,1],[345,288,6],[302,311,0],[319,289,0],[284,356,1],[301,329,0],[181,334,0],[384,287,2],[287,312,1],[290,313,1],[282,313,0],[293,308,1],[300,305,0],[294,297,1],[283,303,0],[282,315,0],[324,14,2],[370,287,3],[305,41,1],[343,42,1],[328,14,2],[333,42,1],[290,184,1],[292,71,3],[346,41,1],[345,315,6],[286,285,1],[16,17,2],[13,316,0],[307,295,1],[12,340,2],[13,294,0],[358,42,2],[289,294,1],[250,405,1],[506,117,0],[40,348,2],[345,313,6],[338,42,1],[300,365,4],[293,314,1],[302,310,0],[307,296,1],[184,330,0],[288,184,1],[296,247,2],[293,329,1],[290,286,1],[322,284,0],[345,289,6],[288,294,1],[323,284,0],[282,324,0],[357,41,2],[363,248,1],[322,311,0],[301,312,0],[305,295,1],[520,520,2],[296,361,2],[523,523,2],[339,248,2],[345,303,6],[285,344,2],[293,330,1],[313,284,1],[293,310,1],[298,289,0],[342,249,2],[303,115,1],[410,284,1],[299,286,0],[337,284,0],[292,371,1],[307,118,1],[299,287,0],[307,286,1],[282,317,0],[13,283,0],[300,286,0],[323,286,0],[292,287,1],[318,289,0],[344,248,2],[287,325,1],[360,249,1],[119,444,1],[293,309,1],[313,295,1],[506,116,0],[181,333,0],[302,330,0],[299,336,0],[311,290,1],[339,249,2],[293,378,1],[326,296,0],[315,284,1],[287,368,1],[324,248,2],[357,42,2],[306,296,1],[293,343,1],[327,249,2],[294,284,1],[332,284,0],[414,284,1],[312,41,1],[305,290,1],[311,42,1],[315,296,1],[303,284,1],[306,290,1],[345,295,6],[324,249,2],[318,297,3],[285,342,2],[322,292,0],[70,367,0],[345,296,6],[328,248,2],[308,42,1],[293,355,1],[392,117,2],[299,295,0],[344,14,2],[293,340,1],[294,115,1],[292,285,1],[307,284,1],[344,13,2],[39,366,2],[12,547,2],[319,286,0],[298,298,5],[305,294,1],[292,313,1],[293,379,1],[325,295,0],[323,312,0],[299,284,0],[285,381,2],[288,310,1],[314,41,1],[290,300,1],[184,329,0],[41,391,0],[349,41,2],[287,301,1],[119,655,1],[545,119,1],[309,436,1],[285,369,2],[293,302,1],[320,306,1],[322,286,0],[297,289,0],[66,66,1],[114,447,1],[347,289,0],[287,341,1],[384,117,2],[323,305,0],[392,116,2],[288,318,1],[306,337,1],[302,321,0],[184,185,1],[303,313,1],[370,14,3],[323,292,0],[351,42,2],[435,248,0],[293,318,1],[304,295,2],[353,284,0],[529,43,4],[68,290,0],[550,114,1],[339,14,2],[301,320,0],[328,13,2],[315,303,1],[306,294,1],[288,297,1],[303,315,1],[310,442,1],[305,321,1],[68,294,0],[295,300,1],[308,310,1],[322,287,0],[285,380,2],[361,247,3],[313,40,3],[333,318,1],[303,118,1],[421,70,4],[307,115,1],[285,358,2],[299,290,0],[319,284,0],[319,292,0],[315,43,3],[288,311,1],[330,248,1],[301,314,0],[293,346,1],[296,297,1],[288,298,1],[325,286,0],[309,41,1],[322,306,0],[285,343,2],[287,302,1],[307,317,1],[384,116,2],[308,299,1],[327,13,2],[310,42,1],[355,289,0],[41,249,0],[330,13,1],[449,282,0],[294,300,1],[71,332,0],[342,13,2],[312,295,1],[358,248,2],[324,304,2],[296,300,1],[283,313,0],[295,115,1],[456,456,2],[42,393,0],[326,286,0],[358,286,2],[347,290,0],[339,293,2],[282,327,0],[352,298,4],[285,297,2],[314,309,1],[308,322,1],[335,14,1],[292,315,1],[311,296,1],[334,13,1],[344,321,2],[289,181,1],[289,184,1],[338,14,1],[552,40,4],[342,320,2],[323,287,0],[399,180,2],[119,493,1],[114,690,1],[339,13,2],[314,300,1],[313,303,1],[305,337,1],[318,297,1],[327,320,2],[283,286,0],[425,311,1],[283,304,0],[288,181,1],[296,118,1],[358,249,2],[303,15,3],[448,249,0],[68,376,1],[309,295,1],[335,289,1],[14,359,2],[461,182,0],[306,320,1],[348,299,5],[326,287,0],[307,313,1],[357,248,2],[285,314,2],[435,249,0],[376,68,1],[356,356,1],[328,321,2],[336,13,1],[354,284,0],[448,248,0],[426,288,1],[357,249,2],[292,303,1],[295,362,2],[302,308,0],[290,390,1],[284,444,1],[379,41,1],[283,294,0],[308,296,1],[488,282,0],[343,286,1],[283,315,0],[290,307,1],[250,353,2],[319,298,1],[334,248,1],[319,288,0],[346,286,1],[289,309,1],[329,13,1],[345,286,6],[289,298,1],[292,340,1],[114,494,1],[285,357,2],[331,14,1],[318,284,0],[470,182,0],[310,296,1],[321,305,1],[329,14,1],[347,287,0],[351,14,2],[304,296,2],[422,180,2],[247,246,1],[312,441,1],[293,299,1],[349,14,2],[289,319,1],[282,328,0],[377,290,2],[297,297,1],[282,370,0],[285,308,2],[292,300,1],[368,42,2],[315,286,1],[285,355,2],[285,397,2],[322,295,0],[179,178,1],[294,302,1],[579,15,4],[408,248,2],[380,41,2],[379,42,1],[327,360,2],[331,13,1],[386,41,1],[286,313,1],[306,311,1],[357,287,2],[417,296,1],[71,71,3],[331,290,1],[415,295,1],[368,41,2],[289,297,1],[546,180,3],[381,42,2],[288,293,1],[284,447,1],[14,316,0],[294,311,1],[294,312,1],[305,312,1],[292,308,1],[686,67,2],[296,298,1],[314,323,1],[309,300,1],[284,307,1],[304,288,2],[329,249,1],[286,341,1],[282,349,0],[330,14,1],[287,307,1],[289,293,1],[285,346,2],[282,339,0],[306,295,1],[286,315,1],[290,298,1],[308,320,1],[389,42,1],[305,363,1],[283,292,0],[287,313,1],[378,248,1],[439,289,1],[328,363,2],[287,315,1],[301,247,2],[282,294,0],[286,361,1],[387,248,1],[118,423,1],[319,293,0],[289,318,1],[289,312,1],[295,298,1],[356,71,1],[306,360,1],[294,318,1],[282,351,0],[292,185,1],[336,14,1],[313,286,1],[470,183,0],[338,288,1],[523,246,2],[336,249,1],[307,315,1],[300,350,3],[357,14,2],[343,13,1],[476,292,1],[68,68,3],[358,13,2],[299,348,3],[310,292,1],[440,289,1],[388,249,1],[429,113,2],[282,402,0],[290,341,1],[355,288,0],[346,13,1],[405,362,4],[328,295,2],[294,335,1],[296,184,1],[378,249,1],[327,296,2],[284,315,1],[378,41,1],[391,248,0],[305,296,1],[309,292,1],[179,456,1],[287,361,1],[286,347,1],[461,183,0],[425,41,1],[284,493,1],[314,321,1],[10,10,2],[284,313,1],[290,247,1],[284,421,1],[304,13,2],[41,316,0],[294,301,1],[304,289,2],[333,292,1],[283,324,0],[442,310,1],[334,14,1],[294,306,1],[284,306,1],[287,340,1],[323,296,0],[436,309,1],[325,423,2],[356,356,3],[310,299,1],[317,339,2],[303,294,1],[288,319,1],[290,285,1],[382,327,2],[324,13,2],[290,357,1],[288,410,1],[284,305,1],[42,316,0],[294,305,1],[293,361,1],[290,250,1],[284,494,1],[283,307,0],[318,292,0],[344,300,2],[314,295,1],[388,248,1],[292,392,1],[308,360,1],[306,299,1],[335,13,1],[376,376,1],[326,295,0],[320,296,1],[378,42,1],[387,249,1],[386,42,1],[320,308,1],[331,289,1],[119,374,0],[378,286,1],[114,373,0],[283,327,0],[293,396,1],[284,410,1],[441,312,1],[283,285,0],[287,362,1],[290,305,1],[365,365,3],[393,249,0],[303,285,1],[368,249,2],[286,362,1],[292,299,1],[293,395,1],[290,306,1],[350,300,5],[595,284,1],[366,366,3],[289,414,1],[288,337,1],[296,313,1],[294,303,1],[326,293,0],[250,251,1],[370,324,3],[317,307,2],[292,355,1],[295,315,1],[368,248,2],[184,331,0],[335,288,1],[297,341,1],[294,399,1],[385,328,2],[377,41,2],[387,287,1],[655,120,2],[71,308,0],[450,288,1],[351,288,2],[292,314,1],[325,287,0],[71,356,1],[331,288,1],[313,307,1],[408,249,2],[296,299,1],[294,334,1],[341,341,3],[298,288,0],[291,433,4],[371,42,2],[401,361,4],[121,120,1],[293,323,1],[319,340,3],[371,41,2],[283,328,0],[286,323,1],[389,41,1],[295,297,1],[338,13,1],[294,336,1],[390,41,2],[286,322,1],[390,42,2],[311,425,1],[284,414,1],[314,363,1],[326,292,0],[599,284,1],[377,42,2],[388,287,1],[14,297,1],[338,289,1],[343,288,1],[396,286,1],[282,416,0],[342,299,2],[347,296,0],[40,288,0],[318,290,0],[13,298,1],[285,298,2],[293,322,1],[289,337,1],[115,308,0],[321,295,1],[250,520,1],[294,338,1],[340,340,3],[349,289,2],[371,248,2],[112,113,1],[293,300,1],[311,295,1],[352,352,3],[347,295,0],[308,292,1],[364,248,0],[14,284,0],[312,296,1],[395,286,1],[421,182,4],[303,327,1],[282,407,0],[408,41,2],[413,287,1],[333,13,1],[115,429,1],[310,295,1],[315,307,1],[353,556,2],[288,332,1],[405,302,4],[67,67,2],[311,299,1],[285,394,2],[286,325,1],[314,292,1],[320,342,1],[286,305,1],[303,324,1],[401,301,4],[310,286,1],[365,529,4],[312,323,1],[284,185,1],[360,14,1],[359,359,3],[363,13,1],[286,306,1],[115,306,0],[305,284,1],[370,42,3],[187,187,1],[184,454,1],[43,289,0],[374,375,1],[296,318,1],[298,300,0],[457,288,3],[321,314,1],[297,290,0],[284,423,1],[349,290,2],[333,14,1],[306,284,1],[118,305,0],[287,323,1],[387,294,1],[293,362,1],[351,13,2],[370,41,3],[427,12,5],[286,330,1],[282,377,0],[295,319,1],[296,303,1],[308,284,1],[413,294,1],[324,288,2],[349,13,2],[408,42,2],[321,344,1],[358,14,2],[399,42,1],[289,332,1],[313,342,1],[287,334,1],[388,294,1],[287,327,1],[247,523,1],[325,296,0],[317,14,2],[292,322,1],[301,330,0],[354,559,2],[464,289,3],[293,386,1],[347,286,0],[293,307,1],[324,289,2],[677,246,1],[287,326,1],[295,303,1],[343,14,1],[329,299,1],[71,379,0],[292,323,1],[690,113,2],[796,186,2],[311,322,1],[308,318,1],[376,376,3],[298,340,1],[373,372,1],[368,14,2],[296,319,1],[340,298,3],[425,425,1],[374,309,1],[72,356,2],[285,387,2],[285,388,2],[299,326,0],[339,288,2],[371,249,2],[283,317,0],[290,347,1],[371,13,2],[349,288,2],[287,336,1],[118,314,0],[178,178,1],[290,335,1],[287,369,1],[378,293,1],[290,319,1],[393,248,0],[302,336,0],[295,181,1],[390,248,2],[380,42,2],[312,305,1],[346,289,1],[360,13,1],[287,321,1],[287,328,1],[390,249,2],[282,382,0],[290,419,1],[296,181,1],[411,71,1],[286,329,1],[315,344,1],[339,289,2],[374,300,1],[284,504,1],[285,418,2],[310,322,1],[383,14,2],[301,334,0],[286,320,1],[294,347,1],[399,41,1],[501,309,1],[296,306,1],[381,41,2],[283,349,0],[363,14,1],[283,377,0],[287,322,1],[401,401,4],[295,305,1],[413,290,1],[282,419,0],[282,385,0],[438,249,2],[292,250,1],[326,290,0],[283,351,0],[294,362,1],[293,389,1],[364,249,0],[296,332,1],[286,321,1],[304,304,2],[441,42,1],[346,14,1],[307,352,3],[503,310,1],[372,288,1],[287,355,1],[341,288,0],[454,186,2],[520,251,2],[292,358,1],[309,323,1],[486,249,1],[384,14,2],[431,286,1],[301,321,0],[383,41,2],[282,293,0],[300,325,0],[287,320,1],[303,291,1],[383,42,2],[287,370,1],[290,338,1],[294,319,1],[405,405,4],[313,409,1],[436,42,1],[284,429,1],[390,14,2],[375,289,1],[373,311,1],[315,304,1],[392,248,2],[285,415,2],[292,333,1],[491,248,1],[295,184,1],[292,247,1],[283,339,0],[309,71,1],[366,552,4],[285,427,2],[384,42,2],[295,318,1],[384,249,2],[308,348,1],[334,289,1],[423,120,2],[302,320,0],[314,284,1],[351,289,2],[12,695,2],[312,287,1],[354,246,2],[317,296,2],[294,357,1],[293,325,1],[346,184,1],[305,323,1],[13,284,0],[373,310,1],[313,304,1],[391,249,0],[315,412,1],[631,353,4],[384,41,2],[303,181,1],[327,295,2],[309,296,1],[515,41,4],[285,417,2],[309,286,1],[325,290,0],[310,71,1],[43,713,2],[285,300,2],[294,361,1],[307,184,1],[402,13,3],[301,331,0],[303,328,1],[288,115,2],[318,341,3],[311,306,1],[303,339,1],[283,385,0],[302,329,0],[17,17,2],[292,343,1],[314,319,1],[307,328,1],[367,249,0],[384,248,2],[318,341,1],[286,328,1],[361,342,0],[314,296,1],[308,295,1],[118,330,0],[118,334,0],[324,295,2],[367,248,0],[374,312,1],[296,305,1],[490,248,1],[311,287,1],[283,382,0],[312,335,1],[332,295,0],[404,288,1],[343,184,1],[290,299,1],[318,286,0],[286,327,1],[442,41,1],[469,342,1],[185,532,1],[319,340,1],[438,248,2],[287,363,1],[285,413,2],[351,290,2],[284,15,1],[361,288,0],[287,360,1],[317,288,2],[350,350,3],[437,41,1],[333,288,1],[511,312,1],[348,329,0],[16,500,2],[40,40,1],[352,547,4],[362,344,0],[291,446,4],[526,42,4],[43,43,3],[287,283,1],[294,325,1],[495,290,2],[325,292,0],[296,327,1],[285,368,2],[71,314,0],[355,286,0],[421,117,4],[296,342,1],[311,338,1],[441,441,1],[284,331,1],[298,299,0],[336,42,1],[383,295,2],[398,289,1],[285,396,2],[284,12,1],[251,556,1],[362,289,0],[306,297,1],[285,378,2],[302,331,0],[348,310,0],[339,295,2],[514,311,1],[287,344,1],[392,249,2],[355,292,0],[287,349,1],[284,335,1],[494,326,4],[317,289,2],[285,395,2],[459,295,1],[294,341,1],[330,300,1],[322,372,0],[14,293,0],[296,308,1],[323,43,3],[333,289,1],[416,116,4],[317,295,2],[282,409,0],[14,313,0],[286,360,1],[296,307,1],[370,303,3],[297,299,0],[406,248,0],[115,329,0],[288,303,1],[285,431,2],[296,315,1],[348,308,0],[294,304,1],[343,289,1],[290,377,1],[286,363,1],[421,183,4],[292,346,1],[322,336,0],[392,41,2],[181,398,0],[637,354,4],[330,289,1],[290,504,1],[333,630,1],[472,344,1],[300,118,0],[296,324,1],[306,313,1],[314,293,1],[348,306,0],[513,250,3],[340,289,0],[340,298,1],[13,313,0],[296,328,1],[420,42,3],[285,299,2],[292,397,1],[389,289,1],[290,349,1],[284,293,1],[40,40,3],[292,361,1],[294,299,1],[421,116,4],[309,319,1],[286,342,1],[287,351,1],[304,313,2],[332,532,2],[392,286,2],[287,342,1],[304,315,2],[13,315,0],[284,308,1],[294,368,1],[322,40,3],[44,45,2],[286,344,1],[337,456,2],[499,356,1],[369,288,0],[416,117,4],[305,350,1],[309,314,1],[365,365,1],[292,310,1],[307,355,4],[305,315,1],[282,430,0],[312,350,1],[282,412,0],[323,290,0],[295,306,1],[516,249,1],[297,282,0],[684,116,0],[14,315,0],[283,402,0],[420,41,3],[282,452,0],[293,326,1],[295,299,1],[329,42,1],[292,341,1],[293,663,1],[406,249,0],[475,116,4],[295,328,1],[283,370,0],[359,297,4],[386,288,1],[284,338,1],[292,378,1],[317,317,2],[295,344,1],[287,285,1],[330,41,1],[296,372,1],[313,306,1],[290,362,1],[68,181,0],[303,347,4],[330,323,1],[300,287,0],[392,42,2],[115,114,1],[684,117,0],[334,41,1],[335,181,1],[288,382,1],[355,13,6],[284,180,1],[41,461,0],[329,288,1],[42,470,0],[301,333,0],[322,373,0],[366,366,1],[12,11,2],[310,308,1],[309,501,1],[311,318,1],[438,42,2],[296,344,1],[314,350,1],[290,327,1],[306,318,1],[409,313,3],[296,320,1],[475,117,4],[247,372,0],[307,324,1],[297,286,0],[311,514,1],[295,323,1],[584,71,4],[290,331,1],[285,331,2],[336,288,1],[402,41,3],[295,313,1],[302,333,0],[346,288,1],[453,296,1],[449,283,0],[41,364,0],[460,248,0],[292,309,1],[296,322,1],[289,385,1],[347,14,6],[118,119,1],[308,319,1],[43,43,1],[246,960,1],[290,328,1],[282,432,0],[357,304,2],[402,286,3],[290,541,1],[290,302,1],[307,298,4],[300,312,0],[181,404,0],[310,503,1],[379,13,1],[290,361,1],[290,383,1],[412,315,3],[42,364,0],[359,579,4],[184,386,0],[283,282,7],[308,293,1],[292,362,1],[418,297,4],[295,324,1],[357,13,2],[334,350,1],[185,796,1],[307,339,1],[402,42,3],[295,375,1],[253,253,1],[283,407,0],[293,411,1],[458,42,1],[286,499,1],[293,358,1],[397,41,2],[669,454,2],[306,68,3],[284,314,1],[369,289,0],[341,289,0],[290,351,1],[293,317,1],[319,298,5],[405,250,4],[249,316,0],[355,12,2],[40,737,2],[115,282,0],[338,181,1],[451,116,4],[307,327,1],[303,297,4],[312,511,1],[184,389,0],[329,322,1],[295,327,1],[307,304,1],[409,14,3],[286,326,1],[286,349,1],[296,339,1],[292,326,1],[295,321,1],[315,305,1],[303,385,1],[335,294,1],[382,13,2],[374,403,1],[311,348,1],[314,318,1],[299,373,0],[300,284,0],[547,11,4],[115,336,0],[319,287,0],[300,296,0],[420,290,3],[583,284,1],[287,291,1],[379,14,1],[290,180,1],[303,382,1],[303,370,1],[408,293,2],[686,686,2],[13,352,2],[286,350,1],[39,38,2],[419,304,3],[295,307,1],[451,117,4],[286,617,1],[292,301,1],[493,325,4],[510,247,3],[323,375,0],[15,15,3],[463,42,1],[847,284,1],[16,615,2],[362,353,3],[387,14,1],[400,288,1],[348,342,0],[312,318,1],[309,350,1],[286,621,1],[319,295,0],[347,294,0],[438,294,2],[313,285,1],[438,41,2],[357,294,2],[397,42,2],[322,290,0],[286,411,1],[392,13,2],[584,72,4],[181,425,0],[480,480,1],[529,44,4],[669,185,2],[373,299,1],[295,342,1],[335,290,1],[427,298,4],[290,301,1],[341,297,1],[323,334,0],[436,436,1],[388,14,1],[502,12,4],[296,360,1],[294,340,1],[310,319,1],[287,348,1],[305,68,3],[315,285,1],[286,351,1],[307,291,1],[287,350,1],[301,342,0],[961,252,2],[834,284,1],[290,291,1],[289,303,1],[397,13,2],[341,297,3],[437,42,1],[381,14,2],[292,337,1],[466,41,1],[283,409,0],[330,350,1],[379,293,1],[395,293,1],[244,244,1],[289,307,1],[527,42,2],[380,380,2],[333,284,1],[289,118,2],[334,295,1],[318,296,0],[385,13,2],[287,625,1],[294,283,1],[248,316,0],[300,290,0],[287,308,1],[435,184,0],[327,42,2],[283,412,0],[404,289,1],[246,559,1],[292,302,1],[343,293,1],[307,293,1],[340,288,0],[396,293,1],[250,375,0],[361,354,3],[372,14,1],[398,288,1],[401,247,4],[358,358,2],[353,251,2],[287,314,1],[319,296,0],[339,317,2],[284,532,1],[315,288,1],[383,288,2],[353,520,2],[290,283,1],[71,333,0],[306,348,1],[336,299,1],[395,14,1],[290,384,1],[68,399,0],[285,301,2],[355,295,0],[442,442,1],[414,43,4],[305,297,1],[319,282,0],[287,638,1],[287,376,1],[430,41,3],[322,293,0],[324,296,2],[368,304,2],[389,288,1],[332,288,0],[396,14,1],[313,289,1],[291,294,4],[410,40,4],[518,284,1],[286,369,1],[521,41,2],[381,381,2],[303,349,1],[41,367,0],[42,367,0],[282,420,0],[303,351,1],[386,289,1],[318,295,0],[475,182,4],[375,13,1],[15,1312,2],[403,289,1],[303,184,1],[758,180,2],[315,349,1],[331,295,1],[332,308,0],[290,312,1],[283,451,0],[290,388,1],[525,284,1],[328,296,2],[380,14,2],[460,249,0],[290,387,1],[290,325,1],[292,325,1],[375,14,1],[416,287,4],[336,296,1],[332,314,0],[373,400,1],[286,335,1],[327,382,2],[363,305,1],[304,377,2],[286,348,1],[452,41,3],[306,322,1],[118,282,0],[295,314,1],[290,311,1],[337,295,0],[308,313,1],[328,41,2],[285,302,2],[289,540,1],[332,296,0],[287,422,1],[247,338,0],[339,296,2],[346,293,1],[70,533,0],[350,344,0],[283,420,0],[323,374,0],[554,288,1],[408,13,2],[415,14,1],[286,338,1],[355,293,0],[187,186,1],[185,411,0],[379,329,1],[285,371,2],[298,292,0],[297,296,0],[529,713,4],[320,295,1],[331,296,1],[352,695,4],[293,341,1],[378,292,1],[320,290,1],[516,248,1],[310,343,1],[305,318,1],[185,476,0],[319,309,0],[328,385,2],[326,429,2],[185,379,0],[335,390,1],[458,41,1],[247,386,0],[297,300,0],[372,13,1],[399,294,1],[13,393,0],[288,307,1],[321,296,1],[477,296,1],[282,462,0],[388,13,1],[383,296,2],[282,457,0],[402,339,3],[71,71,1],[432,42,3],[523,245,2],[250,335,0],[297,295,0],[315,324,1],[724,423,2],[290,340,1],[288,538,1],[43,43,4],[353,289,0],[313,324,1],[320,287,1],[290,369,1],[482,295,1],[343,371,1],[288,341,1],[292,407,1],[416,249,4],[377,304,2],[284,251,1],[283,419,0],[298,295,0],[311,294,1],[360,306,1],[284,556,1],[728,429,2],[323,293,0],[73,74,1],[308,329,1],[296,337,1],[315,184,1],[486,248,1],[387,13,1],[298,282,0],[321,365,3],[302,344,0],[331,284,1],[504,180,4],[287,375,1],[340,319,1],[417,14,1],[66,67,1],[327,303,2],[510,361,3],[14,391,0],[292,351,1],[547,695,4],[313,351,1],[307,285,1],[412,14,3],[418,15,5],[321,290,1],[181,441,0],[356,499,1],[424,14,1],[40,40,4],[286,379,1],[338,294,1],[513,362,3],[68,305,0],[514,336,1],[494,284,0],[320,366,3],[416,14,4],[299,292,0],[304,419,2],[311,372,1],[112,111,1],[313,184,1],[387,290,1],[383,289,2],[338,290,1],[428,14,1],[282,464,0],[288,347,1],[330,501,1],[42,448,0],[355,296,0],[283,464,0],[292,396,1],[121,655,1],[341,318,1],[342,42,2],[313,308,1],[292,328,1],[312,294,1],[404,14,1],[377,288,2],[416,248,4],[350,314,0],[354,247,3],[329,296,1],[330,293,1],[352,11,4],[475,183,4],[388,290,1],[295,339,1],[309,346,1],[332,289,0],[68,306,0],[327,290,2],[789,520,2],[319,12,3],[282,284,0],[68,334,0],[298,286,0],[283,430,0],[325,119,2],[330,295,1],[324,303,2],[415,13,1],[297,287,0],[12,1158,2],[326,114,2],[292,347,1],[480,480,3],[122,122,1],[417,13,1],[405,289,0],[465,295,1],[1119,45,2],[284,559,1],[292,408,1],[425,248,1],[490,249,1],[491,249,1],[307,382,1],[334,511,1],[350,305,0],[346,250,2],[375,300,1],[584,720,4],[488,283,0],[314,315,1],[295,340,1],[355,287,0],[283,457,0],[319,12,5],[323,323,1],[399,13,1],[294,369,1],[313,317,1],[563,41,2],[463,41,1],[394,289,0],[493,444,4],[321,287,1],[582,376,1],[293,348,1],[303,317,1],[247,343,0],[292,462,1],[398,14,1],[368,13,2],[310,348,1],[401,288,0],[342,342,2],[307,385,1],[473,288,1],[283,416,0],[292,327,1],[318,282,0],[452,42,3],[299,115,0],[320,284,1],[329,503,1],[333,357,1],[1235,183,0],[322,322,1],[449,41,1],[379,330,1],[288,373,1],[328,290,2],[344,41,2],[291,392,4],[292,395,1],[294,422,1],[579,359,4],[412,13,3],[467,287,1],[297,284,0],[312,375,1],[904,113,3],[292,348,1],[361,358,0],[298,284,0],[552,39,4],[289,340,1],[299,327,0],[410,14,1],[292,349,1],[283,432,0],[294,697,1],[389,14,1],[468,296,1],[504,337,4],[414,13,1],[591,310,1],[363,300,1],[360,301,0],[297,318,1],[304,307,2],[287,372,1],[386,14,1],[13,391,0],[304,285,2],[289,347,1],[15,806,2],[403,14,1],[13,364,0],[246,637,1],[318,15,3],[354,510,2],[283,306,0],[290,326,1],[470,249,0],[286,372,1],[346,284,1],[71,329,0],[385,290,2],[298,296,0],[376,67,1],[300,393,0],[305,286,1],[342,303,2],[461,248,0],[294,321,1],[307,181,1],[294,315,1],[308,115,2],[353,513,2],[321,286,1],[292,394,1],[335,284,1],[14,448,0],[344,344,2],[476,284,1],[1173,38,2],[247,404,0],[671,290,1],[336,348,1],[354,523,2],[499,499,1],[315,314,1],[252,520,1],[466,42,1],[596,309,1],[250,398,0],[295,363,1],[312,284,1],[342,382,2],[298,287,0],[457,327,3],[400,14,1],[575,42,2],[293,431,1],[357,357,2],[307,349,1],[360,296,1],[473,361,4],[380,13,2],[297,292,0],[319,310,0],[12,1070,2],[66,686,1],[305,334,1],[365,44,4],[250,733,1],[315,317,1],[324,383,2],[290,413,1],[291,449,4],[343,284,1],[336,514,1],[41,435,0],[565,289,1],[444,423,3],[10,11,2],[315,294,1],[41,448,0],[381,13,2],[338,284,1],[309,375,1],[421,317,4],[293,350,1],[383,181,2],[296,348,1],[908,43,6],[283,452,0],[319,290,0],[293,699,1],[296,314,1],[310,372,1],[494,447,4],[118,321,0],[303,300,1],[313,291,1],[68,336,0],[318,311,0],[388,305,1],[464,328,3],[501,330,1],[304,449,2],[321,284,1],[69,316,0],[297,285,0],[329,348,1],[346,371,1],[351,287,2],[1224,183,0],[299,372,0],[988,186,3],[528,289,0],[552,737,4],[387,306,1],[294,355,1],[327,287,2],[338,390,1],[535,288,0],[313,366,3],[302,353,2],[290,398,1],[403,13,1],[290,497,1],[323,393,0],[286,375,1],[293,394,1],[360,308,1],[344,385,2],[414,305,1],[294,326,1],[303,306,1],[300,288,0],[185,666,1],[289,362,1],[296,323,1],[758,758,2],[324,370,2],[328,287,2],[314,330,1],[479,342,1],[73,72,2],[487,289,1],[250,389,0],[295,308,1],[942,40,6],[282,433,0],[304,349,2],[582,68,1],[251,631,1],[310,115,2],[315,291,1],[293,320,1],[313,181,1],[361,289,0],[339,303,2],[293,347,1],[442,248,1],[493,284,0],[286,402,1],[506,249,0],[292,386,1],[307,402,1],[318,308,0],[318,333,0],[14,367,0],[337,306,0],[356,72,4],[334,290,1],[436,248,1],[296,347,1],[303,359,3],[313,294,1],[382,290,2],[285,390,2],[623,311,1],[288,71,1],[296,404,1],[294,320,1],[295,322,1],[296,386,1],[314,298,1],[447,429,3],[531,292,2],[179,826,1],[503,329,1],[658,248,0],[310,284,1],[331,594,1],[445,13,1],[284,546,1],[374,305,1],[396,308,1],[611,312,1],[42,435,0],[296,340,1],[307,351,1],[354,288,0],[500,500,3],[309,298,1],[400,13,1],[473,286,1],[363,314,1],[373,429,2],[481,287,1],[294,350,1],[313,339,1],[293,617,1],[66,65,1],[285,341,2],[489,287,1],[451,248,4],[312,118,2],[508,295,1],[591,329,1],[112,690,1],[115,320,0],[393,289,0],[506,248,0],[394,288,0],[295,347,1],[529,365,4],[286,247,1],[289,374,1],[283,305,0],[380,288,2],[416,324,4],[511,334,1],[296,403,1],[298,319,1],[337,288,0],[287,247,1],[309,284,1],[283,284,0],[300,292,0],[303,335,1],[296,321,1],[410,306,1],[345,433,6],[46,46,1],[355,290,0],[363,295,1],[349,287,2],[444,119,3],[325,293,0],[362,358,0],[500,500,1],[320,286,1],[361,357,0],[410,13,1],[14,393,0],[362,288,0],[395,314,1],[311,297,1],[315,339,1],[409,13,3],[308,298,1],[311,335,1],[400,42,1],[404,306,1],[296,341,1],[362,357,0],[308,297,1],[310,318,1],[384,383,2],[301,354,2],[298,290,0],[398,13,1],[291,488,4],[596,330,1],[42,328,0],[292,550,1],[294,625,1],[303,338,1],[299,289,0],[315,365,3],[309,290,1],[120,423,1],[41,327,0],[317,313,2],[358,331,2],[282,335,0],[284,706,1],[399,336,1],[300,334,0],[380,290,2],[322,400,0],[250,346,0],[319,314,0],[377,289,2],[421,290,4],[317,371,2],[337,305,0],[390,304,2],[299,293,0],[309,118,2],[960,245,2],[302,383,0],[296,401,2],[291,360,4],[376,582,1],[422,456,2],[292,389,1],[315,181,1],[282,338,0],[341,290,0],[483,344,1],[381,290,2],[883,423,2],[283,335,0],[291,293,4],[407,289,2],[441,248,1],[300,374,0],[373,114,2],[295,353,2],[307,294,1],[342,290,2],[14,364,0],[295,405,2],[318,369,3],[419,13,3],[363,302,0],[292,350,1],[306,286,1],[414,14,1],[421,248,4],[373,306,1],[71,330,0],[337,289,0],[430,14,3],[467,294,1],[70,183,0],[421,249,4],[319,323,0],[288,324,1],[295,400,1],[381,289,2],[45,44,2],[13,309,0],[333,297,1],[447,114,3],[305,540,1],[343,292,1],[288,340,1],[71,720,2],[499,356,3],[304,291,2],[285,471,2],[305,388,1],[308,287,1],[404,13,1],[295,320,1],[497,290,4],[375,41,1],[541,284,2],[293,321,1],[293,621,1],[294,348,1],[374,119,2],[399,334,1],[366,39,4],[311,115,2],[304,357,2],[295,389,1],[310,290,1],[360,391,0],[331,305,1],[293,282,1],[304,488,2],[289,341,1],[411,286,1],[527,249,2],[374,423,2],[247,403,0],[310,297,1],[317,315,2],[284,709,1],[436,249,1],[288,361,1],[317,392,2],[370,295,3],[312,338,1],[332,454,2],[371,286,2],[504,504,4],[340,340,1],[455,13,1],[295,350,1],[289,355,1],[295,398,1],[312,297,1],[356,292,0],[322,391,0],[284,352,1],[286,380,1],[658,249,0],[288,331,1],[299,391,0],[10,12,2],[319,12,1],[306,336,1],[351,327,2],[372,287,1],[453,14,1],[292,320,1],[385,295,2],[305,362,1],[509,296,1],[300,328,0],[314,118,2],[391,288,0],[15,15,1],[284,525,1],[294,313,1],[443,287,1],[424,287,1],[404,290,1],[366,299,4],[372,42,1],[282,306,0],[422,287,1],[288,338,1],[325,294,0],[344,290,2],[379,309,1],[428,287,1],[410,301,0],[304,327,2],[341,287,0],[306,115,2],[346,292,1],[285,340,2],[303,305,1],[471,71,2],[286,381,1],[360,282,0],[370,377,3],[579,806,4],[284,518,1],[328,303,2],[399,456,2],[68,686,1],[13,367,0],[317,303,2],[284,246,1],[296,354,2],[323,403,0],[37,37,1],[582,67,1],[282,320,0],[291,320,4],[309,318,1],[434,13,2],[284,333,1],[312,611,1],[315,377,1],[284,631,1],[293,313,1],[342,306,2],[370,13,3],[285,537,2],[283,462,0],[390,13,2],[13,310,0],[294,754,1],[309,403,1],[344,305,2],[451,249,4],[289,335,1],[309,297,1],[424,13,1],[296,468,1],[448,316,0],[308,361,1],[432,14,3],[473,287,1],[623,336,1],[328,349,2],[282,305,0],[313,377,1],[379,310,1],[296,358,1],[398,305,1],[338,324,1],[356,71,3],[374,321,1],[294,360,1],[385,303,2],[469,40,5],[534,287,1],[315,325,1],[533,248,0],[13,435,0],[347,306,0],[399,287,1],[373,320,1],[333,308,1],[410,308,1],[292,382,1],[313,349,1],[284,343,1],[182,316,0],[291,363,4],[301,282,0],[331,297,1],[315,351,1],[312,298,1],[398,290,1],[547,352,4],[375,287,1],[341,348,0],[284,342,1],[331,746,1],[335,324,1],[289,324,1],[294,363,1],[769,284,1],[428,13,1],[319,564,3],[422,311,1],[304,351,2],[369,290,0],[294,638,1],[330,286,1],[340,292,0],[533,249,0],[284,43,1],[293,363,1],[367,316,0],[371,14,2],[425,249,1],[312,403,1],[301,383,0],[379,454,2],[282,321,0],[528,528,3],[306,538,1],[361,344,0],[295,341,1],[310,298,1],[288,302,1],[322,326,0],[327,286,2],[287,403,1],[370,296,3],[318,312,0],[358,290,2],[400,287,1],[250,789,1],[392,397,2],[288,335,1],[287,380,1],[365,300,4],[286,403,1],[39,40,1],[382,303,2],[291,321,4],[283,338,0],[386,308,1],[384,295,2],[69,421,0],[334,323,1],[358,293,2],[441,249,1],[319,308,0],[68,67,1],[305,118,2],[370,288,3],[411,356,1],[336,287,1],[284,346,1],[284,418,1],[318,306,0],[372,299,1],[334,287,1],[379,286,1],[296,326,1],[446,290,1],[336,290,1],[340,286,0],[459,14,1],[69,820,0],[294,323,1],[337,335,0],[528,528,1],[412,321,3],[379,437,1],[327,324,2],[288,355,1],[302,282,0],[250,400,0],[362,342,0],[328,286,2],[292,291,1],[382,296,2],[438,14,2],[472,305,1],[41,460,0],[111,111,1],[284,344,1],[289,349,1],[311,623,1],[292,401,1],[292,360,1],[353,353,3],[399,14,1],[409,320,3],[995,38,4],[314,287,1],[290,350,1],[375,286,1],[329,286,1],[296,355,1],[306,387,1],[295,325,1],[336,295,1],[563,248,2],[332,346,0],[378,12,3],[184,442,0],[307,299,1],[328,324,2],[583,292,1],[1165,252,2],[291,434,4],[408,408,2],[319,322,0],[331,306,1],[291,384,4],[309,321,1],[315,335,1],[72,1176,1],[289,331,1],[292,545,1],[327,351,2],[313,407,1],[314,362,1],[333,295,1],[519,320,2],[309,293,1],[318,294,0],[339,307,2],[292,321,1],[308,538,1],[313,515,1],[293,360,1],[395,292,1],[493,493,4],[285,542,2],[521,248,2],[311,284,1],[487,286,1],[487,287,1],[295,304,1],[296,363,1],[306,341,1],[366,40,1],[287,381,1],[313,326,1],[294,307,1],[445,115,1],[309,343,1],[535,535,3],[296,331,1],[288,351,1],[282,383,0],[290,355,1],[333,341,1],[333,311,1],[292,405,1],[306,390,1],[453,13,1],[181,826,1],[298,293,0],[301,426,0],[344,307,2],[288,634,1],[305,298,1],[306,324,1],[308,372,1],[288,339,1],[295,360,1],[480,352,1],[478,286,1],[349,286,2],[282,346,0],[295,465,1],[314,371,1],[347,305,0],[396,292,1],[291,283,4],[296,304,1],[290,321,1],[359,806,4],[458,289,1],[437,288,1],[611,334,1],[655,655,2],[290,348,1],[908,44,6],[287,394,1],[402,14,3],[415,335,1],[311,298,1],[340,350,0],[312,398,1],[284,637,1],[285,333,2],[363,282,0],[295,355,1],[251,465,0],[324,307,2],[69,818,0],[360,115,0],[293,315,1],[308,342,1],[310,400,1],[314,297,1],[323,325,0],[289,339,1],[351,303,2],[414,302,0],[347,292,0],[513,287,0],[293,476,1],[341,286,0],[113,429,1],[289,338,1],[284,376,1],[300,282,0],[421,304,4],[314,344,1],[328,307,2],[42,460,0],[402,307,3],[306,361,1],[311,400,1],[322,320,0],[463,289,1],[310,320,1],[313,297,1],[305,375,1],[411,454,2],[308,410,1],[354,354,3],[546,456,3],[283,446,0],[292,551,1],[427,284,1],[285,479,2],[350,330,0],[309,374,1],[314,395,1],[363,393,0],[495,495,2],[438,290,2],[494,494,4],[292,363,1],[989,523,2],[292,385,1],[349,303,2],[535,535,1],[282,384,0],[287,416,1],[349,324,2],[351,286,2],[522,321,2],[339,397,2],[426,320,1],[115,372,0],[284,327,1],[351,324,2],[411,310,1],[778,248,1],[177,177,1],[378,289,1],[301,469,0],[305,319,1],[323,43,5],[293,401,1],[334,335,1],[328,300,2],[363,118,0],[557,309,2],[305,324,1],[295,358,1],[366,737,4],[418,284,1],[517,286,1],[74,74,1],[305,390,1],[412,385,3],[295,331,1],[311,347,1],[365,43,1],[466,288,1],[356,584,4],[289,71,1],[728,114,2],[302,472,0],[510,287,0],[556,520,3],[296,357,1],[329,308,1],[14,309,0],[558,310,2],[370,289,3],[459,13,1],[504,181,4],[566,312,2],[322,343,0],[470,248,0],[369,287,0],[329,591,1],[642,480,3],[286,400,1],[314,340,1],[413,288,1],[14,310,0],[253,252,1],[724,119,2],[290,323,1],[422,312,1],[528,365,1],[41,553,0],[309,596,1],[313,338,1],[431,293,1],[461,249,0],[568,311,2],[314,540,1],[299,294,0],[250,487,0],[292,447,1],[315,297,1],[318,293,0],[380,289,2],[382,409,2],[42,555,0],[118,375,0],[247,473,0],[306,303,1],[397,296,2],[583,332,3],[282,308,0],[384,13,2],[244,245,1],[319,394,3],[334,305,1],[296,311,1],[315,526,1],[282,443,0],[344,303,2],[475,249,4],[298,294,0],[442,249,1],[671,180,3],[285,483,2],[300,294,0],[484,286,1],[451,13,4],[440,321,1],[403,41,1],[300,375,0],[340,284,0],[70,894,0],[323,288,0],[304,328,2],[329,293,1],[437,13,1],[282,343,0],[305,335,1],[399,312,1],[578,42,2],[331,318,1],[530,248,0],[480,352,3],[290,320,1],[510,286,0],[389,286,1],[10,695,2],[39,39,1],[417,338,1],[430,13,3],[320,320,1],[1107,15,6],[291,282,4],[310,591,1],[314,414,1],[424,118,1],[312,321,1],[322,289,0],[349,328,2],[370,419,3],[411,309,1],[13,448,0],[481,13,1],[301,450,0],[317,285,2],[305,344,1],[329,343,1],[184,436,0],[298,285,0],[610,183,2],[383,303,2],[422,68,1],[552,366,4],[294,405,1],[324,327,2],[113,114,1],[340,287,0],[306,347,1],[295,357,1],[407,288,2],[302,439,0],[14,311,0],[9,9,1],[120,119,1],[284,427,1],[314,375,1],[478,13,1],[301,476,0],[399,311,1],[350,309,0],[73,720,2],[296,71,1],[320,426,1],[384,296,2],[314,333,1],[372,286,1],[294,349,1],[319,330,0],[318,322,0],[40,284,0],[290,385,1],[181,466,0],[297,294,0],[310,306,1],[340,290,0],[407,292,2],[550,288,0],[358,317,2],[500,359,5],[582,582,1],[65,65,1],[307,300,1],[348,336,0],[308,371,1],[555,316,0],[642,480,1],[295,71,1],[545,312,0],[121,122,1],[308,341,1],[327,339,2],[397,289,2],[306,298,1],[351,313,2],[358,303,2],[350,43,3],[426,42,1],[288,362,1],[513,353,3],[286,304,1],[299,282,0],[322,294,0],[349,315,2],[310,346,1],[496,321,2],[42,506,0],[365,713,4],[181,463,0],[302,440,0],[379,458,1],[455,14,1],[532,454,3],[348,311,0],[397,288,2],[310,373,1],[781,248,1],[313,298,1],[306,342,1],[285,475,2],[334,296,1],[521,249,2],[329,318,1],[330,596,1],[293,585,1],[348,286,0],[507,321,2],[980,45,4],[184,437,0],[284,321,1],[290,382,1],[328,339,2],[473,289,1],[327,299,2],[421,324,4],[445,14,1],[283,320,0],[293,405,1],[301,379,0],[371,317,2],[305,341,1],[284,499,1],[335,250,2],[432,13,3],[41,303,0],[349,339,2],[409,382,3],[385,412,2],[403,286,1],[961,520,2],[337,292,0],[301,344,0],[315,407,1],[334,294,1],[308,333,1],[296,369,1],[424,290,1],[428,115,1],[15,16,2],[360,40,2],[524,284,1],[349,327,2],[503,248,1],[291,383,4],[302,395,0],[14,304,0],[308,396,1],[462,317,3],[312,319,1],[444,287,0],[545,289,0],[300,293,0],[303,434,1],[484,13,1],[322,327,0],[352,352,1],[347,284,0],[421,13,4],[294,351,1],[505,320,2],[289,646,1],[290,404,1],[303,299,1],[311,320,1],[292,431,1],[355,298,4],[384,288,2],[510,288,0],[527,248,2],[180,689,1],[293,372,1],[487,288,1],[184,669,1],[350,43,1],[995,366,4],[17,806,2],[290,363,1],[356,308,0],[318,305,0],[324,328,2],[337,296,0],[293,303,1],[297,283,0],[312,374,1],[360,287,1],[397,295,2],[309,305,1],[530,249,0],[545,309,0],[282,314,0],[378,288,1],[980,365,4],[42,533,0],[334,611,1],[68,338,0],[186,454,1],[368,335,2],[331,319,1],[411,386,1],[421,292,4],[481,294,1],[304,370,2],[413,289,1],[492,320,2],[333,296,1],[414,314,1],[481,14,1],[11,659,2],[290,376,3],[332,185,2],[282,434,0],[44,43,1],[325,315,0],[307,343,1],[311,373,1],[486,13,1],[300,300,5],[313,247,1],[357,303,2],[330,314,1],[529,529,4],[318,314,0],[389,314,1],[312,341,1],[398,250,2],[421,287,4],[458,13,1],[690,690,2],[282,392,0],[285,534,2],[290,428,1],[342,307,2],[288,336,1],[283,321,0],[309,340,1],[329,319,1],[863,579,4],[312,347,1],[285,372,2],[301,396,0],[475,248,4],[574,287,1],[354,361,2],[575,249,2],[70,879,0],[306,372,1],[360,283,0],[521,288,2],[671,284,1],[348,287,0],[323,294,0],[345,446,6],[17,16,2],[329,295,1],[400,286,1],[310,386,1],[311,341,1],[363,287,1],[487,362,4],[41,533,0],[331,358,1],[12,12,1],[284,304,1],[318,323,0],[479,40,5],[70,316,0],[321,592,1],[379,386,1],[290,322,1],[305,414,1],[330,292,1],[329,292,1],[351,339,2],[285,375,2],[302,476,0],[450,320,1],[519,296,2],[284,328,1],[286,405,1],[290,360,1],[295,369,1],[787,249,1],[297,293,0],[553,316,0],[14,324,0],[284,320,1],[301,397,0],[377,313,2],[302,387,0],[564,480,3],[367,287,0],[382,307,2],[483,284,1],[478,293,1],[309,355,1],[439,41,1]]} diff --git a/variants/sparse-high-dynamic-2bin/profiles/joint/config.json b/variants/sparse-high-dynamic-2bin/profiles/joint/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/joint/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-high-dynamic-2bin/profiles/joint/config.yaml b/variants/sparse-high-dynamic-2bin/profiles/joint/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8f164984083da3db35f43e813b6e42f97b7ddd8f --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/joint/config.yaml @@ -0,0 +1,63 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 8 + components: + generalized_joint_position: + dims: + start: 0 + stop: 7 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -6.283185307179586 + max: 6.283185307179586 + order_1: + min: -0.525 + max: 0.525 + distortion_limit: + - 0.004 + - 0.004 + - 0.006 + - 0.0075 + - 0.015 + - 0.02 + - 0.02 + primitive_selection: smooth + gripper_open_command: + dims: + - 7 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - generalized_joint_position + bpe: + spatial_vocab_size: 517 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 2.0 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-high-dynamic-2bin/profiles/joint/primitives.npz b/variants/sparse-high-dynamic-2bin/profiles/joint/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..2ca6f1c3712ebad4bccd2448eecdc5b1eb3e6a04 --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/joint/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c23ddcbe09fbe08c0cf46defd81af6b22f9891ec174cb486284dc59c202f689d +size 4194 diff --git a/variants/sparse-high-dynamic-2bin/profiles/joint/processor_config.json b/variants/sparse-high-dynamic-2bin/profiles/joint/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/joint/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-high-dynamic-2bin/profiles/joint/sparse_bpe.json b/variants/sparse-high-dynamic-2bin/profiles/joint/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..f250b9f7d4f47bf7e940d60baa95a587607d262f --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/profiles/joint/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[133,133,89,71,37,29,29,2],"zero":[66,66,44,35,18,14,14,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[516,198,1],[516,516,1],[516,197,1],[516,387,1],[516,386,1],[516,65,1],[516,66,1],[516,308,1],[516,307,1],[518,518,2],[517,307,1],[517,308,1],[516,440,1],[516,439,1],[519,307,1],[519,308,1],[472,472,2],[471,471,2],[65,65,2],[199,199,2],[66,66,2],[517,387,1],[196,196,1],[517,386,1],[439,439,2],[440,440,2],[520,307,1],[64,64,1],[521,308,1],[516,306,1],[520,308,1],[519,386,1],[516,309,1],[67,67,1],[521,307,1],[519,387,1],[518,197,2],[385,385,1],[516,517,1],[388,388,1],[522,307,1],[522,308,1],[195,195,1],[200,200,1],[523,307,1],[523,308,1],[526,526,4],[500,500,3],[499,499,3],[516,471,1],[516,472,1],[306,306,2],[520,65,1],[309,309,1],[516,305,1],[63,63,1],[516,310,1],[68,68,1],[518,387,2],[196,519,0],[521,66,1],[518,386,2],[194,194,1],[388,520,0],[517,65,1],[385,521,0],[201,201,1],[517,66,1],[518,308,2],[196,195,1],[528,386,1],[531,387,1],[384,384,1],[528,387,1],[534,471,4],[533,472,4],[518,307,2],[517,517,1],[440,440,3],[536,199,4],[527,387,1],[439,439,3],[389,389,1],[526,518,4],[519,66,1],[64,522,0],[519,65,1],[531,386,1],[67,523,0],[520,66,1],[521,65,1],[64,63,1],[516,311,1],[516,304,1],[193,193,1],[198,514,0],[518,66,2],[518,65,2],[67,68,1],[532,386,1],[305,305,1],[199,199,1],[69,69,1],[533,533,4],[534,534,4],[202,202,1],[62,62,1],[197,514,0],[309,524,0],[472,472,3],[310,310,1],[194,195,1],[471,471,3],[520,535,1],[539,539,2],[200,201,1],[527,386,1],[385,384,1],[519,519,1],[438,438,2],[441,441,2],[541,439,4],[542,440,4],[544,544,2],[388,389,1],[306,306,1],[530,439,3],[518,517,2],[529,440,3],[196,559,1],[309,549,0],[196,532,0],[500,500,4],[516,199,1],[499,499,4],[536,536,4],[550,550,2],[535,64,1],[192,192,1],[387,514,0],[537,67,1],[518,519,2],[516,312,1],[516,303,1],[386,514,0],[65,522,0],[532,387,1],[556,556,2],[518,523,2],[554,554,2],[472,472,4],[198,515,0],[471,471,4],[203,203,1],[306,525,0],[518,522,2],[309,310,1],[194,193,1],[520,440,1],[66,523,0],[521,537,1],[516,499,1],[517,440,1],[516,500,1],[383,383,1],[520,439,1],[525,439,1],[517,199,2],[524,440,1],[69,68,1],[70,70,1],[64,572,1],[521,439,1],[62,63,1],[390,390,1],[194,559,1],[67,574,1],[560,200,2],[541,541,4],[542,542,4],[535,65,4],[521,440,1],[202,201,1],[61,61,1],[517,527,1],[304,304,1],[308,514,0],[197,515,0],[526,197,4],[307,514,0],[470,470,2],[473,473,2],[520,520,1],[516,527,1],[537,66,4],[519,439,1],[311,311,1],[539,195,2],[517,439,1],[191,191,1],[521,521,1],[536,200,1],[306,546,0],[196,531,0],[535,522,0],[518,524,2],[516,313,1],[517,555,1],[388,543,0],[196,548,0],[385,545,0],[385,589,1],[518,555,2],[544,64,2],[538,65,1],[525,199,1],[520,471,1],[553,308,2],[518,520,2],[516,302,1],[530,541,3],[192,193,1],[529,542,3],[522,522,1],[196,552,0],[537,523,0],[204,204,1],[518,521,2],[523,523,1],[517,535,1],[388,599,1],[525,440,1],[560,560,2],[67,66,1],[564,564,2],[524,524,1],[519,440,1],[522,440,1],[547,65,1],[388,538,0],[385,551,0],[518,525,2],[305,571,0],[516,528,1],[565,565,2],[568,306,1],[522,439,1],[516,540,1],[387,515,0],[583,201,2],[527,65,1],[543,65,1],[553,307,2],[524,439,1],[544,63,2],[520,472,1],[517,471,1],[385,540,0],[383,384,1],[305,546,0],[523,439,1],[523,440,1],[525,525,1],[62,572,1],[521,472,1],[517,472,1],[69,574,1],[526,66,4],[550,68,2],[559,195,2],[202,203,1],[539,516,0],[388,547,0],[526,65,4],[528,65,1],[527,527,1],[517,537,1],[517,525,1],[390,389,1],[516,538,1],[521,471,1],[536,199,1],[519,532,1],[309,545,0],[518,440,2],[305,304,1],[69,70,1],[573,310,2],[200,199,1],[386,515,0],[71,71,1],[550,67,2],[519,472,1],[520,522,1],[517,540,1],[194,611,1],[518,439,2],[62,61,1],[311,310,1],[524,471,1],[190,190,1],[519,471,1],[524,472,1],[385,548,0],[525,306,2],[554,384,2],[523,66,3],[516,515,1],[522,64,2],[499,499,2],[305,306,1],[500,500,2],[519,553,1],[517,522,1],[60,60,1],[579,195,2],[525,472,1],[519,524,1],[514,526,0],[556,389,2],[525,471,1],[303,303,1],[568,305,1],[309,532,0],[535,535,4],[516,314,1],[552,65,1],[534,534,3],[533,533,3],[517,523,1],[527,66,1],[551,66,1],[516,514,1],[309,528,0],[67,561,0],[205,205,1],[570,570,2],[517,520,1],[519,537,1],[200,583,1],[517,521,1],[312,312,1],[192,191,1],[202,583,1],[382,382,1],[596,200,1],[568,546,0],[471,520,0],[568,568,1],[65,514,0],[531,65,1],[388,552,0],[309,547,0],[517,528,1],[391,391,1],[532,65,1],[517,538,1],[516,301,1],[545,66,1],[522,472,1],[553,386,2],[66,514,0],[520,199,1],[67,562,0],[549,310,2],[519,516,1],[516,536,1],[64,558,0],[309,573,0],[517,524,1],[64,557,0],[560,201,2],[572,63,2],[526,308,4],[574,68,2],[540,66,1],[548,66,1],[521,523,1],[579,579,2],[204,203,1],[518,472,2],[530,438,3],[529,441,3],[307,515,0],[383,589,1],[523,472,1],[521,199,1],[523,471,1],[531,66,1],[518,471,2],[522,471,1],[546,306,2],[556,516,0],[528,66,1],[539,524,0],[519,521,1],[519,535,1],[519,522,1],[551,65,1],[519,523,1],[526,387,4],[390,599,1],[440,524,0],[521,554,2],[308,515,0],[532,66,1],[439,525,0],[537,537,4],[519,525,1],[440,520,0],[524,516,1],[526,386,4],[189,189,1],[636,438,4],[71,70,1],[637,441,4],[553,387,2],[309,627,1],[519,520,1],[545,65,1],[578,308,2],[311,609,0],[516,534,1],[575,307,2],[516,533,1],[568,525,0],[564,500,6],[530,472,1],[192,611,1],[543,66,1],[309,558,0],[565,499,6],[439,520,0],[532,532,1],[559,559,2],[439,521,0],[560,199,2],[529,471,1],[72,72,1],[522,520,1],[60,61,1],[303,304,1],[526,307,4],[388,569,0],[520,516,1],[646,195,3],[309,562,0],[437,438,2],[440,471,0],[540,540,1],[610,304,2],[206,206,1],[538,538,1],[190,191,1],[311,312,1],[519,531,1],[523,67,2],[472,521,0],[442,441,2],[516,576,1],[612,307,0],[622,201,2],[579,193,2],[520,306,1],[525,516,1],[536,517,0],[554,516,0],[589,384,2],[586,539,2],[59,59,1],[540,65,1],[439,472,0],[619,68,2],[529,472,1],[525,527,1],[525,517,1],[530,471,1],[519,548,1],[623,63,2],[544,608,2],[383,382,1],[440,517,0],[65,515,0],[524,522,1],[520,556,2],[524,199,1],[526,523,4],[440,521,0],[516,64,1],[570,310,2],[550,516,0],[66,515,0],[536,536,1],[524,523,1],[524,521,1],[624,308,0],[612,308,0],[499,499,5],[525,520,1],[302,302,1],[500,500,5],[518,529,2],[599,389,2],[516,315,1],[549,524,1],[439,519,0],[313,313,1],[516,524,1],[472,520,0],[390,391,1],[385,577,0],[69,687,1],[547,66,1],[634,554,2],[519,552,1],[526,522,4],[524,517,1],[516,196,1],[518,530,2],[541,541,3],[516,525,1],[204,205,1],[525,522,1],[527,517,1],[542,542,3],[202,670,1],[439,471,0],[652,200,1],[538,535,1],[526,517,4],[470,534,2],[516,539,1],[471,521,0],[528,440,1],[586,586,2],[199,517,0],[627,310,2],[385,587,0],[62,700,1],[624,307,0],[520,517,1],[575,65,2],[526,553,4],[305,610,0],[473,533,2],[523,521,1],[550,615,2],[549,570,2],[538,66,1],[544,572,2],[196,588,0],[555,555,2],[498,498,2],[641,556,2],[440,472,0],[526,519,4],[549,549,1],[525,523,1],[548,65,1],[521,535,1],[524,519,1],[188,188,1],[501,501,2],[546,525,1],[520,537,1],[528,528,1],[520,543,1],[520,64,1],[200,618,1],[520,538,1],[555,65,2],[439,516,0],[521,517,1],[311,573,0],[546,546,1],[471,524,0],[516,300,1],[611,193,2],[192,716,1],[532,524,1],[207,207,1],[472,525,0],[521,516,1],[578,307,2],[499,499,6],[471,525,0],[472,524,0],[596,200,3],[536,527,0],[517,516,1],[204,670,1],[500,500,6],[440,522,0],[440,516,0],[688,63,3],[550,574,2],[590,65,1],[693,68,3],[67,657,1],[521,540,1],[655,193,2],[692,195,3],[571,304,2],[526,555,4],[381,381,1],[518,566,2],[196,604,0],[543,543,1],[471,517,0],[609,310,2],[522,517,1],[531,439,1],[548,548,1],[544,516,0],[524,520,1],[199,200,1],[392,392,1],[518,567,2],[472,522,0],[472,517,0],[190,189,1],[471,516,0],[71,72,1],[523,517,1],[439,517,0],[472,516,0],[521,545,1],[519,500,1],[520,525,1],[73,73,1],[575,308,2],[531,531,1],[514,522,0],[307,656,0],[388,588,0],[440,514,0],[206,205,1],[64,654,1],[518,499,2],[619,619,2],[303,660,0],[600,66,6],[437,437,2],[532,519,1],[525,546,1],[560,618,2],[523,537,3],[595,529,0],[442,442,2],[520,617,1],[518,500,2],[196,616,0],[472,519,0],[440,519,0],[521,519,1],[514,517,0],[305,642,1],[598,530,0],[555,66,2],[600,65,6],[622,622,2],[439,524,0],[439,522,0],[525,519,1],[313,312,1],[608,608,2],[578,66,2],[439,523,0],[543,535,1],[570,521,0],[471,519,0],[623,623,2],[60,59,1],[681,384,2],[520,547,1],[306,527,0],[471,523,0],[471,522,0],[305,702,1],[388,597,0],[64,569,0],[557,522,1],[67,577,0],[520,552,1],[303,302,1],[524,549,1],[439,514,0],[530,636,3],[521,306,1],[388,590,0],[529,542,2],[583,583,2],[553,65,2],[521,524,1],[58,58,1],[631,539,4],[580,556,2],[440,525,0],[646,559,3],[659,312,2],[523,516,1],[545,545,1],[651,499,2],[668,387,0],[514,520,0],[528,517,1],[547,535,1],[615,615,2],[530,541,2],[728,384,3],[521,548,1],[521,551,1],[564,564,1],[538,440,1],[208,208,1],[552,66,1],[526,524,4],[499,565,2],[516,520,1],[691,389,2],[525,543,1],[529,637,3],[521,522,1],[630,64,2],[612,387,0],[314,314,1],[707,470,4],[552,535,1],[523,524,1],[520,519,1],[558,522,1],[540,537,1],[579,628,2],[649,500,2],[538,517,1],[516,580,1],[540,517,1],[631,195,4],[308,661,0],[612,386,0],[574,574,2],[576,65,1],[527,525,1],[311,627,1],[472,523,0],[553,66,2],[521,525,1],[572,572,2],[560,694,2],[548,537,1],[527,535,1],[543,439,1],[708,473,4],[520,524,1],[551,439,1],[514,600,0],[516,554,1],[519,306,1],[560,632,2],[187,187,1],[522,516,1],[440,523,0],[71,687,1],[588,65,1],[520,523,1],[516,67,1],[521,309,1],[648,387,1],[514,524,0],[539,559,2],[526,585,4],[557,525,1],[514,523,0],[385,604,0],[522,524,1],[541,438,4],[747,389,3],[619,70,2],[542,441,4],[301,301,1],[561,523,1],[516,586,1],[199,201,1],[594,517,2],[528,535,1],[526,520,4],[664,556,4],[587,66,1],[582,65,1],[596,536,1],[522,525,1],[552,552,1],[585,65,2],[538,520,1],[623,61,2],[593,65,2],[518,535,2],[308,656,0],[516,200,1],[558,524,1],[60,700,1],[547,440,1],[381,382,1],[516,316,1],[624,386,0],[543,520,1],[565,565,1],[780,63,3],[209,209,1],[526,525,4],[597,65,1],[579,559,2],[188,189,1],[527,439,1],[557,557,1],[545,524,1],[526,521,4],[562,523,1],[551,537,1],[522,199,1],[545,440,1],[704,307,0],[617,617,2],[561,525,1],[500,564,2],[524,528,1],[518,537,2],[589,589,2],[517,499,1],[73,72,1],[783,68,3],[553,553,2],[523,525,1],[385,616,0],[615,550,2],[522,519,1],[533,592,3],[534,591,3],[307,661,0],[392,391,1],[547,520,1],[562,524,1],[306,543,0],[640,544,4],[582,554,2],[576,66,1],[622,203,2],[523,519,1],[311,659,0],[514,516,0],[608,544,2],[471,514,0],[655,191,2],[531,525,1],[539,586,2],[531,519,1],[602,64,2],[533,472,5],[551,551,1],[668,386,0],[194,196,1],[303,610,0],[202,766,1],[525,541,1],[521,541,1],[628,628,2],[547,524,1],[666,554,4],[472,514,0],[473,474,2],[540,521,1],[585,66,2],[525,521,1],[383,861,1],[640,63,4],[516,521,1],[527,537,1],[520,388,2],[561,561,1],[306,571,0],[67,584,0],[624,387,0],[195,196,1],[534,471,5],[526,575,4],[514,525,0],[514,521,0],[594,594,2],[549,309,2],[604,66,1],[545,521,1],[517,199,3],[470,469,2],[530,638,3],[194,539,1],[515,522,0],[653,550,4],[514,519,0],[206,207,1],[547,547,1],[743,203,2],[520,542,1],[568,571,0],[652,200,5],[702,304,2],[568,543,0],[579,611,2],[599,599,2],[543,525,1],[196,194,1],[58,59,1],[515,517,0],[631,516,0],[520,541,1],[529,639,3],[526,593,4],[529,516,1],[190,716,1],[548,521,1],[390,871,1],[548,519,1],[524,542,1],[310,573,0],[634,634,2],[530,516,1],[195,193,1],[515,523,0],[561,439,1],[632,632,2],[529,440,4],[862,200,3],[74,74,1],[551,525,1],[521,542,1],[812,193,3],[653,68,4],[526,578,4],[545,537,1],[670,203,2],[520,499,1],[558,558,1],[524,500,1],[516,582,1],[538,471,1],[548,439,1],[67,606,0],[521,385,2],[609,312,2],[660,304,2],[516,596,1],[309,587,0],[557,439,1],[556,388,2],[520,500,1],[516,299,1],[617,304,2],[593,66,2],[525,499,1],[538,439,1],[522,306,1],[64,581,0],[570,522,0],[641,641,2],[527,701,1],[517,500,1],[560,583,2],[309,590,0],[546,642,2],[530,598,3],[539,196,2],[527,199,2],[315,315,1],[573,573,1],[519,499,1],[517,518,1],[531,537,1],[688,572,3],[529,595,3],[313,314,1],[558,440,1],[313,723,0],[532,440,1],[520,305,1],[540,440,1],[649,649,2],[591,534,5],[517,306,1],[594,555,2],[655,655,2],[651,651,2],[592,533,5],[528,537,1],[693,574,3],[562,562,1],[517,581,1],[570,520,0],[516,544,1],[554,385,2],[579,674,2],[380,380,1],[528,524,1],[517,618,2],[570,523,0],[67,601,0],[186,186,1],[516,605,1],[515,521,0],[704,308,0],[530,439,4],[301,302,1],[517,584,1],[524,547,1],[309,616,0],[600,519,6],[57,57,1],[551,521,1],[472,533,3],[524,532,1],[570,519,0],[195,194,1],[515,520,0],[536,596,1],[525,557,1],[668,307,0],[516,550,1],[687,70,2],[524,545,1],[654,64,3],[204,852,1],[516,648,1],[576,539,2],[580,66,1],[534,470,4],[516,556,1],[524,529,1],[200,766,1],[523,306,1],[527,440,1],[531,535,1],[520,575,1],[516,602,1],[530,525,1],[600,523,6],[549,573,1],[522,544,2],[713,310,2],[520,569,1],[562,440,1],[471,529,0],[524,648,1],[393,393,1],[600,517,6],[208,207,1],[499,565,4],[552,519,1],[600,522,6],[514,555,0],[438,437,2],[533,473,4],[637,637,4],[518,532,2],[522,557,1],[622,583,2],[622,699,2],[516,523,1],[530,306,1],[571,617,2],[514,563,0],[736,302,2],[619,574,2],[536,540,0],[384,554,1],[516,591,1],[515,525,0],[587,65,1],[522,521,1],[528,471,1],[636,636,4],[191,193,1],[525,551,1],[571,546,1],[532,535,1],[516,592,1],[441,442,2],[500,564,4],[538,199,2],[523,520,1],[524,576,1],[516,522,1],[540,439,1],[700,61,2],[692,559,3],[623,572,2],[541,598,4],[542,595,4],[552,520,1],[527,471,1],[536,538,0],[525,531,1],[640,64,4],[560,718,2],[201,200,1],[619,686,2],[807,70,2],[516,519,1],[190,929,1],[528,472,1],[521,570,1],[524,558,1],[694,199,3],[554,589,2],[517,529,1],[514,529,0],[681,681,2],[520,534,1],[525,561,1],[543,440,1],[526,440,4],[519,539,2],[623,690,2],[523,550,2],[202,200,1],[472,530,0],[188,187,1],[568,527,0],[521,500,1],[499,499,7],[514,518,0],[552,439,1],[647,310,2],[517,542,1],[633,66,1],[523,613,1],[516,529,1],[543,471,1],[571,305,2],[536,528,0],[586,193,2],[63,64,1],[831,61,2],[209,210,1],[514,530,0],[528,199,2],[516,388,1],[541,598,1],[389,556,1],[532,537,1],[530,530,1],[520,529,1],[520,533,1],[538,522,1],[529,529,1],[538,472,1],[521,534,1],[668,308,0],[516,530,1],[527,472,1],[440,515,0],[526,439,4],[524,562,1],[71,955,1],[300,300,1],[542,595,1],[590,535,1],[311,858,1],[520,544,1],[522,614,1],[571,571,1],[573,627,2],[200,202,1],[521,499,1],[439,515,0],[691,391,2],[597,66,1],[568,551,0],[500,519,0],[728,589,3],[531,472,1],[517,644,1],[303,702,1],[515,524,0],[543,472,1],[525,530,1],[1044,200,3],[519,541,1],[516,385,1],[206,852,1],[521,533,1],[554,634,2],[556,599,2],[578,65,2],[548,440,1],[529,524,1],[564,500,5],[525,542,1],[471,534,3],[704,386,0],[523,561,1],[569,522,1],[521,539,1],[201,203,1],[516,621,1],[769,387,2],[681,382,2],[565,499,5],[663,65,1],[548,472,1],[523,199,1],[516,620,1],[69,550,1],[540,535,1],[694,618,3],[546,305,2],[524,539,1],[530,521,1],[586,631,2],[531,471,1],[474,474,2],[520,530,1],[519,518,1],[586,646,2],[557,64,2],[524,533,1],[73,74,1],[550,657,2],[62,64,1],[514,553,0],[443,443,1],[519,196,2],[472,529,0],[602,544,2],[524,534,1],[516,788,1],[550,750,2],[580,388,2],[747,599,3],[616,66,1],[438,541,2],[190,192,1],[75,75,1],[545,439,1],[307,765,0],[596,517,0],[540,472,1],[581,517,1],[60,986,1],[500,500,7],[519,603,1],[303,736,0],[570,529,0],[568,531,0],[611,611,2],[519,530,1],[691,691,2],[522,558,1],[313,659,0],[697,64,3],[521,577,1],[436,436,1],[515,518,0],[65,656,0],[306,557,0],[516,317,1],[499,525,0],[552,440,1],[519,601,1],[704,387,0],[529,309,1],[556,641,2],[521,578,1],[516,587,1],[525,534,1],[520,309,1],[499,517,0],[469,469,2],[62,544,1],[596,596,1],[555,522,2],[68,67,1],[528,439,1],[769,386,2],[306,551,0],[522,309,1],[716,191,2],[628,539,2],[385,633,0],[707,707,4],[304,610,0],[471,530,0],[529,522,1],[200,718,1],[523,562,1],[515,563,0],[569,520,1],[66,439,0],[584,517,1],[65,703,0],[315,314,1],[515,519,0],[558,64,2],[711,67,3],[529,521,1],[580,520,1],[652,200,3],[723,312,2],[822,554,3],[199,632,1],[579,194,2],[608,64,2],[525,536,1],[608,640,2],[527,594,1],[600,524,6],[66,440,0],[708,708,4],[529,520,1],[549,673,2],[68,70,1],[568,557,0],[576,519,1],[65,706,0],[515,526,0],[545,472,1],[575,522,2],[525,533,1],[547,471,1],[529,517,1],[58,57,1],[555,644,2],[528,540,1],[518,581,2],[529,534,1],[532,439,1],[529,523,1],[642,520,0],[699,200,2],[530,522,1],[524,541,1],[635,635,2],[441,542,2],[579,832,2],[538,590,1],[201,202,1],[306,561,0],[518,584,2],[530,520,1],[199,514,0],[530,533,1],[381,380,1],[674,674,2],[555,523,2],[530,523,1],[310,549,0],[500,524,0],[308,765,0],[544,654,2],[545,471,1],[552,471,1],[518,577,2],[569,440,1],[63,61,1],[551,472,1],[540,471,1],[615,653,2],[605,550,2],[633,65,1],[817,191,2],[196,674,1],[582,521,1],[591,591,3],[605,67,2],[752,524,2],[568,561,0],[306,617,1],[527,597,1],[573,549,1],[664,516,0],[500,517,0],[686,550,2],[499,520,0],[500,520,0],[196,193,1],[519,309,1],[383,554,1],[553,524,2],[546,571,1],[547,439,1],[306,531,0],[666,384,4],[307,806,0],[186,187,1],[56,57,1],[518,678,2],[540,587,1],[575,66,2],[518,569,2],[552,522,1],[518,680,2],[195,539,1],[548,471,1],[527,522,1],[551,440,1],[441,529,0],[68,69,1],[438,530,0],[836,556,3],[518,601,2],[538,537,1],[516,631,1],[308,806,0],[517,541,1],[499,522,0],[555,525,2],[628,196,2],[530,517,1],[582,385,2],[592,592,3],[901,384,3],[545,199,1],[392,393,1],[515,600,0],[655,738,2],[519,533,1],[690,690,2],[65,612,0],[570,517,0],[551,471,1],[590,440,1],[543,522,1],[616,65,1],[775,554,2],[547,472,1],[532,472,1],[660,302,2],[521,530,1],[945,193,3],[186,185,1],[588,588,1],[528,587,1],[439,531,0],[516,714,1],[315,316,1],[518,528,2],[619,687,2],[640,640,4],[605,523,1],[531,440,1],[64,607,0],[195,674,1],[499,519,0],[538,528,1],[673,521,0],[549,471,1],[602,522,1],[577,521,1],[681,589,2],[66,703,0],[713,312,2],[751,564,4],[618,516,0],[580,535,1],[519,542,1],[604,537,1],[536,650,0],[586,674,2],[527,538,1],[532,471,1],[565,499,2],[525,598,1],[518,603,2],[517,309,1],[546,472,1],[63,62,1],[547,522,1],[617,520,0],[549,472,1],[390,556,1],[530,534,1],[521,529,1],[305,839,1],[546,471,1],[557,472,1],[918,389,3],[543,537,1],[569,439,1],[596,199,1],[549,627,2],[646,786,3],[524,595,1],[526,471,4],[529,533,1],[211,210,1],[539,525,0],[578,523,2],[519,658,1],[516,566,1],[664,389,4],[596,527,0],[66,706,0],[524,530,1],[579,692,2],[301,874,0],[69,67,1],[581,440,1],[543,306,2],[564,500,7],[632,200,2],[526,472,4],[567,522,1],[545,535,1],[691,599,2],[517,650,1],[199,527,0],[519,534,1],[560,798,2],[795,556,2],[838,304,2],[734,386,2],[66,661,0],[551,535,1],[522,541,1],[555,524,2],[516,298,1],[552,472,1],[726,385,0],[842,314,2],[588,535,1],[523,615,2],[519,529,1],[532,799,1],[205,203,1],[558,472,1],[557,440,1],[499,521,0],[500,521,0],[548,523,1],[518,531,2],[567,516,1],[856,583,3],[545,517,1],[518,515,2],[577,523,1],[623,700,2],[538,597,1],[586,194,2],[379,379,1],[193,195,1],[588,66,1],[686,686,2],[525,529,1],[561,471,1],[553,522,2],[200,203,1],[518,527,2],[381,861,1],[523,309,1],[306,305,1],[653,653,4],[630,522,1],[591,470,6],[553,523,2],[528,521,1],[577,439,1],[64,603,0],[608,730,2],[192,194,1],[609,609,1],[1028,70,3],[749,201,4],[545,587,1],[521,634,2],[530,519,1],[537,562,0],[66,612,0],[500,522,0],[518,562,2],[67,69,1],[631,631,4],[517,534,1],[75,74,1],[780,572,3],[561,472,1],[437,964,2],[862,199,3],[301,300,1],[618,201,2],[690,544,2],[743,743,2],[392,871,1],[72,70,1],[518,540,2],[632,203,2],[608,61,2],[662,514,0],[191,189,1],[592,473,6],[588,552,1],[567,473,3],[545,540,1],[566,470,3],[519,543,1],[860,583,3],[699,699,2],[570,530,0],[565,499,7],[600,520,6],[540,199,2],[586,714,2],[516,547,1],[557,527,1],[934,310,3],[522,542,1],[550,693,2],[526,529,4],[548,604,1],[516,641,1],[531,552,1],[518,548,2],[520,539,1],[628,692,2],[524,196,1],[523,542,1],[625,524,1],[517,530,1],[519,840,1],[59,61,1],[783,574,3],[530,309,1],[517,533,1],[812,611,3],[516,590,1],[581,522,1],[532,522,1],[521,311,1],[523,541,1],[394,394,1],[471,515,0],[858,312,2],[65,624,0],[515,530,0],[528,522,1],[305,762,1],[600,525,6],[516,666,1],[303,1016,1],[471,538,0],[518,538,2],[520,595,1],[548,535,1],[558,439,1],[500,523,0],[548,531,1],[56,55,1],[544,688,2],[738,195,2],[442,975,2],[1042,203,3],[655,611,2],[566,523,1],[951,559,4],[65,765,0],[515,529,0],[690,64,2],[557,517,1],[566,520,1],[520,606,1],[514,585,0],[557,471,1],[1055,61,3],[202,805,1],[516,567,1],[561,440,1],[474,473,2],[621,534,3],[608,688,2],[652,536,1],[521,713,1],[561,527,1],[75,76,1],[524,540,1],[647,549,1],[676,514,0],[1069,498,4],[516,564,1],[562,471,1],[648,65,1],[577,440,1],[725,65,1],[523,533,1],[199,528,0],[557,520,1],[527,555,1],[617,522,0],[622,670,2],[529,525,1],[597,597,1],[587,587,1],[566,516,1],[515,516,0],[192,628,1],[543,552,1],[199,538,0],[600,521,6],[526,530,4],[604,65,1],[547,517,1],[200,787,1],[555,521,2],[522,569,1],[817,189,2],[439,500,0],[68,550,1],[673,570,2],[681,775,2],[779,525,2],[603,519,1],[521,607,1],[558,520,1],[651,565,2],[524,554,1],[615,70,2],[635,519,2],[472,515,0],[521,598,1],[619,803,2],[531,588,1],[761,565,4],[555,440,2],[558,517,1],[514,644,0],[627,627,2],[531,520,1],[516,646,1],[524,585,1],[555,520,2],[540,523,1],[388,663,0],[615,693,2],[649,564,2],[516,597,1],[802,520,0],[209,208,1],[601,519,1],[193,194,1],[561,517,1],[620,533,3],[499,523,0],[469,470,2],[1079,501,4],[584,440,1],[528,538,1],[522,534,1],[439,543,0],[535,518,0],[539,521,0],[544,520,0],[66,624,0],[516,634,1],[527,540,1],[652,596,1],[761,565,1],[610,702,2],[569,471,1],[439,530,0],[580,440,1],[525,556,1],[558,471,1],[184,185,1],[655,716,2],[536,732,0],[514,567,0],[547,538,1],[514,566,0],[438,964,2],[521,666,2],[550,891,2],[520,598,1],[540,528,1],[669,470,2],[313,842,0],[632,749,2],[751,564,1],[542,524,0],[529,306,1],[543,517,1],[527,523,1],[741,388,0],[532,523,1],[586,196,2],[862,536,3],[718,199,3],[590,66,1],[546,762,2],[541,525,0],[206,1097,1],[384,385,1],[519,570,1],[667,473,2],[523,529,1],[709,520,2],[642,522,0],[527,710,1],[705,308,4],[63,544,1],[553,525,2],[606,520,1],[514,658,0],[615,67,2],[645,441,5],[540,811,1],[192,195,1],[603,522,1],[623,814,2],[517,595,1],[691,795,2],[316,316,1],[516,551,1],[534,520,0],[519,554,1],[438,1159,2],[65,661,0],[518,552,2],[609,573,1],[671,525,1],[632,560,2],[440,499,0],[1013,386,0],[576,196,2],[439,551,0],[531,543,1],[202,560,1],[519,562,1],[64,62,1],[808,657,3],[514,614,0],[584,523,1],[609,311,2],[545,528,1],[719,546,1],[521,595,1],[968,205,2],[306,839,1],[533,520,0],[515,555,0],[743,205,2],[525,539,1],[861,382,2],[516,565,1],[192,190,1],[522,529,1],[517,710,1],[522,530,1],[526,567,4],[586,516,0],[528,520,1],[192,189,1],[588,543,1],[188,929,1],[530,524,1],[516,652,1],[517,614,1],[514,613,0],[642,521,0],[525,593,1],[523,577,1],[299,299,1],[516,618,1],[526,566,4],[537,518,0],[517,613,1],[548,551,1],[743,670,2],[1056,387,0],[585,519,2],[521,625,1],[564,500,2],[518,558,2],[517,587,1],[673,673,2],[590,538,1],[525,591,1],[543,527,1],[826,565,4],[807,72,2],[815,521,0],[519,551,1],[441,975,2],[783,550,3],[515,613,0],[437,636,2],[304,571,0],[516,318,1],[597,535,1],[77,76,1],[543,538,1],[535,558,0],[312,659,0],[520,664,2],[871,391,2],[524,592,1],[517,556,1],[582,440,1],[532,516,1],[524,591,1],[531,499,1],[828,564,4],[472,499,0],[771,544,3],[537,561,0],[529,519,1],[200,798,1],[523,530,1],[553,521,2],[579,786,2],[643,438,5],[210,210,1],[521,800,1],[529,199,1],[718,200,3],[518,557,2],[564,649,1],[562,472,1],[785,550,3],[441,1165,2],[562,439,1],[545,523,1],[520,591,1],[521,592,1],[514,575,0],[73,955,1],[523,617,1],[547,537,1],[517,585,1],[544,889,2],[517,597,1],[569,472,1],[527,581,1],[522,533,1],[442,637,2],[560,766,2],[440,528,0],[567,520,1],[607,521,1],[567,521,1],[554,525,0],[206,204,1],[882,576,2],[301,736,0],[621,534,1],[532,548,1],[565,651,1],[553,658,2],[547,516,1],[205,207,1],[517,515,1],[520,641,2],[628,895,2],[519,558,1],[439,548,0],[723,314,2],[471,500,0],[619,69,2],[622,860,2],[516,633,1],[521,591,1],[538,499,1],[724,555,3],[525,552,1],[1107,203,3],[519,598,1],[521,528,1],[532,558,1],[66,656,0],[701,65,2],[379,380,1],[587,537,1],[532,616,1],[515,614,0],[642,523,0],[520,592,1],[607,522,1],[634,666,2],[543,597,1],[472,500,0],[516,720,1],[188,1276,1],[874,302,2],[650,594,1],[518,561,2],[556,522,0],[517,633,1],[740,522,2],[525,638,1],[580,439,1],[527,584,1],[686,67,2],[608,814,2],[622,787,2],[527,520,1],[714,516,0],[519,613,1],[59,60,1],[568,597,0],[623,780,2],[195,514,0],[521,617,1],[73,71,1],[528,590,1],[852,205,2],[532,562,1],[517,756,1],[389,388,1],[539,522,0],[525,538,1],[521,657,1],[471,499,0],[521,726,1],[734,387,2],[540,594,1],[517,774,1],[730,654,3],[648,66,1],[514,578,0],[626,472,6],[525,592,1],[56,56,1],[528,500,1],[524,631,1],[635,553,2],[620,533,1],[557,199,1],[520,576,1],[531,522,1],[728,554,3],[304,305,1],[547,199,1],[552,543,1],[699,805,2],[601,523,1],[515,553,0],[517,514,1],[524,538,1],[604,604,1],[521,384,2],[585,523,2],[609,713,2],[543,546,1],[528,523,1],[582,439,1],[534,534,1],[652,536,3],[641,664,2],[525,576,1],[514,705,0],[585,440,2],[524,639,1],[587,540,1],[977,387,0],[58,60,1],[519,588,1],[518,824,2],[632,694,2],[68,803,1],[614,520,2],[635,532,2],[313,858,1],[1095,191,3],[622,978,2],[520,570,1],[710,65,2],[585,522,2],[518,545,2],[388,731,0],[531,523,1],[516,909,1],[609,627,2],[519,604,1],[575,575,2],[625,549,1],[310,311,1],[517,590,1],[200,650,0],[185,185,1],[738,628,2],[516,615,1],[606,523,1],[743,896,2],[593,522,2],[1013,387,0],[622,202,2],[619,989,2],[556,524,0],[584,439,1],[517,554,1],[539,520,0],[65,440,0],[517,545,1],[531,521,1],[517,567,1],[517,575,1],[534,529,0],[547,500,1],[525,720,1],[610,610,1],[517,566,1],[582,537,1],[838,520,0],[516,741,1],[63,814,1],[72,71,1],[623,62,2],[561,199,1],[623,995,2],[629,471,6],[543,199,1],[577,472,1],[77,78,1],[315,1020,0],[517,570,1],[516,640,1],[532,545,1],[524,544,1],[1121,382,2],[533,521,0],[593,439,2],[519,614,1],[519,561,1],[58,986,1],[499,761,2],[317,317,1],[517,557,1],[596,536,3],[1420,200,3],[533,530,0],[576,439,1],[516,559,1],[745,523,2],[518,543,2],[519,625,1],[539,523,0],[608,771,2],[540,527,1],[581,439,1],[1078,189,2],[524,586,1],[677,523,1],[206,208,1],[548,616,1],[394,393,1],[608,62,2],[517,562,1],[587,440,1],[653,67,4],[617,530,0],[628,194,2],[566,524,1],[516,195,1],[606,440,1],[551,523,1],[580,664,2],[520,642,1],[500,751,2],[525,595,1],[590,590,1],[588,439,1],[531,548,1],[532,521,1],[566,521,1],[1133,391,2],[595,524,0],[519,545,1],[519,567,1],[546,199,1],[662,522,1],[525,701,1],[514,593,0],[531,604,1],[638,541,5],[530,305,1],[516,543,1],[544,525,0],[576,440,1],[66,471,0],[538,527,1],[557,543,1],[581,472,1],[517,598,1],[534,521,0],[673,522,0],[211,212,1],[807,687,2],[551,199,1],[646,951,3],[552,537,1],[597,527,1],[610,571,1],[542,637,4],[562,521,1],[530,199,1],[209,207,1],[658,553,3],[655,192,2],[1066,572,4],[310,312,1],[602,440,1],[560,516,0],[578,578,2],[540,633,1],[533,524,0],[827,520,0],[540,524,1],[517,543,1],[607,440,1],[705,307,4],[538,500,1],[67,70,1],[694,583,3],[546,557,1],[984,554,3],[517,561,1],[522,305,1],[517,593,1],[67,803,1],[65,668,0],[529,932,3],[760,65,2],[628,832,2],[571,610,1],[541,636,4],[519,557,1],[525,500,1],[536,1104,1],[520,566,1],[601,439,1],[662,64,2],[519,592,1],[831,59,2],[520,304,1],[499,538,0],[587,528,1],[671,546,1],[521,647,1],[299,300,1],[534,524,0],[663,66,1],[603,439,1],[727,66,1],[639,542,5],[655,859,2],[54,55,1],[561,521,1],[618,632,2],[519,566,1],[517,547,1],[202,204,1],[560,525,0],[577,471,1],[516,557,1],[657,67,3],[714,539,3],[395,395,1],[520,629,1],[579,1094,2],[652,596,3],[552,531,1],[525,621,1],[613,521,2],[561,546,1],[738,738,2],[747,556,3],[567,524,1],[184,183,1],[520,741,1],[516,653,1],[66,806,0],[895,193,4],[311,804,0],[529,591,1],[523,606,1],[548,545,1],[525,725,1],[724,65,3],[311,549,0],[471,543,0],[581,520,1],[929,189,2],[530,592,1],[550,525,0],[532,552,1],[518,635,2],[579,812,2],[615,808,2],[388,755,0],[551,306,2],[553,439,2],[588,531,1],[516,558,1],[520,626,1],[384,634,1],[567,525,1],[618,200,2],[520,621,1],[817,817,2],[688,889,3],[524,598,1],[553,520,2],[567,523,1],[521,620,1],[697,522,0],[659,659,1],[619,783,2],[764,66,2],[516,438,1],[516,441,1],[539,786,2],[566,522,1],[310,514,0],[440,538,0],[520,303,1],[519,591,1],[535,557,0],[1012,386,0],[524,620,1],[581,527,1],[581,471,1],[559,193,2],[642,530,0],[540,545,1],[520,625,1],[666,666,4],[190,193,1],[519,585,1],[757,66,1],[524,621,1],[670,670,2],[532,549,1],[732,525,1],[598,525,0],[548,499,1],[522,647,1],[552,525,1],[548,525,1],[597,538,1],[383,385,1],[622,766,2],[201,805,1],[521,587,1],[389,641,1],[519,593,1],[1056,386,0],[640,730,4],[555,439,2],[540,522,1],[566,525,1],[541,521,0],[652,652,1],[775,775,2],[831,700,2],[524,499,1],[533,533,1],[664,664,4],[530,930,3],[519,556,1],[517,526,1],[552,588,1],[440,545,0],[573,609,1],[524,553,1],[521,621,1],[523,305,1],[607,439,1],[792,527,2],[561,551,1],[523,647,1],[65,439,0],[302,736,0],[673,523,0],[514,729,0],[72,74,1],[562,516,1],[822,634,3],[534,525,0],[520,528,1],[690,780,2],[531,551,1],[615,803,2],[807,931,2],[552,500,1],[584,527,1],[784,386,4],[519,578,1],[517,558,1],[525,620,1],[378,378,1],[312,310,1],[517,578,1],[738,194,2],[589,554,2],[639,441,6],[522,570,1],[54,53,1],[515,575,0],[520,620,1],[517,592,1],[547,542,1],[530,500,1],[569,538,1],[551,516,1],[891,550,3],[71,73,1],[724,66,3],[524,555,1],[717,521,2],[517,654,1],[524,629,1],[534,591,1],[710,66,2],[516,297,1],[520,531,1],[76,76,1],[517,551,1],[313,1242,1],[787,787,2],[524,626,1],[836,641,3],[529,592,1],[472,543,0],[527,516,1],[520,675,1],[603,440,1],[529,499,1],[648,309,0],[535,514,0],[520,557,1],[558,547,1],[548,500,1],[580,471,1],[623,889,2],[600,440,6],[521,626,1],[569,569,1],[520,869,1],[522,607,1],[536,584,0],[1112,574,4],[306,597,0],[519,626,1],[749,749,4],[605,439,1],[534,516,0],[309,663,0],[520,527,1],[561,516,1],[829,386,3],[309,804,0],[521,576,1],[519,734,1],[562,549,1],[594,527,2],[517,850,1],[521,305,1],[559,786,2],[582,472,1],[523,570,1],[615,785,2],[701,66,2],[472,538,0],[681,901,2],[191,190,1],[795,795,2],[720,65,1],[521,638,1],[519,547,1],[699,860,2],[524,911,1],[566,707,3],[520,614,1],[531,306,2],[543,499,1],[547,590,1],[522,625,1],[524,727,1],[543,588,1],[205,204,1],[533,525,0],[639,529,0],[519,595,1],[549,545,1],[578,537,2],[528,542,1],[70,68,1],[593,523,2],[519,616,1],[524,64,1],[676,523,1],[536,581,0],[540,555,1],[533,516,0],[517,729,1],[519,820,1],[618,583,2],[532,500,1],[554,523,0],[681,861,2],[195,586,1],[521,629,1],[66,668,0],[525,626,1],[549,558,1],[713,713,2],[567,708,3],[691,871,2],[790,387,4],[831,957,2],[644,555,3],[523,625,1],[524,582,1],[1019,556,3],[579,539,2],[1028,687,3],[522,499,1],[596,652,1],[514,665,0],[520,630,1],[525,597,1],[381,1516,1],[1299,203,2],[575,440,2],[524,548,1],[500,538,0],[309,727,0],[584,471,1],[529,570,1],[530,591,1],[514,722,0],[524,580,1],[615,69,2],[521,567,1],[519,663,1],[64,630,0],[673,520,0],[525,629,1],[524,385,1],[606,439,1],[604,439,1],[521,527,1],[616,545,1],[529,617,1],[541,638,3],[213,212,1],[311,1053,1],[472,528,0],[315,842,0],[518,849,2],[532,635,1],[520,597,1],[520,702,1],[792,66,2],[521,613,1],[534,530,0],[594,440,2],[741,65,1],[472,548,0],[521,515,1],[546,527,1],[500,528,0],[601,440,1],[760,66,2],[63,608,1],[517,591,1],[525,555,1],[558,528,1],[750,550,2],[519,620,1],[660,303,2],[694,718,3],[517,629,1],[520,567,1],[551,499,1],[515,578,0],[59,57,1],[517,764,1],[561,67,2],[605,440,1],[533,529,0],[65,900,0],[547,528,1],[525,683,1],[525,388,1],[600,439,6],[192,817,1],[520,590,1],[199,540,0],[520,514,1],[525,580,1],[187,189,1],[516,545,1],[585,585,2],[520,682,1],[1044,536,3],[657,550,3],[517,697,1],[524,685,1],[691,918,2],[539,646,2],[838,302,2],[562,545,1],[544,524,0],[759,304,2],[310,609,0],[529,305,1],[638,438,6],[192,1137,1],[66,900,0],[199,706,0],[60,58,1],[516,516,3],[576,471,1],[543,541,1],[557,516,1],[471,528,0],[530,620,1],[519,705,1],[555,613,2],[1390,382,3],[306,304,1],[542,521,0],[533,592,1],[1093,300,2],[522,535,3],[531,541,1],[584,594,1],[64,61,1],[543,516,1],[523,500,1],[625,440,1],[555,614,2],[515,665,0],[520,521,1],[522,581,1],[61,63,1],[602,640,2],[439,527,0],[557,546,1],[517,580,1],[1023,312,2],[692,539,3],[1016,302,2],[1097,207,2],[633,537,1],[306,568,1],[558,516,1],[551,546,1],[525,196,1],[472,545,0],[714,586,3],[515,566,0],[619,550,2],[206,203,1],[576,631,2],[392,1567,1],[1153,203,2],[581,594,1],[1073,549,2],[604,548,1],[587,545,1],[517,626,1],[537,514,0],[515,593,0],[529,621,1],[693,891,3],[68,615,1],[543,519,1],[521,689,1],[522,617,1],[441,441,1],[536,590,0],[524,566,1],[201,787,1],[584,472,1],[543,531,1],[553,635,2],[549,853,2],[632,787,2],[644,644,3],[520,588,1],[525,757,1],[1231,207,2],[565,499,1],[317,316,1],[472,531,0],[582,666,2],[527,684,1],[538,547,1],[646,516,0],[553,440,2],[931,68,2],[720,66,1],[1436,391,3],[1220,308,0],[802,522,0],[472,551,0],[549,547,1],[562,67,2],[532,520,1],[524,567,1],[65,921,0],[519,654,1],[534,707,4],[514,672,0],[70,69,1],[519,868,1],[564,500,1],[546,543,1],[471,545,0],[692,786,3],[751,501,4],[520,639,1],[520,638,1],[554,524,0],[1700,200,5],[575,614,2],[540,525,1],[650,517,1],[384,383,1],[548,532,1],[520,602,1],[637,637,1],[64,814,1],[555,518,2],[642,529,0],[686,783,2],[877,66,2],[551,541,1],[519,621,1],[521,673,1],[471,527,0],[566,517,1],[699,560,2],[575,525,2],[440,547,0],[515,585,0],[519,629,1],[523,584,1],[557,499,1],[807,71,2],[627,521,0],[389,390,1],[438,438,1],[767,527,1],[761,498,4],[734,65,2],[567,517,1],[529,542,4],[520,558,1],[523,534,1],[605,653,2],[475,475,1],[599,556,2],[471,552,0],[540,551,1],[648,532,1],[536,597,0],[555,471,2],[1055,700,3],[529,625,1],[636,636,1],[705,66,4],[524,602,1],[555,472,2],[515,514,7],[524,613,1],[609,659,1],[771,608,3],[829,387,3],[594,535,2],[524,614,1],[523,665,1],[528,545,1],[519,638,1],[543,556,2],[546,865,2],[521,531,1],[525,544,1],[580,514,0],[762,520,0],[199,718,1],[298,298,1],[525,582,1],[609,815,2],[538,873,1],[800,66,1],[499,531,0],[957,63,2],[575,439,2],[211,211,1],[517,711,1],[726,66,1],[743,204,2],[574,550,2],[555,594,2],[542,542,1],[522,591,1],[538,543,1],[774,66,1],[632,856,2],[532,603,1],[525,567,1],[576,535,1],[522,500,1],[519,526,1],[616,616,1],[604,531,1],[657,750,3],[807,955,2],[619,891,2],[630,440,1],[516,628,1],[186,188,1],[533,519,0],[547,662,1],[602,439,1],[578,439,2],[525,566,1],[525,695,1],[590,528,1],[520,802,1],[727,65,1],[828,564,1],[521,196,1],[642,517,0],[516,562,1],[522,538,1],[582,471,1],[785,615,3],[618,888,2],[970,193,2],[472,527,0],[516,319,1],[728,984,3],[800,65,1],[516,731,1],[803,803,2],[515,672,0],[604,551,1],[384,382,1],[536,587,0],[585,517,2],[530,617,1],[618,560,2],[581,538,1],[749,560,4],[520,647,1],[525,794,1],[958,520,0],[593,593,2],[523,499,1],[546,561,1],[524,789,1],[516,561,1],[571,827,2],[522,595,1],[533,708,4],[440,542,1],[521,566,1],[647,514,0],[521,561,1],[632,888,2],[66,704,0],[515,567,0],[524,696,1],[562,528,1],[206,896,1],[655,1117,2],[520,196,1],[530,541,4],[1208,583,4],[472,540,0],[526,499,4],[473,592,2],[516,649,1],[547,558,1],[694,798,3],[532,553,1],[775,901,2],[200,732,0],[521,639,1],[517,64,1],[757,65,1],[835,308,4],[522,608,2],[535,569,0],[577,577,1],[979,674,3],[527,633,1],[531,561,1],[945,611,3],[826,565,1],[532,601,1],[529,647,1],[72,73,1],[525,594,1],[652,536,5],[385,383,1],[571,702,2],[1279,70,3],[518,514,2],[634,382,2],[576,537,1],[519,582,1],[523,595,1],[545,500,1],[632,805,2],[516,531,1],[517,721,1],[585,521,2],[529,645,1],[516,789,1],[521,698,1],[472,547,0],[472,552,0],[525,515,1],[775,385,2],[596,538,0],[471,547,0],[554,984,2],[388,843,0],[518,760,2],[551,561,1],[524,514,1],[516,911,1],[470,591,2],[578,440,2],[199,515,0],[831,60,2],[65,704,0],[747,1019,3],[567,519,1],[517,620,1],[734,66,2],[539,549,0],[545,516,1],[524,605,1],[544,544,3],[705,65,4],[546,522,1],[63,688,1],[534,522,0],[550,550,3],[68,693,1],[55,55,1],[191,192,1],[555,729,2],[527,561,1],[650,516,1],[673,529,0],[840,65,1],[439,538,0],[616,548,1],[977,386,0],[943,564,1],[1317,61,3],[596,540,0],[534,519,0],[1338,387,0],[525,553,1],[562,500,1],[566,529,1],[530,643,1],[517,639,1],[555,526,2],[575,535,2],[593,520,2],[532,663,1],[313,311,1],[586,611,2],[968,207,2],[471,531,0],[527,543,1],[641,516,0],[780,544,3],[533,522,0],[691,390,2],[536,633,0],[598,521,0],[558,538,1],[681,383,2],[516,651,1],[519,577,1],[519,711,1],[389,391,1],[948,565,1],[938,310,2],[625,514,0],[530,621,1],[581,528,1],[628,193,2],[527,541,1],[533,523,0],[719,525,1],[515,658,0],[616,537,1],[660,838,2],[853,310,4],[523,592,1],[204,207,1],[532,542,1],[613,665,2],[567,530,1],[519,647,1],[749,618,4],[199,560,1],[527,732,1],[517,569,1],[989,550,3],[1104,199,1],[524,556,1],[552,547,1],[752,752,2],[516,664,1],[575,471,2],[184,184,1],[519,657,1],[66,921,0],[525,614,1],[632,202,2],[526,500,4],[558,549,1],[571,306,2],[716,716,2],[524,714,1],[735,522,3],[525,602,1],[578,524,2],[581,555,1],[603,472,1],[644,522,3],[314,842,0],[471,548,0],[518,606,2],[525,548,1],[520,671,1],[536,883,0],[525,514,1],[516,532,1],[799,65,2],[519,580,1],[533,514,0],[546,827,2],[1264,572,4],[686,69,2],[543,557,1],[673,519,0],[439,541,1],[562,517,1],[1021,549,2],[317,318,1],[468,468,1],[516,983,1],[71,1146,1],[516,726,1],[545,548,1],[642,519,0],[499,529,0],[525,64,1],[523,553,1],[1195,304,3],[532,834,1],[534,514,0],[769,65,2],[516,757,1],[798,200,3],[570,309,2],[802,523,0],[546,551,1],[690,62,2],[933,65,2],[584,555,1],[195,646,1],[530,598,4],[552,499,1],[546,304,2],[576,472,1],[532,662,1],[638,530,0],[59,58,1],[681,1190,2],[586,985,2],[516,1007,1],[528,870,1],[527,521,1],[535,630,0],[545,542,1],[523,555,1],[519,569,1],[520,515,1],[529,620,1],[182,183,1],[602,471,1],[71,74,1],[532,676,1],[580,472,1],[524,587,1],[60,57,1],[814,814,2],[518,607,2],[523,653,2],[523,578,1],[525,605,1],[596,528,0],[471,551,0],[685,524,1],[521,562,1],[534,517,0],[191,1137,1],[527,557,1],[681,997,2],[521,815,1],[1042,670,3],[519,697,1],[549,648,1],[525,540,1],[312,311,1],[552,663,1],[521,520,1],[691,1026,2],[920,589,4],[523,566,1],[552,654,1],[528,594,1],[522,947,1],[524,388,1],[548,522,1],[771,688,3],[519,575,1],[525,385,1],[558,500,1],[72,1146,1],[518,551,2],[442,443,2],[705,386,4],[499,551,0],[522,640,2],[537,577,0],[529,566,1],[187,188,1],[584,540,1],[525,748,1],[516,725,1],[874,300,2],[568,588,0],[531,500,1],[545,549,1],[524,309,2],[543,662,1],[515,644,0],[525,588,1],[555,585,2],[191,817,1],[729,65,4],[517,582,1],[940,65,2],[517,742,1],[728,634,3],[542,520,0],[516,774,1],[1376,308,0],[831,986,2],[711,523,0],[600,471,6],[61,62,1],[525,792,1],[565,826,5],[437,436,2],[538,654,1],[601,471,1],[524,564,1],[666,516,0],[525,639,1],[617,523,0],[520,839,1],[771,640,3],[618,856,2],[559,539,2],[621,621,1],[1313,518,2],[519,742,1],[523,963,1],[527,499,1],[795,918,2],[535,440,0],[660,702,2],[301,1016,1],[522,592,1],[528,595,1],[934,627,3],[547,654,1],[553,472,2],[655,945,2],[519,721,1],[769,66,2],[713,627,2],[575,517,2],[522,567,1],[750,551,0],[623,544,2],[305,865,1],[528,516,1],[538,524,1],[525,613,1],[520,759,1],[859,817,2],[573,311,2],[764,65,2],[525,554,1],[516,637,1],[521,604,1],[549,562,1],[519,564,1],[532,547,1],[1338,386,0],[600,472,6],[522,672,1],[594,439,2],[77,77,1],[573,804,1],[522,598,1],[629,520,0],[521,822,2],[593,517,2],[633,540,1],[522,580,1],[1153,204,2],[524,788,1],[579,1118,2],[303,305,1],[968,852,2],[607,472,1],[306,514,0],[191,194,1],[729,66,4],[474,708,2],[756,556,2],[785,693,3],[953,200,3],[529,595,4],[558,199,1],[1069,1069,4],[594,724,2],[209,1569,1],[517,657,1],[614,672,2],[569,499,1],[309,755,0],[645,542,4],[72,931,1],[538,523,1],[553,613,2],[600,529,6],[530,567,1],[555,517,2],[859,189,2],[552,306,1],[514,527,0],[530,647,1],[561,543,1],[577,540,1],[776,546,1],[1220,307,0],[699,202,2],[60,1211,1],[520,719,1],[566,519,1],[586,812,2],[440,529,0],[471,540,0],[802,530,0],[578,613,2],[759,571,1],[552,532,1],[545,562,1],[691,1236,2],[832,539,3],[517,617,1],[725,556,2],[530,625,1],[569,543,1],[606,471,1],[440,500,0],[541,541,1],[561,499,1],[841,64,3],[1448,74,2],[192,579,1],[687,687,2],[616,532,1],[660,660,1],[521,695,1],[605,472,1],[576,514,0],[683,525,1],[301,1093,0],[1229,501,2],[517,565,1],[186,189,1],[469,707,2],[531,598,1],[516,608,1],[569,630,1],[523,598,1],[785,653,3],[643,541,4],[439,499,0],[472,557,0],[548,524,1],[516,473,1],[820,66,1],[516,727,1],[523,527,1],[581,581,1],[71,69,1],[390,388,1],[525,851,1],[570,627,2],[626,521,0],[525,565,1],[634,997,2],[836,516,0],[591,621,1],[500,530,0],[522,527,1],[533,517,0],[545,676,1],[524,638,1],[594,537,2],[380,382,1],[620,620,1],[523,601,1],[1409,470,4],[531,557,1],[1257,574,4],[309,791,0],[201,560,1],[205,896,1],[524,550,1],[584,521,1],[67,677,0],[618,749,2],[675,520,1],[859,859,2],[553,471,2],[522,575,1],[201,199,1],[1012,387,0],[518,547,2],[578,472,2],[516,636,1],[799,66,2],[440,532,0],[647,524,1],[726,65,1],[556,1019,2],[601,521,1],[561,306,2],[59,1211,1],[807,807,2],[795,388,2],[586,962,2],[1079,1079,4],[553,614,2],[499,524,0],[523,540,1],[516,756,1],[1058,308,2],[584,584,1],[597,543,1],[522,555,1],[472,558,0],[195,703,0],[600,530,6],[557,551,1],[517,385,1],[520,776,1],[521,313,1],[567,529,1],[521,677,1],[559,674,2],[547,549,1],[641,391,2],[514,538,0],[595,520,0],[714,631,3],[534,523,0],[850,66,1],[551,548,1],[592,620,1],[552,524,1],[569,500,1],[713,521,0],[771,64,3],[654,544,3],[520,302,1],[545,532,1],[1429,516,1],[714,646,3],[529,629,1],[1020,314,2],[593,519,2],[709,709,2],[517,684,1],[439,561,0],[601,472,1],[196,579,1],[557,306,2],[811,65,2],[518,710,2],[658,524,3],[535,515,0],[554,519,0],[379,378,1],[499,548,0],[530,303,1],[499,543,0],[545,522,1],[636,438,1],[524,515,1],[572,61,2],[650,200,2],[700,700,2],[626,520,0],[584,528,1],[614,517,2],[1091,546,2],[802,521,0],[514,744,0],[516,730,1],[208,1097,1],[525,596,1],[564,828,5],[437,1775,1],[59,957,1],[519,639,1],[520,555,1],[553,585,2],[569,547,1],[564,943,1],[444,444,1],[591,520,0],[751,943,1],[784,308,4],[517,638,1],[542,529,0],[569,552,1],[574,70,2],[582,535,1],[971,521,0],[889,544,3],[389,1026,1],[518,796,2],[566,530,1],[516,194,1],[522,603,1],[442,1744,1],[587,521,1],[628,1118,2],[439,540,0],[208,1325,1],[679,535,1],[597,439,1],[745,745,2],[562,520,1],[312,609,0],[523,567,1],[532,734,1],[577,67,2],[595,521,0],[641,1026,2],[673,530,0],[527,546,1],[538,525,1],[523,576,1],[626,524,0],[647,570,2],[522,543,1],[701,594,2],[517,625,1],[630,439,1],[562,547,1],[531,516,1],[538,879,1],[743,852,2],[545,616,1],[659,858,2],[682,520,1],[610,305,2],[384,997,1],[539,514,0],[541,520,0],[578,517,2],[747,641,3],[500,525,0],[519,385,1],[802,529,0],[440,548,0],[634,516,0],[521,555,1],[540,499,1],[561,531,1],[522,63,2],[528,555,1],[525,887,1],[562,199,1],[541,530,0],[853,570,4],[551,676,1],[309,311,1],[521,633,1],[60,62,1],[209,1231,1],[500,548,0],[522,629,1],[528,547,1],[534,621,1],[637,441,1],[630,630,1],[603,520,1],[517,621,1],[537,677,0],[561,519,1],[728,1344,3],[538,697,1],[516,686,1],[537,606,0],[568,604,0],[528,499,1],[840,66,1],[312,723,0],[523,68,2],[684,632,3],[471,549,0],[471,546,0],[500,547,0],[521,310,1],[901,554,3],[811,66,2],[202,205,1],[439,552,0],[522,514,1],[439,545,0],[529,580,1],[594,540,2],[517,388,1],[918,556,3],[663,535,1],[520,669,1],[835,386,4],[642,617,2],[761,948,1],[995,544,3],[644,523,3],[533,620,1],[937,66,2],[657,657,3],[883,536,2],[835,387,4],[603,532,1],[576,532,1],[660,610,1],[629,524,0],[565,948,1],[471,532,0],[591,534,1],[619,1542,2],[440,543,0],[551,540,1],[440,540,0],[762,522,0],[518,516,2],[514,758,0]]} diff --git a/variants/sparse-high-dynamic-2bin/sparse_router_config.yaml b/variants/sparse-high-dynamic-2bin/sparse_router_config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ffd7e1c00b6f2ea87da0cd01ee04afbab685cf33 --- /dev/null +++ b/variants/sparse-high-dynamic-2bin/sparse_router_config.yaml @@ -0,0 +1,372 @@ +model_type: actioncodec2_sparse_router +config_version: 1 +profiles: +- name: joint + token_offset: 0 + token_budget: 4096 + artifact_fingerprint: 3f53194f7c6f7f8b63fe061efae9abb502c2edc10152f7fbe8101172b106851d +- name: eef + token_offset: 4096 + token_budget: 4096 + artifact_fingerprint: 94b1373b88fa1704ec553ff50aa10f782414e403e9ec0ec90bdd530b93246f88 +presets: +- name: dual_eef_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_eef_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_abs + input_dim: 16 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_delta + input_dim: 16 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper + input_dim: 6 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi +- name: single_joint6_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_abs + input_dim: 8 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_delta + input_dim: 8 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 diff --git a/variants/sparse-standard-21bin/config.json b/variants/sparse-standard-21bin/config.json new file mode 100644 index 0000000000000000000000000000000000000000..f7d16472edea73c2ca2aff65a40b062aff408c4a --- /dev/null +++ b/variants/sparse-standard-21bin/config.json @@ -0,0 +1,7 @@ +{ + "model_type": "actioncodec2_sparse", + "processor_class": "ActionCodec2Sparse", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-standard-21bin/processor_config.json b/variants/sparse-standard-21bin/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..b1ec8b351044eaac6c53ec754866abd50d881551 --- /dev/null +++ b/variants/sparse-standard-21bin/processor_config.json @@ -0,0 +1,61 @@ +{ + "processor_class": "ActionCodec2Sparse", + "action_space": "single_eef_delta", + "fitted_profiles": [ + "eef", + "joint" + ], + "preprocessing": { + "eef": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": [ + 0, + 1, + 2 + ], + "gripper_mode": "twenty", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "eef", + "context_frames": 1, + "motion_limits": null, + "translation_limit": 0.00125, + "rotation_limit": 0.005 + }, + "joint": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": null, + "gripper_mode": "twenty", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "joint", + "context_frames": 1, + "motion_limits": [ + 0.001, + 0.001, + 0.0015, + 0.001875, + 0.00375, + 0.005, + 0.005 + ], + "translation_limit": null, + "rotation_limit": null + } + }, + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-standard-21bin/profiles/eef/config.json b/variants/sparse-standard-21bin/profiles/eef/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/eef/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-standard-21bin/profiles/eef/config.yaml b/variants/sparse-standard-21bin/profiles/eef/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..38f1abec25a5ec198a2358b19038446954940108 --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/eef/config.yaml @@ -0,0 +1,78 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 7 + components: + translation_m: + dims: + start: 0 + stop: 3 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -2.0 + max: 2.0 + order_1: + min: -0.08 + max: 0.08 + distortion_limit: 0.005 + primitive_selection: smooth + orientation_so3: + dims: + start: 3 + stop: 6 + space: so3 + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -3.141592653589793 + max: 3.141592653589793 + order_1: + min: -0.25 + max: 0.25 + distortion_limit: 0.02 + primitive_selection: momentum_lazy + representation: rotation_vector + multiplication: right + gripper_open_command: + dims: + - 6 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.025 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - translation_m + - orientation_so3 + bpe: + spatial_vocab_size: 190 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-standard-21bin/profiles/eef/primitives.npz b/variants/sparse-standard-21bin/profiles/eef/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..b97c3d5b7e614182dbc85e9fdea08f0a3349503c --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/eef/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a58825a293cc387275a83005b84d7ff652c918449d40987e50ce2ed472ba7177 +size 3114 diff --git a/variants/sparse-standard-21bin/profiles/eef/processor_config.json b/variants/sparse-standard-21bin/profiles/eef/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/eef/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-standard-21bin/profiles/eef/sparse_bpe.json b/variants/sparse-standard-21bin/profiles/eef/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..88b2b9fb1d743effac573969867ac1b6e329e0d1 --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/eef/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[17,17,17,41,41,41,21],"zero":[8,8,8,20,20,20,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[189,189,1],[189,108,1],[189,107,1],[189,67,1],[189,68,1],[189,39,1],[190,190,2],[189,40,1],[191,40,1],[192,39,1],[189,148,1],[189,147,1],[8,8,2],[7,7,2],[23,23,2],[24,24,2],[147,147,1],[148,148,1],[189,8,1],[189,7,1],[190,39,2],[194,39,1],[193,39,1],[191,68,1],[191,67,1],[192,67,1],[193,40,1],[192,68,1],[189,23,1],[189,24,1],[194,40,1],[196,196,4],[190,40,2],[193,23,1],[203,203,4],[202,202,4],[194,24,1],[190,107,2],[69,69,1],[204,204,4],[66,66,1],[205,205,4],[190,67,2],[190,68,2],[198,67,1],[198,68,1],[191,39,1],[109,109,1],[192,40,1],[199,68,1],[195,148,1],[199,67,1],[106,106,1],[195,147,1],[190,108,2],[8,8,3],[203,7,4],[193,193,1],[197,147,1],[194,194,1],[196,190,4],[197,148,1],[23,193,0],[190,148,2],[24,194,0],[190,147,2],[202,8,4],[149,149,1],[146,146,1],[7,7,3],[192,192,1],[6,6,2],[191,191,1],[206,147,2],[204,23,4],[205,24,4],[207,148,2],[41,41,2],[9,9,2],[25,25,2],[22,22,2],[190,8,2],[192,8,1],[193,147,1],[190,195,2],[194,148,1],[192,199,1],[191,7,1],[192,195,1],[189,66,1],[189,69,1],[191,198,1],[197,109,1],[191,147,1],[190,23,2],[192,24,1],[192,23,1],[200,200,1],[201,201,1],[190,24,2],[191,148,1],[210,107,2],[38,38,2],[187,188,1],[193,8,1],[191,23,1],[7,7,4],[191,24,1],[192,148,1],[222,108,2],[192,147,1],[194,147,1],[195,106,1],[206,206,2],[193,148,1],[191,197,1],[207,207,2],[190,7,2],[194,8,1],[190,197,2],[191,8,1],[200,24,1],[201,23,1],[189,202,1],[195,8,1],[204,193,0],[40,108,0],[189,109,1],[198,198,1],[205,194,0],[196,39,4],[190,193,2],[190,194,2],[190,192,2],[39,188,0],[190,208,2],[189,106,1],[70,70,1],[215,40,1],[186,188,1],[65,65,1],[189,203,1],[201,8,1],[195,24,1],[190,200,2],[198,147,1],[39,169,0],[23,23,3],[194,7,1],[170,169,1],[192,7,1],[213,39,1],[200,8,1],[199,148,1],[217,40,1],[193,7,1],[190,201,2],[228,69,2],[198,148,1],[214,39,1],[189,179,1],[230,66,2],[189,180,1],[189,181,1],[199,192,1],[195,192,1],[189,178,1],[197,7,1],[190,209,2],[199,147,1],[189,182,1],[110,110,1],[201,24,1],[189,183,1],[189,184,1],[195,23,1],[105,105,1],[189,177,1],[190,218,2],[197,24,1],[190,191,2],[190,219,2],[171,189,0],[189,185,1],[189,149,1],[193,204,1],[189,146,1],[199,199,1],[200,207,2],[197,237,1],[194,205,1],[198,191,1],[201,206,2],[196,40,4],[189,176,1],[202,202,3],[189,172,1],[200,23,1],[197,23,1],[196,107,4],[67,188,0],[189,204,1],[67,169,0],[189,205,1],[68,188,0],[199,8,1],[200,7,1],[198,24,1],[68,169,0],[196,67,4],[201,7,1],[211,24,1],[261,6,4],[197,191,1],[196,68,4],[213,24,1],[228,228,2],[148,200,0],[199,24,1],[189,175,1],[198,7,1],[147,201,0],[192,193,1],[230,230,2],[197,8,1],[217,24,1],[242,242,2],[192,194,1],[195,7,1],[203,203,3],[191,193,1],[146,206,1],[189,173,1],[191,194,1],[149,207,1],[220,24,1],[189,174,1],[268,9,4],[201,193,1],[198,23,1],[196,8,4],[150,150,1],[210,67,2],[195,195,1],[267,41,4],[145,145,1],[229,193,0],[210,68,2],[200,194,1],[214,23,1],[216,23,1],[212,23,1],[231,194,0],[189,187,1],[237,109,2],[215,23,1],[189,224,1],[199,23,1],[196,108,4],[269,25,4],[193,24,1],[223,193,1],[189,186,1],[107,188,0],[226,194,1],[69,69,2],[216,147,1],[207,194,0],[66,66,2],[206,193,0],[211,148,1],[26,26,2],[270,22,4],[197,197,1],[242,106,2],[8,8,4],[40,169,0],[189,225,1],[211,194,1],[189,195,1],[257,149,2],[212,147,1],[214,214,1],[213,213,1],[215,215,1],[258,146,2],[217,217,1],[196,148,4],[189,170,1],[212,193,1],[222,67,2],[220,148,1],[196,147,4],[184,293,1],[201,194,1],[8,193,0],[200,193,1],[199,7,1],[108,169,0],[8,192,0],[107,169,0],[21,21,2],[8,191,0],[171,169,1],[203,6,4],[222,68,2],[210,148,2],[196,7,4],[204,204,3],[8,194,0],[195,194,1],[5,5,2],[197,189,1],[205,205,3],[195,193,1],[206,191,0],[216,193,1],[109,191,0],[196,23,4],[208,24,1],[7,194,0],[235,24,1],[196,24,4],[192,200,1],[220,194,1],[237,237,2],[210,147,2],[7,191,0],[189,230,1],[218,193,1],[189,228,1],[106,192,0],[219,194,1],[189,194,1],[189,193,1],[207,191,0],[192,201,1],[212,148,1],[9,202,2],[233,24,2],[195,200,1],[191,236,1],[69,194,0],[186,339,4],[66,193,0],[39,107,0],[239,24,1],[292,38,4],[196,195,4],[208,23,1],[7,193,0],[211,147,1],[108,188,0],[10,10,2],[170,329,4],[41,42,2],[207,192,0],[195,189,1],[232,23,2],[191,201,1],[189,293,1],[189,372,1],[198,8,1],[208,195,1],[206,192,0],[191,200,1],[220,147,1],[206,194,0],[193,223,1],[187,184,1],[171,174,1],[216,148,1],[257,257,2],[209,24,1],[192,238,1],[234,23,1],[258,258,2],[195,201,1],[194,226,1],[197,66,1],[197,193,1],[207,193,0],[194,23,1],[195,69,1],[68,170,0],[71,71,1],[195,227,1],[206,198,0],[209,23,1],[189,229,1],[195,242,1],[189,231,1],[189,197,1],[25,205,2],[188,196,0],[7,192,0],[222,147,2],[234,214,1],[109,198,0],[22,204,2],[149,200,0],[202,245,4],[8,24,0],[241,23,1],[197,194,1],[67,170,0],[261,261,4],[200,192,1],[336,107,0],[189,246,1],[6,203,2],[235,213,1],[193,218,1],[147,146,1],[195,66,1],[201,191,1],[201,192,1],[109,110,1],[197,69,1],[194,219,1],[200,191,1],[241,215,1],[195,208,1],[106,105,1],[192,210,1],[148,188,0],[239,217,1],[268,268,4],[8,23,0],[64,64,1],[222,148,2],[189,171,1],[193,212,1],[207,199,0],[196,210,4],[194,211,1],[181,185,1],[316,169,0],[207,198,0],[147,188,0],[196,197,4],[70,228,1],[191,41,1],[172,176,1],[200,195,1],[192,202,1],[65,230,1],[191,189,1],[106,199,0],[8,195,0],[148,149,1],[190,199,2],[7,24,0],[192,211,1],[192,189,1],[70,69,1],[146,201,0],[191,224,1],[201,195,1],[269,269,4],[192,212,1],[206,199,0],[38,37,2],[191,202,1],[65,66,1],[191,203,1],[42,42,2],[187,185,1],[200,240,1],[193,229,1],[7,197,0],[201,243,1],[223,147,1],[196,192,4],[196,208,4],[5,6,2],[196,209,4],[196,227,4],[196,193,4],[189,237,1],[226,148,1],[196,194,4],[191,216,1],[189,329,1],[202,9,4],[26,25,2],[196,222,4],[194,231,1],[173,183,2],[41,197,0],[215,241,1],[8,201,0],[197,201,1],[204,22,4],[194,191,1],[217,239,1],[193,192,1],[8,200,0],[324,107,0],[194,192,1],[214,234,1],[205,25,4],[7,23,0],[213,235,1],[270,270,4],[175,180,1],[104,104,1],[196,219,4],[196,218,4],[193,201,1],[191,195,1],[267,267,4],[24,192,0],[193,216,1],[194,200,1],[109,214,0],[106,215,0],[191,220,1],[197,200,1],[172,169,1],[21,22,2],[192,225,1],[193,191,1],[197,198,1],[106,217,0],[150,149,1],[195,199,1],[189,256,1],[7,200,0],[210,108,2],[40,188,0],[190,198,2],[67,168,0],[109,213,0],[24,191,0],[234,234,1],[189,242,1],[7,201,0],[194,220,1],[195,190,1],[183,173,2],[232,193,2],[196,200,4],[145,146,1],[192,203,1],[246,6,6],[24,200,0],[111,111,1],[209,197,1],[238,238,1],[233,194,2],[23,192,0],[199,194,1],[199,193,1],[196,232,4],[147,169,0],[188,250,0],[196,201,4],[202,8,5],[68,168,0],[207,195,0],[235,235,1],[189,201,1],[69,213,0],[179,174,1],[23,191,0],[189,192,1],[206,195,0],[189,200,1],[177,182,1],[210,192,2],[189,191,1],[204,247,0],[148,169,0],[66,214,0],[361,110,2],[196,233,4],[7,198,0],[23,201,0],[37,38,2],[211,192,1],[212,192,1],[196,191,4],[366,105,2],[8,147,0],[197,203,1],[66,215,0],[69,217,0],[197,244,1],[196,244,4],[205,249,0],[216,109,1],[202,245,1],[197,224,1],[189,257,1],[212,8,1],[24,193,0],[7,195,0],[8,148,0],[206,263,2],[189,258,1],[200,199,1],[246,203,5],[195,38,3],[198,193,1],[198,194,1],[236,191,1],[207,266,2],[220,109,1],[187,364,0],[194,195,1],[208,193,1],[197,209,1],[198,224,1],[10,9,2],[211,8,1],[7,148,0],[239,239,1],[243,201,1],[24,201,0],[240,200,1],[148,192,0],[179,483,1],[189,339,1],[226,147,1],[70,71,1],[236,147,1],[205,213,0],[550,189,1],[210,8,2],[184,185,2],[24,148,0],[241,241,1],[199,278,1],[247,193,2],[204,214,0],[195,202,1],[206,197,0],[148,194,0],[222,107,2],[216,191,1],[194,201,1],[238,192,1],[182,177,1],[198,203,1],[230,189,0],[211,7,1],[220,191,1],[227,67,2],[148,191,0],[198,201,1],[189,188,1],[215,8,1],[199,201,1],[330,65,2],[227,68,2],[216,8,1],[193,195,1],[228,189,0],[197,225,1],[218,232,1],[192,190,1],[42,41,2],[7,147,0],[175,493,1],[248,201,1],[249,194,2],[237,110,2],[108,168,0],[193,200,1],[198,197,1],[192,240,1],[250,147,6],[189,169,1],[211,211,1],[208,190,1],[212,212,1],[219,233,1],[207,149,2],[23,200,0],[150,257,1],[146,263,1],[227,195,2],[24,195,0],[220,7,1],[251,200,1],[217,8,1],[223,148,1],[324,108,0],[250,148,6],[238,147,1],[193,189,1],[199,38,3],[256,202,5],[23,194,0],[216,7,1],[203,261,4],[107,168,0],[198,200,1],[232,108,2],[214,147,1],[108,170,0],[214,8,1],[204,215,0],[145,258,1],[198,41,3],[213,7,1],[216,216,1],[260,195,2],[204,201,0],[192,243,1],[25,461,2],[200,189,1],[190,223,2],[212,7,1],[252,147,1],[207,197,0],[194,189,1],[233,108,2],[145,144,1],[292,292,4],[150,151,1],[199,200,1],[250,23,6],[185,181,1],[192,208,1],[219,195,1],[213,8,1],[217,205,1],[191,222,1],[218,195,1],[242,105,2],[253,200,2],[236,148,1],[215,147,1],[214,7,1],[188,221,0],[191,248,1],[250,24,6],[197,202,1],[327,327,2],[191,225,1],[149,266,1],[199,195,1],[250,7,6],[250,8,6],[180,181,1],[212,106,1],[199,276,1],[255,201,2],[208,194,1],[678,178,1],[190,226,2],[211,106,1],[219,69,1],[218,66,1],[185,293,1],[170,172,1],[23,195,0],[234,147,1],[201,189,1],[206,146,2],[264,193,0],[192,205,1],[320,107,4],[220,8,1],[240,24,1],[210,24,2],[203,246,3],[350,352,1],[40,170,0],[204,216,0],[22,491,2],[198,305,1],[191,66,1],[229,216,0],[65,64,1],[209,194,1],[191,205,1],[197,190,1],[250,195,6],[198,281,1],[217,7,1],[207,211,0],[23,147,0],[189,265,1],[223,8,1],[209,6,3],[200,205,1],[192,66,1],[206,212,0],[210,227,2],[206,215,0],[231,213,0],[67,171,0],[197,106,1],[68,171,0],[217,194,1],[247,147,2],[209,195,1],[189,70,1],[201,197,1],[190,252,2],[191,251,1],[238,148,1],[208,192,1],[202,202,5],[9,543,2],[220,220,1],[730,178,1],[192,69,1],[178,177,1],[214,193,1],[224,203,3],[200,149,2],[191,69,1],[217,148,1],[254,148,1],[22,21,2],[247,218,2],[39,168,0],[187,373,0],[215,7,1],[201,248,1],[25,26,2],[189,41,1],[206,216,0],[213,148,1],[202,256,3],[171,695,1],[237,197,0],[191,190,1],[265,194,0],[219,200,1],[226,7,1],[68,172,0],[67,172,0],[192,245,1],[206,214,0],[231,220,0],[189,264,1],[109,235,0],[210,23,2],[201,199,1],[208,200,1],[213,194,1],[350,356,1],[185,188,1],[107,170,0],[209,193,1],[192,224,1],[207,217,0],[251,24,1],[673,189,1],[204,191,0],[231,249,0],[190,254,2],[204,212,0],[215,193,1],[225,225,1],[201,146,2],[232,8,2],[226,8,1],[210,208,2],[218,201,1],[182,183,1],[104,105,1],[176,709,1],[202,268,4],[191,208,1],[148,193,0],[229,247,0],[191,209,1],[213,147,1],[266,149,3],[229,214,0],[249,219,2],[227,24,2],[211,205,1],[250,197,6],[200,197,1],[207,213,0],[189,65,1],[111,110,1],[37,37,2],[199,203,1],[330,330,2],[263,146,3],[227,8,2],[106,241,0],[200,251,1],[193,197,1],[6,501,2],[204,234,0],[39,170,0],[250,209,6],[192,197,1],[242,195,0],[236,236,1],[239,205,1],[109,361,1],[250,192,6],[169,221,0],[247,8,2],[217,147,1],[201,198,1],[192,38,1],[223,7,1],[23,197,0],[218,190,1],[243,23,1],[10,268,2],[67,173,0],[191,214,1],[227,23,2],[106,366,1],[232,147,2],[109,234,0],[219,190,1],[189,168,1],[256,9,6],[192,204,1],[41,198,0],[208,201,1],[236,24,1],[68,173,0],[244,24,2],[208,191,1],[192,215,1],[228,347,2],[205,220,0],[265,25,6],[193,202,1],[191,259,1],[200,69,1],[264,22,6],[106,239,0],[230,351,2],[327,70,2],[40,168,0],[194,197,1],[194,203,1],[193,199,1],[248,23,1],[633,626,2],[201,66,1],[204,198,0],[296,6,2],[224,224,1],[189,209,1],[207,220,0],[233,8,2],[191,213,1],[144,144,1],[151,151,1],[178,179,1],[250,193,6],[249,148,2],[194,199,1],[372,174,1],[254,147,1],[191,246,1],[8,188,0],[229,234,0],[171,170,1],[353,360,1],[253,24,2],[7,203,3],[197,222,1],[212,24,1],[195,219,1],[205,235,0],[192,217,1],[216,237,1],[231,235,0],[195,218,1],[208,210,1],[192,209,1],[200,198,1],[189,208,1],[657,181,2],[189,199,1],[244,191,2],[176,172,1],[6,246,2],[5,261,2],[244,23,2],[24,147,0],[250,194,6],[200,203,1],[250,218,6],[195,225,1],[294,193,1],[288,201,2],[198,66,1],[191,206,1],[551,169,2],[280,194,1],[287,200,2],[336,68,0],[24,188,0],[186,182,1],[67,174,0],[250,219,6],[198,69,1],[364,293,2],[220,237,1],[218,197,1],[384,386,1],[23,188,0],[279,193,1],[195,203,1],[146,146,2],[199,202,1],[336,67,0],[249,8,2],[245,193,0],[238,225,1],[240,192,1],[170,386,0],[191,207,1],[241,147,1],[443,364,1],[192,207,1],[171,173,1],[72,72,1],[233,148,2],[232,218,2],[180,179,1],[250,208,6],[195,210,1],[223,22,3],[190,278,2],[68,174,0],[255,23,2],[149,149,2],[262,197,2],[226,25,3],[222,7,2],[240,8,1],[243,24,1],[206,211,0],[7,199,0],[8,197,0],[215,148,1],[219,197,1],[209,192,1],[198,202,1],[243,8,1],[195,191,1],[244,197,2],[214,148,1],[250,200,6],[171,175,1],[372,169,1],[195,205,1],[222,191,2],[196,316,4],[193,225,1],[229,201,0],[208,197,1],[109,236,0],[544,173,1],[189,38,1],[227,192,2],[233,219,2],[63,63,1],[106,238,0],[353,373,1],[199,69,1],[308,194,1],[243,192,1],[215,204,1],[235,148,1],[227,199,2],[193,203,1],[24,197,0],[201,203,1],[9,256,2],[559,180,2],[178,183,1],[206,213,0],[201,202,1],[560,812,2],[207,212,0],[239,148,1],[206,241,0],[206,234,0],[40,392,0],[250,201,6],[209,191,1],[207,239,0],[200,202,1],[210,190,2],[252,148,1],[146,303,1],[209,201,1],[191,245,1],[27,27,1],[194,202,1],[215,24,1],[249,7,2],[222,24,2],[316,170,0],[316,188,0],[217,195,1],[189,267,1],[194,198,1],[227,147,2],[207,214,0],[189,219,1],[43,43,1],[189,218,1],[209,200,1],[186,360,0],[229,215,0],[363,356,1],[198,214,1],[208,66,1],[191,267,1],[192,206,1],[367,356,1],[23,148,0],[194,224,1],[248,24,1],[282,110,2],[211,200,1],[244,147,2],[222,23,2],[193,214,1],[209,69,1],[220,205,1],[231,200,0],[197,41,3],[149,306,1],[435,435,2],[201,205,1],[244,8,2],[204,192,0],[431,431,2],[236,23,1],[215,195,1],[350,426,1],[249,147,2],[233,147,2],[5,4,2],[192,218,1],[204,200,0],[216,229,1],[26,269,2],[324,68,0],[813,189,1],[213,205,1],[209,190,1],[199,205,1],[198,206,1],[235,7,1],[240,23,1],[208,218,1],[25,265,2],[206,217,0],[20,20,1],[211,254,1],[201,263,2],[197,218,1],[40,398,0],[324,67,0],[192,219,1],[233,7,2],[559,754,2],[22,264,2],[234,8,1],[228,200,0],[228,191,0],[260,8,2],[198,213,1],[193,198,1],[208,219,1],[245,194,0],[189,347,1],[204,189,0],[199,66,1],[315,189,1],[208,189,1],[551,170,2],[260,24,2],[198,189,1],[229,197,0],[225,193,0],[65,351,1],[207,215,0],[212,242,1],[212,201,1],[247,7,2],[207,235,0],[262,24,2],[274,8,3],[238,24,1],[241,8,1],[231,217,0],[194,225,1],[245,195,0],[218,189,1],[241,7,1],[198,235,1],[194,213,1],[218,192,1],[198,277,1],[198,216,1],[211,199,1],[208,69,1],[633,182,2],[252,8,1],[204,197,0],[211,23,1],[443,184,2],[237,189,0],[191,231,1],[209,66,1],[70,575,1],[455,70,1],[299,68,2],[299,67,2],[227,148,2],[197,205,1],[197,219,1],[204,195,0],[458,65,1],[560,179,2],[253,8,2],[291,68,2],[198,234,1],[201,190,1],[218,200,1],[242,189,0],[9,10,2],[228,192,0],[198,246,1],[194,217,1],[248,191,1],[214,24,1],[206,223,0],[198,282,1],[230,191,0],[199,272,1],[232,7,2],[230,201,0],[187,183,1],[200,266,2],[190,240,2],[198,220,1],[211,217,1],[219,189,1],[361,361,2],[239,7,1],[236,8,1],[41,216,0],[229,189,0],[176,386,0],[207,226,0],[198,259,1],[198,225,1],[219,192,1],[199,225,1],[199,189,1],[70,347,1],[193,264,1],[244,7,2],[255,24,2],[224,191,0],[213,341,1],[356,363,1],[197,192,1],[319,189,1],[244,148,2],[216,214,1],[186,187,5],[251,23,1],[257,189,0],[193,215,1],[253,23,2],[250,191,6],[197,281,1],[274,192,3],[392,108,0],[219,201,1],[195,209,1],[255,8,2],[211,226,1],[247,223,2],[262,23,2],[234,7,1],[232,148,2],[247,148,2],[398,108,0],[212,199,1],[260,23,2],[190,212,2],[173,409,0],[291,67,2],[533,173,3],[216,24,1],[302,105,2],[220,231,1],[194,265,1],[189,406,1],[210,200,2],[182,183,2],[353,352,1],[195,245,1],[198,248,1],[235,8,1],[220,213,1],[209,189,1],[190,452,2],[8,169,0],[229,191,0],[251,7,1],[262,147,2],[214,349,1],[38,199,0],[229,192,0],[211,242,1],[239,8,1],[366,366,2],[501,6,4],[238,23,1],[212,252,1],[208,199,1],[224,197,0],[211,195,1],[193,109,1],[204,270,4],[258,189,0],[170,173,1],[205,269,4],[219,25,3],[249,226,2],[198,207,1],[201,69,1],[65,619,1],[21,270,2],[191,218,1],[38,195,0],[212,223,1],[192,231,1],[212,195,1],[203,203,5],[215,201,1],[184,187,1],[235,147,1],[533,999,1],[7,169,0],[352,409,1],[212,204,1],[398,107,0],[461,25,4],[444,110,3],[185,353,0],[254,8,1],[24,169,0],[191,219,1],[216,252,1],[224,194,0],[191,263,1],[367,422,1],[200,190,1],[260,147,2],[200,66,1],[227,210,2],[199,217,1],[248,7,1],[197,231,1],[218,22,3],[202,193,0],[261,203,4],[230,192,0],[328,215,1],[259,194,0],[190,243,2],[193,224,1],[188,195,0],[251,191,1],[209,222,1],[195,109,1],[232,252,2],[291,192,2],[249,205,2],[23,169,0],[212,215,1],[392,107,0],[146,258,2],[195,276,1],[217,200,1],[339,189,0],[218,191,1],[181,373,0],[179,426,0],[232,223,2],[219,208,1],[385,245,4],[317,110,2],[36,36,1],[216,223,1],[192,266,1],[206,220,0],[214,201,1],[197,208,1],[65,413,1],[254,7,1],[185,180,1],[626,293,2],[233,226,2],[217,23,1],[286,147,1],[236,7,1],[194,106,1],[244,198,2],[443,373,1],[262,191,2],[194,109,1],[199,215,1],[287,24,2],[218,208,1],[149,257,2],[238,8,1],[193,106,1],[198,205,1],[544,941,1],[216,204,1],[491,22,4],[231,211,0],[213,200,1],[7,221,0],[197,246,1],[272,199,1],[219,191,1],[217,344,1],[41,237,0],[390,107,0],[169,168,1],[70,406,1],[192,263,1],[216,201,1],[189,351,1],[190,245,2],[225,202,3],[240,7,1],[174,177,2],[262,7,2],[192,246,1],[200,224,1],[200,208,1],[178,422,0],[229,212,0],[69,327,1],[183,181,1],[326,105,2],[364,818,1],[199,207,1],[201,208,1],[210,7,2],[329,189,0],[209,218,1],[7,188,0],[190,211,2],[464,105,3],[394,107,0],[193,208,1],[282,24,1],[191,266,1],[267,267,1],[200,219,1],[220,23,1],[259,193,0],[186,183,1],[190,288,2],[226,211,1],[254,205,1],[248,8,1],[290,24,1],[9,9,3],[182,363,0],[271,195,2],[201,218,1],[240,194,1],[207,216,0],[227,7,2],[367,360,1],[198,251,1],[198,231,1],[285,148,1],[379,197,1],[262,148,2],[184,182,1],[223,212,1],[104,103,1],[264,204,5],[214,197,1],[272,147,1],[209,219,1],[229,200,0],[225,202,1],[239,147,1],[272,24,1],[260,148,2],[245,192,0],[277,147,1],[190,287,2],[285,147,1],[41,109,0],[478,386,1],[190,247,2],[312,201,1],[172,384,0],[213,23,1],[203,194,0],[271,24,2],[262,8,2],[271,23,2],[201,224,1],[178,363,0],[210,193,2],[233,254,2],[195,260,1],[188,193,0],[350,174,2],[220,226,1],[426,384,1],[231,189,0],[272,192,1],[201,225,1],[338,194,1],[364,360,1],[318,147,2],[40,147,0],[184,185,3],[210,194,2],[175,352,0],[189,413,1],[205,200,0],[251,8,1],[243,7,1],[220,254,1],[66,330,1],[188,194,0],[198,295,1],[285,199,1],[104,366,1],[243,193,1],[197,259,1],[228,327,2],[535,170,0],[205,211,0],[202,195,0],[545,42,4],[241,148,1],[199,286,1],[452,360,1],[225,194,0],[188,190,0],[222,244,2],[277,191,1],[212,200,1],[260,192,2],[283,23,1],[213,197,1],[189,211,1],[195,146,1],[225,192,0],[224,193,0],[311,200,1],[349,214,1],[222,8,2],[267,41,1],[199,206,1],[215,328,1],[245,191,0],[204,279,0],[202,194,0],[303,263,4],[108,171,0],[70,280,0],[210,201,2],[38,38,3],[341,213,1],[288,23,2],[1036,367,2],[195,292,3],[238,197,1],[229,198,0],[148,168,0],[203,193,0],[283,24,1],[560,180,2],[190,249,2],[198,297,1],[202,191,0],[111,361,1],[147,168,0],[232,201,2],[345,193,1],[833,172,2],[189,212,1],[230,200,0],[234,148,1],[204,241,0],[203,205,0],[252,7,1],[277,24,1],[41,41,3],[199,208,1],[204,273,0],[230,197,0],[253,194,2],[310,191,1],[276,8,2],[272,23,1],[195,149,1],[236,194,1],[238,7,1],[195,211,1],[190,305,2],[204,230,0],[220,200,1],[286,148,1],[223,216,1],[278,8,2],[306,266,4],[344,217,1],[218,209,1],[225,191,0],[289,233,2],[272,195,1],[199,302,1],[265,205,5],[277,148,1],[224,189,0],[295,191,1],[272,148,1],[201,109,1],[284,232,2],[192,228,1],[186,187,1],[148,170,0],[147,170,0],[255,193,2],[223,201,1],[231,197,0],[169,195,0],[199,212,1],[191,235,1],[233,200,2],[199,285,1],[394,108,0],[199,211,1],[208,232,1],[192,232,1],[518,189,1],[575,71,2],[72,71,1],[66,216,0],[520,189,1],[657,180,2],[270,270,3],[274,227,3],[191,228,1],[195,212,1],[199,240,1],[253,7,2],[268,268,3],[192,256,1],[65,279,0],[208,9,3],[192,252,1],[11,11,2],[367,182,2],[111,112,1],[236,193,1],[364,550,1],[200,211,1],[201,211,1],[190,262,2],[225,197,0],[193,242,1],[190,248,2],[190,202,2],[199,239,1],[224,246,3],[149,150,1],[198,263,1],[214,191,1],[306,207,4],[277,23,1],[217,231,1],[170,174,1],[108,172,0],[199,241,1],[215,200,1],[177,360,0],[193,315,1],[192,239,1],[216,197,1],[545,656,4],[282,23,1],[191,211,1],[41,267,1],[199,245,1],[194,319,1],[372,170,1],[193,237,1],[678,177,1],[64,330,1],[257,470,2],[303,206,4],[223,247,1],[1145,936,2],[222,209,2],[293,189,0],[189,493,1],[269,269,3],[192,259,1],[190,216,2],[198,283,1],[191,234,1],[192,241,1],[69,220,0],[191,226,1],[276,24,2],[40,148,0],[146,145,1],[225,195,0],[261,261,3],[544,422,0],[372,173,1],[189,315,1],[200,109,1],[240,193,1],[7,6,2],[255,7,2],[69,211,0],[149,431,1],[192,254,1],[281,147,2],[188,200,0],[107,171,0],[297,191,1],[203,203,1],[219,209,1],[198,290,1],[243,194,1],[390,108,0],[202,202,1],[208,227,1],[192,233,1],[192,274,1],[225,189,0],[224,203,1],[188,201,0],[179,352,0],[191,254,1],[258,475,2],[280,213,1],[230,198,0],[281,24,2],[197,299,1],[236,195,1],[66,212,0],[192,226,1],[302,24,1],[652,37,4],[190,259,2],[291,8,2],[246,246,3],[214,204,1],[245,201,0],[191,252,1],[146,435,1],[273,8,1],[192,230,1],[220,197,1],[185,363,0],[189,319,1],[214,200,1],[205,265,3],[328,328,1],[1055,820,3],[191,212,1],[248,193,1],[194,242,1],[350,483,2],[280,275,1],[318,148,2],[247,204,2],[188,208,0],[172,175,1],[226,249,1],[198,266,1],[192,223,1],[197,216,1],[23,232,0],[286,199,1],[217,201,1],[191,204,1],[367,386,1],[194,208,1],[280,205,1],[194,237,1],[23,221,0],[274,24,3],[191,223,1],[277,198,1],[40,390,0],[228,201,0],[200,106,1],[198,209,1],[281,7,2],[190,251,2],[201,212,1],[108,174,0],[551,174,2],[267,267,3],[229,279,0],[213,201,1],[4,4,2],[107,172,0],[218,247,1],[286,192,1],[227,193,2],[245,200,0],[253,195,2],[199,243,1],[200,209,1],[368,193,3],[194,209,1],[7,203,1],[224,198,0],[191,233,1],[211,189,1],[202,256,1],[231,192,0],[327,71,2],[190,294,2],[285,192,1],[67,175,0],[41,282,0],[201,209,1],[188,218,0],[24,221,0],[191,232,1],[201,204,1],[189,416,1],[226,220,1],[231,191,0],[229,273,0],[219,249,1],[40,394,0],[190,260,2],[405,213,1],[316,392,0],[206,235,0],[1252,759,2],[217,192,1],[195,271,1],[199,266,1],[227,194,2],[217,211,1],[8,202,1],[216,225,1],[269,461,4],[197,220,1],[103,103,1],[231,201,0],[180,353,0],[190,220,2],[63,64,1],[199,260,1],[544,172,1],[66,234,0],[178,173,1],[6,665,2],[39,147,0],[229,241,0],[276,147,2],[275,8,1],[195,323,1],[204,264,3],[195,224,1],[200,225,1],[188,219,0],[201,219,1],[200,233,1],[543,9,4],[169,196,0],[188,192,0],[23,208,0],[197,262,1],[959,1155,2],[294,148,1],[303,303,4],[38,38,1],[215,212,1],[384,356,1],[24,233,0],[201,227,1],[200,218,1],[183,293,1],[201,232,1],[216,189,1],[230,195,0],[212,189,1],[191,256,1],[199,298,1],[195,240,1],[197,213,1],[215,192,1],[25,25,3],[187,363,0],[209,203,4],[190,186,2],[201,106,1],[207,223,0],[200,212,1],[22,193,0],[200,227,1],[246,203,3],[170,1134,1],[200,232,1],[292,292,1],[201,237,1],[279,214,1],[69,239,0],[379,110,3],[253,193,2],[331,6,5],[244,193,2],[299,147,2],[192,255,1],[192,175,1],[341,24,1],[172,409,0],[316,398,0],[191,229,1],[371,194,3],[207,241,0],[228,195,0],[244,194,2],[300,193,1],[280,217,1],[181,179,1],[197,149,1],[621,170,2],[68,175,0],[189,330,1],[193,263,1],[213,191,1],[225,9,3],[107,173,0],[41,41,1],[276,23,2],[533,183,1],[306,306,4],[199,224,1],[150,470,1],[279,273,1],[290,23,1],[197,229,1],[282,8,1],[194,266,1],[203,246,1],[278,24,2],[291,147,2],[108,173,0],[281,23,2],[226,200,1],[314,24,1],[195,243,1],[206,226,0],[208,233,1],[69,235,0],[295,8,1],[200,237,1],[209,259,4],[210,271,2],[217,240,1],[199,343,1],[435,145,2],[205,228,0],[206,239,0],[190,296,2],[598,68,0],[211,201,1],[195,272,1],[275,194,1],[218,321,1],[255,194,2],[1019,483,3],[178,367,0],[213,231,1],[207,234,0],[309,7,3],[297,8,1],[190,203,2],[208,106,1],[415,217,1],[189,198,1],[399,23,4],[209,261,3],[404,24,4],[201,252,1],[344,24,1],[268,202,4],[189,327,1],[199,263,1],[619,64,2],[197,238,1],[197,146,1],[248,109,1],[192,253,1],[201,233,1],[205,191,0],[281,148,2],[193,66,2],[208,244,1],[288,24,2],[68,187,0],[210,219,2],[562,257,4],[185,182,1],[195,232,1],[199,300,1],[181,360,0],[220,224,1],[195,266,1],[206,236,0],[192,229,1],[216,200,1],[107,174,0],[251,194,1],[109,290,0],[109,283,0],[287,8,2],[197,263,1],[198,229,1],[279,215,1],[318,24,2],[566,258,4],[201,247,1],[208,245,4],[219,322,1],[214,216,1],[270,270,1],[298,194,1],[39,148,0],[336,108,0],[200,244,1],[8,221,0],[201,244,1],[200,231,1],[200,249,1],[201,223,1],[201,216,1],[41,234,0],[197,204,1],[259,191,0],[69,70,1],[251,109,1],[195,253,1],[220,189,1],[188,232,0],[210,218,2],[209,233,1],[215,225,1],[195,204,1],[25,675,2],[200,254,1],[67,187,0],[193,284,1],[205,192,0],[328,23,1],[275,7,1],[380,249,1],[375,247,1],[235,205,1],[197,266,1],[8,202,3],[189,236,1],[38,292,1],[291,148,2],[6,6,3],[190,272,2],[598,67,0],[190,373,2],[215,243,1],[197,214,1],[193,209,1],[213,220,1],[626,188,2],[198,228,1],[384,172,2],[174,493,1],[200,204,1],[194,289,1],[190,308,2],[211,231,1],[311,8,1],[302,23,1],[195,263,1],[288,8,2],[193,245,1],[213,224,1],[276,148,2],[186,187,6],[216,198,1],[291,24,2],[40,171,0],[199,228,1],[169,197,0],[212,202,1],[66,241,0],[200,226,1],[212,218,1],[230,330,2],[106,298,0],[192,247,1],[421,146,3],[237,444,2],[239,194,1],[260,7,2],[41,220,0],[205,217,0],[246,194,0],[220,201,1],[344,344,1],[195,256,1],[252,22,2],[190,286,2],[439,214,1],[1306,422,2],[197,277,1],[320,68,4],[356,367,1],[190,313,2],[191,249,1],[244,222,2],[189,216,1],[188,210,0],[401,148,1],[478,422,1],[424,149,3],[431,150,2],[242,366,2],[188,227,0],[207,236,0],[274,23,3],[66,65,1],[211,219,1],[295,198,1],[292,38,1],[285,7,1],[197,228,1],[241,24,1],[208,196,1],[201,273,1],[303,146,4],[195,217,1],[320,67,4],[190,312,2],[195,233,1],[305,7,2],[145,475,1],[214,224,1],[283,193,1],[189,240,1],[264,234,0],[195,416,1],[199,204,1],[231,25,3],[413,230,4],[238,193,1],[284,7,2],[356,422,1],[353,409,1],[188,209,0],[191,255,1],[213,405,1],[440,147,1],[259,197,0],[191,253,1],[182,329,1],[195,255,1],[199,359,1],[224,192,0],[282,7,1],[200,275,1],[234,24,1],[175,176,1],[224,246,1],[195,278,1],[290,194,1],[225,256,3],[205,69,0],[269,269,1],[198,204,1],[321,218,3],[283,8,1],[348,24,1],[214,229,1],[210,210,2],[238,564,1],[238,194,1],[219,211,1],[188,233,0],[197,248,1],[190,310,2],[192,249,1],[195,215,1],[189,243,1],[318,23,2],[314,23,1],[203,191,0],[306,149,4],[759,329,2],[434,267,1],[445,215,1],[533,730,1],[68,176,0],[218,212,1],[9,9,4],[198,317,1],[190,285,2],[301,8,1],[219,210,1],[287,23,2],[273,193,1],[959,353,2],[190,311,2],[209,232,1],[235,231,1],[6,5,2],[191,247,1],[188,197,0],[191,505,1],[190,820,2],[192,196,1],[195,105,1],[198,577,1],[364,185,3],[195,291,1],[209,109,1],[185,183,1],[212,225,1],[261,501,4],[198,262,1],[360,352,1],[189,105,1],[112,112,1],[208,274,1],[198,222,1],[184,180,1],[263,247,0],[312,8,1],[188,271,0],[195,207,1],[205,201,0],[177,172,1],[289,7,2],[209,244,1],[286,7,1],[245,199,0],[185,187,1],[201,229,1],[273,7,1],[211,202,1],[217,415,1],[200,247,1],[200,220,1],[256,193,0],[352,426,1],[441,147,1],[152,152,1],[195,236,1],[268,543,4],[350,936,2],[22,710,2],[316,168,0],[277,197,1],[292,292,3],[222,194,2],[209,227,1],[203,192,0],[216,224,1],[222,193,2],[322,219,3],[332,201,1],[235,194,1],[179,936,1],[215,229,1],[349,23,1],[39,171,0],[106,300,0],[248,194,1],[189,220,1],[267,42,4],[195,196,1],[280,301,1],[264,214,0],[24,394,0],[290,8,1],[426,409,1],[208,202,4],[266,249,0],[191,525,1],[37,769,2],[406,228,4],[278,23,2],[240,106,1],[106,328,0],[197,110,1],[211,265,1],[299,7,2],[343,24,1],[186,363,0],[257,194,0],[217,225,1],[325,24,3],[200,223,1],[276,192,2],[315,22,4],[331,203,4],[39,108,0],[252,204,1],[193,459,1],[260,199,2],[67,176,0],[197,251,1],[40,172,0],[169,194,0],[189,25,1],[362,201,1],[299,191,2],[190,205,2],[332,24,1],[197,305,1],[218,210,1],[220,198,1],[243,106,1],[319,7,1],[231,231,1],[200,242,1],[202,192,0],[9,804,2],[206,238,0],[309,191,3],[220,225,1],[169,193,0],[551,173,2],[189,110,1],[264,216,0],[299,148,2],[195,206,1],[234,229,1],[251,193,1],[198,310,1],[201,249,1],[335,23,1],[169,192,0],[246,193,0],[254,211,1],[246,203,1],[200,259,1],[239,265,1],[466,147,0],[41,235,0],[191,265,1],[304,193,1],[210,323,2],[177,356,0],[282,198,1],[352,373,1],[186,181,1],[194,245,1],[208,289,1],[151,431,1],[170,422,0],[209,198,1],[222,222,2],[194,259,1],[383,68,4],[212,38,3],[200,245,1],[208,255,1],[196,199,4],[291,23,2],[313,202,4],[239,23,1],[169,209,0],[201,245,1],[275,205,1],[186,184,1],[194,69,2],[297,198,1],[790,189,1],[383,67,4],[302,7,1],[342,200,1],[232,24,2],[185,841,0],[257,431,2],[192,265,1],[234,193,1],[298,193,1],[909,144,2],[204,232,0],[452,182,2],[192,554,1],[263,258,3],[214,248,1],[219,227,1],[39,172,0],[218,227,1],[288,288,2],[914,1057,2],[265,213,0],[299,24,2],[195,259,1],[199,340,1],[316,171,0],[195,286,1],[204,66,0],[208,253,1],[199,210,1],[402,402,1],[262,262,2],[192,216,1],[190,183,2],[535,168,0],[214,439,1],[237,361,2],[188,284,0],[197,230,1],[23,390,0],[201,226,1],[206,247,0],[190,277,2],[207,238,0],[219,253,1],[191,230,1],[425,148,1],[241,204,1],[199,256,1],[201,231,1],[311,7,1],[199,246,1],[219,193,1],[169,250,0],[224,200,0],[201,283,1],[357,24,1],[252,212,1],[270,491,4],[195,285,1],[22,22,1],[217,265,1],[241,193,1],[188,289,0],[190,297,2],[191,243,1],[192,546,1],[26,27,2],[197,206,1],[318,198,2],[257,150,2],[377,24,2],[190,295,2],[208,284,1],[318,7,2],[194,457,1],[222,201,2],[178,174,1],[208,109,1],[335,24,1],[145,566,1],[191,240,1],[216,218,1],[279,204,1],[309,244,3],[195,246,1],[143,143,1],[40,107,0],[325,23,3],[220,203,1],[224,6,3],[533,1792,1],[300,194,1],[197,242,1],[784,189,1],[190,236,2],[210,209,2],[324,147,0],[190,331,2],[211,225,1],[207,249,0],[215,445,1],[239,200,1],[172,174,1],[205,189,0],[256,202,3],[194,246,1],[197,245,1],[302,199,1],[197,295,1],[248,198,1],[234,204,1],[191,317,1],[200,236,1],[169,222,0],[287,287,2],[195,469,1],[227,200,2],[290,193,1],[411,169,0],[186,833,1],[201,258,2],[545,41,4],[195,228,1],[315,7,1],[320,8,4],[25,194,0],[213,251,1],[330,64,2],[1001,1630,3],[201,301,1],[373,363,1],[211,38,3],[320,192,4],[188,255,0],[191,434,1],[189,9,1],[271,193,2],[309,23,3],[309,24,3],[305,24,2],[282,234,1],[229,22,3],[218,255,1],[264,212,0],[177,422,0],[241,201,1],[341,341,1],[282,235,1],[266,257,3],[267,656,4],[259,198,0],[240,199,1],[188,191,0],[264,215,0],[197,232,1],[192,326,1],[437,24,2],[2067,759,2],[189,515,1],[183,329,1],[7,219,0],[146,273,0],[200,252,1],[201,220,1],[146,603,1],[261,665,4],[299,23,2],[200,304,1],[229,195,0],[197,207,1],[224,213,0],[7,218,0],[223,192,1],[216,203,1],[147,258,1],[188,253,0],[106,343,0],[200,246,1],[216,202,1],[39,173,0],[696,105,2],[645,327,2],[190,332,2],[199,326,1],[274,208,3],[192,220,1],[260,210,2],[192,176,1],[688,68,0],[228,70,2],[302,8,1],[201,254,1],[237,220,0],[466,107,0],[66,223,0],[312,7,1],[198,230,1],[301,194,1],[214,225,1],[1359,493,4],[41,238,0],[367,172,2],[188,222,0],[323,210,3],[195,175,1],[69,226,0],[371,233,3],[200,298,1],[231,239,0],[452,363,1],[197,255,1],[421,263,3],[215,202,1],[316,172,0],[461,26,4],[201,303,2],[191,282,1],[197,233,1],[214,202,1],[231,275,0],[199,259,1],[193,259,1],[208,222,1],[533,360,0],[283,194,1],[251,149,2],[198,245,1],[223,191,1],[200,290,1],[654,330,2],[72,575,1],[200,216,1],[195,298,1],[211,266,1],[435,144,2],[240,276,1],[193,266,1],[206,258,2],[232,284,2],[226,192,1],[715,431,2],[219,109,1],[227,201,2],[169,210,0],[244,201,2],[357,23,1],[305,23,2],[1490,833,1],[278,193,2],[202,205,0],[227,208,2],[209,210,1],[235,23,1],[195,389,1],[22,22,3],[213,203,1],[189,6,1],[169,190,0],[218,222,1],[349,349,1],[216,234,1],[248,237,1],[197,370,1],[300,7,1],[192,273,1],[218,194,1],[242,212,0],[268,10,4],[281,8,2],[25,25,1],[189,470,1],[278,200,2],[342,23,1],[40,173,0],[197,296,1],[737,110,2],[334,8,3],[413,351,4],[218,109,1],[416,105,4],[106,344,0],[433,195,2],[220,265,1],[340,192,1],[199,254,1],[436,189,1],[322,7,3],[193,236,1],[201,246,1],[405,235,1],[190,206,2],[254,207,0],[198,296,1],[216,264,1],[425,147,1],[688,67,0],[188,274,0],[209,196,1],[304,7,1],[678,356,0],[230,65,2],[40,574,0],[170,941,1],[247,24,2],[201,259,1],[340,199,1],[377,199,2],[218,216,1],[378,149,4],[178,176,1],[182,1218,1],[271,210,2],[189,475,1],[197,297,1],[224,201,0],[188,244,0],[212,229,1],[193,279,1],[275,192,1],[387,200,1],[169,208,0],[189,444,1],[198,505,1],[238,189,1],[1019,946,3],[195,254,1],[652,769,4],[368,232,3],[324,148,0],[219,222,1],[197,256,1],[215,199,1],[203,197,0],[336,147,0],[188,307,0],[192,296,1],[199,226,1],[320,147,4],[301,7,1],[401,147,1],[150,562,1],[233,289,2],[200,306,2],[271,194,2],[545,852,4],[320,148,4],[214,273,1],[249,249,2],[146,243,0],[483,189,0],[225,201,0],[244,200,2],[415,239,1],[511,213,1],[254,220,1],[261,5,4],[435,258,2],[202,201,0],[226,191,1],[286,195,1],[450,193,1],[215,273,1],[39,221,0],[248,281,1],[265,235,0],[169,227,0],[173,339,1],[72,73,1],[180,1155,0],[241,199,1],[263,193,0],[1082,6,6],[21,20,2],[200,257,2],[1011,181,2],[231,280,0],[427,427,3],[198,628,1],[38,211,0],[63,62,1],[754,493,2],[191,264,1],[192,264,1],[199,219,1],[247,247,2],[285,195,1],[194,280,1],[346,24,3],[181,329,1],[197,307,1],[224,214,0],[169,200,0],[218,199,1],[303,193,0],[149,240,0],[424,266,3],[227,190,2],[191,273,1],[195,252,1],[359,23,1],[193,243,1],[287,7,2],[198,256,1],[236,189,1],[232,200,2],[8,9,2],[203,204,0],[251,237,1],[406,347,4],[217,202,1],[24,170,0],[288,7,2],[379,189,1],[146,283,0],[197,283,1],[278,201,2],[416,242,4],[194,263,1],[217,275,1],[219,244,1],[190,207,2],[219,228,1],[217,199,1],[40,595,0],[238,260,1],[195,230,1],[214,203,1],[232,208,2],[279,304,1],[195,222,1],[407,169,0],[219,199,1],[252,216,1],[382,193,1],[25,25,4],[193,175,1],[201,300,1],[209,284,1],[195,223,1],[442,189,1],[197,253,1],[574,108,0],[194,236,1],[211,203,1],[202,204,0],[219,220,1],[432,23,2],[478,173,2],[201,236,1],[205,195,0],[231,198,0],[298,7,1],[336,148,0],[466,148,0],[218,244,1],[209,106,1],[225,200,0],[533,182,1],[199,252,1],[220,235,1],[252,206,0],[395,24,1],[317,41,1],[515,110,4],[149,275,0],[206,294,0],[276,7,2],[37,292,2],[286,212,1],[652,38,4],[191,275,1],[254,69,0],[408,192,1],[196,299,4],[190,204,2],[24,398,0],[262,236,2],[190,184,2],[395,192,1],[501,5,4],[240,227,1],[169,201,0],[225,216,0],[282,361,2],[238,202,1],[359,24,1],[1638,176,1],[323,7,3],[207,257,2],[247,208,2],[278,194,2],[319,211,1],[217,203,1],[223,200,1],[316,173,0],[354,210,2],[195,226,1],[314,192,1],[386,176,2],[427,427,1],[43,42,2],[233,23,2],[256,194,0],[321,7,3],[198,254,1],[461,675,4],[203,189,0],[208,205,1],[208,243,1],[263,262,0],[252,66,0],[208,212,1],[195,197,1],[199,223,1],[211,239,1],[222,200,2],[248,146,2],[209,253,1],[491,21,4],[189,313,1],[378,266,4],[199,218,1],[356,177,2],[67,177,0],[258,193,0],[260,260,2],[430,108,4],[209,255,1],[173,172,1],[191,309,1],[180,409,0],[911,151,2],[38,302,0],[195,284,1],[580,195,1],[190,443,2],[259,200,0],[68,178,0],[452,183,2],[235,405,1],[212,264,1],[434,267,3],[595,108,0],[217,243,1],[320,227,4],[198,525,1],[225,215,0],[198,226,1],[67,178,0],[201,262,1],[285,211,1],[108,187,0],[214,41,1],[334,23,3],[172,695,1],[213,202,1],[274,7,3],[189,248,1],[201,376,1],[203,200,0],[253,192,2],[254,200,1],[426,176,2],[195,289,1],[196,252,4],[198,223,1],[193,246,1],[377,23,2],[8,219,0],[23,392,0],[213,275,1],[239,199,1],[197,223,1],[197,252,1],[1011,353,1],[195,300,1],[228,197,0],[269,26,4],[224,220,0],[239,415,1],[224,231,0],[240,195,1],[239,192,1],[201,242,1],[198,265,1],[8,218,0],[193,227,1],[306,194,0],[348,23,1],[169,191,0],[189,464,1],[229,229,1],[200,374,1],[225,238,0],[383,147,4],[68,177,0],[204,199,0],[198,252,1],[233,201,2],[23,170,0],[63,619,1],[247,284,2],[234,201,1],[197,290,1],[559,179,2],[6,6,1],[189,251,1],[215,240,1],[264,241,0],[282,213,1],[407,188,0],[186,364,0],[231,195,0],[209,289,1],[216,66,2],[378,194,1],[696,696,2],[205,280,0],[194,227,1],[377,8,2],[189,150,1],[315,212,1],[194,240,1],[297,220,1],[495,24,2],[193,255,1],[219,202,1],[358,23,3],[391,247,1],[223,270,3],[251,281,1],[266,194,0],[226,195,1],[1269,854,3],[185,550,0],[218,230,1],[386,384,1],[302,192,1],[189,238,1],[213,225,1],[253,233,2],[7,213,0],[190,354,2],[198,303,1],[249,289,2],[402,402,3],[211,191,1],[243,189,1],[1646,180,2],[196,254,4],[243,199,1],[212,241,1],[347,70,3],[243,276,1],[382,191,1],[478,172,2],[194,175,1],[212,191,1],[295,216,1],[196,291,4],[259,192,0],[347,327,3],[169,218,0],[219,271,1],[200,229,1],[246,197,0],[189,145,1],[223,195,1],[333,7,1],[149,290,0],[193,256,1],[196,407,4],[104,773,1],[203,201,0],[351,330,3],[265,211,0],[38,239,0],[232,192,2],[149,640,1],[435,146,2],[390,147,0],[208,240,1],[69,275,0],[190,281,2],[255,192,2],[22,22,4],[188,321,0],[189,636,1],[237,216,0],[265,220,0],[188,325,0],[319,25,4],[40,174,0],[317,361,2],[434,434,1],[39,574,0],[193,244,1],[197,254,1],[511,235,1],[257,424,2],[536,217,1],[209,199,1],[106,359,0],[198,264,1],[223,189,1],[253,227,2],[491,710,4],[246,224,1],[173,170,1],[194,243,1],[202,200,0],[364,185,4],[280,226,1],[367,363,1],[317,191,1],[224,6,5],[372,695,1],[350,363,1],[241,192,1],[205,197,0],[449,269,1],[267,41,3],[959,181,3],[40,629,0],[200,210,1],[240,189,1],[169,219,0],[208,211,1],[185,360,0],[193,190,1],[198,218,1],[358,24,3],[207,308,0],[214,264,1],[191,288,1],[203,195,0],[225,199,0],[235,200,1],[255,195,2],[214,189,1],[178,483,1],[169,309,0],[198,337,1],[205,233,0],[343,23,1],[234,439,1],[227,278,2],[217,189,1],[196,411,4],[282,191,1],[367,178,2],[1270,293,2],[39,858,0],[193,206,1],[1784,483,3],[193,240,1],[279,223,1],[148,221,0],[202,190,0],[294,223,1],[192,177,1],[226,189,1],[234,191,1],[351,65,3],[109,349,0],[395,23,1],[201,210,1],[216,192,1],[393,249,1],[232,195,2],[962,22,6],[253,191,2],[146,300,0],[261,261,1],[296,194,0],[10,528,2],[149,298,0],[212,245,1],[815,327,2],[421,258,3],[201,214,1],[356,183,2],[196,223,4],[38,241,0],[205,239,0],[256,225,1],[384,709,2],[232,227,2],[234,264,1],[273,24,1],[189,631,1],[199,190,1],[251,198,1],[406,406,4],[410,23,1],[192,275,1],[197,264,1],[389,195,4],[147,171,0],[170,633,1],[279,330,2],[197,226,1],[218,271,1],[193,241,1],[265,249,0],[313,9,5],[328,147,1],[169,244,0],[199,230,1],[213,254,1],[382,263,4],[445,241,1],[224,195,0],[228,198,0],[901,25,6],[170,221,0],[194,244,1],[402,261,1],[237,193,0],[40,615,0],[188,322,0],[194,557,1],[326,192,1],[220,219,1],[192,301,1],[259,201,0],[304,24,1],[214,66,2],[188,323,0],[197,310,1],[233,195,2],[255,227,2],[222,190,2],[209,309,1],[413,189,0],[107,187,0],[300,212,1],[38,212,0],[194,253,1],[251,189,1],[302,241,1],[669,189,1],[71,327,1],[369,8,1],[39,187,0],[198,219,1],[270,204,4],[304,192,1],[335,7,1],[211,457,1],[251,197,1],[243,195,1],[246,191,0],[268,268,1],[282,214,1],[997,9,6],[196,226,4],[233,205,2],[215,245,1],[27,26,2],[215,203,1],[8,170,0],[40,453,0],[188,371,0],[232,191,2],[266,262,0],[301,191,1],[315,216,1],[194,190,1],[396,200,1],[223,294,1],[326,366,2],[244,208,2],[264,247,0],[565,214,1],[109,341,0],[411,188,0],[106,773,1],[200,217,1],[213,69,2],[352,174,2],[169,274,0],[535,172,0],[201,175,1],[211,249,1],[1143,144,2],[275,191,1],[394,148,0],[199,546,1],[205,193,0],[248,189,1],[302,239,1],[799,1332,1],[224,229,0],[294,24,1],[233,192,2],[544,1901,1],[169,307,0],[373,181,2],[220,202,1],[333,192,1],[255,191,2],[211,285,1],[362,7,1],[197,195,1],[212,227,1],[272,193,1],[551,1488,2],[236,200,1],[242,193,0],[463,197,2],[196,198,4],[199,265,1],[197,458,1],[218,202,1],[273,191,1],[189,562,1],[198,379,1],[537,292,1],[236,531,1],[386,409,1],[304,191,1],[574,107,0],[273,192,1],[281,191,2],[201,213,1],[242,194,0],[326,217,1],[188,368,0],[335,8,1],[279,65,2],[325,195,3],[382,192,1],[501,665,4],[215,66,2],[621,173,2],[212,263,1],[280,70,2],[441,148,1],[107,221,0],[246,192,0],[210,196,2],[737,737,2],[211,276,1],[280,327,2],[235,191,1],[253,208,2],[199,623,1],[212,286,1],[213,189,1],[225,217,0],[1723,353,2],[214,195,1],[222,218,2],[207,278,0],[237,194,0],[189,247,1],[191,175,1],[535,173,0],[43,44,1],[211,275,1],[199,554,1],[348,7,1],[434,41,1],[434,41,3],[302,366,2],[272,194,1],[248,197,1],[378,192,1],[193,207,1],[201,230,1],[111,765,1],[263,260,0],[197,303,1],[212,247,1],[255,232,2],[350,1195,1],[174,384,0],[219,106,1],[226,201,1],[309,8,3],[449,269,3],[999,339,3],[233,191,2],[213,195,1],[233,208,2],[270,21,4],[449,449,3],[274,190,3],[656,42,4],[189,436,1],[193,248,1],[480,23,2],[212,276,1],[64,65,1],[204,294,0],[217,69,2],[400,201,1],[373,841,1],[199,209,1],[283,216,1],[353,946,2],[474,215,2],[148,257,1],[192,288,1],[210,260,2],[1173,170,2],[198,306,1],[211,227,1],[216,263,1],[201,215,1],[229,304,0],[1173,339,2],[217,254,1],[726,189,1],[218,106,1],[249,23,2],[307,194,2],[240,149,2],[266,260,0],[416,416,4],[188,334,0],[40,887,0],[200,175,1],[200,260,1],[210,255,2],[217,301,1],[284,208,2],[295,197,1],[194,207,1],[200,228,1],[209,205,1],[378,191,1],[447,192,1],[210,253,2],[222,208,2],[353,1037,2],[449,449,1],[148,171,0],[210,407,2],[274,271,3],[198,492,1],[224,216,0],[317,214,1],[39,722,0],[213,226,1],[243,227,1],[202,197,0],[236,201,1],[372,175,1],[170,1401,1],[289,208,2],[219,255,1],[39,174,0],[754,339,2],[319,220,1],[147,221,0],[231,226,0],[365,192,1],[289,195,2],[424,192,0],[200,265,1],[326,215,1],[455,213,0],[39,595,0],[267,434,1],[462,193,0],[225,212,0],[224,203,5],[722,108,0],[109,348,0],[189,566,1],[278,106,2],[278,208,2],[284,195,2],[218,253,1],[200,262,1],[350,1648,1],[173,176,1],[239,195,1],[243,146,2],[225,214,0],[180,350,0],[236,202,1],[242,211,0],[317,213,1],[440,148,1],[39,749,0],[222,219,2],[387,7,1],[218,196,1],[188,309,0],[189,249,1],[365,7,1],[220,69,2],[188,320,0],[177,176,1],[1425,11,4],[228,199,0],[197,284,1],[200,213,1],[264,192,0],[733,435,2],[488,147,0],[296,193,0],[229,230,0],[298,195,1],[20,21,2],[212,203,1],[652,1074,4],[1170,1057,3],[283,146,2],[204,194,0],[472,214,2],[410,191,1],[231,301,0],[197,318,1],[310,198,1],[199,651,1],[241,445,1],[200,214,1],[194,206,1],[733,145,2],[212,208,1],[216,238,1],[189,232,1],[192,271,1],[217,536,1],[195,265,1],[218,399,1],[219,196,1],[439,234,1],[595,107,0],[233,227,2],[193,571,1],[267,197,0],[211,245,1],[189,223,1],[258,421,2],[432,147,2],[7,170,0],[343,8,1],[715,150,2],[36,35,1],[279,212,1],[222,281,2],[188,389,0],[263,194,0],[169,383,0],[438,226,2],[218,203,1],[219,240,1],[225,198,0],[274,200,3],[219,404,1],[201,260,1],[211,224,1],[352,179,2],[7,214,0],[147,174,0],[189,442,1],[217,226,1],[266,247,0],[402,261,3],[480,147,2],[1270,329,2],[38,106,0],[220,192,1],[228,219,0],[66,273,0],[195,231,1],[217,298,1],[177,363,0],[195,309,1],[210,232,2],[255,208,2],[308,226,1],[217,245,1],[8,214,0],[215,223,1],[147,172,0],[206,278,0],[197,337,1],[201,264,1],[73,73,1],[189,292,1],[229,294,0],[256,192,0],[287,194,2],[372,1488,1],[343,194,1],[188,358,0],[197,265,1],[213,301,1],[1134,293,4],[188,399,0],[282,335,1],[177,386,0],[256,202,1],[1055,184,3],[109,335,0],[397,191,1],[274,323,3],[203,24,0],[1335,4,4],[205,199,0],[218,270,3],[321,284,3],[645,70,2],[359,8,1],[62,62,1],[189,331,1],[208,268,3],[258,145,2],[575,575,2],[197,289,1],[239,231,1],[259,195,0],[422,409,1],[280,211,1],[109,765,1],[235,265,1],[213,265,1],[196,355,4],[210,411,2],[316,394,0],[234,216,1],[197,306,1],[215,264,1],[290,220,1],[255,244,2],[149,251,0],[202,225,1],[224,296,3],[192,292,1],[271,190,2],[40,67,0],[392,147,0],[169,232,0],[223,485,1],[413,413,4],[469,189,2],[213,511,1],[188,404,0],[299,305,2],[24,208,0],[382,146,4],[1001,169,3],[198,208,1],[406,189,0],[679,237,0],[226,308,1],[1853,854,3],[246,246,1],[211,208,1],[204,209,0],[263,249,0],[282,348,1],[535,171,0],[188,346,0],[252,192,1],[465,9,2],[200,215,1],[203,199,0],[266,193,0],[216,247,1],[254,25,2],[257,257,3],[110,607,1],[322,289,3],[349,147,1],[749,108,0],[203,198,0],[199,253,1],[455,217,0],[108,175,0],[256,191,0],[443,363,1],[470,431,3],[302,215,1],[212,66,2],[212,294,1],[844,64,3],[580,105,3],[195,337,1],[214,252,1],[307,193,2],[220,266,1],[374,200,1],[41,248,0],[216,337,1],[375,22,5],[288,193,2],[1497,1726,3],[192,287,1],[307,197,2],[186,1684,1],[2433,190,2],[278,7,2],[799,180,2],[8,213,0],[911,1144,2],[39,67,0],[262,195,2],[397,7,1],[593,215,1],[626,187,2],[298,211,1],[321,223,3],[334,7,3],[189,226,1],[202,199,0],[216,273,1],[220,297,1],[172,426,0],[322,226,3],[428,223,2],[205,205,5],[419,6,4],[214,223,1],[252,201,1],[316,574,0],[183,820,2],[190,187,2],[191,301,1],[210,233,2],[300,195,1],[388,8,1],[229,223,0],[244,209,2],[346,7,3],[236,211,1],[305,201,2],[421,192,0],[234,198,1],[289,200,2],[332,193,1],[190,276,2],[215,189,1],[277,194,1],[383,148,4],[245,197,0],[408,7,1],[202,189,0],[239,211,1],[290,149,2],[343,7,1],[203,224,1],[212,459,1],[401,8,1],[464,366,3],[220,249,1],[227,232,2],[429,191,1],[195,303,1],[269,675,4],[242,200,0],[373,293,2],[455,194,0],[654,65,2],[493,168,2],[473,213,2],[1258,841,2],[218,243,1],[379,23,1],[146,248,0],[227,274,2],[315,206,0],[382,194,1],[40,68,0],[297,197,1],[28,28,1],[193,234,1],[233,253,2],[41,251,0],[71,70,1],[216,295,1],[338,226,1],[225,229,0],[205,275,0],[341,147,1],[333,69,1],[444,361,3],[284,201,2],[270,22,1],[305,8,2],[318,8,2],[437,148,2],[214,304,1],[269,25,1],[218,289,1],[232,255,2],[344,147,1],[291,7,2],[191,303,1],[192,179,1],[203,190,0],[319,207,0],[238,215,1],[291,278,2],[449,269,5],[941,329,3],[249,209,2],[749,107,0],[9,1101,2],[184,360,0],[220,281,1],[224,494,3],[233,209,2],[275,23,1],[443,183,2],[231,228,0],[236,212,1],[565,234,1],[199,255,1],[256,195,0],[287,195,2],[173,384,0],[220,246,1],[146,301,0],[174,176,1],[194,235,1],[248,214,1],[317,283,1],[186,293,1],[247,195,2],[316,595,0],[376,201,1],[360,1043,1],[229,199,0],[249,208,2],[216,315,1],[453,147,0],[193,286,1],[194,239,1],[258,258,3],[199,231,1],[262,222,2],[10,11,2],[209,204,1],[152,151,1],[8,168,0],[373,353,1],[254,192,1],[462,462,1],[102,102,1],[213,259,1],[462,270,1],[180,483,1],[193,295,1],[219,284,1],[545,1301,3],[427,268,1],[722,107,0],[311,240,1],[515,237,4],[196,278,4],[220,238,1],[107,175,0],[143,144,1],[169,233,0],[217,280,1],[210,272,2],[202,24,0],[206,375,0],[224,235,0],[211,308,1],[218,307,1],[242,197,0],[412,223,2],[424,257,3],[192,294,1],[245,212,0],[284,321,2],[184,185,1],[536,239,1],[193,253,1],[227,233,2],[246,6,3],[215,252,1],[232,244,2],[458,193,0],[312,243,1],[529,108,2],[149,304,0],[241,195,1],[201,256,1],[313,189,1],[911,431,2],[1134,188,4],[194,251,1],[432,8,2],[299,8,2],[462,462,3],[1258,818,2],[194,256,1],[213,248,1],[219,198,1],[26,1288,1],[458,215,0],[20,22,2],[190,451,2],[302,217,1]]} diff --git a/variants/sparse-standard-21bin/profiles/joint/config.json b/variants/sparse-standard-21bin/profiles/joint/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/joint/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-standard-21bin/profiles/joint/config.yaml b/variants/sparse-standard-21bin/profiles/joint/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f7d3e4536fa21f83e0d861c89e54c6a383bee710 --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/joint/config.yaml @@ -0,0 +1,63 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 8 + components: + generalized_joint_position: + dims: + start: 0 + stop: 7 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -6.283185307179586 + max: 6.283185307179586 + order_1: + min: -0.35 + max: 0.35 + distortion_limit: + - 0.004 + - 0.004 + - 0.006 + - 0.0075 + - 0.015 + - 0.02 + - 0.02 + primitive_selection: smooth + gripper_open_command: + dims: + - 7 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.025 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - generalized_joint_position + bpe: + spatial_vocab_size: 366 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-standard-21bin/profiles/joint/primitives.npz b/variants/sparse-standard-21bin/profiles/joint/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..170f8cdd5e005284c7b3b79456f2b5810c90c2be --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/joint/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8e8c49ca932fb18a9edd59e54153b3cc26aee37c78d486bdf28a4231ee355c4 +size 3590 diff --git a/variants/sparse-standard-21bin/profiles/joint/processor_config.json b/variants/sparse-standard-21bin/profiles/joint/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/joint/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-standard-21bin/profiles/joint/sparse_bpe.json b/variants/sparse-standard-21bin/profiles/joint/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..4acc36eaf0b2413342ee266e5ec426b8c692c715 --- /dev/null +++ b/variants/sparse-standard-21bin/profiles/joint/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[89,89,61,49,25,19,19,21],"zero":[44,44,30,24,12,9,9,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[365,132,1],[365,131,1],[365,365,1],[365,260,1],[365,259,1],[365,43,1],[365,44,1],[365,206,1],[365,205,1],[368,368,2],[366,205,1],[366,206,1],[365,296,1],[365,295,1],[367,205,1],[367,206,1],[43,43,2],[317,317,2],[316,316,2],[133,133,2],[44,44,2],[366,260,1],[130,130,1],[366,259,1],[295,295,2],[296,296,2],[369,205,1],[367,259,1],[42,42,1],[370,206,1],[365,204,1],[369,206,1],[365,207,1],[45,45,1],[367,260,1],[370,205,1],[258,258,1],[261,261,1],[365,366,1],[371,205,1],[371,206,1],[129,129,1],[134,134,1],[372,205,1],[365,367,1],[372,206,1],[375,375,4],[365,317,1],[365,316,1],[204,204,2],[335,335,3],[334,334,3],[207,207,1],[369,43,1],[365,203,1],[365,208,1],[41,41,1],[46,46,1],[130,367,0],[370,44,1],[261,369,0],[128,128,1],[368,260,2],[366,43,1],[368,259,2],[258,370,0],[135,135,1],[366,44,1],[130,129,1],[375,368,4],[377,259,1],[257,257,1],[380,260,1],[377,260,1],[262,262,1],[385,133,4],[296,296,3],[376,260,1],[295,295,3],[384,316,4],[383,317,4],[368,206,2],[367,44,1],[42,371,0],[367,43,1],[380,259,1],[366,366,1],[368,205,2],[45,372,0],[369,44,1],[370,43,1],[365,209,1],[365,202,1],[42,41,1],[381,259,1],[127,127,1],[45,46,1],[203,203,1],[368,44,2],[368,43,2],[133,133,1],[47,47,1],[136,136,1],[40,40,1],[207,373,0],[208,208,1],[383,383,4],[384,384,4],[317,317,3],[128,129,1],[316,316,3],[369,382,1],[258,257,1],[388,388,2],[134,135,1],[376,259,1],[294,294,2],[261,262,1],[297,297,2],[390,295,4],[204,204,1],[394,394,2],[391,296,4],[379,295,3],[378,296,3],[130,407,1],[207,398,0],[367,367,1],[381,260,1],[368,366,2],[365,133,1],[385,385,4],[399,399,2],[335,335,4],[382,42,1],[334,334,4],[126,126,1],[365,210,1],[386,45,1],[365,201,1],[130,381,0],[403,403,2],[368,367,2],[402,402,2],[43,371,0],[207,208,1],[317,317,4],[137,137,1],[316,316,4],[256,256,1],[204,374,0],[370,386,1],[128,127,1],[365,334,1],[369,296,1],[363,364,1],[365,335,1],[44,372,0],[366,296,1],[368,372,2],[263,263,1],[368,371,2],[374,295,1],[366,133,2],[369,295,1],[373,296,1],[47,46,1],[48,48,1],[42,422,1],[370,295,1],[40,41,1],[128,407,1],[45,423,1],[408,134,2],[382,43,4],[390,390,4],[370,296,1],[202,202,1],[132,364,0],[136,135,1],[391,391,4],[39,39,1],[316,365,0],[367,295,1],[209,209,1],[366,376,1],[369,369,1],[317,365,0],[386,44,4],[388,129,2],[366,295,1],[204,396,0],[346,345,1],[125,125,1],[385,134,1],[315,315,2],[130,380,0],[366,382,1],[261,392,0],[258,437,1],[318,318,2],[365,211,1],[131,364,0],[258,395,0],[365,376,1],[130,393,0],[370,370,1],[261,387,0],[394,42,2],[371,296,1],[374,133,1],[368,373,2],[261,440,1],[371,295,1],[365,200,1],[379,390,3],[126,127,1],[378,391,3],[138,138,1],[130,400,0],[368,404,2],[386,372,0],[374,296,1],[369,316,1],[362,364,1],[408,408,2],[366,404,1],[367,296,1],[45,44,1],[371,43,3],[203,420,0],[258,401,0],[415,204,1],[373,295,1],[256,257,1],[261,397,0],[368,410,2],[372,372,1],[365,381,1],[368,369,2],[258,389,0],[432,135,2],[416,416,2],[203,396,0],[372,295,1],[372,296,1],[394,41,2],[417,334,6],[373,373,1],[387,43,1],[368,370,2],[368,374,2],[40,422,1],[366,386,1],[371,371,1],[47,423,1],[376,43,1],[263,262,1],[369,317,1],[399,46,2],[407,129,2],[136,137,1],[382,371,0],[366,316,1],[370,317,1],[377,43,1],[392,43,1],[206,345,0],[366,365,1],[205,345,0],[375,44,4],[203,202,1],[376,376,1],[374,374,1],[366,317,1],[385,133,1],[421,208,2],[375,43,4],[397,43,1],[47,48,1],[207,395,0],[134,133,1],[49,49,1],[365,388,1],[209,208,1],[260,364,0],[399,45,2],[128,461,1],[370,316,1],[402,257,2],[40,39,1],[258,393,0],[368,365,2],[367,381,1],[366,374,1],[368,296,2],[124,124,1],[203,204,1],[374,204,2],[367,317,1],[389,44,1],[377,44,1],[316,369,0],[403,262,2],[376,44,1],[201,201,1],[401,44,1],[368,295,2],[38,38,1],[207,381,0],[415,203,1],[427,129,2],[382,382,4],[367,365,1],[261,400,0],[369,371,1],[365,354,1],[367,373,1],[365,355,1],[347,345,1],[365,212,1],[393,44,1],[367,316,1],[255,255,1],[365,353,1],[373,317,1],[335,335,2],[418,418,2],[365,356,1],[373,316,1],[210,210,1],[42,406,0],[374,317,1],[367,386,1],[366,389,1],[42,405,0],[395,44,1],[139,139,1],[264,264,1],[45,409,0],[384,384,3],[383,383,3],[380,44,1],[134,432,1],[365,357,1],[126,125,1],[136,432,1],[365,350,1],[366,372,1],[365,349,1],[366,371,1],[415,415,1],[415,396,0],[259,364,0],[365,351,1],[365,352,1],[441,134,1],[365,348,1],[374,316,1],[207,377,0],[207,397,0],[363,360,1],[417,417,2],[365,358,1],[400,43,1],[365,389,1],[380,43,1],[398,208,2],[365,377,1],[133,366,0],[365,387,1],[207,421,0],[45,411,0],[365,199,1],[366,369,1],[256,437,1],[360,521,1],[371,317,1],[365,359,1],[366,370,1],[422,41,2],[375,206,4],[408,135,2],[379,294,3],[378,297,3],[423,46,2],[427,427,2],[138,137,1],[381,43,1],[370,372,1],[367,410,1],[369,403,2],[396,204,2],[372,317,1],[372,316,1],[370,402,2],[381,44,1],[366,373,1],[373,365,1],[367,382,1],[263,440,1],[369,133,1],[131,345,0],[132,345,0],[371,316,1],[366,387,1],[365,380,1],[260,344,0],[365,393,1],[296,373,0],[368,317,2],[367,372,1],[365,361,1],[375,260,4],[295,374,0],[392,44,1],[366,377,1],[207,471,1],[368,316,2],[334,334,2],[370,133,1],[365,385,1],[123,123,1],[482,294,4],[386,386,4],[371,42,2],[49,48,1],[365,347,1],[484,297,4],[209,457,0],[367,370,1],[296,369,0],[367,371,1],[415,374,0],[373,388,1],[401,43,1],[367,374,1],[126,461,1],[207,406,0],[201,202,1],[375,205,4],[407,407,2],[317,370,0],[259,344,0],[369,365,1],[50,50,1],[205,364,0],[38,39,1],[261,419,0],[416,335,6],[365,346,1],[458,202,2],[428,205,2],[381,381,1],[317,369,0],[207,411,0],[367,369,1],[395,43,1],[491,129,3],[293,294,2],[430,206,2],[372,45,2],[375,259,4],[209,210,1],[140,140,1],[437,257,2],[374,365,1],[295,370,0],[124,125,1],[256,255,1],[298,297,2],[408,133,2],[434,388,2],[378,316,1],[371,369,1],[295,369,0],[387,387,1],[468,135,2],[427,127,2],[365,400,1],[389,43,1],[377,296,1],[478,402,2],[295,367,0],[200,200,1],[206,364,0],[37,37,1],[385,366,0],[346,348,1],[467,46,2],[365,213,1],[375,372,4],[397,44,1],[403,365,0],[211,211,1],[394,459,2],[469,41,2],[385,385,1],[260,345,0],[418,208,2],[379,317,1],[263,264,1],[374,376,1],[389,389,1],[440,262,2],[369,204,1],[296,370,0],[367,380,1],[373,372,1],[362,558,4],[258,425,0],[335,335,5],[387,44,1],[295,365,0],[399,462,2],[334,334,5],[379,316,1],[259,345,0],[47,533,1],[296,316,0],[373,371,1],[375,371,4],[346,349,1],[365,383,1],[387,382,1],[356,357,1],[365,424,1],[365,384,1],[375,366,4],[368,378,2],[317,373,0],[367,393,1],[374,366,1],[138,139,1],[390,390,3],[374,369,1],[398,373,1],[136,513,1],[296,366,0],[316,373,0],[258,436,0],[130,438,0],[497,134,1],[203,458,0],[132,344,0],[391,391,3],[316,370,0],[471,208,2],[347,350,1],[483,403,2],[363,361,1],[295,317,0],[375,410,4],[398,418,2],[367,400,1],[434,434,2],[40,547,1],[317,374,0],[373,370,1],[376,366,1],[296,365,0],[370,382,1],[375,367,4],[373,367,1],[372,370,1],[394,422,2],[373,133,1],[368,379,2],[374,371,1],[399,423,2],[375,404,4],[355,354,1],[365,42,1],[315,384,2],[378,317,1],[373,366,1],[43,364,0],[122,122,1],[398,398,1],[369,386,1],[209,421,0],[374,372,1],[369,42,1],[361,521,1],[134,466,1],[393,43,1],[318,383,2],[365,198,1],[254,254,1],[354,355,1],[44,364,0],[369,366,1],[295,316,0],[370,365,1],[385,376,0],[396,374,1],[130,451,0],[461,127,2],[361,364,1],[334,334,6],[126,559,1],[141,141,1],[365,373,1],[369,387,1],[316,374,0],[265,265,1],[428,206,2],[335,335,6],[369,392,1],[396,396,1],[441,134,3],[358,590,1],[138,513,1],[205,260,0],[132,346,0],[316,366,0],[296,317,0],[131,344,0],[377,377,1],[420,202,2],[534,41,3],[402,365,0],[333,333,2],[365,374,1],[538,46,3],[457,208,2],[367,388,2],[502,127,2],[404,404,2],[430,44,2],[537,129,3],[45,504,1],[439,43,1],[358,359,1],[380,295,1],[317,366,0],[370,389,1],[317,371,0],[370,366,1],[133,134,1],[295,366,0],[296,371,0],[131,346,0],[336,336,2],[124,123,1],[373,369,1],[206,259,0],[365,130,1],[295,372,0],[392,392,1],[393,393,1],[201,505,0],[49,50,1],[367,335,1],[368,414,2],[435,44,6],[42,500,1],[261,438,0],[51,51,1],[345,344,1],[373,381,1],[316,372,0],[211,210,1],[418,370,0],[404,44,2],[380,380,1],[140,139,1],[435,43,6],[467,467,2],[515,257,2],[293,293,2],[400,44,1],[479,388,4],[317,367,0],[359,590,1],[368,413,2],[204,376,0],[408,466,2],[442,378,0],[444,379,0],[371,366,1],[428,43,2],[203,486,1],[372,365,1],[130,460,0],[298,298,2],[296,367,0],[201,200,1],[463,369,0],[374,396,1],[392,382,1],[368,334,2],[468,468,2],[261,439,0],[316,367,0],[352,348,1],[203,543,1],[368,335,2],[369,374,1],[373,398,1],[365,369,1],[316,371,0],[459,459,2],[261,443,0],[372,366,1],[469,469,2],[397,382,1],[426,403,2],[38,37,1],[365,360,1],[404,43,2],[387,296,1],[295,371,0],[393,386,1],[503,210,2],[42,419,0],[379,482,3],[389,386,1],[374,367,1],[430,205,2],[526,262,2],[395,370,1],[394,365,0],[378,484,3],[212,212,1],[410,44,2],[399,365,0],[370,204,1],[317,372,0],[375,373,4],[381,367,1],[357,356,1],[565,257,3],[296,374,0],[400,382,1],[347,351,1],[295,373,0],[432,432,2],[36,36,1],[370,367,1],[379,390,2],[206,260,0],[296,372,0],[491,407,3],[45,425,0],[371,365,1],[199,199,1],[378,391,2],[359,349,2],[142,142,1],[424,388,2],[377,366,1],[392,295,1],[205,259,0],[352,353,1],[369,397,1],[477,42,2],[462,462,2],[401,295,1],[405,371,1],[427,475,2],[209,471,1],[376,382,1],[389,366,1],[402,258,2],[395,395,1],[479,129,4],[367,204,1],[374,370,1],[373,335,1],[408,539,2],[376,374,1],[422,422,2],[366,334,1],[436,44,1],[365,362,1],[409,372,1],[578,262,3],[417,417,1],[355,350,1],[360,361,2],[416,416,1],[369,400,1],[438,43,1],[205,344,0],[423,423,2],[408,480,2],[121,121,1],[369,372,1],[353,352,1],[370,258,2],[369,367,1],[507,403,4],[49,533,1],[377,382,1],[410,43,2],[347,349,1],[374,334,1],[451,44,1],[406,371,1],[254,255,1],[365,370,1],[467,48,2],[381,373,1],[372,373,1],[355,742,1],[387,366,1],[391,297,4],[401,386,1],[431,402,2],[393,370,1],[387,369,1],[365,426,1],[133,135,1],[374,392,1],[390,294,4],[43,345,0],[441,385,1],[561,315,4],[499,335,2],[365,214,1],[375,369,4],[400,400,1],[368,386,2],[206,344,0],[370,373,1],[395,296,1],[265,264,1],[469,39,2],[435,206,6],[44,345,0],[397,296,1],[402,437,2],[376,295,1],[370,207,1],[411,372,1],[352,357,1],[38,547,1],[366,133,3],[405,374,1],[371,374,1],[371,373,1],[351,685,1],[369,373,1],[365,45,1],[143,143,1],[370,401,1],[388,407,2],[618,41,3],[566,318,4],[427,407,2],[122,123,1],[209,503,0],[463,463,2],[375,374,4],[392,369,1],[375,370,4],[424,44,1],[424,43,1],[204,392,0],[376,386,1],[347,346,1],[373,377,1],[372,367,1],[128,388,1],[462,399,2],[389,370,1],[130,494,0],[51,50,1],[443,43,1],[447,44,2],[487,394,4],[621,46,3],[368,382,2],[256,689,1],[371,367,1],[405,405,1],[372,374,1],[459,394,2],[449,42,2],[201,458,0],[359,358,1],[365,344,1],[468,137,2],[369,334,1],[204,420,0],[395,386,1],[373,391,1],[128,130,1],[374,390,1],[502,125,2],[509,402,4],[383,446,3],[497,134,5],[384,445,3],[440,440,2],[263,704,1],[365,434,1],[373,406,1],[369,335,1],[358,353,1],[136,607,1],[398,207,2],[475,475,2],[370,371,1],[409,374,1],[397,397,1],[401,401,1],[487,41,4],[130,128,1],[722,134,3],[380,374,1],[45,433,0],[367,334,1],[395,373,1],[431,43,1],[351,350,1],[498,399,4],[380,367,1],[204,415,1],[369,391,1],[375,428,4],[370,393,1],[379,485,3],[372,133,1],[410,410,2],[129,130,1],[409,295,1],[543,202,2],[258,451,0],[378,365,1],[421,421,1],[334,417,4],[369,390,1],[334,417,2],[370,374,1],[140,141,1],[584,137,2],[373,397,1],[427,461,2],[378,488,3],[452,366,2],[447,43,2],[370,390,1],[36,37,1],[371,133,1],[383,317,5],[373,411,1],[416,335,5],[457,210,2],[124,559,1],[453,44,2],[379,365,1],[505,202,2],[478,478,2],[366,466,2],[42,429,0],[211,212,1],[129,127,1],[369,261,2],[365,372,1],[370,395,1],[387,316,1],[418,372,0],[387,295,1],[380,386,1],[365,197,1],[435,205,6],[378,296,4],[207,436,0],[480,480,2],[258,460,0],[52,52,1],[393,295,1],[365,371,1],[498,46,4],[409,409,1],[388,434,2],[418,371,0],[653,127,3],[43,260,0],[370,391,1],[513,137,2],[453,43,2],[208,421,0],[213,213,1],[392,374,1],[377,386,1],[405,295,1],[253,253,1],[426,44,1],[483,483,2],[199,200,1],[463,202,2],[385,441,1],[366,335,1],[45,455,0],[318,319,2],[397,369,1],[349,348,1],[375,430,4],[406,406,1],[350,351,1],[207,439,0],[378,442,3],[437,437,2],[445,384,5],[132,205,0],[371,394,2],[379,444,3],[396,486,2],[389,296,1],[408,432,2],[418,369,0],[384,315,4],[365,363,1],[435,367,6],[365,431,1],[401,374,1],[369,203,1],[393,367,1],[534,422,3],[435,366,6],[135,134,1],[365,403,1],[502,502,2],[538,423,3],[211,567,0],[415,420,0],[452,452,2],[133,376,0],[427,518,2],[266,266,1],[372,204,1],[446,383,5],[381,296,1],[316,384,3],[435,372,6],[44,259,0],[411,411,1],[499,499,2],[388,130,2],[120,120,1],[372,399,2],[373,395,1],[406,296,1],[415,392,0],[379,295,4],[207,460,0],[380,382,1],[257,402,1],[371,204,1],[45,448,0],[376,296,1],[418,367,0],[479,365,0],[35,35,1],[359,521,1],[385,377,0],[366,368,1],[43,206,0],[500,42,3],[365,345,1],[370,334,1],[1114,354,1],[129,128,1],[317,379,0],[501,501,2],[435,371,6],[366,433,1],[373,378,1],[366,429,1],[366,204,1],[138,703,1],[373,506,1],[533,48,2],[353,977,1],[316,378,0],[370,335,1],[361,360,1],[376,551,1],[262,403,1],[383,365,0],[550,208,2],[372,369,1],[314,314,1],[401,370,1],[400,369,1],[389,295,1],[400,367,1],[134,607,1],[365,454,1],[142,141,1],[365,399,1],[374,405,1],[397,373,1],[365,394,1],[727,356,2],[198,198,1],[294,293,2],[468,432,2],[501,334,2],[136,134,1],[468,545,2],[381,382,1],[317,383,3],[406,373,1],[515,515,2],[420,463,2],[580,200,2],[484,484,4],[385,389,0],[467,423,2],[363,362,1],[356,742,1],[379,374,1],[296,378,0],[358,359,2],[361,357,1],[44,206,0],[369,428,1],[125,127,1],[482,482,4],[297,298,2],[385,387,0],[481,44,1],[452,404,2],[398,421,1],[365,441,1],[366,391,1],[295,379,0],[374,401,1],[133,377,0],[371,370,1],[354,1040,1],[547,39,2],[469,422,2],[369,419,1],[390,444,4],[487,42,4],[131,633,0],[537,407,3],[381,386,1],[384,316,5],[648,48,2],[365,449,1],[370,388,1],[411,296,1],[408,560,2],[467,532,2],[420,203,2],[43,205,0],[132,635,0],[411,373,1],[374,380,1],[403,261,2],[124,788,1],[371,405,1],[366,378,1],[492,208,2],[400,295,1],[469,536,2],[374,391,1],[379,204,1],[365,506,1],[418,378,0],[916,357,2],[374,409,1],[44,205,0],[377,373,1],[122,121,1],[372,464,1],[436,43,1],[526,264,2],[375,296,4],[392,296,1],[402,478,2],[367,130,2],[434,127,2],[317,378,0],[376,316,1],[460,44,1],[373,424,1],[443,44,1],[908,134,3],[134,136,1],[133,387,0],[335,367,0],[674,39,2],[41,42,1],[384,365,0],[144,143,1],[383,369,0],[372,409,1],[420,396,1],[390,444,1],[209,696,1],[439,382,1],[515,255,2],[392,316,1],[565,437,3],[347,348,1],[375,295,4],[421,471,2],[367,368,1],[335,416,2],[354,353,1],[387,317,1],[727,1145,2],[377,316,1],[201,543,1],[376,317,1],[371,465,1],[369,394,1],[334,374,0],[49,811,1],[131,347,0],[391,442,4],[133,480,1],[346,344,1],[558,365,0],[366,495,1],[420,420,1],[383,370,0],[373,390,1],[367,390,1],[369,388,1],[403,440,2],[387,371,1],[334,366,0],[380,317,1],[374,379,1],[369,378,1],[365,445,1],[393,296,1],[494,43,1],[377,317,1],[132,259,0],[360,361,1],[47,399,1],[140,703,1],[389,382,1],[396,203,2],[365,378,1],[365,379,1],[365,402,1],[434,491,2],[358,357,1],[384,369,0],[391,442,1],[434,479,2],[526,526,2],[365,261,1],[449,394,2],[135,137,1],[544,260,0],[131,348,0],[399,504,2],[316,379,0],[335,416,4],[42,456,0],[383,318,4],[415,376,0],[132,206,0],[539,466,3],[441,366,0],[374,388,1],[578,440,3],[258,481,0],[393,317,1],[392,317,1],[204,405,0],[384,370,0],[379,370,1],[211,503,0],[372,386,3],[51,52,1],[365,446,1],[399,594,2],[299,299,1],[379,369,1],[367,450,1],[335,335,7],[297,378,0],[461,461,2],[380,316,1],[374,385,1],[370,430,1],[351,352,1],[53,53,1],[124,126,1],[370,418,1],[38,852,1],[334,334,7],[365,215,1],[389,317,1],[373,207,2],[540,42,3],[545,134,2],[377,295,1],[419,371,1],[213,212,1],[539,133,3],[955,891,2],[497,134,3],[415,401,0],[937,353,2],[435,373,6],[372,411,1],[292,292,1],[368,381,2],[379,379,1],[395,295,1],[475,388,2],[40,394,1],[400,296,1],[441,441,1],[403,483,2],[366,390,1],[378,373,1],[378,378,1],[371,382,3],[655,402,3],[254,253,1],[424,367,1],[426,369,1],[201,580,0],[417,334,5],[40,42,1],[46,45,1],[204,401,0],[202,458,0],[370,425,1],[559,125,2],[134,560,1],[428,44,2],[419,369,1],[213,214,1],[383,379,0],[367,448,1],[365,258,1],[132,260,0],[208,398,0],[368,519,2],[367,391,1],[567,210,2],[378,369,1],[367,379,1],[335,373,0],[486,369,0],[1061,345,2],[438,44,1],[439,296,1],[348,351,1],[405,42,2],[206,346,0],[370,511,1],[554,45,3],[371,406,1],[256,402,1],[46,48,1],[370,378,1],[459,487,2],[454,399,2],[204,463,1],[259,346,0],[295,380,0],[362,358,1],[265,266,1],[384,378,0],[426,261,2],[36,35,1],[368,522,2],[294,379,0],[362,363,1],[427,128,2],[369,207,1],[204,409,0],[418,366,0],[376,133,2],[600,402,2],[395,317,1],[319,319,2],[379,372,1],[334,369,0],[419,296,1],[433,366,1],[381,295,1],[371,207,1],[368,429,2],[397,316,1],[378,372,1],[507,262,4],[135,136,1],[427,677,2],[383,373,0],[518,518,2],[404,372,2],[394,500,2],[378,371,1],[532,399,2],[384,374,0],[454,45,2],[669,403,3],[41,39,1],[129,388,1],[389,316,1],[379,371,1],[387,386,1],[662,125,2],[395,316,1],[459,42,2],[365,472,1],[741,257,3],[429,366,1],[431,370,1],[421,398,1],[43,344,0],[356,355,1],[415,380,0],[335,369,0],[365,473,1],[366,207,1],[378,207,1],[131,349,0],[130,127,1],[260,346,0],[130,518,1],[362,363,5],[406,42,2],[368,419,2],[389,377,1],[401,317,1],[404,371,2],[205,346,0],[368,433,2],[515,437,2],[509,257,4],[44,344,0],[462,498,2],[368,425,2],[397,295,1],[505,200,2],[428,371,2],[384,373,0],[404,495,2],[294,390,2],[389,436,1],[380,296,1],[914,1171,2],[120,121,1],[367,207,1],[378,366,1],[34,35,1],[475,130,2],[375,316,4],[400,316,1],[372,391,1],[383,374,0],[481,43,1],[451,386,1],[334,371,0],[263,403,1],[385,496,0],[431,258,2],[46,47,1],[351,348,1],[398,316,1],[396,420,1],[410,373,2],[393,316,1],[479,479,4],[372,335,1],[401,296,1],[397,317,1],[502,582,2],[561,561,4],[536,536,2],[544,205,0],[362,360,1],[366,379,1],[373,442,1],[445,315,6],[364,435,0],[550,210,2],[441,133,1],[400,371,1],[396,317,1],[401,316,1],[803,127,3],[376,452,1],[334,367,0],[204,380,0],[370,478,2],[398,317,1],[414,315,3],[377,387,1],[120,119,1],[371,391,1],[566,566,4],[368,377,2],[374,444,1],[441,376,0],[434,518,2],[439,387,1],[365,414,1],[623,403,2],[467,533,2],[365,364,1],[460,43,1],[426,382,1],[334,370,0],[378,370,1],[487,487,4],[396,316,1],[438,382,1],[480,134,2],[375,317,4],[131,350,0],[384,379,0],[203,676,1],[129,518,1],[446,446,3],[454,372,1],[360,361,3],[368,448,2],[199,198,1],[381,317,1],[526,440,2],[252,252,1],[335,366,0],[430,43,2],[376,443,1],[369,379,1],[449,371,1],[419,295,1],[372,462,2],[41,40,1],[613,417,2],[415,405,0],[371,390,1],[376,387,1],[369,463,1],[671,202,2],[614,373,2],[404,374,2],[365,413,1],[370,379,1],[254,689,1],[142,143,1],[365,436,1],[383,378,0],[134,137,1],[372,207,1],[392,386,1],[381,316,1],[558,344,2],[367,508,1],[204,203,1],[766,262,3],[555,388,3],[398,511,2],[393,372,1],[427,537,2],[493,493,2],[438,400,1],[389,133,2],[366,496,1],[296,377,0],[47,45,1],[398,471,2],[405,317,1],[425,370,1],[491,626,3],[389,372,1],[875,1266,1],[875,1430,1],[365,196,1],[434,128,2],[316,387,0],[410,372,2],[371,459,2],[416,335,7],[568,259,0],[199,739,0],[353,354,1],[297,391,2],[408,641,2],[265,704,1],[372,390,1],[415,409,0],[686,212,2],[368,450,2],[367,378,1],[373,379,1],[376,371,1],[405,296,1],[363,359,1],[127,129,1],[709,432,3],[375,378,4],[355,356,1],[139,137,1],[370,509,2],[571,258,0],[267,267,1],[544,259,0],[544,206,0],[350,685,1],[377,133,2],[364,372,0],[425,372,1],[430,372,2],[469,547,2],[443,387,1],[392,371,1],[532,532,2],[42,450,0],[335,370,0],[374,378,1],[392,400,1],[425,295,1],[429,296,1],[395,382,1],[401,382,1],[722,133,3],[364,371,0],[406,317,1],[201,850,1],[445,445,3],[435,369,6],[498,498,4],[884,48,3],[635,260,0],[783,208,3],[375,379,4],[457,457,1],[536,394,2],[418,379,0],[435,374,6],[439,44,1],[45,47,1],[404,373,2],[397,371,1],[43,296,0],[369,483,2],[144,144,1],[466,135,2],[365,590,1],[436,436,1],[568,260,0],[126,128,1],[568,205,0],[352,351,1],[386,411,0],[584,584,2],[368,376,2],[388,365,0],[388,373,0],[53,52,1],[43,295,0],[370,209,1],[618,422,3],[50,48,1],[399,538,2],[373,130,1],[409,316,1],[727,365,0],[356,949,1],[368,380,2],[417,334,7],[375,414,4],[367,675,1],[608,416,4],[132,347,0],[293,825,2],[125,123,1],[369,507,2],[380,400,1],[712,432,3],[261,494,0],[363,778,0],[368,411,2],[414,365,1],[591,135,4],[696,210,2],[37,39,1],[389,373,1],[409,317,1],[545,545,2],[470,373,1],[475,537,2],[459,574,2],[365,555,1],[335,372,0],[410,371,2],[463,371,0],[621,423,3],[370,377,1],[335,371,0],[334,372,0],[405,376,1],[379,367,1],[413,365,1],[295,335,0],[393,451,1],[395,366,1],[480,137,2],[653,461,3],[365,397,1],[383,372,0],[350,349,1],[477,371,1],[367,418,1],[473,384,3],[44,296,0],[134,627,1],[132,348,0],[365,479,1],[438,438,1],[413,371,1],[376,372,1],[536,42,2],[370,257,2],[400,317,1],[387,133,2],[203,598,1],[367,392,1],[381,659,1],[355,891,1],[515,600,2],[397,387,1],[369,442,1],[298,836,2],[903,137,3],[34,33,1],[502,461,2],[346,723,0],[394,534,2],[393,382,1],[197,197,1],[373,434,1],[346,350,1],[582,129,2],[296,364,0],[214,214,1],[383,367,0],[807,407,4],[136,647,1],[922,39,3],[379,366,1],[471,471,2],[999,1146,3],[53,54,1],[379,207,1],[492,398,1],[411,316,1],[409,296,1],[402,373,0],[511,511,2],[46,399,1],[372,378,1],[370,550,1],[405,366,1],[468,513,2],[384,371,0],[392,204,2],[345,366,0],[205,651,0],[395,436,1],[450,367,1],[497,385,1],[44,295,0],[348,1202,1],[478,509,2],[375,413,4],[380,369,1],[378,374,1],[366,442,1],[365,521,1],[373,447,1],[446,318,6],[403,374,0],[662,123,2],[685,344,2],[414,372,1],[393,380,1],[131,809,0],[126,475,1],[466,365,0],[368,387,2],[443,443,1],[425,296,1],[365,134,1],[405,316,1],[637,369,0],[493,367,2],[383,366,0],[406,295,1],[370,444,1],[296,345,0],[467,645,2],[368,393,2],[429,371,1],[413,318,3],[383,371,0],[499,416,2],[458,543,2],[433,372,1],[389,376,1],[374,453,1],[384,367,0],[365,507,1],[361,359,1],[409,366,1],[435,370,6],[405,369,1],[459,534,2],[364,412,0],[406,369,1],[395,377,1],[414,369,1],[399,751,2],[462,48,2],[41,394,1],[347,344,1],[888,1500,2],[384,366,0],[448,367,1],[436,377,1],[370,456,1],[463,372,0],[363,362,2],[381,372,1],[377,369,1],[497,441,1],[526,623,2],[689,255,2],[451,43,1],[585,261,0],[145,145,1],[380,438,1],[397,366,1],[204,676,1],[371,419,1],[350,348,1],[376,365,1],[118,119,1],[211,686,0],[136,408,1],[369,455,1],[348,352,1],[502,559,2],[381,371,1],[370,442,1],[365,483,1],[127,128,1],[462,538,2],[295,392,0],[360,359,1],[486,371,0],[443,382,1],[385,576,0],[365,438,1],[390,374,0],[406,316,1],[377,371,1],[395,389,1],[294,825,2],[362,359,1],[424,130,2],[369,444,1],[396,598,2],[391,373,0],[722,385,3],[295,345,0],[426,296,1],[564,43,1],[916,356,2],[480,591,2],[409,376,1],[402,374,0],[140,967,1],[395,372,1],[459,39,2],[42,40,1],[386,368,0],[132,349,0],[133,560,1],[480,408,2],[457,209,2],[490,297,5],[257,258,1],[639,374,2],[334,387,0],[573,43,1],[380,392,1],[410,374,2],[368,406,2],[319,318,2],[394,369,0],[351,353,1],[704,264,2],[126,129,1],[361,363,1],[294,1036,2],[392,387,1],[469,656,2],[133,389,0],[486,370,0],[404,369,2],[506,43,1],[434,555,2],[371,378,1],[252,253,1],[360,363,1],[314,315,2],[404,296,2],[367,447,1],[372,379,1],[830,139,2],[371,379,1],[392,366,1],[44,346,0],[433,296,1],[419,316,1],[380,334,1],[295,364,0],[584,139,2],[462,45,2],[457,421,1],[486,372,0],[206,651,0],[126,124,1],[455,369,1],[202,420,0],[370,504,1],[126,123,1],[988,333,4],[365,451,1],[621,399,3],[358,356,1],[584,513,2],[434,130,2],[210,503,0],[568,206,0],[366,465,1],[122,788,1],[368,389,2],[472,383,3],[888,353,2],[365,216,1],[436,386,1],[404,370,2],[43,346,0],[557,396,1],[552,369,2],[43,651,0],[463,379,0],[366,354,1],[366,464,1],[367,411,1],[565,402,3],[648,50,2],[376,570,1],[403,373,0],[372,425,1],[133,408,1],[203,374,0],[650,370,0],[134,641,1],[349,350,1],[365,491,1],[684,682,1],[368,405,2],[516,374,1],[601,43,1],[625,399,3],[293,482,2],[463,370,0],[357,949,1],[367,444,1],[612,394,3],[367,401,1],[365,439,1],[431,295,1],[55,54,1],[694,357,2],[384,372,0],[403,371,0],[376,369,1],[199,580,0],[427,626,2],[365,417,1],[403,366,0],[489,294,5],[400,374,1],[379,373,1],[366,447,1],[297,836,2],[370,470,1],[366,570,1],[365,401,1],[317,334,0],[397,386,1],[410,508,2],[411,295,1],[608,416,1],[317,335,0],[369,262,2],[377,372,1],[316,335,0],[366,418,1],[438,392,1],[377,335,1],[512,318,2],[388,374,0],[431,296,1],[378,204,1],[369,418,1],[297,1051,2],[376,404,1],[373,387,1],[394,746,2],[649,365,1],[389,700,1],[426,295,1],[514,315,2],[51,811,1],[727,355,2],[448,372,1],[298,484,2],[539,560,3],[140,138,1],[345,373,0],[413,370,1],[451,295,1],[373,479,1],[367,406,1],[1009,336,4],[497,385,3],[132,350,0],[139,141,1],[443,376,1],[400,392,1],[393,401,1],[652,504,3],[380,372,1],[355,357,1],[378,367,1],[450,371,1],[386,409,0],[506,44,1],[206,719,0],[468,712,2],[317,387,0],[475,752,2],[316,334,0],[692,416,4],[978,137,3],[382,406,0],[831,402,3],[205,719,0],[388,370,0],[496,366,1],[954,255,2],[413,369,1],[854,352,2],[854,1202,2],[382,368,0],[467,47,2],[374,485,1],[377,439,1],[365,509,1],[424,295,1],[345,372,0],[367,464,1],[215,215,1],[345,371,0],[267,266,1],[392,376,1],[483,507,2],[361,356,1],[494,44,1],[355,354,2],[122,1153,1],[369,384,1],[446,369,0],[37,38,1],[468,627,2],[567,212,2],[370,436,1],[370,646,1],[373,488,1],[368,409,2],[433,295,1],[416,499,1],[532,45,2],[501,417,2],[410,370,2],[368,400,2],[205,773,0],[376,429,1],[347,713,0],[211,696,1],[469,618,2],[296,334,0],[347,715,0],[51,49,1],[401,372,1],[457,471,2],[378,133,1],[387,439,1],[397,365,1],[456,370,1],[703,139,2],[574,500,3],[455,372,1],[457,550,2],[34,34,1],[197,198,1],[335,608,2],[381,460,1],[419,317,1],[451,380,1],[208,209,1],[381,406,1],[366,481,1],[381,411,1],[739,200,2],[545,647,2],[406,366,1],[376,389,1],[374,387,1],[362,729,0],[971,264,2],[369,445,1],[510,371,1],[395,133,1],[366,349,1],[465,369,2],[1259,134,3],[914,355,2],[397,335,1],[366,353,1],[36,38,1],[366,436,1],[367,402,1],[381,393,1],[374,445,1],[417,501,1],[364,375,0],[486,379,0],[366,414,1],[46,645,1],[429,295,1],[350,1120,1],[370,383,1],[365,416,1],[468,843,2],[671,200,2],[369,202,1],[134,496,0],[373,334,1],[377,389,1],[366,606,1],[431,386,1],[374,442,1],[411,317,1],[966,125,3],[365,460,1],[497,497,1],[393,334,1],[366,573,1],[380,371,1],[370,571,1],[365,443,1],[317,345,0],[316,392,0],[603,372,2],[377,370,1],[119,119,1],[444,374,0],[569,44,1],[366,395,1],[438,295,1],[391,369,0],[582,475,2],[345,367,0],[296,387,0],[511,418,2],[497,441,3],[373,445,1],[366,413,1],[458,458,1],[470,398,1],[370,384,1],[357,356,2],[584,753,2],[373,383,1],[434,365,0],[456,371,1],[467,855,2],[425,317,1],[469,40,2],[131,635,0],[469,862,2],[369,383,1],[132,773,0],[448,295,1],[41,656,1],[394,374,0],[50,49,1],[262,261,1],[405,365,1],[408,607,2],[447,372,2],[400,386,1],[362,363,6],[595,42,2],[367,413,1],[268,268,1],[364,369,0],[365,562,1],[55,56,1],[373,446,1],[888,354,2],[428,428,2],[213,856,0],[367,465,1],[370,446,1],[376,433,1],[365,685,1],[392,443,1],[466,480,2],[365,558,1],[392,396,1],[208,210,1],[493,410,2],[373,389,1],[36,852,1],[393,374,1],[523,372,1],[498,45,4],[424,296,1],[441,385,3],[366,443,1],[426,507,2],[132,633,0],[439,439,1],[388,626,2],[407,127,2],[367,409,1],[379,203,1],[405,133,1],[943,123,2],[256,258,1],[366,411,1],[468,136,2],[592,404,3],[370,445,1],[393,460,1],[374,551,1],[370,464,1],[371,203,1],[437,402,2],[406,365,1],[399,374,0],[663,369,0],[389,452,1],[517,372,1],[378,384,1],[474,317,6],[366,352,1],[620,371,2],[316,345,0],[597,44,1],[377,436,1],[578,403,3],[387,334,1],[366,405,1],[510,42,2],[362,521,1],[132,363,0],[43,259,0],[367,438,1],[451,451,1],[414,373,1],[491,807,3],[365,478,1],[390,369,0],[390,370,0],[393,335,1],[539,432,3],[447,296,2],[43,544,0],[459,612,2],[366,409,1],[394,373,0],[405,392,1],[374,335,1],[385,976,1],[397,133,1],[142,967,1],[387,377,1],[395,335,1],[361,360,2],[366,351,1],[374,446,1],[410,369,2],[252,251,1],[401,334,1],[367,604,1],[648,533,2],[366,444,1],[466,134,2],[369,476,1],[367,453,1],[381,365,1],[389,481,1],[380,370,1],[420,458,1],[442,373,0],[625,462,3],[316,377,0],[502,126,2],[345,346,1],[368,392,2],[401,365,1],[450,295,1],[367,470,1],[367,383,1],[413,372,1],[411,365,1],[511,371,0],[209,398,0],[410,295,2],[387,335,1],[427,388,2],[463,378,0],[367,414,1],[379,789,3],[409,365,1],[475,128,2],[694,710,1],[45,48,1],[365,742,1],[475,677,2],[487,574,4],[560,134,3],[374,384,1],[931,422,4],[373,444,1],[455,296,1],[364,464,0],[447,371,2],[372,334,1],[429,376,1],[378,794,3],[46,462,1],[387,443,1],[45,645,1],[409,133,1],[366,453,1],[674,37,2],[381,400,1],[396,133,1],[935,423,4],[369,414,1],[516,396,1],[32,33,1],[131,363,0],[366,428,1],[367,395,1],[366,397,1],[366,439,1],[427,963,2],[400,438,1],[679,424,2],[504,45,3],[379,383,1],[402,372,0],[370,485,1],[850,200,2],[555,365,0],[373,384,1],[502,711,2],[682,684,1],[371,334,1],[368,395,2],[413,374,1],[378,334,1],[436,296,1],[129,434,1],[414,370,1],[373,476,1],[389,395,1],[425,316,1],[788,123,2],[118,117,1],[600,600,2],[317,392,0],[400,380,1],[381,370,1],[355,682,0],[582,582,2],[381,395,1],[367,451,1],[209,642,0],[379,335,1],[752,127,4],[208,457,0],[496,452,1],[372,203,1],[459,656,2],[408,374,0],[405,396,1],[456,296,1],[472,365,0],[456,295,1],[400,335,1],[347,816,0],[453,295,2],[427,653,2],[353,352,2],[411,370,1],[507,507,4],[367,405,1],[369,486,1],[146,146,1],[381,493,1],[374,562,1],[413,373,1],[488,391,5],[369,201,1],[367,442,1],[365,392,1],[369,424,1],[407,626,2],[211,1090,1],[409,370,1],[124,127,1],[537,388,3],[356,357,2],[356,710,0],[364,374,0],[136,138,1],[370,492,1],[372,455,1],[534,746,3],[378,445,1],[429,369,1],[860,210,2],[409,396,1],[662,662,2],[368,604,2],[473,365,0],[888,1442,2],[366,375,1],[257,478,1],[462,645,2],[376,576,1],[365,585,1],[467,621,2],[391,484,4],[204,202,1],[406,397,1],[372,492,1],[348,349,1],[367,384,1],[346,715,0],[513,513,2],[374,383,1],[511,370,0],[633,260,0],[468,607,2],[366,392,1],[369,474,1],[1101,1480,2],[135,647,1],[449,296,1],[373,42,1],[351,349,1],[480,539,2],[473,369,0],[414,371,1],[371,492,1],[374,424,1],[669,483,3],[367,430,1],[417,334,1],[458,420,1],[674,547,2],[365,195,1],[390,482,4],[369,380,1],[377,365,1],[382,405,0],[785,417,4],[438,380,1],[254,1355,1],[373,474,1],[472,369,0],[476,316,6],[404,368,2],[436,389,1],[399,370,0],[365,481,1],[366,358,1],[633,259,0],[401,133,1],[404,295,2],[393,395,1],[870,403,3],[379,133,1],[421,457,1],[485,294,6],[364,465,0],[509,509,4],[634,389,2],[488,297,6],[515,689,2],[364,370,0],[418,207,2],[419,387,1],[388,491,2],[317,377,0],[769,259,0],[511,372,0],[385,433,0],[317,380,0],[367,474,1],[385,429,0],[515,741,2],[430,430,2],[354,349,1],[648,792,2],[441,497,1],[44,544,0],[50,52,1],[379,446,1],[392,133,1],[671,369,0],[49,51,1],[366,406,1],[414,374,1],[536,618,2],[1574,685,4],[353,348,1],[32,31,1],[381,335,1],[453,371,2],[296,397,0],[454,295,1],[370,474,1],[466,432,2],[473,370,0],[367,446,1],[655,478,3],[387,376,1],[381,398,1],[538,751,3],[374,261,1],[54,54,1],[372,470,1],[366,500,1],[369,585,1],[472,370,0],[526,704,2],[367,657,1],[371,456,1],[551,44,2],[627,627,2],[367,460,1],[366,540,1],[371,335,1],[374,476,1],[131,351,0],[392,334,1],[469,746,2],[366,350,1],[316,397,0],[511,369,0],[623,623,2],[316,380,0],[370,203,1],[401,390,1],[365,859,1],[366,402,1],[435,296,6],[591,591,4],[265,1398,1],[433,376,1],[467,751,2],[204,443,0],[387,397,1],[410,493,2],[453,372,2],[582,128,2],[596,202,2],[419,419,1],[316,376,0],[550,550,2],[459,40,2],[367,445,1],[399,373,0],[488,378,0],[317,393,0],[379,384,1],[372,418,1],[450,296,1],[370,476,1],[374,564,1],[44,719,0],[366,586,1],[638,44,2],[551,43,2],[680,43,1],[392,403,2],[297,297,1],[408,365,0],[317,376,0],[366,384,1],[371,470,1],[395,365,1],[562,44,1],[526,766,2],[462,47,2],[345,370,0],[592,43,3],[316,400,0],[435,295,6],[367,494,1],[366,401,1],[1240,255,3],[125,124,1],[367,397,1],[472,373,0],[366,430,1],[374,474,1],[406,377,1],[296,391,1],[545,712,2],[728,417,4],[371,418,1],[473,374,0],[366,383,1],[373,404,1],[449,487,2],[369,465,1],[392,438,1],[415,443,0],[373,410,1],[570,43,2],[370,413,1],[485,390,5],[365,129,1],[294,294,1],[374,134,1],[503,503,1],[374,400,1],[570,44,2],[674,813,2],[378,203,1],[139,138,1],[359,360,1],[215,214,1],[1179,137,2],[369,377,1],[380,393,1],[369,726,1],[454,498,2],[262,483,1],[48,46,1],[196,196,1],[371,429,1],[369,543,1],[506,207,0],[317,395,0],[440,403,2],[373,555,1],[409,401,1],[369,470,1],[411,398,1],[209,913,1],[455,295,1],[728,417,1],[884,533,3],[207,494,0],[42,477,0],[462,652,2],[358,744,0],[370,424,1],[354,684,0],[505,201,2],[404,464,2],[592,44,3],[366,725,1],[369,376,1],[379,445,1],[606,44,1],[378,391,4],[413,566,3],[572,370,2],[373,258,1],[373,402,1],[373,569,1],[142,1211,1],[908,385,3],[373,393,1],[472,379,0],[417,613,1],[376,529,1],[373,531,1],[369,520,1],[210,208,1],[431,316,1],[562,43,1],[397,439,1],[317,389,0],[729,590,2],[42,39,1],[414,561,3],[416,335,1],[407,388,2],[44,568,0],[366,476,1],[367,476,1],[369,405,1],[41,459,1],[362,1266,1],[369,438,1],[1262,264,3],[37,35,1],[373,473,1],[409,45,2],[372,433,1],[373,413,1],[366,474,1],[448,296,1],[768,260,0],[126,662,1],[376,370,1],[504,594,3],[447,447,2],[424,479,2],[431,509,2],[472,383,1],[721,348,2],[392,365,1],[398,406,1],[373,426,1],[637,371,0],[121,123,1],[374,443,1],[471,370,0],[213,686,0],[401,204,2],[376,396,1],[376,405,1],[365,466,1],[481,386,1],[38,36,1],[404,465,2],[460,395,1],[373,414,1],[359,358,2],[126,1010,1],[367,485,1],[401,396,1],[374,130,1],[429,316,1],[389,371,1],[365,1586,1],[374,426,1],[545,408,2],[369,446,1],[362,744,0],[369,443,1],[296,395,0],[394,394,3],[495,495,3],[369,413,1],[295,390,1],[357,964,1],[369,477,1],[380,365,1],[374,528,1],[486,378,0],[366,446,1],[635,259,0],[377,391,1],[451,393,1],[387,392,1],[646,44,1],[404,452,2],[365,365,3],[39,41,1],[207,642,0],[366,445,1],[598,369,0],[392,367,1],[398,693,2],[384,561,4],[373,464,1],[378,418,1],[371,387,1],[140,137,1],[1550,134,5],[317,401,0],[398,395,1],[374,389,1],[410,296,2],[1032,137,2],[381,450,1],[345,435,0],[317,397,0],[428,296,2],[367,416,1],[257,256,1],[315,315,1],[380,390,1],[411,45,2],[375,335,4],[369,439,1],[361,358,1],[405,334,1],[375,334,4],[356,964,1],[355,353,1],[374,413,1],[381,369,1],[366,426,1],[571,44,1],[473,378,0],[351,350,2],[368,493,2],[391,370,0],[380,451,1],[335,387,0],[600,258,2],[1463,1208,3],[472,374,0],[449,295,1],[554,372,0],[1115,141,2],[144,145,1],[364,366,0],[135,627,1],[436,395,1],[42,656,1],[792,46,2],[504,399,3],[352,723,0],[367,403,1],[634,377,2],[396,405,1],[585,43,1],[335,377,0],[365,411,1],[376,334,1],[364,367,0],[371,442,1],[372,442,1],[345,369,0],[350,352,1],[429,452,1],[373,431,1],[380,401,1],[258,256,1],[374,452,1],[257,255,1],[457,650,2],[296,344,0],[43,568,0],[48,47,1],[778,521,2],[376,481,1],[376,409,1],[428,465,2],[295,401,0],[612,459,3],[361,362,1],[398,397,1],[378,470,1],[389,365,1],[354,1423,1],[260,347,0],[414,366,1],[485,379,0],[429,317,1],[540,371,0],[316,395,0],[381,410,1],[457,503,1],[207,569,0],[385,439,0],[466,408,2],[295,344,0],[637,372,0],[486,366,0],[643,260,4],[317,364,0],[532,621,2],[484,484,1],[953,198,2],[369,530,1],[349,353,1],[369,368,1],[378,383,1],[428,374,2],[392,380,1],[537,626,3],[354,1155,1],[404,586,2],[381,604,1],[371,487,2],[211,209,1],[369,488,1],[378,446,1],[478,255,2],[922,547,3],[430,386,2],[365,406,1],[508,410,3],[473,384,1],[364,373,0],[370,535,1],[648,49,2],[376,392,1],[381,448,1],[426,316,1],[420,663,2],[480,627,2],[348,347,1],[555,434,3],[424,386,1],[373,394,1],[251,251,1],[374,414,1],[396,392,1],[372,498,2],[370,488,1],[215,216,1],[482,482,1],[365,405,1],[467,399,2],[373,416,1],[371,444,1],[793,816,1],[429,387,1],[377,397,1],[374,660,1],[396,202,2],[367,602,1],[433,452,1],[454,296,1],[409,334,1],[362,357,1],[396,717,2],[374,541,1],[464,370,2],[793,346,2],[379,390,4],[433,316,1],[369,406,1],[385,443,0],[424,382,1],[388,372,0],[497,385,5],[511,378,0],[600,741,2],[370,655,2],[206,347,0],[584,138,2],[396,463,2],[591,408,4],[515,256,2],[205,347,0],[263,261,1],[944,398,2],[475,127,2],[625,498,3],[367,500,1],[710,694,1],[374,597,1],[769,260,0],[365,217,1],[366,42,1],[402,565,2],[411,335,1],[460,460,1],[413,366,1],[400,334,1],[373,491,1],[648,811,2],[414,378,1],[365,409,1],[805,369,0],[374,403,1],[451,401,1],[131,352,0],[120,122,1],[834,127,2],[372,525,1],[367,680,1],[466,748,2],[506,381,1],[377,395,1],[413,367,1],[813,41,2],[345,374,0],[402,831,2],[414,367,1],[428,295,2],[316,393,0],[354,352,1],[383,566,4],[365,395,1],[370,130,1],[645,645,2],[372,444,1],[480,709,2],[385,436,0],[443,295,1],[373,465,1],[318,446,2],[370,380,1],[618,394,3],[365,487,1],[411,395,1],[376,390,1],[492,373,1],[539,641,3],[382,296,0],[389,401,1],[1941,348,3],[1062,202,3],[317,400,0],[511,367,0],[397,391,1],[381,391,1],[316,401,0],[361,744,0],[392,390,1],[420,543,2],[677,388,3],[363,744,0],[576,374,1],[844,518,3],[387,373,1],[374,431,1],[636,259,4],[374,417,1],[369,637,1],[480,748,2],[371,376,1],[803,461,3],[368,348,2],[140,753,1],[357,694,0],[1159,48,3],[366,488,1],[370,208,1],[460,386,1],[404,447,2],[502,993,2],[316,419,0],[344,412,0],[569,43,1],[875,1114,1],[396,409,1],[910,206,0],[384,445,1],[125,126,1],[1025,365,0],[1103,432,4],[373,601,1],[50,51,1],[317,381,0],[768,259,0],[380,204,2],[594,399,2],[371,445,1],[200,580,0],[638,376,2],[354,690,0],[369,485,1],[534,1138,3],[206,348,0],[366,403,1],[365,494,1],[334,378,0],[404,375,2],[591,466,4],[453,369,2],[757,440,4],[608,336,4],[410,464,2],[295,393,0],[515,835,2],[486,367,0],[439,377,1],[604,44,2],[260,348,0],[366,554,1],[646,43,1],[674,38,2],[365,294,1],[373,546,1],[578,870,3],[406,335,1],[413,379,1],[46,538,1],[434,461,2],[460,393,1],[382,364,0],[560,133,3],[515,1035,2],[33,33,1],[138,140,1],[358,964,1],[856,212,2],[875,359,1],[634,387,2],[830,141,2],[404,316,2],[623,766,2],[657,44,1],[144,1211,1],[480,647,2],[1203,39,3],[362,1075,0],[368,349,2],[385,481,0],[44,812,0],[473,379,0],[367,431,1],[370,414,1],[410,447,2],[470,296,1],[396,663,2],[370,542,1],[389,334,1],[483,365,0],[378,492,1],[400,397,1],[370,409,1],[395,391,1],[441,387,0],[505,671,2],[138,141,1],[199,850,1],[367,504,1],[976,133,1],[477,296,1],[205,348,0],[316,364,0],[434,838,2],[369,449,1],[389,404,1],[430,464,2],[366,419,1],[428,382,2],[372,414,1],[406,387,1],[557,374,1],[721,723,1],[559,559,2],[344,435,0],[373,449,1],[395,393,1],[429,377,1],[380,335,1],[372,383,1],[371,612,2],[259,347,0],[420,204,2],[352,353,2],[367,375,1],[397,510,1],[444,370,0],[369,130,1],[597,43,1],[374,42,1],[761,437,4],[613,417,1],[453,453,2],[419,392,1],[365,297,1],[411,366,1],[411,377,1],[43,812,0],[118,118,1],[404,317,2],[262,263,1],[494,382,1],[396,401,1],[526,263,2],[371,41,2],[367,425,1],[472,378,0],[423,399,2],[373,454,1],[491,388,3],[675,43,1],[374,393,1],[371,527,1],[374,394,1],[380,409,1],[210,209,1],[372,448,1],[253,255,1],[507,365,0],[496,365,1],[49,1024,1],[360,356,1],[345,410,0],[367,540,1],[424,316,1],[139,140,1],[983,205,0],[370,650,1],[371,413,1],[431,317,1],[206,809,0],[381,683,1],[563,371,1],[425,425,1],[419,334,1],[536,40,2],[397,406,1],[369,492,1],[365,498,1],[430,295,2],[132,351,0],[656,656,2],[452,376,2],[37,36,1],[367,587,1],[367,426,1],[365,601,1],[433,317,1],[594,401,0],[129,345,0],[441,389,0],[360,364,1],[132,809,0],[147,147,1],[641,134,3],[361,710,0],[421,209,2],[478,565,2],[260,349,0],[693,208,4],[392,405,1],[367,492,1],[43,851,0],[49,52,1],[387,372,1],[397,377,1],[317,405,0],[366,587,1],[419,400,1],[526,867,2],[370,411,1],[116,117,1],[316,389,0],[379,413,1],[623,261,2],[259,348,0],[400,381,1],[367,554,1],[354,355,2],[366,504,1],[393,381,1],[372,821,1],[483,264,2],[364,410,0],[407,518,2],[532,47,2],[38,35,1],[526,1086,2],[564,44,1],[134,576,0],[391,378,0],[374,488,1],[354,356,1],[625,538,3],[367,428,1],[604,43,2],[296,335,0],[903,513,3],[373,403,1],[550,471,2],[371,450,1],[378,414,1],[378,490,1],[374,638,1],[125,1010,1],[442,369,0],[366,431,1],[372,446,1],[374,410,1],[744,590,2],[815,416,1],[50,1024,1],[480,136,2],[334,380,0],[384,384,1],[500,394,3],[203,717,1],[398,411,1],[398,506,1],[374,404,1],[1101,356,2],[369,516,1],[385,787,0],[146,145,1],[379,201,1],[374,258,1],[298,299,2],[370,376,1],[206,349,0],[367,649,1],[379,489,1],[1247,356,2],[486,463,2],[125,662,1],[368,455,2],[783,471,3],[347,720,0],[373,599,1],[396,371,1],[855,399,3],[121,122,1],[1112,200,2],[1941,349,3],[39,40,1],[426,317,1],[366,417,1],[505,543,2],[293,292,2],[478,835,2],[469,394,2],[390,379,0],[389,433,1],[334,373,0],[363,362,3],[400,494,1],[441,377,0],[528,374,1],[464,525,2],[596,420,1],[334,401,0],[466,709,2],[447,370,2],[371,428,1],[365,597,1],[472,367,0],[354,715,0],[369,669,2],[406,398,1],[452,296,2],[373,436,1],[391,391,1],[366,355,1],[364,527,0],[711,662,2],[335,379,0],[674,852,2],[729,359,2],[419,397,1],[381,494,1],[602,44,4],[675,44,1],[476,369,0],[739,198,2],[430,373,2],[586,43,4],[317,406,0],[365,475,1],[435,316,6],[795,208,2],[452,382,2],[778,364,2],[135,408,1],[387,374,1],[495,372,3],[692,416,1],[721,690,1],[373,485,1],[387,771,1],[531,373,1],[435,317,6],[315,445,2],[381,510,1],[678,42,3],[396,376,1],[371,383,1],[637,379,0],[334,392,0],[415,438,0],[434,653,2],[55,55,1],[505,505,1],[377,442,1],[371,384,1],[472,372,0],[830,703,2],[430,296,2],[860,212,2],[1032,138,2],[399,399,3],[502,803,2],[262,264,1],[374,465,1],[371,804,1],[837,134,3],[427,996,2],[371,426,1],[612,487,3],[367,258,1],[374,449,1],[902,398,2],[609,396,1],[364,525,0],[381,397,1],[395,398,1],[741,402,3],[43,633,0],[380,444,1],[295,376,0],[1101,2034,2],[370,368,1],[443,392,1],[372,474,1],[500,500,3],[381,523,1],[370,211,1],[50,792,1],[937,352,2],[316,411,0],[578,483,3],[373,45,1],[374,454,1],[383,446,1],[378,201,1],[520,369,1],[452,386,2],[125,128,1],[373,683,1],[533,533,2],[481,389,1],[348,350,1],[460,381,1],[622,376,1],[380,405,1],[550,370,0],[366,45,1],[495,404,3],[374,701,1],[354,353,2],[38,1104,1],[316,409,0],[367,473,1],[586,44,4],[854,351,2],[371,377,1],[421,642,1],[374,588,1],[364,404,0],[204,438,0],[316,398,0],[320,320,1],[366,529,1],[711,123,2],[199,953,0],[370,451,1],[390,390,1],[357,358,1],[751,399,3],[447,366,2],[383,383,1],[371,404,1],[1338,52,2],[374,464,1],[509,365,0],[369,473,1],[477,552,1],[374,438,1],[372,413,1],[1189,368,2],[120,123,1],[419,335,1],[374,441,1],[410,465,2],[379,444,4],[424,317,1],[197,196,1],[373,261,1],[205,349,0],[405,401,1],[370,45,1],[491,365,0],[388,369,0],[435,378,6],[367,488,1],[378,476,1],[434,824,2],[854,1442,2],[393,365,1],[2145,365,1],[470,295,1],[131,206,0],[534,394,3],[545,136,2],[910,205,0],[565,831,3],[417,785,5],[472,366,0],[314,313,1],[267,268,1],[132,352,0],[400,372,1],[511,379,0],[351,713,0],[395,381,1],[135,133,1],[458,463,2],[614,614,2],[374,429,1],[466,591,2],[295,334,0],[447,367,2],[49,47,1],[202,203,1],[368,401,2],[370,517,1],[388,371,0],[210,457,0],[366,425,1],[373,697,1],[139,753,1],[422,394,2],[316,381,0],[365,501,1],[602,43,4],[379,492,1],[347,558,1],[44,633,0],[349,351,1],[1483,1890,3],[366,367,1],[370,541,1],[431,382,1],[199,1464,1],[210,212,1],[369,676,1],[454,317,1],[372,404,1],[413,378,1],[1097,355,2],[478,848,2],[372,46,2],[449,316,1],[711,711,2],[37,1104,1],[216,216,1],[368,456,2],[374,705,1],[482,294,1],[371,392,1],[482,379,0],[43,635,0],[659,43,2],[296,381,0],[367,419,1],[334,393,0],[386,425,0],[372,389,1],[410,317,2],[401,409,1],[637,378,0],[442,370,0],[261,263,1],[44,851,0],[429,429,1],[462,625,2],[1151,423,4],[130,427,1],[372,376,1],[433,377,1],[365,564,1],[390,367,0],[374,473,1],[418,393,0],[450,317,1],[379,474,1],[605,371,3],[365,499,1],[372,430,1],[477,295,1],[484,297,1],[478,258,2],[483,867,2],[368,397,2],[967,141,2],[371,476,1],[648,648,2],[484,378,0],[208,207,1],[366,485,1],[658,377,3],[126,427,1],[555,479,3],[364,428,0],[372,410,1],[293,1675,1],[365,497,1],[435,379,6],[373,460,1],[975,396,2],[443,386,1],[444,369,0],[446,379,0],[345,346,2],[637,370,0],[37,813,1],[422,39,2],[547,547,2],[422,746,2],[373,400,1],[345,412,0],[465,527,2],[365,573,1],[386,448,0],[389,335,1],[452,592,2],[571,43,1],[414,384,4],[367,129,2],[550,650,2],[374,402,1],[424,381,1],[259,349,0],[659,44,2],[503,696,2],[395,460,1],[366,470,1],[684,742,2],[369,609,1],[366,261,1],[372,431,1],[371,201,1],[317,398,0],[416,692,5],[406,133,1],[684,713,1],[205,350,0],[260,350,0],[389,731,1],[372,393,1],[826,44,2],[300,300,1],[354,350,1],[446,370,0],[818,43,2],[429,404,1],[436,370,1],[446,373,0],[596,463,2],[955,356,2],[829,370,0],[612,42,3],[335,397,0],[524,382,1],[445,378,0],[2014,365,1],[369,557,1],[416,815,1],[453,366,2],[395,523,1],[379,470,1],[472,371,0],[475,996,2],[729,359,3],[317,396,0],[387,540,1],[393,371,1],[506,388,2],[529,480,3],[377,334,1],[257,835,1],[428,366,2],[584,703,2],[372,516,1],[433,370,1],[1368,353,2],[490,391,4],[446,374,0],[496,134,2],[1484,1716,2],[397,398,1],[544,1107,0],[298,1645,1],[445,369,0],[372,401,1],[316,405,0],[371,414,1],[433,404,1],[406,381,1],[316,396,0],[365,407,1],[207,644,0],[450,369,1],[266,264,1],[38,40,1],[44,635,0],[376,401,1],[445,370,0],[1239,368,2],[436,366,1],[409,392,1],[403,870,2],[294,489,0],[395,411,1],[473,373,0],[295,400,0],[495,371,3]]} diff --git a/variants/sparse-standard-21bin/sparse_router_config.yaml b/variants/sparse-standard-21bin/sparse_router_config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fe0bbcaf3e38931ebf7d07e460d393ec46ad87fb --- /dev/null +++ b/variants/sparse-standard-21bin/sparse_router_config.yaml @@ -0,0 +1,372 @@ +model_type: actioncodec2_sparse_router +config_version: 1 +profiles: +- name: joint + token_offset: 0 + token_budget: 4096 + artifact_fingerprint: 04618dcfed988a88968c5163fcdee6ee17e0bf6f37228b9eaf90785efb92c52c +- name: eef + token_offset: 4096 + token_budget: 4096 + artifact_fingerprint: b171fa5026046304fad4fc8a28646bafba4ba6f1f16243b049a2af681cffd247 +presets: +- name: dual_eef_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_eef_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_abs + input_dim: 16 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_delta + input_dim: 16 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper + input_dim: 6 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi +- name: single_joint6_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_abs + input_dim: 8 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_delta + input_dim: 8 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 diff --git a/variants/sparse-standard-2bin/config.json b/variants/sparse-standard-2bin/config.json new file mode 100644 index 0000000000000000000000000000000000000000..f7d16472edea73c2ca2aff65a40b062aff408c4a --- /dev/null +++ b/variants/sparse-standard-2bin/config.json @@ -0,0 +1,7 @@ +{ + "model_type": "actioncodec2_sparse", + "processor_class": "ActionCodec2Sparse", + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-standard-2bin/processor_config.json b/variants/sparse-standard-2bin/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..74792b92bae7cde47c556e7007e0658014afd7b9 --- /dev/null +++ b/variants/sparse-standard-2bin/processor_config.json @@ -0,0 +1,61 @@ +{ + "processor_class": "ActionCodec2Sparse", + "action_space": "single_eef_delta", + "fitted_profiles": [ + "eef", + "joint" + ], + "preprocessing": { + "eef": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": [ + 0, + 1, + 2 + ], + "gripper_mode": "binary", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "eef", + "context_frames": 1, + "motion_limits": null, + "translation_limit": 0.00125, + "rotation_limit": 0.005 + }, + "joint": { + "tau": 0.002, + "min_idle_steps": 15, + "savgol_window": 9, + "savgol_polyorder": 3, + "ease_horizon": 0, + "smooth_columns": null, + "gripper_mode": "binary", + "gripper_threshold": 0.8, + "gripper_median_window": 5, + "version": 2, + "trim_mode": "bounded", + "profile": "joint", + "context_frames": 1, + "motion_limits": [ + 0.001, + 0.001, + 0.0015, + 0.001875, + 0.00375, + 0.005, + 0.005 + ], + "translation_limit": null, + "rotation_limit": null + } + }, + "auto_map": { + "AutoProcessor": "processing_actioncodec2.ActionCodec2" + } +} diff --git a/variants/sparse-standard-2bin/profiles/eef/config.json b/variants/sparse-standard-2bin/profiles/eef/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/eef/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-standard-2bin/profiles/eef/config.yaml b/variants/sparse-standard-2bin/profiles/eef/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f30cc2bf134463476ba19f66bac9645cc608d273 --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/eef/config.yaml @@ -0,0 +1,78 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 7 + components: + translation_m: + dims: + start: 0 + stop: 3 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -2.0 + max: 2.0 + order_1: + min: -0.08 + max: 0.08 + distortion_limit: 0.005 + primitive_selection: smooth + orientation_so3: + dims: + start: 3 + stop: 6 + space: so3 + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -3.141592653589793 + max: 3.141592653589793 + order_1: + min: -0.25 + max: 0.25 + distortion_limit: 0.02 + primitive_selection: momentum_lazy + representation: rotation_vector + multiplication: right + gripper_open_command: + dims: + - 6 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - translation_m + - orientation_so3 + bpe: + spatial_vocab_size: 171 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-standard-2bin/profiles/eef/primitives.npz b/variants/sparse-standard-2bin/profiles/eef/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..5b476e918c133e6ff22fbd3aa9adce431e4c2df8 --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/eef/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d44c81be991acc0cc5319fe26eb2e06a43fb0b637f1c4671477f038a2065322 +size 3038 diff --git a/variants/sparse-standard-2bin/profiles/eef/processor_config.json b/variants/sparse-standard-2bin/profiles/eef/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/eef/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-standard-2bin/profiles/eef/sparse_bpe.json b/variants/sparse-standard-2bin/profiles/eef/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..fd05cfaaca584f1be9dc8fffaae9e228fb212068 --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/eef/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[17,17,17,41,41,41,2],"zero":[8,8,8,20,20,20,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[170,170,1],[170,108,1],[170,107,1],[170,67,1],[170,68,1],[170,39,1],[171,171,2],[170,40,1],[172,40,1],[173,39,1],[170,148,1],[170,147,1],[8,8,2],[7,7,2],[23,23,2],[24,24,2],[147,147,1],[148,148,1],[170,8,1],[171,39,2],[170,7,1],[175,39,1],[174,39,1],[172,68,1],[172,67,1],[173,67,1],[174,40,1],[173,68,1],[170,23,1],[170,24,1],[177,177,4],[175,40,1],[171,40,2],[174,23,1],[184,184,4],[171,107,2],[183,183,4],[175,24,1],[69,69,1],[66,66,1],[171,67,2],[185,185,4],[171,68,2],[186,186,4],[179,67,1],[179,68,1],[109,109,1],[180,68,1],[171,108,2],[172,39,1],[180,67,1],[106,106,1],[176,148,1],[173,40,1],[176,147,1],[184,7,4],[8,8,3],[174,174,1],[175,175,1],[177,171,4],[178,147,1],[178,148,1],[171,148,2],[171,147,2],[23,174,0],[24,175,0],[183,8,4],[173,173,1],[6,6,2],[7,7,3],[172,172,1],[149,149,1],[146,146,1],[185,23,4],[187,147,2],[108,168,0],[41,41,2],[186,24,4],[188,148,2],[9,9,2],[25,25,2],[107,168,0],[22,22,2],[171,8,2],[180,173,1],[171,176,2],[172,179,1],[174,147,1],[170,66,1],[170,69,1],[175,148,1],[172,7,1],[178,109,1],[173,8,1],[171,23,2],[171,24,2],[190,107,2],[173,176,1],[172,147,1],[182,182,1],[38,38,2],[181,181,1],[172,148,1],[173,24,1],[173,180,1],[173,23,1],[203,108,2],[67,168,0],[68,168,0],[171,7,2],[8,8,4],[172,23,1],[172,24,1],[176,106,1],[172,178,1],[171,178,2],[174,148,1],[175,147,1],[7,7,4],[173,148,1],[187,187,2],[173,147,1],[188,188,2],[171,174,2],[185,174,0],[171,175,2],[186,175,0],[177,39,4],[179,179,1],[170,109,1],[181,24,1],[182,23,1],[171,173,2],[170,183,1],[39,169,0],[171,189,2],[168,177,0],[70,70,1],[170,106,1],[171,181,2],[65,65,1],[174,8,1],[176,24,1],[172,8,1],[171,182,2],[170,184,1],[170,169,1],[176,23,1],[176,173,1],[179,147,1],[196,40,1],[40,168,0],[175,8,1],[175,7,1],[180,148,1],[209,69,2],[171,191,2],[177,40,4],[210,66,2],[194,39,1],[179,148,1],[174,7,1],[170,168,1],[178,23,1],[176,8,1],[181,23,1],[182,24,1],[195,39,1],[39,168,0],[110,110,1],[180,147,1],[171,172,2],[171,199,2],[198,40,1],[105,105,1],[171,200,2],[173,7,1],[67,169,0],[178,24,1],[40,246,0],[68,169,0],[179,172,1],[174,185,1],[178,217,1],[180,180,1],[182,187,2],[170,149,1],[169,177,0],[175,186,1],[148,181,0],[170,146,1],[183,183,3],[178,7,1],[182,8,1],[179,23,1],[181,8,1],[180,24,1],[170,209,1],[178,172,1],[170,185,1],[179,24,1],[239,6,4],[181,188,2],[192,24,1],[147,182,0],[177,107,4],[173,174,1],[180,23,1],[194,24,1],[193,23,1],[195,23,1],[197,23,1],[173,175,1],[210,210,2],[172,174,1],[181,7,1],[170,186,1],[172,175,1],[182,7,1],[222,222,2],[198,24,1],[39,252,0],[177,67,4],[196,23,1],[184,184,3],[250,9,4],[176,7,1],[177,68,4],[182,174,1],[179,7,1],[146,187,1],[149,188,1],[202,24,1],[247,41,4],[190,67,2],[181,175,1],[176,176,1],[190,68,2],[212,174,0],[107,169,0],[108,169,0],[217,109,2],[214,175,0],[251,25,4],[204,174,1],[170,205,1],[8,174,0],[8,173,0],[208,175,1],[26,26,2],[150,150,1],[177,108,4],[69,69,2],[253,22,4],[66,66,2],[188,175,0],[145,145,1],[147,168,0],[187,174,0],[178,178,1],[192,175,1],[222,106,2],[148,168,0],[197,147,1],[192,148,1],[193,174,1],[170,207,1],[194,194,1],[209,209,2],[181,174,1],[195,195,1],[178,8,1],[198,198,1],[196,196,1],[203,67,2],[176,174,1],[182,175,1],[193,147,1],[21,21,2],[176,175,1],[203,68,2],[8,175,0],[242,149,2],[176,170,1],[180,7,1],[184,6,4],[243,146,2],[5,5,2],[202,148,1],[177,8,4],[197,174,1],[180,8,1],[190,148,2],[178,170,1],[8,172,0],[7,172,0],[174,24,1],[7,175,0],[177,148,4],[185,185,3],[186,186,3],[177,147,4],[202,175,1],[215,23,1],[199,174,1],[170,210,1],[217,217,2],[211,23,2],[190,147,2],[109,172,0],[200,175,1],[173,181,1],[216,24,1],[176,181,1],[176,189,1],[176,206,1],[213,24,2],[173,182,1],[175,23,1],[174,204,1],[187,172,0],[9,183,2],[106,173,0],[177,23,4],[188,172,0],[177,24,4],[271,38,4],[176,182,1],[218,24,1],[10,10,2],[7,174,0],[41,42,2],[176,69,1],[178,66,1],[175,208,1],[189,23,1],[189,24,1],[172,182,1],[193,148,1],[221,23,1],[192,147,1],[172,181,1],[188,173,0],[172,220,1],[176,66,1],[202,147,1],[7,173,0],[170,174,1],[178,174,1],[191,23,1],[191,24,1],[178,69,1],[177,7,4],[71,71,1],[197,148,1],[188,174,0],[187,173,0],[179,8,1],[170,175,1],[187,175,0],[178,175,1],[203,147,2],[168,230,0],[242,242,2],[173,224,1],[176,222,1],[170,226,1],[25,186,2],[243,243,2],[239,239,4],[148,169,0],[147,169,0],[187,179,0],[173,190,1],[216,194,1],[170,212,1],[215,195,1],[110,109,1],[6,184,2],[170,176,1],[22,185,2],[183,227,4],[174,199,1],[8,176,0],[64,64,1],[182,172,1],[189,176,1],[181,173,1],[218,198,1],[149,181,0],[175,200,1],[250,250,4],[182,173,1],[170,214,1],[106,105,1],[203,148,2],[109,179,0],[181,172,1],[8,23,0],[221,196,1],[8,24,0],[305,107,0],[146,146,2],[174,193,1],[70,209,1],[177,176,4],[175,192,1],[168,201,0],[70,69,1],[7,178,0],[188,179,0],[172,41,1],[188,180,0],[172,170,1],[65,210,1],[66,174,0],[177,178,4],[183,9,4],[171,180,2],[173,192,1],[181,176,1],[106,180,0],[7,23,0],[251,251,4],[168,176,0],[65,66,1],[69,175,0],[7,24,0],[173,193,1],[177,190,4],[37,37,1],[173,170,1],[5,6,2],[182,176,1],[170,217,1],[42,42,2],[169,230,0],[204,147,1],[26,25,2],[172,205,1],[211,174,2],[148,149,1],[187,180,0],[173,183,1],[178,182,1],[8,182,0],[175,172,1],[198,218,1],[172,197,1],[196,221,1],[181,223,1],[40,169,0],[174,182,1],[175,214,1],[172,184,1],[208,148,1],[185,22,4],[172,183,1],[175,173,1],[194,216,1],[171,169,2],[177,189,4],[174,212,1],[174,173,1],[177,191,4],[104,104,1],[171,179,2],[253,253,4],[195,215,1],[21,22,2],[175,181,1],[186,25,4],[182,225,1],[8,181,0],[177,173,4],[177,203,4],[172,202,1],[247,247,4],[178,181,1],[178,179,1],[177,174,4],[176,38,3],[23,173,0],[177,206,4],[24,173,0],[174,197,1],[170,237,1],[7,182,0],[7,181,0],[174,172,1],[171,168,2],[41,178,0],[106,196,0],[177,199,4],[177,200,4],[195,147,1],[213,175,2],[170,222,1],[170,178,1],[190,173,2],[110,217,1],[180,175,1],[197,109,1],[177,175,4],[178,219,1],[180,174,1],[106,198,0],[175,202,1],[24,172,0],[23,172,0],[146,182,0],[111,111,1],[215,215,1],[202,109,1],[173,207,1],[183,8,5],[226,6,6],[216,216,1],[23,182,0],[150,149,1],[7,179,0],[192,173,1],[190,108,2],[168,178,0],[172,176,1],[169,201,0],[69,194,0],[40,278,0],[24,181,0],[193,173,1],[191,178,1],[185,228,0],[67,246,0],[68,246,0],[177,181,4],[345,105,2],[209,170,0],[39,279,0],[173,184,1],[186,229,0],[7,176,0],[177,182,4],[40,279,0],[23,168,0],[177,211,4],[66,196,0],[24,168,0],[8,168,0],[183,227,1],[179,174,1],[69,198,0],[188,249,2],[39,278,0],[187,245,2],[180,181,1],[210,170,0],[226,184,5],[24,174,0],[179,175,1],[184,239,4],[218,218,1],[188,176,0],[177,213,4],[208,147,1],[10,9,2],[189,174,1],[66,195,0],[224,224,1],[70,71,1],[23,175,0],[8,183,3],[178,191,1],[177,219,4],[177,172,4],[228,174,2],[220,147,1],[182,170,1],[169,176,0],[181,170,1],[204,148,1],[7,184,3],[229,175,2],[180,176,1],[194,148,1],[68,252,0],[180,182,1],[223,181,1],[67,252,0],[38,38,1],[196,147,1],[65,64,1],[225,182,1],[206,67,2],[197,172,1],[220,172,1],[206,176,2],[179,205,1],[206,68,2],[221,221,1],[178,205,1],[202,172,1],[174,170,1],[187,176,0],[199,211,1],[175,176,1],[192,192,1],[179,182,1],[238,176,2],[42,41,2],[185,195,0],[186,194,0],[168,173,0],[171,204,2],[23,181,0],[24,176,0],[24,182,0],[220,148,1],[179,178,1],[146,245,1],[190,8,2],[200,213,1],[174,176,1],[170,173,1],[193,193,1],[235,147,1],[203,107,2],[175,182,1],[188,149,2],[224,147,1],[150,242,1],[224,173,1],[7,168,0],[171,208,2],[170,172,1],[194,147,1],[170,182,1],[231,182,1],[109,195,0],[23,176,0],[25,420,2],[237,183,5],[173,223,1],[211,108,2],[198,148,1],[8,9,2],[230,148,6],[174,181,1],[170,181,1],[200,176,1],[213,108,2],[187,178,0],[215,147,1],[171,317,2],[145,243,1],[172,203,1],[199,176,1],[184,7,5],[193,106,1],[192,106,1],[179,181,1],[230,147,6],[236,148,1],[169,173,0],[197,197,1],[180,38,3],[171,235,2],[179,41,3],[232,181,1],[271,271,4],[178,207,1],[189,175,1],[172,231,1],[222,105,2],[172,66,1],[193,8,1],[189,190,1],[308,308,2],[228,147,2],[168,174,0],[185,196,0],[7,6,2],[173,225,1],[248,175,0],[233,181,2],[22,449,2],[340,110,2],[171,236,2],[168,182,0],[199,66,1],[234,182,2],[186,198,0],[168,181,0],[188,192,0],[298,107,4],[185,197,0],[8,178,0],[173,69,1],[200,69,1],[172,69,1],[40,411,0],[170,65,1],[109,194,0],[168,175,0],[224,148,1],[178,184,1],[183,183,5],[212,197,0],[229,148,2],[172,207,1],[170,70,1],[192,8,1],[179,285,1],[173,66,1],[191,175,1],[187,195,0],[311,311,2],[149,249,1],[328,108,4],[230,23,6],[202,7,1],[187,196,0],[188,178,0],[179,257,1],[187,193,0],[190,206,2],[172,232,1],[184,226,3],[23,147,0],[171,333,2],[230,24,6],[169,174,0],[191,6,3],[189,173,1],[183,250,4],[202,202,1],[194,7,1],[244,174,0],[176,180,1],[188,198,0],[190,24,2],[22,21,2],[25,26,2],[185,182,0],[223,24,1],[145,146,1],[186,181,0],[170,242,1],[191,176,1],[194,175,1],[173,189,1],[230,7,6],[192,7,1],[24,148,0],[182,178,1],[228,199,2],[190,23,2],[230,8,6],[187,197,0],[216,148,1],[198,147,1],[212,195,0],[170,243,1],[231,23,1],[196,8,1],[150,151,1],[179,184,1],[255,176,2],[219,172,2],[144,144,1],[200,181,1],[218,148,1],[175,170,1],[230,176,6],[189,181,1],[195,7,1],[191,174,1],[170,41,1],[186,202,0],[178,106,1],[183,237,3],[168,172,0],[225,23,1],[214,202,0],[221,147,1],[8,169,0],[193,7,1],[169,175,0],[186,192,0],[188,194,0],[173,205,1],[211,147,2],[206,23,2],[195,174,1],[203,172,2],[146,291,1],[181,149,2],[189,182,1],[196,174,1],[198,8,1],[104,105,1],[229,200,2],[199,182,1],[198,175,1],[170,244,1],[206,24,2],[170,248,1],[23,169,0],[217,178,0],[207,207,1],[171,268,2],[212,228,0],[195,8,1],[197,7,1],[169,181,0],[189,172,1],[213,148,2],[232,24,1],[198,7,1],[196,7,1],[185,172,0],[194,8,1],[185,193,0],[182,66,1],[173,38,1],[219,23,2],[230,178,6],[182,231,1],[350,67,0],[180,184,1],[186,172,0],[24,169,0],[171,223,2],[173,227,1],[204,8,1],[185,215,0],[10,250,2],[211,8,2],[214,229,0],[219,24,2],[179,66,1],[214,194,0],[197,8,1],[206,8,2],[208,7,1],[249,149,3],[168,190,0],[236,147,1],[458,6,4],[195,148,1],[168,189,0],[169,182,0],[168,171,0],[181,178,1],[237,9,6],[206,173,2],[350,68,0],[222,176,0],[106,345,1],[241,178,2],[196,148,1],[205,184,3],[181,180,1],[186,173,0],[209,326,2],[188,202,0],[110,111,1],[235,148,1],[305,108,0],[205,205,1],[176,183,1],[181,232,1],[199,178,1],[190,189,2],[289,6,2],[191,173,1],[182,179,1],[181,69,1],[174,178,1],[210,329,2],[41,179,0],[255,180,2],[203,23,2],[230,173,6],[308,70,2],[212,215,0],[186,216,0],[234,23,2],[41,109,0],[182,180,1],[220,220,1],[170,38,1],[311,65,2],[9,500,2],[219,178,2],[248,25,6],[233,24,2],[173,178,1],[230,191,6],[7,147,0],[208,8,1],[172,195,1],[260,175,1],[8,147,0],[244,22,6],[168,191,0],[7,148,0],[211,199,2],[189,178,1],[203,7,2],[172,191,1],[171,225,2],[72,72,1],[228,8,2],[340,340,2],[200,178,1],[5,239,2],[175,178,1],[259,174,1],[203,24,2],[185,173,0],[204,7,1],[207,174,0],[172,194,1],[223,173,1],[106,221,0],[202,217,1],[185,179,0],[180,69,1],[199,173,1],[200,173,1],[171,227,2],[172,189,1],[172,187,1],[213,8,2],[220,24,1],[188,193,0],[214,216,0],[179,69,1],[63,63,1],[106,218,0],[197,217,1],[171,193,2],[173,198,1],[172,240,1],[181,179,1],[187,192,0],[173,196,1],[305,68,0],[230,174,6],[172,226,1],[183,174,0],[188,218,0],[146,243,2],[305,67,0],[202,8,1],[204,22,3],[23,178,0],[187,194,0],[24,147,0],[176,199,1],[168,206,0],[175,109,1],[225,173,1],[213,200,2],[176,200,1],[171,192,2],[208,25,3],[295,170,1],[149,149,2],[27,27,1],[187,215,0],[151,151,1],[40,351,0],[168,199,0],[40,348,0],[186,170,0],[175,180,1],[7,180,0],[193,24,1],[8,180,0],[176,190,1],[207,183,3],[227,174,0],[270,182,2],[220,23,1],[219,148,2],[191,182,1],[187,221,0],[191,181,1],[230,199,6],[172,247,1],[256,173,3],[169,189,0],[230,175,6],[219,147,2],[168,200,0],[191,172,1],[186,218,0],[182,109,1],[206,180,2],[392,68,0],[20,20,1],[188,195,0],[174,180,1],[209,181,0],[187,198,0],[230,200,6],[43,43,1],[188,196,0],[207,183,1],[223,23,1],[175,184,1],[7,201,0],[39,246,0],[174,109,1],[179,170,1],[206,147,2],[206,148,2],[230,189,6],[185,170,0],[189,66,1],[228,148,2],[272,181,2],[229,147,2],[368,170,1],[191,69,1],[186,180,0],[267,173,2],[231,24,1],[37,38,2],[26,251,2],[225,24,1],[211,148,2],[176,184,1],[213,147,2],[297,170,1],[5,4,2],[23,148,0],[172,209,1],[216,147,1],[179,187,1],[179,194,1],[210,182,0],[185,181,0],[199,170,1],[176,172,1],[229,8,2],[241,24,2],[232,23,1],[106,224,0],[179,195,1],[229,7,2],[186,182,0],[192,23,1],[212,196,0],[199,181,1],[207,173,0],[198,176,1],[170,247,1],[6,226,2],[222,170,0],[230,181,6],[200,182,1],[175,194,1],[277,68,2],[168,203,0],[8,148,0],[183,183,1],[185,221,0],[175,198,1],[196,24,1],[172,171,1],[188,216,0],[172,227,1],[179,262,1],[197,212,1],[186,176,0],[173,209,1],[180,66,1],[181,184,1],[189,170,1],[392,67,0],[149,293,1],[277,67,2],[196,176,1],[214,192,0],[230,182,6],[213,7,2],[70,326,1],[219,8,2],[214,198,0],[241,23,2],[179,215,1],[180,170,1],[174,195,1],[267,68,2],[7,169,0],[65,329,1],[171,228,2],[172,188,1],[25,248,2],[233,23,2],[200,170,1],[238,24,2],[423,70,1],[212,182,0],[185,178,0],[179,263,1],[145,144,1],[214,181,0],[179,216,1],[70,524,1],[281,9,2],[173,255,1],[192,181,1],[191,66,1],[22,244,2],[176,109,1],[174,184,1],[178,257,1],[193,182,1],[238,23,2],[189,69,1],[178,171,1],[172,210,1],[179,202,1],[175,205,1],[189,199,1],[234,24,2],[198,23,1],[9,237,2],[196,182,1],[231,172,1],[245,146,3],[176,207,1],[187,204,0],[178,173,1],[181,109,1],[425,65,1],[179,197,1],[193,222,1],[212,170,0],[206,190,2],[214,172,0],[224,23,1],[178,199,1],[256,8,3],[178,41,3],[182,69,1],[179,188,1],[217,170,0],[211,7,2],[224,24,1],[191,203,1],[189,200,1],[267,67,2],[197,195,1],[173,188,1],[171,241,2],[219,179,2],[202,194,1],[192,236,1],[186,251,4],[182,184,1],[65,555,1],[175,106,1],[307,40,4],[228,204,2],[191,170,1],[228,7,2],[188,208,0],[284,105,2],[40,252,0],[195,24,1],[216,7,1],[192,180,1],[173,210,1],[200,189,1],[171,229,2],[179,240,1],[227,176,0],[241,147,2],[174,244,1],[193,180,1],[214,170,0],[322,147,0],[212,178,0],[227,175,0],[211,235,2],[23,278,0],[197,24,1],[171,272,2],[179,226,1],[24,279,0],[219,7,2],[171,270,2],[345,345,2],[174,196,1],[254,176,2],[171,264,2],[193,235,1],[169,199,0],[173,187,1],[185,176,0],[178,203,1],[172,199,1],[420,25,4],[202,23,1],[242,170,0],[178,110,1],[174,207,1],[179,231,1],[194,330,1],[21,253,2],[208,192,1],[198,181,1],[174,183,1],[181,66,1],[109,215,0],[227,173,0],[179,183,1],[38,180,0],[205,172,0],[213,236,2],[175,248,1],[197,235,1],[421,421,2],[193,176,1],[241,148,2],[178,183,1],[427,427,2],[10,11,2],[194,23,1],[224,207,1],[211,204,2],[178,200,1],[185,253,4],[170,180,1],[232,172,1],[192,222,1],[193,204,1],[195,338,1],[190,181,2],[223,8,1],[241,172,2],[41,197,0],[348,107,0],[6,458,2],[182,245,2],[238,148,2],[233,8,2],[218,7,1],[179,207,1],[191,199,1],[174,106,1],[229,208,2],[200,25,3],[234,8,2],[171,231,2],[205,170,0],[238,147,2],[212,172,0],[169,200,0],[182,146,2],[36,36,1],[225,8,1],[239,184,4],[199,189,1],[192,208,1],[238,8,2],[192,176,1],[213,208,2],[169,172,0],[193,196,1],[187,202,0],[169,190,0],[449,22,4],[173,191,1],[189,9,3],[175,207,1],[180,183,1],[168,211,0],[362,227,4],[175,179,1],[171,285,2],[171,183,2],[230,172,6],[184,184,5],[171,202,2],[171,197,2],[65,384,1],[199,22,3],[172,186,1],[221,7,1],[169,180,0],[354,178,1],[192,198,1],[214,178,0],[351,107,0],[215,7,1],[38,176,0],[171,240,2],[218,147,1],[168,180,0],[322,148,0],[170,326,1],[181,249,2],[168,256,0],[205,175,0],[263,24,1],[195,182,1],[179,232,1],[175,183,1],[169,178,0],[263,23,1],[339,148,0],[168,213,0],[109,216,0],[312,174,1],[360,168,0],[197,204,1],[375,168,0],[173,199,1],[244,185,5],[339,147,0],[200,172,1],[215,8,1],[212,173,0],[194,181,1],[215,148,1],[321,196,1],[170,329,1],[212,193,0],[180,198,1],[180,196,1],[255,24,2],[168,219,0],[197,182,1],[174,179,1],[214,173,0],[240,175,0],[173,200,1],[180,188,1],[185,259,0],[254,23,2],[103,103,1],[191,200,1],[243,170,0],[308,71,2],[309,105,2],[168,233,0],[205,178,0],[432,105,3],[199,172,1],[254,24,2],[255,23,2],[149,242,2],[248,186,5],[206,7,2],[204,193,1],[271,38,1],[178,189,1],[172,245,1],[238,173,2],[202,236,1],[221,148,1],[185,258,0],[172,200,1],[216,8,1],[168,234,0],[171,232,2],[247,247,1],[211,182,2],[273,24,1],[176,191,1],[269,23,1],[174,205,1],[189,180,1],[178,210,1],[351,108,0],[187,146,2],[213,181,2],[344,198,1],[179,209,1],[41,217,0],[262,147,1],[276,147,1],[190,182,2],[38,271,1],[179,210,1],[175,297,1],[171,238,2],[220,8,1],[221,8,1],[174,295,1],[7,170,0],[299,147,2],[202,214,1],[109,110,1],[311,64,2],[186,260,0],[194,178,1],[173,226,1],[278,147,0],[176,275,1],[188,197,0],[170,307,1],[190,174,2],[169,206,0],[203,219,2],[302,182,1],[8,201,0],[207,170,0],[180,187,1],[168,286,0],[272,24,2],[212,181,0],[193,181,1],[348,108,0],[255,148,2],[323,175,1],[195,178,1],[209,173,0],[274,147,1],[223,175,1],[184,184,1],[186,261,0],[262,148,1],[301,181,1],[502,42,4],[214,182,0],[176,238,1],[104,345,1],[235,8,1],[186,178,0],[231,7,1],[202,208,1],[172,249,1],[218,8,1],[274,148,1],[169,191,0],[264,173,1],[264,147,1],[190,7,2],[179,282,1],[476,170,1],[207,175,0],[241,7,2],[170,384,1],[192,182,1],[146,145,1],[324,175,1],[185,180,0],[190,175,2],[202,181,1],[264,180,1],[270,23,2],[225,174,1],[223,7,1],[232,7,1],[183,237,1],[240,174,0],[205,226,3],[279,148,0],[220,7,1],[291,245,4],[169,211,0],[269,24,1],[276,148,1],[265,211,2],[23,201,0],[179,283,1],[173,249,1],[255,147,2],[236,7,1],[247,41,1],[72,71,1],[500,9,4],[24,201,0],[330,194,1],[69,308,1],[262,24,1],[182,183,1],[172,204,1],[234,174,2],[192,186,1],[205,184,1],[197,185,1],[180,189,1],[38,38,3],[262,172,1],[233,175,2],[236,8,1],[264,148,1],[262,23,1],[173,245,1],[264,24,1],[181,183,1],[176,227,1],[196,321,1],[266,213,2],[338,195,1],[199,191,1],[601,37,2],[170,295,1],[186,209,0],[524,71,2],[41,263,0],[70,439,1],[176,146,1],[332,174,1],[181,200,1],[65,259,0],[192,170,1],[171,184,2],[205,174,0],[178,226,1],[293,249,4],[257,147,2],[70,260,0],[177,317,4],[168,280,0],[193,170,1],[256,206,3],[169,213,0],[203,191,2],[208,181,1],[257,24,2],[172,216,1],[168,254,0],[174,222,1],[179,245,1],[180,207,1],[189,211,1],[41,202,0],[209,182,0],[66,311,1],[299,148,2],[189,171,1],[63,64,1],[172,215,1],[172,235,1],[204,182,1],[182,199,1],[274,173,1],[169,171,0],[172,185,1],[274,180,1],[264,23,1],[176,192,1],[176,149,1],[184,175,0],[257,23,2],[273,23,1],[253,253,3],[276,173,1],[180,284,1],[172,208,1],[224,178,1],[8,183,1],[196,181,1],[207,178,0],[225,7,1],[307,107,4],[283,172,1],[170,191,1],[173,235,1],[178,277,1],[233,7,2],[189,206,1],[204,197,1],[251,251,3],[193,185,1],[170,297,1],[246,147,0],[223,174,1],[198,182,1],[170,189,1],[502,606,4],[282,172,1],[175,222,1],[146,427,1],[41,247,1],[250,183,4],[241,8,2],[170,110,1],[172,236,1],[198,344,1],[200,191,1],[212,179,0],[275,23,2],[275,24,2],[176,171,1],[223,180,1],[181,205,1],[226,226,3],[203,8,2],[179,269,1],[176,193,1],[231,174,1],[257,148,2],[220,175,1],[194,182,1],[191,109,1],[194,186,1],[206,174,2],[255,8,2],[276,180,1],[202,186,1],[343,174,3],[227,182,0],[234,7,2],[271,271,1],[168,298,0],[239,239,3],[178,240,1],[173,185,1],[340,111,2],[231,8,1],[41,215,0],[555,64,2],[214,218,0],[291,187,4],[172,214,1],[168,179,0],[112,112,1],[195,185,1],[284,24,1],[220,174,1],[69,192,0],[173,186,1],[169,254,0],[204,228,1],[225,175,1],[212,259,0],[174,66,2],[293,188,4],[206,175,2],[260,261,1],[208,229,1],[7,184,1],[176,303,1],[183,175,0],[195,181,1],[227,181,0],[180,192,1],[173,221,1],[227,172,0],[262,179,1],[180,218,1],[173,211,1],[178,197,1],[220,176,1],[321,23,1],[275,148,2],[256,24,3],[235,7,1],[181,189,1],[170,199,1],[217,412,2],[242,453,2],[173,218,1],[149,421,1],[4,4,2],[149,150,1],[208,202,1],[173,236,1],[182,189,1],[178,209,1],[219,174,2],[346,175,3],[173,204,1],[247,247,3],[179,249,1],[207,176,0],[219,175,2],[179,273,1],[212,258,0],[224,8,1],[176,254,1],[232,109,1],[284,23,1],[199,228,1],[226,184,3],[207,172,0],[210,181,0],[168,265,0],[187,216,0],[682,111,2],[200,229,1],[109,220,0],[246,148,0],[168,266,0],[257,7,2],[233,174,2],[169,203,0],[180,221,1],[66,197,0],[182,106,1],[170,311,1],[170,308,1],[260,194,1],[243,457,2],[275,147,2],[229,186,2],[256,23,3],[173,213,1],[172,193,1],[168,303,0],[381,195,1],[228,185,2],[184,226,1],[191,171,1],[22,174,0],[179,214,1],[251,420,4],[277,147,2],[181,106,1],[316,6,5],[267,148,2],[172,192,1],[259,258,1],[178,241,1],[209,176,0],[69,202,0],[180,193,1],[170,193,1],[173,240,1],[170,390,1],[9,9,3],[275,8,2],[198,186,1],[379,194,1],[264,176,1],[231,109,1],[169,234,0],[178,202,1],[66,193,0],[173,208,1],[199,294,1],[268,8,2],[172,213,1],[299,24,2],[182,205,1],[188,221,0],[299,23,2],[180,225,1],[250,250,3],[279,147,0],[169,233,0],[197,170,1],[394,196,1],[391,198,1],[573,145,1],[25,175,0],[214,261,0],[181,192,1],[314,172,1],[170,192,1],[171,304,2],[169,219,0],[174,217,1],[171,276,2],[234,175,2],[171,274,2],[232,8,1],[195,172,1],[210,173,0],[268,24,2],[180,227,1],[185,210,0],[211,181,2],[188,204,0],[200,296,1],[180,238,1],[207,237,3],[196,185,1],[300,41,1],[212,221,0],[189,213,1],[267,147,2],[198,173,1],[170,200,1],[196,173,1],[189,219,1],[270,24,2],[191,213,1],[267,8,2],[278,148,0],[180,223,1],[203,182,2],[197,178,1],[186,248,3],[205,179,0],[37,37,2],[233,176,2],[23,211,0],[382,147,1],[224,7,1],[180,249,1],[194,214,1],[260,198,1],[206,182,2],[172,211,1],[173,256,1],[179,191,1],[374,148,1],[196,193,1],[176,205,1],[232,175,1],[206,181,2],[427,145,2],[259,195,1],[286,7,3],[185,244,3],[190,254,2],[194,172,1],[187,218,0],[330,24,1],[187,208,0],[104,103,1],[174,189,1],[293,293,4],[169,266,0],[267,24,2],[175,69,2],[219,182,2],[177,333,4],[198,192,1],[252,148,0],[197,207,1],[169,265,0],[178,146,1],[174,245,1],[182,193,1],[210,176,0],[252,147,0],[291,291,4],[172,212,1],[180,205,1],[173,237,1],[182,207,1],[171,301,2],[110,412,1],[253,253,1],[271,271,3],[202,170,1],[272,23,2],[8,170,0],[171,302,2],[191,239,3],[277,148,2],[200,190,1],[202,182,1],[344,24,1],[353,228,1],[219,181,2],[182,228,1],[290,175,1],[197,181,1],[393,23,4],[178,149,1],[307,67,4],[194,41,1],[380,147,1],[184,174,0],[292,174,1],[214,176,0],[173,234,1],[188,215,0],[199,190,1],[172,237,1],[189,106,1],[268,23,2],[398,24,4],[213,182,2],[150,453,1],[179,212,1],[178,195,1],[320,23,1],[202,178,1],[240,7,6],[173,233,1],[171,314,2],[307,68,4],[249,229,0],[172,228,1],[259,196,1],[6,603,2],[168,294,0],[359,229,1],[8,179,0],[175,217,1],[25,609,2],[180,245,1],[176,233,1],[183,176,0],[181,186,1],[189,177,1],[181,213,1],[267,23,2],[171,255,2],[182,185,1],[202,205,1],[171,282,2],[69,216,0],[178,245,1],[338,23,1],[179,186,1],[173,169,1],[69,218,0],[277,172,2],[337,182,1],[66,215,0],[176,211,1],[172,229,1],[181,191,1],[171,262,2],[203,175,2],[168,296,0],[198,223,1],[203,174,2],[168,327,0],[243,145,2],[178,194,1],[196,225,1],[534,242,4],[205,226,1],[181,229,1],[179,185,1],[384,210,4],[176,390,1],[69,70,1],[176,264,1],[171,283,2],[189,256,1],[258,174,1],[214,260,0],[169,286,0],[182,211,1],[193,199,1],[294,8,3],[321,321,1],[180,325,1],[222,345,2],[7,199,0],[209,172,0],[261,175,1],[269,174,1],[192,200,1],[191,240,4],[24,213,0],[194,202,1],[176,225,1],[178,185,1],[294,199,3],[173,228,1],[307,108,4],[190,190,2],[181,206,1],[189,109,1],[66,168,0],[221,24,1],[180,209,1],[181,199,1],[173,212,1],[176,223,1],[358,67,4],[176,213,1],[8,200,0],[188,220,0],[174,265,1],[182,200,1],[196,207,1],[173,171,1],[22,640,2],[218,23,1],[226,184,1],[25,25,3],[7,200,0],[194,205,1],[169,280,0],[217,182,0],[178,285,1],[181,207,1],[190,200,2],[227,180,0],[190,199,2],[182,235,1],[298,67,4],[402,149,3],[6,6,3],[237,183,3],[216,23,1],[245,228,0],[168,310,0],[181,193,1],[214,25,3],[171,316,2],[187,220,0],[195,197,1],[212,22,3],[215,24,1],[298,68,4],[273,175,1],[181,236,1],[181,211,1],[286,172,3],[179,241,1],[194,379,1],[178,262,1],[176,234,1],[173,229,1],[22,22,3],[182,197,1],[331,24,1],[572,68,0],[404,247,1],[175,266,1],[169,256,0],[175,249,1],[109,340,1],[191,206,1],[8,250,2],[244,215,0],[195,381,1],[10,396,2],[223,106,1],[176,186,1],[189,227,4],[224,535,1],[224,174,1],[191,211,1],[251,251,1],[182,206,1],[238,180,2],[178,212,1],[24,351,0],[191,219,1],[182,204,1],[350,147,0],[284,180,1],[179,300,1],[170,105,1],[176,198,1],[173,214,1],[572,67,0],[358,68,4],[548,110,2],[23,348,0],[296,200,3],[355,180,2],[178,249,1],[199,193,1],[66,65,1],[240,172,0],[181,208,1],[168,315,0],[195,212,1],[7,239,2],[197,205,1],[200,192,1],[189,183,4],[539,243,4],[242,421,2],[148,201,0],[176,249,1],[176,268,1],[306,24,3],[178,214,1],[169,168,7],[293,149,4],[277,23,2],[191,184,4],[178,186,1],[217,181,0],[224,175,1],[238,7,2],[231,175,1],[403,148,1],[197,179,1],[196,394,1],[247,42,4],[8,199,0],[106,290,0],[193,38,3],[69,168,0],[176,105,1],[203,181,2],[325,24,1],[66,221,0],[182,192,1],[198,391,1],[152,152,1],[146,258,0],[336,181,1],[277,24,2],[225,106,1],[263,179,1],[172,233,1],[282,179,1],[265,7,2],[195,205,1],[203,203,2],[182,213,1],[328,67,4],[172,300,1],[305,147,0],[322,109,0],[182,191,1],[205,173,0],[263,7,1],[202,179,1],[176,185,1],[170,220,1],[216,214,1],[173,177,1],[172,234,1],[218,175,1],[226,175,0],[24,246,0],[176,196,1],[193,207,1],[304,183,4],[172,491,1],[305,148,0],[178,224,1],[195,41,1],[189,234,1],[106,292,0],[238,190,2],[285,23,2],[182,258,1],[548,340,2],[176,245,1],[328,68,4],[286,23,3],[209,308,2],[10,492,2],[299,179,2],[306,23,3],[216,175,1],[266,7,2],[172,495,1],[174,227,1],[248,192,0],[176,188,1],[285,7,2],[210,311,2],[174,259,1],[183,168,0],[174,429,1],[219,203,2],[401,146,3],[202,207,1],[277,7,2],[178,231,1],[191,179,1],[23,246,0],[244,195,0],[458,5,4],[216,186,1],[341,23,1],[181,261,1],[22,22,1],[176,177,1],[288,175,1],[189,266,1],[191,190,1],[6,5,2],[170,9,1],[198,207,1],[187,228,0],[232,174,1],[189,265,1],[170,197,1],[200,109,1],[237,183,1],[283,179,1],[200,171,1],[316,184,4],[263,8,1],[502,41,4],[199,171,1],[26,27,2],[205,181,0],[170,179,1],[196,212,1],[168,306,0],[344,344,1],[170,223,1],[253,449,4],[170,225,1],[217,110,2],[407,176,2],[355,24,2],[189,233,1],[181,228,1],[236,192,1],[244,197,0],[180,186,1],[240,178,0],[169,294,0],[191,177,1],[282,8,1],[210,172,0],[285,24,2],[199,109,1],[258,8,1],[274,7,1],[182,186,1],[147,201,0],[178,280,1],[181,222,1],[205,184,5],[25,25,1],[11,11,2],[372,372,1],[175,426,1],[182,219,1],[235,187,0],[303,190,3],[38,192,0],[188,229,0],[237,174,0],[185,211,0],[193,183,1],[241,241,2],[215,212,1],[240,181,0],[249,242,3],[368,209,3],[196,180,1],[171,220,2],[250,500,4],[211,24,2],[254,190,2],[215,174,1],[287,174,1],[182,212,1],[106,321,0],[176,169,1],[168,342,0],[177,180,4],[184,186,0],[350,148,0],[269,175,1],[169,296,0],[268,181,2],[171,186,2],[405,23,2],[260,288,1],[358,107,4],[178,232,1],[176,276,1],[187,224,0],[298,173,4],[170,412,1],[256,189,3],[254,174,2],[195,231,1],[248,218,0],[272,8,2],[355,23,2],[198,214,1],[176,267,1],[221,182,1],[151,421,1],[261,7,1],[237,207,1],[248,194,0],[172,404,1],[270,8,2],[290,174,1],[320,24,1],[169,306,0],[112,111,1],[286,24,3],[183,172,0],[273,174,1],[181,219,1],[292,175,1],[180,255,1],[176,220,1],[24,252,0],[178,213,1],[182,229,1],[215,185,1],[263,110,2],[169,328,0],[38,106,0],[170,6,1],[291,146,4],[235,193,1],[236,188,0],[214,179,0],[197,199,1],[408,24,2],[176,209,1],[192,214,1],[41,224,0],[283,8,1],[171,257,2],[247,606,4],[261,8,1],[301,8,1],[204,173,1],[208,173,1],[245,243,3],[181,185,1],[206,189,2],[221,174,1],[181,202,1],[176,274,1],[240,173,0],[150,534,1],[170,202,1],[211,265,2],[231,179,1],[183,173,0],[240,179,0],[180,341,1],[636,105,2],[143,143,1],[420,26,4],[205,168,0],[295,22,4],[175,189,1],[178,342,1],[171,187,2],[207,182,0],[218,181,1],[180,226,1],[200,233,1],[176,187,1],[296,8,3],[175,191,1],[172,263,1],[579,308,2],[248,198,0],[210,178,0],[180,418,1],[23,252,0],[178,234,1],[409,170,1],[145,457,1],[178,282,1],[360,169,0],[240,182,0],[146,269,0],[62,62,1],[172,281,1],[204,181,1],[175,227,1],[199,234,1],[21,20,2],[235,185,1],[286,219,3],[181,214,1],[298,8,4],[222,193,0],[391,218,1],[176,376,1],[180,190,1],[226,174,0],[180,169,1],[184,168,0],[263,216,1],[170,477,1],[188,242,2],[145,939,1],[601,601,2],[184,173,0],[183,182,0],[403,147,1],[263,215,1],[298,148,4],[200,174,1],[217,202,0],[276,7,1],[7,279,0],[217,197,0],[268,174,2],[245,174,0],[172,248,1],[169,303,0],[194,232,1],[236,186,1],[196,258,1],[175,260,1],[596,311,2],[8,278,0],[72,524,1],[199,206,1],[255,190,2],[178,211,1],[168,346,0],[205,182,0],[176,237,1],[331,23,1],[173,309,1],[268,182,2],[178,227,1],[173,513,1],[192,207,1],[244,193,0],[310,23,3],[176,226,1],[171,185,2],[284,7,1],[259,287,1],[179,543,1],[281,174,0],[690,421,2],[374,147,1],[364,182,1],[208,182,1],[302,8,1],[200,206,1],[379,216,1],[189,203,1],[213,266,2],[313,8,1],[354,170,1],[297,25,4],[502,779,4],[173,197,1],[380,148,1],[168,343,0],[413,170,1],[146,225,0],[384,170,0],[110,682,1],[390,105,4],[190,303,2],[205,194,0],[299,7,2],[262,178,1],[209,178,0],[72,73,1],[315,24,3],[235,22,2],[358,108,4],[204,172,1],[191,265,1],[184,185,0],[228,24,2],[184,172,0],[188,224,0],[269,8,1],[229,229,2],[394,221,1],[169,346,0],[232,149,2],[458,603,4],[193,212,1],[198,180,1],[174,41,1],[181,242,2],[178,222,1],[231,257,1],[306,176,3],[199,197,1],[347,173,1],[330,330,1],[248,216,0],[401,245,3],[207,9,3],[169,343,0],[213,23,2],[178,187,1],[40,542,0],[192,183,1],[220,170,1],[169,310,0],[175,226,1],[218,186,1],[536,176,1],[215,182,1],[301,7,1],[38,284,0],[178,283,1],[325,23,1],[258,7,1],[197,244,1],[234,176,2],[215,381,1],[223,275,1],[220,182,1],[183,185,0],[66,204,0],[211,189,2],[202,184,1],[295,8,1],[199,203,1],[171,188,2],[224,170,1],[177,277,4],[41,216,0],[196,244,1],[228,228,2],[202,200,1],[255,7,2],[474,195,1],[236,181,1],[243,146,3],[69,208,0],[173,527,1],[178,233,1],[273,8,1],[192,248,1],[210,65,2],[225,180,1],[318,8,1],[174,191,1],[483,194,1],[208,172,1],[382,148,1],[239,603,4],[302,7,1],[169,315,0],[183,207,1],[182,222,1],[296,7,3],[248,202,0],[243,427,2],[191,106,1],[183,181,0],[274,176,1],[268,175,2],[149,223,0],[199,175,1],[180,185,1],[402,249,3],[179,203,1],[220,181,1],[172,225,1],[212,176,0],[254,175,2],[270,270,2],[173,258,1],[179,491,1],[198,261,1],[180,309,1],[169,298,0],[297,7,1],[179,227,1],[149,261,0],[7,278,0],[38,218,0],[207,181,0],[235,197,1],[181,226,1],[184,181,0],[109,273,0],[224,238,1],[338,338,1],[169,327,0],[236,25,2],[356,174,1],[449,21,4],[288,8,1],[24,339,0],[182,227,1],[186,213,0],[172,223,1],[233,173,2],[169,193,0],[287,8,1],[172,244,1],[200,203,1],[420,609,4],[199,180,1],[191,266,1],[348,147,0],[341,24,1],[195,258,1],[176,203,1],[249,175,0],[200,180,1],[497,271,1],[242,175,0],[109,269,0],[172,258,1],[173,202,1],[384,329,4],[211,173,2],[179,314,1],[184,170,0],[245,241,0],[298,147,4],[304,9,5],[172,261,1],[281,175,0],[178,188,1],[321,147,1],[183,186,0],[276,176,1],[192,218,1],[200,202,1],[180,208,1],[346,213,3],[366,181,1],[205,6,3],[439,209,4],[207,168,0],[216,379,1],[150,357,0],[200,219,1],[173,248,1],[8,279,0],[191,234,1],[194,261,1],[179,289,1],[211,176,2],[182,226,1],[223,176,1],[183,170,0],[221,180,1],[445,23,2],[204,176,1],[178,269,1],[195,170,1],[221,185,1],[375,169,0],[237,175,0],[206,256,2],[259,185,1],[326,308,3],[272,272,2],[351,148,0],[193,244,1],[216,181,1],[288,7,1],[392,148,0],[404,247,3],[7,246,0],[184,182,0],[226,205,1],[499,198,1],[43,42,2],[213,173,2],[191,286,1],[70,368,0],[451,24,2],[274,192,1],[146,231,0],[191,233,1],[200,106,1],[110,354,0],[232,257,1],[291,174,0],[810,25,6],[8,339,0],[204,253,3],[197,215,1],[251,26,4],[280,175,2],[243,174,0],[210,179,0],[218,391,1],[1143,108,0],[173,244,1],[206,268,2],[228,189,2],[235,182,1],[199,219,1],[238,238,2],[327,23,3],[381,215,1],[217,175,0],[110,300,0],[195,207,1],[197,66,2],[297,192,1],[176,210,1],[168,170,0],[290,7,1],[276,193,1],[6,6,1],[307,203,4],[173,261,1],[181,227,1],[189,193,1],[184,178,0],[372,372,3],[174,249,1],[200,177,1],[204,170,1],[36,37,1],[239,5,4],[303,7,3],[228,265,2],[208,176,1],[221,394,1],[234,173,2],[1145,108,0],[295,7,1],[225,170,1],[40,541,0],[9,9,1],[146,292,0],[367,173,1],[178,237,1],[180,236,1],[41,41,1],[293,175,0],[232,179,1],[179,581,1],[39,201,0],[229,23,2],[260,186,1],[212,287,0],[181,204,1],[8,252,0],[110,477,1],[329,311,3],[199,177,1],[223,170,1],[205,214,0],[390,222,4],[179,495,1],[202,216,1],[231,170,1],[171,275,2],[225,176,1],[168,317,0],[172,286,1],[217,174,0],[392,147,0],[243,401,2],[343,211,3],[232,170,1],[636,104,2],[263,340,2],[284,173,1],[191,180,1],[279,175,0],[40,410,0],[196,223,1],[229,266,2],[282,197,1],[327,24,3],[236,202,1],[200,209,1],[63,555,1],[182,208,1],[294,7,3],[199,106,1],[356,245,4],[297,8,1],[213,176,2],[170,575,1],[205,195,0],[347,180,1],[280,178,2],[182,269,1],[338,147,1],[241,220,2],[214,180,0],[194,69,2],[370,228,1],[181,287,1],[328,147,4],[207,196,0],[7,195,0],[23,339,0],[179,204,1],[257,172,2],[181,235,1],[182,292,1],[38,193,0],[271,37,1],[230,317,6],[449,640,4],[283,202,1],[219,189,2],[225,275,1],[474,215,1],[178,273,1],[330,147,1],[145,539,1],[290,176,1],[200,254,1],[175,240,1],[295,193,1],[310,8,3],[284,218,1],[172,146,1],[8,246,0],[182,236,1],[106,344,0],[290,192,1],[387,229,1],[307,148,4],[414,251,1],[467,174,1],[326,70,3],[856,111,3],[194,170,1],[190,191,2],[179,244,1],[373,175,1],[257,8,2],[182,288,1],[264,174,1],[855,22,6],[178,289,1],[182,202,1],[170,432,1],[315,8,3],[265,176,2],[248,229,0],[25,25,4],[192,249,1],[223,206,1],[239,458,4],[404,404,1],[196,183,1],[149,612,1],[170,585,1],[195,183,1],[177,360,4],[175,245,1],[208,170,1],[378,173,1],[292,7,1],[396,396,3],[298,206,4],[497,38,1],[199,254,1],[179,236,1],[259,311,2],[178,235,1],[197,184,1],[149,273,0],[180,235,1],[272,7,2],[329,65,3],[177,235,4],[198,69,2],[266,176,2],[24,322,0],[214,288,0],[270,7,2],[194,184,1],[213,189,2],[278,174,0],[177,236,4],[169,170,0],[179,208,1],[179,235,1],[23,322,0],[268,106,2],[234,172,2],[207,197,0],[295,197,1],[376,176,4],[739,308,2],[292,193,1],[334,7,1],[38,221,0],[27,26,2],[22,22,4],[211,172,2],[180,237,1],[185,66,0],[203,199,2],[260,208,1],[483,216,1],[181,197,1],[202,69,2],[275,7,2],[233,172,2],[180,204,1],[225,206,1],[7,194,0],[396,396,1],[300,172,1],[605,170,1],[181,273,1],[244,228,0],[307,147,4],[144,427,1],[173,289,1],[207,224,0],[209,70,2],[174,206,1],[176,236,1],[190,233,2],[189,250,3],[284,221,1],[510,196,1],[179,168,1],[356,172,1],[183,171,0],[176,240,1],[260,308,2],[183,178,0],[190,238,2],[192,184,1],[242,402,2],[263,172,1],[309,173,1],[176,235,1],[195,66,2],[284,345,2],[199,210,1],[213,172,2],[258,24,1],[253,424,1],[177,179,4],[389,182,1],[180,200,1],[187,243,2],[174,240,1],[205,202,0],[169,192,0],[249,241,0],[177,375,4],[217,340,2],[175,206,1],[207,198,0],[180,210,1],[9,735,2],[182,291,2],[175,233,1],[190,360,2],[337,8,1],[266,189,2],[287,7,1],[188,268,0],[186,174,0],[168,193,0],[174,234,1],[266,181,2],[205,176,0],[336,8,1],[186,279,0],[211,206,2],[259,204,1],[178,204,1],[178,299,1],[265,189,2],[263,195,1],[424,253,1],[177,169,4],[41,232,0],[186,69,0],[171,352,2],[149,290,0],[181,293,2],[199,233,1],[414,414,1],[309,345,2],[222,175,0],[173,271,1],[256,7,3],[263,194,1],[761,311,2],[185,278,0],[245,238,0],[182,240,1],[212,212,1],[414,414,3],[500,250,4],[198,184,1],[190,234,2],[178,425,1],[499,218,1],[181,290,1],[439,326,4],[179,354,1],[198,225,1],[41,231,0],[7,252,0],[36,601,1],[318,173,1],[20,21,2],[313,173,1],[208,251,3],[196,170,1],[319,7,2],[43,44,1],[222,174,0],[175,223,1],[179,237,1],[344,147,1],[173,146,1],[192,206,1],[196,66,2],[261,23,1],[168,225,0],[199,280,1],[174,226,1],[181,240,1],[207,180,0],[349,7,1],[222,192,0],[259,65,2],[180,240,1],[307,176,4],[200,234,1],[668,170,1],[420,251,4],[40,108,0],[197,183,1],[228,193,2],[182,190,1],[328,148,4],[256,254,3],[195,184,1],[149,232,0],[287,24,1],[214,279,0],[179,291,1],[176,208,1],[386,181,1],[198,183,1],[256,181,3],[192,172,1],[193,221,1],[177,204,4],[215,244,1],[177,267,4],[176,204,1],[408,148,2],[189,225,1],[335,173,1],[606,42,4],[107,201,0],[189,223,1],[175,188,1],[176,281,1],[178,236,1],[192,426,1],[194,207,1],[935,151,2],[192,274,1],[182,214,1],[193,172,1],[194,183,1],[261,173,1],[169,342,0],[227,170,0],[175,218,1],[233,206,2],[313,7,1],[203,257,2],[205,6,5],[192,229,1],[187,168,0],[71,308,1],[242,150,2],[177,208,4],[198,170,1],[453,421,3],[192,38,3],[174,225,1],[176,265,1],[202,248,1],[424,424,1],[282,178,1],[410,147,0],[180,583,1],[287,173,1],[390,390,4],[182,241,1],[244,221,0],[174,187,1],[216,172,1],[259,193,1],[168,204,0],[168,223,0],[174,219,1],[227,8,6],[180,513,1],[181,190,1],[182,243,2],[356,173,1],[170,239,1],[193,206,1],[410,148,0],[205,289,3],[249,238,0],[171,415,2],[212,278,0],[247,404,1],[171,226,2],[233,213,2],[195,244,1],[180,199,1],[181,212,1],[220,514,1],[178,244,1],[241,179,2],[203,200,2],[252,201,0],[277,285,2],[309,198,1],[234,211,2],[203,189,2],[445,147,2],[233,189,2],[176,286,1],[181,209,1],[6,1018,2],[218,173,1],[176,292,1],[192,261,1],[365,172,1],[214,209,0],[226,172,0],[235,168,0],[245,229,0],[284,8,1],[330,148,1],[438,194,2],[234,206,2],[182,217,1],[187,268,0],[263,320,1],[179,248,1],[197,173,1],[258,173,1],[168,208,0],[253,22,1],[288,173,1],[175,219,1],[215,172,1],[223,149,2],[170,340,1],[176,290,1],[234,189,2],[242,242,3],[269,197,1],[510,221,1],[195,204,1],[244,196,0],[182,361,1],[184,205,1],[249,228,0],[193,276,1],[288,172,1],[248,173,0],[169,225,0],[235,66,0],[336,7,1],[231,178,1],[213,206,2],[7,322,0],[197,245,1],[73,73,1],[170,457,1],[636,636,2],[199,393,1],[297,202,1],[174,188,1],[36,35,1],[178,265,1],[287,172,1],[430,178,2],[175,41,1],[423,194,0],[267,268,2],[175,220,1],[309,196,1],[179,293,1],[1207,4,4],[106,325,0],[64,311,1],[174,220,1],[177,319,4],[8,195,0],[190,375,2],[264,175,1],[932,170,1],[271,497,1],[106,706,1],[232,178,1],[236,168,0],[497,37,1],[104,706,1],[179,199,1],[371,172,1],[192,69,2],[209,180,0],[399,204,2],[200,398,1],[194,208,1],[400,172,1],[405,147,2],[339,201,0],[182,210,1],[221,173,1],[237,237,1],[395,6,4],[195,193,1],[226,226,1],[174,526,1],[176,266,1],[186,179,0],[307,190,4],[265,182,2],[373,173,1],[368,326,3],[181,241,1],[373,172,1],[424,253,3],[209,179,0],[288,23,1],[207,193,0],[198,248,1],[300,195,1],[267,181,2],[338,148,1],[289,175,0],[280,174,2],[178,208,1],[192,275,1],[219,191,2],[917,170,1],[188,168,0],[321,148,1],[171,419,2],[270,174,2],[229,189,2],[352,41,2],[524,524,2],[229,191,2],[258,172,1],[1402,11,4],[196,184,1],[39,307,0],[181,357,1],[261,172,1],[171,224,2],[285,182,2],[21,1172,1],[247,178,0],[273,202,1],[170,304,1],[205,456,3],[241,203,2],[198,499,1],[294,204,3],[196,227,1],[168,268,0],[169,333,0],[170,579,1],[406,208,2],[196,510,1],[185,175,0],[198,208,1],[318,7,1],[193,275,1],[372,239,1],[441,195,2],[213,191,2],[489,175,1],[170,409,1],[200,251,3],[272,175,2],[214,214,1],[536,170,1],[202,249,1],[212,210,0],[236,279,0],[178,422,1],[236,69,0],[337,7,1],[23,350,0],[372,239,3],[235,278,0],[178,291,1],[186,186,5],[193,227,1],[222,181,0],[197,228,1],[180,527,1],[312,204,1],[180,281,1],[181,217,1],[300,194,1],[175,187,1],[8,194,0],[263,331,1],[260,70,2],[294,265,3],[169,223,0],[174,215,1],[207,237,1],[296,208,3],[171,237,2],[178,176,1],[224,183,1],[179,200,1],[190,211,2],[63,62,1],[197,295,1],[190,177,2],[213,233,2],[174,237,1],[181,220,1],[20,22,2],[197,258,1],[193,245,1],[178,266,1],[351,147,0],[168,192,0],[196,204,1],[180,191,1],[184,176,0],[235,173,1],[286,8,3],[182,244,1],[174,221,1],[168,202,0],[247,41,3],[175,530,1],[200,223,1],[168,267,0],[203,277,2],[228,176,2],[260,192,1],[198,288,1],[915,427,2],[172,270,1],[178,177,1],[195,235,1],[344,148,1],[194,288,1],[295,187,0],[596,65,2],[211,234,2],[28,28,1],[248,176,0],[284,198,1],[256,303,3],[316,170,1],[24,350,0],[384,384,4],[189,192,1],[69,261,0],[194,231,1],[194,236,1],[38,601,1],[174,223,1],[178,190,1],[180,613,1],[194,176,1],[195,287,1],[243,243,3],[451,148,2],[170,231,1],[348,148,0],[251,25,1],[226,173,0],[24,433,0],[146,288,0],[478,108,2],[182,238,1],[206,191,2],[173,254,1],[194,483,1],[146,356,0],[205,212,0],[168,232,0],[180,233,1],[170,413,1],[202,229,1],[170,453,1],[173,298,1],[248,181,0],[443,198,2],[226,178,0],[310,7,3],[193,66,2],[196,235,1],[106,341,0],[202,257,1],[206,211,2],[218,176,1],[199,266,1],[324,208,1],[197,282,1],[196,287,1],[283,178,1],[182,220,1],[207,281,3],[355,8,2],[423,175,0],[187,354,0],[173,270,1],[23,428,0],[402,173,0],[64,65,1],[39,703,0],[432,345,3],[536,105,3],[200,280,1],[334,66,1],[256,174,3],[307,7,4],[195,176,1],[240,176,0],[185,185,5],[173,272,1],[404,41,3],[177,268,4],[192,205,1],[296,266,3],[197,429,1],[292,176,1],[325,175,1],[39,704,0],[181,238,1],[358,148,4],[175,216,1],[175,225,1],[190,171,2],[256,182,3],[149,287,0],[299,299,2],[454,176,2],[249,174,0],[182,196,1],[170,224,1],[286,191,3],[19,19,1],[66,258,0],[190,264,2],[192,227,1],[381,147,1],[213,219,2],[239,239,1],[211,219,2],[320,7,1],[315,7,3],[289,174,0],[194,248,1],[195,259,1],[273,172,1],[423,198,0],[102,102,1],[200,265,1],[663,147,1],[194,260,1],[297,188,0],[171,258,2],[200,183,1],[168,197,0],[193,189,1],[179,465,1],[353,22,5],[433,201,0],[377,204,2],[199,183,1],[313,69,1],[227,178,0],[341,174,1],[500,735,4],[24,189,0],[178,314,1],[169,204,0],[193,228,1],[202,173,1],[221,181,1],[385,204,2],[236,173,1],[280,203,2],[170,228,1],[502,1178,3],[171,261,2],[26,1140,1],[184,179,0],[184,180,0],[256,175,3],[401,173,0],[172,272,1],[359,25,5],[27,25,2],[198,290,1],[284,196,1],[241,189,2],[187,312,0],[220,183,1],[325,7,1],[250,735,4],[444,196,2],[245,175,0],[405,148,2],[195,232,1],[202,283,1],[425,174,0],[110,263,0],[177,168,4],[180,234,1],[237,173,0],[226,170,0],[219,285,2],[229,176,2],[216,248,1],[304,170,1],[198,236,1],[300,269,1],[365,7,1],[191,185,1],[193,429,1],[212,180,0],[401,172,0],[168,231,0],[373,249,4],[487,108,2],[208,261,1],[206,213,2],[197,412,1],[207,179,0],[250,9,3],[912,251,4],[254,173,2],[192,297,1],[198,227,1],[320,215,1],[333,176,1],[361,182,1],[193,184,1],[212,204,0],[300,340,2],[178,329,1],[195,474,1],[267,7,2],[7,339,0],[152,151,1],[220,192,1],[179,189,1],[234,219,2],[265,294,2],[490,147,2],[228,182,2],[178,293,1],[388,208,2],[229,181,2],[411,147,0],[267,182,2],[358,147,4],[220,241,1],[237,172,0],[23,189,0],[202,183,1],[199,184,1],[262,6,3],[170,232,1],[240,6,2],[109,331,0],[272,176,2],[221,176,1],[195,269,1],[190,213,2],[8,196,0],[104,1516,1],[170,150,1],[218,180,1],[404,41,1],[238,189,2],[205,216,0],[367,7,1],[197,257,1],[193,258,1],[312,24,1],[174,231,1],[233,211,2],[357,181,1],[254,200,2],[202,297,1],[235,169,0],[222,178,0],[455,173,1],[202,426,1],[402,242,3],[149,690,1],[268,189,2],[229,192,2],[373,174,1],[328,7,4],[220,193,1],[285,181,2],[199,225,1],[565,565,2],[179,258,1],[170,454,1],[349,8,1],[555,555,2],[171,370,2],[198,260,1],[227,193,0],[188,354,0],[356,175,1],[202,261,1],[253,185,4],[205,197,0],[172,287,1],[168,335,0],[218,182,1],[383,208,2],[240,184,4],[233,219,2],[202,412,1],[307,173,4],[218,248,1],[262,175,1],[183,180,0],[187,353,0],[230,333,6],[189,186,1],[211,191,2],[371,7,1],[185,168,0],[477,217,4],[408,147,2],[207,195,0],[251,609,4],[196,259,1],[314,179,1],[170,229,1],[213,186,2],[275,190,2],[198,205,1],[237,176,0],[270,176,2],[331,7,1],[234,199,2],[222,182,0],[172,288,1],[244,173,0],[285,175,2],[271,38,3],[290,173,1],[214,213,0],[254,199,2],[342,203,3],[194,192,1],[216,483,1],[332,204,1],[170,145,1],[326,173,0],[306,174,3],[939,144,2],[71,70,1],[224,196,1],[168,277,0],[267,174,2],[367,8,1],[172,177,1],[194,240,1],[266,296,2],[228,191,2],[677,148,1],[146,824,1],[224,181,1],[216,179,1],[935,421,2],[251,186,4],[254,181,2],[244,172,0],[323,208,1],[172,190,1],[207,212,0],[241,176,2],[171,387,2],[579,70,2],[224,197,1],[540,372,3],[211,185,2],[189,319,1],[204,312,1],[214,208,0],[204,417,1],[205,215,0],[307,178,4],[367,180,1],[302,225,1],[182,195,1],[463,24,2],[320,174,1],[428,201,0],[220,695,1],[301,223,1],[457,427,3],[178,248,1],[307,206,4],[187,285,0],[307,24,4],[186,168,0],[810,26,6],[207,202,0],[40,758,0],[41,567,0],[224,182,1],[411,148,0],[187,332,0],[334,8,1],[401,174,0],[194,179,1],[406,181,2],[180,211,1],[216,182,1],[300,273,1],[358,23,4],[374,7,1],[228,170,2],[192,189,1],[390,170,0],[540,372,1],[231,195,1],[361,146,3],[257,203,2],[172,291,1],[109,330,0],[268,7,2],[318,66,1],[300,247,1],[394,147,1],[399,182,2],[8,198,0],[204,258,1],[209,200,0],[379,148,1],[186,191,0],[109,320,0],[173,287,1],[262,174,1],[188,323,0],[8,206,0],[172,254,1],[223,238,1],[226,181,0],[309,38,1],[1063,9,6],[188,228,0],[199,253,3],[215,474,1],[308,170,0],[187,229,0],[183,179,0],[425,196,0],[24,392,0],[208,324,1],[173,288,1],[187,263,0],[424,424,3],[233,200,2],[237,170,0],[109,338,0],[185,287,0],[348,201,0],[234,213,2],[306,190,3],[263,269,1],[271,176,0],[219,213,2],[219,211,2],[307,23,4],[172,280,1],[265,191,2],[168,319,0],[180,261,1],[662,217,0],[275,189,2],[109,548,1],[188,324,0],[505,148,2],[425,195,0],[759,601,2],[67,201,0],[178,254,1],[202,226,1],[227,192,0],[250,250,1],[176,328,1],[188,283,0],[24,704,0],[218,214,1],[218,499,1],[358,24,4],[373,149,4],[212,211,0],[184,171,0],[255,223,2],[365,179,1],[210,180,0],[220,207,1],[235,188,0],[187,282,0],[173,280,1],[195,240,1],[210,199,0],[331,175,1],[1142,151,2],[185,191,0],[23,410,0],[198,200,1],[307,191,4],[226,176,0],[111,340,1],[186,288,0],[69,575,1],[190,376,2],[855,21,6],[358,203,4],[189,235,1],[227,183,4],[402,172,0],[208,468,1],[911,1172,3],[202,240,1],[236,187,0],[307,174,4],[193,295,1],[212,231,0],[188,263,0],[269,172,1],[177,369,4],[254,182,2],[189,294,1],[225,238,1],[241,191,2],[192,223,1],[4,5,2],[27,609,2],[356,146,4],[178,215,1],[682,682,2],[304,454,1],[244,22,3],[378,180,1],[181,194,1],[304,171,1],[105,565,1],[180,248,1],[410,201,0],[252,173,0],[277,8,2],[170,316,1],[401,243,3],[479,23,2],[284,325,1],[8,348,0],[497,497,1],[266,191,2],[668,176,1],[323,23,1],[174,380,1],[278,204,0],[38,222,0],[396,250,5],[181,198,1],[238,224,2],[232,194,1],[248,172,0],[214,174,0],[378,8,1],[390,106,4],[458,239,4],[179,329,1],[188,359,0],[24,410,0],[186,189,0],[229,170,2],[267,175,2],[355,176,2],[365,8,1],[149,800,1],[228,295,2],[179,261,1],[183,169,0],[207,192,0],[205,464,0],[253,21,4],[178,256,1],[285,174,2],[233,191,2],[265,181,2],[216,184,1],[244,176,0],[328,172,4],[225,146,2],[180,213,1],[236,172,1],[218,223,1],[218,192,1],[320,8,1],[362,9,4],[182,209,1],[292,173,1],[440,204,2],[170,534,1],[208,198,1],[266,182,2],[178,327,1],[698,147,0],[175,374,1],[196,199,1],[257,179,2],[199,179,1],[636,345,2],[170,204,1],[200,343,1],[313,181,1],[259,197,1],[293,174,0],[171,287,2],[309,180,1],[341,7,1],[307,175,4],[40,755,0],[199,346,1],[416,170,1],[193,238,1],[258,182,1],[143,144,1],[200,179,1],[170,539,1],[400,179,1],[186,326,0]]} diff --git a/variants/sparse-standard-2bin/profiles/joint/config.json b/variants/sparse-standard-2bin/profiles/joint/config.json new file mode 100644 index 0000000000000000000000000000000000000000..36ee00f7d6db5476763b0eb369e833fb661c31fa --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/joint/config.json @@ -0,0 +1,4 @@ +{ + "model_type": "actioncodec2_unified", + "processor_class": "ActionCodec2SparseProcessor" +} diff --git a/variants/sparse-standard-2bin/profiles/joint/config.yaml b/variants/sparse-standard-2bin/profiles/joint/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e1fe377748c22d531ce966a49c7715b8a75fbb71 --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/joint/config.yaml @@ -0,0 +1,63 @@ +model_type: actioncodec2_unified +config_version: 1 +physical: + input_dim: 8 + components: + generalized_joint_position: + dims: + start: 0 + stop: 7 + space: additive + input_order: 0 + primitive_order: 1 + input_transform: + scale: 1.0 + clip: false + constraints: + order_0: + min: -6.283185307179586 + max: 6.283185307179586 + order_1: + min: -0.35 + max: 0.35 + distortion_limit: + - 0.004 + - 0.004 + - 0.006 + - 0.0075 + - 0.015 + - 0.02 + - 0.02 + primitive_selection: smooth + gripper_open_command: + dims: + - 7 + space: additive + input_order: 0 + primitive_order: 0 + input_transform: + scale: 1.0 + clip: true + constraints: + order_0: + min: 0.0 + max: 1.0 + distortion_limit: 0.5 + primitive_selection: nearest +set_bpe: + lookahead: 8 + allow_cross_component_merge: false + scheme: sparse_set_bpe +train: + primitives: + zero_primitive_components: + - generalized_joint_position + bpe: + spatial_vocab_size: 347 + vocab_size: 4096 + quality_control: + hard_order_1_scale: 3.0 + min_segment_length: 2 + sparse: + chunk_horizon: 32 + static_run_cap: 8 diff --git a/variants/sparse-standard-2bin/profiles/joint/primitives.npz b/variants/sparse-standard-2bin/profiles/joint/primitives.npz new file mode 100644 index 0000000000000000000000000000000000000000..5164a5a6c7760295114df12a8bd84e4dbea501b3 --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/joint/primitives.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:926f2004304296292c45cfaeca11a6a0cc83737db547f2071f07420e23278191 +size 3514 diff --git a/variants/sparse-standard-2bin/profiles/joint/processor_config.json b/variants/sparse-standard-2bin/profiles/joint/processor_config.json new file mode 100644 index 0000000000000000000000000000000000000000..871ecdc067fd3e34068349666d1260a7d787f502 --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/joint/processor_config.json @@ -0,0 +1,4 @@ +{ + "processor_class": "ActionCodec2SparseProcessor", + "vocab_size": 4096 +} diff --git a/variants/sparse-standard-2bin/profiles/joint/sparse_bpe.json b/variants/sparse-standard-2bin/profiles/joint/sparse_bpe.json new file mode 100644 index 0000000000000000000000000000000000000000..7a4cf280f40be20902c90dec696a2c7dca990f0c --- /dev/null +++ b/variants/sparse-standard-2bin/profiles/joint/sparse_bpe.json @@ -0,0 +1 @@ +{"format":"actioncodec2_sparse_bpe","format_version":1,"layout":{"bins":[89,89,61,49,25,19,19,2],"zero":[44,44,30,24,12,9,9,null]},"lookahead":8,"spatial_merges":[],"temporal_merges":[[346,132,1],[346,346,1],[346,131,1],[346,260,1],[346,259,1],[346,43,1],[346,44,1],[346,206,1],[346,205,1],[348,348,2],[347,205,1],[347,206,1],[346,296,1],[346,295,1],[349,205,1],[349,206,1],[43,43,2],[317,317,2],[316,316,2],[133,133,2],[44,44,2],[347,260,1],[130,130,1],[347,259,1],[295,295,2],[296,296,2],[350,205,1],[42,42,1],[351,206,1],[346,204,1],[346,207,1],[350,206,1],[349,259,1],[45,45,1],[351,205,1],[349,260,1],[258,258,1],[348,131,2],[261,261,1],[346,347,1],[352,205,1],[352,206,1],[129,129,1],[134,134,1],[353,205,1],[353,206,1],[356,356,4],[204,204,2],[346,317,1],[346,316,1],[335,335,3],[334,334,3],[207,207,1],[350,43,1],[346,203,1],[346,208,1],[41,41,1],[46,46,1],[130,349,0],[348,260,2],[351,44,1],[261,350,0],[348,259,2],[128,128,1],[347,43,1],[258,351,0],[135,135,1],[347,44,1],[348,206,2],[130,129,1],[358,259,1],[257,257,1],[361,260,1],[358,260,1],[262,262,1],[348,205,2],[296,296,3],[366,133,4],[357,260,1],[347,347,1],[295,295,3],[365,316,4],[364,317,4],[356,348,4],[349,44,1],[42,352,0],[349,43,1],[361,259,1],[45,353,0],[350,44,1],[346,209,1],[351,43,1],[346,202,1],[42,41,1],[127,127,1],[132,344,0],[45,46,1],[348,44,2],[348,43,2],[362,259,1],[203,203,1],[133,133,1],[47,47,1],[136,136,1],[40,40,1],[207,354,0],[131,344,0],[208,208,1],[364,364,4],[365,365,4],[317,317,3],[128,129,1],[316,316,3],[350,363,1],[258,257,1],[369,369,2],[134,135,1],[357,259,1],[349,349,1],[294,294,2],[261,262,1],[297,297,2],[371,295,4],[204,204,1],[374,374,2],[372,296,4],[360,295,3],[359,296,3],[130,389,1],[348,347,2],[207,377,0],[130,362,0],[346,133,1],[366,366,4],[380,380,2],[335,335,4],[363,42,1],[334,334,4],[126,126,1],[260,344,0],[346,210,1],[367,45,1],[348,349,2],[346,201,1],[385,385,2],[259,344,0],[383,383,2],[43,352,0],[362,260,1],[348,353,2],[132,345,0],[317,317,4],[207,208,1],[137,137,1],[316,316,4],[256,256,1],[204,355,0],[128,127,1],[348,352,2],[44,353,0],[350,296,1],[351,367,1],[346,334,1],[346,335,1],[347,133,2],[263,263,1],[355,295,1],[350,295,1],[347,296,1],[354,296,1],[47,46,1],[48,48,1],[42,403,1],[351,295,1],[40,41,1],[128,389,1],[45,404,1],[390,134,2],[363,43,4],[371,371,4],[351,296,1],[202,202,1],[136,135,1],[372,372,4],[39,39,1],[347,357,1],[350,350,1],[206,344,0],[131,345,0],[356,131,4],[205,344,0],[346,357,1],[209,209,1],[349,295,1],[367,44,4],[369,129,2],[351,351,1],[204,376,0],[347,295,1],[346,211,1],[125,125,1],[366,134,1],[315,315,2],[130,361,0],[261,373,0],[258,418,1],[363,352,0],[348,354,2],[318,318,2],[258,375,0],[130,379,0],[347,386,1],[261,368,0],[374,42,2],[346,200,1],[348,386,2],[350,316,1],[355,133,1],[261,421,1],[384,206,2],[360,371,3],[126,127,1],[359,372,3],[352,296,1],[138,138,1],[367,353,0],[130,382,0],[348,350,2],[352,352,1],[347,363,1],[390,390,2],[355,296,1],[353,353,1],[348,351,2],[354,354,1],[45,44,1],[203,401,0],[349,296,1],[258,381,0],[368,43,1],[378,43,1],[394,204,1],[346,358,1],[256,257,1],[348,355,2],[352,295,1],[346,370,1],[258,370,0],[347,316,1],[260,345,0],[350,317,1],[357,43,1],[413,135,2],[397,397,2],[203,376,0],[384,205,2],[373,43,1],[374,41,2],[354,295,1],[353,295,1],[398,334,6],[355,355,1],[353,296,1],[351,317,1],[40,403,1],[347,317,1],[47,404,1],[356,44,4],[263,262,1],[261,378,0],[380,46,2],[389,129,2],[136,137,1],[369,346,0],[357,357,1],[356,43,4],[358,43,1],[203,202,1],[347,355,1],[347,367,1],[351,316,1],[346,368,1],[366,133,1],[349,362,1],[402,208,2],[47,48,1],[348,296,2],[207,375,0],[134,133,1],[259,345,0],[349,317,1],[49,49,1],[209,208,1],[380,45,2],[350,352,1],[128,441,1],[347,370,1],[383,257,2],[40,39,1],[354,316,1],[258,379,0],[348,295,2],[349,316,1],[354,317,1],[124,124,1],[203,204,1],[355,204,2],[352,42,2],[385,262,2],[353,44,3],[346,345,1],[201,201,1],[346,212,1],[38,38,1],[207,362,0],[355,317,1],[355,316,1],[394,203,1],[410,129,2],[349,384,1],[349,354,1],[347,352,1],[344,356,0],[261,382,0],[363,363,4],[255,255,1],[207,358,0],[399,399,2],[335,335,2],[357,44,1],[347,353,1],[210,210,1],[381,44,1],[346,344,1],[139,139,1],[264,264,1],[365,365,3],[45,391,0],[364,364,3],[346,199,1],[347,350,1],[349,367,1],[134,413,1],[126,125,1],[136,413,1],[347,351,1],[394,376,0],[394,394,1],[316,350,0],[424,134,1],[43,344,0],[398,398,2],[352,317,1],[207,378,0],[362,43,1],[377,208,2],[347,358,1],[361,43,1],[382,43,1],[384,259,2],[375,44,1],[207,402,0],[347,368,1],[45,392,0],[44,344,0],[42,388,0],[256,418,1],[346,366,1],[350,133,1],[349,346,1],[347,354,1],[42,387,0],[353,317,1],[390,135,2],[403,41,2],[356,206,4],[360,294,3],[353,316,1],[404,46,2],[359,297,3],[379,44,1],[410,410,2],[370,44,1],[138,137,1],[348,317,2],[205,345,0],[361,44,1],[352,316,1],[348,316,2],[376,204,2],[385,346,0],[351,133,1],[358,44,1],[349,351,1],[263,421,1],[369,354,0],[351,383,2],[349,363,1],[296,354,0],[349,352,1],[381,43,1],[349,353,1],[206,345,0],[351,353,1],[362,44,1],[367,367,4],[295,355,0],[207,454,1],[334,334,2],[356,260,4],[296,350,0],[349,355,1],[123,123,1],[466,294,4],[49,48,1],[468,297,4],[209,437,0],[384,260,2],[409,206,2],[354,346,1],[360,317,1],[406,205,2],[394,355,0],[349,350,1],[375,43,1],[359,316,1],[356,259,4],[362,362,1],[207,388,0],[126,441,1],[201,202,1],[390,133,2],[389,389,2],[295,350,0],[373,44,1],[50,50,1],[295,351,0],[346,365,1],[38,39,1],[397,335,6],[261,400,0],[346,364,1],[439,202,2],[352,350,1],[370,370,1],[368,368,1],[207,392,0],[296,316,0],[356,205,4],[475,129,3],[293,294,2],[140,140,1],[209,210,1],[350,346,1],[359,317,1],[418,257,2],[353,45,2],[124,125,1],[256,255,1],[346,213,1],[298,297,2],[366,347,0],[349,361,1],[442,205,0],[450,135,2],[410,127,2],[355,346,1],[461,383,2],[360,316,1],[416,369,2],[355,357,1],[350,204,1],[295,317,0],[37,37,1],[346,405,1],[370,43,1],[296,351,0],[449,46,2],[355,347,1],[374,440,2],[200,200,1],[451,41,2],[350,385,2],[296,347,0],[349,379,1],[399,208,2],[263,264,1],[43,345,0],[380,346,0],[421,262,2],[354,352,1],[354,133,1],[346,42,1],[356,353,4],[377,354,1],[44,345,0],[442,206,0],[317,351,0],[366,366,1],[453,206,0],[211,211,1],[335,335,5],[258,407,0],[348,359,2],[355,350,1],[354,353,1],[317,350,0],[354,351,1],[334,334,5],[47,518,1],[295,349,0],[346,354,1],[346,130,1],[378,44,1],[349,382,1],[354,347,1],[357,347,1],[356,352,4],[138,139,1],[348,360,2],[371,371,3],[355,352,1],[346,134,1],[136,500,1],[295,316,0],[296,317,0],[258,417,0],[368,363,1],[356,347,4],[372,372,3],[377,377,1],[346,355,1],[203,439,0],[454,208,2],[316,351,0],[346,369,1],[416,416,2],[40,531,1],[453,205,0],[406,43,2],[133,347,0],[353,351,1],[467,385,2],[350,347,1],[356,384,4],[380,443,2],[346,383,1],[368,44,1],[346,198,1],[358,296,1],[374,403,2],[386,386,2],[130,419,0],[379,43,1],[377,399,2],[354,349,1],[356,349,4],[351,363,1],[350,368,1],[358,358,1],[122,122,1],[480,134,1],[350,373,1],[355,376,1],[209,402,0],[315,365,2],[350,367,1],[355,353,1],[376,376,1],[316,354,0],[254,254,1],[386,43,2],[362,354,1],[318,364,2],[350,42,1],[441,127,2],[334,334,6],[351,347,1],[126,547,1],[317,354,0],[141,141,1],[265,265,1],[409,205,2],[335,335,6],[317,355,0],[366,357,0],[138,500,1],[351,370,1],[420,43,1],[361,295,1],[316,347,0],[316,355,0],[401,202,2],[519,41,3],[380,404,2],[352,347,1],[333,333,2],[523,46,3],[134,448,1],[437,208,2],[296,344,0],[485,127,2],[522,129,3],[45,488,1],[373,373,1],[374,346,0],[348,396,2],[379,379,1],[295,344,0],[347,346,1],[356,386,4],[348,395,2],[351,346,1],[130,434,0],[317,352,0],[317,347,0],[124,123,1],[336,336,2],[354,350,1],[261,419,0],[296,352,0],[406,206,2],[361,361,1],[351,375,1],[201,490,0],[424,134,3],[49,50,1],[353,347,1],[295,347,0],[349,335,1],[51,51,1],[316,346,0],[295,346,0],[317,346,0],[350,355,1],[42,483,1],[348,334,2],[140,139,1],[348,335,2],[211,210,1],[296,346,0],[205,486,0],[502,257,2],[430,44,6],[449,449,2],[293,293,2],[362,349,1],[317,349,0],[390,448,2],[353,367,3],[133,134,1],[344,352,0],[204,357,0],[423,359,0],[427,360,0],[203,470,1],[298,298,2],[355,349,1],[296,349,0],[316,349,0],[447,350,0],[450,450,2],[130,446,0],[430,43,6],[344,347,0],[261,420,0],[386,44,2],[295,352,0],[203,528,1],[399,351,0],[440,440,2],[261,425,0],[201,200,1],[409,44,2],[451,451,2],[350,378,1],[373,363,1],[316,352,0],[351,349,1],[38,37,1],[376,355,1],[316,353,0],[295,354,0],[487,210,2],[295,353,0],[512,262,2],[387,352,1],[354,377,1],[360,371,2],[408,385,2],[350,382,1],[351,204,1],[42,400,0],[552,257,3],[351,354,1],[359,468,3],[413,413,2],[36,36,1],[375,375,1],[296,355,0],[384,43,2],[475,389,3],[462,369,4],[497,260,0],[351,379,1],[45,407,0],[360,466,3],[358,347,1],[378,363,1],[212,212,1],[443,443,2],[368,296,1],[142,142,1],[356,354,4],[353,346,1],[351,381,1],[344,350,0],[359,372,2],[382,44,1],[317,353,0],[346,408,1],[373,295,1],[388,352,1],[383,346,0],[349,204,1],[370,367,1],[410,458,2],[209,454,1],[357,355,1],[442,260,0],[370,347,1],[405,43,1],[460,42,2],[353,354,1],[442,259,0],[382,363,1],[404,404,2],[462,129,4],[350,354,1],[351,352,1],[350,349,1],[368,347,1],[403,403,2],[390,524,2],[206,492,0],[346,214,1],[351,355,1],[381,295,1],[398,398,1],[565,262,3],[258,434,0],[199,199,1],[379,367,1],[357,363,1],[344,430,0],[397,397,1],[384,44,2],[355,373,1],[482,335,2],[121,121,1],[390,463,2],[346,350,1],[344,353,0],[49,518,1],[419,43,1],[296,353,0],[207,417,0],[415,43,2],[369,389,2],[491,385,4],[254,255,1],[368,350,1],[344,354,0],[449,48,2],[372,297,4],[387,355,1],[352,346,1],[391,353,1],[478,260,1],[412,43,1],[358,363,1],[382,382,1],[549,315,4],[347,334,1],[345,356,0],[352,355,1],[346,45,1],[352,354,1],[350,353,1],[371,294,4],[346,416,1],[424,366,1],[422,43,2],[133,135,1],[426,347,2],[265,264,1],[451,39,2],[354,358,1],[425,43,1],[38,531,1],[373,350,1],[418,418,2],[388,354,1],[348,363,2],[206,486,0],[355,334,1],[378,296,1],[611,41,3],[143,143,1],[453,259,0],[357,295,1],[555,318,4],[447,447,2],[410,389,2],[122,123,1],[209,487,0],[387,387,1],[535,205,0],[258,446,0],[354,375,1],[392,353,1],[352,133,1],[417,44,1],[355,351,1],[613,46,3],[443,380,2],[51,50,1],[204,373,0],[381,381,1],[256,672,1],[415,44,2],[201,439,0],[377,207,2],[412,383,2],[405,44,1],[471,374,4],[450,137,2],[391,355,1],[384,384,2],[361,355,1],[440,374,2],[352,349,1],[378,378,1],[348,367,2],[493,383,4],[205,492,0],[432,42,2],[316,344,0],[344,346,0],[375,296,1],[353,349,1],[485,125,2],[370,351,1],[356,350,4],[361,349,1],[369,416,2],[497,259,0],[392,354,1],[397,335,5],[334,398,4],[381,367,1],[421,421,2],[204,401,0],[263,682,1],[317,344,0],[128,130,1],[136,599,1],[334,398,2],[365,428,3],[364,429,3],[353,355,1],[458,458,2],[375,351,1],[346,197,1],[378,350,1],[357,367,1],[356,415,4],[346,351,1],[471,41,4],[345,352,0],[344,351,0],[45,414,0],[402,402,1],[347,133,3],[391,391,1],[356,355,4],[204,394,1],[378,354,1],[379,351,1],[129,130,1],[360,469,3],[528,202,2],[364,317,5],[355,371,1],[434,44,1],[128,369,1],[480,134,5],[453,260,0],[481,380,4],[344,349,0],[356,351,4],[354,372,1],[571,137,2],[350,372,1],[140,141,1],[359,472,3],[410,441,2],[426,426,2],[345,347,0],[462,346,0],[36,37,1],[351,258,2],[130,128,1],[359,296,4],[391,295,1],[344,355,0],[346,424,1],[124,547,1],[437,210,2],[368,316,1],[490,202,2],[350,334,1],[354,335,1],[422,44,2],[461,461,2],[350,335,1],[129,127,1],[351,371,1],[463,463,2],[373,355,1],[345,353,0],[481,46,4],[379,349,1],[52,52,1],[346,412,1],[350,371,1],[379,295,1],[346,385,1],[642,127,3],[388,388,1],[207,446,0],[500,137,2],[381,355,1],[208,402,0],[359,346,1],[467,467,2],[350,261,2],[696,134,3],[360,346,1],[387,295,1],[375,367,1],[399,352,0],[253,253,1],[447,202,2],[211,546,0],[351,372,1],[365,316,5],[211,212,1],[45,436,0],[318,319,2],[354,362,1],[207,420,0],[42,411,0],[357,532,1],[349,334,1],[360,427,3],[376,470,2],[368,295,1],[359,423,3],[357,133,2],[347,335,1],[390,413,2],[383,258,2],[347,448,2],[369,130,2],[356,406,4],[213,213,1],[361,367,1],[375,354,1],[519,403,3],[388,296,1],[399,350,0],[392,392,1],[199,200,1],[350,203,1],[315,314,2],[370,296,1],[399,353,0],[485,485,2],[394,401,0],[523,404,3],[352,204,1],[358,367,1],[266,266,1],[410,504,2],[399,349,0],[426,386,2],[362,296,1],[347,348,1],[428,365,5],[429,364,5],[482,482,2],[352,374,2],[535,206,0],[120,120,1],[385,261,2],[345,351,0],[347,411,1],[394,373,0],[360,295,4],[350,406,1],[381,351,1],[405,369,2],[366,424,1],[45,431,0],[430,349,6],[356,409,4],[346,435,1],[356,422,4],[497,205,0],[129,128,1],[317,364,3],[35,35,1],[347,414,1],[354,378,1],[408,44,1],[484,484,2],[355,387,1],[347,204,1],[138,681,1],[358,354,1],[377,402,1],[561,200,2],[353,380,2],[483,42,3],[518,48,2],[361,363,1],[484,334,2],[346,374,1],[357,296,1],[346,432,1],[539,208,2],[346,478,1],[134,599,1],[345,350,0],[257,383,1],[354,478,1],[359,354,1],[360,355,1],[430,353,6],[353,133,1],[430,347,6],[344,386,0],[350,400,1],[352,387,1],[382,349,1],[142,141,1],[392,296,1],[294,293,2],[316,365,3],[450,413,2],[430,352,6],[351,335,1],[401,447,2],[450,529,2],[468,468,4],[353,204,1],[502,502,2],[345,355,0],[383,418,2],[370,295,1],[362,363,1],[401,376,1],[449,404,2],[346,380,1],[353,350,1],[344,393,0],[352,351,1],[466,466,4],[355,381,1],[297,298,2],[358,316,1],[125,127,1],[348,362,2],[360,204,1],[366,370,0],[382,350,1],[346,352,1],[368,317,1],[417,43,1],[531,39,2],[371,427,4],[357,316,1],[358,317,1],[451,403,2],[522,389,3],[638,48,2],[349,369,2],[355,361,1],[346,428,1],[354,405,1],[354,388,1],[449,517,2],[390,548,2],[344,359,0],[198,198,1],[357,317,1],[346,349,1],[471,42,4],[401,203,2],[347,372,1],[365,315,4],[351,334,1],[135,134,1],[477,208,2],[124,759,1],[355,391,1],[346,353,1],[451,521,2],[262,385,1],[122,121,1],[512,264,2],[366,368,0],[346,429,1],[344,360,0],[351,207,1],[382,295,1],[359,350,1],[373,296,1],[366,358,0],[351,399,1],[346,261,1],[359,347,1],[364,318,4],[353,444,1],[136,134,1],[346,360,1],[464,44,1],[373,316,1],[344,348,0],[317,360,0],[524,133,3],[660,39,2],[371,427,1],[143,144,1],[335,397,2],[372,423,4],[416,127,2],[354,359,1],[401,401,1],[362,367,1],[497,206,0],[209,678,1],[368,352,1],[41,42,1],[368,133,2],[502,255,2],[356,296,4],[552,418,3],[346,215,1],[334,334,7],[346,359,1],[316,359,0],[385,421,2],[402,454,2],[361,317,1],[201,528,1],[335,349,0],[49,782,1],[420,363,1],[296,345,0],[372,423,1],[354,392,1],[425,44,1],[346,258,1],[373,317,1],[358,133,2],[432,374,2],[353,391,1],[351,409,1],[383,461,2],[134,136,1],[360,350,1],[360,360,1],[370,317,1],[352,445,1],[359,359,1],[295,345,0],[349,371,1],[495,43,1],[140,681,1],[376,203,2],[356,295,4],[350,365,1],[355,360,1],[345,354,0],[135,137,1],[355,372,1],[347,476,1],[512,512,2],[379,317,1],[535,259,0],[602,260,2],[379,296,1],[335,335,7],[351,369,1],[350,364,1],[400,352,1],[424,347,0],[361,316,1],[359,352,1],[47,380,1],[201,561,0],[400,350,1],[354,371,1],[416,462,2],[524,448,3],[416,475,2],[380,488,2],[565,421,3],[334,347,0],[335,397,4],[40,374,1],[359,207,1],[349,130,2],[394,357,0],[40,42,1],[334,355,0],[360,351,1],[51,52,1],[349,348,1],[387,42,2],[354,369,1],[299,299,1],[44,296,0],[211,487,0],[385,467,2],[344,384,0],[205,596,0],[349,433,1],[124,126,1],[53,53,1],[399,359,0],[38,820,1],[370,363,1],[351,364,1],[380,582,2],[441,441,2],[346,620,1],[351,407,1],[409,43,2],[480,134,3],[258,464,0],[908,134,3],[394,381,0],[602,259,2],[346,455,1],[351,365,1],[350,207,1],[292,292,1],[375,295,1],[360,352,1],[408,350,1],[546,210,2],[345,348,0],[411,347,1],[525,42,3],[254,253,1],[535,260,0],[44,295,0],[204,387,0],[352,388,1],[644,383,3],[43,486,0],[346,456,1],[202,439,0],[204,381,0],[345,349,0],[352,207,1],[414,347,1],[359,353,1],[359,351,1],[346,417,1],[405,349,1],[375,317,1],[424,424,1],[398,334,5],[358,295,1],[386,352,2],[46,45,1],[408,261,2],[382,296,1],[547,125,2],[213,212,1],[345,393,0],[354,364,1],[406,352,2],[355,366,1],[458,369,2],[410,128,2],[360,353,1],[377,316,1],[378,316,1],[43,534,0],[133,344,0],[446,44,1],[541,45,3],[357,426,1],[374,483,2],[347,371,1],[381,317,1],[335,354,0],[440,471,2],[440,42,2],[46,48,1],[377,317,1],[204,391,0],[349,431,1],[491,262,4],[334,350,0],[370,316,1],[463,134,2],[362,295,1],[375,316,1],[43,537,0],[213,214,1],[265,266,1],[348,407,2],[36,35,1],[355,365,1],[204,447,1],[256,383,1],[368,420,1],[354,365,1],[470,350,0],[377,499,2],[353,392,1],[360,364,1],[135,136,1],[297,372,2],[388,42,2],[399,347,0],[348,411,2],[529,134,2],[345,430,0],[319,319,2],[349,207,1],[410,665,2],[400,296,1],[348,509,2],[349,360,1],[464,43,1],[359,365,1],[412,351,1],[590,383,2],[713,257,3],[335,350,0],[435,380,2],[504,504,2],[370,417,1],[41,39,1],[443,481,2],[206,596,0],[386,476,2],[394,361,0],[435,45,2],[370,358,1],[386,353,2],[294,360,0],[382,316,1],[370,133,2],[348,414,2],[651,125,2],[465,465,2],[347,359,1],[297,359,0],[493,257,4],[348,510,2],[382,352,1],[381,316,1],[502,418,2],[378,317,1],[490,200,2],[402,377,1],[376,401,1],[334,352,0],[384,354,2],[376,317,1],[655,385,3],[130,504,1],[204,361,0],[357,425,1],[517,380,2],[346,196,1],[130,127,1],[362,317,1],[360,347,1],[379,316,1],[521,374,2],[294,371,2],[424,133,1],[205,636,0],[355,364,1],[348,400,2],[335,347,0],[120,121,1],[581,354,2],[357,352,1],[34,35,1],[346,462,1],[127,129,1],[350,359,1],[448,346,0],[378,295,1],[46,47,1],[381,296,1],[348,358,2],[206,636,0],[406,44,2],[376,316,1],[208,377,0],[368,367,1],[296,358,0],[387,317,1],[458,130,2],[386,355,2],[349,372,1],[430,354,6],[263,385,1],[348,431,2],[362,316,1],[485,568,2],[43,442,0],[408,363,1],[199,686,0],[295,361,0],[346,542,1],[412,258,2],[356,316,4],[463,137,2],[539,210,2],[549,549,4],[314,314,2],[555,555,4],[432,352,1],[548,133,3],[360,365,1],[361,296,1],[334,349,0],[521,42,2],[347,207,1],[120,119,1],[373,352,1],[449,518,2],[471,471,4],[428,428,3],[351,360,1],[407,351,1],[369,355,0],[435,353,1],[203,664,1],[419,419,1],[356,317,4],[350,360,1],[368,358,1],[129,504,1],[512,421,2],[429,429,3],[44,534,0],[357,368,1],[400,295,1],[416,504,2],[351,359,1],[252,252,1],[741,262,3],[374,350,0],[615,385,2],[446,43,1],[367,391,0],[409,353,2],[41,40,1],[366,479,0],[658,202,2],[659,212,2],[349,364,1],[254,672,1],[607,398,2],[424,357,0],[363,387,0],[204,203,1],[348,433,2],[346,396,1],[388,317,1],[334,351,0],[397,335,7],[350,447,1],[378,352,1],[355,427,1],[351,499,1],[44,537,0],[475,618,3],[410,522,2],[145,144,1],[386,354,2],[129,369,1],[382,317,1],[47,45,1],[377,454,2],[360,207,1],[352,371,1],[359,355,1],[360,349,1],[354,423,1],[353,207,1],[437,437,1],[566,259,2],[557,258,0],[335,351,0],[199,198,1],[390,629,2],[420,296,1],[265,682,1],[391,316,1],[417,417,1],[776,127,3],[394,387,0],[379,434,1],[346,395,1],[359,364,1],[416,128,2],[349,489,1],[375,363,1],[44,492,0],[346,467,1],[139,137,1],[353,443,2],[689,413,3],[407,295,1],[267,267,1],[346,491,1],[348,379,2],[451,531,2],[517,517,2],[347,479,1],[352,372,1],[411,296,1],[419,44,1],[362,630,1],[391,317,1],[392,316,1],[387,296,1],[368,425,1],[407,353,1],[348,357,2],[384,353,2],[375,347,1],[348,345,2],[351,461,2],[481,481,4],[348,361,2],[696,133,3],[134,137,1],[373,382,1],[349,359,1],[754,208,3],[395,352,1],[360,354,1],[462,462,4],[42,438,0],[349,365,1],[126,128,1],[856,48,3],[335,352,0],[384,352,2],[577,135,4],[133,358,0],[351,358,1],[440,560,2],[45,47,1],[394,391,0],[419,382,1],[460,352,1],[349,661,1],[44,442,0],[571,571,2],[53,52,1],[50,48,1],[293,797,2],[494,344,0],[440,39,2],[370,353,1],[398,334,7],[133,357,0],[611,403,3],[125,123,1],[345,360,0],[350,369,1],[367,392,0],[351,209,1],[452,354,1],[346,420,1],[416,542,2],[448,135,2],[600,397,4],[335,353,0],[691,413,3],[43,295,0],[678,210,2],[529,529,2],[43,296,0],[37,39,1],[499,399,2],[348,392,2],[344,396,0],[201,827,1],[458,522,2],[613,404,3],[433,349,1],[346,493,1],[419,363,1],[370,354,1],[447,352,0],[380,523,2],[349,373,1],[375,358,1],[361,382,1],[362,352,1],[642,441,3],[434,367,1],[133,463,1],[411,352,1],[354,130,1],[375,417,1],[387,357,1],[353,372,1],[521,521,2],[203,588,1],[347,365,1],[430,350,6],[379,353,1],[345,359,0],[356,359,4],[430,355,6],[381,363,1],[261,495,0],[347,360,1],[353,371,1],[346,480,1],[373,367,1],[568,129,2],[298,807,2],[485,441,2],[502,590,2],[387,316,1],[388,316,1],[870,137,3],[34,33,1],[134,548,1],[428,315,6],[425,425,1],[346,378,1],[347,364,1],[136,635,1],[400,316,1],[779,389,4],[374,519,2],[506,344,0],[884,39,3],[351,438,1],[355,359,1],[351,539,1],[348,368,2],[396,353,1],[388,295,1],[53,54,1],[454,454,2],[317,359,0],[391,357,1],[440,519,2],[624,350,0],[395,318,3],[396,350,1],[352,365,1],[361,350,1],[417,358,1],[477,377,1],[391,296,1],[396,346,1],[450,500,2],[211,659,0],[379,361,1],[388,350,1],[344,415,0],[42,433,0],[387,347,1],[368,334,1],[407,296,1],[346,216,1],[126,458,1],[429,318,6],[651,123,2],[204,664,1],[346,443,1],[378,347,1],[350,436,1],[354,383,1],[379,363,1],[370,643,1],[349,399,1],[355,422,1],[317,345,0],[346,425,1],[354,360,1],[316,345,0],[214,214,1],[46,380,1],[357,386,1],[43,453,0],[134,619,1],[369,351,0],[551,43,1],[361,419,1],[346,475,1],[449,632,2],[257,258,1],[482,397,2],[396,315,3],[350,423,1],[439,528,2],[334,353,0],[295,335,0],[355,385,1],[344,476,0],[375,370,1],[197,197,1],[408,296,1],[387,350,1],[316,360,0],[344,395,0],[351,493,2],[465,349,2],[127,128,1],[353,364,1],[480,366,1],[143,142,1],[470,352,0],[388,347,1],[43,596,0],[363,348,0],[512,615,2],[672,255,2],[431,349,1],[352,400,1],[478,43,1],[41,374,1],[386,350,2],[345,346,0],[118,119,1],[356,360,4],[348,370,2],[357,538,1],[361,373,1],[456,365,3],[485,547,2],[358,352,1],[373,368,1],[559,43,1],[351,427,1],[133,368,0],[378,368,1],[573,261,0],[391,347,1],[354,415,1],[386,351,2],[373,347,1],[380,725,2],[294,797,2],[533,350,2],[357,353,1],[420,44,1],[362,353,1],[295,360,0],[349,383,1],[350,467,2],[386,296,2],[463,577,2],[608,355,2],[434,43,1],[696,366,3],[376,588,2],[44,453,0],[371,355,0],[356,396,4],[366,564,0],[416,130,2],[140,927,1],[372,354,0],[461,493,2],[353,359,1],[437,402,1],[455,364,3],[357,370,1],[346,398,1],[436,350,1],[536,206,4],[359,204,1],[395,346,1],[443,48,2],[437,209,2],[319,318,2],[414,353,1],[126,129,1],[430,351,6],[499,499,2],[451,645,2],[682,264,2],[347,423,1],[399,360,0],[356,395,4],[352,359,1],[414,296,1],[843,259,0],[447,353,0],[350,491,2],[384,355,2],[443,523,2],[294,992,2],[346,448,1],[252,253,1],[474,297,5],[346,397,1],[344,489,0],[415,349,2],[295,373,0],[405,130,2],[358,368,1],[544,376,1],[480,424,1],[463,390,2],[798,139,2],[136,390,1],[419,373,1],[571,139,2],[367,348,0],[351,257,2],[433,352,1],[202,401,0],[375,353,1],[400,317,1],[344,444,0],[351,452,1],[42,40,1],[351,423,1],[355,369,1],[344,445,0],[349,381,1],[350,427,1],[126,123,1],[316,368,0],[604,374,3],[943,333,4],[122,759,1],[126,124,1],[199,561,0],[347,538,1],[361,334,1],[640,488,3],[385,352,0],[503,355,1],[571,500,2],[358,350,1],[347,425,1],[210,487,0],[347,444,1],[352,360,1],[375,133,1],[552,383,3],[345,386,0],[412,296,1],[365,350,0],[416,346,0],[885,260,0],[638,50,2],[348,382,2],[351,634,1],[613,380,3],[314,315,2],[392,295,1],[364,350,0],[374,721,2],[293,466,2],[470,351,0],[373,357,1],[420,368,1],[347,445,1],[373,425,1],[55,54,1],[345,444,0],[351,417,1],[295,381,0],[348,388,2],[473,294,5],[379,381,1],[686,200,2],[443,45,2],[410,618,2],[548,134,3],[353,360,1],[392,317,1],[359,133,1],[346,381,1],[447,360,0],[335,600,2],[134,629,1],[144,144,1],[297,807,2],[546,212,2],[639,351,0],[317,334,0],[347,385,1],[359,349,1],[501,315,2],[382,373,1],[352,364,1],[346,464,1],[347,415,1],[348,387,2],[390,599,2],[617,380,3],[297,1003,2],[51,782,1],[447,351,0],[498,318,2],[378,367,1],[298,468,2],[296,334,0],[384,351,2],[347,345,1],[357,411,1],[140,138,1],[346,461,1],[335,358,0],[964,336,4],[139,141,1],[347,594,1],[449,47,2],[395,351,1],[417,367,1],[716,405,2],[357,350,1],[450,691,2],[349,392,1],[349,388,1],[408,295,1],[355,428,1],[802,383,3],[480,366,3],[458,728,2],[363,388,0],[489,384,3],[43,492,0],[362,346,1],[348,391,2],[44,316,0],[353,407,1],[362,392,1],[347,559,1],[344,406,0],[357,414,1],[395,350,1],[933,137,3],[385,354,0],[434,434,1],[347,399,1],[611,374,3],[349,427,1],[369,352,0],[350,399,1],[362,388,1],[438,352,1],[917,255,2],[202,203,1],[465,384,2],[412,295,1],[470,353,0],[370,426,1],[267,266,1],[362,446,1],[431,353,1],[262,261,1],[122,1106,1],[440,645,2],[347,464,1],[558,386,3],[600,397,1],[405,295,1],[37,38,1],[362,379,1],[316,334,0],[450,619,2],[517,45,2],[354,428,1],[438,351,1],[345,384,0],[354,429,1],[566,260,2],[346,550,1],[129,344,0],[51,49,1],[407,317,1],[347,344,1],[213,806,0],[467,491,2],[406,406,2],[484,398,2],[345,445,0],[361,352,1],[351,557,1],[346,737,1],[560,483,3],[347,417,1],[437,454,2],[575,352,2],[681,139,2],[675,397,4],[355,469,1],[351,488,1],[34,34,1],[425,368,1],[316,335,0],[211,678,1],[358,420,1],[382,355,1],[542,346,0],[437,539,2],[208,209,1],[415,296,2],[463,524,2],[354,368,1],[529,635,2],[296,359,0],[350,428,1],[397,482,1],[457,317,6],[928,264,2],[349,452,1],[479,426,1],[439,439,1],[44,486,0],[378,346,1],[36,38,1],[355,429,1],[415,352,2],[344,536,0],[415,353,2],[409,409,2],[347,420,1],[398,484,1],[355,532,1],[456,365,1],[369,350,0],[350,405,1],[46,632,1],[373,204,2],[378,133,1],[317,335,0],[450,811,2],[436,353,1],[478,44,1],[422,352,2],[349,419,1],[351,429,1],[425,363,1],[373,376,1],[354,370,1],[452,377,1],[658,350,0],[445,350,2],[355,368,1],[810,260,0],[215,215,1],[349,444,1],[348,375,2],[434,361,1],[414,295,1],[925,125,3],[119,119,1],[348,657,2],[354,472,1],[568,458,2],[379,446,1],[361,353,1],[383,355,0],[412,367,1],[450,136,2],[422,295,2],[354,462,1],[571,730,2],[334,368,0],[358,353,1],[369,353,0],[449,824,2],[350,429,1],[351,428,1],[411,295,1],[50,49,1],[197,198,1],[41,645,1],[347,375,1],[451,828,2],[201,203,1],[420,420,1],[347,396,1],[370,464,1],[1243,134,3],[55,56,1],[268,268,1],[387,133,1],[455,364,1],[470,360,0],[465,362,2],[347,387,1],[381,353,1],[208,210,1],[36,820,1],[335,368,0],[579,353,2],[355,405,1],[358,370,1],[481,45,4],[346,195,1],[843,260,0],[355,550,1],[354,416,1],[349,391,1],[372,350,0],[907,123,2],[398,334,1],[140,142,1],[370,357,1],[408,491,2],[434,295,1],[431,295,1],[424,366,3],[358,417,1],[401,439,1],[440,604,2],[391,133,1],[397,335,1],[459,316,6],[374,374,3],[349,395,1],[396,354,1],[451,40,2],[348,373,2],[389,127,2],[347,383,1],[349,445,1],[346,129,1],[376,133,1],[419,295,1],[362,375,1],[396,351,1],[373,133,1],[379,334,1],[652,350,0],[346,471,1],[256,258,1],[365,359,0],[538,43,2],[423,354,0],[508,353,1],[379,355,1],[347,395,1],[390,346,0],[344,409,0],[134,479,0],[440,40,2],[208,344,0],[360,133,1],[347,406,1],[475,779,3],[427,355,0],[392,351,1],[536,205,4],[370,375,1],[458,128,2],[346,573,1],[350,262,2],[532,43,2],[252,251,1],[382,367,1],[494,352,1],[376,387,1],[145,146,1],[296,375,0],[261,587,0],[361,351,1],[503,376,1],[381,133,1],[469,371,5],[480,424,3],[362,351,1],[638,518,2],[349,375,1],[425,357,1],[355,423,1],[349,387,1],[364,360,0],[344,422,0],[358,335,1],[143,141,1],[524,413,3],[485,126,2],[347,378,1],[396,352,1],[45,48,1],[209,377,0],[458,665,2],[897,403,4],[358,351,1],[365,351,0],[347,392,1],[565,385,3],[391,351,1],[494,42,2],[411,317,1],[382,419,1],[407,316,1],[436,296,1],[542,369,3],[433,295,1],[45,632,1],[364,351,0],[411,350,1],[347,427,1],[556,44,1],[660,37,2],[346,294,1],[352,438,1],[410,922,2],[589,43,2],[44,636,0],[372,468,4],[405,296,1],[346,387,1],[350,202,1],[380,355,0],[395,354,1],[349,434,1],[379,375,1],[488,45,3],[32,33,1],[349,415,1],[495,44,1],[347,391,1],[447,203,2],[371,466,4],[136,138,1],[351,477,1],[395,355,1],[364,354,0],[485,690,2],[359,762,3],[411,316,1],[382,361,1],[444,351,2],[499,352,0],[590,590,2],[347,422,1],[568,568,2],[395,353,1],[379,335,1],[118,117,1],[43,497,0],[759,123,2],[728,127,4],[355,456,1],[357,564,1],[418,383,2],[209,631,0],[257,461,1],[410,642,2],[346,373,1],[362,377,1],[721,374,3],[200,561,0],[448,463,2],[359,428,1],[491,491,4],[391,376,1],[365,354,0],[381,334,1],[472,372,5],[352,399,1],[360,760,3],[390,355,0],[296,368,0],[408,316,1],[347,373,1],[593,44,2],[349,385,1],[443,640,2],[210,208,1],[362,382,1],[451,611,2],[471,560,4],[378,335,1],[651,651,2],[350,573,1],[354,334,1],[350,459,1],[346,297,1],[885,259,0],[352,477,1],[346,388,1],[354,384,1],[846,259,0],[585,44,1],[346,481,1],[525,352,0],[386,295,2],[500,500,2],[360,429,1],[387,373,1],[449,613,2],[355,335,1],[353,436,1],[349,396,1],[400,368,1],[369,618,2],[412,317,1],[439,401,1],[349,422,1],[450,599,2],[354,427,1],[350,396,1],[351,469,1],[135,635,1],[411,357,1],[355,551,1],[384,295,2],[124,127,1],[347,673,1],[350,470,1],[419,361,1],[353,365,1],[402,437,1],[378,420,1],[353,477,1],[558,43,3],[480,480,1],[409,367,2],[755,398,4],[346,389,1],[448,134,2],[660,531,2],[349,429,1],[354,207,2],[347,356,1],[432,296,1],[352,203,1],[351,405,1],[370,352,1],[655,467,3],[438,295,1],[388,358,1],[366,972,1],[254,1299,1],[348,465,2],[438,296,1],[373,334,1],[351,455,1],[359,334,1],[502,672,2],[317,368,0],[350,457,1],[354,456,1],[50,52,1],[357,346,1],[568,128,2],[357,511,1],[353,399,1],[355,261,1],[443,632,2],[350,445,1],[493,493,4],[388,378,1],[360,203,1],[502,713,2],[344,562,0],[354,459,1],[345,406,0],[417,370,1],[349,647,1],[380,351,0],[638,761,2],[523,725,3],[364,359,0],[204,202,1],[32,31,1],[350,361,1],[382,335,1],[373,419,1],[49,51,1],[478,207,0],[211,1056,1],[670,43,1],[391,381,1],[422,353,2],[414,316,1],[54,54,1],[350,700,1],[204,425,0],[499,351,0],[644,461,3],[349,423,1],[614,259,4],[512,682,2],[396,355,1],[350,456,1],[384,489,2],[361,379,1],[619,619,2],[417,296,1],[615,615,2],[360,335,1],[543,351,2],[435,295,1],[400,400,1],[347,483,1],[349,428,1],[558,44,3],[350,201,1],[354,386,1],[365,365,1],[577,577,4],[539,539,2],[385,355,0],[354,457,1],[265,1340,1],[296,378,0],[207,495,0],[347,409,1],[350,452,1],[352,452,1],[349,446,1],[349,378,1],[472,297,6],[941,404,4],[360,428,1],[538,44,2],[349,409,1],[394,425,0],[449,725,2],[347,562,1],[347,381,1],[447,359,0],[499,353,0],[364,346,0],[487,487,1],[392,346,1],[353,452,1],[622,260,4],[366,414,0],[350,358,1],[317,373,0],[316,373,0],[350,387,1],[352,334,1],[359,399,1],[506,353,1],[349,566,1],[363,344,0],[368,357,1],[354,556,1],[129,416,1],[354,42,1],[349,457,1],[550,43,1],[354,742,1],[355,459,1],[443,617,2],[362,335,1],[529,691,2],[125,124,1],[410,369,2],[532,44,2],[317,358,0],[371,351,0],[213,659,0],[316,358,0],[698,398,4],[317,361,0],[378,358,1],[433,296,1],[666,259,3],[347,388,1],[347,429,1],[262,467,1],[1176,255,3],[364,355,0],[386,348,2],[512,741,2],[139,138,1],[430,296,6],[48,46,1],[44,497,0],[366,411,0],[564,355,1],[469,294,6],[368,335,1],[660,785,2],[386,426,2],[415,415,2],[350,507,1],[448,413,2],[344,496,0],[424,480,1],[389,618,2],[380,354,0],[208,437,0],[346,391,1],[414,357,1],[351,456,1],[377,388,1],[384,350,2],[621,44,2],[499,350,0],[383,353,0],[443,47,2],[375,335,1],[856,518,3],[376,357,1],[354,455,1],[351,457,1],[350,528,1],[355,408,1],[209,880,1],[351,459,1],[827,200,2],[895,198,2],[698,398,1],[412,316,1],[476,476,3],[392,377,1],[658,200,2],[349,495,1],[133,537,0],[347,428,1],[350,357,1],[207,631,0],[411,426,1],[147,146,1],[350,425,1],[565,836,3],[355,130,1],[355,382,1],[354,408,1],[317,379,0],[345,396,0],[350,455,1],[354,258,1],[361,381,1],[355,513,1],[583,202,2],[519,721,3],[398,607,1],[1140,137,2],[357,464,1],[381,346,1],[430,295,6],[386,444,2],[126,651,1],[472,359,0],[352,363,3],[365,346,0],[374,354,0],[436,295,1],[1210,264,3],[386,316,2],[359,372,4],[405,316,1],[37,35,1],[355,457,1],[365,360,0],[353,335,1],[346,217,1],[353,203,1],[347,593,1],[589,44,2],[344,554,0],[355,425,1],[377,375,1],[351,444,1],[362,465,1],[414,426,1],[43,732,0],[121,123,1],[395,555,3],[361,434,1],[488,582,3],[386,317,2],[386,445,2],[350,420,1],[624,352,0],[38,36,1],[347,459,1],[347,408,1],[354,516,1],[351,345,1],[361,371,1],[126,963,1],[42,460,0],[365,355,0],[524,548,3],[44,732,0],[41,440,1],[215,214,1],[369,475,2],[388,346,1],[446,375,1],[573,43,1],[847,210,2],[350,460,1],[376,381,1],[354,379,1],[373,371,1],[353,334,1],[355,455,1],[357,351,1],[406,296,2],[347,457,1],[431,296,1],[207,556,0],[522,369,3],[346,375,1],[387,376,1],[434,379,1],[391,45,2],[42,39,1],[396,549,3],[350,419,1],[359,429,1],[432,295,1],[39,41,1],[345,409,0],[257,256,1],[352,411,1],[351,395,1],[392,375,1],[347,525,1],[354,395,1],[542,416,3],[196,196,1],[350,514,1],[135,619,1],[355,426,1],[349,469,1],[317,375,0],[133,370,0],[368,378,1],[392,358,1],[377,674,2],[373,361,1],[345,422,0],[927,141,2],[362,350,1],[372,351,0],[140,137,1],[373,349,1],[412,493,2],[984,137,2],[511,463,3],[396,347,1],[405,462,2],[359,452,1],[349,536,1],[381,371,1],[621,357,2],[257,255,1],[348,680,2],[437,487,1],[550,44,1],[761,46,2],[357,334,1],[521,611,2],[479,347,1],[350,395,1],[432,471,2],[374,355,0],[490,201,2],[1059,141,2],[364,344,0],[387,334,1],[406,355,2],[435,481,2],[349,459,1],[316,382,0],[346,346,3],[351,520,1],[46,443,1],[297,297,1],[352,335,1],[350,344,1],[355,370,1],[414,317,1],[258,256,1],[434,381,1],[437,639,2],[377,378,1],[345,496,0],[417,375,1],[356,334,4],[43,749,0],[356,335,4],[294,294,1],[368,373,1],[877,377,2],[376,352,1],[594,44,1],[468,468,1],[387,346,1],[357,371,1],[344,505,0],[908,366,3],[372,372,1],[590,258,2],[359,456,1],[351,203,1],[365,428,1],[362,384,1],[421,385,2],[354,396,1],[376,373,1],[488,380,3],[529,390,2],[470,347,0],[48,47,1],[360,455,1],[354,412,1],[604,440,3],[454,351,0],[406,445,2],[363,296,0],[475,346,0],[350,469,1],[517,613,2],[1050,206,0],[522,618,3],[355,585,1],[364,555,4],[461,255,2],[566,43,2],[317,381,0],[354,444,1],[373,346,1],[359,203,1],[536,259,4],[345,505,0],[349,670,1],[367,344,0],[408,317,1],[435,296,1],[464,367,1],[588,350,0],[385,836,2],[349,455,1],[350,388,1],[316,361,0],[42,645,1],[345,415,0],[355,395,1],[357,387,1],[420,358,1],[470,359,0],[884,531,3],[706,44,2],[401,652,2],[251,251,1],[366,420,0],[379,362,1],[638,49,2],[406,295,2],[211,209,1],[392,335,1],[349,397,1],[350,472,1],[353,496,1],[357,391,1],[345,395,0],[624,353,0],[502,256,2],[556,43,1],[346,361,1],[666,260,3],[383,552,2],[370,386,1],[478,362,1],[316,378,0],[411,368,1],[446,446,1],[353,414,1],[354,445,1],[571,138,2],[370,381,1],[466,466,1],[355,625,1],[351,361,1],[409,295,2],[334,361,0],[422,422,2],[349,456,1],[355,396,1],[713,383,3],[346,458,1],[359,477,1],[352,423,1],[145,145,1],[366,425,0],[383,802,2],[133,345,0],[384,296,2],[347,541,1],[483,374,3],[638,782,2],[357,373,1],[634,44,1],[347,42,1],[376,391,1],[777,350,0],[785,41,2],[449,380,2],[386,562,2],[120,122,1],[351,472,1],[355,344,1],[263,261,1],[806,212,2],[360,371,4],[632,632,2],[346,392,1],[352,428,1],[433,317,1],[451,721,2],[355,345,1],[384,465,2],[381,204,2],[354,397,1],[376,694,2],[634,43,1],[346,586,1],[415,347,2],[349,412,1],[477,344,0],[557,44,1],[577,390,4],[396,359,1],[395,347,1],[405,363,1],[354,344,1],[362,431,1],[355,526,1],[448,720,2],[422,350,2],[354,616,1],[364,353,0],[470,349,0],[463,689,2],[669,206,4],[348,344,2],[524,629,3],[351,130,1],[463,720,2],[585,43,1],[448,390,2],[812,504,3],[44,535,0],[295,379,0],[582,381,0],[352,427,1],[391,346,1],[480,366,5],[617,443,3],[401,528,2],[376,202,2],[391,334,1],[350,432,1],[355,412,1],[355,386,1],[392,45,2],[1110,48,3],[140,730,1],[485,776,2],[368,709,1],[349,477,1],[467,346,0],[378,372,1],[215,216,1],[50,51,1],[388,368,1],[499,359,0],[316,375,0],[358,375,1],[351,527,1],[318,429,2],[350,477,1],[346,362,1],[382,334,1],[405,367,1],[415,351,2],[1600,134,5],[485,948,2],[400,373,1],[378,494,1],[1043,413,4],[426,296,2],[451,374,2],[804,127,2],[41,519,1],[411,358,1],[674,208,4],[660,38,2],[426,357,2],[353,423,1],[661,43,1],[502,805,2],[362,372,1],[426,363,2],[479,346,1],[686,198,2],[763,208,2],[352,440,2],[600,336,4],[347,472,1],[463,619,2],[424,368,0],[370,334,1],[460,296,1],[406,363,2],[362,433,1],[425,295,1],[350,130,1],[46,523,1],[388,335,1],[502,989,2],[33,33,1],[458,127,2],[499,349,0],[346,484,1],[354,385,1],[574,352,3],[452,296,1],[360,456,1],[125,126,1],[366,417,0],[386,347,2],[1146,39,3],[810,259,0],[476,352,3],[349,356,1],[365,352,0],[349,483,1],[607,398,1],[407,407,1],[359,474,1],[358,372,1],[424,370,0],[615,741,2],[133,548,1],[463,635,2],[416,441,2],[262,263,1],[444,496,2],[798,141,2],[369,377,0],[382,378,1],[350,624,1],[384,317,2],[354,432,1],[366,714,0],[431,316,1],[469,360,0],[386,356,2],[346,616,1],[376,447,2],[409,296,2],[405,317,1],[406,347,2],[408,344,0],[395,349,1],[400,334,1],[134,564,0],[630,43,2],[577,448,4],[44,749,0],[352,368,1],[354,417,1],[490,658,2],[43,535,0],[401,204,2],[346,482,1],[348,589,2],[346,594,1],[361,391,1],[547,547,2],[354,530,1],[355,621,1],[345,489,0],[138,141,1],[355,379,1],[566,44,2],[1164,260,0],[351,391,1],[581,581,2],[360,473,1],[354,435,1],[346,742,1],[366,464,0],[362,495,1],[377,478,1],[536,43,4],[349,408,1],[367,407,0],[461,552,2],[365,549,4],[406,316,2],[348,436,2],[396,349,1],[361,204,2],[353,427,1],[118,118,1],[399,207,2],[355,384,1],[347,412,1],[395,360,1],[491,346,0],[349,488,1],[1089,403,4],[438,317,1],[349,541,1],[364,352,0],[432,316,1],[375,379,1],[317,378,0],[404,380,2],[347,553,1],[346,585,1],[354,542,1],[388,377,1],[350,503,1],[512,263,2],[334,359,0],[49,977,1],[210,209,1],[295,371,1],[373,387,1],[452,344,0],[357,598,1],[424,358,0],[841,377,2],[253,255,1],[1015,202,3],[602,43,2],[316,381,0],[351,396,1],[409,354,2],[446,379,1],[392,347,1],[400,382,1],[346,835,1],[345,476,0],[536,44,4],[352,775,1],[355,398,1],[363,460,0],[133,390,1],[382,495,1],[362,667,1],[376,652,2],[346,551,1],[355,42,1],[315,428,2],[348,381,2],[512,833,2],[347,455,1],[386,415,2],[402,209,2],[351,639,1],[352,408,1],[346,556,1],[467,264,2],[416,816,2],[430,317,6],[364,349,0],[37,36,1],[544,355,1],[768,43,2],[116,117,1],[353,481,2],[355,445,1],[49,52,1],[371,371,1],[435,317,1],[378,388,1],[582,380,2],[129,475,1],[764,43,2],[604,519,3],[353,409,1],[645,645,2],[199,827,1],[359,396,1],[352,471,2],[353,384,1],[539,454,2],[358,703,1],[361,335,1],[355,258,1],[430,316,6],[517,47,2],[38,35,1],[125,963,1],[359,455,1],[362,494,1],[516,354,1],[521,40,2],[629,134,3],[351,644,2],[349,572,1],[583,401,1],[381,376,1],[870,500,3],[349,407,1],[743,418,4],[512,1032,2],[370,593,1],[446,367,1],[346,557,1],[353,386,1],[490,490,1],[370,414,1],[427,351,0],[615,261,2],[786,397,1],[362,378,1],[375,372,1],[316,379,0],[334,381,0],[298,299,2],[353,429,1],[423,350,0],[50,977,1],[353,396,1],[350,345,1],[754,454,3],[461,805,2],[121,122,1],[355,472,1],[360,395,1],[385,347,0],[296,372,1],[125,651,1],[590,713,2],[362,506,1],[349,525,1],[199,895,0],[317,357,0],[400,378,1],[972,133,1],[351,357,1],[1164,259,0],[351,392,1],[389,369,2],[293,292,2],[350,374,1],[405,344,0],[353,793,1],[426,295,2],[647,44,1],[411,386,1],[346,128,1],[360,477,1],[776,441,3],[296,335,0],[1203,206,0],[262,264,1],[316,357,0],[421,836,2],[349,406,1],[400,335,1],[355,435,1],[601,376,1],[402,631,1],[562,43,4],[463,136,2],[660,820,2],[604,471,3],[365,349,0],[383,354,0],[523,1083,3],[690,651,2],[824,380,3],[422,347,2],[346,559,1],[355,432,1],[675,397,1],[365,347,0],[448,689,2],[404,725,2],[778,134,3],[334,354,0],[379,352,1],[409,444,2],[426,558,2],[351,434,1],[334,373,0],[394,419,0],[355,578,1],[368,354,1],[507,350,1],[347,572,1],[364,429,1],[55,55,1],[344,357,0],[347,488,1],[476,386,3],[377,392,1],[335,360,0],[473,371,4],[39,40,1],[1150,348,2],[624,360,0],[798,681,2],[317,370,0],[349,553,1],[984,138,2],[212,659,0],[410,949,2],[388,133,1],[431,317,1],[493,346,0],[352,395,1],[355,444,1],[360,452,1],[546,211,2],[483,483,3],[355,419,1],[416,642,2],[348,438,2],[355,383,1],[347,398,1],[143,1403,1],[50,761,1],[352,505,1],[1050,205,0],[355,424,1],[346,440,1],[529,136,2],[665,369,3],[459,350,0],[425,373,1],[400,460,1],[381,391,1],[361,387,1],[345,344,7],[436,316,1],[690,123,2],[382,204,1],[201,789,0],[320,320,1],[354,469,1],[414,358,1],[382,362,1],[38,1044,1],[1280,52,2],[346,466,1],[411,411,1],[518,518,2],[361,427,1],[430,359,6],[426,367,2],[347,45,1],[375,377,1],[490,528,2],[414,386,1],[354,620,1],[602,44,2],[464,370,1],[474,372,4],[513,355,1],[295,371,3],[384,444,2],[562,44,4],[461,814,2],[120,123,1],[409,317,2],[446,362,1],[617,481,3],[470,447,2],[348,378,2],[334,379,0],[565,467,3],[445,505,2],[207,587,0],[373,494,1],[552,802,3],[365,344,0],[350,544,1],[354,261,1],[461,258,2],[355,684,1],[351,45,1],[380,380,3],[352,429,1],[541,353,0],[207,623,0],[267,268,1],[357,376,1],[364,347,0],[335,375,0],[673,44,1],[350,601,1],[828,374,3],[49,47,1],[203,694,1],[360,399,1],[391,373,1],[664,350,0],[210,437,0],[295,334,0],[846,260,0],[351,526,1],[671,42,3],[316,370,0],[539,639,2],[359,459,1],[1256,346,1],[416,796,2],[126,410,1],[139,730,1],[201,401,0],[448,577,2],[346,468,1],[347,511,1],[37,1044,1],[358,423,1],[604,42,3],[347,456,1],[358,346,1],[398,755,5],[135,133,1],[384,316,2],[542,462,3],[347,452,1],[135,390,1],[422,349,2],[427,350,0],[690,690,2],[1098,200,2],[395,359,1],[412,363,1],[357,625,1],[433,350,1],[360,457,1],[407,370,1],[886,206,2],[317,387,0],[347,261,1],[353,431,1],[477,354,1],[655,346,0],[125,128,1],[557,43,1],[344,368,0],[430,360,6],[389,504,2],[385,359,0],[335,378,0],[423,351,0],[363,345,0],[467,833,2],[638,638,2],[381,379,1],[350,583,1],[353,46,2],[349,472,1],[378,377,1],[661,44,1],[207,209,1],[375,362,1],[130,410,1],[363,317,0],[358,334,1],[352,41,2],[379,354,1],[375,346,1],[349,258,1],[371,350,0],[197,196,1],[593,43,2],[346,194,1],[464,295,1],[351,208,1],[364,364,1],[257,805,1],[347,400,1],[368,353,1],[375,392,1],[531,531,2],[352,433,1],[261,263,1],[296,362,0],[352,357,1],[499,360,0],[352,386,1],[354,345,1],[431,351,1],[37,785,1],[352,406,1],[466,294,1],[403,39,2],[385,360,0],[551,44,1],[439,203,2],[293,1606,1],[317,382,0],[542,475,3],[399,454,2],[352,459,1],[915,376,2],[354,374,1],[375,446,1],[479,134,2],[142,927,1],[614,206,4],[313,313,1],[387,381,1],[348,628,2],[300,300,1],[414,351,1],[384,445,2],[392,378,1],[414,370,1],[397,675,5],[355,718,1],[368,525,1],[354,45,1],[533,533,2],[460,295,1],[580,353,3],[296,373,0],[351,508,1],[397,786,1],[347,469,1],[487,678,2],[349,400,1],[368,715,1],[368,355,1],[630,44,2],[359,408,1],[624,351,0],[426,358,2],[433,316,1],[369,344,0],[375,506,1],[352,358,1],[353,457,1],[213,1092,0],[404,48,2],[266,264,1],[514,350,1],[392,350,1],[129,534,0],[142,1155,1],[353,455,1],[458,949,2],[384,415,2],[346,517,1],[357,381,1],[298,1580,1],[409,347,2],[350,1007,1],[352,456,1],[495,363,1],[579,579,2],[382,354,1],[360,427,4],[604,560,3],[258,805,1],[439,447,2],[571,681,2],[624,359,0],[353,395,1],[365,353,0],[503,295,1],[490,439,1],[352,344,1],[674,399,4],[333,333,3],[383,349,0],[489,354,3],[362,566,1],[360,130,1],[319,555,2],[539,351,0],[210,546,0],[216,216,1],[316,400,0],[350,386,1],[460,460,1],[335,379,0],[355,45,1],[391,349,1],[204,344,0],[317,376,0],[360,396,1],[588,352,0],[1102,336,2],[351,446,1],[348,538,2],[468,297,1],[294,473,0],[403,374,2],[367,431,0],[143,1059,1],[353,357,1],[359,423,4],[511,135,3],[799,351,0],[643,43,2],[407,381,1],[316,377,0],[408,373,1],[598,357,1],[296,379,0],[353,405,1],[372,359,0],[394,434,0],[335,382,0],[347,258,1],[943,943,4],[355,411,1],[136,139,1],[296,388,0],[414,414,1],[392,362,1],[407,379,1],[351,211,1],[391,361,1],[666,384,3],[826,374,4],[295,375,0],[317,362,0],[459,354,0],[476,353,3],[523,380,3],[565,1208,3],[38,40,1],[347,384,1],[350,530,1],[316,376,0],[765,44,2],[295,382,0],[371,349,0],[317,388,0],[344,591,0],[199,1452,1],[348,593,2],[457,354,0],[291,291,1],[429,455,1],[361,376,1],[346,318,1],[643,44,2],[381,370,1],[433,362,1],[351,464,1],[371,360,0],[428,365,3],[391,204,2],[377,358,1],[420,378,1],[351,362,1],[352,345,1],[1405,797,4],[488,488,3],[344,614,0],[361,346,1],[449,1382,2],[367,436,0],[536,260,4],[367,508,0],[351,386,1],[353,617,2],[477,399,2],[359,358,1],[335,355,0],[210,212,1],[388,349,1],[296,370,0],[352,396,1],[1429,129,2],[254,256,1],[405,362,1],[359,395,1],[402,880,2],[438,316,1],[493,258,4],[725,380,3],[714,366,2],[334,698,2],[461,256,2],[532,426,2],[360,408,1],[352,503,1],[456,456,1],[652,352,0],[392,133,1],[387,204,2],[428,456,1],[353,412,1],[429,350,0],[146,146,1],[417,351,1],[388,362,1],[445,347,2],[395,364,4],[402,639,2],[594,43,1],[469,371,3],[515,363,1],[559,385,2],[511,134,3],[549,549,1],[356,510,4],[546,546,1],[1369,35,2],[208,207,1],[297,474,0],[368,372,1],[925,547,3],[352,405,1],[455,455,1],[425,367,1],[407,383,2],[387,349,1],[346,560,1],[622,206,4],[373,385,2],[984,730,2],[1332,315,4],[590,256,2],[689,599,3],[344,580,0],[486,296,0],[121,119,1],[457,355,0],[847,212,2],[346,504,1],[401,470,2],[376,353,1],[396,360,1],[392,349,1],[295,368,0],[505,350,3],[669,205,4],[352,384,1],[1462,123,3],[349,42,1],[351,435,1],[426,370,2],[696,424,3],[528,528,2],[411,354,1],[358,378,1],[377,581,1],[520,351,1],[350,655,2],[359,261,1],[351,530,1],[713,418,3],[352,373,1],[124,568,1],[622,205,4],[728,389,4],[388,375,1],[436,317,1],[348,346,2],[363,486,0],[654,346,1],[1427,807,4],[353,379,1],[356,509,4],[508,295,1],[346,521,1],[347,589,1],[779,618,4],[355,374,1],[381,506,1],[138,1251,1],[350,501,1],[352,447,1],[370,335,1],[964,964,4],[250,251,1],[344,574,0],[409,349,2],[409,316,2],[457,350,0],[254,590,1],[660,660,2],[419,349,1],[354,710,1],[294,466,1],[353,428,1],[376,910,1],[489,489,3],[391,350,1],[571,933,2],[262,833,1],[396,365,4],[368,483,1],[296,382,0],[347,407,1],[32,32,1],[372,472,3],[386,363,2],[347,628,1],[412,381,1],[464,464,1],[722,259,4],[766,354,2],[353,358,1],[344,400,0],[370,738,1],[452,295,1],[354,712,1],[577,133,4],[691,134,3],[354,420,1],[364,455,1],[388,351,1],[1264,125,3],[1048,618,5],[1190,348,2],[351,503,1],[551,385,2],[120,1106,1]]} diff --git a/variants/sparse-standard-2bin/sparse_router_config.yaml b/variants/sparse-standard-2bin/sparse_router_config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..decada073329cffce9d1b5022abf52e19860246a --- /dev/null +++ b/variants/sparse-standard-2bin/sparse_router_config.yaml @@ -0,0 +1,372 @@ +model_type: actioncodec2_sparse_router +config_version: 1 +profiles: +- name: joint + token_offset: 0 + token_budget: 4096 + artifact_fingerprint: 99d4ee5a6c2aee7c69dcf57f20e243ebda8bcfd65c280fc2473cc0ae0bfc88f1 +- name: eef + token_offset: 4096 + token_budget: 4096 + artifact_fingerprint: 5dbdb90b67f76a5bd0c12d0c5523c26422ca5a0e9eb60138030c957a0893037b +presets: +- name: dual_eef_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_eef_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: eef + position_dims: + - 7 + - 8 + - 9 + rotation_dims: + - 10 + - 11 + - 12 + rotation_format: rotation_vector + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_abs + input_dim: 14 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint6_delta + input_dim: 14 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + joint_wrap: pi + gripper_dim: 13 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_abs + input_dim: 16 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: dual_joint7_delta + input_dim: 16 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + left_arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 + right_arm: + space: joint + joint_dims: + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + joint_wrap: pi + gripper_dim: 15 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_eef_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: eef + position_dims: + - 0 + - 1 + - 2 + rotation_dims: + - 3 + - 4 + - 5 + rotation_format: rotation_vector + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs + input_dim: 7 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint6_abs_no_gripper + input_dim: 6 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi +- name: single_joint6_delta + input_dim: 7 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + joint_wrap: pi + gripper_dim: 6 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_abs + input_dim: 8 + input: absolute + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0 +- name: single_joint7_delta + input_dim: 8 + input: delta + source_hz: 15.0 + target_hz: 15.0 + interpolation: cubic + token_order: time_major + components: + arm: + space: joint + joint_dims: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + joint_wrap: pi + gripper_dim: 7 + gripper_closed_value: 0.0 + gripper_open_value: 1.0