From 8ffa5a50a3f16c6e83baa6eecc00ff0c4ba92c6e Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Fri, 30 Oct 2026 00:34:32 -0600 Subject: [PATCH 1/5] feat(keychron): add Hall-effect keyboard protocol and driver Decode the KC_HE (0xA9) command group Keychron Launcher uses on the VIA raw-HID collection (0xFF60:0x61): command versions 1-5, profile info and names, actuation and rapid-trigger writes, profile buffer decoding (keys, DKS, snap-tap), curve, live travel, calibration and axis type. Add a 169-board Hall-effect catalog generated from Launcher's per-board definitions, a KeychronHidClient registered in the driver list and HID filters, tests, and docs/keychron-support.md. Derived from static analysis of Launcher only; not yet verified on hardware, so settingsReady stays false. --- README.md | 1 + docs/keychron-support.md | 55 ++++ package.json | 5 + src/drivers/keyboard-types.ts | 20 ++ src/drivers/keychron/hid.test.ts | 140 +++++++++ src/drivers/keychron/hid.ts | 301 +++++++++++++++++++ src/drivers/registry.test.ts | 22 +- src/drivers/registry.ts | 5 +- src/drivers/vendors.ts | 20 ++ src/index.ts | 1 + src/keychron/index.ts | 490 +++++++++++++++++++++++++++++++ src/keychron/products.ts | 189 ++++++++++++ src/keychron/protocol.test.ts | 157 ++++++++++ tsconfig.json | 3 + 14 files changed, 1407 insertions(+), 2 deletions(-) create mode 100644 docs/keychron-support.md create mode 100644 src/drivers/keychron/hid.test.ts create mode 100644 src/drivers/keychron/hid.ts create mode 100644 src/keychron/index.ts create mode 100644 src/keychron/products.ts create mode 100644 src/keychron/protocol.test.ts diff --git a/README.md b/README.md index 97f5517..c28fa16 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ filters, the driver registry, and shared status types live under | Razer | `@openmouse/keyboard-protocol/razer` | | Logitech | `@openmouse/keyboard-protocol/logitech` | | SteelSeries | `@openmouse/keyboard-protocol/steelseries` | +| Keychron (Hall-effect) | `@openmouse/keyboard-protocol/keychron` | Kochi Hummingbird 68 (`1CA2:0901`) supports reading and changing Windows/Mac mode on its `FFA0:1` USB configuration collection. Both directions and mode diff --git a/docs/keychron-support.md b/docs/keychron-support.md new file mode 100644 index 0000000..c8c4bd3 --- /dev/null +++ b/docs/keychron-support.md @@ -0,0 +1,55 @@ +# Keychron Hall-effect keyboards + +Keychron's Hall-effect (HE/TMR) boards share one configuration protocol, the +`KC_HE` command group (`0xA9`) on the VIA raw-HID collection. The codec is +`@openmouse/keyboard-protocol/keychron`; the WebHID client is +`KeychronHidClient` in `src/drivers/keychron/hid.ts`. + +## Status + +Implemented from static analysis of Keychron Launcher and **not yet run against +a physical board**. The unit tests pin the byte layouts Launcher uses; they do +not show firmware behaviour. Treat every write as unverified until a board has +been exercised, and note the gaps below before relying on a value. + +## Evidence + +- Launcher (`launcher.keychron.com`, `main.d60cabdb24f8f1c7.js`) contains five + command classes, `getCommandVersion()` 1 to 5, that build the same + `[0xA9, subcommand, ...]` reports. Their differences are reproduced here: + one-byte travel up to v4 and 16-bit travel in v5, 4-byte key slots up to v4 + and 7-byte slots in v5, and a v4+ profile-info tail with DKS and snap-tap + counts (v5 adds the travel unit). +- Reports are 32 bytes, report ID 0, usage page `0xFF60`, usage `0x61`. +- The product catalog (`src/keychron/products.ts`, 169 boards) comes from + Launcher's per-board definitions at + `static/device/{vid*65536+pid}/json/v3.json`, gathered on 2026-10-30. A board + is included when its definition declares the `HE` feature, an `extra.he` + block or an `axisList`, or when its name says HE/TMR (three boards, marked + `launcherFlag: false`). + +## What is implemented + +| Area | Commands | +| --- | --- | +| Identity | version and capability bits, profile count/size/active slot, profile names | +| Travel | actuation, rapid-trigger press/release, global and per-key (`setTravel`) | +| Profiles | select, read and decode the whole buffer, save, clear, rename | +| Advanced keys | DKS decode and write/remove, snap-tap decode and write, turbo/DKR/toggle slot decode | +| Response | curve read/write, live per-key travel | +| Maintenance | calibration start/stop/state, switch axis type read/write, single-key reset, joystick mode | + +## Known gaps + +- `workMode` and `keyMode` are sent as the raw bytes Launcher uses. Their + meanings are only partly known (`keyMode` 0 means "write a per-key buffer"), + so the driver exposes them unnamed. +- The profile buffer layout past the snap-tap region, the v5 DKS/snap-tap + write offsets beyond what Launcher sets, and turbo/DKR write commands are not + covered. +- `readStatus` reports connection type as unknown; the raw-HID path is the same + over USB and the 2.4 GHz receiver, and Bluetooth was not examined. +- `settingsReady` stays false, so hosts do not show a keyboard settings surface + until a board has verified the writes. +- Non-HE Keychron keyboards (QMK/VIA, ZMK, "DEBOUNCE" boards) use a different + feature set and are not claimed. diff --git a/package.json b/package.json index 2e9ff8f..bbeca85 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "docs/razer-support.md", "docs/logitech-support.md", "docs/steelseries-support.md", + "docs/keychron-support.md", "README.md", "CONTRIBUTING.md" ], @@ -48,6 +49,10 @@ "./steelseries": { "types": "./dist/steelseries/index.d.ts", "import": "./dist/steelseries/index.js" + }, + "./keychron": { + "types": "./dist/keychron/index.d.ts", + "import": "./dist/keychron/index.js" } }, "scripts": { diff --git a/src/drivers/keyboard-types.ts b/src/drivers/keyboard-types.ts index 3e63cfa..a9135a6 100644 --- a/src/drivers/keyboard-types.ts +++ b/src/drivers/keyboard-types.ts @@ -36,6 +36,7 @@ import type { import type { RazerKeyboardState } from "@openmouse/keyboard-protocol/razer"; import type { LogitechKeyboardState } from "@openmouse/keyboard-protocol/logitech"; import type { SteelSeriesApexProfile } from "@openmouse/keyboard-protocol/steelseries"; +import type { KeychronHeFeatures } from "@openmouse/keyboard-protocol/keychron"; export interface KeyboardUiHints { /** Stable driver id, e.g. "wooting". */ @@ -169,6 +170,23 @@ export interface WuqueStatus { macros?: WuqueMacroState | null; } +/** Keychron Hall-effect board identity and the layout the profile buffer follows. */ +export interface KeychronState { + productId: number; + /** Hall-effect command version the board reports (1-5). */ + heVersion: number; + features: KeychronHeFeatures; + /** Millimetres per travel step in profile values. */ + unit: number; + profileSize: number; + dksCount: number | null; + snapTapCount: number | null; + rows: number; + cols: number; + /** Travel range from Launcher's board definition, when it declares one. */ + travel: { min?: number; max?: number; deadzone?: number } | null; +} + export interface KeyboardStatus { /** HB68 Windows/Mac mode, verified through both mode queries. */ kochi?: { systemMode: import("../kochi/index.js").KochiSystemMode }; @@ -218,6 +236,8 @@ export interface KeyboardStatus { razer?: RazerKeyboardState | null; /** Logitech HID++ keyboard state. */ logitech?: LogitechKeyboardState | null; + /** Keychron Hall-effect board state (command version, units, profile layout). */ + keychron?: KeychronState | null; /** SteelSeries Apex Pro on-board analog profile (persisted snapshot). */ steelseries?: { productId: number; profile: SteelSeriesApexProfile | null; verified: boolean } | null; } diff --git a/src/drivers/keychron/hid.test.ts b/src/drivers/keychron/hid.test.ts new file mode 100644 index 0000000..6731f66 --- /dev/null +++ b/src/drivers/keychron/hid.test.ts @@ -0,0 +1,140 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { KEYCHRON_HE_COMMAND, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_SUBCOMMAND as SUB } from "../../keychron/index.ts"; +import { KeychronHidClient } from "./hid.ts"; + +const ID = Number(Object.keys(KEYCHRON_HE_PRODUCTS)[0]); +const { rows, cols } = KEYCHRON_HE_PRODUCTS[ID]!; + +const SIZE = 4 * (rows * cols + 1) + 19 * 20 + 3 * 20 + 32; + +/** A v4 board with three profiles; the active one is slot 1. */ +class FakeBoard { + vendorId = 0x3434; + productId = ID; + productName = "Keychron"; + opened = false; + collections = [{ usagePage: 0xff60, usage: 0x61, inputReports: [], outputReports: [], featureReports: [], children: [] }]; + listeners = new Set<(event: HIDInputReportEvent) => void>(); + sent: Uint8Array[] = []; + silent = false; + nak = false; + buffer = new Uint8Array(SIZE); + version = 4; + get hid(): HIDDevice { return this as unknown as HIDDevice; } + async open() { this.opened = true; } + async close() { this.opened = false; } + addEventListener(_t: string, l: (e: HIDInputReportEvent) => void) { this.listeners.add(l); } + removeEventListener(_t: string, l: (e: HIDInputReportEvent) => void) { this.listeners.delete(l); } + emit(frame: Uint8Array, reportId = 0) { + const event = { device: this.hid, reportId, data: new DataView(frame.buffer, frame.byteOffset, frame.length) } as HIDInputReportEvent; + this.listeners.forEach((l) => l(event)); + } + async sendReport(reportId: number, data: BufferSource) { + assert.equal(reportId, 0); + const request = data as Uint8Array; + assert.equal(request.length, 32); + assert.equal(request[0], KEYCHRON_HE_COMMAND); + this.sent.push(request.slice()); + if (this.silent) return; + const reply = new Uint8Array(32); + reply.set(request.slice(0, 2)); + switch (request[1]) { + case SUB.getVersion: reply.set([this.version, 0, 0b100001], 2); break; + case SUB.getProfilesInfo: reply.set([1, 3, SIZE & 0xff, SIZE >> 8, 20, 20], 2); break; + case SUB.getProfileBuffer: { + reply.set(request.slice(2, 6), 2); + const offset = request[3]! | (request[4]! << 8); + const length = request[5]!; + // The name window sits in the last 32 bytes: "P" + slot digit. + const nameStart = SIZE - 32; + const name = new Uint8Array(32); + name.set([0, 0x50, 0, 0x30 + request[2]!]); + for (let i = 0; i < length; i++) { + const at = offset + i; + reply[6 + i] = at >= nameStart ? name[at - nameStart]! : this.buffer[at]!; + } + break; + } + case SUB.setTravel: case SUB.saveProfileBuffer: reply[2] = this.nak ? 1 : 0; break; + case SUB.getRealtimeTravel: reply.set([request[2]!, request[3]!, 33], 3); break; + default: break; + } + this.emit(new Uint8Array(32).fill(0x7f), 1); // wrong report id never completes a transaction + this.emit(reply); + } +} + +const client = (board: FakeBoard) => new KeychronHidClient(board.hid); + +test("isSupported needs a catalogued HE product and the raw-HID collection", () => { + assert.equal(KeychronHidClient.isSupported(new FakeBoard().hid), true); + const other = new FakeBoard(); other.productId = 0x0001; + assert.equal(KeychronHidClient.isSupported(other.hid), false); + const vendor = new FakeBoard(); vendor.vendorId = 0x1234; + assert.equal(KeychronHidClient.isSupported(vendor.hid), false); + const page = new FakeBoard(); page.collections = [{ ...page.collections[0]!, usage: 1 }]; + assert.equal(KeychronHidClient.isSupported(page.hid), false); +}); + +test("readStatus reports version, units and profile names", async () => { + const board = new FakeBoard(); + const status = await client(board).readStatus(); + assert.equal(status.brand, "Keychron"); + assert.equal(status.activeProfile, 1); + assert.equal(status.profileCount, 3); + assert.deepEqual(status.profileNames, ["P0", "P1", "P2"]); + assert.equal(status.keychron?.heVersion, 4); + assert.equal(status.keychron?.unit, 0.1); + assert.equal(status.keychron?.features.switchAxis, true); + assert.equal(status.keychron?.features.supportMechanical, true); +}); + +test("readProfile walks the buffer in 26-byte reads and decodes keys", async () => { + const board = new FakeBoard(); + const word = (12 << 2) | (3 << 8); + board.buffer.set([word & 0xff, (word >> 8) & 0xff, 0, 0], 4 * (cols + 1)); // key (1,0) + const profile = await client(board).readProfile(); + assert.equal(profile.keys[1]![0]!.distance, 12); + assert.equal(profile.keys[1]![0]!.advancePress, 3); + const reads = board.sent.filter((frame) => frame[1] === SUB.getProfileBuffer); + assert.ok(reads.length >= Math.ceil(SIZE / 26)); + assert.ok(reads.every((frame) => frame[2] === 1 && frame[5]! <= 26)); + await assert.rejects(() => client(board).readProfile(9), RangeError); +}); + +test("setTravel targets the active profile and requires an acknowledgement", async () => { + const board = new FakeBoard(); + const keyboard = client(board); + await keyboard.setTravel({ workMode: 1, press: 20, sensitivePress: 4, keyMode: 1 }); + const write = board.sent.find((frame) => frame[1] === SUB.setTravel)!; + assert.deepEqual([...write.slice(2, 8)], [1, 1, 20, 4, 4, 1]); + await keyboard.saveProfile(); + assert.equal(board.sent.at(-1)![1], SUB.saveProfileBuffer); + board.nak = true; + await assert.rejects(() => keyboard.saveProfile(), /did not save/); +}); + +test("live travel matches the echoed key", async () => { + const board = new FakeBoard(); + assert.equal(await client(board).readKeyTravel(2, 5), 33); +}); + +test("a silent board faults the session so a late reply cannot confirm a later command", async () => { + const board = new FakeBoard(); + board.silent = true; + const keyboard = client(board); + await assert.rejects(() => keyboard.readStatus(), /did not answer/); + board.silent = false; + await assert.rejects(() => keyboard.readStatus(), /Reconnect/); +}); + +test("close releases the device and rejects further use", async () => { + const board = new FakeBoard(); + const keyboard = client(board); + await keyboard.readStatus(); + await keyboard.close(); + assert.equal(board.opened, false); + assert.equal(board.listeners.size, 0); + await assert.rejects(() => keyboard.open(), /Reconnect/); +}); diff --git a/src/drivers/keychron/hid.ts b/src/drivers/keychron/hid.ts new file mode 100644 index 0000000..4149b5f --- /dev/null +++ b/src/drivers/keychron/hid.ts @@ -0,0 +1,301 @@ +import type { KeyboardStatus } from "../keyboard-types.ts"; +import { + KEYCHRON_CONFIG_USAGE, KEYCHRON_CONFIG_USAGE_PAGE, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_SUBCOMMAND, + KEYCHRON_REPORT_ID, KEYCHRON_VENDOR_ID, decodeKeychronAxisType, decodeKeychronCalibrationState, + decodeKeychronCurve, decodeKeychronHeVersion, decodeKeychronProfileBuffer, decodeKeychronProfileName, + decodeKeychronProfilesInfo, decodeKeychronRealtimeTravel, isKeychronHeReply, isKeychronHeVersion, + joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, keychronNameWindow, + keychronProfileChunk, keychronProfileReadPlan, + type KeychronAxisType, type KeychronCalibrationState, type KeychronCurve, type KeychronHeSubcommand, + type KeychronHeVersion, type KeychronHeVersionInfo, type KeychronProfileBuffer, type KeychronProfilesInfo, + type KeychronTravelSetting, +} from "@openmouse/keyboard-protocol/keychron"; + +const REPLY_TIMEOUT_MS = 1500; + +/** + * Keychron Hall-effect keyboards over the VIA raw-HID collection (0xFF60:0x61). + * Only boards in the HE catalog are claimed, so a non-HE Keychron keyboard + * sharing the vendor id is never offered this driver. + */ +export class KeychronHidClient { + readonly device: HIDDevice; + private queue: Promise = Promise.resolve(); + private listening = false; + private faulted = false; + private heVersion: KeychronHeVersionInfo | null = null; + private info: KeychronProfilesInfo | null = null; + private pending: { + accepts: (frame: Uint8Array) => boolean; + resolve: (frame: Uint8Array) => void; + reject: (error: Error) => void; + } | null = null; + + constructor(device: HIDDevice) { this.device = device; } + + /** A catalogued HE board that exposes the raw-HID command collection. */ + static isSupported(device: HIDDevice): boolean { + return device.vendorId === KEYCHRON_VENDOR_ID && device.productId in KEYCHRON_HE_PRODUCTS + && KeychronHidClient.configCollection(device.collections) !== null; + } + + private static configCollection(collections: readonly HIDCollectionInfo[]): HIDCollectionInfo | null { + for (const collection of collections) { + if (collection.usagePage === KEYCHRON_CONFIG_USAGE_PAGE && collection.usage === KEYCHRON_CONFIG_USAGE) { + return collection; + } + const nested = KeychronHidClient.configCollection(collection.children); + if (nested) return nested; + } + return null; + } + + async open(): Promise { + if (!KeychronHidClient.isSupported(this.device)) throw new Error("Not a Keychron Hall-effect configuration interface."); + if (this.faulted) throw new Error("Reconnect the keyboard after a failed transaction."); + if (!this.device.opened) await this.device.open(); + // close() can land while device.open() is pending; recheck before listening. + if (this.faulted) { + if (this.device.opened) await this.device.close(); + throw new Error("Reconnect the keyboard after a failed transaction."); + } + if (!this.listening) { + this.device.addEventListener("inputreport", this.onReport); + this.listening = true; + } + } + + async close(): Promise { + this.faulted = true; + this.pending?.reject(new Error("Keychron keyboard disconnected.")); + if (this.listening) this.device.removeEventListener("inputreport", this.onReport); + this.listening = false; + if (this.device.opened) await this.device.close(); + } + + private readonly onReport = (event: HIDInputReportEvent): void => { + if (event.device !== this.device || event.reportId !== KEYCHRON_REPORT_ID || !this.pending) return; + const frame = new Uint8Array(event.data.buffer, event.data.byteOffset, event.data.byteLength); + if (this.pending.accepts(frame)) this.pending.resolve(frame.slice()); + }; + + private serialized(operation: () => Promise): Promise { + const next = this.queue.then(operation); + this.queue = next.catch(() => undefined); + return next; + } + + /** Send one report and wait for the reply `accepts` recognises. */ + private async exchange( + request: Uint8Array, accepts: (frame: Uint8Array) => boolean, + ): Promise { + await this.open(); + let timer: ReturnType | undefined; + const reply = new Promise((resolve, reject) => { + this.pending = { accepts, resolve, reject }; + timer = setTimeout(() => reject(new Error(`Keychron keyboard did not answer command 0x${request[1]!.toString(16)}.`)), REPLY_TIMEOUT_MS); + }); + try { + const [frame] = await Promise.all([reply, this.device.sendReport(KEYCHRON_REPORT_ID, request)]); + return frame; + } catch (error) { + // Replies carry no transaction id, so a delayed one could confirm a later + // command. Do not reuse the session after a timeout or a failed send. + this.faulted = true; + throw error; + } finally { + clearTimeout(timer); + this.pending = null; + } + } + + private call(request: Uint8Array, subcommand: KeychronHeSubcommand): Promise { + return this.exchange(request, (frame) => isKeychronHeReply(frame, subcommand)); + } + + private async version(): Promise { + if (!this.heVersion) { + const reply = decodeKeychronHeVersion(await this.call(keychronHeFrames.version(), KEYCHRON_HE_SUBCOMMAND.getVersion)); + if (!reply || !isKeychronHeVersion(reply.version)) { + throw new Error("The keyboard reported an unsupported Hall-effect command version."); + } + this.heVersion = reply; + } + return this.heVersion.version as KeychronHeVersion; + } + + private async profilesInfo(refresh = false): Promise { + if (!this.info || refresh) { + const version = await this.version(); + const info = decodeKeychronProfilesInfo( + await this.call(keychronHeFrames.profilesInfo(), KEYCHRON_HE_SUBCOMMAND.getProfilesInfo), version, + ); + if (!info) throw new Error("The keyboard did not report its profile layout."); + this.info = info; + } + return this.info; + } + + private async readRange(slot: number, offset: number, length: number): Promise { + const reply = await this.exchange( + keychronHeFrames.readProfile(slot, offset, length), + (frame) => isKeychronHeReply(frame, KEYCHRON_HE_SUBCOMMAND.getProfileBuffer) + && frame[3] === (offset & 0xff) && frame[4] === (offset >> 8) && frame[5] === length, + ); + return keychronProfileChunk(reply)!.slice(0, length); + } + + private async readName(slot: number, version: KeychronHeVersion, size: number): Promise { + const { offset, length } = keychronNameWindow(version, size); + const reply = await this.exchange( + keychronHeFrames.readProfile(slot, offset, length), + (frame) => isKeychronHeReply(frame, KEYCHRON_HE_SUBCOMMAND.getProfileBuffer) + && frame[2] === slot && frame[3] === (offset & 0xff) && frame[4] === (offset >> 8) && frame[5] === length, + ); + return decodeKeychronProfileName(reply); + } + + private async readBuffer(slot: number, size: number): Promise { + const chunks: Uint8Array[] = []; + for (const { offset, length } of keychronProfileReadPlan(size)) chunks.push(await this.readRange(slot, offset, length)); + return joinKeychronProfile(chunks, size); + } + + private matrix() { + const product = KEYCHRON_HE_PRODUCTS[this.device.productId]; + if (!product) throw new Error("Unknown Keychron Hall-effect product."); + return product; + } + + /** Decode one onboard profile: actuation, rapid trigger, DKS and snap-tap slots. */ + readProfile(slot?: number): Promise { + return this.serialized(async () => { + const version = await this.version(); + const info = await this.profilesInfo(true); + const target = slot ?? info.current; + if (!Number.isInteger(target) || target < 0 || target >= info.total) throw new RangeError("Profile slot out of range."); + const product = this.matrix(); + return decodeKeychronProfileBuffer(version, await this.readBuffer(target, info.size), product.rows, product.cols); + }); + } + + readAxisType(): Promise { + return this.serialized(async () => { + const info = await this.profilesInfo(); + const axis = decodeKeychronAxisType(await this.call(keychronHeFrames.getAxisType(), KEYCHRON_HE_SUBCOMMAND.getAxisType), info.unit); + if (!axis) throw new Error("The keyboard did not report its switch axis type."); + return axis; + }); + } + + /** Switch the board's active profile slot. */ + selectProfile(slot: number): Promise { + return this.serialized(async () => { + const info = await this.profilesInfo(); + if (!Number.isInteger(slot) || slot < 0 || slot >= info.total) throw new RangeError("Profile slot out of range."); + await this.call(keychronHeFrames.selectProfile(slot), KEYCHRON_HE_SUBCOMMAND.selectProfile); + this.info = { ...info, current: slot }; + }); + } + + /** + * Write actuation / rapid-trigger values into the active profile's working + * buffer. Call `saveProfile()` afterwards to persist them, as Launcher does. + * Values are in the profile's `unit` steps (`readStatus().keychron.unit`). + */ + setTravel(setting: KeychronTravelSetting): Promise { + return this.serialized(async () => { + const version = await this.version(); + const info = await this.profilesInfo(); + const reply = await this.call(keychronHeFrames.setTravel(version, info.current, setting), KEYCHRON_HE_SUBCOMMAND.setTravel); + if (!keychronHeAcknowledged(reply, KEYCHRON_HE_SUBCOMMAND.setTravel)) throw new Error("The keyboard rejected the travel setting."); + }); + } + + saveProfile(): Promise { + return this.serialized(async () => { + const info = await this.profilesInfo(); + const reply = await this.call(keychronHeFrames.saveProfile(info.current), KEYCHRON_HE_SUBCOMMAND.saveProfileBuffer); + if (!keychronHeAcknowledged(reply, KEYCHRON_HE_SUBCOMMAND.saveProfileBuffer)) throw new Error("The keyboard did not save the profile."); + }); + } + + clearProfile(): Promise { + return this.serialized(async () => { + const info = await this.profilesInfo(); + await this.call(keychronHeFrames.clearProfile(info.current), KEYCHRON_HE_SUBCOMMAND.clearProfileBuffer); + }); + } + + readCurve(): Promise { + return this.serialized(async () => { + const curve = decodeKeychronCurve(await this.call(keychronHeFrames.getCurve(), KEYCHRON_HE_SUBCOMMAND.getCurve)); + if (!curve) throw new Error("The keyboard did not report its response curve."); + return curve; + }); + } + + writeCurve(curve: KeychronCurve): Promise { + return this.serialized(async () => { + await this.call(keychronHeFrames.setCurve(curve), KEYCHRON_HE_SUBCOMMAND.setCurve); + }); + } + + /** Live travel of one key, in the profile's `unit` steps. */ + readKeyTravel(row: number, col: number): Promise { + return this.serialized(async () => { + const version = await this.version(); + const reply = await this.exchange( + keychronHeFrames.realtimeTravel(row, col), + (frame) => decodeKeychronRealtimeTravel(frame, version, row, col) !== null, + ); + return decodeKeychronRealtimeTravel(reply, version, row, col)!; + }); + } + + startCalibration(): Promise { + return this.serialized(async () => { + await this.call(keychronHeFrames.calibrate(), KEYCHRON_HE_SUBCOMMAND.calibrate); + }); + } + + /** Stop calibration. The board sends no reply to this command. */ + stopCalibration(): Promise { + return this.serialized(async () => { + await this.open(); + await this.device.sendReport(KEYCHRON_REPORT_ID, keychronHeFrames.stopCalibration()); + }); + } + + readCalibration(): Promise { + return this.serialized(async () => { + const state = decodeKeychronCalibrationState( + await this.call(keychronHeFrames.calibrationState(), KEYCHRON_HE_SUBCOMMAND.getCalibrateState), + ); + if (!state) throw new Error("The keyboard did not report its calibration state."); + return state; + }); + } + + readStatus(): Promise { + return this.serialized(async () => { + const product = this.matrix(); + const version = await this.version(); + const info = await this.profilesInfo(true); + const names: (string | null)[] = []; + for (let slot = 0; slot < info.total; slot++) names.push(await this.readName(slot, version, info.size)); + const versionInfo = this.heVersion!; + return { + brand: "Keychron", name: product.name, connectionType: "Unknown", connectionDetail: "Raw HID", + firmware: [`Hall-effect command v${version}`], firmwareVersion: null, layout: null, serial: null, + activeProfile: info.current, profileCount: info.total, profileNames: names, + ui: { family: "keychron", defaultDisplayName: product.name, settingsReady: false }, + keychron: { + productId: this.device.productId, heVersion: version, features: versionInfo.features, + unit: info.unit, profileSize: info.size, dksCount: info.dksCount, snapTapCount: info.snapTapCount, + rows: product.rows, cols: product.cols, travel: product.travel ?? null, + }, + }; + }); + } +} diff --git a/src/drivers/registry.test.ts b/src/drivers/registry.test.ts index 4c7d5a1..6de197d 100644 --- a/src/drivers/registry.test.ts +++ b/src/drivers/registry.test.ts @@ -6,9 +6,11 @@ import { WuqueHidClient } from "./wuque/hid.ts"; import { RazerKeyboardHidClient } from "./razer/hid.ts"; import { LogitechKeyboardHidClient } from "./logitech/hid.ts"; import { SteelSeriesKeyboardHidClient } from "./steelseries/hid.ts"; +import { KeychronHidClient } from "./keychron/hid.ts"; import { DEVICE_DRIVERS, clientSupportScore, createSupportedClient, deviceBrand } from "./registry.ts"; import { SUPPORTED_HID_FILTERS, + KEYCHRON_HID_FILTERS, KOCHI_HID_FILTERS, LOGITECH_HID_FILTERS, RAZER_HID_FILTERS, @@ -29,6 +31,7 @@ import { import { RAZER_KEYBOARD_PRODUCT_IDS, RAZER_VENDOR_ID } from "@openmouse/keyboard-protocol/razer"; import { LOGITECH_KEYBOARD_PRODUCT_IDS, LOGITECH_RECEIVER_PRODUCT_IDS, LOGITECH_VENDOR_ID } from "@openmouse/keyboard-protocol/logitech"; import { STEELSERIES_KEYBOARD_PRODUCT_IDS, STEELSERIES_VENDOR_ID } from "@openmouse/keyboard-protocol/steelseries"; +import { KEYCHRON_CONFIG_USAGE, KEYCHRON_CONFIG_USAGE_PAGE, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_VENDOR_ID } from "@openmouse/keyboard-protocol/keychron"; /** A vendor collection carrying only the fields `isSupported` reads. */ function collection(usagePage: number, usage: number, children: HIDCollectionInfo[] = []): HIDCollectionInfo { @@ -55,6 +58,13 @@ const WOOTING_DEVICE = (): HIDDevice => fakeDevice({ vendorId: WOOTING_VENDOR_ID const WUQUE_DEVICE = (): HIDDevice => fakeDevice({ vendorId: WUQUE_VENDOR_ID, productId: 0x1b10, collections: [collection(WUQUE_CONFIG_USAGE_PAGE, 1)] }); +const KEYCHRON_DEVICE = (overrides: FakeDeviceOptions = {}): HIDDevice => fakeDevice({ + vendorId: KEYCHRON_VENDOR_ID, + productId: KEYCHRON_HE_PRODUCT_IDS[0]!, + collections: [collection(KEYCHRON_CONFIG_USAGE_PAGE, KEYCHRON_CONFIG_USAGE)], + ...overrides, +}); + const RAZER_DEVICE = (): HIDDevice => fakeDevice({ vendorId: RAZER_VENDOR_ID, productId: 0x02a6, collections: [collection(0x0001, 0x0002)] }); @@ -70,7 +80,7 @@ const LOGITECH_RECEIVER_DEVICE = (): HIDDevice => test("DEVICE_DRIVERS lists one branded entry per supported protocol", () => { assert.deepEqual( DEVICE_DRIVERS.map((driver) => driver.brand), - ["Kochi", "Wooting", "Wuque Studio", "Razer", "Logitech", "SteelSeries"], + ["Kochi", "Wooting", "Wuque Studio", "Razer", "Logitech", "SteelSeries", "Keychron"], ); }); @@ -81,6 +91,15 @@ test("createSupportedClient returns the matching driver client", () => { assert.ok(createSupportedClient(LOGITECH_DEVICE()) instanceof LogitechKeyboardHidClient); assert.ok(createSupportedClient(LOGITECH_RECEIVER_DEVICE()) instanceof LogitechKeyboardHidClient); assert.ok(createSupportedClient(STEELSERIES_DEVICE()) instanceof SteelSeriesKeyboardHidClient); + assert.ok(createSupportedClient(KEYCHRON_DEVICE()) instanceof KeychronHidClient); +}); + +test("Keychron claims only catalogued HE boards on the raw-HID collection", () => { + assert.equal(deviceBrand(createSupportedClient(KEYCHRON_DEVICE())!), "Keychron"); + assert.equal(createSupportedClient(KEYCHRON_DEVICE({ productId: 0x0001 })), null); + assert.equal(createSupportedClient(KEYCHRON_DEVICE({ collections: [collection(0xff60, 0x62)] })), null); + assert.equal(KEYCHRON_HID_FILTERS.length, KEYCHRON_HE_PRODUCT_IDS.length); + assert.ok(KEYCHRON_HID_FILTERS.every((filter) => filter.vendorId === VENDOR_ID.keychron)); }); test("createSupportedClient returns null for a device no driver claims", () => { @@ -182,6 +201,7 @@ test("SUPPORTED_HID_FILTERS concatenates the vendor filter sets with no duplicat ...RAZER_HID_FILTERS, ...LOGITECH_HID_FILTERS, ...STEELSERIES_HID_FILTERS, + ...KEYCHRON_HID_FILTERS, ]); const seen = new Set(SUPPORTED_HID_FILTERS.map((f) => `${f.vendorId}:${f.productId}:${f.usagePage}:${f.usage}`)); assert.equal(seen.size, SUPPORTED_HID_FILTERS.length); diff --git a/src/drivers/registry.ts b/src/drivers/registry.ts index 0b068ef..d8af015 100644 --- a/src/drivers/registry.ts +++ b/src/drivers/registry.ts @@ -4,6 +4,7 @@ import { KochiHidClient } from "./kochi/hid.ts"; import { RazerKeyboardHidClient } from "./razer/hid.ts"; import { LogitechKeyboardHidClient } from "./logitech/hid.ts"; import { SteelSeriesKeyboardHidClient } from "./steelseries/hid.ts"; +import { KeychronHidClient } from "./keychron/hid.ts"; export type SupportedClient = | WootingHidClient @@ -11,7 +12,8 @@ export type SupportedClient = | KochiHidClient | RazerKeyboardHidClient | LogitechKeyboardHidClient - | SteelSeriesKeyboardHidClient; + | SteelSeriesKeyboardHidClient + | KeychronHidClient; export interface DeviceDriver { brand: string; @@ -27,6 +29,7 @@ export const DEVICE_DRIVERS: readonly DeviceDriver[] = [ { brand: "Razer", supports: (device) => RazerKeyboardHidClient.isSupported(device), create: (device) => new RazerKeyboardHidClient(device), score: () => 6 }, { brand: "Logitech", supports: (device) => LogitechKeyboardHidClient.isSupported(device), create: (device) => new LogitechKeyboardHidClient(device), score: () => 6 }, { brand: "SteelSeries", supports: (device) => SteelSeriesKeyboardHidClient.isSupported(device), create: (device) => new SteelSeriesKeyboardHidClient(device), score: () => 6 }, + { brand: "Keychron", supports: (device) => KeychronHidClient.isSupported(device), create: (device) => new KeychronHidClient(device), score: () => 6 }, ]; function driverFor(device: HIDDevice): DeviceDriver | undefined { diff --git a/src/drivers/vendors.ts b/src/drivers/vendors.ts index 19895ad..64df33e 100644 --- a/src/drivers/vendors.ts +++ b/src/drivers/vendors.ts @@ -24,6 +24,12 @@ import { LOGITECH_RECEIVER_PRODUCT_IDS, LOGITECH_VENDOR_ID, } from "@openmouse/keyboard-protocol/logitech"; +import { + KEYCHRON_CONFIG_USAGE, + KEYCHRON_CONFIG_USAGE_PAGE, + KEYCHRON_HE_PRODUCT_IDS, + KEYCHRON_VENDOR_ID, +} from "@openmouse/keyboard-protocol/keychron"; import { STEELSERIES_CONFIG_USAGE, STEELSERIES_CONFIG_USAGE_PAGE, @@ -39,6 +45,7 @@ export const VENDOR_ID = { razer: RAZER_VENDOR_ID, logitech: LOGITECH_VENDOR_ID, steelseries: STEELSERIES_VENDOR_ID, + keychron: KEYCHRON_VENDOR_ID, } as const; // Match the two command-capable collections rather than enumerating every @@ -105,6 +112,18 @@ export const STEELSERIES_HID_FILTERS: HIDDeviceFilter[] = STEELSERIES_KEYBOARD_P usage: STEELSERIES_CONFIG_USAGE, })); +/** + * Keychron Hall-effect boards expose the HE command group on the VIA raw-HID + * collection (0xFF60:0x61). Each catalogued HE product id is filtered + * explicitly so a non-HE Keychron keyboard never reaches the picker. + */ +export const KEYCHRON_HID_FILTERS: HIDDeviceFilter[] = KEYCHRON_HE_PRODUCT_IDS.map((productId) => ({ + vendorId: KEYCHRON_VENDOR_ID, + productId, + usagePage: KEYCHRON_CONFIG_USAGE_PAGE, + usage: KEYCHRON_CONFIG_USAGE, +})); + export const SUPPORTED_HID_FILTERS: HIDDeviceFilter[] = [ ...KOCHI_HID_FILTERS, ...WOOTING_HID_FILTERS, @@ -112,4 +131,5 @@ export const SUPPORTED_HID_FILTERS: HIDDeviceFilter[] = [ ...RAZER_HID_FILTERS, ...LOGITECH_HID_FILTERS, ...STEELSERIES_HID_FILTERS, + ...KEYCHRON_HID_FILTERS, ]; diff --git a/src/index.ts b/src/index.ts index 8db5532..401e151 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,3 +3,4 @@ export * as kochi from "./kochi/index.js"; export * as razer from "./razer/index.js"; export * as logitech from "./logitech/index.js"; export * as steelseries from "./steelseries/index.js"; +export * as keychron from "./keychron/index.js"; diff --git a/src/keychron/index.ts b/src/keychron/index.ts new file mode 100644 index 0000000..59f6ad9 --- /dev/null +++ b/src/keychron/index.ts @@ -0,0 +1,490 @@ +/** + * Keychron Hall-effect keyboard protocol (the `KC_HE` command group, 0xA9) — + * transport-independent codec. + * + * Decoded from the public Keychron Launcher web app (launcher.keychron.com, + * `main.d60cabdb24f8f1c7.js`, the five `getCommandVersion()` classes that + * return 1-5) and its per-board definitions. See docs/keychron-support.md for + * the evidence, what is and is not hardware-verified, and the product catalog. + * + * Every command is one 32-byte report on the VIA raw-HID collection (usage page + * 0xFF60, usage 0x61, report id 0): + * + * [0xA9, subcommand, ...arguments, zero padding] + * + * and the board answers with a report that echoes `[0xA9, subcommand]`. The + * board reports its HE command version (1-5) for `AMC_GET_VERSION`; the + * version selects the key-slot layout and the width of the travel fields: + * + * v1-v4 one byte per travel value, in 0.1 mm steps + * v5 16-bit little-endian travel values, in a step the board reports + * (0.1, 0.01 or 0.001 mm) in its profile-info reply + * + * Nothing here has been run against a physical Keychron board. Frames mirror + * what Launcher sends; the unit tests pin the byte layout, not firmware + * behaviour. + */ + +export const KEYCHRON_VENDOR_ID = 0x3434; +export const KEYCHRON_CONFIG_USAGE_PAGE = 0xff60; +export const KEYCHRON_CONFIG_USAGE = 0x61; +export const KEYCHRON_REPORT_ID = 0; +export const KEYCHRON_REPORT_SIZE = 32; +/** `KC_HE` in Launcher's command enum. */ +export const KEYCHRON_HE_COMMAND = 0xa9; + +export const KEYCHRON_HE_SUBCOMMAND = { + getVersion: 0x01, + getProfilesInfo: 0x10, + selectProfile: 0x11, + getProfileBuffer: 0x12, + setProfileName: 0x13, + setTravel: 0x14, + setAdvanceMode: 0x15, + setActOnAxis: 0x16, + resetSingleKey: 0x1d, + clearProfileBuffer: 0x1e, + saveProfileBuffer: 0x1f, + getCurve: 0x20, + setCurve: 0x21, + getJoyKeyboard: 0x22, + setJoyKeyboard: 0x23, + getRealtimeTravel: 0x30, + calibrate: 0x40, + getCalibrateState: 0x41, + getCalibratedValue: 0x42, + getAxisType: 0x50, + setAxisType: 0x51, +} as const; +export type KeychronHeSubcommand = (typeof KEYCHRON_HE_SUBCOMMAND)[keyof typeof KEYCHRON_HE_SUBCOMMAND]; + +/** `AMC_CALIBRATE` argument: start the calibration sweep / stop it. */ +export const KEYCHRON_CALIBRATE = { start: 2, stop: 4 } as const; + +export type KeychronHeVersion = 1 | 2 | 3 | 4 | 5; + +/** Capability bits of the `AMC_GET_VERSION` reply (byte 4, bit 0 first). */ +export interface KeychronHeFeatures { + switchAxis: boolean; + resetSingleKey: boolean; + dkr: boolean; + turbo: boolean; + gamepadDisable: boolean; + supportMechanical: boolean; +} + +export interface KeychronHeVersionInfo { + version: number; + features: KeychronHeFeatures; +} + +export interface KeychronProfilesInfo { + /** Active profile slot. */ + current: number; + total: number; + /** Size in bytes of one profile buffer. */ + size: number; + /** v4+ only: DKS slots the board supports. */ + dksCount: number | null; + /** v4+ only: snap-tap slots the board supports. */ + snapTapCount: number | null; + /** Millimetres per travel step. */ + unit: number; +} + +/** What a key's four-byte (v1-4) / seven-byte (v5) slot says to do. */ +export const KEYCHRON_ADVANCE_MODE = { + none: 0, + dks: 3, + analog: 4, + toggle: 5, + dkr: 7, + turbo: 8, +} as const; + +export interface KeychronKeySlot { + /** Raw 2-bit actuation mode. */ + mode: number; + /** Actuation travel, in `unit` steps. */ + distance: number; + /** Rapid-trigger press sensitivity, in `unit` steps. */ + advancePress: number; + /** Rapid-trigger release sensitivity, in `unit` steps. */ + advanceRelease: number; + /** One of KEYCHRON_ADVANCE_MODE (or an unknown raw value). */ + advanceMode: number; + /** DKS / turbo slot index when `advanceMode` uses one. */ + index: number; +} + +export interface KeychronDksSlot { + index: number; + /** Four trigger travels, in `unit` steps. */ + travel: readonly number[]; + /** Four 16-bit keycodes. */ + keycodes: readonly number[]; + /** Four packed action nibbles per keycode: [press, bottom, release, top]. */ + actions: readonly (readonly number[])[]; +} + +export interface KeychronSnapTapSlot { + index: number; + keys: readonly [{ row: number; col: number }, { row: number; col: number }]; + type: number; +} + +export interface KeychronProfileBuffer { + global: KeychronKeySlot; + /** `keys[row][col]`. */ + keys: readonly (readonly KeychronKeySlot[])[]; + /** Occupied DKS slots (null entries are empty). v1+ layout differs by version. */ + dks: readonly (KeychronDksSlot | null)[]; + /** Occupied snap-tap slots; v4+ only. */ + snapTap: readonly KeychronSnapTapSlot[]; +} + +export interface KeychronTravelSetting { + /** Raw work-mode byte Launcher sends; 0 selects the per-key buffer. */ + workMode: number; + /** Actuation, in `unit` steps. */ + press?: number; + /** Rapid-trigger press sensitivity, in `unit` steps. */ + sensitivePress?: number; + /** Rapid-trigger release sensitivity; defaults to `sensitivePress`. */ + sensitiveRelease?: number; + /** 0 writes `buffer`; any other value is a global setting. */ + keyMode: number; + /** Per-key bytes (only sent when `keyMode` is 0). */ + buffer?: readonly number[]; +} + +export type KeychronCurve = readonly [ + readonly [number, number], readonly [number, number], + readonly [number, number], readonly [number, number], +]; + +export interface KeychronAxisType { + type: number; + /** Maximum travel in millimetres. */ + maxMm: number; +} + +export interface KeychronCalibrationState { + /** Per-key flags, 8 per byte, low bit first. */ + keys: readonly boolean[]; + state: number; +} + +const U8 = 0xff; + +function frame(subcommand: number, ...args: number[]): Uint8Array { + if (args.length > KEYCHRON_REPORT_SIZE - 2) throw new RangeError("Keychron HE command is too long."); + const out = new Uint8Array(KEYCHRON_REPORT_SIZE); + out[0] = KEYCHRON_HE_COMMAND; + out[1] = subcommand; + args.forEach((value, index) => { + if (!Number.isInteger(value) || value < 0 || value > U8) throw new RangeError("Keychron HE argument must be a byte."); + out[index + 2] = value; + }); + return out; +} + +function profile(slot: number): number { + if (!Number.isInteger(slot) || slot < 0 || slot > U8) throw new RangeError("Invalid Keychron profile slot."); + return slot; +} + +function putWord(out: Uint8Array, at: number, value: number): void { + if (!Number.isInteger(value) || value < 0 || value > 0xffff) throw new RangeError("Keychron HE word out of range."); + out[at] = value & U8; + out[at + 1] = value >> 8; +} + +export function isKeychronHeVersion(version: number): version is KeychronHeVersion { + return version >= 1 && version <= 5 && Number.isInteger(version); +} + +/** Key slot size in the profile buffer: 4 bytes up to v4, 7 from v5. */ +export const keychronKeySlotSize = (version: KeychronHeVersion): number => (version >= 5 ? 7 : 4); +/** DKS slot size: 19 bytes up to v4, 21 from v5. */ +export const keychronDksSlotSize = (version: KeychronHeVersion): number => (version >= 5 ? 21 : 19); +export const KEYCHRON_DKS_SLOTS = 20; +export const KEYCHRON_SNAP_TAP_SLOTS = 20; +const SNAP_TAP_SLOT_SIZE = 3; + +export const keychronHeFrames = { + version: () => frame(KEYCHRON_HE_SUBCOMMAND.getVersion), + profilesInfo: () => frame(KEYCHRON_HE_SUBCOMMAND.getProfilesInfo), + selectProfile: (slot: number) => frame(KEYCHRON_HE_SUBCOMMAND.selectProfile, profile(slot)), + /** + * Read a profile buffer from `offset`. A reply carries 26 payload bytes; the + * name read in v1-4 still sends 30 in the length byte, as Launcher does. + */ + readProfile(slot: number, offset: number, length: number) { + if (!Number.isInteger(offset) || offset < 0 || offset > 0xffff) throw new RangeError("Invalid profile offset."); + if (!Number.isInteger(length) || length < 1 || length > 30) throw new RangeError("Profile reads carry 1-30 bytes."); + return frame(KEYCHRON_HE_SUBCOMMAND.getProfileBuffer, profile(slot), offset & U8, offset >> 8, length); + }, + saveProfile: (slot: number) => frame(KEYCHRON_HE_SUBCOMMAND.saveProfileBuffer, profile(slot)), + clearProfile: (slot: number) => frame(KEYCHRON_HE_SUBCOMMAND.clearProfileBuffer, profile(slot)), + /** `chars` are the name's UTF-16 code units, big-endian, as the profile buffer stores them. */ + setProfileName(slot: number, chars: readonly number[], length: number) { + return frame(KEYCHRON_HE_SUBCOMMAND.setProfileName, profile(slot), length, ...chars); + }, + setTravel(version: KeychronHeVersion, slot: number, setting: KeychronTravelSetting): Uint8Array { + const out = frame(KEYCHRON_HE_SUBCOMMAND.setTravel, profile(slot), setting.workMode); + const press = setting.press ?? 0; + const sensitivePress = setting.sensitivePress ?? 0; + const sensitiveRelease = setting.sensitiveRelease ?? setting.sensitivePress ?? 0; + let next: number; + if (version >= 5) { + putWord(out, 4, press); + putWord(out, 6, sensitivePress); + putWord(out, 8, sensitiveRelease); + next = 10; + } else { + for (const [at, value] of [[4, press], [5, sensitivePress], [6, sensitiveRelease]] as const) { + if (!Number.isInteger(value) || value < 0 || value > U8) throw new RangeError("Keychron v1-4 travel is one byte."); + out[at] = value; + } + next = 7; + } + out[next] = setting.keyMode; + if (setting.keyMode === 0) { + const buffer = setting.buffer ?? []; + if (next + 1 + buffer.length > KEYCHRON_REPORT_SIZE) throw new RangeError("Per-key buffer does not fit one report."); + buffer.forEach((value, index) => { out[next + 1 + index] = value & U8; }); + } + return out; + }, + /** Turn one DKS/advanced-key slot off for the key at `row`,`col`. */ + removeAdvanceKey: (slot: number, row: number, col: number) => + frame(KEYCHRON_HE_SUBCOMMAND.setAdvanceMode, profile(slot), 0, row, col), + setAdvanceKey(version: KeychronHeVersion, slot: number, key: { + workMode?: number; row: number; col: number; position: number; + distance: readonly [number, number, number, number]; + keycodes: readonly number[]; actions: readonly number[]; + }) { + const out = frame(KEYCHRON_HE_SUBCOMMAND.setAdvanceMode, profile(slot), key.workMode || 1, key.row, key.col, key.position); + // Launcher sends the four travels in the order [0, 3, 1, 2]. + const order = [0, 3, 1, 2] as const; + let at = 7; + for (const index of order) { + const value = key.distance[index]; + if (version >= 5) { putWord(out, at, value); at += 2; } else { out[at++] = value & U8; } + } + key.keycodes.slice(0, 4).forEach((code, index) => putWord(out, at + 2 * index, code)); + at += 8; + key.actions.forEach((value, index) => { out[at + index] = value & U8; }); + return out; + }, + getCurve: () => frame(KEYCHRON_HE_SUBCOMMAND.getCurve), + setCurve(curve: KeychronCurve) { + return frame(KEYCHRON_HE_SUBCOMMAND.setCurve, ...curve.flat()); + }, + /** Live travel of the key at `row`,`col`. */ + realtimeTravel: (row: number, col: number) => frame(KEYCHRON_HE_SUBCOMMAND.getRealtimeTravel, row, col), + calibrate: () => frame(KEYCHRON_HE_SUBCOMMAND.calibrate, KEYCHRON_CALIBRATE.start), + stopCalibration: () => frame(KEYCHRON_HE_SUBCOMMAND.calibrate, KEYCHRON_CALIBRATE.stop), + calibrationState: () => frame(KEYCHRON_HE_SUBCOMMAND.getCalibrateState), + getAxisType: () => frame(KEYCHRON_HE_SUBCOMMAND.getAxisType), + setAxisType: (type: number) => frame(KEYCHRON_HE_SUBCOMMAND.setAxisType, type), + /** Snap-tap pair: `keys` are [col, row] pairs as Launcher sends them. */ + setSnapTap(slot: number, snap: { keys: readonly [readonly [number, number], readonly [number, number]]; index: number; wordMode: number }) { + return frame(KEYCHRON_HE_SUBCOMMAND.setActOnAxis, profile(slot), + snap.keys[0][0], snap.keys[0][1], snap.keys[1][0], snap.keys[1][1], snap.index, snap.wordMode); + }, + getJoyKeyboard: () => frame(KEYCHRON_HE_SUBCOMMAND.getJoyKeyboard), + /** Launcher packs three flags into one byte via its own bit order; pass the packed byte. */ + setJoyKeyboard: (packed: number) => frame(KEYCHRON_HE_SUBCOMMAND.setJoyKeyboard, packed), + resetSingleKey: (slot: number, row: number, col: number) => + frame(KEYCHRON_HE_SUBCOMMAND.resetSingleKey, profile(slot), row, col), +} as const; + +/** True when `report` is an answer to the given HE subcommand. */ +export function isKeychronHeReply(report: Uint8Array, subcommand: KeychronHeSubcommand): boolean { + return report.length >= 2 && report[0] === KEYCHRON_HE_COMMAND && report[1] === subcommand; +} + +export function decodeKeychronHeVersion(report: Uint8Array): KeychronHeVersionInfo | null { + if (!isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getVersion) || report.length < 5) return null; + const bits = report[4]!; + return { + version: report[2]!, + features: { + switchAxis: Boolean(bits & 1), + resetSingleKey: Boolean(bits & 2), + dkr: Boolean(bits & 4), + turbo: Boolean(bits & 8), + gamepadDisable: Boolean(bits & 16), + supportMechanical: Boolean(bits & 32), + }, + }; +} + +/** Millimetres per step for a v5 profile-info unit code (2 -> 0.01, 3 -> 0.001, else 0.1). */ +export const keychronUnit = (code: number | undefined): number => (code === 2 ? 0.01 : code === 3 ? 0.001 : 0.1); + +export function decodeKeychronProfilesInfo(report: Uint8Array, version: KeychronHeVersion): KeychronProfilesInfo | null { + if (!isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getProfilesInfo) || report.length < 6) return null; + return { + current: report[2]!, + total: report[3]!, + size: (report[5]! << 8) | report[4]!, + dksCount: version >= 4 ? report[6]! : null, + snapTapCount: version >= 4 ? report[7]! : null, + unit: version >= 5 ? keychronUnit(report[8]) : 0.1, + }; +} + +/** + * Where a profile's name lives and how much to read: the last bytes of the + * profile buffer. v1 starts 33 bytes from the end, later versions 32, and v5 + * reads 26 bytes where earlier versions read 30. + */ +export function keychronNameWindow(version: KeychronHeVersion, size: number): { offset: number; length: number } { + return { offset: size - (version === 1 ? 33 : 32), length: version >= 5 ? 26 : 30 }; +} + +/** Decode a profile name from a read reply: bytes 6.. are big-endian UTF-16 units, zero pairs skipped. */ +export function decodeKeychronProfileName(report: Uint8Array): string | null { + if (!isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getProfileBuffer)) return null; + let name = ""; + for (let i = 6; i + 1 < KEYCHRON_REPORT_SIZE && i + 1 < report.length; i += 2) { + if (report[i] === 0 && report[i + 1] === 0) continue; + name += String.fromCharCode((report[i]! << 8) | report[i + 1]!); + } + return name; +} + +/** Payload bytes of a profile-buffer read reply. */ +export function keychronProfileChunk(report: Uint8Array): Uint8Array | null { + return isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getProfileBuffer) ? report.slice(6, 32) : null; +} + +/** Reassemble a buffer from consecutive chunks, trimmed to `size`. */ +export function joinKeychronProfile(chunks: readonly Uint8Array[], size: number): Uint8Array { + const out = new Uint8Array(chunks.reduce((sum, chunk) => sum + chunk.length, 0)); + let at = 0; + for (const chunk of chunks) { out.set(chunk, at); at += chunk.length; } + return out.slice(0, size); +} + +/** Read plan for a whole profile: (offset, length) pairs of up to 26 bytes. */ +export function keychronProfileReadPlan(size: number): { offset: number; length: number }[] { + const plan: { offset: number; length: number }[] = []; + for (let offset = 0; offset < size; offset += 26) plan.push({ offset, length: Math.min(26, size - offset) }); + return plan; +} + +function bits(value: bigint, low: number, width: number): number { + return Number((value >> BigInt(low)) & ((1n << BigInt(width)) - 1n)); +} + +function littleEndian(bytes: Uint8Array, start: number, end: number): bigint { + let value = 0n; + for (let i = end - 1; i >= start; i--) value = (value << 8n) | BigInt(bytes[i]!); + return value; +} + +/** One key's slot. v1-4: 32 bits LE (mode 2, distance 6, press 6, release 6, advance 4, index 8). v5: 6 bytes LE of 14-bit fields, then the index byte. */ +export function decodeKeychronKeySlot(version: KeychronHeVersion, slot: Uint8Array): KeychronKeySlot { + if (version >= 5) { + const word = littleEndian(slot, 0, 6); + return { + mode: bits(word, 0, 2), distance: bits(word, 2, 14), advancePress: bits(word, 16, 14), + advanceRelease: bits(word, 30, 14), advanceMode: bits(word, 44, 4), index: slot[6]!, + }; + } + const word = littleEndian(slot, 0, 4); + return { + mode: bits(word, 0, 2), distance: bits(word, 2, 6), advancePress: bits(word, 8, 6), + advanceRelease: bits(word, 14, 6), advanceMode: bits(word, 20, 4), index: bits(word, 24, 8), + }; +} + +function decodeActions(a: number, b: number): number[] { + return [a & 0xf, b & 0xf, b >> 4, a >> 4]; +} + +function decodeDksSlot(version: KeychronHeVersion, bytes: Uint8Array, index: number): KeychronDksSlot | null { + const packed = version >= 5 ? 5 : 3; + const word = littleEndian(bytes, 0, packed); + if (word === 0n) return null; + const travel = version >= 5 + ? [bits(word, 0, 10), bits(word, 20, 10), bits(word, 30, 10), bits(word, 10, 10)] + : [bits(word, 0, 6), bits(word, 12, 6), bits(word, 18, 6), bits(word, 6, 6)]; + const keycodes = [0, 1, 2, 3].map((i) => bytes[packed + 2 * i]! | (bytes[packed + 2 * i + 1]! << 8)); + const actionStart = packed + 8; + const actions = [0, 1, 2, 3].map((i) => decodeActions(bytes[actionStart + 2 * i]!, bytes[actionStart + 2 * i + 1]!)); + return { index, travel, keycodes, actions }; +} + +/** Decode the whole profile buffer for a board with `rows` x `cols` keys. */ +export function decodeKeychronProfileBuffer( + version: KeychronHeVersion, buffer: Uint8Array, rows: number, cols: number, +): KeychronProfileBuffer { + const slot = keychronKeySlotSize(version); + const keyBytes = slot * (rows * cols + 1); + if (buffer.length < keyBytes) throw new RangeError("Profile buffer is shorter than its key matrix."); + const keys = Array.from({ length: rows }, (_, row) => Array.from({ length: cols }, (_, col) => { + const start = slot * (row * cols + col + 1); + return decodeKeychronKeySlot(version, buffer.subarray(start, start + slot)); + })); + const dksSize = keychronDksSlotSize(version); + const dks: (KeychronDksSlot | null)[] = []; + for (let i = 0; i < KEYCHRON_DKS_SLOTS; i++) { + const start = keyBytes + dksSize * i; + dks.push(start + dksSize <= buffer.length ? decodeDksSlot(version, buffer.subarray(start, start + dksSize), i) : null); + } + const snapTap: KeychronSnapTapSlot[] = []; + if (version >= 4) { + const snapStart = keyBytes + dksSize * KEYCHRON_DKS_SLOTS; + for (let i = 0; i < KEYCHRON_SNAP_TAP_SLOTS; i++) { + const start = snapStart + SNAP_TAP_SLOT_SIZE * i; + if (start + SNAP_TAP_SLOT_SIZE > buffer.length) break; + const [a, b, type] = [buffer[start]!, buffer[start + 1]!, buffer[start + 2]!]; + if (a === 0 && b === 0) continue; + snapTap.push({ index: i, type, keys: [{ col: a >> 3, row: a & 7 }, { col: b >> 3, row: b & 7 }] }); + } + } + return { + global: decodeKeychronKeySlot(version, buffer.subarray(0, slot)), + keys, dks, snapTap, + }; +} + +export function decodeKeychronRealtimeTravel( + report: Uint8Array, version: KeychronHeVersion, row: number, col: number, +): number | null { + if (!isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getRealtimeTravel)) return null; + // v1 and v2 answer with the bare distance in byte 2; v3 onward echo the key. + if (version >= 3 && (report[3] !== row || report[4] !== col)) return null; + if (version >= 5) return (report[6]! << 8) | report[5]!; + return version >= 3 ? report[5]! : report[2]!; +} + +export function decodeKeychronCurve(report: Uint8Array): KeychronCurve | null { + if (!isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getCurve) || report.length < 10) return null; + return [[report[2]!, report[3]!], [report[4]!, report[5]!], [report[6]!, report[7]!], [report[8]!, report[9]!]]; +} + +export function decodeKeychronAxisType(report: Uint8Array, unit: number): KeychronAxisType | null { + if (!isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getAxisType) || report.length < 5) return null; + return { type: report[2]!, maxMm: Number((((report[4]! << 8) + report[3]!) * unit).toFixed(2)) }; +} + +/** Calibration state: byte 3 is the state, bytes 4-21 are per-key flags. */ +export function decodeKeychronCalibrationState(report: Uint8Array): KeychronCalibrationState | null { + if (!isKeychronHeReply(report, KEYCHRON_HE_SUBCOMMAND.getCalibrateState) || report.length < 22) return null; + const keys: boolean[] = []; + for (const byte of report.slice(4, 22)) for (let bit = 0; bit < 8; bit++) keys.push(Boolean((byte >> bit) & 1)); + return { state: report[3]!, keys }; +} + +/** Write-style replies (`setTravel`, `saveProfile`, …) carry 0 in byte 2 on success. */ +export function keychronHeAcknowledged(report: Uint8Array, subcommand: KeychronHeSubcommand): boolean { + return isKeychronHeReply(report, subcommand) && report[2] === 0; +} + +export * from "./products.js"; diff --git a/src/keychron/products.ts b/src/keychron/products.ts new file mode 100644 index 0000000..13ab34a --- /dev/null +++ b/src/keychron/products.ts @@ -0,0 +1,189 @@ +/** + * Keychron Hall-effect (HE/TMR) keyboards that Keychron Launcher serves a + * definition for, keyed by USB product id under VID 0x3434. Generated from + * launcher.keychron.com `static/device/{vid*65536+pid}/json/v3.json` on + * 2026-10-30. `launcherFlag` is false for the few boards whose definition + * names them HE/TMR without declaring the HE feature. + * `travel` is the definition's `extra.he.distance` in millimetres. + */ +export interface KeychronHeProduct { + name: string; + rows: number; + cols: number; + travel?: { min?: number; max?: number; deadzone?: number }; + launcherFlag: boolean; +} + +export const KEYCHRON_HE_PRODUCTS: Readonly> = { + 0x0402: { name: "Keychron P1 HE DAYZ", rows: 6, cols: 15, launcherFlag: true }, + 0x0403: { name: "Keychron P1 HE DAYZ", rows: 6, cols: 15, launcherFlag: true }, + 0x040c: { name: "Keychron J3 HE ANSI", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0416: { name: "Keychron J2 HE 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x0417: { name: "Keychron J8 HE 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x0418: { name: "Keychron J8 HE 8K ISO", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x0419: { name: "Keychron J8 HE 8K JIS", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x041b: { name: "Keychron J14 HE ANSI", rows: 6, cols: 18, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x041c: { name: "Keychron J12 HE ANSI", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x041e: { name: "Keychron J5 HE ANSI KNOB", rows: 6, cols: 21, travel: { min: 0.1, max: 3.4, deadzone: 0.1 }, launcherFlag: true }, + 0x041f: { name: "Keychron J4 HE ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0429: { name: "Keychron J15 HE ANSI", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x042f: { name: "Keychron V1 HE ANSI Knob", rows: 6, cols: 15, travel: { min: 0.2, max: 3.35, deadzone: 0.2 }, launcherFlag: true }, + 0x043b: { name: "Keychron C3 Pro HE ANSI RGB", rows: 6, cols: 17, travel: { min: 0.1, max: 3.8 }, launcherFlag: true }, + 0x0441: { name: "Keychron V6 HE ANSI KNOB", rows: 6, cols: 21, travel: { min: 0.1, max: 3.4, deadzone: 0.1 }, launcherFlag: true }, + 0x0445: { name: "Keychron J5 TMR ANSI KNOB", rows: 6, cols: 21, travel: { min: 0.1, max: 3.4, deadzone: 0.1 }, launcherFlag: true }, + 0x0446: { name: "Keychron J5 HE 8K ISO", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x0449: { name: "Keychron J2 TMR", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x044a: { name: "Keychron C100 HE 8K ANSI", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x044b: { name: "Keychron J5 TMR ANSI KNOB", rows: 6, cols: 21, travel: { min: 0.1, max: 3.1, deadzone: 0.4 }, launcherFlag: true }, + 0x0450: { name: "Keychron T2 HE", rows: 3, cols: 8, launcherFlag: true }, + 0x0454: { name: "Keychron J2 TMR ANSI KNOB", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x045a: { name: "Keychron eX75 HE 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x045b: { name: "Keychron eX67 HE 8K ANSI", rows: 5, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x045c: { name: "Keychron eX99 HE 8K ANSI", rows: 6, cols: 18, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x045d: { name: "Keychron eX99 HE 8K ANSI", rows: 6, cols: 18, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x045e: { name: "Keychron J3 TMR ANSI", rows: 6, cols: 19, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x045f: { name: "Keychron J3 TMR ANSI Silent", rows: 6, cols: 19, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x0460: { name: "Keychron C75 TMR 8K JIS", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x0464: { name: "Keychron F4 HE 8K", rows: 2, cols: 2, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0471: { name: "Keychron Carbon 60 HE 8K", rows: 5, cols: 14, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x0472: { name: "Keychron Carbon 68 HE 8K", rows: 5, cols: 15, travel: { min: 0.1, max: 3.45 }, launcherFlag: true }, + 0x0476: { name: "Keychron F6 HE 8K", rows: 2, cols: 3, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x047b: { name: "Keychron C65 HE 8K ANSI", rows: 5, cols: 15, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x047c: { name: "Keychron C6 HE 8K ANSI", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x047d: { name: "Keychron Q17 HE Knob", rows: 2, cols: 5, launcherFlag: false }, + 0x047e: { name: "Keychron C75 HE ANSI WHITE", rows: 6, cols: 16, travel: { min: 0.1, max: 3.5, deadzone: 0 }, launcherFlag: true }, + 0x0480: { name: "Keychron EX75 HE Lite ANSE Red", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x0481: { name: "Keychron Carbon0 HE 8K", rows: 6, cols: 5, travel: { min: 0.2, max: 3.5 }, launcherFlag: true }, + 0x0484: { name: "Keychron C75 HE 1K ANSI WHITE", rows: 6, cols: 16, launcherFlag: true }, + 0x0485: { name: "Keychron EX75 HE Lite ANSE Red", rows: 6, cols: 16, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x0486: { name: "Keychron Z2-60 HE 8K", rows: 5, cols: 14, travel: { min: 0.1, max: 3.55 }, launcherFlag: true }, + 0x048a: { name: "Keychron J8 HE 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x048e: { name: "Keychron K18 HE ANSI Knob", rows: 6, cols: 15, travel: { min: 0.2, max: 3.35, deadzone: 0.2 }, launcherFlag: true }, + 0x048f: { name: "Keychron Q17 HE ANSI Knob", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0490: { name: "Keychron Carbon 75 HE 8K", rows: 6, cols: 16, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x0494: { name: "Keychron J5 HE 8K", rows: 6, cols: 21, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x0497: { name: "Keychron K20 HE 8K", rows: 6, cols: 15, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x0498: { name: "Keychron C100 HE 8K ISO", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x049b: { name: "Keychron Carbon 87 HE 8K ANSI", rows: 6, cols: 17, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x049c: { name: "Keychron Carbon 108 HE 8K ANSI", rows: 6, cols: 21, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x04a1: { name: "Keychron J3 HE ANSI SILENT Knob", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x04a2: { name: "Keychron V1 8K", rows: 6, cols: 15, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x04a5: { name: "Keychron J3 HE ANSI Knob", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.1 }, launcherFlag: true }, + 0x04a6: { name: "Keychron J3 HE ANSI SILENT Knob", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0511: { name: "Lemokey L1 HE ISO", rows: 6, cols: 16, launcherFlag: false }, + 0x0b00: { name: "Keychron Q0 HE Knob", rows: 6, cols: 5, launcherFlag: true }, + 0x0b01: { name: "Keychron Q0 HE V2 Knob", rows: 6, cols: 5, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b02: { name: "Keychron Q0 HE V2 Knob", rows: 6, cols: 5, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b10: { name: "Keychron Q1 HE ANSI Knob", rows: 6, cols: 15, launcherFlag: true }, + 0x0b11: { name: "Keychron Q1 HE ISO Knob", rows: 6, cols: 15, launcherFlag: true }, + 0x0b12: { name: "Keychron Q1 HE JIS Knob", rows: 6, cols: 15, launcherFlag: true }, + 0x0b13: { name: "Keychron Q1 HE DAYZ", rows: 6, cols: 15, launcherFlag: true }, + 0x0b14: { name: "Keychron Q1 HE ANSI Knob", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b15: { name: "Keychron Q1 HE ANSI Knob", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b16: { name: "Keychron Q1 HE ISO Knob", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b20: { name: "Keychron Q2 HE ANSI Knob", rows: 5, cols: 15, launcherFlag: true }, + 0x0b30: { name: "Keychron Q3 HE ANSI Knob", rows: 6, cols: 16, launcherFlag: true }, + 0x0b31: { name: "Keychron Q3 HE ISO Knob", rows: 6, cols: 16, launcherFlag: true }, + 0x0b32: { name: "Keychron Q3 HE JIS Knob", rows: 6, cols: 16, launcherFlag: true }, + 0x0b33: { name: "Keychron Q3 HE ANSI Knob", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b40: { name: "Keychron Q4 HE ANSI", rows: 5, cols: 14, launcherFlag: true }, + 0x0b50: { name: "Keychron Q5 HE ANSI Knob", rows: 6, cols: 19, launcherFlag: true }, + 0x0b51: { name: "Keychron Q5 HE ISO Knob", rows: 6, cols: 19, launcherFlag: true }, + 0x0b52: { name: "Keychron Q5 HE JIS Knob", rows: 6, cols: 19, launcherFlag: true }, + 0x0b53: { name: "Keychron Q5 HE V2 ANSI Knob", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b60: { name: "Keychron Q6 HE ANSI Knob", rows: 6, cols: 21, launcherFlag: true }, + 0x0b61: { name: "Keychron Q6 HE ISO Knob", rows: 6, cols: 21, launcherFlag: true }, + 0x0b62: { name: "Keychron Q6 HE JIS Knob", rows: 6, cols: 21, launcherFlag: true }, + 0x0b63: { name: "Keychron Q6 HE Version 2 ANSI Knob", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b64: { name: "Keychron Q6 HE Version 2 ANSI Knob", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b65: { name: "Keychron Q6 HE ISO Knob", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0b66: { name: "Keychron Q6 HE Version 3 ANSI Knob", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ba0: { name: "Keychron Q10 HE ANSI knob", rows: 6, cols: 16, launcherFlag: true }, + 0x0bb0: { name: "Keychron Q11 HE ANSI Knob", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0bc0: { name: "Keychron Q12 HE ANSI Knob", rows: 6, cols: 19, launcherFlag: true }, + 0x0bc1: { name: "Keychron Q12 HE ISO Knob", rows: 6, cols: 19, launcherFlag: true }, + 0x0e20: { name: "Keychron K2 HE ANSI RGB", rows: 6, cols: 16, launcherFlag: true }, + 0x0e21: { name: "Keychron K2 HE ISO RGB", rows: 6, cols: 16, launcherFlag: true }, + 0x0e22: { name: "Keychron K2 HE JIS RGB", rows: 6, cols: 16, launcherFlag: true }, + 0x0e23: { name: "Keychron K2 HE BR RGB", rows: 6, cols: 16, launcherFlag: true }, + 0x0e24: { name: "Keychron K2 HE ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0e25: { name: "Keychron K2 HE ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0e26: { name: "Keychron K2 HE V2 ISO", rows: 6, cols: 16, travel: { min: 0.2, max: 3.4, deadzone: 0.1 }, launcherFlag: true }, + 0x0e27: { name: "Keychron K2 HE ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0e2a: { name: "Keychron K2 HE V3 ISO", rows: 6, cols: 16, launcherFlag: true }, + 0x0e30: { name: "Keychron K3 HE ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 2.8, deadzone: 0.1 }, launcherFlag: true }, + 0x0e31: { name: "Keychron K3 HE ISO", rows: 6, cols: 16, travel: { min: 0.2, max: 2.8, deadzone: 0.1 }, launcherFlag: true }, + 0x0e32: { name: "Keychron K3 HE JIS RGB", rows: 6, cols: 16, travel: { min: 0.2, max: 2.8, deadzone: 0.1 }, launcherFlag: true }, + 0x0e35: { name: "Keychron K3 HE JIS RGB", rows: 6, cols: 16, travel: { min: 0.2, max: 2.8, deadzone: 0.1 }, launcherFlag: true }, + 0x0e40: { name: "Keychron K4 HE ANSI", rows: 6, cols: 19, launcherFlag: true }, + 0x0e41: { name: "Keychron K4 HE ISO", rows: 6, cols: 19, launcherFlag: true }, + 0x0e42: { name: "Keychron K4 HE JIS", rows: 6, cols: 19, launcherFlag: true }, + 0x0e43: { name: "Keychron K4 HE ANSI", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.1 }, launcherFlag: true }, + 0x0e44: { name: "Keychron K4 HE ABNT2", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0e45: { name: "Keychron K4 HE ISO V2", rows: 6, cols: 19, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0e60: { name: "Keychron K6 HE ANSI", rows: 5, cols: 15, launcherFlag: true }, + 0x0e61: { name: "Keychron K6 HE ISO", rows: 5, cols: 15, launcherFlag: true }, + 0x0e80: { name: "Keychron K8 HE", rows: 6, cols: 16, launcherFlag: true }, + 0x0e81: { name: "Keychron K8 HE ISO", rows: 6, cols: 16, launcherFlag: true }, + 0x0e82: { name: "Keychron K8 HE JIS", rows: 6, cols: 16, launcherFlag: true }, + 0x0e83: { name: "Keychron K8 HE ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0e84: { name: "Keychron K8 HE ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.3 }, launcherFlag: true }, + 0x0e85: { name: "Keychron K8 HE ISO", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0e86: { name: "Keychron K8 HE ISO", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ea0: { name: "Keychron K10 HE ANSI RGB", rows: 6, cols: 21, launcherFlag: true }, + 0x0ea1: { name: "Keychron K10 HE ISO RGB", rows: 6, cols: 21, launcherFlag: true }, + 0x0ea2: { name: "Keychron K10 HE JIS", rows: 6, cols: 21, launcherFlag: true }, + 0x0ea3: { name: "Keychron K10 HE V2 ANSI RGB", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ea4: { name: "Keychron K10 HE ISO RGB", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ea5: { name: "Keychron K10 HE ABNT2", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ea6: { name: "Keychron K10 HE V2 ANSI RGB", rows: 6, cols: 21, travel: { min: 0.2, max: 3.2, deadzone: 0.3 }, launcherFlag: true }, + 0x0ea7: { name: "Keychron K10 HE ANSI RGB", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ea8: { name: "Keychron K10 HE ANSI RGB", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ea9: { name: "Keychron K10 HE ISO RGB", rows: 6, cols: 21, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x0ec0: { name: "Keychron K12 HE ANSI RGB", rows: 5, cols: 14, launcherFlag: true }, + 0x1001: { name: "Keychron Q18 HE 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1004: { name: "Keychron Q20 HE 8K ANSI", rows: 6, cols: 21, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1005: { name: "Keychron Q19 HE 8K", rows: 5, cols: 14, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1010: { name: "Keychron Q1 HE 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1011: { name: "Keychron Q1 HE 8K ISO", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1012: { name: "Keychron Q1 HE 8K JIS", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1013: { name: "Keychron Q1 HE 8K ABNT2", rows: 6, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1014: { name: "Keychron Q1 HE Marble 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.55 }, launcherFlag: true }, + 0x1015: { name: "Keychron Q1 SE 8K ANSI", rows: 6, cols: 15, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1016: { name: "Keychron Q1 HE 8K ANSI", rows: 6, cols: 16, travel: { min: 0.1, max: 3.45 }, launcherFlag: true }, + 0x1020: { name: "Keychron Q2 HE 8K ANSI", rows: 5, cols: 16, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1023: { name: "Keychron Q2 HE 8K ANSI V2", rows: 5, cols: 16, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1030: { name: "Keychron Q3 HE 8K ANSI", rows: 6, cols: 17, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1031: { name: "Keychron Q3 HE 8K ISO", rows: 6, cols: 17, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1032: { name: "Keychron Q3 HE 8K JIS", rows: 6, cols: 18, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1033: { name: "Keychron Q3 HE 8K ANSI", rows: 6, cols: 17, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1050: { name: "Keychron Q5 HE 8K ANSI", rows: 6, cols: 20, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1053: { name: "Keychron Q5 HE 8K ANSI", rows: 6, cols: 20, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1060: { name: "Keychron Q6 HE 8K ANSI", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1061: { name: "Keychron Q6 HE 8K ISO", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1062: { name: "Keychron Q6 HE 8K JIS", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1063: { name: "Keychron Q6 HE 8K", rows: 6, cols: 22, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1064: { name: "Keychron Q6 HE 8K ANSI", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x10f3: { name: "Keychron Q16 HE 8K ANSI", rows: 5, cols: 15, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x10f4: { name: "Keychron Q16 HE 8K ISO", rows: 5, cols: 15, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1234: { name: "Keychron K2 HE ISO RGB", rows: 6, cols: 16, launcherFlag: false }, + 0x1500: { name: "Keychron C0 HE 8K", rows: 6, cols: 7, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1532: { name: "Keychron C3 HE 8K JIS", rows: 6, cols: 18, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1533: { name: "Keychron C3 HE ANSI", rows: 6, cols: 17, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1535: { name: "Keychron C3 HE 8K JIS", rows: 6, cols: 18, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1536: { name: "Keychron C3 HE ANSI", rows: 6, cols: 17, travel: { min: 0.2, max: 3.5 }, launcherFlag: true }, + 0x1540: { name: "Keychron C4 HE 8K ANSI", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1541: { name: "Keychron C4 HE 8K ANSI", rows: 6, cols: 22, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1710: { name: "V1 HE 8K SE ANSI", rows: 6, cols: 15, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1711: { name: "Keychron V1 HE 8K", rows: 6, cols: 15, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1728: { name: "Keychron J2 HE ANSI RGB", rows: 6, cols: 15, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x1729: { name: "Antec WH1 ANSI", rows: 6, cols: 16, travel: { min: 0.2, max: 3.3, deadzone: 0.2 }, launcherFlag: true }, + 0x172c: { name: "K004 ISO Knob", rows: 6, cols: 15, travel: { min: 0.2, max: 3.5 }, launcherFlag: true }, + 0x172d: { name: "Secret Gear \u00d7 Keychron KX100 Magnetic", rows: 6, cols: 22, travel: { min: 0.1, max: 3.35 }, launcherFlag: true }, + 0x1740: { name: "Keychron V4 HE 8K", rows: 5, cols: 14, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x17c0: { name: "Keychron V12 HE 8K", rows: 6, cols: 16, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x17f0: { name: "Keychron V15 HE 8K", rows: 6, cols: 22, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, + 0x1860: { name: "Keychron V6 ULTRA HE ANSI ENCODER", rows: 6, cols: 21, travel: { min: 0.1, max: 3.5 }, launcherFlag: true }, +}; + +export const KEYCHRON_HE_PRODUCT_IDS: readonly number[] = Object.keys(KEYCHRON_HE_PRODUCTS).map(Number); diff --git a/src/keychron/protocol.test.ts b/src/keychron/protocol.test.ts new file mode 100644 index 0000000..4b90de3 --- /dev/null +++ b/src/keychron/protocol.test.ts @@ -0,0 +1,157 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { + KEYCHRON_HE_COMMAND, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_HE_SUBCOMMAND, + decodeKeychronAxisType, decodeKeychronCalibrationState, decodeKeychronCurve, decodeKeychronHeVersion, + decodeKeychronKeySlot, decodeKeychronProfileBuffer, decodeKeychronProfileName, decodeKeychronProfilesInfo, + decodeKeychronRealtimeTravel, joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, + keychronNameWindow, keychronProfileReadPlan, keychronUnit, +} from "./index.ts"; + +const reply = (sub: number, ...bytes: number[]) => { + const out = new Uint8Array(32); + out.set([KEYCHRON_HE_COMMAND, sub, ...bytes]); + return out; +}; +const head = (frame: Uint8Array, length: number) => [...frame.slice(0, length)]; + +test("frames are 32-byte KC_HE reports", () => { + const frame = keychronHeFrames.version(); + assert.equal(frame.length, 32); + assert.deepEqual(head(frame, 3), [0xa9, 0x01, 0]); + assert.deepEqual(head(keychronHeFrames.selectProfile(2), 3), [0xa9, 0x11, 2]); + assert.deepEqual(head(keychronHeFrames.readProfile(1, 0x0134, 26), 6), [0xa9, 0x12, 1, 0x34, 0x01, 26]); + assert.deepEqual(head(keychronHeFrames.realtimeTravel(3, 7), 4), [0xa9, 0x30, 3, 7]); + assert.deepEqual(head(keychronHeFrames.calibrate(), 3), [0xa9, 0x40, 2]); + assert.deepEqual(head(keychronHeFrames.stopCalibration(), 3), [0xa9, 0x40, 4]); + assert.deepEqual(head(keychronHeFrames.setAxisType(2), 3), [0xa9, 0x51, 2]); +}); + +test("frame arguments are range checked", () => { + assert.throws(() => keychronHeFrames.selectProfile(256), RangeError); + assert.throws(() => keychronHeFrames.readProfile(0, 0, 31), RangeError); + assert.throws(() => keychronHeFrames.readProfile(0, 0x10000, 4), RangeError); + assert.throws(() => keychronHeFrames.setTravel(4, 0, { workMode: 1, press: 300, keyMode: 1 }), RangeError); +}); + +test("setTravel packs one byte per value up to v4 and 16-bit words in v5", () => { + const v4 = keychronHeFrames.setTravel(4, 1, { workMode: 1, press: 20, sensitivePress: 4, keyMode: 1 }); + assert.deepEqual(head(v4, 9), [0xa9, 0x14, 1, 1, 20, 4, 4, 1, 0]); + const v5 = keychronHeFrames.setTravel(5, 2, { workMode: 1, press: 0x0123, sensitivePress: 40, sensitiveRelease: 50, keyMode: 1 }); + assert.deepEqual(head(v5, 12), [0xa9, 0x14, 2, 1, 0x23, 0x01, 40, 0, 50, 0, 1, 0]); + const perKey = keychronHeFrames.setTravel(4, 0, { workMode: 1, keyMode: 0, buffer: [9, 8, 7] }); + assert.deepEqual(head(perKey, 11), [0xa9, 0x14, 0, 1, 0, 0, 0, 0, 9, 8, 7]); +}); + +test("version reply exposes the version and capability bits", () => { + const info = decodeKeychronHeVersion(reply(KEYCHRON_HE_SUBCOMMAND.getVersion, 4, 0, 0b101011)); + assert.equal(info?.version, 4); + assert.deepEqual(info?.features, { + switchAxis: true, resetSingleKey: true, dkr: false, turbo: true, gamepadDisable: false, supportMechanical: true, + }); + assert.equal(decodeKeychronHeVersion(reply(0x02, 4)), null); +}); + +test("profile info reads the version-dependent tail", () => { + const raw = reply(KEYCHRON_HE_SUBCOMMAND.getProfilesInfo, 1, 3, 0x5c, 0x03, 20, 18, 2); + assert.deepEqual(decodeKeychronProfilesInfo(raw, 3), { + current: 1, total: 3, size: 0x035c, dksCount: null, snapTapCount: null, unit: 0.1, + }); + assert.deepEqual(decodeKeychronProfilesInfo(raw, 5), { + current: 1, total: 3, size: 0x035c, dksCount: 20, snapTapCount: 18, unit: 0.01, + }); + assert.equal(keychronUnit(3), 0.001); + assert.equal(keychronUnit(undefined), 0.1); +}); + +test("name window and read plan follow the profile size", () => { + assert.deepEqual(keychronNameWindow(1, 860), { offset: 827, length: 30 }); + assert.deepEqual(keychronNameWindow(4, 860), { offset: 828, length: 30 }); + assert.deepEqual(keychronNameWindow(5, 860), { offset: 828, length: 26 }); + const plan = keychronProfileReadPlan(60); + assert.deepEqual(plan, [{ offset: 0, length: 26 }, { offset: 26, length: 26 }, { offset: 52, length: 8 }]); + const joined = joinKeychronProfile([new Uint8Array([1, 2, 3]), new Uint8Array([4, 5, 6])], 5); + assert.deepEqual([...joined], [1, 2, 3, 4, 5]); +}); + +test("profile names are big-endian UTF-16 with zero pairs skipped", () => { + const name = reply(KEYCHRON_HE_SUBCOMMAND.getProfileBuffer, 0, 0, 0, 0, 0, 0x50, 0, 0x31, 0, 0, 0); + // reply bytes 6.. are the payload + name[6] = 0; name[7] = 0x50; name[8] = 0; name[9] = 0x31; name[10] = 0; name[11] = 0; + assert.equal(decodeKeychronProfileName(name), "P1"); + assert.equal(decodeKeychronProfileName(reply(0x13)), null); +}); + +test("v1-4 key slots unpack mode, travel, rapid trigger and index", () => { + // mode 2, distance 20, press 4, release 5, advance 3, index 9 + const word = 2 | (20 << 2) | (4 << 8) | (5 << 14) | (3 << 20) | (9 << 24); + const slot = new Uint8Array([word & 0xff, (word >>> 8) & 0xff, (word >>> 16) & 0xff, (word >>> 24) & 0xff]); + assert.deepEqual(decodeKeychronKeySlot(4, slot), { + mode: 2, distance: 20, advancePress: 4, advanceRelease: 5, advanceMode: 3, index: 9, + }); +}); + +test("v5 key slots use 14-bit fields and a trailing index byte", () => { + const word = (1n) | (300n << 2n) | (40n << 16n) | (50n << 30n) | (7n << 44n); + const slot = new Uint8Array(7); + for (let i = 0; i < 6; i++) slot[i] = Number((word >> BigInt(8 * i)) & 0xffn); + slot[6] = 11; + assert.deepEqual(decodeKeychronKeySlot(5, slot), { + mode: 1, distance: 300, advancePress: 40, advanceRelease: 50, advanceMode: 7, index: 11, + }); +}); + +test("profile buffers decode the key matrix, DKS and snap-tap regions", () => { + const rows = 2; const cols = 2; const slot = 4; + const buffer = new Uint8Array(slot * (rows * cols + 1) + 19 * 20 + 3 * 20); + // key (1,0) -> slot 3: distance 10, press 2 + const word = (10 << 2) | (2 << 8); + buffer.set([word & 0xff, (word >> 8) & 0xff, 0, 0], slot * 3); + // DKS slot 0: travels 1, 2, 3, 4 packed as [t0, t3, t1, t2] -> bits 0, 6, 12, 18 + const dksStart = slot * 5; + const dksWord = 1 | (4 << 6) | (2 << 12) | (3 << 18); + buffer.set([dksWord & 0xff, (dksWord >> 8) & 0xff, (dksWord >> 16) & 0xff], dksStart); + buffer.set([0x41, 0x00], dksStart + 3); // keycode 0x0041 + buffer.set([0xa5, 0x3c], dksStart + 11); // action nibbles + // snap-tap slot 2: key (col 1,row 0) and (col 2,row 1), type 3 + const snapStart = slot * 5 + 19 * 20; + buffer.set([(1 << 3) | 0, (2 << 3) | 1, 3], snapStart + 3 * 2); + const profile = decodeKeychronProfileBuffer(4, buffer, rows, cols); + assert.equal(profile.keys[1]![0]!.distance, 10); + assert.equal(profile.keys[1]![0]!.advancePress, 2); + assert.equal(profile.keys[0]![0]!.distance, 0); + assert.equal(profile.dks[0]?.keycodes[0], 0x41); + assert.deepEqual(profile.dks[0]?.travel, [1, 2, 3, 4]); + assert.deepEqual(profile.dks[0]?.actions[0], [0x5, 0xc, 0x3, 0xa]); + assert.equal(profile.dks[1], null); + assert.deepEqual(profile.snapTap, [{ + index: 2, type: 3, keys: [{ col: 1, row: 0 }, { col: 2, row: 1 }], + }]); + assert.throws(() => decodeKeychronProfileBuffer(4, new Uint8Array(4), rows, cols), RangeError); +}); + +test("live travel replies differ by version and must echo the key from v3", () => { + assert.equal(decodeKeychronRealtimeTravel(reply(0x30, 17), 2, 0, 0), 17); + assert.equal(decodeKeychronRealtimeTravel(reply(0x30, 0, 3, 7, 21), 4, 3, 7), 21); + assert.equal(decodeKeychronRealtimeTravel(reply(0x30, 0, 3, 7, 21), 4, 3, 8), null); + assert.equal(decodeKeychronRealtimeTravel(reply(0x30, 0, 3, 7, 0x2c, 0x01), 5, 3, 7), 300); +}); + +test("curve, axis type, calibration and acknowledgement replies decode", () => { + assert.deepEqual(decodeKeychronCurve(reply(0x20, 1, 2, 3, 4, 5, 6, 7, 8)), [[1, 2], [3, 4], [5, 6], [7, 8]]); + assert.deepEqual(decodeKeychronAxisType(reply(0x50, 2, 0x23, 0x00), 0.1), { type: 2, maxMm: 3.5 }); + const cal = decodeKeychronCalibrationState(reply(0x41, 0, 1, 0b0000_0101)); + assert.equal(cal?.state, 1); + assert.deepEqual(cal?.keys.slice(0, 3), [true, false, true]); + assert.equal(keychronHeAcknowledged(reply(0x14, 0), 0x14), true); + assert.equal(keychronHeAcknowledged(reply(0x14, 1), 0x14), false); +}); + +test("the HE catalog is keyed by 16-bit product ids", () => { + assert.ok(KEYCHRON_HE_PRODUCT_IDS.length > 150); + for (const id of KEYCHRON_HE_PRODUCT_IDS) { + assert.ok(id > 0 && id <= 0xffff); + const product = KEYCHRON_HE_PRODUCTS[id]!; + assert.ok(product.rows > 0 && product.cols > 0 && product.name.length > 0); + } +}); diff --git a/tsconfig.json b/tsconfig.json index 14bf307..1070117 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -46,6 +46,9 @@ ], "@openmouse/keyboard-protocol/steelseries": [ "./src/steelseries/index.ts" + ], + "@openmouse/keyboard-protocol/keychron": [ + "./src/keychron/index.ts" ] } }, From 7401eb11391abd8ced68fc0e570fd514fef81233 Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Fri, 30 Oct 2026 00:48:42 -0600 Subject: [PATCH 2/5] feat(keychron): name work/key modes, add key bitmap and profile rename Launcher's call sites (lazy chunks 595/547) define workMode as Global 0, Static 1, QuickTrigger 2 and keyMode as 1 = every key, 0 = a 24-byte per-key bitmap (byte 3*row + col/8, bit col%8). Expose those as constants with keychronKeyBitmap/keychronKeyTarget, and add renameProfile (28-byte UTF-16BE name, length byte 2*chars, then save, as Launcher does). Also record that the deadzone extends the top of the travel range. --- docs/keychron-support.md | 15 ++++++--- src/drivers/keychron/hid.test.ts | 11 +++++++ src/drivers/keychron/hid.ts | 14 +++++++- src/keychron/index.ts | 56 ++++++++++++++++++++++++++++++-- src/keychron/protocol.test.ts | 38 +++++++++++++++++++++- 5 files changed, 125 insertions(+), 9 deletions(-) diff --git a/docs/keychron-support.md b/docs/keychron-support.md index c8c4bd3..726c285 100644 --- a/docs/keychron-support.md +++ b/docs/keychron-support.md @@ -34,16 +34,23 @@ been exercised, and note the gaps below before relying on a value. | --- | --- | | Identity | version and capability bits, profile count/size/active slot, profile names | | Travel | actuation, rapid-trigger press/release, global and per-key (`setTravel`) | -| Profiles | select, read and decode the whole buffer, save, clear, rename | +| Profiles | select, read and decode the whole buffer, save, clear, rename (28-byte UTF-16BE name, length byte `2 * chars`, then save) | | Advanced keys | DKS decode and write/remove, snap-tap decode and write, turbo/DKR/toggle slot decode | | Response | curve read/write, live per-key travel | | Maintenance | calibration start/stop/state, switch axis type read/write, single-key reset, joystick mode | +## Write parameters (from Launcher's call sites) + +- `workMode`: Global 0, Static 1, QuickTrigger (rapid trigger) 2. +- `keyMode`: 1 applies to every key; 0 applies to the keys set in a 24-byte + bitmap (byte `3 * row + floor(col / 8)`, bit `col % 8`). +- Launcher follows every write with `saveProfile`, which the driver leaves to + the caller. + ## Known gaps -- `workMode` and `keyMode` are sent as the raw bytes Launcher uses. Their - meanings are only partly known (`keyMode` 0 means "write a per-key buffer"), - so the driver exposes them unnamed. +- Travel range: Launcher's displayed range is `min` up to `max + deadzone` + (`extra.he.distance`); the deadzone extends the top, it is not a lower bound. - The profile buffer layout past the snap-tap region, the v5 DKS/snap-tap write offsets beyond what Launcher sets, and turbo/DKR write commands are not covered. diff --git a/src/drivers/keychron/hid.test.ts b/src/drivers/keychron/hid.test.ts index 6731f66..8c78851 100644 --- a/src/drivers/keychron/hid.test.ts +++ b/src/drivers/keychron/hid.test.ts @@ -56,6 +56,7 @@ class FakeBoard { } break; } + case SUB.setProfileName: break; case SUB.setTravel: case SUB.saveProfileBuffer: reply[2] = this.nak ? 1 : 0; break; case SUB.getRealtimeTravel: reply.set([request[2]!, request[3]!, 33], 3); break; default: break; @@ -115,6 +116,16 @@ test("setTravel targets the active profile and requires an acknowledgement", asy await assert.rejects(() => keyboard.saveProfile(), /did not save/); }); +test("renameProfile writes the name then saves", async () => { + const board = new FakeBoard(); + await client(board).renameProfile(2, "Aim"); + const rename = board.sent.find((frame) => frame[1] === SUB.setProfileName)!; + assert.deepEqual([...rename.slice(2, 8)], [2, 6, 0, 0x41, 0, 0x69]); + assert.equal(board.sent.at(-1)![1], SUB.saveProfileBuffer); + await assert.rejects(() => client(board).renameProfile(7, "x"), RangeError); + await assert.rejects(() => client(board).renameProfile(0, ""), RangeError); +}); + test("live travel matches the echoed key", async () => { const board = new FakeBoard(); assert.equal(await client(board).readKeyTravel(2, 5), 33); diff --git a/src/drivers/keychron/hid.ts b/src/drivers/keychron/hid.ts index 4149b5f..83f0799 100644 --- a/src/drivers/keychron/hid.ts +++ b/src/drivers/keychron/hid.ts @@ -5,7 +5,7 @@ import { decodeKeychronCurve, decodeKeychronHeVersion, decodeKeychronProfileBuffer, decodeKeychronProfileName, decodeKeychronProfilesInfo, decodeKeychronRealtimeTravel, isKeychronHeReply, isKeychronHeVersion, joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, keychronNameWindow, - keychronProfileChunk, keychronProfileReadPlan, + keychronProfileChunk, keychronProfileNameBytes, keychronProfileReadPlan, type KeychronAxisType, type KeychronCalibrationState, type KeychronCurve, type KeychronHeSubcommand, type KeychronHeVersion, type KeychronHeVersionInfo, type KeychronProfileBuffer, type KeychronProfilesInfo, type KeychronTravelSetting, @@ -220,6 +220,18 @@ export class KeychronHidClient { }); } + /** Rename a profile slot, then save, as Launcher does. */ + renameProfile(slot: number, name: string): Promise { + return this.serialized(async () => { + const { chars, length } = keychronProfileNameBytes(name); + const info = await this.profilesInfo(); + if (!Number.isInteger(slot) || slot < 0 || slot >= info.total) throw new RangeError("Profile slot out of range."); + await this.call(keychronHeFrames.setProfileName(slot, chars, length), KEYCHRON_HE_SUBCOMMAND.setProfileName); + const saved = await this.call(keychronHeFrames.saveProfile(info.current), KEYCHRON_HE_SUBCOMMAND.saveProfileBuffer); + if (!keychronHeAcknowledged(saved, KEYCHRON_HE_SUBCOMMAND.saveProfileBuffer)) throw new Error("The keyboard did not save the profile."); + }); + } + clearProfile(): Promise { return this.serialized(async () => { const info = await this.profilesInfo(); diff --git a/src/keychron/index.ts b/src/keychron/index.ts index 59f6ad9..fbf1adc 100644 --- a/src/keychron/index.ts +++ b/src/keychron/index.ts @@ -61,6 +61,56 @@ export type KeychronHeSubcommand = (typeof KEYCHRON_HE_SUBCOMMAND)[keyof typeof /** `AMC_CALIBRATE` argument: start the calibration sweep / stop it. */ export const KEYCHRON_CALIBRATE = { start: 2, stop: 4 } as const; +/** + * `workMode` byte of a travel write. Launcher's `hw` enum: Global 0, Static 1, + * QuickTrigger 2 (rapid trigger). + */ +export const KEYCHRON_WORK_MODE = { global: 0, static: 1, quickTrigger: 2 } as const; +export type KeychronWorkMode = (typeof KEYCHRON_WORK_MODE)[keyof typeof KEYCHRON_WORK_MODE]; + +/** `keyMode` byte of a travel write: 1 applies to every key, 0 to the keys set in a bitmap. */ +export const KEYCHRON_KEY_MODE = { perKey: 0, allKeys: 1 } as const; +/** Per-key bitmap: three bytes per row, eight columns per byte, low bit first. */ +export const KEYCHRON_KEY_BITMAP_SIZE = 24; +/** Profile names are 28 bytes: up to 14 UTF-16BE units, zero padded. */ +export const KEYCHRON_PROFILE_NAME_BYTES = 28; + +export interface KeychronKeyPosition { row: number; col: number } + +/** Bitmap of `keys` in Launcher's layout: byte `3 * row + floor(col / 8)`, bit `col % 8`. */ +export function keychronKeyBitmap(keys: readonly KeychronKeyPosition[]): Uint8Array { + const bitmap = new Uint8Array(KEYCHRON_KEY_BITMAP_SIZE); + for (const { row, col } of keys) { + const at = 3 * row + Math.floor(col / 8); + if (!Number.isInteger(row) || !Number.isInteger(col) || row < 0 || col < 0 || col >= 24 || at >= bitmap.length) { + throw new RangeError(`Key [${row},${col}] is outside the 8x24 bitmap.`); + } + bitmap[at]! |= 1 << (col % 8); + } + return bitmap; +} + +/** `keyMode` and `buffer` for a travel write: every key (no keys given) or just `keys`. */ +export function keychronKeyTarget(keys?: readonly KeychronKeyPosition[]): { keyMode: number; buffer?: number[] } { + if (!keys) return { keyMode: KEYCHRON_KEY_MODE.allKeys }; + if (keys.length === 0) throw new RangeError("A per-key write needs at least one key."); + return { keyMode: KEYCHRON_KEY_MODE.perKey, buffer: [...keychronKeyBitmap(keys)] }; +} + +/** Name bytes and length for `setProfileName`: trimmed, BMP only, up to 14 characters. */ +export function keychronProfileNameBytes(name: string): { chars: number[]; length: number } { + const units = [...name.trim()]; + if (units.length === 0 || units.length > 14) throw new RangeError("Profile names are 1-14 characters."); + const chars = new Array(KEYCHRON_PROFILE_NAME_BYTES).fill(0); + units.forEach((unit, index) => { + const code = unit.codePointAt(0)!; + if (code > 0xffff) throw new RangeError("Profile names are limited to the Basic Multilingual Plane."); + chars[2 * index] = code >> 8; + chars[2 * index + 1] = code & U8; + }); + return { chars, length: 2 * units.length }; +} + export type KeychronHeVersion = 1 | 2 | 3 | 4 | 5; /** Capability bits of the `AMC_GET_VERSION` reply (byte 4, bit 0 first). */ @@ -144,7 +194,7 @@ export interface KeychronProfileBuffer { } export interface KeychronTravelSetting { - /** Raw work-mode byte Launcher sends; 0 selects the per-key buffer. */ + /** KEYCHRON_WORK_MODE: global 0, static 1, quickTrigger 2. */ workMode: number; /** Actuation, in `unit` steps. */ press?: number; @@ -152,7 +202,7 @@ export interface KeychronTravelSetting { sensitivePress?: number; /** Rapid-trigger release sensitivity; defaults to `sensitivePress`. */ sensitiveRelease?: number; - /** 0 writes `buffer`; any other value is a global setting. */ + /** KEYCHRON_KEY_MODE: 0 writes the keys in `buffer`, 1 applies to every key. */ keyMode: number; /** Per-key bytes (only sent when `keyMode` is 0). */ buffer?: readonly number[]; @@ -227,7 +277,7 @@ export const keychronHeFrames = { }, saveProfile: (slot: number) => frame(KEYCHRON_HE_SUBCOMMAND.saveProfileBuffer, profile(slot)), clearProfile: (slot: number) => frame(KEYCHRON_HE_SUBCOMMAND.clearProfileBuffer, profile(slot)), - /** `chars` are the name's UTF-16 code units, big-endian, as the profile buffer stores them. */ + /** Use `keychronProfileNameBytes`; Launcher follows a rename with `saveProfile`. */ setProfileName(slot: number, chars: readonly number[], length: number) { return frame(KEYCHRON_HE_SUBCOMMAND.setProfileName, profile(slot), length, ...chars); }, diff --git a/src/keychron/protocol.test.ts b/src/keychron/protocol.test.ts index 4b90de3..8653181 100644 --- a/src/keychron/protocol.test.ts +++ b/src/keychron/protocol.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import test from "node:test"; import { - KEYCHRON_HE_COMMAND, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_HE_SUBCOMMAND, + KEYCHRON_HE_COMMAND, KEYCHRON_KEY_MODE, KEYCHRON_WORK_MODE, keychronKeyBitmap, keychronKeyTarget, keychronProfileNameBytes, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_HE_SUBCOMMAND, decodeKeychronAxisType, decodeKeychronCalibrationState, decodeKeychronCurve, decodeKeychronHeVersion, decodeKeychronKeySlot, decodeKeychronProfileBuffer, decodeKeychronProfileName, decodeKeychronProfilesInfo, decodeKeychronRealtimeTravel, joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, @@ -155,3 +155,39 @@ test("the HE catalog is keyed by 16-bit product ids", () => { assert.ok(product.rows > 0 && product.cols > 0 && product.name.length > 0); } }); + +test("work and key modes match Launcher's enums", () => { + assert.deepEqual(KEYCHRON_WORK_MODE, { global: 0, static: 1, quickTrigger: 2 }); + assert.deepEqual(KEYCHRON_KEY_MODE, { perKey: 0, allKeys: 1 }); +}); + +test("the key bitmap is three bytes per row, low bit first", () => { + const bitmap = keychronKeyBitmap([{ row: 0, col: 0 }, { row: 1, col: 9 }, { row: 2, col: 23 }]); + assert.equal(bitmap.length, 24); + assert.equal(bitmap[0], 0b1); + assert.equal(bitmap[3 + 1], 0b10); + assert.equal(bitmap[6 + 2], 0b1000_0000); + assert.equal(bitmap.reduce((sum, byte) => sum + byte, 0), 1 + 2 + 128); + assert.throws(() => keychronKeyBitmap([{ row: 0, col: 24 }]), RangeError); + assert.throws(() => keychronKeyBitmap([{ row: 8, col: 0 }]), RangeError); +}); + +test("key targets are all-keys by default and per-key with a bitmap", () => { + assert.deepEqual(keychronKeyTarget(), { keyMode: 1 }); + const target = keychronKeyTarget([{ row: 0, col: 1 }]); + assert.equal(target.keyMode, 0); + assert.equal(target.buffer?.[0], 0b10); + assert.throws(() => keychronKeyTarget([]), RangeError); +}); + +test("profile names are trimmed big-endian UTF-16 with a byte length", () => { + const { chars, length } = keychronProfileNameBytes(" Hi\u00e9 "); + assert.equal(length, 6); + assert.deepEqual(chars.slice(0, 7), [0, 0x48, 0, 0x69, 0, 0xe9, 0]); + assert.equal(chars.length, 28); + assert.throws(() => keychronProfileNameBytes(" "), RangeError); + assert.throws(() => keychronProfileNameBytes("x".repeat(15)), RangeError); + assert.throws(() => keychronProfileNameBytes("\u{1F600}"), RangeError); + const frame = keychronHeFrames.setProfileName(2, chars, length); + assert.deepEqual([...frame.slice(0, 8)], [0xa9, 0x13, 2, 6, 0, 0x48, 0, 0x69]); +}); From b65fa107c278820927336ecb9d32834b3ce946e7 Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Fri, 30 Oct 2026 01:00:41 -0600 Subject: [PATCH 3/5] feat(keychron): add physical layouts, keymap read and key legends Ship the physical key layout of every catalogued board (103 distinct layouts from Launcher's definitions) with keychronLayoutFor, read the keymap with the standard VIA dynamic-keymap commands (readKeymap, readLayerCount) as Launcher does, and map keycodes to short legends with a hex fallback for unrecognised codes. --- docs/keychron-support.md | 12 ++ src/drivers/keychron/hid.test.ts | 21 +- src/drivers/keychron/hid.ts | 32 ++- src/keychron/index.ts | 71 +++++++ src/keychron/keycodes.ts | 75 +++++++ src/keychron/layouts.ts | 333 +++++++++++++++++++++++++++++++ src/keychron/protocol.test.ts | 54 ++++- 7 files changed, 595 insertions(+), 3 deletions(-) create mode 100644 src/keychron/keycodes.ts create mode 100644 src/keychron/layouts.ts diff --git a/docs/keychron-support.md b/docs/keychron-support.md index 726c285..737f757 100644 --- a/docs/keychron-support.md +++ b/docs/keychron-support.md @@ -37,8 +37,20 @@ been exercised, and note the gaps below before relying on a value. | Profiles | select, read and decode the whole buffer, save, clear, rename (28-byte UTF-16BE name, length byte `2 * chars`, then save) | | Advanced keys | DKS decode and write/remove, snap-tap decode and write, turbo/DKR/toggle slot decode | | Response | curve read/write, live per-key travel | +| Layout and legends | physical key layout per board (`keychronLayoutFor`), keymap read through the standard VIA dynamic-keymap command (`readKeymap`, `readLayerCount`), and `keychronKeycodeLegend` for key labels | | Maintenance | calibration start/stop/state, switch axis type read/write, single-key reset, joystick mode | +## Layouts and legends + +`src/keychron/layouts.ts` holds the physical key layout (position, size, +rotation, knob index) for every catalogued board, 103 distinct layouts taken +from Launcher's definitions with decorative art removed. The profile buffer has +no key names, so legends come from the keymap: the driver reads it with VIA's +`DYNAMIC_KEYMAP_GET_BUFFER` (0x12, 14 keys per read, big-endian keycodes), the +same way Launcher does. `keychronKeycodeLegend` labels basic keycodes, +modifiers, layer keys and mod/layer-tap wrappers, and shows the hex value for +anything else (custom or vendor codes). + ## Write parameters (from Launcher's call sites) - `workMode`: Global 0, Static 1, QuickTrigger (rapid trigger) 2. diff --git a/src/drivers/keychron/hid.test.ts b/src/drivers/keychron/hid.test.ts index 8c78851..38fd5f7 100644 --- a/src/drivers/keychron/hid.test.ts +++ b/src/drivers/keychron/hid.test.ts @@ -34,9 +34,17 @@ class FakeBoard { assert.equal(reportId, 0); const request = data as Uint8Array; assert.equal(request.length, 32); - assert.equal(request[0], KEYCHRON_HE_COMMAND); this.sent.push(request.slice()); if (this.silent) return; + if (request[0] === 0x11 || request[0] === 0x12) { + const via = new Uint8Array(32); + via.set(request.slice(0, 4)); + if (request[0] === 0x11) via[1] = 4; + else for (let i = 0; i < request[3]!; i += 2) { const key = ((request[1]! << 8 | request[2]!) + i) / 2; via[4 + i] = 0; via[5 + i] = 4 + (key % 26); } + this.emit(via); + return; + } + assert.equal(request[0], KEYCHRON_HE_COMMAND); const reply = new Uint8Array(32); reply.set(request.slice(0, 2)); switch (request[1]) { @@ -126,6 +134,17 @@ test("renameProfile writes the name then saves", async () => { await assert.rejects(() => client(board).renameProfile(0, ""), RangeError); }); +test("readKeymap reads one layer through the VIA keymap command", async () => { + const board = new FakeBoard(); + const keymap = await client(board).readKeymap(0); + assert.equal(keymap.length, rows); + assert.ok(keymap.every((row) => row.length === cols)); + assert.deepEqual(keymap[0]!.slice(0, 3), [4, 5, 6]); + const reads = board.sent.filter((frame) => frame[0] === 0x12); + assert.equal(reads.length, Math.ceil(rows * cols / 14)); + assert.equal(await client(board).readLayerCount(), 4); +}); + test("live travel matches the echoed key", async () => { const board = new FakeBoard(); assert.equal(await client(board).readKeyTravel(2, 5), 33); diff --git a/src/drivers/keychron/hid.ts b/src/drivers/keychron/hid.ts index 83f0799..11756f1 100644 --- a/src/drivers/keychron/hid.ts +++ b/src/drivers/keychron/hid.ts @@ -5,7 +5,8 @@ import { decodeKeychronCurve, decodeKeychronHeVersion, decodeKeychronProfileBuffer, decodeKeychronProfileName, decodeKeychronProfilesInfo, decodeKeychronRealtimeTravel, isKeychronHeReply, isKeychronHeVersion, joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, keychronNameWindow, - keychronProfileChunk, keychronProfileNameBytes, keychronProfileReadPlan, + keychronProfileChunk, keychronProfileNameBytes, keychronKeymapReadPlan, keychronViaFrames, + isKeychronKeymapReply, decodeKeychronKeymapChunk, joinKeychronKeymap, decodeKeychronLayerCount, keychronProfileReadPlan, type KeychronAxisType, type KeychronCalibrationState, type KeychronCurve, type KeychronHeSubcommand, type KeychronHeVersion, type KeychronHeVersionInfo, type KeychronProfileBuffer, type KeychronProfilesInfo, type KeychronTravelSetting, @@ -220,6 +221,35 @@ export class KeychronHidClient { }); } + /** Number of keymap layers the board has. */ + readLayerCount(): Promise { + return this.serialized(async () => { + const count = decodeKeychronLayerCount(await this.exchange( + keychronViaFrames.layerCount(), (frame) => decodeKeychronLayerCount(frame) !== null, + )); + if (count === null) throw new Error("The keyboard did not report its layer count."); + return count; + }); + } + + /** + * Read one keymap layer as `keycodes[row][col]` using the standard VIA + * dynamic-keymap read. Pair it with `keychronKeycodeLegend` to label keys. + */ + readKeymap(layer = 0): Promise { + return this.serialized(async () => { + const { rows, cols } = this.matrix(); + const chunks: number[][] = []; + for (const read of keychronKeymapReadPlan(layer, rows, cols)) { + const reply = await this.exchange(keychronViaFrames.keymapBuffer(read), (frame) => isKeychronKeymapReply(frame, read.offset)); + const codes = decodeKeychronKeymapChunk(reply, read.bytes); + if (!codes) throw new Error("The keyboard sent a short keymap reply."); + chunks.push(codes); + } + return joinKeychronKeymap(chunks, rows, cols); + }); + } + /** Rename a profile slot, then save, as Launcher does. */ renameProfile(slot: number, name: string): Promise { return this.serialized(async () => { diff --git a/src/keychron/index.ts b/src/keychron/index.ts index fbf1adc..d7f1cad 100644 --- a/src/keychron/index.ts +++ b/src/keychron/index.ts @@ -351,6 +351,75 @@ export const keychronHeFrames = { frame(KEYCHRON_HE_SUBCOMMAND.resetSingleKey, profile(slot), row, col), } as const; +/** + * The standard VIA/QMK dynamic-keymap commands Launcher uses to read legends. + * They share the same 32-byte raw-HID report as `KC_HE` but use their own + * command ids (not 0xA9). + */ +export const KEYCHRON_VIA_COMMAND = { getLayerCount: 0x11, getKeymapBuffer: 0x12 } as const; +/** Keys per keymap read: a reply carries up to 28 bytes, two per keycode. */ +export const KEYCHRON_KEYMAP_KEYS_PER_READ = 14; + +export interface KeychronKeymapRead { offset: number; bytes: number } + +/** + * Reads that cover one layer of a `rows` x `cols` matrix. Offsets are bytes + * from the start of the keymap: `layer * rows * cols * 2 + 28 * chunk`. + */ +export function keychronKeymapReadPlan(layer: number, rows: number, cols: number): KeychronKeymapRead[] { + if (!Number.isInteger(layer) || layer < 0 || layer > U8) throw new RangeError("Invalid keymap layer."); + const keys = rows * cols; + const reads: KeychronKeymapRead[] = []; + for (let first = 0; first < keys; first += KEYCHRON_KEYMAP_KEYS_PER_READ) { + const count = Math.min(KEYCHRON_KEYMAP_KEYS_PER_READ, keys - first); + const offset = (layer * keys + first) * 2; + if (offset > 0xffff) throw new RangeError("Keymap offset exceeds the 16-bit address space."); + reads.push({ offset, bytes: count * 2 }); + } + return reads; +} + +function viaFrame(command: number, ...args: number[]): Uint8Array { + const out = new Uint8Array(KEYCHRON_REPORT_SIZE); + out[0] = command; + args.forEach((value, index) => { out[index + 1] = value; }); + return out; +} + +export const keychronViaFrames = { + layerCount: () => viaFrame(KEYCHRON_VIA_COMMAND.getLayerCount), + keymapBuffer(read: KeychronKeymapRead) { + if (read.bytes < 2 || read.bytes > 28 || read.bytes % 2 !== 0) throw new RangeError("A keymap read carries 1-14 keycodes."); + return viaFrame(KEYCHRON_VIA_COMMAND.getKeymapBuffer, read.offset >> 8, read.offset & U8, read.bytes); + }, +} as const; + +/** True when `report` answers the keymap read at `offset`. */ +export function isKeychronKeymapReply(report: Uint8Array, offset: number): boolean { + return report.length >= 4 && report[0] === KEYCHRON_VIA_COMMAND.getKeymapBuffer + && report[1] === offset >> 8 && report[2] === (offset & U8); +} + +/** Layer count reply: byte 1. */ +export function decodeKeychronLayerCount(report: Uint8Array): number | null { + return report.length >= 2 && report[0] === KEYCHRON_VIA_COMMAND.getLayerCount ? report[1]! : null; +} + +/** Keycodes in a keymap reply: big-endian 16-bit values starting at byte 4. */ +export function decodeKeychronKeymapChunk(report: Uint8Array, bytes: number): number[] | null { + if (report.length < 4 + bytes || report[0] !== KEYCHRON_VIA_COMMAND.getKeymapBuffer) return null; + const codes: number[] = []; + for (let i = 0; i < bytes; i += 2) codes.push((report[4 + i]! << 8) | report[5 + i]!); + return codes; +} + +/** Fold the chunks of one layer into `keycodes[row][col]`. */ +export function joinKeychronKeymap(chunks: readonly (readonly number[])[], rows: number, cols: number): number[][] { + const flat = chunks.flat(); + if (flat.length < rows * cols) throw new RangeError("Keymap is shorter than its matrix."); + return Array.from({ length: rows }, (_, row) => flat.slice(row * cols, (row + 1) * cols)); +} + /** True when `report` is an answer to the given HE subcommand. */ export function isKeychronHeReply(report: Uint8Array, subcommand: KeychronHeSubcommand): boolean { return report.length >= 2 && report[0] === KEYCHRON_HE_COMMAND && report[1] === subcommand; @@ -538,3 +607,5 @@ export function keychronHeAcknowledged(report: Uint8Array, subcommand: KeychronH } export * from "./products.js"; +export * from "./layouts.js"; +export * from "./keycodes.js"; diff --git a/src/keychron/keycodes.ts b/src/keychron/keycodes.ts new file mode 100644 index 0000000..83ef2be --- /dev/null +++ b/src/keychron/keycodes.ts @@ -0,0 +1,75 @@ +/** + * Short key legends for QMK keycodes, for drawing a keyboard from a keymap + * read. Covers the common basic keycodes, modifiers, layer keys and the + * modifier/layer-tap wrappers; anything else falls back to its hex value so a + * custom or vendor keycode is never shown as something it is not. + */ + +export interface KeychronLegend { + /** What to draw on the key; empty for an unassigned key. */ + label: string; + /** Longer name for a tooltip. */ + title: string; + /** True when the code is not recognised and `label` is its hex value. */ + unknown: boolean; +} + +const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +const DIGITS = "1234567890"; + +const BASIC: Readonly> = { + 0x28: ["Enter", "Enter"], 0x29: ["Esc", "Escape"], 0x2a: ["Bksp", "Backspace"], 0x2b: ["Tab", "Tab"], + 0x2c: ["Space", "Space"], 0x2d: ["-", "Minus"], 0x2e: ["=", "Equal"], 0x2f: ["[", "Left bracket"], + 0x30: ["]", "Right bracket"], 0x31: ["\\", "Backslash"], 0x32: ["#", "Non-US hash"], 0x33: [";", "Semicolon"], + 0x34: ["'", "Quote"], 0x35: ["`", "Grave"], 0x36: [",", "Comma"], 0x37: [".", "Period"], 0x38: ["/", "Slash"], + 0x39: ["Caps", "Caps Lock"], 0x46: ["PrtSc", "Print Screen"], 0x47: ["ScrLk", "Scroll Lock"], + 0x48: ["Pause", "Pause"], 0x49: ["Ins", "Insert"], 0x4a: ["Home", "Home"], 0x4b: ["PgUp", "Page Up"], + 0x4c: ["Del", "Delete"], 0x4d: ["End", "End"], 0x4e: ["PgDn", "Page Down"], 0x4f: ["→", "Right arrow"], + 0x50: ["←", "Left arrow"], 0x51: ["↓", "Down arrow"], 0x52: ["↑", "Up arrow"], 0x53: ["Num", "Num Lock"], + 0x54: ["/", "Keypad slash"], 0x55: ["*", "Keypad asterisk"], 0x56: ["-", "Keypad minus"], + 0x57: ["+", "Keypad plus"], 0x58: ["Ent", "Keypad enter"], 0x62: ["0", "Keypad 0"], 0x63: [".", "Keypad period"], + 0x64: ["\\", "Non-US backslash"], 0x65: ["Menu", "Application"], + 0xe0: ["Ctrl", "Left Control"], 0xe1: ["Shift", "Left Shift"], 0xe2: ["Alt", "Left Alt"], 0xe3: ["Win", "Left GUI"], + 0xe4: ["Ctrl", "Right Control"], 0xe5: ["Shift", "Right Shift"], 0xe6: ["Alt", "Right Alt"], 0xe7: ["Win", "Right GUI"], + 0xa8: ["Mute", "Mute"], 0xa9: ["Vol+", "Volume up"], 0xaa: ["Vol-", "Volume down"], 0xab: ["Next", "Next track"], + 0xac: ["Prev", "Previous track"], 0xad: ["Stop", "Stop"], 0xae: ["Play", "Play/pause"], +}; + +const MOD_BITS = [["Ctrl", 0x01], ["Shift", 0x02], ["Alt", 0x04], ["Win", 0x08]] as const; + +function basic(code: number): [string, string] | null { + if (code >= 0x04 && code <= 0x1d) return [LETTERS[code - 0x04]!, `Key ${LETTERS[code - 0x04]}`]; + if (code >= 0x1e && code <= 0x27) return [DIGITS[code - 0x1e]!, `Key ${DIGITS[code - 0x1e]}`]; + if (code >= 0x3a && code <= 0x45) return [`F${code - 0x39}`, `F${code - 0x39}`]; + if (code >= 0x68 && code <= 0x73) return [`F${code - 0x5b}`, `F${code - 0x5b}`]; + if (code >= 0x59 && code <= 0x61) return [String(code - 0x58), `Keypad ${code - 0x58}`]; + return BASIC[code] ?? null; +} + +/** Legend for one keycode as read from the board. */ +export function keychronKeycodeLegend(code: number): KeychronLegend { + if (code === 0x0000) return { label: "", title: "No key", unknown: false }; + if (code === 0x0001) return { label: "▽", title: "Transparent (falls through to the layer below)", unknown: false }; + const direct = basic(code); + if (direct) return { label: direct[0], title: direct[1], unknown: false }; + // Modifier combos: 0x0100-0x1FFF are a basic key plus mod bits. + if (code >= 0x0100 && code <= 0x1fff) { + const key = basic(code & 0xff); + const mods = MOD_BITS.filter(([, bit]) => (code >> 8) & bit).map(([name]) => name); + if (key && mods.length) return { label: key[0], title: `${mods.join("+")}+${key[1]}`, unknown: false }; + } + // Mod-tap 0x2000-0x3FFF and layer-tap 0x4000-0x4FFF: the tap key is the legend. + if ((code >= 0x2000 && code <= 0x4fff)) { + const key = basic(code & 0xff); + if (key) return { label: key[0], title: `${code >= 0x4000 ? "Layer-tap" : "Mod-tap"} ${key[1]}`, unknown: false }; + } + const layer = code & 0x1f; + if (code >= 0x5200 && code <= 0x521f) return { label: `TO${layer}`, title: `Switch to layer ${layer}`, unknown: false }; + if (code >= 0x5220 && code <= 0x523f) return { label: `MO${layer}`, title: `Momentary layer ${layer}`, unknown: false }; + if (code >= 0x5240 && code <= 0x525f) return { label: `DF${layer}`, title: `Default layer ${layer}`, unknown: false }; + if (code >= 0x5260 && code <= 0x527f) return { label: `TG${layer}`, title: `Toggle layer ${layer}`, unknown: false }; + if (code >= 0x5280 && code <= 0x529f) return { label: `OS${layer}`, title: `One-shot layer ${layer}`, unknown: false }; + if (code >= 0x52c0 && code <= 0x52df) return { label: `TT${layer}`, title: `Layer tap-toggle ${layer}`, unknown: false }; + const hex = `0x${code.toString(16).toUpperCase().padStart(4, "0")}`; + return { label: hex, title: `Unrecognised keycode ${hex}`, unknown: true }; +} diff --git a/src/keychron/layouts.ts b/src/keychron/layouts.ts new file mode 100644 index 0000000..0cf9ce9 --- /dev/null +++ b/src/keychron/layouts.ts @@ -0,0 +1,333 @@ +/** + * Physical key layouts for the Keychron Hall-effect catalog, from Launcher's + * per-board definitions (`layouts.keys`, decorative art removed). 102 distinct + * layouts cover every board in `KEYCHRON_HE_PRODUCTS`. Units are key widths + * (1 = a standard key). Each key is `[row, col, x, y, w, h, rotation, rx, ry, + * encoder]`: `row`/`col` are the matrix position, `rotation` is degrees around + * (`rx`, `ry`), and `encoder` is the knob index or -1. + */ + +type RawKey = readonly [number, number, number, number, number, number, number, number, number, number]; +type RawLayout = readonly [width: number, height: number, keys: readonly RawKey[]]; + +const LAYOUTS: readonly RawLayout[] = [ + [16.25,5.5,[[0,0,0,0.25,1,1,0,0,0.25,-1],[0,1,1,0.25,1,1,0,0,0.25,-1],[0,2,2,0.25,1,1,0,0,0.25,-1],[0,3,3,0.25,1,1,0,0,0.25,-1],[0,4,4,0.25,1,1,0,0,0.25,-1],[0,5,5,0.25,1,1,0,0,0.25,-1],[0,6,6,0.25,1,1,0,0,0.25,-1],[0,7,7,0.25,1,1,0,0,0.25,-1],[0,8,8,0.25,1,1,0,0,0.25,-1],[0,9,9,0.25,1,1,0,0,0.25,-1],[0,10,10,0.25,1,1,0,0,0.25,-1],[0,11,11,0.25,1,1,0,0,0.25,-1],[0,12,12,0.25,1,1,0,0,0.25,-1],[0,13,13,0.25,2,1,0,0,0.25,-1],[0,14,15.25,0,1,1,0,0,0.25,0],[1,0,0,1.25,1.5,1,0,0,0.25,-1],[1,1,1.5,1.25,1,1,0,0,0.25,-1],[1,2,2.5,1.25,1,1,0,0,0.25,-1],[1,3,3.5,1.25,1,1,0,0,0.25,-1],[1,4,4.5,1.25,1,1,0,0,0.25,-1],[1,5,5.5,1.25,1,1,0,0,0.25,-1],[1,6,6.5,1.25,1,1,0,0,0.25,-1],[1,7,7.5,1.25,1,1,0,0,0.25,-1],[1,8,8.5,1.25,1,1,0,0,0.25,-1],[1,9,9.5,1.25,1,1,0,0,0.25,-1],[1,10,10.5,1.25,1,1,0,0,0.25,-1],[1,11,11.5,1.25,1,1,0,0,0.25,-1],[1,12,12.5,1.25,1,1,0,0,0.25,-1],[1,13,13.5,1.25,1.5,1,0,0,0.25,-1],[1,14,15.25,1.25,1,1,0,0,0.25,-1],[2,0,0,2.25,1.75,1,0,0,0.25,-1],[2,1,1.75,2.25,1,1,0,0,0.25,-1],[2,2,2.75,2.25,1,1,0,0,0.25,-1],[2,3,3.75,2.25,1,1,0,0,0.25,-1],[2,4,4.75,2.25,1,1,0,0,0.25,-1],[2,5,5.75,2.25,1,1,0,0,0.25,-1],[2,6,6.75,2.25,1,1,0,0,0.25,-1],[2,7,7.75,2.25,1,1,0,0,0.25,-1],[2,8,8.75,2.25,1,1,0,0,0.25,-1],[2,9,9.75,2.25,1,1,0,0,0.25,-1],[2,10,10.75,2.25,1,1,0,0,0.25,-1],[2,11,11.75,2.25,1,1,0,0,0.25,-1],[2,12,12.75,2.25,2.25,1,0,0,0.25,-1],[2,14,15.25,2.25,1,1,0,0,0.25,-1],[3,0,0,3.25,2.25,1,0,0,0.25,-1],[3,2,2.25,3.25,1,1,0,0,0.25,-1],[3,3,3.25,3.25,1,1,0,0,0.25,-1],[3,4,4.25,3.25,1,1,0,0,0.25,-1],[3,5,5.25,3.25,1,1,0,0,0.25,-1],[3,6,6.25,3.25,1,1,0,0,0.25,-1],[3,7,7.25,3.25,1,1,0,0,0.25,-1],[3,8,8.25,3.25,1,1,0,0,0.25,-1],[3,9,9.25,3.25,1,1,0,0,0.25,-1],[3,10,10.25,3.25,1,1,0,0,0.25,-1],[3,11,11.25,3.25,1,1,0,0,0.25,-1],[3,12,12.25,3.25,1.75,1,0,0,0.25,-1],[3,13,14.25,3.5,1,1,0,0,0.25,-1],[4,0,0,4.25,1.25,1,0,0,0.25,-1],[4,1,1.25,4.25,1.25,1,0,0,0.25,-1],[4,2,2.5,4.25,1.25,1,0,0,0.25,-1],[4,6,3.75,4.25,6.25,1,0,0,0.25,-1],[4,9,10,4.25,1,1,0,0,0.25,-1],[4,10,11,4.25,1,1,0,0,0.25,-1],[4,11,12,4.25,1,1,0,0,0.25,-1],[4,12,13.25,4.5,1,1,0,0,0.25,-1],[4,13,14.25,4.5,1,1,0,0,0.25,-1],[4,14,15.25,4.5,1,1,0,0,0.25,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.5,0,1,1,0,0,0,-1],[0,16,17.5,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[3,14,14,1.25,1,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,13,15.25,3.25,1,1,0,0,0,-1],[3,15,16.5,3.25,1,1,0,0,0,-1],[3,16,17.5,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,14,15.25,4.5,1,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.75,1,0,0,0,-1],[5,8,9.25,5.25,1,1,0,0,0,-1],[5,9,10.25,5.25,1.25,1,0,0,0,-1],[5,10,11.5,5.25,1.25,1,0,0,0,-1],[5,11,12.75,5.25,1.25,1,0,0,0,-1],[5,12,14.25,5.5,1,1,0,0,0,-1],[5,13,15.25,5.5,1,1,0,0,0,-1],[5,14,16.25,5.5,1,1,0,0,0,-1],[5,16,17.5,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,1,1,0,0,0,-1]]], + [16.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,2,1,0,0,0,-1],[4,13,14.5,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.5,1,0,0,0,-1],[5,9,10.25,5.25,1,1,0,0,0,-1],[5,10,11.25,5.25,1,1,0,0,0,-1],[5,11,12.25,5.25,1,1,0,0,0,-1],[5,12,13.5,5.25,1,1,0,0,0,-1],[5,13,14.5,5.25,1,1,0,0,0,-1],[5,14,15.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[0,16,18.5,0,1,1,0,0,0,-1],[0,17,19.5,0,1,1,0,0,0,-1],[0,18,20.5,0,1,1,0,0,0,-1],[0,19,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,19,20.5,5.25,1,1,0,0,0,-1]]], + [16,5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,2,1,0,0,0,-1],[0,14,15,0,1,1,0,0,0,-1],[1,0,0,1,1.5,1,0,0,0,-1],[1,1,1.5,1,1,1,0,0,0,-1],[1,2,2.5,1,1,1,0,0,0,-1],[1,3,3.5,1,1,1,0,0,0,-1],[1,4,4.5,1,1,1,0,0,0,-1],[1,5,5.5,1,1,1,0,0,0,-1],[1,6,6.5,1,1,1,0,0,0,-1],[1,7,7.5,1,1,1,0,0,0,-1],[1,8,8.5,1,1,1,0,0,0,-1],[1,9,9.5,1,1,1,0,0,0,-1],[1,10,10.5,1,1,1,0,0,0,-1],[1,11,11.5,1,1,1,0,0,0,-1],[1,12,12.5,1,1,1,0,0,0,-1],[1,13,13.75,1,1.25,2,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.75,1,0,0,0,-1],[2,1,1.75,2,1,1,0,0,0,-1],[2,2,2.75,2,1,1,0,0,0,-1],[2,3,3.75,2,1,1,0,0,0,-1],[2,4,4.75,2,1,1,0,0,0,-1],[2,5,5.75,2,1,1,0,0,0,-1],[2,6,6.75,2,1,1,0,0,0,-1],[2,7,7.75,2,1,1,0,0,0,-1],[2,8,8.75,2,1,1,0,0,0,-1],[2,9,9.75,2,1,1,0,0,0,-1],[2,10,10.75,2,1,1,0,0,0,-1],[2,11,11.75,2,1,1,0,0,0,-1],[2,13,12.75,2,1,1,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.25,1,0,0,0,-1],[3,1,1.25,3,1,1,0,0,0,-1],[3,2,2.25,3,1,1,0,0,0,-1],[3,3,3.25,3,1,1,0,0,0,-1],[3,4,4.25,3,1,1,0,0,0,-1],[3,5,5.25,3,1,1,0,0,0,-1],[3,6,6.25,3,1,1,0,0,0,-1],[3,7,7.25,3,1,1,0,0,0,-1],[3,8,8.25,3,1,1,0,0,0,-1],[3,9,9.25,3,1,1,0,0,0,-1],[3,10,10.25,3,1,1,0,0,0,-1],[3,11,11.25,3,1,1,0,0,0,-1],[3,12,12.25,3,1.75,1,0,0,0,-1],[3,13,14,3,1,1,0,0,0,-1],[3,14,15,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1.25,1,0,0,0,-1],[4,2,2.5,4,1.25,1,0,0,0,-1],[4,6,3.75,4,6.25,1,0,0,0,-1],[4,9,10,4,1,1,0,0,0,-1],[4,10,11,4,1,1,0,0,0,-1],[4,11,12,4,1,1,0,0,0,-1],[4,12,13,4,1,1,0,0,0,-1],[4,13,14,4,1,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [7,8.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1.5,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1.25,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1.75,1,0,0,0,-1],[5,0,0,5,1.5,1,0,0,0,-1],[5,3,2.75,5,1,1,0,0,0,-1],[5,4,3.75,5,1,1,0,0,0,-1],[5,5,4.75,5,1,1,0,0,0,-1],[5,6,4.75,6,2.25,2.25,0,0,0,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,0],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15,0,1,1,0,0,0,-1],[0,15,16,0,1,1,0,0,0,-1],[0,16,17,0,1,1,0,0,0,-1],[0,17,18.25,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4.25,1.25,1,1,0,0,0,-1],[1,5,5.25,1.25,1,1,0,0,0,-1],[1,6,6.25,1.25,1,1,0,0,0,-1],[1,7,7.25,1.25,1,1,0,0,0,-1],[1,8,8.25,1.25,1,1,0,0,0,-1],[1,9,9.25,1.25,1,1,0,0,0,-1],[1,10,10.25,1.25,1,1,0,0,0,-1],[1,11,11.25,1.25,1,1,0,0,0,-1],[1,12,12.25,1.25,1,1,0,0,0,-1],[1,13,13.25,1.25,1,1,0,0,0,-1],[1,14,14.25,1.25,1,1,0,0,0,-1],[1,15,15.25,1.25,1,1,0,0,0,-1],[1,16,16.25,1.25,1,1,0,0,0,-1],[1,17,17.25,1.25,2,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1,1,0,0,0,-1],[2,1,1,2.25,1,1,0,0,0,-1],[2,2,2,2.25,1,1,0,0,0,-1],[2,3,3,2.25,1,2,0,0,0,-1],[2,4,4.25,2.25,1.5,1,0,0,0,-1],[2,5,5.75,2.25,1,1,0,0,0,-1],[2,6,6.75,2.25,1,1,0,0,0,-1],[2,7,7.75,2.25,1,1,0,0,0,-1],[2,8,8.75,2.25,1,1,0,0,0,-1],[2,9,9.75,2.25,1,1,0,0,0,-1],[2,10,10.75,2.25,1,1,0,0,0,-1],[2,11,11.75,2.25,1,1,0,0,0,-1],[2,12,12.75,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1,1,0,0,0,-1],[2,14,14.75,2.25,1,1,0,0,0,-1],[2,15,15.75,2.25,1,1,0,0,0,-1],[2,16,16.75,2.25,1,1,0,0,0,-1],[2,17,17.75,2.25,1.5,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1,1,0,0,0,-1],[3,1,1,3.25,1,1,0,0,0,-1],[3,2,2,3.25,1,1,0,0,0,-1],[3,4,4.25,3.25,1.75,1,0,0,0,-1],[3,5,6,3.25,1,1,0,0,0,-1],[3,6,7,3.25,1,1,0,0,0,-1],[3,7,8,3.25,1,1,0,0,0,-1],[3,8,9,3.25,1,1,0,0,0,-1],[3,9,10,3.25,1,1,0,0,0,-1],[3,10,11,3.25,1,1,0,0,0,-1],[3,11,12,3.25,1,1,0,0,0,-1],[3,12,13,3.25,1,1,0,0,0,-1],[3,13,14,3.25,1,1,0,0,0,-1],[3,14,15,3.25,1,1,0,0,0,-1],[3,15,16,3.25,1,1,0,0,0,-1],[3,16,17,3.25,2.25,1,0,0,0,-1],[3,17,19.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1,1,0,0,0,-1],[4,1,1,4.25,1,1,0,0,0,-1],[4,2,2,4.25,1,1,0,0,0,-1],[4,3,3,4.25,1,2,0,0,0,-1],[4,4,4.25,4.25,2.25,1,0,0,0,-1],[4,6,6.5,4.25,1,1,0,0,0,-1],[4,7,7.5,4.25,1,1,0,0,0,-1],[4,8,8.5,4.25,1,1,0,0,0,-1],[4,9,9.5,4.25,1,1,0,0,0,-1],[4,10,10.5,4.25,1,1,0,0,0,-1],[4,11,11.5,4.25,1,1,0,0,0,-1],[4,12,12.5,4.25,1,1,0,0,0,-1],[4,13,13.5,4.25,1,1,0,0,0,-1],[4,14,14.5,4.25,1,1,0,0,0,-1],[4,16,15.5,4.25,1,1,0,0,0,-1],[4,17,16.5,4.25,1.75,1,0,0,0,-1],[4,18,18.5,4.5,1,1,0,0,0,-1],[5,1,0,5.25,2,1,0,0,0,-1],[5,2,2,5.25,1,1,0,0,0,-1],[5,4,4.25,5.25,1.25,1,0,0,0,-1],[5,5,5.5,5.25,1.25,1,0,0,0,-1],[5,6,6.75,5.25,1.25,1,0,0,0,-1],[5,10,8,5.25,6.25,1,0,0,0,-1],[5,13,14.25,5.25,1,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.5,5.5,1,1,0,0,0,-1],[5,17,18.5,5.5,1,1,0,0,0,-1],[5,18,19.5,5.5,1,1,0,0,0,-1]]], + [5.25,6.25,[[0,0,0,0,1,1,0,0,0,0],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1.25,1.25,1,1,0,0,0,-1],[1,2,2.25,1.25,1,1,0,0,0,-1],[1,3,3.25,1.25,1,1,0,0,0,-1],[1,4,4.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1,1,0,0,0,-1],[2,1,1.25,2.25,1,1,0,0,0,-1],[2,2,2.25,2.25,1,1,0,0,0,-1],[2,3,3.25,2.25,1,1,0,0,0,-1],[2,4,4.25,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1,1,0,0,0,-1],[3,1,1.25,3.25,1,1,0,0,0,-1],[3,2,2.25,3.25,1,1,0,0,0,-1],[3,3,3.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1,1,0,0,0,-1],[5,1,1.25,5.25,2,1,0,0,0,-1],[5,3,3.25,5.25,1,1,0,0,0,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,13,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,12,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.5,0,1,1,0,0,0,-1],[0,16,17.5,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[3,15,16.5,3.25,1,1,0,0,0,-1],[3,16,17.5,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1],[5,16,16.5,5.25,2,1,0,0,0,-1],[5,17,18.5,5.25,1,1,0,0,0,-1]]], + [15,5,[[0,0,0,0,1,1,0,0,-0.25,-1],[0,1,1,0,1,1,0,0,-0.25,-1],[0,2,2,0,1,1,0,0,-0.25,-1],[0,3,3,0,1,1,0,0,-0.25,-1],[0,4,4,0,1,1,0,0,-0.25,-1],[0,5,5,0,1,1,0,0,-0.25,-1],[0,6,6,0,1,1,0,0,-0.25,-1],[0,7,7,0,1,1,0,0,-0.25,-1],[0,8,8,0,1,1,0,0,-0.25,-1],[0,9,9,0,1,1,0,0,-0.25,-1],[0,10,10,0,1,1,0,0,-0.25,-1],[0,11,11,0,1,1,0,0,-0.25,-1],[0,12,12,0,1,1,0,0,-0.25,-1],[0,13,13,0,2,1,0,0,-0.25,-1],[1,0,0,1,1.5,1,0,0,-0.25,-1],[1,1,1.5,1,1,1,0,0,-0.25,-1],[1,2,2.5,1,1,1,0,0,-0.25,-1],[1,3,3.5,1,1,1,0,0,-0.25,-1],[1,4,4.5,1,1,1,0,0,-0.25,-1],[1,5,5.5,1,1,1,0,0,-0.25,-1],[1,6,6.5,1,1,1,0,0,-0.25,-1],[1,7,7.5,1,1,1,0,0,-0.25,-1],[1,8,8.5,1,1,1,0,0,-0.25,-1],[1,9,9.5,1,1,1,0,0,-0.25,-1],[1,10,10.5,1,1,1,0,0,-0.25,-1],[1,11,11.5,1,1,1,0,0,-0.25,-1],[1,12,12.5,1,1,1,0,0,-0.25,-1],[1,13,13.5,1,1.5,1,0,0,-0.25,-1],[2,0,0,2,1.75,1,0,0,-0.25,-1],[2,1,1.75,2,1,1,0,0,-0.25,-1],[2,2,2.75,2,1,1,0,0,-0.25,-1],[2,3,3.75,2,1,1,0,0,-0.25,-1],[2,4,4.75,2,1,1,0,0,-0.25,-1],[2,5,5.75,2,1,1,0,0,-0.25,-1],[2,6,6.75,2,1,1,0,0,-0.25,-1],[2,7,7.75,2,1,1,0,0,-0.25,-1],[2,8,8.75,2,1,1,0,0,-0.25,-1],[2,9,9.75,2,1,1,0,0,-0.25,-1],[2,10,10.75,2,1,1,0,0,-0.25,-1],[2,11,11.75,2,1,1,0,0,-0.25,-1],[2,12,12.75,2,2.25,1,0,0,-0.25,-1],[3,0,0,3,2.25,1,0,0,-0.25,-1],[3,2,2.25,3,1,1,0,0,-0.25,-1],[3,3,3.25,3,1,1,0,0,-0.25,-1],[3,4,4.25,3,1,1,0,0,-0.25,-1],[3,5,5.25,3,1,1,0,0,-0.25,-1],[3,6,6.25,3,1,1,0,0,-0.25,-1],[3,7,7.25,3,1,1,0,0,-0.25,-1],[3,8,8.25,3,1,1,0,0,-0.25,-1],[3,9,9.25,3,1,1,0,0,-0.25,-1],[3,10,10.25,3,1,1,0,0,-0.25,-1],[3,11,11.25,3,1,1,0,0,-0.25,-1],[3,13,12.25,3,2.75,1,0,0,-0.25,-1],[4,0,0,4,1.25,1,0,0,-0.25,-1],[4,1,1.25,4,1.25,1,0,0,-0.25,-1],[4,2,2.5,4,1.25,1,0,0,-0.25,-1],[4,6,3.75,4,6.25,1,0,0,-0.25,-1],[4,8,10,4,1.25,1,0,0,-0.25,-1],[4,9,11.25,4,1.25,1,0,0,-0.25,-1],[4,10,12.5,4,1.25,1,0,0,-0.25,-1],[4,11,13.75,4,1.25,1,0,0,-0.25,-1]]], + [16.25,5.5,[[0,0,0,0.25,1,1,0,0,0.25,-1],[0,1,1,0.25,1,1,0,0,0.25,-1],[0,2,2,0.25,1,1,0,0,0.25,-1],[0,3,3,0.25,1,1,0,0,0.25,-1],[0,4,4,0.25,1,1,0,0,0.25,-1],[0,5,5,0.25,1,1,0,0,0.25,-1],[0,6,6,0.25,1,1,0,0,0.25,-1],[0,7,7,0.25,1,1,0,0,0.25,-1],[0,8,8,0.25,1,1,0,0,0.25,-1],[0,9,9,0.25,1,1,0,0,0.25,-1],[0,10,10,0.25,1,1,0,0,0.25,-1],[0,11,11,0.25,1,1,0,0,0.25,-1],[0,12,12,0.25,1,1,0,0,0.25,-1],[0,13,13,0.25,2,1,0,0,0.25,-1],[0,14,15.25,0,1,1,0,0,0.25,0],[1,0,0,1.25,1.5,1,0,0,0.25,-1],[1,1,1.5,1.25,1,1,0,0,0.25,-1],[1,2,2.5,1.25,1,1,0,0,0.25,-1],[1,3,3.5,1.25,1,1,0,0,0.25,-1],[1,4,4.5,1.25,1,1,0,0,0.25,-1],[1,5,5.5,1.25,1,1,0,0,0.25,-1],[1,6,6.5,1.25,1,1,0,0,0.25,-1],[1,7,7.5,1.25,1,1,0,0,0.25,-1],[1,8,8.5,1.25,1,1,0,0,0.25,-1],[1,9,9.5,1.25,1,1,0,0,0.25,-1],[1,10,10.5,1.25,1,1,0,0,0.25,-1],[1,11,11.5,1.25,1,1,0,0,0.25,-1],[1,12,12.5,1.25,1,1,0,0,0.25,-1],[1,13,13.5,1.25,1.5,1,0,0,0.25,-1],[1,14,15.25,1.25,1,1,0,0,0.25,-1],[2,0,0,2.25,1.75,1,0,0,0.25,-1],[2,1,1.75,2.25,1,1,0,0,0.25,-1],[2,2,2.75,2.25,1,1,0,0,0.25,-1],[2,3,3.75,2.25,1,1,0,0,0.25,-1],[2,4,4.75,2.25,1,1,0,0,0.25,-1],[2,5,5.75,2.25,1,1,0,0,0.25,-1],[2,6,6.75,2.25,1,1,0,0,0.25,-1],[2,7,7.75,2.25,1,1,0,0,0.25,-1],[2,8,8.75,2.25,1,1,0,0,0.25,-1],[2,9,9.75,2.25,1,1,0,0,0.25,-1],[2,10,10.75,2.25,1,1,0,0,0.25,-1],[2,11,11.75,2.25,1,1,0,0,0.25,-1],[2,12,12.75,2.25,2.25,1,0,0,0.25,-1],[2,14,15.25,2.25,1,1,0,0,0.25,-1],[3,0,0,3.25,2.25,1,0,0,0.25,-1],[3,2,2.25,3.25,1,1,0,0,0.25,-1],[3,3,3.25,3.25,1,1,0,0,0.25,-1],[3,4,4.25,3.25,1,1,0,0,0.25,-1],[3,5,5.25,3.25,1,1,0,0,0.25,-1],[3,6,6.25,3.25,1,1,0,0,0.25,-1],[3,7,7.25,3.25,1,1,0,0,0.25,-1],[3,8,8.25,3.25,1,1,0,0,0.25,-1],[3,9,9.25,3.25,1,1,0,0,0.25,-1],[3,10,10.25,3.25,1,1,0,0,0.25,-1],[3,11,11.25,3.25,1,1,0,0,0.25,-1],[3,13,12.25,3.25,1.75,1,0,0,0.25,-1],[3,14,14.25,3.5,1,1,0,0,0.25,-1],[4,0,0,4.25,1.25,1,0,0,0.25,-1],[4,1,1.25,4.25,1.25,1,0,0,0.25,-1],[4,2,2.5,4.25,1.25,1,0,0,0.25,-1],[4,6,3.75,4.25,6.25,1,0,0,0.25,-1],[4,9,10,4.25,1,1,0,0,0.25,-1],[4,10,11,4.25,1,1,0,0,0.25,-1],[4,11,12,4.25,1,1,0,0,0.25,-1],[4,12,13.25,4.5,1,1,0,0,0.25,-1],[4,13,14.25,4.5,1,1,0,0,0.25,-1],[4,14,15.25,4.5,1,1,0,0,0.25,-1]]], + [16,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.75,2,1.25,2,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,1,1,0,0,0,-1],[3,13,15,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1,1,0,0,0,-1],[4,13,13.25,4,1.75,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,13,14,5,1,1,0,0,0,-1],[5,14,15,5,1,1,0,0,0,-1]]], + [19,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[0,16,16,0,1,1,0,0,0,-1],[0,17,17,0,1,1,0,0,0,-1],[0,18,18,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[1,16,16,1,1,1,0,0,0,-1],[1,17,17,1,1,1,0,0,0,-1],[1,18,18,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,14,13.5,2,1.5,1,0,0,0,-1],[2,15,15,2,1,1,0,0,0,-1],[2,16,16,2,1,1,0,0,0,-1],[2,17,17,2,1,1,0,0,0,-1],[2,18,18,2,1,2,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,2.25,1,0,0,0,-1],[3,15,15,3,1,1,0,0,0,-1],[3,16,16,3,1,1,0,0,0,-1],[3,17,17,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1.75,1,0,0,0,-1],[4,14,14,4,1,1,0,0,0,-1],[4,15,15,4,1,1,0,0,0,-1],[4,16,16,4,1,1,0,0,0,-1],[4,17,17,4,1,1,0,0,0,-1],[4,18,18,4,1,2,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,14,14,5,1,1,0,0,0,-1],[5,15,15,5,1,1,0,0,0,-1],[5,16,16,5,1,1,0,0,0,-1],[5,17,17,5,1,1,0,0,0,-1]]], + [16.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[1,14,14,1.25,1,1,0,0,0,-1],[1,15,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1,1,0,0,0,-1],[4,14,14.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.5,1,0,0,0,-1],[5,1,1.5,5.25,1.25,1,0,0,0,-1],[5,2,2.75,5.25,1.25,1,0,0,0,-1],[5,3,4,5.25,1,1,0,0,0,-1],[5,6,5,5.25,3.75,1,0,0,0,-1],[5,8,8.75,5.25,1,1,0,0,0,-1],[5,9,9.75,5.25,1,1,0,0,0,-1],[5,10,10.75,5.25,1.5,1,0,0,0,-1],[5,11,12.25,5.25,1,1,0,0,0,-1],[5,12,13.25,5.25,1,1,0,0,0,-1],[5,13,14.25,5.25,1,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1]]], + [15,5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,2,1,0,0,0,-1],[1,0,0,1,1.5,1,0,0,0,-1],[1,1,1.5,1,1,1,0,0,0,-1],[1,2,2.5,1,1,1,0,0,0,-1],[1,3,3.5,1,1,1,0,0,0,-1],[1,4,4.5,1,1,1,0,0,0,-1],[1,5,5.5,1,1,1,0,0,0,-1],[1,6,6.5,1,1,1,0,0,0,-1],[1,7,7.5,1,1,1,0,0,0,-1],[1,8,8.5,1,1,1,0,0,0,-1],[1,9,9.5,1,1,1,0,0,0,-1],[1,10,10.5,1,1,1,0,0,0,-1],[1,11,11.5,1,1,1,0,0,0,-1],[1,12,12.5,1,1,1,0,0,0,-1],[1,13,13.5,1,1.5,1,0,0,0,-1],[2,0,0,2,1.75,1,0,0,0,-1],[2,1,1.75,2,1,1,0,0,0,-1],[2,2,2.75,2,1,1,0,0,0,-1],[2,3,3.75,2,1,1,0,0,0,-1],[2,4,4.75,2,1,1,0,0,0,-1],[2,5,5.75,2,1,1,0,0,0,-1],[2,6,6.75,2,1,1,0,0,0,-1],[2,7,7.75,2,1,1,0,0,0,-1],[2,8,8.75,2,1,1,0,0,0,-1],[2,9,9.75,2,1,1,0,0,0,-1],[2,10,10.75,2,1,1,0,0,0,-1],[2,11,11.75,2,1,1,0,0,0,-1],[2,13,12.75,2,2.25,1,0,0,0,-1],[3,0,0,3,2.25,1,0,0,0,-1],[3,2,2.25,3,1,1,0,0,0,-1],[3,3,3.25,3,1,1,0,0,0,-1],[3,4,4.25,3,1,1,0,0,0,-1],[3,5,5.25,3,1,1,0,0,0,-1],[3,6,6.25,3,1,1,0,0,0,-1],[3,7,7.25,3,1,1,0,0,0,-1],[3,8,8.25,3,1,1,0,0,0,-1],[3,9,9.25,3,1,1,0,0,0,-1],[3,10,10.25,3,1,1,0,0,0,-1],[3,11,11.25,3,1,1,0,0,0,-1],[3,12,12.25,3,2.75,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1.25,1,0,0,0,-1],[4,2,2.5,4,1.25,1,0,0,0,-1],[4,6,3.75,4,6.25,1,0,0,0,-1],[4,9,10,4,1.25,1,0,0,0,-1],[4,10,11.25,4,1.25,1,0,0,0,-1],[4,11,12.5,4,1.25,1,0,0,0,-1],[4,13,13.75,4,1.25,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,19,20.5,5.25,1,1,0,0,0,-1]]], + [1.6,1.6,[[0,0,0,0,0.8,0.8,0,0,0,-1],[0,1,0.8,0,0.8,0.8,0,0,0,-1],[1,0,0,0.8,0.8,0.8,0,0,0,-1],[1,1,0.8,0.8,0.8,0.8,0,0,0,-1]]], + [3,2,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,0],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1]]], + [14.5,6.1,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,9,0.2,0.7,0.7,0,0,0,-1],[0,3,10.2,0.2,0.7,0.7,0,0,0,-1],[0,4,11.4,0.2,0.7,0.7,0,0,0,-1],[0,5,12.6,0.2,0.7,0.7,0,0,0,-1],[0,6,13.8,0.2,0.7,0.7,0,0,0,-1],[1,0,4,1.2,1,1,0,0,0,-1],[1,1,6,1.3,1,1,0,0,0,-1],[1,2,7.5,2.1,1,1,0,0,0,-1],[1,3,8.9,1.8,1,1,0,0,0,-1],[1,4,10.4,2,1,1,0,0,0,-1],[1,5,1.9,2.2,1,1,0,0,0,-1],[1,6,3.2,2.4,1,1,0,0,0,-1],[1,7,4.4,3.1,1,1,0,0,0,-1],[2,0,6,2.6,1,1,0,0,0,-1],[2,1,7.4,3.4,1,1,0,0,0,-1],[2,2,8.9,3.2,1,1,0,0,0,-1],[2,3,5.8,3.9,1,1,0,0,0,-1],[2,4,3.3,4.7,1,1,0,0,0,-1],[2,5,4.6,5.1,1,1,0,0,0,-1],[2,6,7.1,4.8,1,1,0,0,0,-1],[2,7,10.3,3.4,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[0,16,18.5,0,1,1,0,0,0,-1],[0,17,19.5,0,1,1,0,0,0,-1],[0,18,20.5,0,1,1,0,0,0,-1],[0,19,21.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1]]], + [16.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.5,0,1,1,0,0,0,-1],[0,2,2.5,0,1,1,0,0,0,-1],[0,3,3.5,0,1,1,0,0,0,-1],[0,4,4.5,0,1,1,0,0,0,-1],[0,5,5.75,0,1,1,0,0,0,-1],[0,6,6.75,0,1,1,0,0,0,-1],[0,7,7.75,0,1,1,0,0,0,-1],[0,8,8.75,0,1,1,0,0,0,-1],[0,9,10,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.5,1,0,0,0,-1],[4,14,15.5,4.25,1,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6,1,0,0,0,-1],[5,9,9.75,5.25,1,1,0,0,0,-1],[5,10,10.75,5.25,1,1,0,0,0,-1],[5,11,11.75,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [16.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[1,14,14,1.25,1,1,0,0,0,-1],[1,15,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1,1,0,0,0,-1],[4,14,14.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,8,9,5.25,1,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1.25,1,0,0,0,-1],[5,11,12.25,5.25,1,1,0,0,0,-1],[5,12,13.25,5.25,1,1,0,0,0,-1],[5,13,14.25,5.25,1,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1]]], + [2,3,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,3,0.5,1,1,1,0,0,0,0],[1,0,0,2,1,1,0,0,0,-1],[1,1,1,2,1,1,0,0,0,-1]]], + [18,6.5,[[0,0,0,0,1.05,1.05,0,0,0,0],[0,1,1.75,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6,0,1,1,0,0,0,-1],[0,6,7.25,0,1,1,0,0,0,-1],[0,7,8.25,0,1,1,0,0,0,-1],[0,8,9.25,0,1,1,0,0,0,-1],[0,9,10.25,0,1,1,0,0,0,-1],[0,10,11.5,0,1,1,0,0,0,-1],[0,11,12.5,0,1,1,0,0,0,-1],[0,12,13.5,0,1,1,0,0,0,-1],[0,13,14.5,0,1,1,0,0,0,-1],[0,14,15.75,0,1,1,0,0,0,-1],[0,15,17,0,1,1,0,0,0,-1],[1,1,1.75,1.25,1,1,0,0,0,-1],[1,2,2.75,1.25,1,1,0,0,0,-1],[1,3,3.75,1.25,1,1,0,0,0,-1],[1,4,4.75,1.25,1,1,0,0,0,-1],[1,5,5.75,1.25,1,1,0,0,0,-1],[1,6,6.75,1.25,1,1,0,0,0,-1],[1,7,7.75,1.25,1,1,0,0,0,-1],[1,8,8.75,1.25,1,1,0,0,0,-1],[1,9,9.75,1.25,1,1,0,0,0,-1],[1,10,10.75,1.25,1,1,0,0,0,-1],[1,11,11.75,1.25,1,1,0,0,0,-1],[1,12,12.75,1.25,1,1,0,0,0,-1],[1,13,13.75,1.25,1,1,0,0,0,-1],[1,14,14.75,1.25,2,1,0,0,0,-1],[1,15,17,1.25,1,1,0,0,0,-1],[2,0,0,1.75,1.05,1.05,0,0,0,-1],[2,1,1.75,2.25,1.5,1,0,0,0,-1],[2,2,3.25,2.25,1,1,0,0,0,-1],[2,3,4.25,2.25,1,1,0,0,0,-1],[2,4,5.25,2.25,1,1,0,0,0,-1],[2,5,6.25,2.25,1,1,0,0,0,-1],[2,6,7.25,2.25,1,1,0,0,0,-1],[2,7,8.25,2.25,1,1,0,0,0,-1],[2,8,9.25,2.25,1,1,0,0,0,-1],[2,9,10.25,2.25,1,1,0,0,0,-1],[2,10,11.25,2.25,1,1,0,0,0,-1],[2,11,12.25,2.25,1,1,0,0,0,-1],[2,12,13.25,2.25,1,1,0,0,0,-1],[2,13,14.25,2.25,1,1,0,0,0,-1],[2,14,15.5,2.25,1.25,2,0,0,0,-1],[2,15,17,2.25,1,1,0,0,0,-1],[3,0,0,2.8,1.05,1.05,0,0,0,-1],[3,1,1.75,3.25,1.75,1,0,0,0,-1],[3,2,3.5,3.25,1,1,0,0,0,-1],[3,3,4.5,3.25,1,1,0,0,0,-1],[3,4,5.5,3.25,1,1,0,0,0,-1],[3,5,6.5,3.25,1,1,0,0,0,-1],[3,6,7.5,3.25,1,1,0,0,0,-1],[3,7,8.5,3.25,1,1,0,0,0,-1],[3,8,9.5,3.25,1,1,0,0,0,-1],[3,9,10.5,3.25,1,1,0,0,0,-1],[3,10,11.5,3.25,1,1,0,0,0,-1],[3,11,12.5,3.25,1,1,0,0,0,-1],[3,12,13.5,3.25,1,1,0,0,0,-1],[3,13,14.5,3.25,1,1,0,0,0,-1],[3,14,17,3.25,1,1,0,0,0,-1],[4,0,0,3.85,1.05,1.05,0,0,0,-1],[4,1,1.75,4.25,1.25,1,0,0,0,-1],[4,2,3,4.25,1,1,0,0,0,-1],[4,3,4,4.25,1,1,0,0,0,-1],[4,4,5,4.25,1,1,0,0,0,-1],[4,5,6,4.25,1,1,0,0,0,-1],[4,6,7,4.25,1,1,0,0,0,-1],[4,7,8,4.25,1,1,0,0,0,-1],[4,8,9,4.25,1,1,0,0,0,-1],[4,9,10,4.25,1,1,0,0,0,-1],[4,10,11,4.25,1,1,0,0,0,-1],[4,11,12,4.25,1,1,0,0,0,-1],[4,12,13,4.25,1,1,0,0,0,-1],[4,14,14,4.25,1.7,1,0,0,0,-1],[4,15,16,4.5,1,1,0,0,0,-1],[5,0,0,4.9,1.05,1.05,0,0,0,-1],[5,1,1.75,5.25,1.25,1,0,0,0,-1],[5,2,3,5.25,1.25,1,0,0,0,-1],[5,3,4.25,5.25,1.25,1,0,0,0,-1],[5,6,5.5,5.25,6.25,1,0,0,0,-1],[5,10,11.75,5.25,1,1,0,0,0,-1],[5,11,12.75,5.25,1,1,0,0,0,-1],[5,12,13.75,5.25,1,1,0,0,0,-1],[5,13,15,5.5,1,1,0,0,0,-1],[5,14,16,5.5,1,1,0,0,0,-1],[5,15,17,5.5,1,1,0,0,0,-1]]], + [16.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[3,14,14,1.25,1,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,13,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1,1,0,0,0,-1],[4,14,14.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,8,9,5.25,1.25,1,0,0,0,-1],[5,9,10.25,5.25,1,1,0,0,0,-1],[5,10,11.25,5.25,1,1,0,0,0,-1],[5,11,12.25,5.25,1,1,0,0,0,-1],[5,12,13.25,5.25,1,1,0,0,0,-1],[5,13,14.25,5.25,1,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[3,14,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,15,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[4,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,14,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[5,5,14,0,1,1,0,0,0,0],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[3,12,14,1.25,1,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,14,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,8,9,5.25,1,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[5,5,14,0,1,1,0,0,0,0],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,14,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [22.65,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.5,0,1,1,0,0,0,-1],[0,2,2.5,0,1,1,0,0,0,-1],[0,3,3.5,0,1,1,0,0,0,-1],[0,4,4.5,0,1,1,0,0,0,-1],[0,5,5.75,0,1,1,0,0,0,-1],[0,6,6.75,0,1,1,0,0,0,-1],[0,7,7.75,0,1,1,0,0,0,-1],[0,8,8.75,0,1,1,0,0,0,-1],[0,9,10,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14.25,0,1,1,0,0,0,0],[0,14,15.4,0,1,1,0,0,0,-1],[0,15,16.4,0,1,1,0,0,0,-1],[0,16,17.4,0,1,1,0,0,0,-1],[0,17,18.65,0,1,1,0,0,0,-1],[0,18,19.65,0,1,1,0,0,0,-1],[0,19,20.65,0,1,1,0,0,0,-1],[0,20,21.65,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.35,1.25,1,1,0,0,0,-1],[1,15,16.35,1.25,1,1,0,0,0,-1],[1,16,17.35,1.25,1,1,0,0,0,-1],[1,17,18.6,1.25,1,1,0,0,0,-1],[1,18,19.6,1.25,1,1,0,0,0,-1],[1,19,20.6,1.25,1,1,0,0,0,-1],[1,20,21.6,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.35,2.25,1,1,0,0,0,-1],[2,15,16.35,2.25,1,1,0,0,0,-1],[2,16,17.35,2.25,1,1,0,0,0,-1],[2,17,18.6,2.25,1,1,0,0,0,-1],[2,18,19.6,2.25,1,1,0,0,0,-1],[2,19,20.6,2.25,1,1,0,0,0,-1],[2,20,21.6,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.6,3.25,1,1,0,0,0,-1],[3,18,19.6,3.25,1,1,0,0,0,-1],[3,19,20.6,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.35,4.25,1,1,0,0,0,-1],[4,17,18.6,4.25,1,1,0,0,0,-1],[4,18,19.6,4.25,1,1,0,0,0,-1],[4,19,20.6,4.25,1,1,0,0,0,-1],[4,20,21.6,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.35,5.25,1,1,0,0,0,-1],[5,15,16.35,5.25,1,1,0,0,0,-1],[5,16,17.35,5.25,1,1,0,0,0,-1],[5,17,18.6,5.25,2,1,0,0,0,-1],[5,18,20.6,5.25,1,1,0,0,0,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[5,5,14,0,1,1,0,0,0,0],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,13,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,14,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[3,15,17.25,5.25,1,1,0,0,0,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.5,0,1,1,0,0,0,-1],[0,16,17.5,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,13,15.25,3.25,1,1,0,0,0,-1],[3,15,16.5,3.25,1,1,0,0,0,-1],[3,16,17.5,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,12,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1],[5,16,16.5,5.25,2,1,0,0,0,-1],[5,17,18.5,5.25,1,1,0,0,0,-1]]], + [16.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,14,15.25,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.5,2,1.5,1,0,0,0,-1],[2,14,15.25,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,2.25,1,0,0,0,-1],[3,13,15.25,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,12,11.25,4,1,1,0,0,0,-1],[4,13,12.25,4,1.75,1,0,0,0,-1],[4,14,14.25,4.25,1,1,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13.25,5.25,1,1,0,0,0,-1],[5,13,14.25,5.25,1,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1]]], + [19.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[0,16,18.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,13,15.5,3.25,1,1,0,0,0,-1],[3,14,16.5,3.25,1,1,0,0,0,-1],[3,15,17.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[4,14,15.5,4.25,1,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1,1,0,0,0,-1],[5,11,11,5.25,1,1,0,0,0,-1],[5,12,12,5.25,1,1,0,0,0,-1],[5,13,13.25,5.5,1,1,0,0,0,-1],[5,14,14.25,5.5,1,1,0,0,0,-1],[5,15,15.25,5.5,1,1,0,0,0,-1],[5,16,16.5,5.25,1,1,0,0,0,-1],[5,17,17.5,5.25,1,1,0,0,0,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,15,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1,1,0,0,0,-1],[5,11,11,5.25,1,1,0,0,0,-1],[5,12,12,5.25,1,1,0,0,0,-1],[5,13,13.25,5.5,1,1,0,0,0,-1],[5,14,14.25,5.5,1,1,0,0,0,-1],[5,15,15.25,5.5,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[5,5,14,0,1,1,0,0,0,0],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,14,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[3,13,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,14,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,12,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,9,17.25,5.25,1,1,0,0,0,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,15,16.5,0,1,1,0,0,0,-1],[0,16,17.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,2.25,1,0,0,0,-1],[3,15,16.5,3.25,1,1,0,0,0,-1],[3,16,17.5,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,2,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,16,16.5,5.25,2,1,0,0,0,-1],[5,17,18.5,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.5,0,1,1,0,0,0,-1],[0,16,17.5,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[3,15,16.5,3.25,1,1,0,0,0,-1],[3,16,17.5,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,2,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,11,11,5.25,1,1,0,0,0,-1],[5,12,12,5.25,1,1,0,0,0,-1],[5,16,16.5,5.25,2,1,0,0,0,-1],[5,17,18.5,5.25,1,1,0,0,0,-1],[5,13,13.25,5.5,1,1,0,0,0,-1],[5,14,14.25,5.5,1,1,0,0,0,-1],[5,15,15.25,5.5,1,1,0,0,0,-1]]], + [16,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.5,2,1.5,1,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,2.25,1,0,0,0,-1],[3,14,15,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1.75,1,0,0,0,-1],[4,13,14,4,1,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,13,14,5,1,1,0,0,0,-1],[5,14,15,5,1,1,0,0,0,-1]]], + [16,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.75,2,1.25,2,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,1,1,0,0,0,-1],[3,13,15,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1.75,1,0,0,0,-1],[4,13,14,4,1,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,13,14,5,1,1,0,0,0,-1],[5,14,15,5,1,1,0,0,0,-1]]], + [16.3,6.4,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,8,7.5,0,1,1,0,0,0,-1],[0,9,8.5,0,1,1,0,0,0,-1],[0,10,9.75,0,1,1,0,0,0,-1],[0,11,10.75,0,1,1,0,0,0,-1],[0,12,11.75,0,1,1,0,0,0,-1],[0,13,12.75,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15.3,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,8,7,1.25,1,1,0,0,0,-1],[1,9,8,1.25,1,1,0,0,0,-1],[1,10,9,1.25,1,1,0,0,0,-1],[1,11,10,1.25,1,1,0,0,0,-1],[1,12,11,1.25,1,1,0,0,0,-1],[1,13,12,1.25,1,1,0,0,0,-1],[1,14,13,1.25,2,1,0,0,0,-1],[1,15,15.3,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,8,7.5,2.25,1,1,0,0,0,-1],[2,9,8.5,2.25,1,1,0,0,0,-1],[2,10,9.5,2.25,1,1,0,0,0,-1],[2,11,10.5,2.25,1,1,0,0,0,-1],[2,12,11.5,2.25,1,1,0,0,0,-1],[2,13,12.5,2.25,1,1,0,0,0,-1],[2,14,13.5,2.25,1.5,1,0,0,0,-1],[2,15,15.3,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,8,7.75,3.25,1,1,0,0,0,-1],[3,9,8.75,3.25,1,1,0,0,0,-1],[3,10,9.75,3.25,1,1,0,0,0,-1],[3,11,10.75,3.25,1,1,0,0,0,-1],[3,12,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,2.25,1,0,0,0,-1],[3,15,15.3,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,8,7.25,4.25,1,1,0,0,0,-1],[4,9,8.25,4.25,1,1,0,0,0,-1],[4,10,9.25,4.25,1,1,0,0,0,-1],[4,11,10.25,4.25,1,1,0,0,0,-1],[4,12,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.15,4.4,1,1,0,0,0,-1],[4,15,15.3,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1,1,0,0,0,-1],[5,11,11,5.25,1,1,0,0,0,-1],[5,12,12,5.25,1,1,0,0,0,-1],[5,13,13.15,5.4,1,1,0,0,0,-1],[5,14,14.15,5.4,1,1,0,0,0,-1],[5,15,15.15,5.4,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[0,16,18.5,0,1,1,0,0,0,-1],[0,17,19.5,0,1,1,0,0,0,-1],[0,18,20.5,0,1,1,0,0,0,-1],[0,19,21.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [19,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[0,16,16,0,1,1,0,0,0,-1],[0,17,17,0,1,1,0,0,0,-1],[0,18,18,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,14,13,1,2,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[1,16,16,1,1,1,0,0,0,-1],[1,17,17,1,1,1,0,0,0,-1],[1,18,18,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.5,2,1.5,1,0,0,0,-1],[2,15,15,2,1,1,0,0,0,-1],[2,16,16,2,1,1,0,0,0,-1],[2,17,17,2,1,1,0,0,0,-1],[2,18,18,2,1,2,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,13,12.75,3,2.25,1,0,0,0,-1],[3,15,15,3,1,1,0,0,0,-1],[3,16,16,3,1,1,0,0,0,-1],[3,17,17,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,13,12.25,4,1.75,1,0,0,0,-1],[4,14,14,4,1,1,0,0,0,-1],[4,15,15,4,1,1,0,0,0,-1],[4,16,16,4,1,1,0,0,0,-1],[4,17,17,4,1,1,0,0,0,-1],[4,18,18,4,1,2,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,10,10,5,1,1,0,0,0,-1],[5,11,11,5,1,1,0,0,0,-1],[5,12,12,5,1,1,0,0,0,-1],[5,13,13,5,1,1,0,0,0,-1],[5,14,14,5,1,1,0,0,0,-1],[5,15,15,5,1,1,0,0,0,-1],[5,16,16,5,1,1,0,0,0,-1],[5,17,17,5,1,1,0,0,0,-1]]], + [16,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,1,1,0,0,0,-1],[1,14,14,1,1,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.75,2,1.25,2,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,1,1,0,0,0,-1],[3,13,15,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1,1,0,0,0,-1],[4,13,13.25,4,1,1,0,0,0,-1],[4,14,14.25,4,1,1,0,0,0,-1],[5,0,0,5,1,1,0,0,0,-1],[5,1,1,5,1,1,0,0,0,-1],[5,2,2,5,1,1,0,0,0,-1],[5,3,3,5,1,1,0,0,0,-1],[5,6,4,5,5,1,0,0,0,-1],[5,8,9,5,1,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,13,14,5,1,1,0,0,0,-1],[5,14,15,5,1,1,0,0,0,-1]]], + [15,5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,2,1,0,0,0,-1],[1,0,0,1,1.5,1,0,0,0,-1],[1,1,1.5,1,1,1,0,0,0,-1],[1,2,2.5,1,1,1,0,0,0,-1],[1,3,3.5,1,1,1,0,0,0,-1],[1,4,4.5,1,1,1,0,0,0,-1],[1,5,5.5,1,1,1,0,0,0,-1],[1,6,6.5,1,1,1,0,0,0,-1],[1,7,7.5,1,1,1,0,0,0,-1],[1,8,8.5,1,1,1,0,0,0,-1],[1,9,9.5,1,1,1,0,0,0,-1],[1,10,10.5,1,1,1,0,0,0,-1],[1,11,11.5,1,1,1,0,0,0,-1],[1,12,12.5,1,1,1,0,0,0,-1],[1,13,13.5,1,1.5,1,0,0,0,-1],[2,0,0,2,1.75,1,0,0,0,-1],[2,1,1.75,2,1,1,0,0,0,-1],[2,2,2.75,2,1,1,0,0,0,-1],[2,3,3.75,2,1,1,0,0,0,-1],[2,4,4.75,2,1,1,0,0,0,-1],[2,5,5.75,2,1,1,0,0,0,-1],[2,6,6.75,2,1,1,0,0,0,-1],[2,7,7.75,2,1,1,0,0,0,-1],[2,8,8.75,2,1,1,0,0,0,-1],[2,9,9.75,2,1,1,0,0,0,-1],[2,10,10.75,2,1,1,0,0,0,-1],[2,11,11.75,2,1,1,0,0,0,-1],[2,12,12.75,2,2.25,1,0,0,0,-1],[3,0,0,3,2.25,1,0,0,0,-1],[3,2,2.25,3,1,1,0,0,0,-1],[3,3,3.25,3,1,1,0,0,0,-1],[3,4,4.25,3,1,1,0,0,0,-1],[3,5,5.25,3,1,1,0,0,0,-1],[3,6,6.25,3,1,1,0,0,0,-1],[3,7,7.25,3,1,1,0,0,0,-1],[3,8,8.25,3,1,1,0,0,0,-1],[3,9,9.25,3,1,1,0,0,0,-1],[3,10,10.25,3,1,1,0,0,0,-1],[3,12,11.25,3,1,1,0,0,0,-1],[3,13,12.25,3,2.75,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1.25,1,0,0,0,-1],[4,2,2.5,4,1.25,1,0,0,0,-1],[4,6,3.75,4,6.25,1,0,0,0,-1],[4,10,10,4,1.25,1,0,0,0,-1],[4,11,11.25,4,1.25,1,0,0,0,-1],[4,12,12.5,4,1.25,1,0,0,0,-1],[4,13,13.75,4,1.25,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[1,14,14,1.25,1,1,0,0,0,-1],[1,15,15.25,1.25,1,1,0,0,0,-1],[1,16,16.25,1.25,1,1,0,0,0,-1],[1,17,17.25,1.25,1,1,0,0,0,-1],[1,18,18.5,1.25,1,1,0,0,0,-1],[1,19,19.5,1.25,1,1,0,0,0,-1],[1,20,20.5,1.25,1,1,0,0,0,-1],[1,21,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,15,15.25,2.25,1,1,0,0,0,-1],[2,16,16.25,2.25,1,1,0,0,0,-1],[2,17,17.25,2.25,1,1,0,0,0,-1],[2,18,18.5,2.25,1,1,0,0,0,-1],[2,19,19.5,2.25,1,1,0,0,0,-1],[2,20,20.5,2.25,1,1,0,0,0,-1],[2,21,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,18,18.5,3.25,1,1,0,0,0,-1],[3,19,19.5,3.25,1,1,0,0,0,-1],[3,20,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,16,16.25,4.25,1,1,0,0,0,-1],[4,18,18.5,4.25,1,1,0,0,0,-1],[4,19,19.5,4.25,1,1,0,0,0,-1],[4,20,20.5,4.25,1,1,0,0,0,-1],[4,21,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,9,9,5.25,1,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,15,15.25,5.25,1,1,0,0,0,-1],[5,16,16.25,5.25,1,1,0,0,0,-1],[5,17,17.25,5.25,1,1,0,0,0,-1],[5,18,18.5,5.25,2,1,0,0,0,-1],[5,19,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[3,13,14,1.25,1,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,9,9,5.25,1,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,19,20.5,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,14,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,14,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,19,20.5,5.25,1,1,0,0,0,-1]]], + [5,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[2,0,0,2,1,1,0,0,0,-1],[2,1,1,2,1,1,0,0,0,-1],[2,2,2,2,1,1,0,0,0,-1],[2,3,3,2,1,1,0,0,0,-1],[2,4,4,2,1,2,0,0,0,-1],[3,0,0,3,1,1,0,0,0,-1],[3,1,1,3,1,1,0,0,0,-1],[3,2,2,3,1,1,0,0,0,-1],[3,3,3,3,1,1,0,0,0,-1],[4,0,0,4,1,1,0,0,0,-1],[4,1,1,4,1,1,0,0,0,-1],[4,2,2,4,1,1,0,0,0,-1],[4,3,3,4,1,1,0,0,0,-1],[4,4,4,4,1,2,0,0,0,-1],[5,0,0,5,1,1,0,0,0,-1],[5,2,1,5,2,1,0,0,0,-1],[5,3,3,5,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1]]], + [16.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,14,15.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,14,15.5,4.25,1,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,15,15.25,0,1,1,0,0,0,-1],[0,16,16.25,0,1,1,0,0,0,-1],[0,17,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[1,14,14,1.25,1,1,0,0,0,-1],[1,15,15.25,1.25,1,1,0,0,0,-1],[1,16,16.25,1.25,1,1,0,0,0,-1],[1,17,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,15,15.25,2.25,1,1,0,0,0,-1],[2,16,16.25,2.25,1,1,0,0,0,-1],[2,17,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,16,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,9,9,5.25,1,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,15,15.25,5.25,1,1,0,0,0,-1],[5,16,16.25,5.25,1,1,0,0,0,-1],[5,17,17.25,5.25,1,1,0,0,0,-1]]], + [16,5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,2,1,0,0,0,-1],[0,14,15,0,1,1,0,0,0,-1],[1,0,0,1,1.5,1,0,0,0,-1],[1,1,1.5,1,1,1,0,0,0,-1],[1,2,2.5,1,1,1,0,0,0,-1],[1,3,3.5,1,1,1,0,0,0,-1],[1,4,4.5,1,1,1,0,0,0,-1],[1,5,5.5,1,1,1,0,0,0,-1],[1,6,6.5,1,1,1,0,0,0,-1],[1,7,7.5,1,1,1,0,0,0,-1],[1,8,8.5,1,1,1,0,0,0,-1],[1,9,9.5,1,1,1,0,0,0,-1],[1,10,10.5,1,1,1,0,0,0,-1],[1,11,11.5,1,1,1,0,0,0,-1],[1,12,12.5,1,1,1,0,0,0,-1],[1,13,13.5,1,1.5,1,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.75,1,0,0,0,-1],[2,1,1.75,2,1,1,0,0,0,-1],[2,2,2.75,2,1,1,0,0,0,-1],[2,3,3.75,2,1,1,0,0,0,-1],[2,4,4.75,2,1,1,0,0,0,-1],[2,5,5.75,2,1,1,0,0,0,-1],[2,6,6.75,2,1,1,0,0,0,-1],[2,7,7.75,2,1,1,0,0,0,-1],[2,8,8.75,2,1,1,0,0,0,-1],[2,9,9.75,2,1,1,0,0,0,-1],[2,10,10.75,2,1,1,0,0,0,-1],[2,11,11.75,2,1,1,0,0,0,-1],[2,13,12.75,2,2.25,1,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,2.25,1,0,0,0,-1],[3,2,2.25,3,1,1,0,0,0,-1],[3,3,3.25,3,1,1,0,0,0,-1],[3,4,4.25,3,1,1,0,0,0,-1],[3,5,5.25,3,1,1,0,0,0,-1],[3,6,6.25,3,1,1,0,0,0,-1],[3,7,7.25,3,1,1,0,0,0,-1],[3,8,8.25,3,1,1,0,0,0,-1],[3,9,9.25,3,1,1,0,0,0,-1],[3,10,10.25,3,1,1,0,0,0,-1],[3,11,11.25,3,1,1,0,0,0,-1],[3,12,12.25,3,1.75,1,0,0,0,-1],[3,13,14,3,1,1,0,0,0,-1],[3,14,15,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1.25,1,0,0,0,-1],[4,2,2.5,4,1.25,1,0,0,0,-1],[4,6,3.75,4,6.25,1,0,0,0,-1],[4,9,10,4,1,1,0,0,0,-1],[4,10,11,4,1,1,0,0,0,-1],[4,11,12,4,1,1,0,0,0,-1],[4,12,13,4,1,1,0,0,0,-1],[4,13,14,4,1,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1]]], + [16,5,[[0,0,0,0,1,1,0,0,-0.25,-1],[0,1,1,0,1,1,0,0,-0.25,-1],[0,2,2,0,1,1,0,0,-0.25,-1],[0,3,3,0,1,1,0,0,-0.25,-1],[0,4,4,0,1,1,0,0,-0.25,-1],[0,5,5,0,1,1,0,0,-0.25,-1],[0,6,6,0,1,1,0,0,-0.25,-1],[0,7,7,0,1,1,0,0,-0.25,-1],[0,8,8,0,1,1,0,0,-0.25,-1],[0,9,9,0,1,1,0,0,-0.25,-1],[0,10,10,0,1,1,0,0,-0.25,-1],[0,11,11,0,1,1,0,0,-0.25,-1],[0,12,12,0,1,1,0,0,-0.25,-1],[0,13,13,0,2,1,0,0,-0.25,-1],[0,14,15,0,1,1,0,0,-0.25,-1],[1,0,0,1,1.5,1,0,0,-0.25,-1],[1,1,1.5,1,1,1,0,0,-0.25,-1],[1,2,2.5,1,1,1,0,0,-0.25,-1],[1,3,3.5,1,1,1,0,0,-0.25,-1],[1,4,4.5,1,1,1,0,0,-0.25,-1],[1,5,5.5,1,1,1,0,0,-0.25,-1],[1,6,6.5,1,1,1,0,0,-0.25,-1],[1,7,7.5,1,1,1,0,0,-0.25,-1],[1,8,8.5,1,1,1,0,0,-0.25,-1],[1,9,9.5,1,1,1,0,0,-0.25,-1],[1,10,10.5,1,1,1,0,0,-0.25,-1],[1,11,11.5,1,1,1,0,0,-0.25,-1],[1,12,12.5,1,1,1,0,0,-0.25,-1],[1,13,13.5,1,1.5,1,0,0,-0.25,-1],[1,14,15,1,1,1,0,0,-0.25,-1],[2,0,0,2,1.75,1,0,0,-0.25,-1],[2,1,1.75,2,1,1,0,0,-0.25,-1],[2,2,2.75,2,1,1,0,0,-0.25,-1],[2,3,3.75,2,1,1,0,0,-0.25,-1],[2,4,4.75,2,1,1,0,0,-0.25,-1],[2,5,5.75,2,1,1,0,0,-0.25,-1],[2,6,6.75,2,1,1,0,0,-0.25,-1],[2,7,7.75,2,1,1,0,0,-0.25,-1],[2,8,8.75,2,1,1,0,0,-0.25,-1],[2,9,9.75,2,1,1,0,0,-0.25,-1],[2,10,10.75,2,1,1,0,0,-0.25,-1],[2,11,11.75,2,1,1,0,0,-0.25,-1],[2,12,12.75,2,2.25,1,0,0,-0.25,-1],[2,14,15,2,1,1,0,0,-0.25,-1],[3,0,0,3,2.25,1,0,0,-0.25,-1],[3,2,2.25,3,1,1,0,0,-0.25,-1],[3,3,3.25,3,1,1,0,0,-0.25,-1],[3,4,4.25,3,1,1,0,0,-0.25,-1],[3,5,5.25,3,1,1,0,0,-0.25,-1],[3,6,6.25,3,1,1,0,0,-0.25,-1],[3,7,7.25,3,1,1,0,0,-0.25,-1],[3,8,8.25,3,1,1,0,0,-0.25,-1],[3,9,9.25,3,1,1,0,0,-0.25,-1],[3,10,10.25,3,1,1,0,0,-0.25,-1],[3,11,11.25,3,1,1,0,0,-0.25,-1],[3,12,12.25,3,1.75,1,0,0,-0.25,-1],[3,13,14,3,1,1,0,0,-0.25,-1],[3,14,15,3,1,1,0,0,-0.25,-1],[4,0,0,4,1.25,1,0,0,-0.25,-1],[4,1,1.25,4,1.25,1,0,0,-0.25,-1],[4,2,2.5,4,1.25,1,0,0,-0.25,-1],[4,6,3.75,4,6.25,1,0,0,-0.25,-1],[4,9,10,4,1,1,0,0,-0.25,-1],[4,10,11,4,1,1,0,0,-0.25,-1],[4,11,12,4,1,1,0,0,-0.25,-1],[4,12,13,4,1,1,0,0,-0.25,-1],[4,13,14,4,1,1,0,0,-0.25,-1],[4,14,15,4,1,1,0,0,-0.25,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,13,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,12,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [19.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.4,0,1,1,0,0,0,-1],[0,2,2.4,0,1,1,0,0,0,-1],[0,3,3.4,0,1,1,0,0,0,-1],[0,4,4.4,0,1,1,0,0,0,-1],[0,5,5.8,0,1,1,0,0,0,-1],[0,6,6.8,0,1,1,0,0,0,-1],[0,7,7.8,0,1,1,0,0,0,-1],[0,8,8.8,0,1,1,0,0,0,-1],[0,9,10.2,0,1,1,0,0,0,-1],[0,10,11.2,0,1,1,0,0,0,-1],[0,11,12.2,0,1,1,0,0,0,-1],[0,12,13.2,0,1,1,0,0,0,-1],[0,16,17.45,0,1,1,0,0,0,-1],[0,17,18.45,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,15,15.5,3.25,1,1,0,0,0,-1],[3,16,16.5,3.25,1,1,0,0,0,-1],[3,17,17.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[4,14,15.5,4.25,1,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1],[5,15,16.5,5.25,1,1,0,0,0,-1],[5,16,17.5,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[3,14,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,15,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[4,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,14,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [16,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.75,2,1.25,2,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,1,1,0,0,0,-1],[3,14,15,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1.75,1,0,0,0,-1],[4,13,14,4,1,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,13,14,5,1,1,0,0,0,-1],[5,14,15,5,1,1,0,0,0,-1]]], + [16.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,14,15.5,4.25,1,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [16.25,5.5,[[0,0,0,0.25,1,1,0,0,0.25,-1],[0,1,1,0.25,1,1,0,0,0.25,-1],[0,2,2,0.25,1,1,0,0,0.25,-1],[0,3,3,0.25,1,1,0,0,0.25,-1],[0,4,4,0.25,1,1,0,0,0.25,-1],[0,5,5,0.25,1,1,0,0,0.25,-1],[0,6,6,0.25,1,1,0,0,0.25,-1],[0,7,7,0.25,1,1,0,0,0.25,-1],[0,8,8,0.25,1,1,0,0,0.25,-1],[0,9,9,0.25,1,1,0,0,0.25,-1],[0,10,10,0.25,1,1,0,0,0.25,-1],[0,11,11,0.25,1,1,0,0,0.25,-1],[0,12,12,0.25,1,1,0,0,0.25,-1],[0,13,13,0.25,2,1,0,0,0.25,-1],[0,14,15.25,0,1,1,0,0,0.25,0],[1,0,0,1.25,1.5,1,0,0,0.25,-1],[1,1,1.5,1.25,1,1,0,0,0.25,-1],[1,2,2.5,1.25,1,1,0,0,0.25,-1],[1,3,3.5,1.25,1,1,0,0,0.25,-1],[1,4,4.5,1.25,1,1,0,0,0.25,-1],[1,5,5.5,1.25,1,1,0,0,0.25,-1],[1,6,6.5,1.25,1,1,0,0,0.25,-1],[1,7,7.5,1.25,1,1,0,0,0.25,-1],[1,8,8.5,1.25,1,1,0,0,0.25,-1],[1,9,9.5,1.25,1,1,0,0,0.25,-1],[1,10,10.5,1.25,1,1,0,0,0.25,-1],[1,11,11.5,1.25,1,1,0,0,0.25,-1],[1,12,12.5,1.25,1,1,0,0,0.25,-1],[1,13,13.5,1.25,1.5,1,0,0,0.25,-1],[1,14,15.25,1.25,1,1,0,0,0.25,-1],[2,0,0,2.25,1.75,1,0,0,0.25,-1],[2,1,1.75,2.25,1,1,0,0,0.25,-1],[2,2,2.75,2.25,1,1,0,0,0.25,-1],[2,3,3.75,2.25,1,1,0,0,0.25,-1],[2,4,4.75,2.25,1,1,0,0,0.25,-1],[2,5,5.75,2.25,1,1,0,0,0.25,-1],[2,6,6.75,2.25,1,1,0,0,0.25,-1],[2,7,7.75,2.25,1,1,0,0,0.25,-1],[2,8,8.75,2.25,1,1,0,0,0.25,-1],[2,9,9.75,2.25,1,1,0,0,0.25,-1],[2,10,10.75,2.25,1,1,0,0,0.25,-1],[2,11,11.75,2.25,1,1,0,0,0.25,-1],[2,13,12.75,2.25,2.25,1,0,0,0.25,-1],[2,14,15.25,2.25,1,1,0,0,0.25,-1],[3,0,0,3.25,2.25,1,0,0,0.25,-1],[3,2,2.25,3.25,1,1,0,0,0.25,-1],[3,3,3.25,3.25,1,1,0,0,0.25,-1],[3,4,4.25,3.25,1,1,0,0,0.25,-1],[3,5,5.25,3.25,1,1,0,0,0.25,-1],[3,6,6.25,3.25,1,1,0,0,0.25,-1],[3,7,7.25,3.25,1,1,0,0,0.25,-1],[3,8,8.25,3.25,1,1,0,0,0.25,-1],[3,9,9.25,3.25,1,1,0,0,0.25,-1],[3,10,10.25,3.25,1,1,0,0,0.25,-1],[3,11,11.25,3.25,1,1,0,0,0.25,-1],[3,12,12.25,3.25,1.75,1,0,0,0.25,-1],[3,13,14.25,3.5,1,1,0,0,0.25,-1],[4,0,0,4.25,1.25,1,0,0,0.25,-1],[4,1,1.25,4.25,1.25,1,0,0,0.25,-1],[4,2,2.5,4.25,1.25,1,0,0,0.25,-1],[4,6,3.75,4.25,6.25,1,0,0,0.25,-1],[4,9,10,4.25,1,1,0,0,0.25,-1],[4,10,11,4.25,1,1,0,0,0.25,-1],[4,11,12,4.25,1,1,0,0,0.25,-1],[4,12,13.25,4.5,1,1,0,0,0.25,-1],[4,13,14.25,4.5,1,1,0,0,0.25,-1],[4,14,15.25,4.5,1,1,0,0,0.25,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [16,5,[[0,0,0,0,1,1,0,0,-0.25,-1],[0,1,1,0,1,1,0,0,-0.25,-1],[0,2,2,0,1,1,0,0,-0.25,-1],[0,3,3,0,1,1,0,0,-0.25,-1],[0,4,4,0,1,1,0,0,-0.25,-1],[0,5,5,0,1,1,0,0,-0.25,-1],[0,6,6,0,1,1,0,0,-0.25,-1],[0,7,7,0,1,1,0,0,-0.25,-1],[0,8,8,0,1,1,0,0,-0.25,-1],[0,9,9,0,1,1,0,0,-0.25,-1],[0,10,10,0,1,1,0,0,-0.25,-1],[0,11,11,0,1,1,0,0,-0.25,-1],[0,12,12,0,1,1,0,0,-0.25,-1],[0,13,13,0,2,1,0,0,-0.25,-1],[0,14,15,0,1,1,0,0,-0.25,-1],[1,0,0,1,1.5,1,0,0,-0.25,-1],[1,1,1.5,1,1,1,0,0,-0.25,-1],[1,2,2.5,1,1,1,0,0,-0.25,-1],[1,3,3.5,1,1,1,0,0,-0.25,-1],[1,4,4.5,1,1,1,0,0,-0.25,-1],[1,5,5.5,1,1,1,0,0,-0.25,-1],[1,6,6.5,1,1,1,0,0,-0.25,-1],[1,7,7.5,1,1,1,0,0,-0.25,-1],[1,8,8.5,1,1,1,0,0,-0.25,-1],[1,9,9.5,1,1,1,0,0,-0.25,-1],[1,10,10.5,1,1,1,0,0,-0.25,-1],[1,11,11.5,1,1,1,0,0,-0.25,-1],[1,12,12.5,1,1,1,0,0,-0.25,-1],[1,13,13.75,1,1.25,2,0,0,-0.25,-1],[1,14,15,1,1,1,0,0,-0.25,-1],[2,0,0,2,1.75,1,0,0,-0.25,-1],[2,1,1.75,2,1,1,0,0,-0.25,-1],[2,2,2.75,2,1,1,0,0,-0.25,-1],[2,3,3.75,2,1,1,0,0,-0.25,-1],[2,4,4.75,2,1,1,0,0,-0.25,-1],[2,5,5.75,2,1,1,0,0,-0.25,-1],[2,6,6.75,2,1,1,0,0,-0.25,-1],[2,7,7.75,2,1,1,0,0,-0.25,-1],[2,8,8.75,2,1,1,0,0,-0.25,-1],[2,9,9.75,2,1,1,0,0,-0.25,-1],[2,10,10.75,2,1,1,0,0,-0.25,-1],[2,11,11.75,2,1,1,0,0,-0.25,-1],[2,12,12.75,2,1,1,0,0,-0.25,-1],[2,14,15,2,1,1,0,0,-0.25,-1],[3,0,0,3,1.25,1,0,0,-0.25,-1],[3,1,1.25,3,1,1,0,0,-0.25,-1],[3,2,2.25,3,1,1,0,0,-0.25,-1],[3,3,3.25,3,1,1,0,0,-0.25,-1],[3,4,4.25,3,1,1,0,0,-0.25,-1],[3,5,5.25,3,1,1,0,0,-0.25,-1],[3,6,6.25,3,1,1,0,0,-0.25,-1],[3,7,7.25,3,1,1,0,0,-0.25,-1],[3,8,8.25,3,1,1,0,0,-0.25,-1],[3,9,9.25,3,1,1,0,0,-0.25,-1],[3,10,10.25,3,1,1,0,0,-0.25,-1],[3,11,11.25,3,1,1,0,0,-0.25,-1],[3,12,12.25,3,1.75,1,0,0,-0.25,-1],[3,13,14,3,1,1,0,0,-0.25,-1],[3,14,15,3,1,1,0,0,-0.25,-1],[4,0,0,4,1.25,1,0,0,-0.25,-1],[4,1,1.25,4,1.25,1,0,0,-0.25,-1],[4,2,2.5,4,1.25,1,0,0,-0.25,-1],[4,6,3.75,4,6.25,1,0,0,-0.25,-1],[4,9,10,4,1,1,0,0,-0.25,-1],[4,10,11,4,1,1,0,0,-0.25,-1],[4,11,12,4,1,1,0,0,-0.25,-1],[4,12,13,4,1,1,0,0,-0.25,-1],[4,13,14,4,1,1,0,0,-0.25,-1],[4,14,15,4,1,1,0,0,-0.25,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.5,0,1,1,0,0,0,-1],[0,16,17.5,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.5,1.25,1,1,0,0,0,-1],[1,16,17.5,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.5,2.25,1,1,0,0,0,-1],[2,16,17.5,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,13,15.25,3.25,1,1,0,0,0,-1],[3,15,16.5,3.25,1,1,0,0,0,-1],[3,16,17.5,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,12,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[4,15,16.5,4.25,1,1,0,0,0,-1],[4,16,17.5,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1],[5,16,16.5,5.25,2,1,0,0,0,-1],[5,17,18.5,5.25,1,1,0,0,0,-1]]], + [16.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,13,15.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,14,15.5,4.25,1,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,19,20.5,5.25,1,1,0,0,0,-1]]], + [19,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[0,16,16,0,1,1,0,0,0,-1],[0,17,17,0,1,1,0,0,0,-1],[0,18,18,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,14,13,1,2,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[1,16,16,1,1,1,0,0,0,-1],[1,17,17,1,1,1,0,0,0,-1],[1,18,18,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.75,2,1.25,2,0,0,0,-1],[2,15,15,2,1,1,0,0,0,-1],[2,16,16,2,1,1,0,0,0,-1],[2,17,17,2,1,1,0,0,0,-1],[2,18,18,2,1,2,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,13,12.75,3,1,1,0,0,0,-1],[3,15,15,3,1,1,0,0,0,-1],[3,16,16,3,1,1,0,0,0,-1],[3,17,17,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,13,12.25,4,1.75,1,0,0,0,-1],[4,14,14,4,1,1,0,0,0,-1],[4,15,15,4,1,1,0,0,0,-1],[4,16,16,4,1,1,0,0,0,-1],[4,17,17,4,1,1,0,0,0,-1],[4,18,18,4,1,2,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,10,10,5,1,1,0,0,0,-1],[5,11,11,5,1,1,0,0,0,-1],[5,12,12,5,1,1,0,0,0,-1],[5,13,13,5,1,1,0,0,0,-1],[5,14,14,5,1,1,0,0,0,-1],[5,15,15,5,1,1,0,0,0,-1],[5,16,16,5,1,1,0,0,0,-1],[5,17,17,5,1,1,0,0,0,-1]]], + [16,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.5,2,1.5,1,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,2.25,1,0,0,0,-1],[3,13,15,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1.75,1,0,0,0,-1],[4,13,14,4,1,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,13,14,5,1,1,0,0,0,-1],[5,14,15,5,1,1,0,0,0,-1]]], + [16,5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,2,1,0,0,0,-1],[0,14,15,0,1,1,0,0,0,0],[1,0,0,1,1.5,1,0,0,0,-1],[1,1,1.5,1,1,1,0,0,0,-1],[1,2,2.5,1,1,1,0,0,0,-1],[1,3,3.5,1,1,1,0,0,0,-1],[1,4,4.5,1,1,1,0,0,0,-1],[1,5,5.5,1,1,1,0,0,0,-1],[1,6,6.5,1,1,1,0,0,0,-1],[1,7,7.5,1,1,1,0,0,0,-1],[1,8,8.5,1,1,1,0,0,0,-1],[1,9,9.5,1,1,1,0,0,0,-1],[1,10,10.5,1,1,1,0,0,0,-1],[1,11,11.5,1,1,1,0,0,0,-1],[1,12,12.5,1,1,1,0,0,0,-1],[1,13,13.5,1,1.5,1,0,0,0,-1],[1,14,15,1,1,1,0,0,0,-1],[2,0,0,2,1.75,1,0,0,0,-1],[2,1,1.75,2,1,1,0,0,0,-1],[2,2,2.75,2,1,1,0,0,0,-1],[2,3,3.75,2,1,1,0,0,0,-1],[2,4,4.75,2,1,1,0,0,0,-1],[2,5,5.75,2,1,1,0,0,0,-1],[2,6,6.75,2,1,1,0,0,0,-1],[2,7,7.75,2,1,1,0,0,0,-1],[2,8,8.75,2,1,1,0,0,0,-1],[2,9,9.75,2,1,1,0,0,0,-1],[2,10,10.75,2,1,1,0,0,0,-1],[2,11,11.75,2,1,1,0,0,0,-1],[2,12,12.75,2,2.25,1,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,2.25,1,0,0,0,-1],[3,2,2.25,3,1,1,0,0,0,-1],[3,3,3.25,3,1,1,0,0,0,-1],[3,4,4.25,3,1,1,0,0,0,-1],[3,5,5.25,3,1,1,0,0,0,-1],[3,6,6.25,3,1,1,0,0,0,-1],[3,7,7.25,3,1,1,0,0,0,-1],[3,8,8.25,3,1,1,0,0,0,-1],[3,9,9.25,3,1,1,0,0,0,-1],[3,10,10.25,3,1,1,0,0,0,-1],[3,11,11.25,3,1,1,0,0,0,-1],[3,12,12.25,3,1.75,1,0,0,0,-1],[3,13,14,3,1,1,0,0,0,-1],[3,14,15,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1.25,1,0,0,0,-1],[4,2,2.5,4,1.25,1,0,0,0,-1],[4,6,3.75,4,6.25,1,0,0,0,-1],[4,9,10,4,1.25,1,0,0,0,-1],[4,10,11.25,4,1.25,1,0,0,0,-1],[4,12,13,4,1,1,0,0,0,-1],[4,13,14,4,1,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,2.25,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1]]], + [16.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1.75,1,0,0,0,-1],[4,13,14.25,4.5,1,1,0,0,0,-1],[4,14,15.5,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [19,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[0,16,16,0,1,1,0,0,0,-1],[0,17,17,0,1,1,0,0,0,-1],[0,18,18,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,1,1,0,0,0,-1],[1,14,14,1,1,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[1,16,16,1,1,1,0,0,0,-1],[1,17,17,1,1,1,0,0,0,-1],[1,18,18,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.75,2,1.25,2,0,0,0,-1],[2,15,15,2,1,1,0,0,0,-1],[2,16,16,2,1,1,0,0,0,-1],[2,17,17,2,1,1,0,0,0,-1],[2,18,18,2,1,2,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,13,12.75,3,1,1,0,0,0,-1],[3,15,15,3,1,1,0,0,0,-1],[3,16,16,3,1,1,0,0,0,-1],[3,17,17,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,13,12.25,4,1,1,0,0,0,-1],[4,14,13.25,4,1.75,1,0,0,0,-1],[4,15,15,4,1,1,0,0,0,-1],[4,16,16,4,1,1,0,0,0,-1],[4,17,17,4,1,1,0,0,0,-1],[4,18,18,4,1,2,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1,1,0,0,0,-1],[5,2,2.25,5,1.25,1,0,0,0,-1],[5,3,3.5,5,1,1,0,0,0,-1],[5,6,4.5,5,4.5,1,0,0,0,-1],[5,9,9,5,1,1,0,0,0,-1],[5,10,10,5,1,1,0,0,0,-1],[5,11,11,5,1,1,0,0,0,-1],[5,12,12,5,1,1,0,0,0,-1],[5,13,13,5,1,1,0,0,0,-1],[5,14,14,5,1,1,0,0,0,-1],[5,15,15,5,1,1,0,0,0,-1],[5,16,16,5,1,1,0,0,0,-1],[5,17,17,5,1,1,0,0,0,-1]]], + [16.5,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,14,15.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[4,15,15.5,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,13,15.25,0,1,1,0,0,0,-1],[0,14,16.25,0,1,1,0,0,0,-1],[0,15,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[3,12,13,1.25,1,1,0,0,0,-1],[1,13,14,1.25,1,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[3,14,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[3,15,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,13,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,8,9,5.25,1,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,13,15.25,5.25,1,1,0,0,0,-1],[5,14,16.25,5.25,1,1,0,0,0,-1],[5,15,17.25,5.25,1,1,0,0,0,-1]]], + [16.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,14,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1,1,0,0,0,-1],[4,14,14.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1,1,0,0,0,-1],[5,11,12.25,5.25,1,1,0,0,0,-1],[5,12,13.25,5.25,1,1,0,0,0,-1],[5,13,14.25,5.25,1,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1]]], + [19.85,6.785,[[0,0,0.5,0.053,1,1,0,0,0.053,0],[0,1,2,0.053,1,1,0,0,0.053,-1],[0,2,3.25,0.053,1,1,0,0,0.053,-1],[0,3,4.25,0.053,1,1,0,0,0.053,-1],[0,12,14.6,0.053,1,1,0,0,0.053,-1],[0,13,15.6,0.053,1,1,0,0,0.053,-1],[0,14,17.05,0.053,1,1,0,0,0.053,-1],[0,15,18.5,0.053,1,1,0,0,0.053,-1],[1,0,0.75,1.303,1,1,0,0,0.053,-1],[1,1,2.25,1.303,1,1,0,0,0.053,-1],[1,2,3.25,1.303,1,1,0,0,0.053,-1],[1,3,4.25,1.303,1,1,0,0,0.053,-1],[1,12,13.9,1.303,1,1,0,0,0.053,-1],[1,13,14.9,1.303,1,1,0,0,0.053,-1],[1,14,15.9,1.303,2,1,0,0,0.053,-1],[1,15,18.5,1.303,1,1,0,0,0.053,-1],[2,0,0.5,2.303,1,1,0,0,0.053,-1],[2,1,2,2.303,1.5,1,0,0,0.053,-1],[2,2,3.5,2.303,1,1,0,0,0.053,-1],[2,12,14.4,2.303,1,1,0,0,0.053,-1],[2,13,15.4,2.303,1,1,0,0,0.053,-1],[2,14,16.4,2.303,1.75,1,0,0,0.053,-1],[2,15,18.65,2.303,1,1,0,0,0.053,-1],[3,0,0.25,3.303,1,1,0,0,0.053,-1],[3,1,1.75,3.303,1.75,1,0,0,0.053,-1],[3,2,3.5,3.303,1,1,0,0,0.053,-1],[3,11,14.1,3.303,1,1,0,0,0.053,-1],[3,12,15.1,3.303,1,1,0,0,0.053,-1],[3,13,16.1,3.303,2.25,1,0,0,0.053,-1],[3,15,18.85,3.303,1,1,0,0,0.053,-1],[4,0,0,4.303,1,1,0,0,0.053,-1],[4,1,1.5,4.303,2.25,1,0,0,0.053,-1],[4,3,3.75,4.303,1,1,0,0,0.053,-1],[4,13,14.7,4.303,1,1,0,0,0.053,-1],[4,14,15.7,4.303,1.75,1,0,0,0.053,-1],[4,15,17.7,4.553,1,1,0,0,0.053,-1],[5,0,0,5.303,1,1,0,0,0.053,-1],[5,1,1.5,5.303,1.25,1,0,0,0.053,-1],[5,2,2.75,5.303,1.25,1,0,0,0.053,-1],[5,13,16.7,5.553,1,1,0,0,0.053,-1],[5,14,17.7,5.553,1,1,0,0,0.053,-1],[5,15,18.7,5.553,1,1,0,0,0.053,-1],[0,4,5.4,-0.497,1,1,6,0,0.053,-1],[0,5,6.4,-0.497,1,1,6,0,0.053,-1],[0,6,7.65,-0.497,1,1,6,0,0.053,-1],[0,7,8.65,-0.497,1,1,6,0,0.053,-1],[1,4,5.55,0.753,1,1,6,0,0.053,-1],[1,5,6.55,0.753,1,1,6,0,0.053,-1],[1,6,7.55,0.753,1,1,6,0,0.053,-1],[1,7,8.55,0.753,1,1,6,0,0.053,-1],[2,3,4.9,1.753,1,1,6,0,0.053,-1],[2,4,5.9,1.753,1,1,6,0,0.053,-1],[2,5,6.9,1.753,1,1,6,0,0.053,-1],[2,6,7.9,1.753,1,1,6,0,0.053,-1],[3,3,5,2.753,1,1,6,0,0.053,-1],[3,4,6,2.753,1,1,6,0,0.053,-1],[3,5,7,2.753,1,1,6,0,0.053,-1],[3,6,8,2.753,1,1,6,0,0.053,-1],[4,4,5.35,3.753,1,1,6,0,0.053,-1],[4,5,6.35,3.753,1,1,6,0,0.053,-1],[4,6,7.35,3.753,1,1,6,0,0.053,-1],[4,7,8.35,3.753,1,1,6,0,0.053,-1],[5,5,5.35,4.753,1.25,1,6,0,0.053,-1],[5,6,6.6,4.753,2.25,1,6,0,0.053,-1],[5,7,8.85,4.753,1,1,6,0,0.053,-1],[0,8,10.05,1.503,1,1,-6,0,0.053,-1],[0,9,11.05,1.503,1,1,-6,0,0.053,-1],[0,10,12.3,1.503,1,1,-6,0,0.053,-1],[0,11,13.3,1.503,1,1,-6,0,0.053,-1],[1,8,9.4,2.753,1,1,-6,0,0.053,-1],[1,9,10.4,2.753,1,1,-6,0,0.053,-1],[1,10,11.4,2.753,1,1,-6,0,0.053,-1],[1,11,12.4,2.753,1,1,-6,0,0.053,-1],[2,7,8.9,3.753,1,1,-6,0,0.053,-1],[2,8,9.9,3.753,1,1,-6,0,0.053,-1],[2,9,10.9,3.753,1,1,-6,0,0.053,-1],[2,10,11.9,3.753,1,1,-6,0,0.053,-1],[2,11,12.9,3.753,1,1,-6,0,0.053,-1],[3,7,9.4,4.753,1,1,-6,0,0.053,-1],[3,8,10.4,4.753,1,1,-6,0,0.053,-1],[3,9,11.4,4.753,1,1,-6,0,0.053,-1],[3,10,12.4,4.753,1,1,-6,0,0.053,-1],[4,8,8.85,5.753,1,1,-6,0,0.053,-1],[4,9,9.85,5.753,1,1,-6,0,0.053,-1],[4,10,10.85,5.753,1,1,-6,0,0.053,-1],[4,11,11.85,5.753,1,1,-6,0,0.053,-1],[4,12,12.85,5.753,1,1,-6,0,0.053,-1],[5,8,8.85,6.753,2.55,1,-6,0,0.053,-1],[5,9,11.4,6.753,1,1,-6,0,0.053,-1],[5,10,12.4,6.753,1,1,-6,0,0.053,-1]]], + [16,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,1,1,0,0,0,-1],[1,14,14,1,1,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,13,13.75,2,1.25,2,0,0,0,-1],[2,14,15,2,1,1,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,1,1,0,0,0,-1],[3,13,15,3,1,1,0,0,0,-1],[4,0,0,4,2.25,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1,1,0,0,0,-1],[4,13,13.25,4,1.75,1,0,0,0,-1],[4,14,15,4,1,1,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1,1,0,0,0,-1],[5,2,2.25,5,1.25,1,0,0,0,-1],[5,3,3.5,5,1,1,0,0,0,-1],[5,6,4.5,5,4.5,1,0,0,0,-1],[5,8,9,5,1,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,13,14,5,1,1,0,0,0,-1],[5,14,15,5,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [19,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[0,16,16,0,1,1,0,0,0,-1],[0,17,17,0,1,1,0,0,0,-1],[0,18,18,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[1,16,16,1,1,1,0,0,0,-1],[1,17,17,1,1,1,0,0,0,-1],[1,18,18,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,14,13.75,2,1.25,2,0,0,0,-1],[2,15,15,2,1,1,0,0,0,-1],[2,16,16,2,1,1,0,0,0,-1],[2,17,17,2,1,1,0,0,0,-1],[2,18,18,2,1,2,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,1,1,0,0,0,-1],[3,15,15,3,1,1,0,0,0,-1],[3,16,16,3,1,1,0,0,0,-1],[3,17,17,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1.75,1,0,0,0,-1],[4,14,14,4,1,1,0,0,0,-1],[4,15,15,4,1,1,0,0,0,-1],[4,16,16,4,1,1,0,0,0,-1],[4,17,17,4,1,1,0,0,0,-1],[4,18,18,4,1,2,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,14,14,5,1,1,0,0,0,-1],[5,15,15,5,1,1,0,0,0,-1],[5,16,16,5,1,1,0,0,0,-1],[5,17,17,5,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.5,0,1,1,0,0,0,-1],[0,10,11,0,1,1,0,0,0,-1],[0,11,12,0,1,1,0,0,0,-1],[0,12,13,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1.25,1,0,0,0,-1],[4,1,1.25,4.25,1,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,16,18.5,0,1,1,0,0,0,-1],[0,17,19.5,0,1,1,0,0,0,-1],[0,18,20.5,0,1,1,0,0,0,-1],[0,19,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [19,6,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4,0,1,1,0,0,0,-1],[0,5,5,0,1,1,0,0,0,-1],[0,6,6,0,1,1,0,0,0,-1],[0,7,7,0,1,1,0,0,0,-1],[0,8,8,0,1,1,0,0,0,-1],[0,9,9,0,1,1,0,0,0,-1],[0,10,10,0,1,1,0,0,0,-1],[0,11,11,0,1,1,0,0,0,-1],[0,12,12,0,1,1,0,0,0,-1],[0,13,13,0,1,1,0,0,0,-1],[0,14,14,0,1,1,0,0,0,-1],[0,15,15,0,1,1,0,0,0,-1],[0,16,16,0,1,1,0,0,0,-1],[0,17,17,0,1,1,0,0,0,-1],[0,18,18,0,1,1,0,0,0,-1],[1,0,0,1,1,1,0,0,0,-1],[1,1,1,1,1,1,0,0,0,-1],[1,2,2,1,1,1,0,0,0,-1],[1,3,3,1,1,1,0,0,0,-1],[1,4,4,1,1,1,0,0,0,-1],[1,5,5,1,1,1,0,0,0,-1],[1,6,6,1,1,1,0,0,0,-1],[1,7,7,1,1,1,0,0,0,-1],[1,8,8,1,1,1,0,0,0,-1],[1,9,9,1,1,1,0,0,0,-1],[1,10,10,1,1,1,0,0,0,-1],[1,11,11,1,1,1,0,0,0,-1],[1,12,12,1,1,1,0,0,0,-1],[1,13,13,1,2,1,0,0,0,-1],[1,15,15,1,1,1,0,0,0,-1],[1,16,16,1,1,1,0,0,0,-1],[1,17,17,1,1,1,0,0,0,-1],[1,18,18,1,1,1,0,0,0,-1],[2,0,0,2,1.5,1,0,0,0,-1],[2,1,1.5,2,1,1,0,0,0,-1],[2,2,2.5,2,1,1,0,0,0,-1],[2,3,3.5,2,1,1,0,0,0,-1],[2,4,4.5,2,1,1,0,0,0,-1],[2,5,5.5,2,1,1,0,0,0,-1],[2,6,6.5,2,1,1,0,0,0,-1],[2,7,7.5,2,1,1,0,0,0,-1],[2,8,8.5,2,1,1,0,0,0,-1],[2,9,9.5,2,1,1,0,0,0,-1],[2,10,10.5,2,1,1,0,0,0,-1],[2,11,11.5,2,1,1,0,0,0,-1],[2,12,12.5,2,1,1,0,0,0,-1],[2,14,13.75,2,1.25,2,0,0,0,-1],[2,15,15,2,1,1,0,0,0,-1],[2,16,16,2,1,1,0,0,0,-1],[2,17,17,2,1,1,0,0,0,-1],[2,18,18,2,1,2,0,0,0,-1],[3,0,0,3,1.75,1,0,0,0,-1],[3,1,1.75,3,1,1,0,0,0,-1],[3,2,2.75,3,1,1,0,0,0,-1],[3,3,3.75,3,1,1,0,0,0,-1],[3,4,4.75,3,1,1,0,0,0,-1],[3,5,5.75,3,1,1,0,0,0,-1],[3,6,6.75,3,1,1,0,0,0,-1],[3,7,7.75,3,1,1,0,0,0,-1],[3,8,8.75,3,1,1,0,0,0,-1],[3,9,9.75,3,1,1,0,0,0,-1],[3,10,10.75,3,1,1,0,0,0,-1],[3,11,11.75,3,1,1,0,0,0,-1],[3,12,12.75,3,1,1,0,0,0,-1],[3,15,15,3,1,1,0,0,0,-1],[3,16,16,3,1,1,0,0,0,-1],[3,17,17,3,1,1,0,0,0,-1],[4,0,0,4,1.25,1,0,0,0,-1],[4,1,1.25,4,1,1,0,0,0,-1],[4,2,2.25,4,1,1,0,0,0,-1],[4,3,3.25,4,1,1,0,0,0,-1],[4,4,4.25,4,1,1,0,0,0,-1],[4,5,5.25,4,1,1,0,0,0,-1],[4,6,6.25,4,1,1,0,0,0,-1],[4,7,7.25,4,1,1,0,0,0,-1],[4,8,8.25,4,1,1,0,0,0,-1],[4,9,9.25,4,1,1,0,0,0,-1],[4,10,10.25,4,1,1,0,0,0,-1],[4,11,11.25,4,1,1,0,0,0,-1],[4,12,12.25,4,1,1,0,0,0,-1],[4,14,13.25,4,1.75,1,0,0,0,-1],[4,15,15,4,1,1,0,0,0,-1],[4,16,16,4,1,1,0,0,0,-1],[4,17,17,4,1,1,0,0,0,-1],[4,18,18,4,1,2,0,0,0,-1],[5,0,0,5,1.25,1,0,0,0,-1],[5,1,1.25,5,1.25,1,0,0,0,-1],[5,2,2.5,5,1.25,1,0,0,0,-1],[5,6,3.75,5,6.25,1,0,0,0,-1],[5,9,10,5,1,1,0,0,0,-1],[5,10,11,5,1,1,0,0,0,-1],[5,11,12,5,1,1,0,0,0,-1],[5,12,13,5,1,1,0,0,0,-1],[5,14,14,5,1,1,0,0,0,-1],[5,15,15,5,1,1,0,0,0,-1],[5,16,16,5,1,1,0,0,0,-1],[5,17,17,5,1,1,0,0,0,-1]]], + [15,5,[[0,0,0,0,1,1,0,0,-0.25,-1],[0,1,1,0,1,1,0,0,-0.25,-1],[0,2,2,0,1,1,0,0,-0.25,-1],[0,3,3,0,1,1,0,0,-0.25,-1],[0,4,4,0,1,1,0,0,-0.25,-1],[0,5,5,0,1,1,0,0,-0.25,-1],[0,6,6,0,1,1,0,0,-0.25,-1],[0,7,7,0,1,1,0,0,-0.25,-1],[0,8,8,0,1,1,0,0,-0.25,-1],[0,9,9,0,1,1,0,0,-0.25,-1],[0,10,10,0,1,1,0,0,-0.25,-1],[0,11,11,0,1,1,0,0,-0.25,-1],[0,12,12,0,1,1,0,0,-0.25,-1],[0,13,13,0,2,1,0,0,-0.25,-1],[1,0,0,1,1.5,1,0,0,-0.25,-1],[1,1,1.5,1,1,1,0,0,-0.25,-1],[1,2,2.5,1,1,1,0,0,-0.25,-1],[1,3,3.5,1,1,1,0,0,-0.25,-1],[1,4,4.5,1,1,1,0,0,-0.25,-1],[1,5,5.5,1,1,1,0,0,-0.25,-1],[1,6,6.5,1,1,1,0,0,-0.25,-1],[1,7,7.5,1,1,1,0,0,-0.25,-1],[1,8,8.5,1,1,1,0,0,-0.25,-1],[1,9,9.5,1,1,1,0,0,-0.25,-1],[1,10,10.5,1,1,1,0,0,-0.25,-1],[1,11,11.5,1,1,1,0,0,-0.25,-1],[1,12,12.5,1,1,1,0,0,-0.25,-1],[1,13,13.5,1,1.5,1,0,0,-0.25,-1],[2,0,0,2,1.75,1,0,0,-0.25,-1],[2,1,1.75,2,1,1,0,0,-0.25,-1],[2,2,2.75,2,1,1,0,0,-0.25,-1],[2,3,3.75,2,1,1,0,0,-0.25,-1],[2,4,4.75,2,1,1,0,0,-0.25,-1],[2,5,5.75,2,1,1,0,0,-0.25,-1],[2,6,6.75,2,1,1,0,0,-0.25,-1],[2,7,7.75,2,1,1,0,0,-0.25,-1],[2,8,8.75,2,1,1,0,0,-0.25,-1],[2,9,9.75,2,1,1,0,0,-0.25,-1],[2,10,10.75,2,1,1,0,0,-0.25,-1],[2,11,11.75,2,1,1,0,0,-0.25,-1],[2,12,12.75,2,2.25,1,0,0,-0.25,-1],[3,0,0,3,2.25,1,0,0,-0.25,-1],[3,2,2.25,3,1,1,0,0,-0.25,-1],[3,3,3.25,3,1,1,0,0,-0.25,-1],[3,4,4.25,3,1,1,0,0,-0.25,-1],[3,5,5.25,3,1,1,0,0,-0.25,-1],[3,6,6.25,3,1,1,0,0,-0.25,-1],[3,7,7.25,3,1,1,0,0,-0.25,-1],[3,8,8.25,3,1,1,0,0,-0.25,-1],[3,9,9.25,3,1,1,0,0,-0.25,-1],[3,10,10.25,3,1,1,0,0,-0.25,-1],[3,12,11.25,3,1,1,0,0,-0.25,-1],[3,13,12.25,3,2.75,1,0,0,-0.25,-1],[4,0,0,4,1.25,1,0,0,-0.25,-1],[4,1,1.25,4,1.25,1,0,0,-0.25,-1],[4,2,2.5,4,1.25,1,0,0,-0.25,-1],[4,6,3.75,4,6.25,1,0,0,-0.25,-1],[4,10,10,4,1.25,1,0,0,-0.25,-1],[4,11,11.25,4,1.25,1,0,0,-0.25,-1],[4,12,12.5,4,1.25,1,0,0,-0.25,-1],[4,13,13.75,4,1.25,1,0,0,-0.25,-1]]], + [16.25,6.5,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,0],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,13,15.25,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,12,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,1.75,1,0,0,0,-1],[4,14,14.25,4.5,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,9,10,5.25,1,1,0,0,0,-1],[5,10,11,5.25,1,1,0,0,0,-1],[5,11,12,5.25,1,1,0,0,0,-1],[5,12,13.25,5.5,1,1,0,0,0,-1],[5,13,14.25,5.5,1,1,0,0,0,-1],[5,14,15.25,5.5,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,2,0,1,1,0,0,0,-1],[0,2,3,0,1,1,0,0,0,-1],[0,3,4,0,1,1,0,0,0,-1],[0,4,5,0,1,1,0,0,0,-1],[0,5,6.5,0,1,1,0,0,0,-1],[0,6,7.5,0,1,1,0,0,0,-1],[0,7,8.5,0,1,1,0,0,0,-1],[0,8,9.5,0,1,1,0,0,0,-1],[0,9,11,0,1,1,0,0,0,-1],[0,10,12,0,1,1,0,0,0,-1],[0,11,13,0,1,1,0,0,0,-1],[0,12,14,0,1,1,0,0,0,-1],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,2,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.5,2.25,1.5,1,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,2.25,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,13,12.25,4.25,2.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1.25,1,0,0,0,-1],[5,2,2.5,5.25,1.25,1,0,0,0,-1],[5,6,3.75,5.25,6.25,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [22.5,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[3,13,14,0,1,1,0,0,0,0],[0,14,15.25,0,1,1,0,0,0,-1],[0,15,16.25,0,1,1,0,0,0,-1],[0,16,17.25,0,1,1,0,0,0,-1],[0,17,18.5,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[0,19,20.5,0,1,1,0,0,0,-1],[0,20,21.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[0,13,14,1.25,1,1,0,0,0,-1],[1,14,15.25,1.25,1,1,0,0,0,-1],[1,15,16.25,1.25,1,1,0,0,0,-1],[1,16,17.25,1.25,1,1,0,0,0,-1],[1,17,18.5,1.25,1,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[1,19,20.5,1.25,1,1,0,0,0,-1],[1,20,21.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,14,15.25,2.25,1,1,0,0,0,-1],[2,15,16.25,2.25,1,1,0,0,0,-1],[2,16,17.25,2.25,1,1,0,0,0,-1],[2,17,18.5,2.25,1,1,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[2,19,20.5,2.25,1,1,0,0,0,-1],[2,20,21.5,2.25,1,2,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[3,17,18.5,3.25,1,1,0,0,0,-1],[3,18,19.5,3.25,1,1,0,0,0,-1],[3,19,20.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,15,16.25,4.25,1,1,0,0,0,-1],[4,17,18.5,4.25,1,1,0,0,0,-1],[4,18,19.5,4.25,1,1,0,0,0,-1],[4,19,20.5,4.25,1,1,0,0,0,-1],[4,20,21.5,4.25,1,2,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,8,9,5.25,1,1,0,0,0,-1],[5,9,10,5.25,1.25,1,0,0,0,-1],[5,10,11.25,5.25,1.25,1,0,0,0,-1],[5,11,12.5,5.25,1.25,1,0,0,0,-1],[5,12,13.75,5.25,1.25,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.25,5.25,1,1,0,0,0,-1],[5,17,18.5,5.25,2,1,0,0,0,-1],[5,18,20.5,5.25,1,1,0,0,0,-1]]], + [18.25,6.25,[[0,0,0,0,1,1,0,0,0,-1],[0,1,1.25,0,1,1,0,0,0,-1],[0,2,2.25,0,1,1,0,0,0,-1],[0,3,3.25,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,0],[0,15,15.25,0,1,1,0,0,0,-1],[0,16,16.25,0,1,1,0,0,0,-1],[0,17,17.25,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4,1.25,1,1,0,0,0,-1],[1,5,5,1.25,1,1,0,0,0,-1],[1,6,6,1.25,1,1,0,0,0,-1],[1,7,7,1.25,1,1,0,0,0,-1],[1,8,8,1.25,1,1,0,0,0,-1],[1,9,9,1.25,1,1,0,0,0,-1],[1,10,10,1.25,1,1,0,0,0,-1],[1,11,11,1.25,1,1,0,0,0,-1],[1,12,12,1.25,1,1,0,0,0,-1],[1,13,13,1.25,1,1,0,0,0,-1],[1,14,14,1.25,1,1,0,0,0,-1],[1,15,15.25,1.25,1,1,0,0,0,-1],[1,16,16.25,1.25,1,1,0,0,0,-1],[1,17,17.25,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1.5,1,0,0,0,-1],[2,1,1.5,2.25,1,1,0,0,0,-1],[2,2,2.5,2.25,1,1,0,0,0,-1],[2,3,3.5,2.25,1,1,0,0,0,-1],[2,4,4.5,2.25,1,1,0,0,0,-1],[2,5,5.5,2.25,1,1,0,0,0,-1],[2,6,6.5,2.25,1,1,0,0,0,-1],[2,7,7.5,2.25,1,1,0,0,0,-1],[2,8,8.5,2.25,1,1,0,0,0,-1],[2,9,9.5,2.25,1,1,0,0,0,-1],[2,10,10.5,2.25,1,1,0,0,0,-1],[2,11,11.5,2.25,1,1,0,0,0,-1],[2,12,12.5,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1.25,2,0,0,0,-1],[2,15,15.25,2.25,1,1,0,0,0,-1],[2,16,16.25,2.25,1,1,0,0,0,-1],[2,17,17.25,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1.75,1,0,0,0,-1],[3,1,1.75,3.25,1,1,0,0,0,-1],[3,2,2.75,3.25,1,1,0,0,0,-1],[3,3,3.75,3.25,1,1,0,0,0,-1],[3,4,4.75,3.25,1,1,0,0,0,-1],[3,5,5.75,3.25,1,1,0,0,0,-1],[3,6,6.75,3.25,1,1,0,0,0,-1],[3,7,7.75,3.25,1,1,0,0,0,-1],[3,8,8.75,3.25,1,1,0,0,0,-1],[3,9,9.75,3.25,1,1,0,0,0,-1],[3,10,10.75,3.25,1,1,0,0,0,-1],[3,11,11.75,3.25,1,1,0,0,0,-1],[3,12,12.75,3.25,1,1,0,0,0,-1],[4,0,0,4.25,2.25,1,0,0,0,-1],[4,2,2.25,4.25,1,1,0,0,0,-1],[4,3,3.25,4.25,1,1,0,0,0,-1],[4,4,4.25,4.25,1,1,0,0,0,-1],[4,5,5.25,4.25,1,1,0,0,0,-1],[4,6,6.25,4.25,1,1,0,0,0,-1],[4,7,7.25,4.25,1,1,0,0,0,-1],[4,8,8.25,4.25,1,1,0,0,0,-1],[4,9,9.25,4.25,1,1,0,0,0,-1],[4,10,10.25,4.25,1,1,0,0,0,-1],[4,11,11.25,4.25,1,1,0,0,0,-1],[4,12,12.25,4.25,1,1,0,0,0,-1],[4,13,13.25,4.25,1.75,1,0,0,0,-1],[4,16,16.25,4.25,1,1,0,0,0,-1],[5,0,0,5.25,1.25,1,0,0,0,-1],[5,1,1.25,5.25,1,1,0,0,0,-1],[5,2,2.25,5.25,1.25,1,0,0,0,-1],[5,3,3.5,5.25,1,1,0,0,0,-1],[5,6,4.5,5.25,4.5,1,0,0,0,-1],[5,9,9,5.25,1,1,0,0,0,-1],[5,10,10,5.25,1.25,1,0,0,0,-1],[5,11,11.25,5.25,1.25,1,0,0,0,-1],[5,12,12.5,5.25,1.25,1,0,0,0,-1],[5,13,13.75,5.25,1.25,1,0,0,0,-1],[5,15,15.25,5.25,1,1,0,0,0,-1],[5,16,16.25,5.25,1,1,0,0,0,-1],[5,17,17.25,5.25,1,1,0,0,0,-1]]], + [20.5,6.5,[[0,0,0,0,1,1,0,0,0,0],[0,1,1,0,1,1,0,0,0,-1],[0,2,2,0,1,1,0,0,0,-1],[0,3,3,0,1,1,0,0,0,-1],[0,4,4.25,0,1,1,0,0,0,-1],[0,5,5.5,0,1,1,0,0,0,-1],[0,6,6.5,0,1,1,0,0,0,-1],[0,7,7.5,0,1,1,0,0,0,-1],[0,8,8.5,0,1,1,0,0,0,-1],[0,9,9.75,0,1,1,0,0,0,-1],[0,10,10.75,0,1,1,0,0,0,-1],[0,11,11.75,0,1,1,0,0,0,-1],[0,12,12.75,0,1,1,0,0,0,-1],[0,13,14,0,1,1,0,0,0,-1],[0,14,15,0,1,1,0,0,0,-1],[0,15,16,0,1,1,0,0,0,-1],[0,16,17,0,1,1,0,0,0,-1],[0,17,18.25,0,1,1,0,0,0,-1],[0,18,19.5,0,1,1,0,0,0,-1],[1,0,0,1.25,1,1,0,0,0,-1],[1,1,1,1.25,1,1,0,0,0,-1],[1,2,2,1.25,1,1,0,0,0,-1],[1,3,3,1.25,1,1,0,0,0,-1],[1,4,4.25,1.25,1,1,0,0,0,-1],[1,5,5.25,1.25,1,1,0,0,0,-1],[1,6,6.25,1.25,1,1,0,0,0,-1],[1,7,7.25,1.25,1,1,0,0,0,-1],[1,8,8.25,1.25,1,1,0,0,0,-1],[1,9,9.25,1.25,1,1,0,0,0,-1],[1,10,10.25,1.25,1,1,0,0,0,-1],[1,11,11.25,1.25,1,1,0,0,0,-1],[1,12,12.25,1.25,1,1,0,0,0,-1],[1,13,13.25,1.25,1,1,0,0,0,-1],[1,14,14.25,1.25,1,1,0,0,0,-1],[1,15,15.25,1.25,1,1,0,0,0,-1],[1,16,16.25,1.25,1,1,0,0,0,-1],[1,17,17.25,1.25,2,1,0,0,0,-1],[1,18,19.5,1.25,1,1,0,0,0,-1],[2,0,0,2.25,1,1,0,0,0,-1],[2,1,1,2.25,1,1,0,0,0,-1],[2,2,2,2.25,1,1,0,0,0,-1],[2,3,3,2.25,1,2,0,0,0,-1],[2,4,4.25,2.25,1.5,1,0,0,0,-1],[2,5,5.75,2.25,1,1,0,0,0,-1],[2,6,6.75,2.25,1,1,0,0,0,-1],[2,7,7.75,2.25,1,1,0,0,0,-1],[2,8,8.75,2.25,1,1,0,0,0,-1],[2,9,9.75,2.25,1,1,0,0,0,-1],[2,10,10.75,2.25,1,1,0,0,0,-1],[2,11,11.75,2.25,1,1,0,0,0,-1],[2,12,12.75,2.25,1,1,0,0,0,-1],[2,13,13.75,2.25,1,1,0,0,0,-1],[2,14,14.75,2.25,1,1,0,0,0,-1],[2,15,15.75,2.25,1,1,0,0,0,-1],[2,16,16.75,2.25,1,1,0,0,0,-1],[2,17,18,2.25,1.25,2,0,0,0,-1],[2,18,19.5,2.25,1,1,0,0,0,-1],[3,0,0,3.25,1,1,0,0,0,-1],[3,1,1,3.25,1,1,0,0,0,-1],[3,2,2,3.25,1,1,0,0,0,-1],[3,4,4.25,3.25,1.75,1,0,0,0,-1],[3,5,6,3.25,1,1,0,0,0,-1],[3,6,7,3.25,1,1,0,0,0,-1],[3,7,8,3.25,1,1,0,0,0,-1],[3,8,9,3.25,1,1,0,0,0,-1],[3,9,10,3.25,1,1,0,0,0,-1],[3,10,11,3.25,1,1,0,0,0,-1],[3,11,12,3.25,1,1,0,0,0,-1],[3,12,13,3.25,1,1,0,0,0,-1],[3,13,14,3.25,1,1,0,0,0,-1],[3,14,15,3.25,1,1,0,0,0,-1],[3,15,16,3.25,1,1,0,0,0,-1],[3,16,17,3.25,1,1,0,0,0,-1],[3,17,19.5,3.25,1,1,0,0,0,-1],[4,0,0,4.25,1,1,0,0,0,-1],[4,1,1,4.25,1,1,0,0,0,-1],[4,2,2,4.25,1,1,0,0,0,-1],[4,3,3,4.25,1,2,0,0,0,-1],[4,4,4.25,4.25,1.25,1,0,0,0,-1],[4,5,5.5,4.25,1,1,0,0,0,-1],[4,6,6.5,4.25,1,1,0,0,0,-1],[4,7,7.5,4.25,1,1,0,0,0,-1],[4,8,8.5,4.25,1,1,0,0,0,-1],[4,9,9.5,4.25,1,1,0,0,0,-1],[4,10,10.5,4.25,1,1,0,0,0,-1],[4,11,11.5,4.25,1,1,0,0,0,-1],[4,12,12.5,4.25,1,1,0,0,0,-1],[4,13,13.5,4.25,1,1,0,0,0,-1],[4,14,14.5,4.25,1,1,0,0,0,-1],[4,16,15.5,4.25,1,1,0,0,0,-1],[4,17,16.5,4.25,1.75,1,0,0,0,-1],[4,18,18.5,4.5,1,1,0,0,0,-1],[5,1,0,5.25,2,1,0,0,0,-1],[5,2,2,5.25,1,1,0,0,0,-1],[5,4,4.25,5.25,1.25,1,0,0,0,-1],[5,5,5.5,5.25,1.25,1,0,0,0,-1],[5,6,6.75,5.25,1.25,1,0,0,0,-1],[5,10,8,5.25,6.25,1,0,0,0,-1],[5,13,14.25,5.25,1,1,0,0,0,-1],[5,14,15.25,5.25,1,1,0,0,0,-1],[5,15,16.25,5.25,1,1,0,0,0,-1],[5,16,17.5,5.5,1,1,0,0,0,-1],[5,17,18.5,5.5,1,1,0,0,0,-1],[5,18,19.5,5.5,1,1,0,0,0,-1]]], +]; + +/** Index into the layout table for each product id. */ +const LAYOUT_BY_PRODUCT: Readonly> = { + 0x0402: 98, + 0x0403: 65, + 0x040c: 41, + 0x0416: 46, + 0x0417: 71, + 0x0418: 5, + 0x0419: 24, + 0x041b: 66, + 0x041c: 75, + 0x041e: 76, + 0x041f: 40, + 0x0429: 90, + 0x042f: 9, + 0x043b: 22, + 0x0441: 76, + 0x0445: 76, + 0x0446: 21, + 0x0449: 23, + 0x044a: 47, + 0x044b: 76, + 0x0450: 20, + 0x0454: 23, + 0x045a: 71, + 0x045b: 0, + 0x045c: 37, + 0x045d: 37, + 0x045e: 41, + 0x045f: 41, + 0x0460: 24, + 0x0464: 18, + 0x0471: 97, + 0x0472: 64, + 0x0476: 19, + 0x047b: 79, + 0x047c: 47, + 0x047d: 25, + 0x047e: 38, + 0x0480: 38, + 0x0481: 57, + 0x0484: 38, + 0x0485: 38, + 0x0486: 97, + 0x048a: 71, + 0x048e: 9, + 0x048f: 51, + 0x0490: 44, + 0x0494: 93, + 0x0497: 81, + 0x0498: 21, + 0x049b: 59, + 0x049c: 94, + 0x04a1: 41, + 0x04a2: 71, + 0x04a5: 41, + 0x04a6: 41, + 0x0511: 26, + 0x0b00: 8, + 0x0b01: 8, + 0x0b02: 8, + 0x0b10: 98, + 0x0b11: 65, + 0x0b12: 27, + 0x0b13: 98, + 0x0b14: 71, + 0x0b15: 71, + 0x0b16: 32, + 0x0b20: 70, + 0x0b30: 39, + 0x0b31: 30, + 0x0b32: 29, + 0x0b33: 34, + 0x0b40: 16, + 0x0b50: 35, + 0x0b51: 74, + 0x0b52: 1, + 0x0b53: 43, + 0x0b60: 91, + 0x0b61: 33, + 0x0b62: 100, + 0x0b63: 91, + 0x0b64: 91, + 0x0b65: 33, + 0x0b66: 91, + 0x0ba0: 86, + 0x0bb0: 69, + 0x0bc0: 7, + 0x0bc1: 102, + 0x0e20: 78, + 0x0e21: 45, + 0x0e22: 87, + 0x0e23: 13, + 0x0e24: 44, + 0x0e25: 44, + 0x0e26: 68, + 0x0e27: 44, + 0x0e2a: 68, + 0x0e30: 78, + 0x0e31: 45, + 0x0e32: 49, + 0x0e35: 49, + 0x0e40: 48, + 0x0e41: 77, + 0x0e42: 82, + 0x0e43: 14, + 0x0e44: 96, + 0x0e45: 89, + 0x0e60: 63, + 0x0e61: 4, + 0x0e80: 54, + 0x0e81: 55, + 0x0e82: 84, + 0x0e83: 67, + 0x0e84: 67, + 0x0e85: 28, + 0x0e86: 28, + 0x0ea0: 56, + 0x0ea1: 17, + 0x0ea2: 53, + 0x0ea3: 56, + 0x0ea4: 88, + 0x0ea5: 61, + 0x0ea6: 56, + 0x0ea7: 42, + 0x0ea8: 42, + 0x0ea9: 88, + 0x0ec0: 50, + 0x1001: 44, + 0x1004: 3, + 0x1005: 97, + 0x1010: 71, + 0x1011: 5, + 0x1012: 15, + 0x1013: 85, + 0x1014: 44, + 0x1015: 2, + 0x1016: 71, + 0x1020: 12, + 0x1023: 12, + 0x1030: 59, + 0x1031: 58, + 0x1032: 101, + 0x1033: 59, + 0x1050: 10, + 0x1053: 10, + 0x1060: 94, + 0x1061: 92, + 0x1062: 52, + 0x1063: 94, + 0x1064: 94, + 0x10f3: 64, + 0x10f4: 72, + 0x1234: 45, + 0x1500: 6, + 0x1532: 62, + 0x1533: 80, + 0x1535: 62, + 0x1536: 80, + 0x1540: 99, + 0x1541: 99, + 0x1710: 73, + 0x1711: 71, + 0x1728: 36, + 0x1729: 44, + 0x172c: 60, + 0x172d: 47, + 0x1740: 11, + 0x17c0: 83, + 0x17f0: 95, + 0x1860: 31, +}; + +export interface KeychronKeyShape { + row: number; + col: number; + /** Position of the key's top-left corner, in key widths. */ + x: number; + y: number; + w: number; + h: number; + /** Degrees clockwise around (`rx`, `ry`); 0 for most keys. */ + rotation: number; + rx: number; + ry: number; + /** Rotary encoder index when this position is a knob, else null. */ + encoder: number | null; +} + +export interface KeychronLayout { + /** Overall size in key widths. */ + width: number; + height: number; + keys: readonly KeychronKeyShape[]; +} + +const cache = new Map(); + +/** The physical layout of a catalogued Hall-effect board, or null for an unknown product id. */ +export function keychronLayoutFor(productId: number): KeychronLayout | null { + const cached = cache.get(productId); + if (cached) return cached; + const index = LAYOUT_BY_PRODUCT[productId]; + const raw = index === undefined ? undefined : LAYOUTS[index]; + if (!raw) return null; + const layout: KeychronLayout = { + width: raw[0], + height: raw[1], + keys: raw[2].map(([row, col, x, y, w, h, rotation, rx, ry, encoder]) => ({ + row, col, x, y, w, h, rotation, rx, ry, encoder: encoder < 0 ? null : encoder, + })), + }; + cache.set(productId, layout); + return layout; +} diff --git a/src/keychron/protocol.test.ts b/src/keychron/protocol.test.ts index 8653181..ac00086 100644 --- a/src/keychron/protocol.test.ts +++ b/src/keychron/protocol.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import test from "node:test"; import { - KEYCHRON_HE_COMMAND, KEYCHRON_KEY_MODE, KEYCHRON_WORK_MODE, keychronKeyBitmap, keychronKeyTarget, keychronProfileNameBytes, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_HE_SUBCOMMAND, + KEYCHRON_HE_COMMAND, decodeKeychronKeymapChunk, joinKeychronKeymap, keychronKeycodeLegend, keychronKeymapReadPlan, keychronLayoutFor, keychronViaFrames, KEYCHRON_KEY_MODE, KEYCHRON_WORK_MODE, keychronKeyBitmap, keychronKeyTarget, keychronProfileNameBytes, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_HE_SUBCOMMAND, decodeKeychronAxisType, decodeKeychronCalibrationState, decodeKeychronCurve, decodeKeychronHeVersion, decodeKeychronKeySlot, decodeKeychronProfileBuffer, decodeKeychronProfileName, decodeKeychronProfilesInfo, decodeKeychronRealtimeTravel, joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, @@ -191,3 +191,55 @@ test("profile names are trimmed big-endian UTF-16 with a byte length", () => { const frame = keychronHeFrames.setProfileName(2, chars, length); assert.deepEqual([...frame.slice(0, 8)], [0xa9, 0x13, 2, 6, 0, 0x48, 0, 0x69]); }); + +test("keymap reads cover one layer in 14-key chunks at the right byte offsets", () => { + const plan = keychronKeymapReadPlan(1, 6, 5); // 30 keys: 14 + 14 + 2 + assert.deepEqual(plan, [{ offset: 60, bytes: 28 }, { offset: 88, bytes: 28 }, { offset: 116, bytes: 4 }]); + assert.deepEqual([...keychronViaFrames.keymapBuffer(plan[1]!).slice(0, 4)], [0x12, 0, 88, 28]); + assert.throws(() => keychronKeymapReadPlan(256, 1, 1), RangeError); + assert.throws(() => keychronKeymapReadPlan(255, 20, 20), RangeError); + assert.throws(() => keychronViaFrames.keymapBuffer({ offset: 0, bytes: 30 }), RangeError); + assert.deepEqual([...keychronViaFrames.layerCount().slice(0, 2)], [0x11, 0]); +}); + +test("keymap replies are big-endian keycodes and fold into rows", () => { + const reply = new Uint8Array(32); + reply.set([0x12, 0, 0, 4, 0x00, 0x04, 0x00, 0x05]); + assert.deepEqual(decodeKeychronKeymapChunk(reply, 4), [4, 5]); + assert.equal(decodeKeychronKeymapChunk(new Uint8Array(32), 4), null); + assert.deepEqual(joinKeychronKeymap([[1, 2, 3], [4, 5, 6]], 2, 3), [[1, 2, 3], [4, 5, 6]]); + assert.throws(() => joinKeychronKeymap([[1]], 2, 3), RangeError); +}); + +test("legends cover letters, symbols, modifiers, layers and fall back to hex", () => { + const label = (code: number) => keychronKeycodeLegend(code).label; + assert.equal(label(0x04), "A"); + assert.equal(label(0x1d), "Z"); + assert.equal(label(0x1e), "1"); + assert.equal(label(0x27), "0"); + assert.equal(label(0x3a), "F1"); + assert.equal(label(0x45), "F12"); + assert.equal(label(0x68), "F13"); + assert.equal(label(0x59), "1"); + assert.equal(label(0x2c), "Space"); + assert.equal(label(0xe1), "Shift"); + assert.equal(label(0x0000), ""); + assert.equal(label(0x0001), "▽"); + assert.equal(label(0x5221), "MO1"); + assert.equal(keychronKeycodeLegend(0x0204).title, "Shift+Key A"); + assert.equal(label(0x2204), "A"); + const unknown = keychronKeycodeLegend(0x7e40); + assert.equal(unknown.unknown, true); + assert.equal(unknown.label, "0x7E40"); +}); + +test("every catalogued board has a physical layout whose keys fit its matrix", () => { + for (const id of KEYCHRON_HE_PRODUCT_IDS) { + const layout = keychronLayoutFor(id); + const { rows, cols } = KEYCHRON_HE_PRODUCTS[id]!; + assert.ok(layout, `layout for 0x${id.toString(16)}`); + assert.ok(layout.keys.length > 0 && layout.width > 0 && layout.height > 0); + for (const key of layout.keys) assert.ok(key.row < rows && key.col < cols, `0x${id.toString(16)} [${key.row},${key.col}]`); + } + assert.equal(keychronLayoutFor(0x0001), null); +}); From b03ba3c40405815a4a112a1690d68d465593b3bf Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Fri, 30 Oct 2026 01:07:53 -0600 Subject: [PATCH 4/5] fix(keychron): keep the session usable when the keymap read is ignored A board that does not answer the VIA keymap or layer-count read faulted the whole session, blocking later Hall-effect commands. Those replies use a different command id from KC_HE, so a late one cannot confirm an HE command; let the optional reads time out without faulting. --- src/drivers/keychron/hid.test.ts | 12 ++++++++++++ src/drivers/keychron/hid.ts | 12 ++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/drivers/keychron/hid.test.ts b/src/drivers/keychron/hid.test.ts index 38fd5f7..e9cf023 100644 --- a/src/drivers/keychron/hid.test.ts +++ b/src/drivers/keychron/hid.test.ts @@ -18,6 +18,7 @@ class FakeBoard { listeners = new Set<(event: HIDInputReportEvent) => void>(); sent: Uint8Array[] = []; silent = false; + silentVia = false; nak = false; buffer = new Uint8Array(SIZE); version = 4; @@ -37,6 +38,7 @@ class FakeBoard { this.sent.push(request.slice()); if (this.silent) return; if (request[0] === 0x11 || request[0] === 0x12) { + if (this.silentVia) return; const via = new Uint8Array(32); via.set(request.slice(0, 4)); if (request[0] === 0x11) via[1] = 4; @@ -145,6 +147,16 @@ test("readKeymap reads one layer through the VIA keymap command", async () => { assert.equal(await client(board).readLayerCount(), 4); }); +test("a board that ignores the keymap read keeps its session for HE commands", async () => { + const board = new FakeBoard(); + board.silentVia = true; + const keyboard = client(board); + await assert.rejects(() => keyboard.readKeymap(0), /did not answer/); + await assert.rejects(() => keyboard.readLayerCount(), /did not answer/); + assert.equal((await keyboard.readStatus()).brand, "Keychron"); + assert.equal(await keyboard.readKeyTravel(1, 1), 33); +}); + test("live travel matches the echoed key", async () => { const board = new FakeBoard(); assert.equal(await client(board).readKeyTravel(2, 5), 33); diff --git a/src/drivers/keychron/hid.ts b/src/drivers/keychron/hid.ts index 11756f1..8bf60e0 100644 --- a/src/drivers/keychron/hid.ts +++ b/src/drivers/keychron/hid.ts @@ -88,7 +88,7 @@ export class KeychronHidClient { /** Send one report and wait for the reply `accepts` recognises. */ private async exchange( - request: Uint8Array, accepts: (frame: Uint8Array) => boolean, + request: Uint8Array, accepts: (frame: Uint8Array) => boolean, faultOnTimeout = true, ): Promise { await this.open(); let timer: ReturnType | undefined; @@ -102,7 +102,9 @@ export class KeychronHidClient { } catch (error) { // Replies carry no transaction id, so a delayed one could confirm a later // command. Do not reuse the session after a timeout or a failed send. - this.faulted = true; + // The optional VIA reads opt out of the timeout case: their replies carry + // a different command id, so a late one can never satisfy an HE command. + if (faultOnTimeout || !(error instanceof Error && error.message.includes("did not answer"))) this.faulted = true; throw error; } finally { clearTimeout(timer); @@ -225,7 +227,7 @@ export class KeychronHidClient { readLayerCount(): Promise { return this.serialized(async () => { const count = decodeKeychronLayerCount(await this.exchange( - keychronViaFrames.layerCount(), (frame) => decodeKeychronLayerCount(frame) !== null, + keychronViaFrames.layerCount(), (frame) => decodeKeychronLayerCount(frame) !== null, false, )); if (count === null) throw new Error("The keyboard did not report its layer count."); return count; @@ -235,13 +237,15 @@ export class KeychronHidClient { /** * Read one keymap layer as `keycodes[row][col]` using the standard VIA * dynamic-keymap read. Pair it with `keychronKeycodeLegend` to label keys. + * A board that ignores the read rejects with "did not answer" but the + * session stays usable for the Hall-effect commands. */ readKeymap(layer = 0): Promise { return this.serialized(async () => { const { rows, cols } = this.matrix(); const chunks: number[][] = []; for (const read of keychronKeymapReadPlan(layer, rows, cols)) { - const reply = await this.exchange(keychronViaFrames.keymapBuffer(read), (frame) => isKeychronKeymapReply(frame, read.offset)); + const reply = await this.exchange(keychronViaFrames.keymapBuffer(read), (frame) => isKeychronKeymapReply(frame, read.offset), false); const codes = decodeKeychronKeymapChunk(reply, read.bytes); if (!codes) throw new Error("The keyboard sent a short keymap reply."); chunks.push(codes); From 6c4cca4bcf1564f0582ec08832abe0b344331cd5 Mon Sep 17 00:00:00 2001 From: snekxs <26660858+snekxs@users.noreply.github.com> Date: Fri, 30 Oct 2026 01:21:31 -0600 Subject: [PATCH 5/5] feat(keychron): add key remapping with protocol-aware keycode tables setKeycode writes one key with VIA dynamic_keymap_set_keycode and confirms it by reading the key back. Keycode tables follow the VIA protocol version the board reports (layer keys and the custom-key base differ before and after QMK 0.19), the catalog builds a picker grouped by category with each board's own custom keys, and remapWarnings flags replacing the only layer key on a layer. Add encoder frames, the board custom keycode data, and tests with a fake board that models the keymap. --- docs/keychron-support.md | 21 +++ src/drivers/keychron/hid.test.ts | 53 ++++++- src/drivers/keychron/hid.ts | 72 ++++++++- src/keychron/custom-keycodes.ts | 247 +++++++++++++++++++++++++++++++ src/keychron/index.ts | 50 ++++++- src/keychron/keycodes.ts | 148 ++++++++++++++++-- src/keychron/protocol.test.ts | 55 ++++++- 7 files changed, 626 insertions(+), 20 deletions(-) create mode 100644 src/keychron/custom-keycodes.ts diff --git a/docs/keychron-support.md b/docs/keychron-support.md index 737f757..86fed57 100644 --- a/docs/keychron-support.md +++ b/docs/keychron-support.md @@ -51,6 +51,27 @@ same way Launcher does. `keychronKeycodeLegend` labels basic keycodes, modifiers, layer keys and mod/layer-tap wrappers, and shows the hex value for anything else (custom or vendor codes). +## Key remapping + +`KeychronHidClient.setKeycode(layer, row, col, code)` sets one key with the +standard VIA `dynamic_keymap_set_keycode` command (`0x05`, big-endian code), as +Launcher does, then reads the key back (`0x04`) and fails if the board did not +keep it. Launcher itself does not wait for a reply, so the read-back is this +driver's addition. Encoders use `0x15`/`0x14` (frames only; no driver method yet). + +The keycode tables depend on the VIA protocol version the board reports +(`readViaProtocol`, command `0x01`): layer keys sit at `0x5200`/`0x5220`... on +protocol 11 and later and at `0x5000`/`0x5100`... before that, and the custom +(Keychron-specific) keys start at `0x7E00` (12+), `0x7F00` (11) or `0x5F80`. +`setKeycode` only sends codes the table for the board's version can name, so a +layer or custom code is never sent with the wrong table. `keychronKeycodeCatalog` +builds the picker's categories from the same table, including the board's +custom keys. `remapWarnings` flags replacing the only layer key on a layer. + +Not covered: macros, tap-dance and other quantum keycodes beyond the layer, +mod-tap and layer-tap forms, encoder remapping in the driver, and resetting the +keymap. A remap persists in the board's memory. + ## Write parameters (from Launcher's call sites) - `workMode`: Global 0, Static 1, QuickTrigger (rapid trigger) 2. diff --git a/src/drivers/keychron/hid.test.ts b/src/drivers/keychron/hid.test.ts index e9cf023..753855c 100644 --- a/src/drivers/keychron/hid.test.ts +++ b/src/drivers/keychron/hid.test.ts @@ -19,6 +19,10 @@ class FakeBoard { sent: Uint8Array[] = []; silent = false; silentVia = false; + viaProtocol = 12; + keymap = new Map(); + keycodeAt(layer: number, key: number) { return this.keymap.get(layer * 10_000 + key) ?? 4 + (key % 26); } + ignoreKeycodeWrites = false; nak = false; buffer = new Uint8Array(SIZE); version = 4; @@ -37,12 +41,18 @@ class FakeBoard { assert.equal(request.length, 32); this.sent.push(request.slice()); if (this.silent) return; - if (request[0] === 0x11 || request[0] === 0x12) { + if ([0x01, 0x04, 0x05, 0x11, 0x12].includes(request[0]!)) { if (this.silentVia) return; const via = new Uint8Array(32); - via.set(request.slice(0, 4)); - if (request[0] === 0x11) via[1] = 4; - else for (let i = 0; i < request[3]!; i += 2) { const key = ((request[1]! << 8 | request[2]!) + i) / 2; via[4 + i] = 0; via[5 + i] = 4 + (key % 26); } + via.set(request.slice(0, 6)); + if (request[0] === 0x01) via.set([0, this.viaProtocol], 1); + else if (request[0] === 0x11) via[1] = 4; + else if (request[0] === 0x05) { if (!this.ignoreKeycodeWrites) this.keymap.set(request[1]! * 10_000 + request[2]! * cols + request[3]!, request[4]! << 8 | request[5]!); return; } + else if (request[0] === 0x04) { const code = this.keycodeAt(request[1]!, request[2]! * cols + request[3]!); via[4] = code >> 8; via[5] = code & 0xff; } + else for (let i = 0; i < request[3]!; i += 2) { + const key = ((request[1]! << 8 | request[2]!) + i) / 2; + const code = this.keycodeAt(0, key); via[4 + i] = code >> 8; via[5 + i] = code & 0xff; + } this.emit(via); return; } @@ -157,6 +167,41 @@ test("a board that ignores the keymap read keeps its session for HE commands", a assert.equal(await keyboard.readKeyTravel(1, 1), 33); }); +test("setKeycode writes one key and confirms it by reading it back", async () => { + const board = new FakeBoard(); + const keyboard = client(board); + assert.equal(await keyboard.readViaProtocol(), 12); + assert.equal(await keyboard.setKeycode(0, 1, 2, 0x2c), 0x2c); // Space + const write = board.sent.find((frame) => frame[0] === 0x05)!; + assert.deepEqual([...write.slice(0, 6)], [0x05, 0, 1, 2, 0x00, 0x2c]); + assert.equal((await keyboard.readKeymap(0))[1]![2], 0x2c); + await assert.rejects(() => keyboard.setKeycode(0, rows, 0, 4), RangeError); + await assert.rejects(() => keyboard.setKeycode(0, 0, 0, 0x7e40), /not valid/); +}); + +test("setKeycode fails loudly when the board does not keep the assignment", async () => { + const board = new FakeBoard(); + board.ignoreKeycodeWrites = true; + await assert.rejects(() => client(board).setKeycode(0, 0, 0, 0x2c), /did not keep/); +}); + +test("older firmware uses the legacy layer-key table and rejects modern layer codes", async () => { + const board = new FakeBoard(); + board.viaProtocol = 10; + const keyboard = client(board); + assert.equal(await keyboard.setKeycode(0, 0, 0, 0x5100), 0x5100); // MO(0) on the legacy table + await assert.rejects(() => keyboard.setKeycode(0, 0, 1, 0x5221), /not valid/); // modern MO(1) means something else +}); + +test("remapWarnings flags replacing the only layer key on a layer", async () => { + const board = new FakeBoard(); + board.keymap.set(0, 0x5221); // MO(1), the only layer key on layer 0 + const keyboard = client(board); + assert.equal((await keyboard.remapWarnings(0, 0, 0, 0x04)).length, 1); + assert.deepEqual(await keyboard.remapWarnings(0, 0, 0, 0x5223), []); + assert.deepEqual(await keyboard.remapWarnings(0, 0, 1, 0x04), []); +}); + test("live travel matches the echoed key", async () => { const board = new FakeBoard(); assert.equal(await client(board).readKeyTravel(2, 5), 33); diff --git a/src/drivers/keychron/hid.ts b/src/drivers/keychron/hid.ts index 8bf60e0..b63ef44 100644 --- a/src/drivers/keychron/hid.ts +++ b/src/drivers/keychron/hid.ts @@ -6,7 +6,10 @@ import { decodeKeychronProfilesInfo, decodeKeychronRealtimeTravel, isKeychronHeReply, isKeychronHeVersion, joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, keychronNameWindow, keychronProfileChunk, keychronProfileNameBytes, keychronKeymapReadPlan, keychronViaFrames, - isKeychronKeymapReply, decodeKeychronKeymapChunk, joinKeychronKeymap, decodeKeychronLayerCount, keychronProfileReadPlan, + isKeychronKeymapReply, decodeKeychronKeymapChunk, joinKeychronKeymap, decodeKeychronLayerCount, + decodeKeychronViaProtocol, decodeKeychronKeycode, isKeychronKeycodeReply, keychronKeycodeIsChoosable, + keychronKeycodeContext, keychronIsLayerKey, + type KeychronKeycodeContext, keychronProfileReadPlan, type KeychronAxisType, type KeychronCalibrationState, type KeychronCurve, type KeychronHeSubcommand, type KeychronHeVersion, type KeychronHeVersionInfo, type KeychronProfileBuffer, type KeychronProfilesInfo, type KeychronTravelSetting, @@ -223,6 +226,73 @@ export class KeychronHidClient { }); } + private viaProtocol: number | null = null; + + /** The VIA protocol version the board reports; it selects the keycode table. */ + readViaProtocol(): Promise { + return this.serialized(() => this.viaProtocolVersion()); + } + + private async viaProtocolVersion(): Promise { + if (this.viaProtocol === null) { + const reply = await this.exchange( + keychronViaFrames.protocolVersion(), (frame) => decodeKeychronViaProtocol(frame) !== null, false, + ); + this.viaProtocol = decodeKeychronViaProtocol(reply)!; + } + return this.viaProtocol; + } + + /** Keycode context (protocol version and the board's custom keys) for legends and the picker. */ + keycodeContext(): Promise> { + return this.serialized(async () => keychronKeycodeContext(this.device.productId, await this.viaProtocolVersion())); + } + + private async readKey(layer: number, row: number, col: number): Promise { + const reply = await this.exchange( + keychronViaFrames.getKeycode(layer, row, col), (frame) => isKeychronKeycodeReply(frame, layer, row, col), false, + ); + return decodeKeychronKeycode(reply)!; + } + + /** + * Set one key's keycode and confirm it by reading the key back. Launcher + * writes without waiting for a reply, so the read-back is what proves the + * board took it. The keycode must be one this module can name for the + * board's protocol version, so a layer or custom code is never sent with the + * wrong table. Persists in the board's memory. + */ + setKeycode(layer: number, row: number, col: number, code: number): Promise { + return this.serialized(async () => { + const product = this.matrix(); + if (row >= product.rows || col >= product.cols) throw new RangeError("Key position is outside the board's matrix."); + const protocol = await this.viaProtocolVersion(); + const context = keychronKeycodeContext(this.device.productId, protocol); + if (!keychronKeycodeIsChoosable(code, context)) throw new RangeError("That keycode is not valid for this board's firmware."); + await this.open(); + await this.device.sendReport(KEYCHRON_REPORT_ID, keychronViaFrames.setKeycode(layer, row, col, code)); + const confirmed = await this.readKey(layer, row, col); + if (confirmed !== code) throw new Error("The keyboard did not keep the new key assignment."); + return confirmed; + }); + } + + /** + * Warnings before replacing `row`,`col` on `layer` with `code`: replacing the + * last layer key that reaches other layers can strand keys on those layers. + */ + async remapWarnings(layer: number, row: number, col: number, code: number): Promise { + const protocol = await this.readViaProtocol(); + const keymap = await this.readKeymap(layer); + const current = keymap[row]?.[col]; + const warnings: string[] = []; + if (current !== undefined && keychronIsLayerKey(current, protocol) && !keychronIsLayerKey(code, protocol)) { + const others = keymap.flat().filter((value, index) => keychronIsLayerKey(value, protocol) && index !== row * keymap[0]!.length + col); + if (others.length === 0) warnings.push("This is the only layer key on this layer; replacing it removes the way to reach other layers from here."); + } + return warnings; + } + /** Number of keymap layers the board has. */ readLayerCount(): Promise { return this.serialized(async () => { diff --git a/src/keychron/custom-keycodes.ts b/src/keychron/custom-keycodes.ts new file mode 100644 index 0000000..5183ad9 --- /dev/null +++ b/src/keychron/custom-keycodes.ts @@ -0,0 +1,247 @@ +/** + * Keychron custom keycodes per board, from Launcher's definitions + * (`customKeycodes`). Index `n` is the keycode `base + n`, where `base` depends on + * the board's VIA protocol version (see `keychronCustomKeycodeBase`). Each entry + * is `[shortName, title]`. + */ + +const CUSTOM_LISTS: readonly (readonly (readonly [short: string, title: string])[])[] = [ + [["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["Lock", "Lock Screenin Windows"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["SideHue", "side led hue"], ["SideStep", "side led step"], ["SideBD", "side brightness decrease"], ["SideBI", "side brightness increase"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Mac"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["Mac/Win", "Switch between windows and macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Mac"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["TGWM", "Toggle to WIN/MAC"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Launch Pad in Mac"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["Mac/Win", "Switch between windows and macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["OSTog", "Toggle between macOS and Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in MacOS"], ["LPad", "Lanuch Pad in MacOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["Mac/Win", "Switch between windows and macOS"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["OSTog", "Toggle between macOS and Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["Mac/Win", "Switch between windows and macOS"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["OSTog", "Toggle between Windows and macOS"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["Pair", "Wireless Mode Pairing"], ["SR", "Screen Recording"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Mac"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Lanuch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["TGWM", "Toggle to WIN/MAC"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Lanuch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["Boot", "BootLoader"], ["2.4G", "2.4G Pair"], ["SCRLOCK", "Screen lock in macOS"], ["Cmd-Comma", "Open preferences for the front app in macOS"], ["Opt", "Left Option"], ["Opt", "Right Option"], ["Cmd", "Left Command"], ["Cmd", "Right Command"], ["DESKTOP_L-m", "Switch desktops Left in macOS"], ["DESKTOP_R-m", "Switch desktops Right in macOS"], ["Emoji-m", "Open emoji in macOS"], ["Task", "Task View in Windows"], ["DESKTOP_L-w", "Switch desktops Left in Windows"], ["DESKTOP_R-w", "Switch desktops Right in Windows"], ["File", "File Explorer in Windows"], ["WinLock", "Lock your PC or switch accounts"], ["Set", "Open Settings in Windows"], ["Emoji-w", "Open emoji in Windows"], ["PrtSc-w", "Print Screen in Windows"], ["SShot", "Screenshot in macOS"], ["Batt", "Show battery level"], ["Siri", "call siri"], ["Cort", "call cortana"], ["MCtl", "Mission Control in macOS"], ["LPad", "Launch Pad in macOS"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["Mac/Win", "Switch between windows and macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["BL_SPI", "BL_SPI"], ["BL_SPD", "BL_SPD"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["Mac/Win", "Switch between windows and macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["TGWM", "Toggle to WIN/MAC"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana on Windows"], ["Voice", "Voice Input on Windows"], ["WLCK", "Lock Screen on Windows"], ["MLCK", "Lock Screen on macOS"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["OSTog", "Toggle between macOS and Windows"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Globe", "Globe"], ["Focus", "Focus"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri in macOS"], ["OS Tog", "Toggle macOS/Windows mode"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Keychron Launcher in macOS"], ["WCHR", "Keychron Launcher in Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Globe", "Globe"], ["Focus", "Focus"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["OS Tog", "Toggle macOS/Windows mode"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Keychron Launcher in macOS"], ["WCHR", "Keychron Launcher in Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Launch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Mission Control on macOS"], ["LPad", "Launch Pad on macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View on Windows"], ["File", "File Explorer on Windows"], ["SShot", "Screenshot on macOS"], ["Cortana", "Cortana on Windows 10"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["OSTog", "Toggle between macOS and Windows"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Globe", "Globe"], ["Focus", "Focus"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Keychron Launcher in macOS"], ["WCHR", "Keychron Launcher in Windows"]], + [["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["Lock", "Lock Screen in Windows"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOption", "Left Option"], ["ROption", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Launch Pad in Windows"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["Lock", "Lock Screenin Windows"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Mission Control on macOS"], ["LPad", "Launch Pad on macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View on Windows"], ["File", "File Explorer on Windows"], ["SShot", "Screenshot on macOS"], ["Cortana", "Cortana on Windows 10"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri on macOS"], ["BT1", "Bluetooth Host 1"], ["BT2", "Bluetooth Host 2"], ["BT3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Mission Control on macOS"], ["LPad", "Launch Pad on macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View on Windows"], ["File", "File Explorer on Windows"], ["SShot", "Screenshot on macOS"], ["Cortana", "Cortana on Windows 10"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri on macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["L Opt", "Left Option"], ["R Opt", "Right Option"], ["L Cmd", "Left Command"], ["R Cmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Mission Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Mission Control on macOS"], ["LPad", "Launch Pad on macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View on Windows"], ["File", "File Explorer on Windows"], ["SShot", "Screenshot on macOS"], ["Cortana", "Cortana on Windows"], ["Siri", "Siri on macOS"], ["BT1", "Bluetooth Host 1"], ["BT2", "Bluetooth Host 2"], ["BT3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Mac"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Launch Pad in Mac"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Lanuch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["TGWM", "Toggle to WIN/MAC"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Lanuch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOption", "Left Option"], ["ROption", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Launch Pad in Windows"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["OSTog", "Toggle between Windows and macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Lanuch Pad in macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["TGWM", "Toggle to WIN/MAC"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in Mac"], ["LPad", "Lanuch Pad in Windows"], ["Globe", "Globe"], ["Focus", "Focus"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["MCHR", "Keychron Launcher in macOS"], ["WCHR", "Keychron Launcher in Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Mission Control on macOS"], ["LPad", "Launch Pad on macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View on Windows"], ["File", "File Explorer on Windows"], ["SShot", "Screenshot on macOS"], ["Cortana", "Cortana on Windows 10"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri on macOS"], ["BT1", "Bluetooth Host 1"], ["BT2", "Bluetooth Host 2"], ["BT3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["OS_TOGGL", "OS_TOGGL"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana on Windows"], ["Voice", "Voice Input on Windows"], ["WLCK", "Lock Screen on Windows"], ["MLCK", "Lock Screen on macOS"], ["Siri", "Siri in macOS"], ["BTH1", "Bluetooth Host 1"], ["BTH2", "Bluetooth Host 2"], ["BTH3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["OSTog", "Toggle between macOS and Windows"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"], ["SideHue", "side led hue"], ["SideStep", "side led step"], ["SideBD", "side brightness decrease"], ["SideBI", "side brightness increase"], ["SideSPI", "side speed increase"], ["SideSPD", "side speed decrease"]], + [["LOpt", "Left Option"], ["ROpt", "Right Option"], ["LCmd", "Left Command"], ["RCmd", "Right Command"], ["MCtl", "Misson Control in macOS"], ["LPad", "Lanuch Pad in macOS"], ["Glob", "Globe/Fn on macOS"], ["Focus", "Toggle focus mode on macOS"], ["Task", "Task View in Windows"], ["File", "File Explorer in Windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in Windows"], ["Voice", "Voice Input in Windows"], ["Siri", "Siri in macOS"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["TGWM", "Toggle to WIN/MAC"]], + [["LOpt", "Left Option in macOS"], ["ROpt", "Right Option in macOS"], ["LCmd", "Left Command in macOS"], ["RCmd", "Right Command in macOS"], ["MCtl", "Mission Control in macOS"], ["LPad", "Launch Pad in macOS"], ["Task", "Task View in windows"], ["File", "File Explorer in windows"], ["SShot", "Screenshot in macOS"], ["Cortana", "Cortana in windows"], ["Voice", "Voice Input on Windows"], ["Siri", "Siri in macOS"], ["BT1", "Bluetooth Host 1"], ["BT2", "Bluetooth Host 2"], ["BT3", "Bluetooth Host 3"], ["2.4G", "2.4G"], ["Batt", "Show battery level"], ["PROF1", "Profile 1"], ["PROF2", "Profile 2"], ["PROF3", "Profile 3"], ["MCHR", "Open Keychron Launcher on macOS"], ["WCHR", "Open Keychron Launcher on Windows"]], +]; + +const CUSTOM_BY_PRODUCT: Readonly> = { + 0x0402: 0, + 0x0403: 0, + 0x040c: 1, + 0x0416: 2, + 0x0417: 3, + 0x0418: 4, + 0x0419: 5, + 0x041b: 6, + 0x041c: 6, + 0x041e: 7, + 0x041f: 1, + 0x0429: 8, + 0x042f: 8, + 0x043b: 9, + 0x0441: 7, + 0x0445: 7, + 0x0446: 4, + 0x0449: 10, + 0x044a: 4, + 0x044b: 7, + 0x0450: 11, + 0x0454: 10, + 0x045a: 12, + 0x045b: 13, + 0x045c: 14, + 0x045d: 14, + 0x045e: 6, + 0x045f: 6, + 0x0460: 15, + 0x0464: 16, + 0x0471: 15, + 0x0472: 15, + 0x0476: 16, + 0x047b: 17, + 0x047c: 15, + 0x047d: 18, + 0x047e: 19, + 0x0480: 19, + 0x0481: 16, + 0x0484: 20, + 0x0485: 19, + 0x0486: 16, + 0x048a: 21, + 0x048e: 8, + 0x048f: 22, + 0x0490: 16, + 0x0494: 23, + 0x0497: 24, + 0x0498: 15, + 0x049b: 17, + 0x049c: 25, + 0x04a1: 26, + 0x04a2: 27, + 0x04a5: 26, + 0x04a6: 26, + 0x0511: 28, + 0x0b00: 1, + 0x0b01: 1, + 0x0b02: 1, + 0x0b10: 29, + 0x0b11: 1, + 0x0b12: 1, + 0x0b13: 30, + 0x0b14: 31, + 0x0b15: 31, + 0x0b16: 32, + 0x0b20: 33, + 0x0b30: 12, + 0x0b31: 1, + 0x0b32: 1, + 0x0b33: 34, + 0x0b40: 1, + 0x0b50: 1, + 0x0b51: 1, + 0x0b52: 1, + 0x0b53: 32, + 0x0b60: 1, + 0x0b61: 1, + 0x0b62: 12, + 0x0b63: 32, + 0x0b64: 1, + 0x0b65: 32, + 0x0b66: 32, + 0x0ba0: 1, + 0x0bb0: 31, + 0x0bc0: 1, + 0x0bc1: 1, + 0x0e20: 35, + 0x0e21: 1, + 0x0e22: 1, + 0x0e23: 1, + 0x0e24: 32, + 0x0e25: 36, + 0x0e26: 36, + 0x0e27: 32, + 0x0e2a: 32, + 0x0e30: 1, + 0x0e31: 1, + 0x0e32: 37, + 0x0e35: 37, + 0x0e40: 1, + 0x0e41: 1, + 0x0e42: 38, + 0x0e43: 1, + 0x0e44: 1, + 0x0e45: 32, + 0x0e60: 1, + 0x0e61: 1, + 0x0e80: 1, + 0x0e81: 39, + 0x0e82: 39, + 0x0e83: 32, + 0x0e84: 32, + 0x0e85: 32, + 0x0e86: 32, + 0x0ea0: 1, + 0x0ea1: 1, + 0x0ea2: 1, + 0x0ea3: 1, + 0x0ea4: 1, + 0x0ea5: 1, + 0x0ea6: 1, + 0x0ea7: 32, + 0x0ea8: 32, + 0x0ea9: 32, + 0x0ec0: 1, + 0x1001: 16, + 0x1004: 14, + 0x1005: 15, + 0x1010: 40, + 0x1011: 12, + 0x1012: 14, + 0x1013: 14, + 0x1014: 41, + 0x1015: 14, + 0x1016: 41, + 0x1020: 40, + 0x1023: 42, + 0x1030: 43, + 0x1031: 43, + 0x1032: 14, + 0x1033: 16, + 0x1050: 44, + 0x1053: 45, + 0x1060: 40, + 0x1061: 16, + 0x1062: 16, + 0x1063: 41, + 0x1064: 16, + 0x10f3: 43, + 0x10f4: 14, + 0x1234: 1, + 0x1500: 2, + 0x1532: 44, + 0x1533: 20, + 0x1535: 15, + 0x1536: 46, + 0x1540: 47, + 0x1541: 15, + 0x1710: 12, + 0x1711: 48, + 0x1728: 49, + 0x1729: 32, + 0x172c: 50, + 0x172d: 51, + 0x1740: 16, + 0x17c0: 15, + 0x17f0: 15, + 0x1860: 52, +}; + +export interface KeychronCustomKeycode { + /** Index within the board's custom keycodes. */ + index: number; + shortName: string; + title: string; +} + +/** The custom keycodes of a catalogued board, or an empty list. */ +export function keychronCustomKeycodes(productId: number): readonly KeychronCustomKeycode[] { + const list = CUSTOM_LISTS[CUSTOM_BY_PRODUCT[productId] ?? -1] ?? []; + return list.map(([shortName, title], index) => ({ index, shortName, title })); +} diff --git a/src/keychron/index.ts b/src/keychron/index.ts index d7f1cad..1458f55 100644 --- a/src/keychron/index.ts +++ b/src/keychron/index.ts @@ -356,7 +356,15 @@ export const keychronHeFrames = { * They share the same 32-byte raw-HID report as `KC_HE` but use their own * command ids (not 0xA9). */ -export const KEYCHRON_VIA_COMMAND = { getLayerCount: 0x11, getKeymapBuffer: 0x12 } as const; +export const KEYCHRON_VIA_COMMAND = { + getProtocolVersion: 0x01, + getKeycode: 0x04, + setKeycode: 0x05, + getLayerCount: 0x11, + getKeymapBuffer: 0x12, + getEncoder: 0x14, + setEncoder: 0x15, +} as const; /** Keys per keymap read: a reply carries up to 28 bytes, two per keycode. */ export const KEYCHRON_KEYMAP_KEYS_PER_READ = 14; @@ -386,7 +394,30 @@ function viaFrame(command: number, ...args: number[]): Uint8Array { return out; } +function viaByte(value: number, what: string): number { + if (!Number.isInteger(value) || value < 0 || value > U8) throw new RangeError(`Invalid ${what}.`); + return value; +} + +function viaCode(code: number): [number, number] { + if (!Number.isInteger(code) || code < 0 || code > 0xffff) throw new RangeError("Invalid keycode."); + return [code >> 8, code & U8]; +} + export const keychronViaFrames = { + protocolVersion: () => viaFrame(KEYCHRON_VIA_COMMAND.getProtocolVersion), + /** Read one key's keycode. */ + getKeycode: (layer: number, row: number, col: number) => + viaFrame(KEYCHRON_VIA_COMMAND.getKeycode, viaByte(layer, "layer"), viaByte(row, "row"), viaByte(col, "column")), + /** Set one key's keycode (VIA dynamic_keymap_set_keycode). */ + setKeycode(layer: number, row: number, col: number, code: number) { + return viaFrame(KEYCHRON_VIA_COMMAND.setKeycode, viaByte(layer, "layer"), viaByte(row, "row"), viaByte(col, "column"), ...viaCode(code)); + }, + getEncoder: (layer: number, encoder: number, clockwise: boolean) => + viaFrame(KEYCHRON_VIA_COMMAND.getEncoder, viaByte(layer, "layer"), viaByte(encoder, "encoder"), clockwise ? 1 : 0), + setEncoder(layer: number, encoder: number, clockwise: boolean, code: number) { + return viaFrame(KEYCHRON_VIA_COMMAND.setEncoder, viaByte(layer, "layer"), viaByte(encoder, "encoder"), clockwise ? 1 : 0, ...viaCode(code)); + }, layerCount: () => viaFrame(KEYCHRON_VIA_COMMAND.getLayerCount), keymapBuffer(read: KeychronKeymapRead) { if (read.bytes < 2 || read.bytes > 28 || read.bytes % 2 !== 0) throw new RangeError("A keymap read carries 1-14 keycodes."); @@ -400,6 +431,22 @@ export function isKeychronKeymapReply(report: Uint8Array, offset: number): boole && report[1] === offset >> 8 && report[2] === (offset & U8); } +/** Protocol version reply: Launcher reads byte 2 (the low byte), treating 0 as 5. */ +export function decodeKeychronViaProtocol(report: Uint8Array): number | null { + return report.length >= 3 && report[0] === KEYCHRON_VIA_COMMAND.getProtocolVersion ? report[2]! || 5 : null; +} + +/** True when `report` answers a get-keycode for this key. */ +export function isKeychronKeycodeReply(report: Uint8Array, layer: number, row: number, col: number): boolean { + return report.length >= 6 && report[0] === KEYCHRON_VIA_COMMAND.getKeycode + && report[1] === layer && report[2] === row && report[3] === col; +} + +/** Keycode in a get-keycode reply: big-endian at bytes 4-5. */ +export function decodeKeychronKeycode(report: Uint8Array): number | null { + return report.length >= 6 && report[0] === KEYCHRON_VIA_COMMAND.getKeycode ? (report[4]! << 8) | report[5]! : null; +} + /** Layer count reply: byte 1. */ export function decodeKeychronLayerCount(report: Uint8Array): number | null { return report.length >= 2 && report[0] === KEYCHRON_VIA_COMMAND.getLayerCount ? report[1]! : null; @@ -609,3 +656,4 @@ export function keychronHeAcknowledged(report: Uint8Array, subcommand: KeychronH export * from "./products.js"; export * from "./layouts.js"; export * from "./keycodes.js"; +export * from "./custom-keycodes.js"; diff --git a/src/keychron/keycodes.ts b/src/keychron/keycodes.ts index 83ef2be..4df0451 100644 --- a/src/keychron/keycodes.ts +++ b/src/keychron/keycodes.ts @@ -1,9 +1,21 @@ /** - * Short key legends for QMK keycodes, for drawing a keyboard from a keymap - * read. Covers the common basic keycodes, modifiers, layer keys and the - * modifier/layer-tap wrappers; anything else falls back to its hex value so a - * custom or vendor keycode is never shown as something it is not. + * QMK keycodes for the Keychron Hall-effect boards: short legends for drawing + * a keymap, and a catalog for choosing what a key should do. + * + * The basic keycodes (0x0000-0x00FF) mean the same on every firmware. The + * layer keys and the custom (board-specific) range moved between QMK versions, + * and Launcher picks its table from the VIA protocol version the board + * reports, so everything here takes that version. Table values are from + * Launcher's four keycode tables: + * + * protocol >= 12 layer keys at 0x5200 (TO) / 0x5220 (MO) ...; custom at 0x7E00 + * protocol == 11 same layer keys; custom at 0x7F00 + * protocol <= 10 layer keys at 0x5000/0x5010 (TO), 0x5100 (MO) ...; custom at 0x5F80 + * + * Anything not recognised is shown by its hex value and cannot be chosen, so + * a key is never labelled as something it is not. */ +import { keychronCustomKeycodes } from "./custom-keycodes.js"; export interface KeychronLegend { /** What to draw on the key; empty for an unassigned key. */ @@ -14,6 +26,18 @@ export interface KeychronLegend { unknown: boolean; } +export interface KeychronKeycodeContext { + /** VIA protocol version the board reports. Defaults to 12 (current QMK). */ + protocol?: number; + /** Board-specific keycodes from `keychronCustomKeycodes`. */ + custom?: readonly { index: number; shortName: string; title: string }[]; +} + +/** Context for a board: its protocol version and its own custom keycodes. */ +export function keychronKeycodeContext(productId: number, protocol: number): Required { + return { protocol, custom: keychronCustomKeycodes(productId) }; +} + const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const DIGITS = "1234567890"; @@ -37,6 +61,27 @@ const BASIC: Readonly> = { const MOD_BITS = [["Ctrl", 0x01], ["Shift", 0x02], ["Alt", 0x04], ["Win", 0x08]] as const; +/** Layer-key bases per protocol range, each covering 32 layers. */ +const LAYER_BASES = { + modern: { to: 0x5200, mo: 0x5220, df: 0x5240, tg: 0x5260, osl: 0x5280, tt: 0x52c0 }, + legacy: { to: 0x5010, mo: 0x5100, df: 0x5200, tg: 0x5300, osl: 0x5400, tt: 0x5800 }, +} as const; +type LayerKind = keyof (typeof LAYER_BASES)["modern"]; +const LAYER_NAMES: Readonly> = { + to: ["TO", "Switch to layer"], mo: ["MO", "Momentary layer"], df: ["DF", "Default layer"], + tg: ["TG", "Toggle layer"], osl: ["OS", "One-shot layer"], tt: ["TT", "Layer tap-toggle"], +}; + +const layerBases = (protocol: number) => (protocol >= 11 ? LAYER_BASES.modern : LAYER_BASES.legacy); + +/** First custom keycode: 0x7E00 on protocol 12+, 0x7F00 on 11, 0x5F80 before. */ +export function keychronCustomKeycodeBase(protocol: number): number { + return protocol >= 12 ? 0x7e00 : protocol === 11 ? 0x7f00 : 0x5f80; +} + +/** How many custom keycodes the firmware can address (Launcher's table allows 16). */ +export const KEYCHRON_CUSTOM_KEYCODE_SLOTS = 16; + function basic(code: number): [string, string] | null { if (code >= 0x04 && code <= 0x1d) return [LETTERS[code - 0x04]!, `Key ${LETTERS[code - 0x04]}`]; if (code >= 0x1e && code <= 0x27) return [DIGITS[code - 0x1e]!, `Key ${DIGITS[code - 0x1e]}`]; @@ -46,8 +91,18 @@ function basic(code: number): [string, string] | null { return BASIC[code] ?? null; } +function layerKey(code: number, protocol: number): { kind: LayerKind; layer: number } | null { + const bases = layerBases(protocol); + for (const kind of Object.keys(bases) as LayerKind[]) { + const base = bases[kind]; + if (code >= base && code < base + 0x20) return { kind, layer: code - base }; + } + return null; +} + /** Legend for one keycode as read from the board. */ -export function keychronKeycodeLegend(code: number): KeychronLegend { +export function keychronKeycodeLegend(code: number, context: KeychronKeycodeContext = {}): KeychronLegend { + const protocol = context.protocol ?? 12; if (code === 0x0000) return { label: "", title: "No key", unknown: false }; if (code === 0x0001) return { label: "▽", title: "Transparent (falls through to the layer below)", unknown: false }; const direct = basic(code); @@ -59,17 +114,84 @@ export function keychronKeycodeLegend(code: number): KeychronLegend { if (key && mods.length) return { label: key[0], title: `${mods.join("+")}+${key[1]}`, unknown: false }; } // Mod-tap 0x2000-0x3FFF and layer-tap 0x4000-0x4FFF: the tap key is the legend. - if ((code >= 0x2000 && code <= 0x4fff)) { + if (code >= 0x2000 && code <= 0x4fff) { const key = basic(code & 0xff); if (key) return { label: key[0], title: `${code >= 0x4000 ? "Layer-tap" : "Mod-tap"} ${key[1]}`, unknown: false }; } - const layer = code & 0x1f; - if (code >= 0x5200 && code <= 0x521f) return { label: `TO${layer}`, title: `Switch to layer ${layer}`, unknown: false }; - if (code >= 0x5220 && code <= 0x523f) return { label: `MO${layer}`, title: `Momentary layer ${layer}`, unknown: false }; - if (code >= 0x5240 && code <= 0x525f) return { label: `DF${layer}`, title: `Default layer ${layer}`, unknown: false }; - if (code >= 0x5260 && code <= 0x527f) return { label: `TG${layer}`, title: `Toggle layer ${layer}`, unknown: false }; - if (code >= 0x5280 && code <= 0x529f) return { label: `OS${layer}`, title: `One-shot layer ${layer}`, unknown: false }; - if (code >= 0x52c0 && code <= 0x52df) return { label: `TT${layer}`, title: `Layer tap-toggle ${layer}`, unknown: false }; + const layer = layerKey(code, protocol); + if (layer) { + const [short, title] = LAYER_NAMES[layer.kind]; + return { label: `${short}${layer.layer}`, title: `${title} ${layer.layer}`, unknown: false }; + } + const base = keychronCustomKeycodeBase(protocol); + if (code >= base && code < base + KEYCHRON_CUSTOM_KEYCODE_SLOTS) { + const entry = context.custom?.find((item) => item.index === code - base); + if (entry) return { label: entry.shortName, title: entry.title, unknown: false }; + } const hex = `0x${code.toString(16).toUpperCase().padStart(4, "0")}`; return { label: hex, title: `Unrecognised keycode ${hex}`, unknown: true }; } + +export interface KeychronCatalogEntry { code: number; label: string; title: string } +export interface KeychronCatalogCategory { id: string; label: string; entries: readonly KeychronCatalogEntry[] } + +const range = (from: number, to: number, context: KeychronKeycodeContext): KeychronCatalogEntry[] => + Array.from({ length: to - from + 1 }, (_, i) => { + const legend = keychronKeycodeLegend(from + i, context); + return { code: from + i, label: legend.label, title: legend.title }; + }); + +const list = (codes: readonly number[], context: KeychronKeycodeContext): KeychronCatalogEntry[] => + codes.map((code) => { + const legend = keychronKeycodeLegend(code, context); + return { code, label: legend.label, title: legend.title }; + }); + +/** + * Keycodes a key can be set to, grouped for a picker. Basic keys are offered + * on every firmware; layer keys and the board's custom keys come from the + * table for `context.protocol`. `layerCount` limits the layer keys. + */ +export function keychronKeycodeCatalog( + context: KeychronKeycodeContext & { layerCount?: number } = {}, +): KeychronCatalogCategory[] { + const protocol = context.protocol ?? 12; + const layers = Math.min(context.layerCount ?? 4, 32); + const bases = layerBases(protocol); + const layerEntries = (Object.keys(bases) as LayerKind[]).flatMap((kind) => + Array.from({ length: layers }, (_, layer) => { + const code = bases[kind] + layer; + const legend = keychronKeycodeLegend(code, context); + return { code, label: legend.label, title: legend.title }; + })); + const custom = (context.custom ?? []) + .filter((item) => item.index < KEYCHRON_CUSTOM_KEYCODE_SLOTS) + .map((item) => ({ code: keychronCustomKeycodeBase(protocol) + item.index, label: item.shortName, title: item.title })); + const categories: KeychronCatalogCategory[] = [ + { id: "letters", label: "Letters", entries: range(0x04, 0x1d, context) }, + { id: "numbers", label: "Numbers", entries: range(0x1e, 0x27, context) }, + { id: "punctuation", label: "Punctuation", entries: list([0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38], context) }, + { id: "editing", label: "Editing", entries: list([0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x39, 0x49, 0x4c], context) }, + { id: "navigation", label: "Navigation", entries: list([0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52], context) }, + { id: "function", label: "Function keys", entries: [...range(0x3a, 0x45, context), ...range(0x68, 0x73, context)] }, + { id: "modifiers", label: "Modifiers", entries: range(0xe0, 0xe7, context) }, + { id: "keypad", label: "Keypad", entries: [...list([0x53, 0x54, 0x55, 0x56, 0x57, 0x58], context), ...range(0x59, 0x63, context)] }, + { id: "system", label: "System", entries: list([0x46, 0x47, 0x48, 0x65], context) }, + { id: "media", label: "Media", entries: range(0xa8, 0xae, context) }, + { id: "layers", label: "Layers", entries: layerEntries }, + { id: "special", label: "Special", entries: list([0x0000, 0x0001], context) }, + ]; + if (custom.length) categories.push({ id: "keychron", label: "Keychron", entries: custom }); + return categories.filter((category) => category.entries.length > 0); +} + +/** True when `code` is one this module can name for the firmware's protocol. */ +export function keychronKeycodeIsChoosable(code: number, context: KeychronKeycodeContext = {}): boolean { + if (!Number.isInteger(code) || code < 0 || code > 0xffff) return false; + return !keychronKeycodeLegend(code, context).unknown; +} + +/** True when `code` is a layer key (MO/TG/TO/DF/OSL/TT) on this firmware. */ +export function keychronIsLayerKey(code: number, protocol = 12): boolean { + return layerKey(code, protocol) !== null; +} diff --git a/src/keychron/protocol.test.ts b/src/keychron/protocol.test.ts index ac00086..18cace9 100644 --- a/src/keychron/protocol.test.ts +++ b/src/keychron/protocol.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import test from "node:test"; import { - KEYCHRON_HE_COMMAND, decodeKeychronKeymapChunk, joinKeychronKeymap, keychronKeycodeLegend, keychronKeymapReadPlan, keychronLayoutFor, keychronViaFrames, KEYCHRON_KEY_MODE, KEYCHRON_WORK_MODE, keychronKeyBitmap, keychronKeyTarget, keychronProfileNameBytes, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_HE_SUBCOMMAND, + KEYCHRON_HE_COMMAND, keychronCustomKeycodeBase, keychronCustomKeycodes, keychronKeycodeCatalog, keychronKeycodeContext, keychronKeycodeIsChoosable, decodeKeychronViaProtocol, decodeKeychronKeycode, decodeKeychronKeymapChunk, joinKeychronKeymap, keychronKeycodeLegend, keychronKeymapReadPlan, keychronLayoutFor, keychronViaFrames, KEYCHRON_KEY_MODE, KEYCHRON_WORK_MODE, keychronKeyBitmap, keychronKeyTarget, keychronProfileNameBytes, KEYCHRON_HE_PRODUCTS, KEYCHRON_HE_PRODUCT_IDS, KEYCHRON_HE_SUBCOMMAND, decodeKeychronAxisType, decodeKeychronCalibrationState, decodeKeychronCurve, decodeKeychronHeVersion, decodeKeychronKeySlot, decodeKeychronProfileBuffer, decodeKeychronProfileName, decodeKeychronProfilesInfo, decodeKeychronRealtimeTravel, joinKeychronProfile, keychronHeAcknowledged, keychronHeFrames, @@ -243,3 +243,56 @@ test("every catalogued board has a physical layout whose keys fit its matrix", ( } assert.equal(keychronLayoutFor(0x0001), null); }); + +test("keycode tables follow the firmware protocol version", () => { + assert.equal(keychronKeycodeLegend(0x5221, { protocol: 12 }).label, "MO1"); + assert.equal(keychronKeycodeLegend(0x5221, { protocol: 10 }).unknown, true); + assert.equal(keychronKeycodeLegend(0x5101, { protocol: 10 }).label, "MO1"); + assert.equal(keychronKeycodeLegend(0x5101, { protocol: 12 }).unknown, true); + assert.equal(keychronCustomKeycodeBase(12), 0x7e00); + assert.equal(keychronCustomKeycodeBase(11), 0x7f00); + assert.equal(keychronCustomKeycodeBase(10), 0x5f80); + assert.equal(keychronKeycodeIsChoosable(0x04, { protocol: 5 }), true); + assert.equal(keychronKeycodeIsChoosable(0x10000), false); + assert.equal(keychronKeycodeIsChoosable(-1), false); +}); + +test("custom keycodes resolve through the board's own list", () => { + const id = KEYCHRON_HE_PRODUCT_IDS[0]!; + const custom = keychronCustomKeycodes(id); + assert.ok(custom.length > 0); + const context = keychronKeycodeContext(id, 12); + const legend = keychronKeycodeLegend(0x7e00, context); + assert.equal(legend.unknown, false); + assert.equal(legend.label, custom[0]!.shortName); + assert.equal(keychronKeycodeLegend(0x7e00, { protocol: 12 }).unknown, true); + assert.deepEqual(keychronCustomKeycodes(0x0001), []); +}); + +test("the catalog offers only codes the legend can name, with no duplicates per category", () => { + const id = KEYCHRON_HE_PRODUCT_IDS[0]!; + for (const protocol of [10, 11, 12]) { + const context = keychronKeycodeContext(id, protocol); + const catalog = keychronKeycodeCatalog({ ...context, layerCount: 4 }); + assert.ok(catalog.some((category) => category.id === "letters")); + assert.ok(catalog.some((category) => category.id === "layers" && category.entries.length === 24)); + for (const category of catalog) { + assert.equal(new Set(category.entries.map((entry) => entry.code)).size, category.entries.length, category.id); + for (const entry of category.entries) assert.equal(keychronKeycodeIsChoosable(entry.code, context), true, `${protocol} ${entry.code}`); + } + } + assert.equal(keychronKeycodeCatalog({ protocol: 12 }).some((category) => category.id === "keychron"), false); +}); + +test("VIA keycode frames and replies match the dynamic-keymap layout", () => { + assert.deepEqual([...keychronViaFrames.setKeycode(1, 2, 3, 0x1234).slice(0, 6)], [0x05, 1, 2, 3, 0x12, 0x34]); + assert.deepEqual([...keychronViaFrames.getKeycode(1, 2, 3).slice(0, 4)], [0x04, 1, 2, 3]); + assert.deepEqual([...keychronViaFrames.setEncoder(0, 1, true, 0x0004).slice(0, 6)], [0x15, 0, 1, 1, 0, 4]); + assert.throws(() => keychronViaFrames.setKeycode(0, 0, 256, 4), RangeError); + assert.throws(() => keychronViaFrames.setKeycode(0, 0, 0, 0x10000), RangeError); + const reply = new Uint8Array(32); reply.set([0x04, 1, 2, 3, 0x12, 0x34]); + assert.equal(decodeKeychronKeycode(reply), 0x1234); + const version = new Uint8Array(32); version.set([0x01, 0, 12]); + assert.equal(decodeKeychronViaProtocol(version), 12); + assert.equal(decodeKeychronViaProtocol(new Uint8Array(32).fill(0).map((_, i) => (i === 0 ? 1 : 0))), 5); +});