From 694ad5377f88c93d2bfc76ddc14218a7bd34d9f1 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 18 Oct 2026 22:17:06 +0700 Subject: [PATCH] t27f lesson reels: course 0 lessons as data and a lesson reel generator, lesson 1 in EN and RU (Closes #10494) reel_topics.t27 carries the 27 lessons of course 0 in EN and RU as code points: title, goal, task, id and spec code. lesson_reel.t27 turns a topic index and a language into caption chunks, code cards, tags, the CTA and the ffmpeg graph on the token_floor template. token_floor_mux makes four text helpers pub. Lab: reel_topics 7/7, lesson_reel 6/6, token_floor_mux 16/16, 0 vacuous. Co-Authored-By: Claude Opus 5.5 --- .trinity/seals/t27f_lesson_reel.json | 53 ++ .trinity/seals/t27f_reel_topics.json | 28 + .trinity/seals/t27f_token_floor_mux.json | 6 +- specs/t27f/lesson_reel.t27 | 823 +++++++++++++++++++++++ specs/t27f/reel_topics.t27 | 751 +++++++++++++++++++++ specs/t27f/token_floor_mux.t27 | 8 +- 6 files changed, 1662 insertions(+), 7 deletions(-) create mode 100644 .trinity/seals/t27f_lesson_reel.json create mode 100644 .trinity/seals/t27f_reel_topics.json create mode 100644 specs/t27f/lesson_reel.t27 create mode 100644 specs/t27f/reel_topics.t27 diff --git a/.trinity/seals/t27f_lesson_reel.json b/.trinity/seals/t27f_lesson_reel.json new file mode 100644 index 0000000000..490e46ad7c --- /dev/null +++ b/.trinity/seals/t27f_lesson_reel.json @@ -0,0 +1,53 @@ +{ + "built_by": "t27c-bootstrap@0.5.2+9448ab4be", + "closure": [ + { + "spec": "specs/automation/owner_voice_reel.t27", + "spec_hash": "sha256:76c0df8e57686a90b3bce85bcb0148cbed7fd05da724b217ef53fa468664f151" + }, + { + "spec": "specs/t27f/reel_marketing.t27", + "spec_hash": "sha256:ab07f6476d900cc0e089ba1d851f0b610a77b778f00fd906d1b98a29281941c7" + }, + { + "spec": "specs/t27f/reel_particles_mux.t27", + "spec_hash": "sha256:1f5486ae5a6dabe9c059733f1f45d1646ca98b555e07103e00e2dc0be53f0747" + }, + { + "spec": "specs/t27f/reel_topics.t27", + "spec_hash": "sha256:7c1762cde96524791711594d23f880fbad1f497a499277710f1fd61d52d50157" + }, + { + "spec": "specs/t27f/token_floor_mux.t27", + "spec_hash": "sha256:55c02c60e581640d2f3d6db3d9ba2cdfb21d74b172290b386023e8f264e59a04" + }, + { + "spec": "specs/t27f/token_floor_scenes.t27", + "spec_hash": "sha256:948cff4bd34341b40b43c8a170e2a37e3bca59f8d6bc8e35d7e5ee43fe89a4ea" + } + ], + "config": "gen=c,rust,verilog,zig;tests=zig", + "gen_hash_c": "sha256:74d5f5d8fad98ead782f6c26309ed349da58471650642503a13a8e32cb7427ae", + "gen_hash_rust": "sha256:ccc5014bd6bf09ba55b21e4d5bd5fb80383c36cce4d83468812bdd4fadd04835", + "gen_hash_verilog": "sha256:f956226ada7459fc5d856060971f9160ab41ee78b1a5dbf713ad8531e3d41abd", + "gen_hash_zig": "sha256:42635d596d160c7c49521929d8e4f8f640f89a3180b5e1ac118c0177c4d14545", + "module": "lesson_reel", + "ring": 12, + "seal_schema": 2, + "sealed_at": "2026-10-18T15:14:32Z", + "sealed_by": "t27c-bootstrap@0.5.2", + "spec_hash": "sha256:0c527e6415d5ffe600cd425db2456e1691e47bcaaf69cf5af0b856bb8bfec66e", + "spec_path": "specs/t27f/lesson_reel.t27", + "tests": { + "failed": 0, + "failing": [], + "forced": false, + "passed": 6, + "total": 6, + "vacuous": 0 + }, + "toolchain": { + "test_runner": "sha256:1982ae948e24d00c5d221ccec12dfce1eb01204b53e37b0f857f93b16d64629d", + "zig": "0.16.0" + } +} \ No newline at end of file diff --git a/.trinity/seals/t27f_reel_topics.json b/.trinity/seals/t27f_reel_topics.json new file mode 100644 index 0000000000..ab1ff79e12 --- /dev/null +++ b/.trinity/seals/t27f_reel_topics.json @@ -0,0 +1,28 @@ +{ + "built_by": "t27c-bootstrap@0.5.2+9448ab4be", + "closure": [], + "config": "gen=c,rust,verilog,zig;tests=zig", + "gen_hash_c": "sha256:6f25ac75e0e044be5511d45c7127381a27cddd33ffa05ef869d53ee7cb37a66b", + "gen_hash_rust": "sha256:b11746af24bfbf31e235414d007a3b471a3c584e4397fb28ccbfbe546669af39", + "gen_hash_verilog": "sha256:ffb20bbe3665e63b1e12f42eaec95a7b72f42819da127b79d4c1855b6bc9b13d", + "gen_hash_zig": "sha256:2b03261474b7da566a153c93793546b7374ef275740be2c2116a4b91001ee524", + "module": "reel_topics", + "ring": 12, + "seal_schema": 2, + "sealed_at": "2026-10-18T15:14:31Z", + "sealed_by": "t27c-bootstrap@0.5.2", + "spec_hash": "sha256:7c1762cde96524791711594d23f880fbad1f497a499277710f1fd61d52d50157", + "spec_path": "specs/t27f/reel_topics.t27", + "tests": { + "failed": 0, + "failing": [], + "forced": false, + "passed": 7, + "total": 7, + "vacuous": 0 + }, + "toolchain": { + "test_runner": "sha256:1982ae948e24d00c5d221ccec12dfce1eb01204b53e37b0f857f93b16d64629d", + "zig": "0.16.0" + } +} \ No newline at end of file diff --git a/.trinity/seals/t27f_token_floor_mux.json b/.trinity/seals/t27f_token_floor_mux.json index 6c533d1ff5..babf18058c 100644 --- a/.trinity/seals/t27f_token_floor_mux.json +++ b/.trinity/seals/t27f_token_floor_mux.json @@ -30,13 +30,13 @@ "gen_hash_c": "sha256:18710ba70409c54ce28a6baa8da85579904bf6eeec5e91f4913496216a7fb9cb", "gen_hash_rust": "sha256:c7240d2db316d11bbff444fed4725b84a77bd566a92e6286dcc4966ae9f2bf06", "gen_hash_verilog": "sha256:7c6af1b05a4ecfb5560ff39e4728fd96b7ab95c825c428289ab330456bc44dd7", - "gen_hash_zig": "sha256:3c98bd93b0f615e0aba5a42e5891ab8ea4288ba98397bdb3f989e059853a9cd5", + "gen_hash_zig": "sha256:bcd5f63e11e3fe7de9b9e2dbbe844987430961ac73d8048404c8c42e0c9d6e1c", "module": "token_floor_mux", "ring": 12, "seal_schema": 2, - "sealed_at": "2026-10-18T13:21:31Z", + "sealed_at": "2026-10-18T15:14:29Z", "sealed_by": "t27c-bootstrap@0.5.2", - "spec_hash": "sha256:6b83ab94e55a46aa538701fa568cb5493e1c6766ae008386916cf83335e5c7b1", + "spec_hash": "sha256:55c02c60e581640d2f3d6db3d9ba2cdfb21d74b172290b386023e8f264e59a04", "spec_path": "specs/t27f/token_floor_mux.t27", "tests": { "failed": 0, diff --git a/specs/t27f/lesson_reel.t27 b/specs/t27f/lesson_reel.t27 new file mode 100644 index 0000000000..29726fc24b --- /dev/null +++ b/specs/t27f/lesson_reel.t27 @@ -0,0 +1,823 @@ +// SPDX-License-Identifier: Apache-2.0 +// specs/t27f/lesson_reel.t27 -- a reel of any lesson of course 0, in English or Russian, on the +// token_floor template: the lesson's title, goal and task spoken in the owner's voice and written +// under it, its spec on the three glass cards, and its page as the call to action. +// +// WHY: the owner asked for a reel for every lesson, in two languages, made by a generator from the +// topic rather than one reel at a time, with the source in t27. A lesson is an index into +// reel_topics; this module turns the index and a language into every text layer and the sound +// graph of the reel, so lesson 1 and lesson 27 come out of the same code. +// +// HOW (main, by LR_MODE; LR_T the lesson 0..26, LR_LANG 0 en / 1 ru): +// 0 phrase LR_K's text, UTF-8, for the voice service: 0 the title, 1 the goal, 2 the task +// 1 text file LR_K of the reel: the tags, the cards' lines, the page, the caption chunks +// 2 how many text files there are +// 3 the two ffmpeg -filter_complex_script graphs, tall then wide, given LR_MS0..LR_MS2, the +// phrases' lengths in ms as the voice service returned them. Inputs: 0 the frames, +// 1..3 the phrases' wavs, 4 the music. +// Every text that comes from the lesson goes through a textfile, so no quote, colon or percent in +// a lesson can break the graph (and drawtext runs with expansion=none). +// +// TIMING: the phrases follow one another from the voice offset with a gap. When they would run +// into the call to action's hold, the voice is sped up (atempo, pitch kept) up to +// TEMPO_MAX_PERMILLE; when the three still do not fit, the task is dropped and the reel speaks the +// title and the goal. A caption chunk is a run of whole words up to CHUNK_CHARS, timed by its +// share of its phrase's letters -- an estimate, not a word-level alignment. +// +// NOT CLAIMED: the backdrop is token_floor's physics world, not a picture of the lesson; its frame +// labels are the physics reel's. A lesson-specific scene (the spec as a T27F diagram) is the next +// step and is not here. +// phi^2 + 1/phi^2 = 3 | TRINITY + +module lesson_reel; + +use automation::owner_voice_reel::REEL_MS; +use automation::owner_voice_reel::VOICE_OFFSET_MS; +use automation::owner_voice_reel::CAPTION_BORDER_PX; +use automation::owner_voice_reel::CAPTION_SHADOW_Y_PX; +use automation::owner_voice_reel::CAPTION_TAIL_MS; +use automation::owner_voice_reel::VOICE_LUFS; +use automation::owner_voice_reel::VOICE_LRA; +use automation::owner_voice_reel::MUSIC_VOLUME_PERMILLE; +use automation::owner_voice_reel::MUSIC_FADE_IN_MS; +use automation::owner_voice_reel::MUSIC_FADE_OUT_START_MS; +use automation::owner_voice_reel::LIMIT_PERMILLE; +use t27f::reel_particles_mux::MUSIC_FADE_OUT_MS; +use t27f::reel_particles_mux::secs; +use t27f::reel_particles_mux::millis; +use t27f::token_floor_scenes::TALL; +use t27f::token_floor_scenes::WIDE; +use t27f::token_floor_scenes::SHOTS; +use t27f::token_floor_scenes::SHOT_START; +use t27f::token_floor_scenes::TAG_X; +use t27f::token_floor_scenes::TAG_Y; +use t27f::token_floor_scenes::TAG_FONT; +use t27f::token_floor_scenes::CARDS; +use t27f::token_floor_scenes::CARD_LY; +use t27f::token_floor_scenes::CARD_PAD; +use t27f::token_floor_scenes::PILL_H; +use t27f::token_floor_scenes::card_f; +use t27f::token_floor_scenes::pill_x; +use t27f::token_floor_scenes::pill_dy; +use t27f::token_floor_scenes::safe_f; +use t27f::token_floor_scenes::band_x; +use t27f::token_floor_scenes::band_w; +use t27f::token_floor_scenes::caption_y; +use t27f::token_floor_scenes::frame_h; +use t27f::reel_marketing::reel_shows; +use t27f::reel_marketing::REEL_FIRST_WORD_MS; +use t27f::reel_marketing::REEL_HOOK_TEXT_MS; +use t27f::reel_marketing::REEL_CTA_MIN_MS; +use t27f::reel_marketing::REEL_CTA_MIN_PX; +use t27f::reel_marketing::REEL_TEXT_MIN_PX; +use t27f::token_floor_mux::GOLD_ROW; +use t27f::token_floor_mux::WHITE_ROW; +use t27f::token_floor_mux::GREY_ROW; +use t27f::token_floor_mux::MONO_ADVANCE_PERMILLE; +use t27f::token_floor_mux::TAG_SLIDE_F; +use t27f::token_floor_mux::TAG_SLIDE_PX; +use t27f::token_floor_mux::PASS_DX; +use t27f::token_floor_mux::PASS_FONT; +use t27f::token_floor_mux::TF_CTA_FADE_MS; +use t27f::token_floor_mux::print_col; +use t27f::token_floor_mux::band_font; +use t27f::token_floor_mux::print_rise; +use t27f::token_floor_mux::print_fade; +use t27f::reel_topics::TOPICS; +use t27f::reel_topics::item; +use t27f::reel_topics::id_item; +use t27f::reel_topics::course_title_item; +use t27f::reel_topics::lesson_of_item; +use t27f::reel_topics::item_len; +use t27f::reel_topics::cp; +use t27f::reel_topics::code_line0; +use t27f::reel_topics::code_lines; +use t27f::reel_topics::line_len; +use t27f::reel_topics::code_byte; +use t27f::reel_topics::lesson_n; + +pub const ID : str = "lesson-reel"; +// JetBrains Mono ExtraBold with both scripts and the digits, so one face sets every line. +pub const FONT : str = "/root/tf/fonts/jbm-all-800.ttf"; +pub const FILE_DIR : str = "/root/lr/f"; + +pub fn lang_dir(lang: usize) -> str { + if (lang == 0) { + return "en"; + } + return "ru"; +} + +// ---- the voice: three phrases, sped up a little or cut to two when they will not fit ---- +pub const PHRASES : usize = 3; +pub const PHRASE_GAP_MS : i32 = 250; +pub const TEMPO_MAX_PERMILLE : i32 = 1200; + +pub fn ms_of(m0: i32, m1: i32, m2: i32, p: usize) -> i32 { + if (p == 0) { + return m0; + } + if (p == 1) { + return m1; + } + return m2; +} + +// The time n phrases may take as spoken: from the voice offset to the last caption's tail before +// the call to action's hold, less the gaps between them. +pub fn voice_room_ms(n: usize) -> i32 { + return REEL_MS - REEL_CTA_MIN_MS - CAPTION_TAIL_MS - VOICE_OFFSET_MS - @as(i32, @intCast(n - 1)) * PHRASE_GAP_MS; +} + +fn raw_total(m0: i32, m1: i32, m2: i32, n: usize) -> i32 { + var s : i32 = 0; + var p : usize = 0; + while (p < n) { + s = s + ms_of(m0, m1, m2, p); + p = p + 1; + } + return s; +} + +// The tempo, per mille, at which n phrases fit their room: 1000 when they fit as spoken. +pub fn tempo_for(m0: i32, m1: i32, m2: i32, n: usize) -> i32 { + const room = voice_room_ms(n); + const raw = raw_total(m0, m1, m2, n); + if (raw <= room) { + return 1000; + } + return @divTrunc(raw * 1000 + room - 1, room); +} + +// How many phrases the reel speaks: the three when they fit at TEMPO_MAX, else the title and goal. +pub fn phrases_for(m0: i32, m1: i32, m2: i32) -> usize { + if (tempo_for(m0, m1, m2, PHRASES) <= TEMPO_MAX_PERMILLE) { + return PHRASES; + } + return 2; +} + +pub fn tempo(m0: i32, m1: i32, m2: i32) -> i32 { + return tempo_for(m0, m1, m2, phrases_for(m0, m1, m2)); +} + +// Whether the reel can be made at all: its phrases fit at a tempo the ear still takes. +pub fn voice_fits(m0: i32, m1: i32, m2: i32) -> bool { + return m0 > 0 && m1 > 0 && m2 > 0 && tempo(m0, m1, m2) <= TEMPO_MAX_PERMILLE; +} + +// How long phrase p plays after the tempo (rounded down, so the sum stays inside the room). +pub fn played(m0: i32, m1: i32, m2: i32, p: usize) -> i32 { + return @divTrunc(ms_of(m0, m1, m2, p) * 1000, tempo(m0, m1, m2)); +} + +pub fn phrase_start(m0: i32, m1: i32, m2: i32, p: usize) -> i32 { + var t : i32 = VOICE_OFFSET_MS; + var q : usize = 0; + while (q < p) { + t = t + played(m0, m1, m2, q) + PHRASE_GAP_MS; + q = q + 1; + } + return t; +} + +// ---- the caption chunks: whole words up to CHUNK_CHARS letters; a longer word is cut ---- +pub const CHUNK_CHARS : usize = 14; +pub const SPACE : u32 = 32; + +fn word_end(i: usize, s: usize) -> usize { + var k : usize = s; + while (k < item_len(i) && cp(i, k) != SPACE) { + k = k + 1; + } + return k; +} + +// The end (exclusive) of the chunk of item i that starts at s. +pub fn chunk_end(i: usize, s: usize) -> usize { + const n = item_len(i); + var e : usize = word_end(i, s); + if (e - s > CHUNK_CHARS) { + return s + CHUNK_CHARS; + } + var going : bool = true; + while (going && e < n) { + const e2 = word_end(i, e + 1); + if (e2 - s > CHUNK_CHARS) { + going = false; + } else { + e = e2; + } + } + return e; +} + +// Where the next chunk starts after one ending at e: past the space, if there is one. +pub fn after(i: usize, e: usize) -> usize { + if (e < item_len(i) && cp(i, e) == SPACE) { + return e + 1; + } + return e; +} + +pub fn chunks(i: usize) -> usize { + var s : usize = 0; + var n : usize = 0; + while (s < item_len(i)) { + s = after(i, chunk_end(i, s)); + n = n + 1; + } + return n; +} + +pub fn chunk_start(i: usize, c: usize) -> usize { + var s : usize = 0; + var n : usize = 0; + while (n < c) { + s = after(i, chunk_end(i, s)); + n = n + 1; + } + return s; +} + +pub fn chunk_chars(i: usize, c: usize) -> usize { + const s = chunk_start(i, c); + return chunk_end(i, s) - s; +} + +fn phrase_item(t: usize, lang: usize, p: usize) -> usize { + return item(t, lang, p); +} + +// When chunk c of phrase p comes: its phrase's start plus its share of the phrase's letters. +pub fn chunk_from(t: usize, lang: usize, m0: i32, m1: i32, m2: i32, p: usize, c: usize) -> i32 { + const i = phrase_item(t, lang, p); + const share = @as(i32, @intCast(chunk_start(i, c))) * played(m0, m1, m2, p); + return phrase_start(m0, m1, m2, p) + @divTrunc(share, @as(i32, @intCast(item_len(i)))); +} + +// It goes when the next chunk comes; the phrase's last one stays the tail after the voice, but +// never into the next phrase. +pub fn chunk_until(t: usize, lang: usize, m0: i32, m1: i32, m2: i32, p: usize, c: usize) -> i32 { + const i = phrase_item(t, lang, p); + if (c + 1 < chunks(i)) { + return chunk_from(t, lang, m0, m1, m2, p, c + 1); + } + var u : i32 = phrase_start(m0, m1, m2, p) + played(m0, m1, m2, p) + CAPTION_TAIL_MS; + if (p + 1 < phrases_for(m0, m1, m2)) { + const nx = phrase_start(m0, m1, m2, p + 1); + if (nx < u) { + u = nx; + } + } + return u; +} + +pub fn cta_from(t: usize, lang: usize, m0: i32, m1: i32, m2: i32) -> i32 { + const n = phrases_for(m0, m1, m2); + return chunk_until(t, lang, m0, m1, m2, n - 1, chunks(phrase_item(t, lang, n - 1)) - 1); +} + +// ---- the text files ---- +// 0 the lesson tag, 1 the course tag, 2 the cards' label, 3..8 the cards' code lines (card c's two +// at 3 + 2c), 9 the page under the address, then the caption chunks, phrase by phrase. +pub const F_TAG_LESSON : usize = 0; +pub const F_TAG_COURSE : usize = 1; +pub const F_CARD_LABEL : usize = 2; +pub const F_CARD0 : usize = 3; +pub const F_PAGE : usize = 9; +pub const F_CHUNK0 : usize = 10; + +pub fn chunk_file(t: usize, lang: usize, p: usize, c: usize) -> usize { + var f : usize = F_CHUNK0; + var q : usize = 0; + while (q < p) { + f = f + chunks(phrase_item(t, lang, q)); + q = q + 1; + } + return f + c; +} + +pub fn files(t: usize, lang: usize) -> usize { + return chunk_file(t, lang, PHRASES, 0); +} + +// The lines the cards may show: the lesson's code less a closing brace alone on its last line. +pub fn shown_lines(t: usize) -> usize { + const n = code_lines(t); + const last = code_line0(t) + n - 1; + if (line_len(last) == 1 && code_byte(last, 0) == 125) { + return n - 1; + } + return n; +} + +// The cards walk down the lesson's spec: card c shows two lines from c (n - 2) / 2 on. +pub fn card_code_line(t: usize, c: usize, j: usize) -> usize { + const n = shown_lines(t); + return code_line0(t) + @divTrunc(c * (n - 2), 2) + j; +} + +// The upper case the tags are set in: Latin, Cyrillic a..ya, and yo. +pub fn up(c: u32) -> u32 { + if (c >= 97 && c <= 122) { + return c - 32; + } + if (c >= 1072 && c <= 1103) { + return c - 32; + } + if (c == 1105) { + return 1025; + } + return c; +} + +// One code point as UTF-8: every letter here is below U+0800, so one or two bytes. +fn print_cp(c: u32) -> void { + if (c < 128) { + std.debug.print("{c}", .{@as(u8, @intCast(c))}); + } else { + std.debug.print("{c}{c}", .{ @as(u8, @intCast(192 + @divTrunc(c, 64))), @as(u8, @intCast(128 + @mod(c, 64))) }); + } +} + +fn print_span(i: usize, s: usize, e: usize, upper: bool) -> void { + var k : usize = s; + while (k < e) { + if (upper) { + print_cp(up(cp(i, k))); + } else { + print_cp(cp(i, k)); + } + k = k + 1; + } +} + +// The length a hole "{0}" or "{1}" fills with in "Lesson {0} of {1}", and the letters as written. +fn hole_value(t: usize, h: u32) -> usize { + if (h == 48) { + return lesson_n(t); + } + return TOPICS; +} + +fn digits(v: usize) -> usize { + if (v >= 10) { + return 2; + } + return 1; +} + +fn is_hole(i: usize, k: usize) -> bool { + return k + 2 < item_len(i) && cp(i, k) == 123 && cp(i, k + 2) == 125; +} + +pub fn lesson_tag_chars(t: usize, lang: usize) -> usize { + const i = lesson_of_item(lang); + var n : usize = 0; + var k : usize = 0; + while (k < item_len(i)) { + if (is_hole(i, k)) { + n = n + digits(hole_value(t, cp(i, k + 1))); + k = k + 3; + } else { + n = n + 1; + k = k + 1; + } + } + return n; +} + +fn print_lesson_tag(t: usize, lang: usize) -> void { + const i = lesson_of_item(lang); + var k : usize = 0; + while (k < item_len(i)) { + if (is_hole(i, k)) { + std.debug.print("{d}", .{hole_value(t, cp(i, k + 1))}); + k = k + 3; + } else { + print_cp(up(cp(i, k))); + k = k + 1; + } + } +} + +fn print_code_line(l: usize) -> void { + var k : usize = 0; + while (k < line_len(l)) { + std.debug.print("{c}", .{code_byte(l, k)}); + k = k + 1; + } +} + +pub fn print_file(t: usize, lang: usize, f: usize) -> void { + if (f == F_TAG_LESSON) { + print_lesson_tag(t, lang); + } else if (f == F_TAG_COURSE) { + const i = course_title_item(lang); + print_span(i, 0, item_len(i), true); + } else if (f == F_CARD_LABEL) { + print_span(id_item(t), 0, item_len(id_item(t)), false); + std.debug.print(".t27", .{}); + } else if (f < F_PAGE) { + print_code_line(card_code_line(t, @divTrunc(f - F_CARD0, 2), @mod(f - F_CARD0, 2))); + } else if (f == F_PAGE) { + std.debug.print("/learn/", .{}); + print_span(id_item(t), 0, item_len(id_item(t)), false); + std.debug.print("/", .{}); + } else { + var p : usize = 0; + var c : usize = f - F_CHUNK0; + while (p + 1 < PHRASES && c >= chunks(phrase_item(t, lang, p))) { + c = c - chunks(phrase_item(t, lang, p)); + p = p + 1; + } + const i = phrase_item(t, lang, p); + const s = chunk_start(i, c); + print_span(i, s, chunk_end(i, s), false); + } +} + +// ---- the layout ---- + +// The px a run of n letters takes at a font size, at the mono face's advance. +pub fn run_px(n: usize, font: i32) -> i32 { + return @divTrunc(@as(i32, @intCast(n)) * font * MONO_ADVANCE_PERMILLE, 1000); +} + +// The tags: the gold shot number, a grey slash, then the text, which starts five letters in. +pub const TAG_TEXT_AT : usize = 5; + +pub fn tag_file(s: usize) -> usize { + return @mod(s, 2); +} + +pub fn tag_chars(t: usize, lang: usize, f: usize) -> usize { + if (f == F_TAG_LESSON) { + return lesson_tag_chars(t, lang); + } + return item_len(course_title_item(lang)); +} + +// The cards: the label at 3/4 of the card's code size, the two code lines fitted to the card. +pub fn label_font(o: usize) -> i32 { + return @as(i32, @intFromFloat(@floor(0.75 * card_f(o, 5) + 0.5))); +} + +pub fn code_font(o: usize, n: usize) -> i32 { + const room = @as(i32, @intFromFloat(card_f(o, 2) - 2.0 * CARD_PAD)); + const fit = @divTrunc(room * 1000, @as(i32, @intCast(n)) * MONO_ADVANCE_PERMILLE); + const most = @as(i32, @intFromFloat(card_f(o, 5))); + if (fit < most) { + return fit; + } + return most; +} + +pub const CODE_FONT_MIN : i32 = 12; + +// The call to action: "t27.ai" in gold, lifted a little in the band, and the lesson's page under +// it in grey. +pub const CTA_TEXT : str = "t27.ai"; +pub const CTA_CHARS : usize = 6; +pub const CTA_FONT : i32 = 100; +pub const CTA_LIFT : i32 = 20; +pub const PAGE_FONT : i32 = 40; +pub const PAGE_GAP : i32 = 8; + +pub fn cta_y(o: usize) -> i32 { + return caption_y(o) - CTA_LIFT; +} + +pub fn page_top(o: usize) -> i32 { + return cta_y(o) + @divTrunc(CTA_FONT, 2) + PAGE_GAP; +} + +pub fn page_chars(t: usize) -> usize { + return item_len(id_item(t)) + 8; +} + +// ---- the graph ---- + +fn print_tag(o: usize, s: usize, dx: i32, row: usize, f: usize, lang: usize) -> void { + const a = SHOT_START[s]; + const b = SHOT_START[s + 1] - 1; + if (f == 99) { + std.debug.print(",drawtext=fontfile={s}:expansion=none:text='{d:0>2}':fontsize={d}:fontcolor=", .{ FONT, s + 1, TAG_FONT[o] }); + } else if (f == 98) { + std.debug.print(",drawtext=fontfile={s}:expansion=none:text='/':fontsize={d}:fontcolor=", .{ FONT, TAG_FONT[o] }); + } else { + std.debug.print(",drawtext=fontfile={s}:expansion=none:textfile={s}/{s}/f{d:0>2}.txt:fontsize={d}:fontcolor=", .{ FONT, FILE_DIR, lang_dir(lang), f, TAG_FONT[o] }); + } + print_col(row); + std.debug.print(":x='{d}+{d}*pow(1-clip((n-{d})/{d},0,1),3)':y={d}:alpha='clip((n-{d})/{d},0,1)':enable='between(n,{d},{d})'", .{ TAG_X[o] + dx, TAG_SLIDE_PX, a, TAG_SLIDE_F, TAG_Y[o], a, TAG_SLIDE_F, a, b }); +} + +fn print_card_text(o: usize, c: usize, lang: usize, f: usize, font: i32, row: usize, dy: f64) -> void { + std.debug.print(",drawtext=fontfile={s}:expansion=none:textfile={s}/{s}/f{d:0>2}.txt:fontsize={d}:fontcolor=", .{ FONT, FILE_DIR, lang_dir(lang), f, font }); + print_col(row); + std.debug.print(":x={d:.1}", .{card_f(o, 0) + CARD_PAD}); + print_rise(o, c, dy); + std.debug.print("'", .{}); + print_fade(c); +} + +fn print_card(o: usize, c: usize, t: usize, lang: usize) -> void { + print_card_text(o, c, lang, F_CARD_LABEL, label_font(o), GREY_ROW, CARD_LY[o * 3]); + var j : usize = 0; + while (j < 2) { + const font = code_font(o, line_len(card_code_line(t, c, j))); + var row : usize = WHITE_ROW; + if (j == 1) { + row = GOLD_ROW; + } + print_card_text(o, c, lang, F_CARD0 + 2 * c + j, font, row, CARD_LY[o * 3 + 1 + j]); + j = j + 1; + } + std.debug.print(",drawtext=fontfile={s}:text='PASS':fontsize={d}:fontcolor=0x000000:x={d:.1}", .{ FONT, PASS_FONT[o], pill_x(o) + PASS_DX }); + print_rise(o, c, pill_dy(o) + 0.5 * PILL_H); + std.debug.print("-text_h/2'", .{}); + print_fade(c); +} + +fn print_cta(o: usize, t: usize, lang: usize, a: i32) -> void { + std.debug.print(",drawtext=fontfile={s}:text='{s}':fontsize={d}:fontcolor=", .{ FONT, CTA_TEXT, CTA_FONT }); + print_col(GOLD_ROW); + std.debug.print(":borderw={d}:bordercolor=0x000000:shadowx=0:shadowy={d}:shadowcolor=0x000000@0.6:x={d}+({d}-text_w)/2:y={d}-text_h/2:alpha='clip((t-{d}.{d:0>3})/0.{d:0>3},0,1)':enable='gte(t,{d}.{d:0>3})'", .{ CAPTION_BORDER_PX, CAPTION_SHADOW_Y_PX, band_x(o), band_w(o), cta_y(o), secs(a), millis(a), millis(TF_CTA_FADE_MS), secs(a), millis(a) }); + std.debug.print(",drawtext=fontfile={s}:expansion=none:textfile={s}/{s}/f{d:0>2}.txt:fontsize={d}:fontcolor=", .{ FONT, FILE_DIR, lang_dir(lang), F_PAGE, PAGE_FONT }); + print_col(GREY_ROW); + std.debug.print(":x={d}+({d}-text_w)/2:y={d}:alpha='clip((t-{d}.{d:0>3})/0.{d:0>3},0,1)':enable='gte(t,{d}.{d:0>3})'", .{ band_x(o), band_w(o), page_top(o), secs(a), millis(a), millis(TF_CTA_FADE_MS), secs(a), millis(a) }); +} + +pub fn graph(o: usize, t: usize, lang: usize, m0: i32, m1: i32, m2: i32) -> void { + std.debug.print("[0:v]format=yuv420p", .{}); + const adv = @divTrunc(TAG_FONT[o] * MONO_ADVANCE_PERMILLE, 1000); + var s : usize = 0; + while (s < SHOTS) { + print_tag(o, s, 0, GOLD_ROW, 99, lang); + print_tag(o, s, 3 * adv, GREY_ROW, 98, lang); + print_tag(o, s, @as(i32, @intCast(TAG_TEXT_AT)) * adv, GREY_ROW, tag_file(s), lang); + s = s + 1; + } + var c : usize = 0; + while (c < CARDS) { + print_card(o, c, t, lang); + c = c + 1; + } + const n = phrases_for(m0, m1, m2); + var p : usize = 0; + while (p < n) { + const i = phrase_item(t, lang, p); + var k : usize = 0; + while (k < chunks(i)) { + const a = chunk_from(t, lang, m0, m1, m2, p, k); + const b = chunk_until(t, lang, m0, m1, m2, p, k); + std.debug.print(",drawtext=fontfile={s}:expansion=none:textfile={s}/{s}/f{d:0>2}.txt:fontsize={d}:fontcolor=", .{ FONT, FILE_DIR, lang_dir(lang), chunk_file(t, lang, p, k), band_font(o, @as(i32, @intCast(chunk_chars(i, k)))) }); + print_col(GOLD_ROW); + std.debug.print(":borderw={d}:bordercolor=0x000000:shadowx=0:shadowy={d}:shadowcolor=0x000000@0.6:x={d}:y={d}-text_h/2:enable='between(t,{d}.{d:0>3},{d}.{d:0>3})'", .{ CAPTION_BORDER_PX, CAPTION_SHADOW_Y_PX, band_x(o), caption_y(o), secs(a), millis(a), secs(b), millis(b) }); + k = k + 1; + } + p = p + 1; + } + print_cta(o, t, lang, cta_from(t, lang, m0, m1, m2)); + std.debug.print("[v];", .{}); + const tp = tempo(m0, m1, m2); + p = 0; + while (p < n) { + const at = phrase_start(m0, m1, m2, p); + std.debug.print("[{d}:a]aresample=48000,atempo={d}.{d:0>3},pan=stereo|c0=c0|c1=c0,adelay={d}|{d}[p{d}];", .{ p + 1, secs(tp), millis(tp), at, at, p }); + p = p + 1; + } + p = 0; + while (p < n) { + std.debug.print("[p{d}]", .{p}); + p = p + 1; + } + std.debug.print("amix=inputs={d}:normalize=0:duration=longest,loudnorm=I={d}:TP=-1.5:LRA={d},aresample=48000,apad=whole_dur={d}[vo];", .{ n, VOICE_LUFS, VOICE_LRA, secs(REEL_MS) }); + std.debug.print("[4:a]atrim=0:{d},volume=0.{d:0>3},afade=t=in:d=0.{d:0>3},afade=t=out:st={d}.{d:0>3}:d={d}.{d:0>3}[mu];", .{ secs(REEL_MS), millis(MUSIC_VOLUME_PERMILLE), millis(MUSIC_FADE_IN_MS), secs(MUSIC_FADE_OUT_START_MS), millis(MUSIC_FADE_OUT_START_MS), secs(MUSIC_FADE_OUT_MS), millis(MUSIC_FADE_OUT_MS) }); + std.debug.print("[vo][mu]amix=inputs=2:normalize=0:duration=first,alimiter=limit=0.{d:0>3}[a]\n", .{millis(LIMIT_PERMILLE)}); +} + +// ---- main ---- + +// The environment variable `name` as a number of up to six digits; dflt when unset. Only main +// calls this, so the tests, which never link libc, do not reach getenv. +fn env_num(name: [*:0]const u8, dflt: i32) -> i32 { + const p = std.c.getenv(name); + if (p == null) { + return dflt; + } + const s = p.?; + var v : i32 = 0; + var i : usize = 0; + while (i < 6 && s[i] >= 48 && s[i] <= 57) { + v = v * 10 + @as(i32, @intCast(s[i] - 48)); + i = i + 1; + } + if (i == 0) { + return dflt; + } + return v; +} + +pub fn main() -> void { + var t : usize = @as(usize, @intCast(env_num("LR_T", 0))); + if (t >= TOPICS) { + t = 0; + } + var lang : usize = @as(usize, @intCast(env_num("LR_LANG", 0))); + if (lang > 1) { + lang = 0; + } + const mode = env_num("LR_MODE", 2); + const k = @as(usize, @intCast(env_num("LR_K", 0))); + if (mode == 0) { + var p : usize = k; + if (p >= PHRASES) { + p = 0; + } + const i = phrase_item(t, lang, p); + print_span(i, 0, item_len(i), false); + } else if (mode == 1) { + if (k < files(t, lang)) { + print_file(t, lang, k); + } + } else if (mode == 3) { + const m0 = env_num("LR_MS0", 0); + const m1 = env_num("LR_MS1", 0); + const m2 = env_num("LR_MS2", 0); + if (voice_fits(m0, m1, m2)) { + graph(TALL, t, lang, m0, m1, m2); + graph(WIDE, t, lang, m0, m1, m2); + } else { + std.debug.print("lesson_reel: the voice does not fit the reel\n", .{}); + } + } else { + std.debug.print("{d}\n", .{files(t, lang)}); + } +} + +// ---- tests ---- + +// Phrase lengths as the voice service gave them for lesson 1 (2026-10-18 shape, rounded): short, +// a tight fit, and one that only fits without the task. +pub const M_EN0 : i32 = 1300; +pub const M_EN1 : i32 = 4200; +pub const M_EN2 : i32 = 6800; + +test "the chunks tile every phrase of every lesson, at spaces, and none is too long to read" { + var t : usize = 0; + while (t < TOPICS) { + var lang : usize = 0; + while (lang < 2) { + var p : usize = 0; + while (p < PHRASES) { + const i = phrase_item(t, lang, p); + var s : usize = 0; + var c : usize = 0; + while (s < item_len(i)) { + assert(chunk_start(i, c) == s); + const e = chunk_end(i, s); + assert(e > s); + assert(e - s <= CHUNK_CHARS); + assert(cp(i, s) != SPACE); + s = after(i, e); + c = c + 1; + } + assert(c == chunks(i)); + assert(s == item_len(i)); + p = p + 1; + } + lang = lang + 1; + } + t = t + 1; + } +} + +test "every caption, tag, card line and page fits its place at a size that reads" { + var o : usize = 0; + while (o < 2) { + const right = @as(i32, @intFromFloat(safe_f(o, 2))); + assert(band_font(o, @as(i32, @intCast(CHUNK_CHARS))) >= @as(i32, @intFromFloat(REEL_TEXT_MIN_PX))); + assert(run_px(CHUNK_CHARS, band_font(o, @as(i32, @intCast(CHUNK_CHARS)))) <= band_w(o)); + var t : usize = 0; + while (t < TOPICS) { + var lang : usize = 0; + while (lang < 2) { + var f : usize = 0; + while (f < 2) { + const end = TAG_X[o] + run_px(TAG_TEXT_AT + tag_chars(t, lang, f), TAG_FONT[o]); + if (o == TALL) { + assert(end <= right); + } else { + assert(end <= band_x(o) - 40); + } + f = f + 1; + } + lang = lang + 1; + } + const label_end = card_f(o, 0) + CARD_PAD + @as(f64, @floatFromInt(run_px(item_len(id_item(t)) + 4, label_font(o)))); + assert(label_end + 12.0 <= pill_x(o)); + var c : usize = 0; + while (c < 3) { + var j : usize = 0; + while (j < 2) { + const l = card_code_line(t, c, j); + assert(l < code_line0(t) + code_lines(t)); + assert(code_font(o, line_len(l)) >= CODE_FONT_MIN); + assert(run_px(line_len(l), code_font(o, line_len(l))) <= @as(i32, @intFromFloat(card_f(o, 2) - 2.0 * CARD_PAD))); + j = j + 1; + } + c = c + 1; + } + assert(run_px(page_chars(t), PAGE_FONT) <= band_w(o)); + t = t + 1; + } + o = o + 1; + } +} + +test "the address is big enough and the page under it stays on the frame, tall inside the safe rect" { + assert(@as(f64, @floatFromInt(CTA_FONT)) >= REEL_CTA_MIN_PX); + assert(@as(f64, @floatFromInt(PAGE_FONT)) >= REEL_TEXT_MIN_PX); + assert(run_px(CTA_CHARS, CTA_FONT) <= band_w(TALL)); + const x0 = @as(f64, @floatFromInt(band_x(TALL))); + const y0 = @as(f64, @floatFromInt(cta_y(TALL) - @divTrunc(CTA_FONT, 2))); + const x1 = x0 + @as(f64, @floatFromInt(band_w(TALL))); + const y1 = @as(f64, @floatFromInt(page_top(TALL) + PAGE_FONT)); + assert(reel_shows(x0, y0, x1, y1)); + assert(page_top(WIDE) + PAGE_FONT <= frame_h(WIDE)); + // and the address clears the last card, which stays up to the end + assert(@as(f64, @floatFromInt(cta_y(TALL) - @divTrunc(CTA_FONT, 2))) > card_f(TALL, 1) + card_f(TALL, 3)); +} + +test "a voice that fits is left as spoken, and one that does not is sped up within the cap" { + assert(voice_room_ms(3) == 12250); + assert(tempo_for(1300, 4200, 6000, 3) == 1000); + assert(phrases_for(1300, 4200, 6000) == 3); + assert(tempo(M_EN0, M_EN1, M_EN2) == 1005); + assert(voice_fits(M_EN0, M_EN1, M_EN2)); + // too long for three even at the cap: the task goes, and the title and goal play as spoken + assert(phrases_for(1500, 5000, 9000) == 2); + assert(tempo(1500, 5000, 9000) == 1000); + // two at exactly the cap still play; a little more is refused + assert(voice_fits(3000, 12000, 1000)); + assert(voice_fits(3000, 13000, 1000) == false); + assert(voice_fits(0, 4000, 4000) == false); +} + +test "the hook clock and the call to action's hold hold for every lesson in both languages" { + var t : usize = 0; + while (t < TOPICS) { + var lang : usize = 0; + while (lang < 2) { + assert(phrase_start(M_EN0, M_EN1, M_EN2, 0) <= REEL_FIRST_WORD_MS); + assert(chunk_from(t, lang, M_EN0, M_EN1, M_EN2, 0, 0) <= REEL_HOOK_TEXT_MS); + assert(cta_from(t, lang, M_EN0, M_EN1, M_EN2) <= REEL_MS - REEL_CTA_MIN_MS); + assert(cta_from(t, lang, 1500, 5000, 9000) <= REEL_MS - REEL_CTA_MIN_MS); + // the captions come in order and never overlap + var p : usize = 0; + var last : i32 = 0; + while (p < PHRASES) { + var c : usize = 0; + while (c < chunks(phrase_item(t, lang, p))) { + const a = chunk_from(t, lang, M_EN0, M_EN1, M_EN2, p, c); + const b = chunk_until(t, lang, M_EN0, M_EN1, M_EN2, p, c); + assert(a >= last); + assert(b > a); + last = b; + c = c + 1; + } + p = p + 1; + } + lang = lang + 1; + } + t = t + 1; + } +} + +test "the files are numbered in order, and the tags read in upper case" { + assert(F_CARD0 + 2 * CARDS == F_PAGE); + assert(F_PAGE + 1 == F_CHUNK0); + assert(files(0, 0) == F_CHUNK0 + chunks(item(0, 0, 0)) + chunks(item(0, 0, 1)) + chunks(item(0, 0, 2))); + assert(up(97) == 65); + assert(up(1072) == 1040); + assert(up(1103) == 1071); + assert(up(1105) == 1025); + assert(up(46) == 46); + // "LESSON 1 OF 27" and "URok 1 iz 27" are 14 and 12 letters + assert(lesson_tag_chars(0, 0) == 14); + assert(lesson_tag_chars(0, 1) == 12); + assert(lesson_tag_chars(26, 0) == 15); + // lesson 1's cards: lines 0, 2 and 4 of the six it shows (its seventh is the closing brace) + assert(code_lines(0) == 7); + assert(shown_lines(0) == 6); + assert(card_code_line(0, 0, 0) == 0); + assert(card_code_line(0, 1, 0) == 2); + assert(card_code_line(0, 2, 1) == 5); + var t : usize = 0; + while (t < TOPICS) { + assert(shown_lines(t) >= 2); + t = t + 1; + } +} diff --git a/specs/t27f/reel_topics.t27 b/specs/t27f/reel_topics.t27 new file mode 100644 index 0000000000..a0bd6333ac --- /dev/null +++ b/specs/t27f/reel_topics.t27 @@ -0,0 +1,751 @@ +// SPDX-License-Identifier: Apache-2.0 +// specs/t27f/reel_topics.t27 -- the topics a reel can be made of, as data: the 27 lessons of +// course 0 (t27 basics) in English and Russian, each with its title, goal, task and spec code. +// +// WHY: the owner asked for a reel for every course and every lesson, made by the token_floor +// template, in two languages, by a generator rather than one reel at a time, and with the source +// in t27. specs/t27f/topic_reel_gen.t27 reads only this module; a topic is an index into it. +// +// WHAT IS HERE: tool-written data, not hand-typed. Text is stored as Unicode code points (u16) +// so the Russian survives an ASCII-only source: an item is TEXT_CP[ITEM_START[i] .. +// ITEM_START[i] + ITEM_LEN[i]]. The items, in order: +// item(t, lang, f) = (t * 2 + lang) * 3 + f lesson t, lang 0 en / 1 ru, f 0 title, 1 goal, 2 task +// ID_ITEM0 + t lesson t's id, also its page t27.ai/learn// +// COURSE_ITEM0 + lang * 2 + 0 the course title +// COURSE_ITEM0 + lang * 2 + 1 "Lesson {0} of {1}", filled in by the generator +// Code is the lesson's spec with comment and blank lines dropped, ASCII bytes: line l is +// CODE[LINE_START[l] .. LINE_START[l + 1]], lesson t owns lines TOPIC_LINE0[t] .. TOPIC_LINE0[t + 1]. +// +// PROVENANCE (2026-10-18; stock tools, no script): +// gHashTag/trinity at SOURCE_COMMIT, SOURCE_FILE (generated there from the course's .t27 specs +// and its Russian bundle); the COURSES array cut out with sed, then +// jq '.[0] as $c | [($c.lessons[] | .en.title,.en.goal,.en.task,.ru.title,.ru.goal,.ru.task), +// ($c.lessons[] | .id), $c.say.en.TITLE, $c.say.en.LESSON, $c.say.ru.TITLE, +// $c.say.ru.LESSON] | map(explode)' -> TEXT_CP, ITEM_START, ITEM_LEN +// each lesson's spec.source under apps/website/public, grep -v of comment and blank lines, +// jq -R explode -> CODE, LINE_START, TOPIC_LINE0 +// +// The lessons, by index (jq to_entries of the en titles): +// 0 What a spec is, 1 The module line, 2 Comments and prose lines, 3 Constants, 4 Whole numbers +// and their widths, 5 True, false and text, 6 Arrays, 7 Trits: minus one, zero, one, 8 +// Expressions, 9 A test block, 10 Many tests in one spec, 11 Functions, 12 Local names: let and +// var, 13 Choices: if, else and switch, 14 Loops: while and for, 15 pub or private, 16 Structs, +// 17 Enums, 18 Using other modules, 19 Invariants and benches, 20 gen-ts: a spec becomes +// TypeScript, 21 Seven backends, 22 The stages of t27c, 23 tri: the command line, 24 Reading +// compiler errors, 25 A small complete program, 26 Where to go next. +// +// NOT CLAIMED: only course 0 is here yet; the other eight courses and the blog posts take the same +// shape and come next. The text is the site's text at SOURCE_COMMIT, not re-edited for speech. +// phi^2 + 1/phi^2 = 3 | TRINITY + +module reel_topics; + +pub const SOURCE_REPO : str = "gHashTag/trinity"; +pub const SOURCE_FILE : str = "apps/website/src/lib/course.generated.ts"; +pub const SOURCE_COMMIT : str = "b34a2b4594178bbf4780b0d54603de8e1e47daf0"; + +pub const COURSE_ID : str = "t27-basics"; +pub const TOPICS : usize = 27; +pub const LANGS : usize = 2; +pub const FIELDS : usize = 3; +pub const ID_ITEM0 : usize = 162; +pub const COURSE_ITEM0 : usize = 189; +pub const ITEMS : usize = 193; +pub const TEXT_CPS : usize = 9468; +pub const CODE_BYTES : usize = 6171; +pub const CODE_LINES : usize = 272; +pub const MODULE_LESSONS : usize = 3; // the course map: nine modules of three lessons + +pub const TEXT_CP : [9468]u16 = [ +87, 104, 97, 116, 32, 97, 32, 115, 112, 101, 99, 32, 105, 115, 87, 104, 97, 116, 32, 103, 111, 101, 115, 32, 105, 110, 116, 111, 32, 97, 32, 46, +116, 50, 55, 32, 102, 105, 108, 101, 32, 97, 110, 100, 32, 119, 104, 97, 116, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 114, 32, 103, +105, 118, 101, 115, 32, 98, 97, 99, 107, 32, 102, 111, 114, 32, 105, 116, 46, 79, 112, 101, 110, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, +32, 115, 112, 101, 99, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 32, 97, 110, 100, 32, 102, 105, 110, 100, 32, 105, 116, 115, +32, 116, 104, 114, 101, 101, 32, 112, 97, 114, 116, 115, 58, 32, 116, 104, 101, 32, 109, 111, 100, 117, 108, 101, 32, 108, 105, 110, 101, 44, 32, 116, +104, 101, 32, 99, 111, 110, 115, 116, 97, 110, 116, 115, 44, 32, 116, 104, 101, 32, 116, 101, 115, 116, 46, 1063, 1090, 1086, 32, 1090, 1072, 1082, 1086, 1077, +32, 1089, 1087, 1077, 1082, 1072, 1063, 1090, 1086, 32, 1074, 1093, 1086, 1076, 1080, 1090, 32, 1074, 32, 1092, 1072, 1081, 1083, 32, 46, 116, 50, 55, 32, 1080, 32, 1095, +1090, 1086, 32, 1082, 1086, 1084, 1087, 1080, 1083, 1103, 1090, 1086, 1088, 32, 1074, 1086, 1079, 1074, 1088, 1072, 1097, 1072, 1077, 1090, 32, 1074, 32, 1086, 1090, 1074, 1077, 1090, +46, 1054, 1090, 1082, 1088, 1086, 1081, 1090, 1077, 32, 1089, 1087, 1077, 1082, 1091, 32, 1091, 1088, 1086, 1082, 1072, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, 32, 1080, +32, 1085, 1072, 1081, 1076, 1080, 1090, 1077, 32, 1090, 1088, 1080, 32, 1077, 1105, 32, 1095, 1072, 1089, 1090, 1080, 58, 32, 1089, 1090, 1088, 1086, 1082, 1091, 32, 109, 111, +100, 117, 108, 101, 44, 32, 1082, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1099, 32, 1080, 32, 1090, 1077, 1089, 1090, 46, 84, 104, 101, 32, 109, 111, 100, 117, 108, +101, 32, 108, 105, 110, 101, 72, 111, 119, 32, 116, 111, 32, 119, 114, 105, 116, 101, 32, 116, 104, 101, 32, 109, 111, 100, 117, 108, 101, 32, 108, 105, +110, 101, 44, 32, 119, 104, 105, 99, 104, 32, 110, 97, 109, 101, 115, 32, 105, 116, 32, 97, 99, 99, 101, 112, 116, 115, 44, 32, 97, 110, 100, 32, +119, 104, 101, 114, 101, 32, 105, 116, 32, 103, 111, 101, 115, 46, 73, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 44, 32, 99, 104, 97, +110, 103, 101, 32, 116, 104, 101, 32, 109, 111, 100, 117, 108, 101, 32, 110, 97, 109, 101, 32, 111, 102, 32, 116, 104, 105, 115, 32, 108, 101, 115, 115, +111, 110, 32, 115, 112, 101, 99, 32, 97, 110, 100, 32, 119, 97, 116, 99, 104, 32, 116, 104, 101, 32, 118, 101, 114, 100, 105, 99, 116, 32, 115, 116, +97, 121, 32, 99, 108, 101, 97, 110, 46, 1057, 1090, 1088, 1086, 1082, 1072, 32, 109, 111, 100, 117, 108, 101, 1050, 1072, 1082, 32, 1087, 1080, 1096, 1077, 1090, 1089, +1103, 32, 1089, 1090, 1088, 1086, 1082, 1072, 32, 109, 111, 100, 117, 108, 101, 44, 32, 1082, 1072, 1082, 1080, 1077, 32, 1080, 1084, 1077, 1085, 1072, 32, 1086, 1085, 1072, +32, 1087, 1088, 1080, 1085, 1080, 1084, 1072, 1077, 1090, 32, 1080, 32, 1075, 1076, 1077, 32, 1089, 1090, 1086, 1080, 1090, 46, 1042, 32, 1087, 1083, 1077, 1077, 1088, 1077, 32, +1087, 1086, 1084, 1077, 1085, 1103, 1081, 1090, 1077, 32, 1080, 1084, 1103, 32, 1084, 1086, 1076, 1091, 1083, 1103, 32, 1074, 32, 1089, 1087, 1077, 1082, 1077, 32, 1091, 1088, 1086, +1082, 1072, 32, 1080, 32, 1091, 1073, 1077, 1076, 1080, 1090, 1077, 1089, 1100, 44, 32, 1095, 1090, 1086, 32, 1074, 1077, 1088, 1076, 1080, 1082, 1090, 32, 1086, 1089, 1090, 1072, +1105, 1090, 1089, 1103, 32, 1095, 1080, 1089, 1090, 1099, 1084, 46, 67, 111, 109, 109, 101, 110, 116, 115, 32, 97, 110, 100, 32, 112, 114, 111, 115, 101, 32, 108, +105, 110, 101, 115, 87, 104, 101, 114, 101, 32, 101, 97, 99, 104, 32, 107, 105, 110, 100, 32, 111, 102, 32, 110, 111, 116, 101, 32, 109, 97, 121, 32, +115, 116, 97, 110, 100, 44, 32, 97, 110, 100, 32, 116, 104, 101, 32, 111, 110, 101, 32, 108, 105, 110, 101, 32, 116, 104, 97, 116, 32, 98, 114, 101, +97, 107, 115, 32, 116, 104, 101, 32, 112, 97, 114, 115, 101, 114, 46, 65, 100, 100, 32, 97, 32, 108, 105, 110, 101, 32, 119, 105, 116, 104, 32, 97, +32, 108, 111, 110, 101, 32, 115, 101, 109, 105, 99, 111, 108, 111, 110, 32, 116, 111, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 115, 112, +101, 99, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 44, 32, 114, 101, 97, 100, 32, 116, 104, 101, 32, 101, 114, 114, 111, 114, +44, 32, 116, 104, 101, 110, 32, 114, 101, 109, 111, 118, 101, 32, 105, 116, 46, 1050, 1086, 1084, 1084, 1077, 1085, 1090, 1072, 1088, 1080, 1080, 32, 1080, 32, 1089, +1090, 1088, 1086, 1082, 1080, 32, 1087, 1088, 1086, 1079, 1099, 1043, 1076, 1077, 32, 1084, 1086, 1078, 1077, 1090, 32, 1089, 1090, 1086, 1103, 1090, 1100, 32, 1082, 1072, 1078, 1076, +1099, 1081, 32, 1074, 1080, 1076, 32, 1079, 1072, 1084, 1077, 1090, 1082, 1080, 32, 1080, 32, 1082, 1072, 1082, 1072, 1103, 32, 1089, 1090, 1088, 1086, 1082, 1072, 32, 1083, 1086, +1084, 1072, 1077, 1090, 32, 1087, 1072, 1088, 1089, 1077, 1088, 46, 1044, 1086, 1073, 1072, 1074, 1100, 1090, 1077, 32, 1074, 32, 1089, 1087, 1077, 1082, 1091, 32, 1091, 1088, 1086, +1082, 1072, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, 32, 1089, 1090, 1088, 1086, 1082, 1091, 32, 1089, 32, 1086, 1076, 1085, 1086, 1081, 32, 1090, 1086, 1095, 1082, 1086, +1081, 32, 1089, 32, 1079, 1072, 1087, 1103, 1090, 1086, 1081, 44, 32, 1087, 1088, 1086, 1095, 1080, 1090, 1072, 1081, 1090, 1077, 32, 1086, 1096, 1080, 1073, 1082, 1091, 32, 1080, +32, 1091, 1073, 1077, 1088, 1080, 1090, 1077, 32, 1077, 1105, 46, 67, 111, 110, 115, 116, 97, 110, 116, 115, 84, 104, 101, 32, 115, 105, 120, 32, 112, 105, 101, +99, 101, 115, 32, 111, 102, 32, 97, 32, 99, 111, 110, 115, 116, 97, 110, 116, 32, 100, 101, 99, 108, 97, 114, 97, 116, 105, 111, 110, 32, 97, 110, +100, 32, 119, 104, 97, 116, 32, 101, 97, 99, 104, 32, 111, 110, 101, 32, 100, 111, 101, 115, 46, 67, 104, 97, 110, 103, 101, 32, 65, 82, 69, 65, +32, 105, 110, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 115, 112, 101, 99, 32, 116, 111, 32, 51, 51, 32, 97, 110, 100, 32, 119, 97, +116, 99, 104, 32, 119, 104, 105, 99, 104, 32, 116, 101, 115, 116, 32, 102, 97, 105, 108, 115, 46, 1050, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1099, 1064, 1077, +1089, 1090, 1100, 32, 1095, 1072, 1089, 1090, 1077, 1081, 32, 1086, 1073, 1098, 1103, 1074, 1083, 1077, 1085, 1080, 1103, 32, 1082, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1099, 32, +1080, 32, 1095, 1090, 1086, 32, 1076, 1077, 1083, 1072, 1077, 1090, 32, 1082, 1072, 1078, 1076, 1072, 1103, 46, 1055, 1086, 1084, 1077, 1085, 1103, 1081, 1090, 1077, 32, 65, 82, +69, 65, 32, 1074, 32, 1089, 1087, 1077, 1082, 1077, 32, 1091, 1088, 1086, 1082, 1072, 32, 1085, 1072, 32, 51, 51, 32, 1080, 32, 1087, 1086, 1089, 1084, 1086, 1090, 1088, +1080, 1090, 1077, 44, 32, 1082, 1072, 1082, 1086, 1081, 32, 1090, 1077, 1089, 1090, 32, 1091, 1087, 1072, 1076, 1105, 1090, 46, 87, 104, 111, 108, 101, 32, 110, 117, 109, +98, 101, 114, 115, 32, 97, 110, 100, 32, 116, 104, 101, 105, 114, 32, 119, 105, 100, 116, 104, 115, 84, 104, 101, 32, 105, 110, 116, 101, 103, 101, 114, +32, 116, 121, 112, 101, 115, 44, 32, 116, 104, 101, 105, 114, 32, 114, 97, 110, 103, 101, 115, 44, 32, 97, 110, 100, 32, 116, 104, 101, 32, 101, 114, +114, 111, 114, 32, 97, 32, 118, 97, 108, 117, 101, 32, 116, 111, 111, 32, 98, 105, 103, 32, 102, 111, 114, 32, 105, 116, 115, 32, 116, 121, 112, 101, +32, 103, 101, 116, 115, 46, 83, 101, 116, 32, 66, 89, 84, 69, 95, 77, 65, 88, 32, 116, 111, 32, 51, 48, 48, 32, 105, 110, 32, 116, 104, 101, +32, 112, 108, 97, 121, 101, 114, 32, 97, 110, 100, 32, 114, 101, 97, 100, 32, 116, 104, 101, 32, 101, 114, 114, 111, 114, 32, 116, 104, 101, 32, 99, +111, 109, 112, 105, 108, 101, 114, 32, 112, 114, 105, 110, 116, 115, 46, 1062, 1077, 1083, 1099, 1077, 32, 1095, 1080, 1089, 1083, 1072, 32, 1080, 32, 1080, 1093, 32, +1096, 1080, 1088, 1080, 1085, 1072, 1062, 1077, 1083, 1099, 1077, 32, 1090, 1080, 1087, 1099, 44, 32, 1080, 1093, 32, 1076, 1080, 1072, 1087, 1072, 1079, 1086, 1085, 1099, 32, 1080, +32, 1086, 1096, 1080, 1073, 1082, 1072, 32, 1076, 1083, 1103, 32, 1079, 1085, 1072, 1095, 1077, 1085, 1080, 1103, 44, 32, 1082, 1086, 1090, 1086, 1088, 1086, 1077, 32, 1085, 1077, +32, 1087, 1086, 1084, 1077, 1097, 1072, 1077, 1090, 1089, 1103, 32, 1074, 32, 1090, 1080, 1087, 46, 1055, 1086, 1089, 1090, 1072, 1074, 1100, 1090, 1077, 32, 66, 89, 84, 69, +95, 77, 65, 88, 32, 1088, 1072, 1074, 1085, 1099, 1084, 32, 51, 48, 48, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, 32, 1080, 32, 1087, 1088, 1086, 1095, 1080, +1090, 1072, 1081, 1090, 1077, 32, 1086, 1096, 1080, 1073, 1082, 1091, 44, 32, 1082, 1086, 1090, 1086, 1088, 1091, 1102, 32, 1085, 1072, 1087, 1077, 1095, 1072, 1090, 1072, 1077, 1090, +32, 1082, 1086, 1084, 1087, 1080, 1083, 1103, 1090, 1086, 1088, 46, 84, 114, 117, 101, 44, 32, 102, 97, 108, 115, 101, 32, 97, 110, 100, 32, 116, 101, 120, 116, +72, 111, 119, 32, 116, 111, 32, 100, 101, 99, 108, 97, 114, 101, 32, 97, 32, 98, 111, 111, 108, 32, 97, 110, 100, 32, 97, 32, 115, 116, 114, 44, +32, 97, 110, 100, 32, 119, 104, 97, 116, 32, 97, 32, 116, 101, 115, 116, 32, 99, 97, 110, 32, 99, 111, 109, 112, 97, 114, 101, 32, 116, 104, 101, +109, 32, 119, 105, 116, 104, 46, 67, 104, 97, 110, 103, 101, 32, 78, 65, 77, 69, 32, 105, 110, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, +32, 115, 112, 101, 99, 32, 97, 110, 100, 32, 102, 105, 120, 32, 116, 104, 101, 32, 116, 101, 115, 116, 32, 115, 111, 32, 116, 104, 97, 116, 32, 105, +116, 32, 112, 97, 115, 115, 101, 115, 32, 97, 103, 97, 105, 110, 46, 1048, 1089, 1090, 1080, 1085, 1072, 44, 32, 1083, 1086, 1078, 1100, 32, 1080, 32, 1090, 1077, +1082, 1089, 1090, 1050, 1072, 1082, 32, 1086, 1073, 1098, 1103, 1074, 1080, 1090, 1100, 32, 98, 111, 111, 108, 32, 1080, 32, 115, 116, 114, 32, 1080, 32, 1089, 32, 1095, +1077, 1084, 32, 1080, 1093, 32, 1084, 1086, 1078, 1077, 1090, 32, 1089, 1088, 1072, 1074, 1085, 1080, 1090, 1100, 32, 1090, 1077, 1089, 1090, 46, 1055, 1086, 1084, 1077, 1085, 1103, +1081, 1090, 1077, 32, 78, 65, 77, 69, 32, 1074, 32, 1089, 1087, 1077, 1082, 1077, 32, 1091, 1088, 1086, 1082, 1072, 32, 1080, 32, 1087, 1086, 1087, 1088, 1072, 1074, 1100, +1090, 1077, 32, 1090, 1077, 1089, 1090, 44, 32, 1095, 1090, 1086, 1073, 1099, 32, 1086, 1085, 32, 1089, 1085, 1086, 1074, 1072, 32, 1087, 1088, 1086, 1096, 1105, 1083, 46, 65, +114, 114, 97, 121, 115, 72, 111, 119, 32, 116, 111, 32, 100, 101, 99, 108, 97, 114, 101, 32, 97, 110, 32, 97, 114, 114, 97, 121, 44, 32, 114, 101, +97, 100, 32, 97, 110, 32, 105, 116, 101, 109, 44, 32, 97, 110, 100, 32, 119, 104, 105, 99, 104, 32, 105, 110, 100, 101, 120, 32, 105, 115, 32, 116, +104, 101, 32, 108, 97, 115, 116, 32, 111, 110, 101, 46, 65, 100, 100, 32, 97, 32, 115, 105, 120, 116, 104, 32, 112, 114, 105, 109, 101, 32, 116, 111, +32, 80, 82, 73, 77, 69, 83, 44, 32, 102, 105, 120, 32, 116, 104, 101, 32, 108, 101, 110, 103, 116, 104, 44, 32, 97, 110, 100, 32, 119, 114, 105, +116, 101, 32, 97, 110, 32, 97, 115, 115, 101, 114, 116, 32, 102, 111, 114, 32, 105, 110, 100, 101, 120, 32, 53, 46, 1052, 1072, 1089, 1089, 1080, 1074, 1099, +1050, 1072, 1082, 32, 1086, 1073, 1098, 1103, 1074, 1080, 1090, 1100, 32, 1084, 1072, 1089, 1089, 1080, 1074, 44, 32, 1087, 1088, 1086, 1095, 1080, 1090, 1072, 1090, 1100, 32, 1101, +1083, 1077, 1084, 1077, 1085, 1090, 32, 1080, 32, 1082, 1072, 1082, 1086, 1081, 32, 1080, 1085, 1076, 1077, 1082, 1089, 32, 1087, 1086, 1089, 1083, 1077, 1076, 1085, 1080, 1081, 46, +1044, 1086, 1073, 1072, 1074, 1100, 1090, 1077, 32, 1074, 32, 80, 82, 73, 77, 69, 83, 32, 1096, 1077, 1089, 1090, 1086, 1077, 32, 1087, 1088, 1086, 1089, 1090, 1086, 1077, +32, 1095, 1080, 1089, 1083, 1086, 44, 32, 1087, 1086, 1087, 1088, 1072, 1074, 1100, 1090, 1077, 32, 1076, 1083, 1080, 1085, 1091, 32, 1080, 32, 1085, 1072, 1087, 1080, 1096, 1080, +1090, 1077, 32, 97, 115, 115, 101, 114, 116, 32, 1076, 1083, 1103, 32, 1080, 1085, 1076, 1077, 1082, 1089, 1072, 32, 53, 46, 84, 114, 105, 116, 115, 58, 32, 109, +105, 110, 117, 115, 32, 111, 110, 101, 44, 32, 122, 101, 114, 111, 44, 32, 111, 110, 101, 72, 111, 119, 32, 97, 32, 116, 114, 105, 116, 32, 105, 115, +32, 119, 114, 105, 116, 116, 101, 110, 32, 97, 115, 32, 97, 32, 115, 109, 97, 108, 108, 32, 115, 105, 103, 110, 101, 100, 32, 99, 111, 110, 115, 116, +97, 110, 116, 32, 97, 110, 100, 32, 119, 104, 121, 32, 50, 55, 32, 115, 104, 111, 119, 115, 32, 117, 112, 32, 101, 118, 101, 114, 121, 119, 104, 101, +114, 101, 46, 87, 114, 105, 116, 101, 32, 97, 110, 32, 97, 115, 115, 101, 114, 116, 32, 116, 104, 97, 116, 32, 80, 79, 83, 32, 109, 105, 110, 117, +115, 32, 78, 69, 71, 32, 101, 113, 117, 97, 108, 115, 32, 50, 44, 32, 97, 110, 100, 32, 99, 104, 101, 99, 107, 32, 105, 116, 32, 112, 97, 115, +115, 101, 115, 46, 1058, 1088, 1080, 1090, 1099, 58, 32, 1084, 1080, 1085, 1091, 1089, 32, 1086, 1076, 1080, 1085, 44, 32, 1085, 1086, 1083, 1100, 44, 32, 1086, 1076, 1080, +1085, 1050, 1072, 1082, 32, 1090, 1088, 1080, 1090, 32, 1079, 1072, 1087, 1080, 1089, 1099, 1074, 1072, 1077, 1090, 1089, 1103, 32, 1084, 1072, 1083, 1077, 1085, 1100, 1082, 1086, 1081, +32, 1079, 1085, 1072, 1082, 1086, 1074, 1086, 1081, 32, 1082, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1086, 1081, 32, 1080, 32, 1087, 1086, 1095, 1077, 1084, 1091, 32, 50, 55, +32, 1074, 1089, 1090, 1088, 1077, 1095, 1072, 1077, 1090, 1089, 1103, 32, 1087, 1086, 1074, 1089, 1102, 1076, 1091, 46, 1053, 1072, 1087, 1080, 1096, 1080, 1090, 1077, 32, 97, 115, +115, 101, 114, 116, 44, 32, 1095, 1090, 1086, 32, 80, 79, 83, 32, 1084, 1080, 1085, 1091, 1089, 32, 78, 69, 71, 32, 1088, 1072, 1074, 1085, 1086, 32, 50, 44, +32, 1080, 32, 1087, 1088, 1086, 1074, 1077, 1088, 1100, 1090, 1077, 44, 32, 1095, 1090, 1086, 32, 1086, 1085, 32, 1087, 1088, 1086, 1093, 1086, 1076, 1080, 1090, 46, 69, 120, +112, 114, 101, 115, 115, 105, 111, 110, 115, 65, 114, 105, 116, 104, 109, 101, 116, 105, 99, 32, 111, 112, 101, 114, 97, 116, 111, 114, 115, 32, 97, 110, +100, 32, 99, 111, 109, 112, 97, 114, 105, 115, 111, 110, 115, 32, 111, 110, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 99, 111, 110, 115, +116, 97, 110, 116, 115, 44, 32, 97, 110, 100, 32, 116, 104, 101, 32, 98, 111, 111, 108, 32, 97, 32, 99, 111, 109, 112, 97, 114, 105, 115, 111, 110, +32, 103, 105, 118, 101, 115, 32, 98, 97, 99, 107, 46, 67, 104, 97, 110, 103, 101, 32, 66, 32, 116, 111, 32, 52, 32, 97, 110, 100, 32, 112, 114, +101, 100, 105, 99, 116, 32, 101, 97, 99, 104, 32, 111, 102, 32, 116, 104, 101, 32, 102, 105, 118, 101, 32, 114, 101, 115, 117, 108, 116, 115, 32, 98, +101, 102, 111, 114, 101, 32, 121, 111, 117, 32, 114, 117, 110, 32, 116, 104, 101, 32, 116, 101, 115, 116, 115, 46, 1042, 1099, 1088, 1072, 1078, 1077, 1085, 1080, +1103, 1040, 1088, 1080, 1092, 1084, 1077, 1090, 1080, 1095, 1077, 1089, 1082, 1080, 1077, 32, 1086, 1087, 1077, 1088, 1072, 1090, 1086, 1088, 1099, 32, 1080, 32, 1089, 1088, 1072, 1074, +1085, 1077, 1085, 1080, 1103, 32, 1085, 1072, 32, 1082, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1072, 1093, 32, 1091, 1088, 1086, 1082, 1072, 32, 1080, 32, 98, 111, 111, 108, +44, 32, 1082, 1086, 1090, 1086, 1088, 1099, 1081, 32, 1074, 1086, 1079, 1074, 1088, 1072, 1097, 1072, 1077, 1090, 32, 1089, 1088, 1072, 1074, 1085, 1077, 1085, 1080, 1077, 46, 1055, +1086, 1084, 1077, 1085, 1103, 1081, 1090, 1077, 32, 66, 32, 1085, 1072, 32, 52, 32, 1080, 32, 1087, 1088, 1077, 1076, 1089, 1082, 1072, 1078, 1080, 1090, 1077, 32, 1074, 1089, +1077, 32, 1087, 1103, 1090, 1100, 32, 1088, 1077, 1079, 1091, 1083, 1100, 1090, 1072, 1090, 1086, 1074, 32, 1076, 1086, 32, 1079, 1072, 1087, 1091, 1089, 1082, 1072, 32, 1090, 1077, +1089, 1090, 1086, 1074, 46, 65, 32, 116, 101, 115, 116, 32, 98, 108, 111, 99, 107, 72, 111, 119, 32, 97, 32, 116, 101, 115, 116, 32, 98, 108, 111, 99, +107, 32, 105, 115, 32, 119, 114, 105, 116, 116, 101, 110, 32, 97, 110, 100, 32, 119, 104, 97, 116, 32, 97, 32, 102, 97, 105, 108, 105, 110, 103, 32, +97, 115, 115, 101, 114, 116, 32, 114, 101, 112, 111, 114, 116, 115, 46, 66, 114, 101, 97, 107, 32, 116, 104, 101, 32, 116, 101, 115, 116, 32, 111, 110, +32, 112, 117, 114, 112, 111, 115, 101, 32, 98, 121, 32, 99, 104, 97, 110, 103, 105, 110, 103, 32, 68, 65, 89, 83, 44, 32, 116, 104, 101, 110, 32, +114, 101, 97, 100, 32, 116, 104, 101, 32, 102, 97, 105, 108, 117, 114, 101, 32, 108, 105, 110, 101, 46, 1041, 1083, 1086, 1082, 32, 116, 101, 115, 116, 1050, +1072, 1082, 32, 1087, 1080, 1096, 1077, 1090, 1089, 1103, 32, 1073, 1083, 1086, 1082, 32, 116, 101, 115, 116, 32, 1080, 32, 1095, 1090, 1086, 32, 1089, 1086, 1086, 1073, 1097, +1072, 1077, 1090, 32, 1091, 1087, 1072, 1074, 1096, 1080, 1081, 32, 97, 115, 115, 101, 114, 116, 46, 1053, 1072, 1088, 1086, 1095, 1085, 1086, 32, 1089, 1083, 1086, 1084, 1072, +1081, 1090, 1077, 32, 1090, 1077, 1089, 1090, 44, 32, 1087, 1086, 1084, 1077, 1085, 1103, 1074, 32, 68, 65, 89, 83, 44, 32, 1080, 32, 1087, 1088, 1086, 1095, 1080, 1090, +1072, 1081, 1090, 1077, 32, 1089, 1090, 1088, 1086, 1082, 1091, 32, 1086, 1090, 1082, 1072, 1079, 1072, 46, 77, 97, 110, 121, 32, 116, 101, 115, 116, 115, 32, 105, 110, +32, 111, 110, 101, 32, 115, 112, 101, 99, 87, 104, 121, 32, 115, 101, 118, 101, 114, 97, 108, 32, 115, 109, 97, 108, 108, 32, 116, 101, 115, 116, 115, +32, 114, 101, 97, 100, 32, 98, 101, 116, 116, 101, 114, 32, 116, 104, 97, 110, 32, 111, 110, 101, 32, 108, 111, 110, 103, 32, 111, 110, 101, 44, 32, +97, 110, 100, 32, 104, 111, 119, 32, 116, 104, 101, 32, 114, 101, 112, 111, 114, 116, 32, 99, 111, 117, 110, 116, 115, 32, 116, 104, 101, 109, 46, 77, +97, 107, 101, 32, 111, 110, 101, 32, 111, 102, 32, 116, 104, 101, 32, 116, 104, 114, 101, 101, 32, 116, 101, 115, 116, 115, 32, 102, 97, 105, 108, 32, +97, 110, 100, 32, 99, 104, 101, 99, 107, 32, 116, 104, 97, 116, 32, 116, 104, 101, 32, 111, 116, 104, 101, 114, 32, 116, 119, 111, 32, 115, 116, 105, +108, 108, 32, 112, 97, 115, 115, 46, 1052, 1085, 1086, 1075, 1086, 32, 1090, 1077, 1089, 1090, 1086, 1074, 32, 1074, 32, 1086, 1076, 1085, 1086, 1081, 32, 1089, 1087, 1077, +1082, 1077, 1055, 1086, 1095, 1077, 1084, 1091, 32, 1085, 1077, 1089, 1082, 1086, 1083, 1100, 1082, 1086, 32, 1084, 1072, 1083, 1077, 1085, 1100, 1082, 1080, 1093, 32, 1090, 1077, 1089, +1090, 1086, 1074, 32, 1095, 1080, 1090, 1072, 1102, 1090, 1089, 1103, 32, 1087, 1088, 1086, 1097, 1077, 32, 1086, 1076, 1085, 1086, 1075, 1086, 32, 1076, 1083, 1080, 1085, 1085, 1086, +1075, 1086, 32, 1080, 32, 1082, 1072, 1082, 32, 1086, 1090, 1095, 1105, 1090, 32, 1080, 1093, 32, 1089, 1095, 1080, 1090, 1072, 1077, 1090, 46, 1057, 1076, 1077, 1083, 1072, 1081, +1090, 1077, 32, 1090, 1072, 1082, 44, 32, 1095, 1090, 1086, 1073, 1099, 32, 1086, 1076, 1080, 1085, 32, 1080, 1079, 32, 1090, 1088, 1105, 1093, 32, 1090, 1077, 1089, 1090, 1086, +1074, 32, 1091, 1087, 1072, 1083, 44, 32, 1080, 32, 1087, 1088, 1086, 1074, 1077, 1088, 1100, 1090, 1077, 44, 32, 1095, 1090, 1086, 32, 1076, 1074, 1072, 32, 1076, 1088, 1091, +1075, 1080, 1093, 32, 1087, 1088, 1086, 1093, 1086, 1076, 1103, 1090, 46, 70, 117, 110, 99, 116, 105, 111, 110, 115, 84, 104, 101, 32, 116, 119, 111, 32, 119, 97, +121, 115, 32, 116, 50, 55, 32, 119, 114, 105, 116, 101, 115, 32, 97, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, 105, 103, 110, 97, 116, 117, +114, 101, 44, 32, 97, 110, 100, 32, 116, 104, 101, 32, 98, 111, 100, 121, 32, 119, 105, 116, 104, 32, 114, 101, 116, 117, 114, 110, 46, 87, 114, 105, +116, 101, 32, 97, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, 117, 98, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 32, +105, 110, 32, 101, 105, 116, 104, 101, 114, 32, 115, 116, 121, 108, 101, 32, 97, 110, 100, 32, 99, 104, 101, 99, 107, 32, 116, 104, 101, 32, 118, 101, +114, 100, 105, 99, 116, 32, 115, 116, 97, 121, 115, 32, 99, 108, 101, 97, 110, 46, 1060, 1091, 1085, 1082, 1094, 1080, 1080, 1044, 1074, 1072, 32, 1089, 1087, 1086, +1089, 1086, 1073, 1072, 32, 1079, 1072, 1087, 1080, 1089, 1072, 1090, 1100, 32, 1089, 1080, 1075, 1085, 1072, 1090, 1091, 1088, 1091, 32, 1092, 1091, 1085, 1082, 1094, 1080, 1080, 32, +1074, 32, 116, 50, 55, 32, 1080, 32, 1090, 1077, 1083, 1086, 32, 1089, 32, 114, 101, 116, 117, 114, 110, 46, 1053, 1072, 1087, 1080, 1096, 1080, 1090, 1077, 32, 1074, +32, 1087, 1083, 1077, 1077, 1088, 1077, 32, 1092, 1091, 1085, 1082, 1094, 1080, 1102, 32, 115, 117, 98, 32, 1074, 32, 1083, 1102, 1073, 1086, 1084, 32, 1080, 1079, 32, 1076, +1074, 1091, 1093, 32, 1089, 1090, 1080, 1083, 1077, 1081, 32, 1080, 32, 1087, 1088, 1086, 1074, 1077, 1088, 1100, 1090, 1077, 44, 32, 1095, 1090, 1086, 32, 1074, 1077, 1088, 1076, +1080, 1082, 1090, 32, 1095, 1080, 1089, 1090, 1099, 1081, 46, 76, 111, 99, 97, 108, 32, 110, 97, 109, 101, 115, 58, 32, 108, 101, 116, 32, 97, 110, 100, 32, +118, 97, 114, 87, 104, 101, 110, 32, 116, 111, 32, 117, 115, 101, 32, 108, 101, 116, 32, 97, 110, 100, 32, 119, 104, 101, 110, 32, 118, 97, 114, 44, +32, 97, 110, 100, 32, 104, 111, 119, 32, 97, 32, 118, 97, 114, 32, 105, 115, 32, 117, 112, 100, 97, 116, 101, 100, 46, 67, 104, 97, 110, 103, 101, +32, 108, 101, 116, 32, 116, 111, 32, 118, 97, 114, 32, 105, 110, 32, 97, 114, 101, 97, 32, 97, 110, 100, 32, 99, 104, 101, 99, 107, 32, 116, 104, +101, 32, 118, 101, 114, 100, 105, 99, 116, 59, 32, 116, 104, 101, 110, 32, 101, 120, 112, 108, 97, 105, 110, 32, 119, 104, 121, 32, 108, 101, 116, 32, +114, 101, 97, 100, 115, 32, 98, 101, 116, 116, 101, 114, 32, 116, 104, 101, 114, 101, 46, 1051, 1086, 1082, 1072, 1083, 1100, 1085, 1099, 1077, 32, 1080, 1084, 1077, +1085, 1072, 58, 32, 108, 101, 116, 32, 1080, 32, 118, 97, 114, 1050, 1086, 1075, 1076, 1072, 32, 1085, 1091, 1078, 1077, 1085, 32, 108, 101, 116, 44, 32, 1072, 32, +1082, 1086, 1075, 1076, 1072, 32, 118, 97, 114, 32, 1080, 32, 1082, 1072, 1082, 32, 1086, 1073, 1085, 1086, 1074, 1083, 1103, 1077, 1090, 1089, 1103, 32, 118, 97, 114, 46, +1047, 1072, 1084, 1077, 1085, 1080, 1090, 1077, 32, 108, 101, 116, 32, 1085, 1072, 32, 118, 97, 114, 32, 1074, 32, 97, 114, 101, 97, 32, 1080, 32, 1087, 1088, 1086, +1074, 1077, 1088, 1100, 1090, 1077, 32, 1074, 1077, 1088, 1076, 1080, 1082, 1090, 59, 32, 1087, 1086, 1090, 1086, 1084, 32, 1086, 1073, 1098, 1103, 1089, 1085, 1080, 1090, 1077, 44, +32, 1087, 1086, 1095, 1077, 1084, 1091, 32, 1090, 1072, 1084, 32, 1091, 1084, 1077, 1089, 1090, 1085, 1077, 1077, 32, 108, 101, 116, 46, 67, 104, 111, 105, 99, 101, 115, +58, 32, 105, 102, 44, 32, 101, 108, 115, 101, 32, 97, 110, 100, 32, 115, 119, 105, 116, 99, 104, 84, 104, 101, 32, 102, 111, 114, 109, 115, 32, 111, +102, 32, 105, 102, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 114, 32, 97, 99, 99, 101, 112, 116, 115, 44, 32, 116, 104, 101, 32, 105, +102, 32, 101, 120, 112, 114, 101, 115, 115, 105, 111, 110, 44, 32, 97, 110, 100, 32, 115, 119, 105, 116, 99, 104, 32, 119, 105, 116, 104, 32, 101, 108, +115, 101, 46, 65, 100, 100, 32, 97, 32, 99, 97, 115, 101, 32, 49, 32, 61, 62, 32, 49, 53, 32, 116, 111, 32, 116, 104, 101, 32, 115, 119, 105, +116, 99, 104, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 32, 97, 110, 100, 32, 99, 104, 101, 99, 107, 32, 116, 104, 101, 32, +118, 101, 114, 100, 105, 99, 116, 46, 1042, 1099, 1073, 1086, 1088, 58, 32, 105, 102, 44, 32, 101, 108, 115, 101, 32, 1080, 32, 115, 119, 105, 116, 99, 104, +1060, 1086, 1088, 1084, 1099, 32, 105, 102, 44, 32, 1082, 1086, 1090, 1086, 1088, 1099, 1077, 32, 1087, 1088, 1080, 1085, 1080, 1084, 1072, 1077, 1090, 32, 1082, 1086, 1084, 1087, +1080, 1083, 1103, 1090, 1086, 1088, 44, 32, 1074, 1099, 1088, 1072, 1078, 1077, 1085, 1080, 1077, 32, 105, 102, 32, 1080, 32, 115, 119, 105, 116, 99, 104, 32, 1089, 32, +101, 108, 115, 101, 46, 1044, 1086, 1073, 1072, 1074, 1100, 1090, 1077, 32, 1074, 32, 115, 119, 105, 116, 99, 104, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, 32, +1089, 1083, 1091, 1095, 1072, 1081, 32, 49, 32, 61, 62, 32, 49, 53, 32, 1080, 32, 1087, 1088, 1086, 1074, 1077, 1088, 1100, 1090, 1077, 32, 1074, 1077, 1088, 1076, 1080, +1082, 1090, 46, 76, 111, 111, 112, 115, 58, 32, 119, 104, 105, 108, 101, 32, 97, 110, 100, 32, 102, 111, 114, 84, 104, 101, 32, 116, 104, 114, 101, 101, +32, 108, 111, 111, 112, 32, 102, 111, 114, 109, 115, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 114, 32, 97, 99, 99, 101, 112, 116, 115, +32, 97, 110, 100, 32, 104, 111, 119, 32, 97, 32, 114, 97, 110, 103, 101, 32, 105, 115, 32, 119, 114, 105, 116, 116, 101, 110, 46, 87, 111, 114, 107, +32, 111, 117, 116, 32, 98, 121, 32, 104, 97, 110, 100, 32, 119, 104, 97, 116, 32, 115, 117, 109, 95, 116, 111, 32, 114, 101, 116, 117, 114, 110, 115, +32, 102, 111, 114, 32, 110, 32, 61, 32, 52, 44, 32, 116, 104, 101, 110, 32, 119, 114, 105, 116, 101, 32, 105, 116, 32, 97, 115, 32, 97, 32, 99, +111, 110, 115, 116, 97, 110, 116, 32, 119, 105, 116, 104, 32, 97, 32, 116, 101, 115, 116, 46, 1062, 1080, 1082, 1083, 1099, 58, 32, 119, 104, 105, 108, 101, +32, 1080, 32, 102, 111, 114, 1058, 1088, 1080, 32, 1092, 1086, 1088, 1084, 1099, 32, 1094, 1080, 1082, 1083, 1072, 44, 32, 1082, 1086, 1090, 1086, 1088, 1099, 1077, 32, 1087, +1088, 1080, 1085, 1080, 1084, 1072, 1077, 1090, 32, 1082, 1086, 1084, 1087, 1080, 1083, 1103, 1090, 1086, 1088, 44, 32, 1080, 32, 1082, 1072, 1082, 32, 1087, 1080, 1096, 1077, 1090, +1089, 1103, 32, 1076, 1080, 1072, 1087, 1072, 1079, 1086, 1085, 46, 1055, 1086, 1089, 1095, 1080, 1090, 1072, 1081, 1090, 1077, 32, 1074, 1088, 1091, 1095, 1085, 1091, 1102, 44, 32, +1095, 1090, 1086, 32, 1074, 1077, 1088, 1085, 1105, 1090, 32, 115, 117, 109, 95, 116, 111, 32, 1087, 1088, 1080, 32, 110, 32, 61, 32, 52, 44, 32, 1080, 32, 1079, +1072, 1087, 1080, 1096, 1080, 1090, 1077, 32, 1101, 1090, 1086, 32, 1082, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1086, 1081, 32, 1089, 32, 1090, 1077, 1089, 1090, 1086, 1084, 46, +112, 117, 98, 32, 111, 114, 32, 112, 114, 105, 118, 97, 116, 101, 87, 104, 97, 116, 32, 112, 117, 98, 32, 100, 101, 99, 108, 97, 114, 101, 115, 44, +32, 97, 110, 100, 32, 119, 104, 97, 116, 32, 116, 104, 101, 32, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 32, 98, 97, 99, 107, 101, 110, 100, +32, 119, 114, 105, 116, 101, 115, 32, 119, 105, 116, 104, 32, 97, 110, 100, 32, 119, 105, 116, 104, 111, 117, 116, 32, 105, 116, 46, 79, 112, 101, 110, +32, 116, 104, 101, 32, 116, 115, 32, 116, 97, 98, 32, 111, 102, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 115, 112, 101, 99, 32, 105, +110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 32, 97, 110, 100, 32, 102, 105, 110, 100, 32, 98, 111, 116, 104, 32, 99, 111, 110, 115, 116, +97, 110, 116, 115, 46, 112, 117, 98, 32, 1080, 1083, 1080, 32, 1079, 1072, 1082, 1088, 1099, 1090, 1086, 1077, 32, 1080, 1084, 1103, 1063, 1090, 1086, 32, 1086, 1073, 1098, +1103, 1074, 1083, 1103, 1077, 1090, 32, 112, 117, 98, 32, 1080, 32, 1095, 1090, 1086, 32, 1087, 1080, 1096, 1077, 1090, 32, 1073, 1101, 1082, 1077, 1085, 1076, 32, 84, 121, +112, 101, 83, 99, 114, 105, 112, 116, 32, 1089, 32, 1085, 1080, 1084, 32, 1080, 32, 1073, 1077, 1079, 32, 1085, 1077, 1075, 1086, 46, 1054, 1090, 1082, 1088, 1086, 1081, +1090, 1077, 32, 1074, 1082, 1083, 1072, 1076, 1082, 1091, 32, 116, 115, 32, 1089, 1087, 1077, 1082, 1080, 32, 1091, 1088, 1086, 1082, 1072, 32, 1074, 32, 1087, 1083, 1077, 1077, +1088, 1077, 32, 1080, 32, 1085, 1072, 1081, 1076, 1080, 1090, 1077, 32, 1086, 1073, 1077, 32, 1082, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1099, 46, 83, 116, 114, 117, 99, +116, 115, 72, 111, 119, 32, 116, 111, 32, 100, 101, 99, 108, 97, 114, 101, 32, 97, 32, 115, 116, 114, 117, 99, 116, 32, 97, 110, 100, 32, 97, 32, +112, 97, 99, 107, 101, 100, 32, 115, 116, 114, 117, 99, 116, 44, 32, 97, 110, 100, 32, 104, 111, 119, 32, 109, 97, 110, 121, 32, 97, 32, 109, 111, +100, 117, 108, 101, 32, 109, 97, 121, 32, 104, 111, 108, 100, 46, 65, 100, 100, 32, 97, 32, 102, 105, 101, 108, 100, 32, 122, 58, 32, 105, 51, 50, +32, 116, 111, 32, 80, 111, 105, 110, 116, 32, 97, 110, 100, 32, 99, 104, 101, 99, 107, 32, 119, 104, 105, 99, 104, 32, 98, 97, 99, 107, 101, 110, +100, 115, 32, 115, 116, 105, 108, 108, 32, 99, 111, 109, 112, 105, 108, 101, 32, 105, 116, 46, 1057, 1090, 1088, 1091, 1082, 1090, 1091, 1088, 1099, 1050, 1072, 1082, +32, 1086, 1073, 1098, 1103, 1074, 1080, 1090, 1100, 32, 115, 116, 114, 117, 99, 116, 32, 1080, 32, 112, 97, 99, 107, 101, 100, 32, 115, 116, 114, 117, 99, 116, +32, 1080, 32, 1089, 1082, 1086, 1083, 1100, 1082, 1086, 32, 1080, 1093, 32, 1084, 1086, 1078, 1077, 1090, 32, 1073, 1099, 1090, 1100, 32, 1074, 32, 1084, 1086, 1076, 1091, 1083, +1077, 46, 1044, 1086, 1073, 1072, 1074, 1100, 1090, 1077, 32, 1074, 32, 80, 111, 105, 110, 116, 32, 1087, 1086, 1083, 1077, 32, 122, 58, 32, 105, 51, 50, 32, 1080, +32, 1087, 1088, 1086, 1074, 1077, 1088, 1100, 1090, 1077, 44, 32, 1082, 1072, 1082, 1080, 1077, 32, 1073, 1101, 1082, 1077, 1085, 1076, 1099, 32, 1077, 1075, 1086, 32, 1087, 1086, +45, 1087, 1088, 1077, 1078, 1085, 1077, 1084, 1091, 32, 1082, 1086, 1084, 1087, 1080, 1083, 1080, 1088, 1091, 1102, 1090, 46, 69, 110, 117, 109, 115, 84, 104, 101, 32, 116, +119, 111, 32, 119, 97, 121, 115, 32, 116, 111, 32, 100, 101, 99, 108, 97, 114, 101, 32, 97, 110, 32, 101, 110, 117, 109, 32, 97, 110, 100, 32, 104, +111, 119, 32, 97, 32, 115, 119, 105, 116, 99, 104, 32, 114, 101, 97, 100, 115, 32, 97, 32, 118, 97, 108, 117, 101, 46, 65, 100, 100, 32, 97, 32, +102, 111, 117, 114, 116, 104, 32, 99, 111, 108, 111, 114, 32, 116, 111, 32, 67, 111, 108, 111, 114, 32, 97, 110, 100, 32, 117, 112, 100, 97, 116, 101, +32, 67, 65, 83, 69, 83, 95, 73, 78, 95, 67, 79, 76, 79, 82, 32, 115, 111, 32, 116, 104, 101, 32, 116, 101, 115, 116, 32, 112, 97, 115, 115, +101, 115, 46, 1055, 1077, 1088, 1077, 1095, 1080, 1089, 1083, 1077, 1085, 1080, 1103, 1044, 1074, 1072, 32, 1089, 1087, 1086, 1089, 1086, 1073, 1072, 32, 1086, 1073, 1098, 1103, 1074, +1080, 1090, 1100, 32, 101, 110, 117, 109, 32, 1080, 32, 1082, 1072, 1082, 32, 115, 119, 105, 116, 99, 104, 32, 1095, 1080, 1090, 1072, 1077, 1090, 32, 1079, 1085, 1072, +1095, 1077, 1085, 1080, 1077, 46, 1044, 1086, 1073, 1072, 1074, 1100, 1090, 1077, 32, 1074, 32, 67, 111, 108, 111, 114, 32, 1095, 1077, 1090, 1074, 1105, 1088, 1090, 1099, 1081, +32, 1094, 1074, 1077, 1090, 32, 1080, 32, 1086, 1073, 1085, 1086, 1074, 1080, 1090, 1077, 32, 67, 65, 83, 69, 83, 95, 73, 78, 95, 67, 79, 76, 79, 82, 44, +32, 1095, 1090, 1086, 1073, 1099, 32, 1090, 1077, 1089, 1090, 32, 1087, 1088, 1086, 1096, 1105, 1083, 46, 85, 115, 105, 110, 103, 32, 111, 116, 104, 101, 114, 32, 109, +111, 100, 117, 108, 101, 115, 72, 111, 119, 32, 97, 32, 117, 115, 101, 32, 108, 105, 110, 101, 32, 105, 115, 32, 119, 114, 105, 116, 116, 101, 110, 44, +32, 97, 110, 100, 32, 119, 104, 97, 116, 32, 116, 104, 101, 32, 98, 114, 111, 119, 115, 101, 114, 32, 99, 97, 110, 32, 97, 110, 100, 32, 99, 97, +110, 110, 111, 116, 32, 100, 111, 32, 119, 105, 116, 104, 32, 105, 116, 46, 70, 105, 110, 100, 32, 116, 104, 101, 32, 117, 115, 101, 32, 100, 101, 99, +108, 97, 114, 97, 116, 105, 111, 110, 32, 105, 110, 32, 116, 104, 101, 32, 112, 97, 114, 115, 101, 114, 32, 116, 114, 101, 101, 32, 111, 102, 32, 116, +104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 115, 112, 101, 99, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 46, 1044, 1088, 1091, +1075, 1080, 1077, 32, 1084, 1086, 1076, 1091, 1083, 1080, 1050, 1072, 1082, 32, 1087, 1080, 1096, 1077, 1090, 1089, 1103, 32, 1089, 1090, 1088, 1086, 1082, 1072, 32, 117, 115, 101, +32, 1080, 32, 1095, 1090, 1086, 32, 1073, 1088, 1072, 1091, 1079, 1077, 1088, 32, 1084, 1086, 1078, 1077, 1090, 32, 1080, 32, 1095, 1077, 1075, 1086, 32, 1085, 1077, 32, 1084, +1086, 1078, 1077, 1090, 32, 1089, 32, 1085, 1077, 1081, 32, 1089, 1076, 1077, 1083, 1072, 1090, 1100, 46, 1053, 1072, 1081, 1076, 1080, 1090, 1077, 32, 1086, 1073, 1098, 1103, 1074, +1083, 1077, 1085, 1080, 1077, 32, 117, 115, 101, 32, 1074, 32, 1076, 1077, 1088, 1077, 1074, 1077, 32, 1088, 1072, 1079, 1073, 1086, 1088, 1072, 32, 1089, 1087, 1077, 1082, 1080, +32, 1091, 1088, 1086, 1082, 1072, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, 46, 73, 110, 118, 97, 114, 105, 97, 110, 116, 115, 32, 97, 110, 100, 32, 98, +101, 110, 99, 104, 101, 115, 72, 111, 119, 32, 105, 110, 118, 97, 114, 105, 97, 110, 116, 32, 97, 110, 100, 32, 98, 101, 110, 99, 104, 32, 98, 108, +111, 99, 107, 115, 32, 97, 114, 101, 32, 119, 114, 105, 116, 116, 101, 110, 32, 97, 110, 100, 32, 119, 104, 111, 32, 101, 118, 97, 108, 117, 97, 116, +101, 115, 32, 116, 104, 101, 109, 46, 77, 97, 107, 101, 32, 116, 104, 101, 32, 105, 110, 118, 97, 114, 105, 97, 110, 116, 32, 102, 97, 108, 115, 101, +32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 32, 97, 110, 100, 32, 99, 104, 101, 99, 107, 32, 116, 104, 97, 116, 32, 110, 111, +116, 104, 105, 110, 103, 32, 111, 110, 32, 116, 104, 105, 115, 32, 115, 105, 116, 101, 32, 99, 111, 109, 112, 108, 97, 105, 110, 115, 44, 32, 116, 104, +101, 110, 32, 109, 97, 107, 101, 32, 116, 104, 101, 32, 116, 101, 115, 116, 32, 102, 97, 108, 115, 101, 46, 1048, 1085, 1074, 1072, 1088, 1080, 1072, 1085, 1090, +1099, 32, 1080, 32, 1079, 1072, 1084, 1077, 1088, 1099, 1050, 1072, 1082, 32, 1087, 1080, 1096, 1091, 1090, 1089, 1103, 32, 1073, 1083, 1086, 1082, 1080, 32, 105, 110, 118, 97, +114, 105, 97, 110, 116, 32, 1080, 32, 98, 101, 110, 99, 104, 32, 1080, 32, 1082, 1090, 1086, 32, 1080, 1093, 32, 1074, 1099, 1095, 1080, 1089, 1083, 1103, 1077, 1090, +46, 1057, 1076, 1077, 1083, 1072, 1081, 1090, 1077, 32, 1080, 1085, 1074, 1072, 1088, 1080, 1072, 1085, 1090, 32, 1083, 1086, 1078, 1085, 1099, 1084, 32, 1074, 32, 1087, 1083, 1077, +1077, 1088, 1077, 32, 1080, 32, 1091, 1073, 1077, 1076, 1080, 1090, 1077, 1089, 1100, 44, 32, 1095, 1090, 1086, 32, 1101, 1090, 1086, 1090, 32, 1089, 1072, 1081, 1090, 32, 1084, +1086, 1083, 1095, 1080, 1090, 44, 32, 1079, 1072, 1090, 1077, 1084, 32, 1089, 1076, 1077, 1083, 1072, 1081, 1090, 1077, 32, 1083, 1086, 1078, 1085, 1099, 1084, 32, 1090, 1077, 1089, +1090, 46, 103, 101, 110, 45, 116, 115, 58, 32, 97, 32, 115, 112, 101, 99, 32, 98, 101, 99, 111, 109, 101, 115, 32, 84, 121, 112, 101, 83, 99, 114, +105, 112, 116, 87, 104, 97, 116, 32, 103, 101, 110, 45, 116, 115, 32, 119, 114, 105, 116, 101, 115, 32, 102, 111, 114, 32, 99, 111, 110, 115, 116, 97, +110, 116, 115, 32, 97, 110, 100, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 44, 32, 97, 110, 100, 32, 104, 111, 119, 32, 97, 32, 104, 111, 115, +116, 32, 112, 114, 111, 103, 114, 97, 109, 32, 117, 115, 101, 115, 32, 105, 116, 46, 65, 100, 100, 32, 97, 32, 99, 111, 110, 115, 116, 97, 110, 116, +32, 116, 111, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 115, 112, 101, 99, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, +114, 32, 97, 110, 100, 32, 102, 105, 110, 100, 32, 105, 116, 115, 32, 108, 105, 110, 101, 32, 105, 110, 32, 116, 104, 101, 32, 116, 115, 32, 116, 97, +98, 46, 103, 101, 110, 45, 116, 115, 58, 32, 1089, 1087, 1077, 1082, 1072, 32, 1087, 1088, 1077, 1074, 1088, 1072, 1097, 1072, 1077, 1090, 1089, 1103, 32, 1074, 32, 84, +121, 112, 101, 83, 99, 114, 105, 112, 116, 1063, 1090, 1086, 32, 103, 101, 110, 45, 116, 115, 32, 1087, 1080, 1096, 1077, 1090, 32, 1076, 1083, 1103, 32, 1082, 1086, +1085, 1089, 1090, 1072, 1085, 1090, 32, 1080, 32, 1092, 1091, 1085, 1082, 1094, 1080, 1081, 32, 1080, 32, 1082, 1072, 1082, 32, 1101, 1090, 1086, 32, 1080, 1089, 1087, 1086, 1083, +1100, 1079, 1091, 1077, 1090, 32, 1087, 1088, 1086, 1075, 1088, 1072, 1084, 1084, 1072, 45, 1093, 1086, 1079, 1103, 1080, 1085, 46, 1044, 1086, 1073, 1072, 1074, 1100, 1090, 1077, 32, +1082, 1086, 1085, 1089, 1090, 1072, 1085, 1090, 1091, 32, 1074, 32, 1089, 1087, 1077, 1082, 1091, 32, 1091, 1088, 1086, 1082, 1072, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, +32, 1080, 32, 1085, 1072, 1081, 1076, 1080, 1090, 1077, 32, 1077, 1105, 32, 1089, 1090, 1088, 1086, 1082, 1091, 32, 1074, 1086, 32, 1074, 1082, 1083, 1072, 1076, 1082, 1077, 32, +116, 115, 46, 83, 101, 118, 101, 110, 32, 98, 97, 99, 107, 101, 110, 100, 115, 84, 104, 101, 32, 110, 97, 109, 101, 115, 32, 111, 102, 32, 116, 104, +101, 32, 55, 32, 98, 97, 99, 107, 101, 110, 100, 115, 32, 97, 110, 100, 32, 104, 111, 119, 32, 109, 117, 99, 104, 32, 99, 111, 100, 101, 32, 101, +97, 99, 104, 32, 119, 114, 111, 116, 101, 32, 102, 111, 114, 32, 111, 110, 101, 32, 115, 109, 97, 108, 108, 32, 115, 112, 101, 99, 46, 79, 112, 101, +110, 32, 101, 97, 99, 104, 32, 98, 97, 99, 107, 101, 110, 100, 32, 116, 97, 98, 32, 111, 102, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, +32, 115, 112, 101, 99, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 32, 97, 110, 100, 32, 102, 105, 110, 100, 32, 116, 104, 101, +32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 97, 100, 100, 46, 1057, 1077, 1084, 1100, 32, 1073, 1101, 1082, 1077, 1085, 1076, 1086, 1074, 1048, 1084, 1077, 1085, 1072, +32, 55, 32, 1073, 1101, 1082, 1077, 1085, 1076, 1086, 1074, 32, 1080, 32, 1089, 1082, 1086, 1083, 1100, 1082, 1086, 32, 1082, 1086, 1076, 1072, 32, 1082, 1072, 1078, 1076, 1099, +1081, 32, 1085, 1072, 1087, 1080, 1089, 1072, 1083, 32, 1076, 1083, 1103, 32, 1086, 1076, 1085, 1086, 1081, 32, 1084, 1072, 1083, 1077, 1085, 1100, 1082, 1086, 1081, 32, 1089, 1087, +1077, 1082, 1080, 46, 1054, 1090, 1082, 1088, 1086, 1081, 1090, 1077, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, 32, 1082, 1072, 1078, 1076, 1091, 1102, 32, 1074, 1082, 1083, +1072, 1076, 1082, 1091, 32, 1073, 1101, 1082, 1077, 1085, 1076, 1072, 32, 1089, 1087, 1077, 1082, 1080, 32, 1091, 1088, 1086, 1082, 1072, 32, 1080, 32, 1085, 1072, 1081, 1076, 1080, +1090, 1077, 32, 1092, 1091, 1085, 1082, 1094, 1080, 1102, 32, 97, 100, 100, 46, 84, 104, 101, 32, 115, 116, 97, 103, 101, 115, 32, 111, 102, 32, 116, 50, 55, +99, 84, 104, 101, 32, 111, 114, 100, 101, 114, 32, 111, 102, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 114, 32, 115, 116, 97, 103, 101, +115, 32, 97, 110, 100, 32, 119, 104, 97, 116, 32, 101, 97, 99, 104, 32, 111, 110, 101, 32, 112, 114, 111, 100, 117, 99, 101, 100, 32, 102, 111, 114, +32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 115, 112, 101, 99, 46, 79, 112, 101, 110, 32, 116, 104, 101, 32, 116, 50, 55, 99, 32, 115, +116, 97, 103, 101, 115, 32, 119, 105, 100, 103, 101, 116, 44, 32, 112, 97, 115, 116, 101, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, 115, +112, 101, 99, 44, 32, 97, 110, 100, 32, 109, 97, 116, 99, 104, 32, 105, 116, 115, 32, 99, 111, 117, 110, 116, 115, 32, 119, 105, 116, 104, 32, 116, +104, 101, 32, 116, 97, 98, 108, 101, 46, 1057, 1090, 1072, 1076, 1080, 1080, 32, 116, 50, 55, 99, 1055, 1086, 1088, 1103, 1076, 1086, 1082, 32, 1089, 1090, 1072, 1076, +1080, 1081, 32, 1082, 1086, 1084, 1087, 1080, 1083, 1103, 1090, 1086, 1088, 1072, 32, 1080, 32, 1095, 1090, 1086, 32, 1082, 1072, 1078, 1076, 1072, 1103, 32, 1074, 1099, 1076, 1072, +1083, 1072, 32, 1076, 1083, 1103, 32, 1089, 1087, 1077, 1082, 1080, 32, 1091, 1088, 1086, 1082, 1072, 46, 1054, 1090, 1082, 1088, 1086, 1081, 1090, 1077, 32, 1074, 1080, 1076, 1078, +1077, 1090, 32, 1089, 1090, 1072, 1076, 1080, 1081, 32, 116, 50, 55, 99, 44, 32, 1074, 1089, 1090, 1072, 1074, 1100, 1090, 1077, 32, 1089, 1087, 1077, 1082, 1091, 32, 1091, +1088, 1086, 1082, 1072, 32, 1080, 32, 1089, 1074, 1077, 1088, 1100, 1090, 1077, 32, 1095, 1080, 1089, 1083, 1072, 32, 1089, 32, 1090, 1072, 1073, 1083, 1080, 1094, 1077, 1081, 46, +116, 114, 105, 58, 32, 116, 104, 101, 32, 99, 111, 109, 109, 97, 110, 100, 32, 108, 105, 110, 101, 87, 104, 97, 116, 32, 116, 114, 105, 32, 116, 101, +115, 116, 32, 100, 111, 101, 115, 44, 32, 104, 111, 119, 32, 116, 114, 105, 32, 104, 97, 110, 100, 115, 32, 111, 116, 104, 101, 114, 32, 119, 111, 114, +100, 115, 32, 116, 111, 32, 116, 50, 55, 99, 44, 32, 97, 110, 100, 32, 119, 104, 105, 99, 104, 32, 99, 111, 109, 109, 97, 110, 100, 115, 32, 97, +114, 101, 32, 105, 116, 115, 32, 111, 119, 110, 46, 82, 101, 97, 100, 32, 116, 104, 101, 32, 116, 97, 98, 108, 101, 32, 97, 110, 100, 32, 115, 97, +121, 32, 119, 104, 105, 99, 104, 32, 99, 111, 109, 109, 97, 110, 100, 115, 32, 103, 111, 32, 116, 111, 32, 116, 50, 55, 99, 32, 97, 110, 100, 32, +119, 104, 105, 99, 104, 32, 115, 116, 97, 121, 32, 105, 110, 115, 105, 100, 101, 32, 116, 114, 105, 46, 116, 114, 105, 58, 32, 1082, 1086, 1084, 1072, 1085, +1076, 1085, 1072, 1103, 32, 1089, 1090, 1088, 1086, 1082, 1072, 1063, 1090, 1086, 32, 1076, 1077, 1083, 1072, 1077, 1090, 32, 116, 114, 105, 32, 116, 101, 115, 116, 44, 32, +1082, 1072, 1082, 32, 116, 114, 105, 32, 1087, 1077, 1088, 1077, 1076, 1072, 1105, 1090, 32, 1086, 1089, 1090, 1072, 1083, 1100, 1085, 1099, 1077, 32, 1089, 1083, 1086, 1074, 1072, +32, 116, 50, 55, 99, 32, 1080, 32, 1082, 1072, 1082, 1080, 1077, 32, 1082, 1086, 1084, 1072, 1085, 1076, 1099, 32, 1091, 32, 1085, 1077, 1075, 1086, 32, 1089, 1074, 1086, +1080, 46, 1055, 1088, 1086, 1095, 1080, 1090, 1072, 1081, 1090, 1077, 32, 1090, 1072, 1073, 1083, 1080, 1094, 1091, 32, 1080, 32, 1089, 1082, 1072, 1078, 1080, 1090, 1077, 44, 32, +1082, 1072, 1082, 1080, 1077, 32, 1082, 1086, 1084, 1072, 1085, 1076, 1099, 32, 1091, 1093, 1086, 1076, 1103, 1090, 32, 1074, 32, 116, 50, 55, 99, 44, 32, 1072, 32, 1082, +1072, 1082, 1080, 1077, 32, 1086, 1089, 1090, 1072, 1102, 1090, 1089, 1103, 32, 1074, 1085, 1091, 1090, 1088, 1080, 32, 116, 114, 105, 46, 82, 101, 97, 100, 105, 110, 103, +32, 99, 111, 109, 112, 105, 108, 101, 114, 32, 101, 114, 114, 111, 114, 115, 72, 111, 119, 32, 116, 111, 32, 114, 101, 97, 100, 32, 116, 104, 101, 32, +108, 105, 110, 101, 32, 97, 110, 100, 32, 99, 111, 108, 117, 109, 110, 32, 111, 102, 32, 97, 110, 32, 101, 114, 114, 111, 114, 44, 32, 117, 115, 105, +110, 103, 32, 102, 111, 117, 114, 32, 114, 101, 97, 108, 32, 109, 105, 115, 116, 97, 107, 101, 115, 46, 77, 97, 107, 101, 32, 101, 97, 99, 104, 32, +111, 102, 32, 116, 104, 101, 32, 102, 111, 117, 114, 32, 109, 105, 115, 116, 97, 107, 101, 115, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, +101, 114, 32, 97, 110, 100, 32, 109, 97, 116, 99, 104, 32, 116, 104, 101, 32, 108, 105, 110, 101, 32, 97, 110, 100, 32, 99, 111, 108, 117, 109, 110, +32, 119, 105, 116, 104, 32, 116, 104, 101, 32, 116, 97, 98, 108, 101, 46, 1050, 1072, 1082, 32, 1095, 1080, 1090, 1072, 1090, 1100, 32, 1086, 1096, 1080, 1073, 1082, +1080, 32, 1082, 1086, 1084, 1087, 1080, 1083, 1103, 1090, 1086, 1088, 1072, 1050, 1072, 1082, 32, 1095, 1080, 1090, 1072, 1090, 1100, 32, 1089, 1090, 1088, 1086, 1082, 1091, 32, 1080, +32, 1089, 1090, 1086, 1083, 1073, 1077, 1094, 32, 1086, 1096, 1080, 1073, 1082, 1080, 32, 1085, 1072, 32, 1095, 1077, 1090, 1099, 1088, 1105, 1093, 32, 1085, 1072, 1089, 1090, 1086, +1103, 1097, 1080, 1093, 32, 1087, 1088, 1086, 1084, 1072, 1093, 1072, 1093, 46, 1055, 1086, 1074, 1090, 1086, 1088, 1080, 1090, 1077, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, +32, 1082, 1072, 1078, 1076, 1099, 1081, 32, 1080, 1079, 32, 1095, 1077, 1090, 1099, 1088, 1105, 1093, 32, 1087, 1088, 1086, 1084, 1072, 1093, 1086, 1074, 32, 1080, 32, 1089, 1074, +1077, 1088, 1100, 1090, 1077, 32, 1089, 1090, 1088, 1086, 1082, 1091, 32, 1080, 32, 1089, 1090, 1086, 1083, 1073, 1077, 1094, 32, 1089, 32, 1090, 1072, 1073, 1083, 1080, 1094, 1077, +1081, 46, 65, 32, 115, 109, 97, 108, 108, 32, 99, 111, 109, 112, 108, 101, 116, 101, 32, 112, 114, 111, 103, 114, 97, 109, 72, 111, 119, 32, 116, 104, +101, 32, 112, 105, 101, 99, 101, 115, 32, 111, 102, 32, 116, 104, 105, 115, 32, 99, 111, 117, 114, 115, 101, 32, 109, 97, 107, 101, 32, 111, 110, 101, +32, 115, 112, 101, 99, 32, 116, 104, 97, 116, 32, 98, 101, 99, 111, 109, 101, 115, 32, 97, 32, 99, 105, 114, 99, 117, 105, 116, 46, 79, 112, 101, +110, 32, 116, 104, 101, 32, 118, 101, 114, 105, 108, 111, 103, 32, 116, 97, 98, 32, 111, 102, 32, 116, 104, 101, 32, 108, 101, 115, 115, 111, 110, 32, +115, 112, 101, 99, 32, 105, 110, 32, 116, 104, 101, 32, 112, 108, 97, 121, 101, 114, 32, 97, 110, 100, 32, 102, 105, 110, 100, 32, 116, 104, 101, 32, +105, 110, 112, 117, 116, 44, 32, 111, 117, 116, 112, 117, 116, 32, 97, 110, 100, 32, 97, 115, 115, 105, 103, 110, 32, 108, 105, 110, 101, 115, 46, 1052, +1072, 1083, 1077, 1085, 1100, 1082, 1072, 1103, 32, 1079, 1072, 1082, 1086, 1085, 1095, 1077, 1085, 1085, 1072, 1103, 32, 1087, 1088, 1086, 1075, 1088, 1072, 1084, 1084, 1072, 1050, 1072, +1082, 32, 1095, 1072, 1089, 1090, 1080, 32, 1101, 1090, 1086, 1075, 1086, 32, 1082, 1091, 1088, 1089, 1072, 32, 1089, 1082, 1083, 1072, 1076, 1099, 1074, 1072, 1102, 1090, 1089, 1103, +32, 1074, 32, 1086, 1076, 1085, 1091, 32, 1089, 1087, 1077, 1082, 1091, 44, 32, 1082, 1086, 1090, 1086, 1088, 1072, 1103, 32, 1089, 1090, 1072, 1085, 1086, 1074, 1080, 1090, 1089, +1103, 32, 1089, 1093, 1077, 1084, 1086, 1081, 46, 1054, 1090, 1082, 1088, 1086, 1081, 1090, 1077, 32, 1074, 1082, 1083, 1072, 1076, 1082, 1091, 32, 118, 101, 114, 105, 108, 111, +103, 32, 1089, 1087, 1077, 1082, 1080, 32, 1091, 1088, 1086, 1082, 1072, 32, 1074, 32, 1087, 1083, 1077, 1077, 1088, 1077, 32, 1080, 32, 1085, 1072, 1081, 1076, 1080, 1090, 1077, +32, 1089, 1090, 1088, 1086, 1082, 1080, 32, 105, 110, 112, 117, 116, 44, 32, 111, 117, 116, 112, 117, 116, 32, 1080, 32, 97, 115, 115, 105, 103, 110, 46, 87, +104, 101, 114, 101, 32, 116, 111, 32, 103, 111, 32, 110, 101, 120, 116, 87, 104, 105, 99, 104, 32, 99, 111, 117, 114, 115, 101, 32, 116, 111, 32, 116, +97, 107, 101, 32, 110, 101, 120, 116, 44, 32, 97, 110, 100, 32, 119, 104, 97, 116, 32, 101, 97, 99, 104, 32, 111, 110, 101, 32, 97, 100, 100, 115, +32, 116, 111, 32, 116, 104, 101, 32, 98, 97, 115, 105, 99, 115, 46, 80, 105, 99, 107, 32, 116, 104, 101, 32, 110, 101, 120, 116, 32, 99, 111, 117, +114, 115, 101, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 116, 97, 98, 108, 101, 32, 97, 110, 100, 32, 111, 112, 101, 110, 32, 105, 116, 115, 32, +108, 101, 115, 115, 111, 110, 32, 49, 46, 1050, 1091, 1076, 1072, 32, 1076, 1072, 1083, 1100, 1096, 1077, 1050, 1072, 1082, 1086, 1081, 32, 1082, 1091, 1088, 1089, 32, 1087, +1088, 1086, 1081, 1090, 1080, 32, 1076, 1072, 1083, 1100, 1096, 1077, 32, 1080, 32, 1095, 1090, 1086, 32, 1082, 1072, 1078, 1076, 1099, 1081, 32, 1076, 1086, 1073, 1072, 1074, 1083, +1103, 1077, 1090, 32, 1082, 32, 1086, 1089, 1085, 1086, 1074, 1072, 1084, 46, 1042, 1099, 1073, 1077, 1088, 1080, 1090, 1077, 32, 1089, 1083, 1077, 1076, 1091, 1102, 1097, 1080, 1081, +32, 1082, 1091, 1088, 1089, 32, 1087, 1086, 32, 1090, 1072, 1073, 1083, 1080, 1094, 1077, 32, 1080, 32, 1086, 1090, 1082, 1088, 1086, 1081, 1090, 1077, 32, 1077, 1075, 1086, 32, +1091, 1088, 1086, 1082, 32, 49, 46, 119, 104, 97, 116, 45, 97, 45, 115, 112, 101, 99, 45, 105, 115, 116, 104, 101, 45, 109, 111, 100, 117, 108, 101, 45, +108, 105, 110, 101, 99, 111, 109, 109, 101, 110, 116, 115, 45, 97, 110, 100, 45, 112, 114, 111, 115, 101, 99, 111, 110, 115, 116, 97, 110, 116, 115, 119, +104, 111, 108, 101, 45, 110, 117, 109, 98, 101, 114, 115, 116, 114, 117, 101, 45, 102, 97, 108, 115, 101, 45, 97, 110, 100, 45, 116, 101, 120, 116, 97, +114, 114, 97, 121, 115, 116, 114, 105, 116, 115, 101, 120, 112, 114, 101, 115, 115, 105, 111, 110, 115, 97, 45, 116, 101, 115, 116, 45, 98, 108, 111, 99, +107, 109, 97, 110, 121, 45, 116, 101, 115, 116, 115, 102, 117, 110, 99, 116, 105, 111, 110, 115, 108, 111, 99, 97, 108, 45, 110, 97, 109, 101, 115, 105, +102, 45, 97, 110, 100, 45, 101, 108, 115, 101, 108, 111, 111, 112, 115, 112, 117, 98, 45, 111, 114, 45, 112, 114, 105, 118, 97, 116, 101, 115, 116, 114, +117, 99, 116, 115, 101, 110, 117, 109, 115, 117, 115, 101, 45, 111, 116, 104, 101, 114, 45, 109, 111, 100, 117, 108, 101, 115, 105, 110, 118, 97, 114, 105, +97, 110, 116, 115, 103, 101, 110, 45, 116, 115, 115, 101, 118, 101, 110, 45, 98, 97, 99, 107, 101, 110, 100, 115, 115, 116, 97, 103, 101, 115, 45, 111, +102, 45, 116, 50, 55, 99, 116, 114, 105, 45, 99, 111, 109, 109, 97, 110, 100, 115, 114, 101, 97, 100, 105, 110, 103, 45, 101, 114, 114, 111, 114, 115, +97, 45, 115, 109, 97, 108, 108, 45, 112, 114, 111, 103, 114, 97, 109, 119, 104, 101, 114, 101, 45, 110, 101, 120, 116, 116, 50, 55, 32, 98, 97, 115, +105, 99, 115, 58, 32, 116, 104, 101, 32, 108, 97, 110, 103, 117, 97, 103, 101, 32, 105, 110, 32, 50, 55, 32, 108, 101, 115, 115, 111, 110, 115, 76, +101, 115, 115, 111, 110, 32, 123, 48, 125, 32, 111, 102, 32, 123, 49, 125, 1054, 1089, 1085, 1086, 1074, 1099, 32, 116, 50, 55, 58, 32, 1103, 1079, 1099, 1082, +32, 1079, 1072, 32, 50, 55, 32, 1091, 1088, 1086, 1082, 1086, 1074, 1059, 1088, 1086, 1082, 32, 123, 48, 125, 32, 1080, 1079, 32, 123, 49, 125 +]; +pub const ITEM_START : [193]u16 = [ +0, 14, 81, 183, 198, 257, 343, 358, 430, 521, 534, 599, 684, 708, 783, 881, 907, 972, 1068, 1077, 1141, 1205, 1214, 1268, 1335, 1365, 1446, 1519, 1542, 1618, 1708, 1728, +1799, 1871, 1891, 1946, 2015, 2021, 2092, 2169, 2176, 2240, 2328, 2355, 2435, 2500, 2529, 2613, 2686, 2697, 2796, 2872, 2881, 2975, 3045, 3057, 3119, 3190, 3199, 3251, 3315, 3337, 3423, 3496, +3522, 3610, 3693, 3702, 3773, 3858, 3865, 3926, 4011, 4035, 4090, 4179, 4205, 4256, 4345, 4373, 4451, 4520, 4544, 4613, 4675, 4695, 4764, 4852, 4870, 4940, 5024, 5038, 5116, 5189, 5209, 5274, +5339, 5346, 5422, 5492, 5501, 5570, 5654, 5659, 5722, 5795, 5807, 5862, 5939, 5958, 6032, 6109, 6122, 6195, 6256, 6278, 6344, 6455, 6474, 6529, 6626, 6659, 6738, 6818, 6857, 6935, 7011, 7025, +7101, 7182, 7195, 7268, 7343, 7361, 7441, 7529, 7540, 7603, 7680, 7701, 7787, 7862, 7883, 7970, 8057, 8080, 8150, 8240, 8269, 8334, 8418, 8442, 8509, 8607, 8638, 8713, 8799, 8815, 8879, 8937, +8948, 9006, 9063, 9077, 9092, 9110, 9119, 9132, 9151, 9157, 9162, 9173, 9185, 9195, 9204, 9215, 9226, 9231, 9245, 9252, 9257, 9274, 9284, 9290, 9304, 9318, 9330, 9344, 9359, 9369, 9407, 9424, +9453 +]; +pub const ITEM_LEN : [193]u16 = [ +14, 67, 102, 15, 59, 86, 15, 72, 91, 13, 65, 85, 24, 75, 98, 26, 65, 96, 9, 64, 64, 9, 54, 67, 30, 81, 73, 23, 76, 90, 20, 71, +72, 20, 55, 69, 6, 71, 77, 7, 64, 88, 27, 80, 65, 29, 84, 73, 11, 99, 76, 9, 94, 70, 12, 62, 71, 9, 52, 64, 22, 86, 73, 26, +88, 83, 9, 71, 85, 7, 61, 85, 24, 55, 89, 26, 51, 89, 28, 78, 69, 24, 69, 62, 20, 69, 88, 18, 70, 84, 14, 78, 73, 20, 65, 65, +7, 76, 70, 9, 69, 84, 5, 63, 73, 12, 55, 77, 19, 74, 77, 13, 73, 61, 22, 66, 111, 19, 55, 97, 33, 79, 80, 39, 78, 76, 14, 76, +81, 13, 73, 75, 18, 80, 88, 11, 63, 77, 21, 86, 75, 21, 87, 87, 23, 70, 90, 29, 65, 84, 24, 67, 98, 31, 75, 86, 16, 64, 58, 11, +58, 57, 14, 15, 18, 9, 13, 19, 6, 5, 11, 12, 10, 9, 11, 11, 5, 14, 7, 5, 17, 10, 6, 14, 14, 12, 14, 15, 10, 38, 17, 29, +15 +]; +pub const CODE : [6171]u8 = [ +109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 48, 49, 95, 119, 104, 97, 116, 95, 97, 95, 115, 112, 101, 99, 95, 105, 115, 59, +112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 83, 73, 68, 69, 83, 32, 58, 32, 117, 56, 32, 61, 32, 51, 59, 112, 117, 98, 32, 99, 111, 110, +115, 116, 32, 67, 79, 82, 78, 69, 82, 83, 32, 58, 32, 117, 56, 32, 61, 32, 51, 59, 116, 101, 115, 116, 32, 97, 95, 116, 114, 105, 97, 110, +103, 108, 101, 95, 104, 97, 115, 95, 97, 115, 95, 109, 97, 110, 121, 95, 99, 111, 114, 110, 101, 114, 115, 95, 97, 115, 95, 115, 105, 100, 101, 115, +32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 83, 73, 68, 69, 83, 32, 61, 61, 32, 51, 59, 32, 32, 32, 32, 97, 115, 115, 101, +114, 116, 32, 67, 79, 82, 78, 69, 82, 83, 32, 61, 61, 32, 83, 73, 68, 69, 83, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, +99, 115, 95, 48, 50, 95, 116, 104, 101, 95, 109, 111, 100, 117, 108, 101, 95, 108, 105, 110, 101, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, +76, 69, 83, 83, 79, 78, 32, 58, 32, 117, 56, 32, 61, 32, 50, 59, 116, 101, 115, 116, 32, 116, 104, 101, 95, 109, 111, 100, 117, 108, 101, 95, +108, 105, 110, 101, 95, 110, 97, 109, 101, 115, 95, 116, 104, 105, 115, 95, 102, 105, 108, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, +32, 76, 69, 83, 83, 79, 78, 32, 61, 61, 32, 50, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 48, 51, 95, 99, +111, 109, 109, 101, 110, 116, 115, 95, 97, 110, 100, 95, 112, 114, 111, 115, 101, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 80, 82, 79, 83, +69, 95, 78, 69, 69, 68, 83, 95, 87, 79, 82, 68, 83, 32, 58, 32, 98, 111, 111, 108, 32, 61, 32, 116, 114, 117, 101, 59, 32, 47, 47, 32, +97, 32, 116, 114, 97, 105, 108, 105, 110, 103, 32, 99, 111, 109, 109, 101, 110, 116, 116, 101, 115, 116, 32, 99, 111, 109, 109, 101, 110, 116, 115, 95, +99, 104, 97, 110, 103, 101, 95, 110, 111, 116, 104, 105, 110, 103, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 80, 82, 79, 83, 69, +95, 78, 69, 69, 68, 83, 95, 87, 79, 82, 68, 83, 32, 61, 61, 32, 116, 114, 117, 101, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, +105, 99, 115, 95, 48, 52, 95, 99, 111, 110, 115, 116, 97, 110, 116, 115, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 87, 73, 68, 84, 72, +32, 58, 32, 117, 56, 32, 61, 32, 56, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 72, 69, 73, 71, 72, 84, 32, 58, 32, 117, 56, 32, +61, 32, 52, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 65, 82, 69, 65, 32, 58, 32, 117, 56, 32, 61, 32, 51, 50, 59, 116, 101, 115, +116, 32, 97, 114, 101, 97, 95, 105, 115, 95, 119, 105, 100, 116, 104, 95, 116, 105, 109, 101, 115, 95, 104, 101, 105, 103, 104, 116, 32, 123, 32, 32, +32, 32, 97, 115, 115, 101, 114, 116, 32, 87, 73, 68, 84, 72, 32, 42, 32, 72, 69, 73, 71, 72, 84, 32, 61, 61, 32, 65, 82, 69, 65, 59, +125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 48, 53, 95, 119, 104, 111, 108, 101, 95, 110, 117, 109, 98, 101, 114, 115, 59, +112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 66, 89, 84, 69, 95, 77, 65, 88, 32, 58, 32, 117, 56, 32, 61, 32, 50, 53, 53, 59, 112, 117, +98, 32, 99, 111, 110, 115, 116, 32, 87, 79, 82, 68, 95, 77, 65, 88, 32, 58, 32, 117, 49, 54, 32, 61, 32, 54, 53, 53, 51, 53, 59, 112, +117, 98, 32, 99, 111, 110, 115, 116, 32, 83, 77, 65, 76, 76, 95, 78, 69, 71, 32, 58, 32, 105, 51, 50, 32, 61, 32, 45, 53, 59, 116, 101, +115, 116, 32, 119, 105, 100, 101, 114, 95, 116, 121, 112, 101, 115, 95, 104, 111, 108, 100, 95, 109, 111, 114, 101, 32, 123, 32, 32, 32, 32, 97, 115, +115, 101, 114, 116, 32, 87, 79, 82, 68, 95, 77, 65, 88, 32, 62, 32, 66, 89, 84, 69, 95, 77, 65, 88, 59, 32, 32, 32, 32, 97, 115, 115, +101, 114, 116, 32, 66, 89, 84, 69, 95, 77, 65, 88, 32, 61, 61, 32, 50, 53, 53, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 83, +77, 65, 76, 76, 95, 78, 69, 71, 32, 60, 32, 48, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 48, 54, 95, 116, +114, 117, 101, 95, 102, 97, 108, 115, 101, 95, 97, 110, 100, 95, 116, 101, 120, 116, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 82, 69, 65, +68, 89, 32, 58, 32, 98, 111, 111, 108, 32, 61, 32, 116, 114, 117, 101, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 68, 79, 78, 69, 32, +58, 32, 98, 111, 111, 108, 32, 61, 32, 102, 97, 108, 115, 101, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 78, 65, 77, 69, 32, 58, 32, +115, 116, 114, 32, 61, 32, 34, 116, 114, 105, 116, 34, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 78, 79, 84, 95, 65, 95, 67, 79, 77, +77, 69, 78, 84, 32, 58, 32, 115, 116, 114, 32, 61, 32, 34, 59, 32, 97, 110, 100, 32, 47, 47, 32, 105, 110, 115, 105, 100, 101, 32, 113, 117, +111, 116, 101, 115, 32, 97, 114, 101, 32, 116, 101, 120, 116, 34, 59, 116, 101, 115, 116, 32, 98, 111, 111, 108, 115, 95, 97, 110, 100, 95, 116, 101, +120, 116, 95, 99, 111, 109, 112, 97, 114, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 82, 69, 65, 68, 89, 32, 61, 61, 32, +116, 114, 117, 101, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 82, 69, 65, 68, 89, 32, 33, 61, 32, 68, 79, 78, 69, 59, 32, 32, +32, 32, 97, 115, 115, 101, 114, 116, 32, 78, 65, 77, 69, 32, 61, 61, 32, 34, 116, 114, 105, 116, 34, 59, 125, 109, 111, 100, 117, 108, 101, 32, +98, 97, 115, 105, 99, 115, 95, 48, 55, 95, 97, 114, 114, 97, 121, 115, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 80, 82, 73, 77, 69, +83, 32, 58, 32, 91, 53, 93, 117, 56, 32, 61, 32, 91, 50, 44, 32, 51, 44, 32, 53, 44, 32, 55, 44, 32, 49, 49, 93, 59, 112, 117, 98, +32, 99, 111, 110, 115, 116, 32, 68, 73, 71, 73, 84, 83, 32, 58, 32, 91, 51, 93, 115, 116, 114, 32, 61, 32, 91, 34, 122, 101, 114, 111, 34, +44, 32, 34, 111, 110, 101, 34, 44, 32, 34, 116, 119, 111, 34, 93, 59, 116, 101, 115, 116, 32, 105, 110, 100, 101, 120, 101, 115, 95, 115, 116, 97, +114, 116, 95, 97, 116, 95, 122, 101, 114, 111, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 80, 82, 73, 77, 69, 83, 91, 48, 93, +32, 61, 61, 32, 50, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 80, 82, 73, 77, 69, 83, 91, 52, 93, 32, 61, 61, 32, 49, 49, +59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 68, 73, 71, 73, 84, 83, 91, 50, 93, 32, 61, 61, 32, 34, 116, 119, 111, 34, 59, 125, +109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 48, 56, 95, 116, 114, 105, 116, 115, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, +32, 78, 69, 71, 32, 58, 32, 105, 56, 32, 61, 32, 45, 49, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 90, 69, 82, 79, 32, 58, 32, +105, 56, 32, 61, 32, 48, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 80, 79, 83, 32, 58, 32, 105, 56, 32, 61, 32, 49, 59, 112, 117, +98, 32, 99, 111, 110, 115, 116, 32, 86, 65, 76, 85, 69, 83, 95, 80, 69, 82, 95, 84, 82, 73, 84, 32, 58, 32, 117, 56, 32, 61, 32, 51, +59, 116, 101, 115, 116, 32, 111, 112, 112, 111, 115, 105, 116, 101, 95, 116, 114, 105, 116, 115, 95, 99, 97, 110, 99, 101, 108, 32, 123, 32, 32, 32, +32, 97, 115, 115, 101, 114, 116, 32, 80, 79, 83, 32, 43, 32, 78, 69, 71, 32, 61, 61, 32, 90, 69, 82, 79, 59, 32, 32, 32, 32, 97, 115, +115, 101, 114, 116, 32, 78, 69, 71, 32, 60, 32, 90, 69, 82, 79, 59, 125, 116, 101, 115, 116, 32, 116, 104, 114, 101, 101, 95, 116, 114, 105, 116, +115, 95, 103, 105, 118, 101, 95, 50, 55, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 86, 65, 76, 85, 69, 83, 95, 80, 69, 82, +95, 84, 82, 73, 84, 32, 42, 32, 86, 65, 76, 85, 69, 83, 95, 80, 69, 82, 95, 84, 82, 73, 84, 32, 42, 32, 86, 65, 76, 85, 69, 83, +95, 80, 69, 82, 95, 84, 82, 73, 84, 32, 61, 61, 32, 50, 55, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 48, +57, 95, 101, 120, 112, 114, 101, 115, 115, 105, 111, 110, 115, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 65, 32, 58, 32, 117, 56, 32, 61, +32, 49, 55, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 66, 32, 58, 32, 117, 56, 32, 61, 32, 53, 59, 116, 101, 115, 116, 32, 97, 114, +105, 116, 104, 109, 101, 116, 105, 99, 95, 111, 110, 95, 119, 104, 111, 108, 101, 95, 110, 117, 109, 98, 101, 114, 115, 32, 123, 32, 32, 32, 32, 97, +115, 115, 101, 114, 116, 32, 65, 32, 43, 32, 66, 32, 61, 61, 32, 50, 50, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 65, 32, 45, +32, 66, 32, 61, 61, 32, 49, 50, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 65, 32, 42, 32, 66, 32, 61, 61, 32, 56, 53, 59, +32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 65, 32, 47, 32, 66, 32, 61, 61, 32, 51, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, +32, 65, 32, 37, 32, 66, 32, 61, 61, 32, 50, 59, 125, 116, 101, 115, 116, 32, 99, 111, 109, 112, 97, 114, 105, 115, 111, 110, 115, 95, 103, 105, +118, 101, 95, 116, 114, 117, 101, 95, 111, 114, 95, 102, 97, 108, 115, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 65, 32, 62, +32, 66, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 66, 32, 60, 61, 32, 65, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, +65, 32, 33, 61, 32, 66, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 49, 48, 95, 97, 95, 116, 101, 115, 116, 95, +98, 108, 111, 99, 107, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 68, 65, 89, 83, 32, 58, 32, 117, 49, 54, 32, 61, 32, 51, 54, 53, +59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 87, 69, 69, 75, 83, 32, 58, 32, 117, 49, 54, 32, 61, 32, 53, 50, 59, 116, 101, 115, 116, +32, 97, 95, 121, 101, 97, 114, 95, 105, 115, 95, 53, 50, 95, 119, 101, 101, 107, 115, 95, 97, 110, 100, 95, 97, 95, 100, 97, 121, 32, 123, 32, +32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 87, 69, 69, 75, 83, 32, 42, 32, 55, 32, 43, 32, 49, 32, 61, 61, 32, 68, 65, 89, 83, 59, +125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 49, 49, 95, 109, 97, 110, 121, 95, 116, 101, 115, 116, 115, 59, 112, 117, 98, +32, 99, 111, 110, 115, 116, 32, 72, 79, 85, 82, 83, 32, 58, 32, 117, 56, 32, 61, 32, 50, 52, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, +32, 77, 73, 78, 85, 84, 69, 83, 32, 58, 32, 117, 56, 32, 61, 32, 54, 48, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 68, 65, 89, +83, 95, 73, 78, 95, 87, 69, 69, 75, 32, 58, 32, 117, 56, 32, 61, 32, 55, 59, 116, 101, 115, 116, 32, 97, 95, 100, 97, 121, 95, 104, 97, +115, 95, 50, 52, 95, 104, 111, 117, 114, 115, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 72, 79, 85, 82, 83, 32, 61, 61, 32, +50, 52, 59, 125, 116, 101, 115, 116, 32, 97, 110, 95, 104, 111, 117, 114, 95, 104, 97, 115, 95, 54, 48, 95, 109, 105, 110, 117, 116, 101, 115, 32, +123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 77, 73, 78, 85, 84, 69, 83, 32, 61, 61, 32, 54, 48, 59, 32, 32, 32, 32, 97, 115, +115, 101, 114, 116, 32, 77, 73, 78, 85, 84, 69, 83, 32, 62, 32, 72, 79, 85, 82, 83, 59, 125, 116, 101, 115, 116, 32, 97, 95, 119, 101, 101, +107, 95, 104, 97, 115, 95, 55, 95, 100, 97, 121, 115, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 68, 65, 89, 83, 95, 73, 78, +95, 87, 69, 69, 75, 32, 61, 61, 32, 55, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 68, 65, 89, 83, 95, 73, 78, 95, 87, 69, +69, 75, 32, 60, 32, 72, 79, 85, 82, 83, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 49, 50, 95, 102, 117, 110, +99, 116, 105, 111, 110, 115, 59, 112, 117, 98, 32, 102, 110, 32, 97, 100, 100, 40, 97, 58, 32, 117, 56, 44, 32, 98, 58, 32, 117, 56, 41, 32, +45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 32, 43, 32, 98, 59, 125, 112, 117, 98, 32, 102, 110, 32, +116, 119, 105, 99, 101, 40, 97, 58, 32, 117, 56, 41, 32, 117, 56, 32, 123, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 32, 43, 32, +97, 59, 125, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 84, 87, 79, 95, 80, 76, 85, 83, 95, 84, 72, 82, 69, 69, 32, 58, 32, 117, 56, +32, 61, 32, 53, 59, 116, 101, 115, 116, 32, 114, 101, 115, 117, 108, 116, 115, 95, 97, 114, 101, 95, 107, 101, 112, 116, 95, 97, 115, 95, 99, 111, +110, 115, 116, 97, 110, 116, 115, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 84, 87, 79, 95, 80, 76, 85, 83, 95, 84, 72, 82, +69, 69, 32, 61, 61, 32, 50, 32, 43, 32, 51, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 49, 51, 95, 108, 111, +99, 97, 108, 95, 110, 97, 109, 101, 115, 59, 112, 117, 98, 32, 102, 110, 32, 97, 114, 101, 97, 40, 119, 58, 32, 117, 49, 54, 44, 32, 104, 58, +32, 117, 49, 54, 41, 32, 45, 62, 32, 117, 49, 54, 32, 123, 32, 32, 32, 32, 108, 101, 116, 32, 97, 32, 61, 32, 119, 32, 42, 32, 104, 59, +32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 59, 125, 112, 117, 98, 32, 102, 110, 32, 99, 111, 117, 110, 116, 95, 117, 112, 40, 110, 58, +32, 117, 56, 41, 32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 118, 97, 114, 32, 105, 32, 58, 32, 117, 56, 32, 61, 32, 48, 59, 32, +32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 105, 32, 60, 32, 110, 41, 32, 123, 32, 32, 32, 32, 32, 32, 32, 32, 105, 32, 61, 32, 105, 32, +43, 32, 49, 59, 32, 32, 32, 32, 125, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 105, 59, 125, 112, 117, 98, 32, 99, 111, 110, 115, 116, +32, 83, 73, 68, 69, 32, 58, 32, 117, 49, 54, 32, 61, 32, 49, 50, 59, 116, 101, 115, 116, 32, 97, 95, 115, 113, 117, 97, 114, 101, 95, 111, +102, 95, 115, 105, 100, 101, 95, 49, 50, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 83, 73, 68, 69, 32, 42, 32, 83, 73, 68, +69, 32, 61, 61, 32, 49, 52, 52, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 49, 52, 95, 105, 102, 95, 97, 110, +100, 95, 101, 108, 115, 101, 59, 112, 117, 98, 32, 102, 110, 32, 108, 97, 114, 103, 101, 114, 40, 97, 58, 32, 117, 56, 44, 32, 98, 58, 32, 117, +56, 41, 32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 105, 102, 32, 40, 97, 32, 62, 32, 98, 41, 32, 123, 32, 32, 32, 32, 32, 32, +32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 59, 32, 32, 32, 32, 125, 32, 101, 108, 115, 101, 32, 123, 32, 32, 32, 32, 32, 32, 32, 32, 114, +101, 116, 117, 114, 110, 32, 98, 59, 32, 32, 32, 32, 125, 125, 112, 117, 98, 32, 102, 110, 32, 108, 97, 114, 103, 101, 114, 95, 101, 120, 112, 114, +40, 97, 58, 32, 117, 56, 44, 32, 98, 58, 32, 117, 56, 41, 32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, +32, 105, 102, 32, 40, 97, 32, 62, 32, 98, 41, 32, 97, 32, 101, 108, 115, 101, 32, 98, 59, 125, 112, 117, 98, 32, 102, 110, 32, 112, 114, 105, +99, 101, 40, 109, 58, 32, 117, 56, 41, 32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 115, 119, 105, 116, +99, 104, 32, 40, 109, 41, 32, 123, 32, 32, 32, 32, 32, 32, 32, 32, 48, 32, 61, 62, 32, 49, 48, 44, 32, 32, 32, 32, 32, 32, 32, 32, +101, 108, 115, 101, 32, 61, 62, 32, 50, 48, 44, 32, 32, 32, 32, 125, 59, 125, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 76, 73, 77, 73, +84, 32, 58, 32, 117, 56, 32, 61, 32, 49, 48, 59, 116, 101, 115, 116, 32, 116, 104, 101, 95, 108, 105, 109, 105, 116, 95, 105, 115, 95, 116, 101, +110, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 76, 73, 77, 73, 84, 32, 61, 61, 32, 49, 48, 59, 125, 109, 111, 100, 117, 108, +101, 32, 98, 97, 115, 105, 99, 115, 95, 49, 53, 95, 108, 111, 111, 112, 115, 59, 112, 117, 98, 32, 102, 110, 32, 115, 117, 109, 95, 116, 111, 40, +110, 58, 32, 117, 56, 41, 32, 45, 62, 32, 117, 49, 54, 32, 123, 32, 32, 32, 32, 118, 97, 114, 32, 115, 32, 58, 32, 117, 49, 54, 32, 61, +32, 48, 59, 32, 32, 32, 32, 102, 111, 114, 32, 105, 32, 105, 110, 32, 48, 46, 46, 110, 32, 123, 32, 32, 32, 32, 32, 32, 32, 32, 115, 32, +61, 32, 115, 32, 43, 32, 105, 59, 32, 32, 32, 32, 125, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 115, 59, 125, 112, 117, 98, 32, 102, +110, 32, 99, 111, 117, 110, 116, 95, 117, 112, 40, 110, 58, 32, 117, 56, 41, 32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 118, 97, 114, +32, 105, 32, 58, 32, 117, 56, 32, 61, 32, 48, 59, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 105, 32, 60, 32, 110, 41, 32, 123, 32, +32, 32, 32, 32, 32, 32, 32, 105, 32, 61, 32, 105, 32, 43, 32, 49, 59, 32, 32, 32, 32, 125, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, +32, 105, 59, 125, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 83, 85, 77, 95, 66, 69, 76, 79, 87, 95, 53, 32, 58, 32, 117, 49, 54, 32, +61, 32, 49, 48, 59, 116, 101, 115, 116, 32, 122, 101, 114, 111, 95, 116, 111, 95, 102, 111, 117, 114, 95, 97, 100, 100, 95, 117, 112, 95, 116, 111, +95, 116, 101, 110, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 83, 85, 77, 95, 66, 69, 76, 79, 87, 95, 53, 32, 61, 61, 32, +48, 32, 43, 32, 49, 32, 43, 32, 50, 32, 43, 32, 51, 32, 43, 32, 52, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, +95, 49, 54, 95, 112, 117, 98, 95, 111, 114, 95, 112, 114, 105, 118, 97, 116, 101, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 79, 70, 70, +69, 82, 69, 68, 32, 58, 32, 117, 56, 32, 61, 32, 49, 59, 99, 111, 110, 115, 116, 32, 79, 87, 78, 32, 58, 32, 117, 56, 32, 61, 32, 50, +59, 116, 101, 115, 116, 32, 98, 111, 116, 104, 95, 110, 97, 109, 101, 115, 95, 101, 120, 105, 115, 116, 95, 105, 110, 95, 116, 104, 101, 95, 109, 111, +100, 117, 108, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 79, 70, 70, 69, 82, 69, 68, 32, 61, 61, 32, 49, 59, 32, 32, +32, 32, 97, 115, 115, 101, 114, 116, 32, 79, 87, 78, 32, 61, 61, 32, 50, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, +95, 49, 55, 95, 115, 116, 114, 117, 99, 116, 115, 59, 112, 117, 98, 32, 115, 116, 114, 117, 99, 116, 32, 80, 111, 105, 110, 116, 32, 123, 32, 32, +32, 32, 120, 58, 32, 105, 51, 50, 44, 32, 32, 32, 32, 121, 58, 32, 105, 51, 50, 44, 125, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 70, +108, 97, 103, 115, 32, 61, 32, 112, 97, 99, 107, 101, 100, 32, 115, 116, 114, 117, 99, 116, 32, 123, 32, 32, 32, 32, 114, 101, 97, 100, 121, 58, +32, 98, 111, 111, 108, 44, 32, 32, 32, 32, 101, 114, 114, 111, 114, 58, 32, 98, 111, 111, 108, 44, 125, 59, 112, 117, 98, 32, 99, 111, 110, 115, +116, 32, 70, 73, 69, 76, 68, 83, 95, 73, 78, 95, 80, 79, 73, 78, 84, 32, 58, 32, 117, 56, 32, 61, 32, 50, 59, 116, 101, 115, 116, 32, +97, 95, 112, 111, 105, 110, 116, 95, 104, 97, 115, 95, 116, 119, 111, 95, 102, 105, 101, 108, 100, 115, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, +114, 116, 32, 70, 73, 69, 76, 68, 83, 95, 73, 78, 95, 80, 79, 73, 78, 84, 32, 61, 61, 32, 50, 59, 125, 109, 111, 100, 117, 108, 101, 32, +98, 97, 115, 105, 99, 115, 95, 49, 56, 95, 101, 110, 117, 109, 115, 59, 112, 117, 98, 32, 101, 110, 117, 109, 32, 67, 111, 108, 111, 114, 32, 123, +32, 32, 32, 32, 82, 101, 100, 44, 32, 32, 32, 32, 71, 114, 101, 101, 110, 44, 32, 32, 32, 32, 66, 108, 117, 101, 44, 125, 112, 117, 98, 32, +99, 111, 110, 115, 116, 32, 77, 111, 100, 101, 32, 61, 32, 101, 110, 117, 109, 40, 117, 56, 41, 32, 123, 32, 32, 32, 32, 73, 100, 108, 101, 44, +32, 32, 32, 32, 82, 117, 110, 44, 125, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 67, 65, 83, 69, 83, 95, 73, 78, 95, 67, 79, 76, +79, 82, 32, 58, 32, 117, 56, 32, 61, 32, 51, 59, 116, 101, 115, 116, 32, 99, 111, 108, 111, 114, 95, 104, 97, 115, 95, 116, 104, 114, 101, 101, +95, 99, 97, 115, 101, 115, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 67, 65, 83, 69, 83, 95, 73, 78, 95, 67, 79, 76, 79, +82, 32, 61, 61, 32, 51, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 49, 57, 95, 117, 115, 101, 95, 111, 116, 104, +101, 114, 95, 109, 111, 100, 117, 108, 101, 115, 59, 117, 115, 101, 32, 98, 97, 115, 101, 58, 58, 116, 121, 112, 101, 115, 59, 112, 117, 98, 32, 99, +111, 110, 115, 116, 32, 85, 83, 69, 83, 32, 58, 32, 117, 56, 32, 61, 32, 49, 59, 116, 101, 115, 116, 32, 111, 110, 101, 95, 117, 115, 101, 95, +108, 105, 110, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 85, 83, 69, 83, 32, 61, 61, 32, 49, 59, 125, 109, 111, 100, 117, +108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 50, 48, 95, 105, 110, 118, 97, 114, 105, 97, 110, 116, 115, 59, 112, 117, 98, 32, 99, 111, 110, 115, +116, 32, 83, 73, 68, 69, 83, 32, 58, 32, 117, 56, 32, 61, 32, 51, 59, 105, 110, 118, 97, 114, 105, 97, 110, 116, 32, 97, 95, 116, 114, 105, +97, 110, 103, 108, 101, 95, 104, 97, 115, 95, 116, 104, 114, 101, 101, 95, 115, 105, 100, 101, 115, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, +83, 73, 68, 69, 83, 32, 61, 61, 32, 51, 116, 101, 115, 116, 32, 116, 104, 101, 95, 105, 110, 118, 97, 114, 105, 97, 110, 116, 95, 97, 115, 95, +97, 95, 116, 101, 115, 116, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 83, 73, 68, 69, 83, 32, 61, 61, 32, 51, 59, 125, 109, +111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 50, 49, 95, 103, 101, 110, 95, 116, 115, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, +32, 87, 73, 68, 84, 72, 32, 58, 32, 117, 56, 32, 61, 32, 56, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 78, 65, 77, 69, 32, 58, +32, 115, 116, 114, 32, 61, 32, 34, 98, 97, 115, 105, 99, 115, 34, 59, 112, 117, 98, 32, 102, 110, 32, 97, 100, 100, 40, 97, 58, 32, 117, 56, +44, 32, 98, 58, 32, 117, 56, 41, 32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 32, 43, 32, 98, +59, 125, 116, 101, 115, 116, 32, 119, 105, 100, 116, 104, 95, 105, 115, 95, 97, 95, 98, 121, 116, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, +114, 116, 32, 87, 73, 68, 84, 72, 32, 61, 61, 32, 56, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 50, 50, 95, +115, 101, 118, 101, 110, 95, 98, 97, 99, 107, 101, 110, 100, 115, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 87, 73, 68, 84, 72, 32, 58, +32, 117, 56, 32, 61, 32, 56, 59, 112, 117, 98, 32, 102, 110, 32, 97, 100, 100, 40, 97, 58, 32, 117, 56, 44, 32, 98, 58, 32, 117, 56, 41, +32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 32, 43, 32, 98, 59, 125, 116, 101, 115, 116, 32, 119, +105, 100, 116, 104, 95, 105, 115, 95, 97, 95, 98, 121, 116, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 87, 73, 68, 84, 72, +32, 61, 61, 32, 56, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 50, 51, 95, 115, 116, 97, 103, 101, 115, 95, 111, +102, 95, 116, 50, 55, 99, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 87, 73, 68, 84, 72, 32, 58, 32, 117, 56, 32, 61, 32, 56, 59, +112, 117, 98, 32, 102, 110, 32, 97, 100, 100, 40, 97, 58, 32, 117, 56, 44, 32, 98, 58, 32, 117, 56, 41, 32, 45, 62, 32, 117, 56, 32, 123, +32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 32, 43, 32, 98, 59, 125, 116, 101, 115, 116, 32, 119, 105, 100, 116, 104, 95, 105, 115, 95, +97, 95, 98, 121, 116, 101, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 87, 73, 68, 84, 72, 32, 61, 61, 32, 56, 59, 125, 109, +111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 50, 52, 95, 116, 114, 105, 95, 99, 111, 109, 109, 97, 110, 100, 115, 59, 112, 117, 98, +32, 99, 111, 110, 115, 116, 32, 79, 87, 78, 95, 67, 79, 77, 77, 65, 78, 68, 83, 32, 58, 32, 91, 53, 93, 115, 116, 114, 32, 61, 32, 91, +34, 97, 117, 100, 105, 116, 34, 44, 32, 34, 114, 101, 99, 97, 108, 108, 34, 44, 32, 34, 102, 114, 111, 110, 116, 105, 101, 114, 34, 44, 32, 34, +108, 101, 115, 115, 111, 110, 34, 44, 32, 34, 104, 101, 108, 112, 34, 93, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 80, 65, 83, 83, 69, +68, 95, 84, 79, 95, 84, 50, 55, 67, 32, 58, 32, 91, 50, 93, 115, 116, 114, 32, 61, 32, 91, 34, 103, 101, 110, 34, 44, 32, 34, 115, 101, +97, 108, 34, 93, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 84, 69, 83, 84, 95, 82, 85, 78, 83, 32, 58, 32, 115, 116, 114, 32, 61, +32, 34, 116, 50, 55, 99, 32, 115, 117, 105, 116, 101, 32, 45, 45, 114, 101, 112, 111, 45, 114, 111, 111, 116, 32, 46, 34, 59, 116, 101, 115, 116, +32, 116, 114, 105, 95, 116, 101, 115, 116, 95, 114, 117, 110, 115, 95, 116, 104, 101, 95, 115, 117, 105, 116, 101, 32, 123, 32, 32, 32, 32, 97, 115, +115, 101, 114, 116, 32, 84, 69, 83, 84, 95, 82, 85, 78, 83, 32, 61, 61, 32, 34, 116, 50, 55, 99, 32, 115, 117, 105, 116, 101, 32, 45, 45, +114, 101, 112, 111, 45, 114, 111, 111, 116, 32, 46, 34, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 79, 87, 78, 95, 67, 79, 77, 77, +65, 78, 68, 83, 91, 52, 93, 32, 61, 61, 32, 34, 104, 101, 108, 112, 34, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 80, 65, 83, +83, 69, 68, 95, 84, 79, 95, 84, 50, 55, 67, 91, 49, 93, 32, 61, 61, 32, 34, 115, 101, 97, 108, 34, 59, 125, 109, 111, 100, 117, 108, 101, +32, 98, 97, 115, 105, 99, 115, 95, 50, 53, 95, 114, 101, 97, 100, 105, 110, 103, 95, 101, 114, 114, 111, 114, 115, 59, 112, 117, 98, 32, 99, 111, +110, 115, 116, 32, 77, 73, 83, 84, 65, 75, 69, 83, 95, 83, 72, 79, 87, 78, 32, 58, 32, 117, 56, 32, 61, 32, 52, 59, 116, 101, 115, 116, +32, 102, 111, 117, 114, 95, 109, 105, 115, 116, 97, 107, 101, 115, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 77, 73, 83, 84, 65, +75, 69, 83, 95, 83, 72, 79, 87, 78, 32, 61, 61, 32, 52, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 50, 54, +95, 97, 95, 115, 109, 97, 108, 108, 95, 112, 114, 111, 103, 114, 97, 109, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 87, 73, 68, 84, 72, +32, 58, 32, 117, 56, 32, 61, 32, 56, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 65, 95, 69, 88, 65, 77, 80, 76, 69, 32, 58, 32, +117, 56, 32, 61, 32, 49, 48, 48, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 66, 95, 69, 88, 65, 77, 80, 76, 69, 32, 58, 32, 117, +56, 32, 61, 32, 53, 53, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 83, 85, 77, 95, 69, 88, 65, 77, 80, 76, 69, 32, 58, 32, 117, +56, 32, 61, 32, 49, 53, 53, 59, 102, 110, 32, 111, 110, 95, 99, 111, 109, 98, 40, 97, 58, 32, 117, 56, 44, 32, 98, 58, 32, 117, 56, 41, +32, 45, 62, 32, 117, 56, 32, 123, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 97, 32, 43, 32, 98, 59, 125, 116, 101, 115, 116, 32, 116, +104, 101, 95, 101, 120, 97, 109, 112, 108, 101, 95, 115, 117, 109, 95, 102, 105, 116, 115, 95, 105, 110, 95, 97, 95, 98, 121, 116, 101, 32, 123, 32, +32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 65, 95, 69, 88, 65, 77, 80, 76, 69, 32, 43, 32, 66, 95, 69, 88, 65, 77, 80, 76, 69, 32, +61, 61, 32, 83, 85, 77, 95, 69, 88, 65, 77, 80, 76, 69, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 83, 85, 77, 95, 69, 88, +65, 77, 80, 76, 69, 32, 60, 61, 32, 50, 53, 53, 59, 125, 109, 111, 100, 117, 108, 101, 32, 98, 97, 115, 105, 99, 115, 95, 50, 55, 95, 119, +104, 101, 114, 101, 95, 110, 101, 120, 116, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 67, 79, 85, 82, 83, 69, 83, 32, 58, 32, 91, 51, +93, 115, 116, 114, 32, 61, 32, 91, 34, 116, 50, 55, 45, 98, 97, 115, 105, 99, 115, 34, 44, 32, 34, 99, 111, 117, 114, 115, 101, 34, 44, 32, +34, 97, 105, 45, 110, 117, 109, 98, 101, 114, 115, 34, 93, 59, 112, 117, 98, 32, 99, 111, 110, 115, 116, 32, 76, 69, 83, 83, 79, 78, 83, 95, +69, 65, 67, 72, 32, 58, 32, 117, 56, 32, 61, 32, 50, 55, 59, 116, 101, 115, 116, 32, 116, 104, 114, 101, 101, 95, 99, 111, 117, 114, 115, 101, +115, 95, 111, 102, 95, 50, 55, 32, 123, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 67, 79, 85, 82, 83, 69, 83, 91, 48, 93, 32, 61, +61, 32, 34, 116, 50, 55, 45, 98, 97, 115, 105, 99, 115, 34, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, 67, 79, 85, 82, 83, 69, +83, 91, 50, 93, 32, 61, 61, 32, 34, 97, 105, 45, 110, 117, 109, 98, 101, 114, 115, 34, 59, 32, 32, 32, 32, 97, 115, 115, 101, 114, 116, 32, +76, 69, 83, 83, 79, 78, 83, 95, 69, 65, 67, 72, 32, 61, 61, 32, 51, 32, 42, 32, 51, 32, 42, 32, 51, 59, 125 +]; +pub const LINE_START : [273]u16 = [ +0, 32, 57, 84, 130, 152, 180, 181, 214, 240, 278, 301, 302, 338, 402, 432, 469, 470, 497, 522, 548, 573, 606, 640, 641, 672, 702, 735, 766, 794, 825, 852, +877, 878, 915, 945, 975, 1005, 1071, 1100, 1125, 1150, 1176, 1177, 1201, 1245, 1296, 1324, 1350, 1377, 1407, 1408, 1431, 1455, 1479, 1502, 1537, 1565, 1594, 1616, 1617, 1643, 1712, 1713, +1742, 1764, 1785, 1819, 1842, 1865, 1888, 1910, 1932, 1933, 1970, 1987, 2005, 2023, 2024, 2054, 2081, 2108, 2143, 2176, 2177, 2205, 2231, 2259, 2291, 2316, 2339, 2340, 2369, 2394, 2421, 2422, +2446, 2475, 2507, 2508, 2535, 2567, 2584, 2585, 2609, 2626, 2627, 2661, 2697, 2732, 2733, 2762, 2798, 2816, 2829, 2830, 2860, 2879, 2898, 2916, 2921, 2934, 2935, 2961, 2987, 3017, 3018, 3047, +3082, 3098, 3115, 3127, 3144, 3149, 3150, 3190, 3221, 3222, 3249, 3272, 3288, 3307, 3313, 3314, 3340, 3363, 3386, 3387, 3410, 3439, 3459, 3478, 3496, 3501, 3514, 3515, 3545, 3564, 3583, 3601, +3606, 3619, 3620, 3653, 3686, 3730, 3731, 3763, 3790, 3809, 3846, 3870, 3890, 3891, 3916, 3934, 3945, 3956, 3957, 3990, 4006, 4022, 4024, 4059, 4088, 4120, 4121, 4144, 4160, 4168, 4178, 4187, +4188, 4215, 4224, 4232, 4234, 4268, 4296, 4327, 4328, 4363, 4379, 4403, 4422, 4443, 4444, 4472, 4497, 4533, 4554, 4584, 4606, 4607, 4631, 4656, 4688, 4720, 4737, 4738, 4760, 4782, 4783, 4815, +4840, 4872, 4889, 4890, 4912, 4934, 4935, 4967, 4992, 5024, 5041, 5042, 5064, 5086, 5087, 5117, 5201, 5253, 5308, 5338, 5389, 5426, 5465, 5466, 5498, 5532, 5552, 5583, 5584, 5617, 5642, 5673, +5703, 5736, 5768, 5785, 5786, 5823, 5871, 5901, 5902, 5930, 5998, 6031, 6057, 6095, 6133, 6170, 6171 +]; +pub const TOPIC_LINE0 : [28]u16 = [ +0, 7, 12, 17, 24, 33, 43, 51, 63, 78, 84, 99, 110, 126, 147, 166, 173, 186, 200, 206, 213, 222, 230, 238, 247, 252, 264, 272 +]; + +// Where text item i is in TEXT_CP, and how long it is. +pub fn item(t: usize, lang: usize, f: usize) -> usize { + return (t * LANGS + lang) * FIELDS + f; +} +pub fn id_item(t: usize) -> usize { + return ID_ITEM0 + t; +} +pub fn course_title_item(lang: usize) -> usize { + return COURSE_ITEM0 + lang * 2; +} +pub fn lesson_of_item(lang: usize) -> usize { + return COURSE_ITEM0 + lang * 2 + 1; +} +pub fn item_len(i: usize) -> usize { + return @as(usize, ITEM_LEN[i]); +} +// Code point k of item i. +pub fn cp(i: usize, k: usize) -> u32 { + return @as(u32, TEXT_CP[@as(usize, ITEM_START[i]) + k]); +} + +// The code of lesson t: its first line and how many lines it has, and byte k of line l. +pub fn code_line0(t: usize) -> usize { + return @as(usize, TOPIC_LINE0[t]); +} +pub fn code_lines(t: usize) -> usize { + return @as(usize, TOPIC_LINE0[t + 1]) - @as(usize, TOPIC_LINE0[t]); +} +pub fn line_len(l: usize) -> usize { + return @as(usize, LINE_START[l + 1]) - @as(usize, LINE_START[l]); +} +pub fn code_byte(l: usize, k: usize) -> u8 { + return CODE[@as(usize, LINE_START[l]) + k]; +} +// The lesson's number in its course, 1-based, and its module on the course map, 0-based. +pub fn lesson_n(t: usize) -> usize { + return t + 1; +} +pub fn module_of(t: usize) -> usize { + return t / MODULE_LESSONS; +} + +// A letter the reel fonts draw: printable ASCII, or the Cyrillic block A..ya plus yo. +fn drawable(c: u32) -> bool { + return (c >= 32 && c <= 126) || (c >= 1040 && c <= 1105); +} +fn spells(i: usize, k: usize, c0: u32, c1: u32, c2: u32) -> bool { + return cp(i, k) == c0 && cp(i, k + 1) == c1 && cp(i, k + 2) == c2; +} + +test "the item table tiles TEXT_CP with no gap and no overlap" { + var i : usize = 0; + while (i + 1 < ITEMS) { + assert(@as(usize, ITEM_START[i]) + item_len(i) == @as(usize, ITEM_START[i + 1])); + i = i + 1; + } + assert(@as(usize, ITEM_START[ITEMS - 1]) + item_len(ITEMS - 1) == TEXT_CPS); + assert(ITEM_START[0] == 0); + assert(COURSE_ITEM0 + 4 == ITEMS); + assert(ID_ITEM0 == TOPICS * LANGS * FIELDS); + assert(COURSE_ITEM0 == ID_ITEM0 + TOPICS); +} + +test "every lesson has a title, a goal and a task in both languages" { + var t : usize = 0; + while (t < TOPICS) { + var lang : usize = 0; + while (lang < LANGS) { + assert(item_len(item(t, lang, 0)) >= 4); + assert(item_len(item(t, lang, 1)) >= 20); + assert(item_len(item(t, lang, 2)) >= 20); + lang = lang + 1; + } + assert(item_len(id_item(t)) >= 4); + t = t + 1; + } +} + +test "every code point is one the reel fonts draw" { + var k : usize = 0; + while (k < TEXT_CPS) { + assert(drawable(@as(u32, TEXT_CP[k]))); + k = k + 1; + } + var b : usize = 0; + while (b < CODE_BYTES) { + assert(CODE[b] >= 32 && CODE[b] <= 126); + b = b + 1; + } +} + +test "the Russian items are Russian and the English ones are not" { + // RU title of lesson 0 opens with Che (1063); EN title opens with W (87). + assert(cp(item(0, 1, 0), 0) == 1063); + assert(cp(item(0, 0, 0), 0) == 87); + var t : usize = 0; + while (t < TOPICS) { + var cyr : usize = 0; + var k : usize = 0; + const ru = item(t, 1, 1); + while (k < item_len(ru)) { + if (cp(ru, k) >= 1040) { + cyr = cyr + 1; + } + k = k + 1; + } + assert(cyr * 2 > item_len(ru)); + var j : usize = 0; + const en = item(t, 0, 1); + while (j < item_len(en)) { + assert(cp(en, j) < 128); + j = j + 1; + } + t = t + 1; + } +} + +test "the course strings carry the two holes the generator fills" { + // "Lesson {0} of {1}" and its Russian; '{' is 123, '0' is 48, '}' is 125. + var lang : usize = 0; + while (lang < LANGS) { + const i = lesson_of_item(lang); + var holes : usize = 0; + var k : usize = 0; + while (k + 2 < item_len(i)) { + if (cp(i, k) == 123 && cp(i, k + 2) == 125) { + holes = holes + 1; + } + k = k + 1; + } + assert(holes == 2); + assert(item_len(course_title_item(lang)) > 20); + lang = lang + 1; + } +} + +test "the code table tiles CODE, and every lesson's code opens with its module line" { + assert(LINE_START[0] == 0); + assert(@as(usize, LINE_START[CODE_LINES]) == CODE_BYTES); + assert(TOPIC_LINE0[0] == 0); + assert(@as(usize, TOPIC_LINE0[TOPICS]) == CODE_LINES); + var t : usize = 0; + while (t < TOPICS) { + assert(code_lines(t) >= 3); + const l = code_line0(t); + // "module basics_" + assert(code_byte(l, 0) == 109 && code_byte(l, 1) == 111 && code_byte(l, 6) == 32); + assert(code_byte(l, 7) == 98 && code_byte(l, 13) == 95); + t = t + 1; + } + var l : usize = 0; + while (l < CODE_LINES) { + assert(line_len(l) >= 1 && line_len(l) <= 84); + l = l + 1; + } +} + +test "lesson 0 is What a spec is, and its id is its page" { + // "Wha", "spe" in the title; the id what-a-spec-is is 14 letters. + assert(spells(item(0, 0, 0), 0, 87, 104, 97)); + assert(spells(item(0, 0, 0), 7, 115, 112, 101)); + assert(item_len(id_item(0)) == 14); + assert(cp(id_item(0), 4) == 45); + assert(lesson_n(26) == 27); + assert(module_of(26) == 8); + assert(module_of(3) == 1); +} diff --git a/specs/t27f/token_floor_mux.t27 b/specs/t27f/token_floor_mux.t27 index a5c6f80852..cdcb184870 100644 --- a/specs/t27f/token_floor_mux.t27 +++ b/specs/t27f/token_floor_mux.t27 @@ -139,7 +139,7 @@ fn tone8(k: usize) -> u32 { return @as(u32, @intFromFloat(v)); } -fn print_col(row: usize) -> void { +pub fn print_col(row: usize) -> void { std.debug.print("0x{X:0>2}{X:0>2}{X:0>2}", .{ tone8(3 * row), tone8(3 * row + 1), tone8(3 * row + 2) }); } @@ -222,7 +222,7 @@ fn caption_font(k: usize) -> str { // The v1 size rule, narrowed to the frame's band less the border on both sides, at the mono // face's advance. -fn band_font(o: usize, chars: i32) -> i32 { +pub fn band_font(o: usize, chars: i32) -> i32 { const room_px : i32 = @divTrunc((band_w(o) - 2 * CAPTION_BORDER_PX) * 1000, chars * MONO_ADVANCE_PERMILLE); const v1 = font_size(chars); if (room_px < v1) { @@ -327,12 +327,12 @@ fn print_ramp(c: usize) -> void { } // the text's top: its place below the card's top, plus card_drop -fn print_rise(o: usize, c: usize, dy: f64) -> void { +pub fn print_rise(o: usize, c: usize, dy: f64) -> void { std.debug.print(":y='{d:.1}+{d:.1}*(1+{d:.1}*max(0,(n-{d})/{d}))*exp(-{d:.1}*max(0,(n-{d})/{d}))", .{ card_f(o, 1) + dy, CARD_RISE, CARD_W, CARD_ON[2 * c], FPS, CARD_W, CARD_ON[2 * c], FPS }); } // the smootherstep of the ramp, as card_opacity has it, and the frames the card is up -fn print_fade(c: usize) -> void { +pub fn print_fade(c: usize) -> void { std.debug.print(":alpha='pow(", .{}); print_ramp(c); std.debug.print(",3)*(", .{});