├── ld ├── .gitkeep ├── osc_api.syms ├── userosc.ld └── rules.ld ├── magicforest.ntkdigunit ├── project.mk ├── manifest.json ├── README.md ├── LICENSE ├── notemap.h ├── mforest.hpp ├── tpl └── _unit.c ├── Makefile ├── mforest.cpp └── samplebank.h /ld/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /magicforest.ntkdigunit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ulmert/magicforest/HEAD/magicforest.ntkdigunit -------------------------------------------------------------------------------- /project.mk: -------------------------------------------------------------------------------- 1 | # ############################################################################# 2 | # Project Customization 3 | # ############################################################################# 4 | 5 | PROJECT = magicforest 6 | 7 | UCSRC = 8 | 9 | UCXXSRC = mforest.cpp 10 | 11 | UINCDIR = 12 | 13 | UDEFS = 14 | 15 | ULIB = 16 | 17 | ULIBDIR = 18 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "header" : 3 | { 4 | "platform" : "nutekt-digital", 5 | "module" : "osc", 6 | "api" : "1.1-0", 7 | "dev_id" : 0, 8 | "prg_id" : 0, 9 | "version" : "1.0-0", 10 | "name" : "Magic Forest", 11 | "num_param" : 2, 12 | "params" : [ 13 | ["ATune", 0, 99, ""], 14 | ["BTune", 0, 99, ""] 15 | ] 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Magic forest 2 | Magic forest is a custom oscillator for the **Korg Nu:Tekt NTS-1** capable of generating a true lo-fi forest experience, sprinkled with pan flute and claves. 3 | 4 | ## Usage 5 | A + B encoders are used to control the volume for pan flute + claves and ambience. 6 | Accessing the oscillator parameters, each group can also be tuned individually. 7 | 8 | Use latched arpeggiator (with a longer pattern length) for instant ambience - EG should be set to **Open** mode. 9 | 10 | Upload [magicforest.ntkdigunit](magicforest.ntkdigunit) using the NTS-1 digital Librarian application. 11 | 12 | A short demonstration can be viewed here: 13 | 14 | [![](http://img.youtube.com/vi/YXMqoM_sRjw/0.jpg)](http://www.youtube.com/watch?v=YXMqoM_sRjw) 15 | -------------------------------------------------------------------------------- /ld/osc_api.syms: -------------------------------------------------------------------------------- 1 | k_osc_api_version = 0x0800f000; 2 | k_osc_api_platform = 0x0800f004; 3 | midi_to_hz_lut_f = 0x0800f100; 4 | sqrtm2log_lut_f = 0x0800f360; 5 | tanpi_lut_f = 0x0800f764; 6 | log_lut_f = 0x0800fb68; 7 | bitres_lut_f = 0x0800ff6c; 8 | wt_par_lut_f = 0x08010170; 9 | wt_par_notes = 0x08010f8c; 10 | wt_sqr_lut_f = 0x08010f94; 11 | wt_sqr_notes = 0x08011db0; 12 | wt_saw_lut_f = 0x08011db8; 13 | wt_saw_notes = 0x08012bd4; 14 | wt_sine_lut_f = 0x08012bdc; 15 | schetzen_lut_f = 0x08012de0; 16 | cubicsat_lut_f = 0x08012fe4; 17 | wavesA = 0x080131e8; 18 | wavesB = 0x0801546c; 19 | wavesC = 0x080174ec; 20 | wavesD = 0x0801915c; 21 | wavesE = 0x0801abc4; 22 | wavesF = 0x0801ca3c; 23 | _osc_mcu_hash = 0x0801eabc; 24 | _osc_bl_saw_idx = 0x0801eac8; 25 | _osc_bl_sqr_idx = 0x0801ebb0; 26 | _osc_bl_par_idx = 0x0801ec98; 27 | _osc_rand = 0x0801ed80; 28 | _osc_white = 0x0801edb8; 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2022, Jacob Ulmert 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /ld/userosc.ld: -------------------------------------------------------------------------------- 1 | /* 2 | BSD 3-Clause License 3 | 4 | Copyright (c) 2018, KORG INC. 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions are met: 9 | 10 | * Redistributions of source code must retain the above copyright notice, this 11 | list of conditions and the following disclaimer. 12 | 13 | * Redistributions in binary form must reproduce the above copyright notice, 14 | this list of conditions and the following disclaimer in the documentation 15 | and/or other materials provided with the distribution. 16 | 17 | * Neither the name of the copyright holder nor the names of its 18 | contributors may be used to endorse or promote products derived from 19 | this software without specific prior written permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 25 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | 32 | //*/ 33 | 34 | /* 35 | * File: userosc.ld 36 | * 37 | * Linker Script for user oscillators 38 | */ 39 | 40 | /* Entry Point */ 41 | ENTRY(_entry) 42 | 43 | /* Specify the memory areas */ 44 | MEMORY 45 | { 46 | SRAM (rx) : org = 0x20000000, len = 32K 47 | } 48 | 49 | /* Include Rules */ 50 | INCLUDE rules.ld 51 | -------------------------------------------------------------------------------- /notemap.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | static const uint16_t notemap[256] = { 4 | 0x01, 5 | 0x01, 6 | 0x01, 7 | 0x01, 8 | 0x01, 9 | 0x01, 10 | 0x01, 11 | 0x01, 12 | 0x01, 13 | 0x01, 14 | 0x01, 15 | 0x01, 16 | 17 | 0x01, 18 | 0x01, 19 | 0x01, 20 | 0x01, 21 | 0x01, 22 | 0x01, 23 | 0x01, 24 | 0x01, 25 | 0x01, 26 | 0x01, 27 | 0x01, 28 | 0x01, 29 | 30 | 0x01, 31 | 0x01, 32 | 0x01, 33 | 0x01, 34 | 0x01, 35 | 0x01, 36 | 0x01, 37 | 0x01, 38 | 0x01, 39 | 0x01, 40 | 0x01, 41 | 0x01, 42 | 43 | 0x01, 44 | 0x01, 45 | 0x01, 46 | 0x01, 47 | 0x01, 48 | 0x01, 49 | 0x01, 50 | 0x01, 51 | 0x01, 52 | 0b0000000001000000, 53 | 0x00, 54 | 0x00, 55 | 56 | 0x01 | 0b0000000000010010, 57 | 0x01 | 0b0000000000011001, 58 | 0x01 | 0b0000000000010001, 59 | 0x01 | 0b0000000001011000, 60 | 0x01 | 0b0000000000010010, 61 | 0x01 | 0b0000000001010000, 62 | 0x02 | 0b0000000000010100, 63 | 0x02 | 0b0000000000010001, 64 | 0x08 | 0b0000000001011000, 65 | 0x08 | 0b0000000000010100, 66 | 0x08 | 0b0000000001010000, 67 | 0x08 | 0b0000000000010000, 68 | 69 | 0x01 | 0b0000000000010010, 70 | 0x01 | 0b0000000000010001, 71 | 0x01 | 0b0000000001010000, 72 | 0x01 | 0b0000000000010000, 73 | 0x01 | 0b0000000000010000, 74 | 0x01 | 0b0000000000010010, 75 | 0x02 | 0b0000000000010100, 76 | 0x02 | 0b0000000000010000, 77 | 0x08 | 0b0000000001000000, 78 | 0x08 | 0b0000000001000000, 79 | 0x08 | 0b0000000001000000, 80 | 0x08 | 0b0000000001000000, 81 | 82 | 0b0000000000010000, 83 | 0b0000000000010000, 84 | 0b0000000000010000, 85 | 0b0000000000010000, 86 | 0b0000000000010000, 87 | 0b0000000000010000, 88 | 0b0000000000010000, 89 | 0b0000000000010000, 90 | 0b0000000000010000, 91 | 0b0000000000010000, 92 | 0b0000000000010000, 93 | 0b0000000000010000, 94 | 95 | 0x00, 96 | 0x00, 97 | 0x00, 98 | 0x00, 99 | 0x00, 100 | 0x00, 101 | 0x00, 102 | 0x00, 103 | 0x00, 104 | 0x00, 105 | 0x00, 106 | 0x00, 107 | 108 | 0x00, 109 | 0x00, 110 | 0x00, 111 | 0x00, 112 | 0x00, 113 | 0x00, 114 | 0x00, 115 | 0x00, 116 | 0x00, 117 | 0x00, 118 | 0x00, 119 | 0x00, 120 | 121 | 0x00, 122 | 0x00, 123 | 0x00, 124 | 0x00, 125 | 0x00, 126 | 0x00, 127 | 0x00, 128 | 0x00, 129 | 0x00, 130 | 0x00, 131 | 0x00, 132 | 0x00, 133 | 134 | 0x00, 135 | 0x00, 136 | 0x00, 137 | 0x00, 138 | 0x00, 139 | 0x00, 140 | 0x00, 141 | 0x00, 142 | 0x00, 143 | 0x00, 144 | 0x00, 145 | 0x00 146 | }; -------------------------------------------------------------------------------- /mforest.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | /* 3 | BSD 3-Clause License 4 | 5 | Copyright (c) 2022, Jacob Ulmert 6 | All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without 9 | modification, are permitted provided that the following conditions are met: 10 | 11 | * Redistributions of source code must retain the above copyright notice, this 12 | list of conditions and the following disclaimer. 13 | 14 | * Redistributions in binary form must reproduce the above copyright notice, 15 | this list of conditions and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | * Neither the name of the copyright holder nor the names of its 19 | contributors may be used to endorse or promote products derived from 20 | this software without specific prior written permission. 21 | 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 23 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 25 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 26 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 28 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 29 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | */ 33 | 34 | /* 35 | * File: mforest.hpp 36 | * 37 | * Sample player 38 | * 39 | */ 40 | 41 | #include "userosc.h" 42 | #include "fx_api.h" 43 | #include "biquad.hpp" 44 | 45 | #define MAX_VOICES 5 46 | 47 | struct MForest { 48 | 49 | struct Params { 50 | float tuneGroup_a; 51 | float tuneGroup_b; 52 | 53 | float gainGroup_a; 54 | float gainGroup_b; 55 | 56 | Params(void) : 57 | tuneGroup_a(1.0), 58 | tuneGroup_b(1.0), 59 | gainGroup_a(1.0), 60 | gainGroup_b(1.0) 61 | { 62 | } 63 | }; 64 | 65 | 66 | struct Voice { 67 | float sampleIdx; 68 | float sampleIdxStart; 69 | 70 | float sampleStep; 71 | float sampleLoopIdx; 72 | 73 | uint16_t sampleLen; 74 | uint16_t sampleIdxEnd; 75 | 76 | uint16_t sampleCnt; 77 | uint16_t decayDur; 78 | uint16_t sampleInc; 79 | 80 | float repeatGainDec; 81 | 82 | float gain; 83 | 84 | float *gainGroup; 85 | float *tuneGroup; 86 | 87 | uint8_t repeat; 88 | float repeatDur; 89 | 90 | float LFOenv; 91 | 92 | bool isPlaying; 93 | 94 | bool loopInf; 95 | 96 | uint32_t delayedTrigTimer; 97 | 98 | dsp::BiQuad hpf; 99 | 100 | Voice(void) : 101 | isPlaying(false), loopInf(false), delayedTrigTimer(0) 102 | { 103 | } 104 | }; 105 | 106 | #define TRIGSAMPLE_NONE 0 107 | #define TRIGSAMPLE_NOTEON 1 108 | #define TRIGSAMPLE_RANDOM (1 << 1) 109 | 110 | struct State { 111 | uint8_t trigSample; 112 | 113 | float droneLFOenv; 114 | 115 | State(void) : 116 | trigSample(TRIGSAMPLE_NONE), droneLFOenv(0) 117 | { 118 | } 119 | }; 120 | 121 | MForest(void) { 122 | init(); 123 | } 124 | 125 | void init(void) { 126 | state = State(); 127 | params = Params(); 128 | 129 | uint8_t i = MAX_VOICES; 130 | while(i != 0) { 131 | i--; 132 | voices[i] = Voice(); 133 | } 134 | 135 | voices[0].gainGroup = ¶ms.gainGroup_a; 136 | voices[1].gainGroup = ¶ms.gainGroup_a; 137 | voices[2].gainGroup = ¶ms.gainGroup_b; 138 | voices[3].gainGroup = ¶ms.gainGroup_a; 139 | voices[4].gainGroup = ¶ms.gainGroup_b; 140 | 141 | voices[0].tuneGroup = ¶ms.tuneGroup_a; 142 | voices[1].tuneGroup = ¶ms.tuneGroup_a; 143 | voices[2].tuneGroup = ¶ms.tuneGroup_b; 144 | voices[3].tuneGroup = ¶ms.tuneGroup_a; 145 | voices[4].tuneGroup = ¶ms.tuneGroup_b; 146 | } 147 | 148 | State state; 149 | Params params; 150 | Voice voices[MAX_VOICES]; 151 | 152 | }; 153 | -------------------------------------------------------------------------------- /ld/rules.ld: -------------------------------------------------------------------------------- 1 | /* 2 | BSD 3-Clause License 3 | 4 | Copyright (c) 2018, KORG INC. 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions are met: 9 | 10 | * Redistributions of source code must retain the above copyright notice, this 11 | list of conditions and the following disclaimer. 12 | 13 | * Redistributions in binary form must reproduce the above copyright notice, 14 | this list of conditions and the following disclaimer in the documentation 15 | and/or other materials provided with the distribution. 16 | 17 | * Neither the name of the copyright holder nor the names of its 18 | contributors may be used to endorse or promote products derived from 19 | this software without specific prior written permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 25 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | 32 | //*/ 33 | 34 | /* 35 | * File: rules.ld 36 | * 37 | * Linker Rules 38 | */ 39 | 40 | /* ----------------------------------------------------------------------------- */ 41 | /* Define output sections */ 42 | 43 | SECTIONS 44 | { 45 | 46 | .hooks : ALIGN(16) SUBALIGN(16) 47 | { 48 | . = ALIGN(4); 49 | _hooks_start = .; 50 | KEEP(*(.hooks)) 51 | . = ALIGN(4); 52 | _hooks_end = .; 53 | } > SRAM 54 | 55 | /* Constructors */ 56 | .init_array : ALIGN(4) SUBALIGN(4) 57 | { 58 | . = ALIGN(4); 59 | PROVIDE(__init_array_start = .); 60 | KEEP(*(SORT(.init_array.*))) 61 | KEEP(*(.init_array*)) 62 | . = ALIGN(4); 63 | PROVIDE(__init_array_end = .); 64 | } > SRAM 65 | 66 | /* Common Code */ 67 | .text : ALIGN(4) SUBALIGN(4) 68 | { 69 | . = ALIGN(4); 70 | _text_start = .; 71 | *(.text) 72 | *(.text.*) 73 | *(.glue_7) /* glue arm to thumb code */ 74 | *(.glue_7t) /* glue thumb to arm code */ 75 | *(.gcc*) 76 | . = ALIGN(4); 77 | _text_end = .; 78 | } > SRAM 79 | 80 | /* Constants and strings */ 81 | .rodata : ALIGN(4) SUBALIGN(4) 82 | { 83 | . = ALIGN(4); 84 | _rodata_start = .; 85 | *(.rodata) 86 | *(.rodata.*) 87 | . = ALIGN(4); 88 | _rodata_end = .; 89 | } > SRAM 90 | 91 | /* Read-write data */ 92 | .data ALIGN(8) : ALIGN(8) SUBALIGN(8) 93 | { 94 | . = ALIGN(8); 95 | _data_start = .; 96 | *(.data) 97 | *(.data.*) 98 | . = ALIGN(8); 99 | _data_end = .; 100 | } > SRAM 101 | 102 | /* Uninitialized variables */ 103 | .bss (NOLOAD) : ALIGN(4) 104 | { 105 | . = ALIGN(4); 106 | _bss_start = .; 107 | *(.bss) 108 | *(.bss.*) 109 | *(COMMON) 110 | . = ALIGN(4); 111 | _bss_end = .; 112 | } > SRAM 113 | 114 | /* Exception sections */ 115 | .ARM.extab : ALIGN(4) SUBALIGN(4) 116 | { 117 | . = ALIGN(4); 118 | __extab_start = .; 119 | *(.ARM.extab* .gnu.linkonce.armextab.*) 120 | . = ALIGN(4); 121 | __extab_end = .; 122 | } > SRAM 123 | 124 | .ARM.exidx : ALIGN(4) SUBALIGN(4) 125 | { /* Note: Aligning when there's no content for this section throws a warning. Looks like a linker bug. */ 126 | /* . = ALIGN(4); */ 127 | __exidx_start = .; 128 | *(.ARM.exidx* .gnu.linkonce.armexidx.*) 129 | /* . = ALIGN(4); */ 130 | __exidx_end = .; 131 | } > SRAM 132 | 133 | .eh_frame_hdr : ALIGN(4) SUBALIGN(4) 134 | { 135 | . = ALIGN(4); 136 | _eh_frame_hdr_start = .; 137 | *(.eh_frame_hdr) 138 | . = ALIGN(4); 139 | _eh_frame_hdr_end = .; 140 | } > SRAM 141 | 142 | .eh_frame : ALIGN(4) SUBALIGN(4) ONLY_IF_RO 143 | { 144 | . = ALIGN(4); 145 | _eh_frame_start = .; 146 | *(.eh_frame) 147 | . = ALIGN(4); 148 | _eh_frame_end = .; 149 | } > SRAM 150 | 151 | /* 152 | /DISCARD/ 153 | { 154 | libc.a ( * ) 155 | libm.a ( * ) 156 | libgcc.a ( * ) 157 | } 158 | //*/ 159 | 160 | /* .ARM.attributes 0 : { *(.ARM.attributes) } //*/ 161 | } 162 | -------------------------------------------------------------------------------- /tpl/_unit.c: -------------------------------------------------------------------------------- 1 | /* 2 | BSD 3-Clause License 3 | 4 | Copyright (c) 2018, KORG INC. 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions are met: 9 | 10 | * Redistributions of source code must retain the above copyright notice, this 11 | list of conditions and the following disclaimer. 12 | 13 | * Redistributions in binary form must reproduce the above copyright notice, 14 | this list of conditions and the following disclaimer in the documentation 15 | and/or other materials provided with the distribution. 16 | 17 | * Neither the name of the copyright holder nor the names of its 18 | contributors may be used to endorse or promote products derived from 19 | this software without specific prior written permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 25 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | 32 | //*/ 33 | 34 | /** 35 | * @file _unit.c 36 | * @brief Oscillator entry template. 37 | * 38 | * @addtogroup api 39 | * @{ 40 | */ 41 | 42 | #include "userosc.h" 43 | 44 | /*===========================================================================*/ 45 | /* Externs and Types. */ 46 | /*===========================================================================*/ 47 | 48 | /** 49 | * @name Externs and Types. 50 | * @{ 51 | */ 52 | 53 | extern uint8_t _bss_start; 54 | extern uint8_t _bss_end; 55 | 56 | extern void (*__init_array_start []) (void); 57 | extern void (*__init_array_end []) (void); 58 | 59 | typedef void (*__init_fptr)(void); 60 | 61 | /** @} */ 62 | 63 | /*===========================================================================*/ 64 | /* Locals Constants and Vars. */ 65 | /*===========================================================================*/ 66 | 67 | /** 68 | * @name Local Constants and Vars. 69 | * @{ 70 | */ 71 | 72 | __attribute__((used, section(".hooks"))) 73 | static const user_osc_hook_table_t s_hook_table = { 74 | .magic = {'U','O','S','C'}, 75 | .api = USER_API_VERSION, 76 | .platform = USER_TARGET_PLATFORM>>8, 77 | .reserved0 = {0}, 78 | .func_entry = _entry, 79 | .func_cycle = _hook_cycle, 80 | .func_on = _hook_on, 81 | .func_off = _hook_off, 82 | .func_mute = _hook_mute, 83 | .func_value = _hook_value, 84 | .func_param = _hook_param, 85 | .reserved1 = {0} 86 | }; 87 | 88 | /** @} */ 89 | 90 | /*===========================================================================*/ 91 | /* Default Hooks. */ 92 | /*===========================================================================*/ 93 | 94 | /** 95 | * @name Default Hooks. 96 | * @{ 97 | */ 98 | 99 | __attribute__((used)) 100 | void _entry(uint32_t platform, uint32_t api) 101 | { 102 | // Ensure zero-clear BSS segment 103 | uint8_t * __restrict bss_p = (uint8_t *)&_bss_start; 104 | const uint8_t * const bss_e = (uint8_t *)&_bss_end; 105 | 106 | for (; bss_p != bss_e;) 107 | *(bss_p++) = 0; 108 | 109 | // Call constructors if any. 110 | const size_t count = __init_array_end - __init_array_start; 111 | for (size_t i = 0; i $@ 213 | @echo 214 | @$(SZ) $< 215 | @echo 216 | 217 | %.list: %.elf 218 | @echo Creating $@ 219 | @$(OD) -S $< > $@ 220 | 221 | clean: 222 | @echo Cleaning 223 | -rm -fR .dep $(BUILDDIR) $(PKGARCH) 224 | @echo 225 | @echo Done 226 | 227 | package: 228 | @echo Packaging to ./$(PKGARCH) 229 | @mkdir -p $(PKGDIR) 230 | @cp -a $(MANIFEST) $(PKGDIR)/ 231 | @cp -a $(BUILDDIR)/$(PROJECT).bin $(PKGDIR)/$(PAYLOAD) 232 | @$(ZIP) $(ZIP_ARGS) $(PROJECT).zip $(PKGDIR) 233 | @mv $(PROJECT).zip $(PKGARCH) 234 | @echo 235 | @echo Done 236 | -------------------------------------------------------------------------------- /mforest.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | BSD 3-Clause License 3 | 4 | Copyright (c) 2022, Jacob Ulmert 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions are met: 9 | 10 | * Redistributions of source code must retain the above copyright notice, this 11 | list of conditions and the following disclaimer. 12 | 13 | * Redistributions in binary form must reproduce the above copyright notice, 14 | this list of conditions and the following disclaimer in the documentation 15 | and/or other materials provided with the distribution. 16 | 17 | * Neither the name of the copyright holder nor the names of its 18 | contributors may be used to endorse or promote products derived from 19 | this software without specific prior written permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 25 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | */ 32 | 33 | /* 34 | * File: mforest.cpp 35 | * 36 | * Sample player 37 | * 38 | */ 39 | 40 | #include "mforest.hpp" 41 | #include "notemap.h" 42 | #include "samplebank.h" 43 | 44 | static MForest mforest; 45 | 46 | void OSC_INIT(uint32_t platform, uint32_t api) 47 | { 48 | (void)platform; 49 | (void)api; 50 | 51 | initSamples(); 52 | 53 | Sample *sample = &samples[SAMPLE_IDX_DRONE]; 54 | 55 | MForest::Voice *droneVoice = &mforest.voices[VOICE_IDX_DRONE]; 56 | 57 | droneVoice->sampleIdx = sample->offset; 58 | droneVoice->sampleIdxEnd = sample->len + droneVoice->sampleIdx; 59 | 60 | droneVoice->sampleLen = sample->len; 61 | droneVoice->sampleLoopIdx = sample->loopIdx; 62 | 63 | droneVoice->sampleStep = sample->rate / (k_samplerate * 2.f); 64 | droneVoice->sampleCnt = 0; 65 | 66 | droneVoice->loopInf = sample->loopInf; 67 | droneVoice->gain = 0.5; 68 | 69 | droneVoice->isPlaying = true; 70 | 71 | } 72 | 73 | void OSC_CYCLE(const user_osc_param_t * const params, int32_t *yn, const uint32_t frames) 74 | { 75 | MForest::Params &p = mforest.params; 76 | MForest::Voice *voices = &mforest.voices[0]; 77 | { 78 | 79 | if (mforest.state.trigSample) { 80 | mforest.state.trigSample = TRIGSAMPLE_NONE; 81 | 82 | uint16_t map = notemap[(params->pitch)>>8]; 83 | 84 | uint16_t i = N_SAMPLES; 85 | while (i != 0) { 86 | i--; 87 | if ((map & (1 << i))) { 88 | uint8_t rand = (uint8_t)osc_rand(); 89 | 90 | if ((rand > 195) || !(samples[i].flags & SAMPLE_FLAG_RANDOM)) { 91 | Sample *sample = &samples[i]; 92 | uint8_t voiceIdx = sample->voiceIdx; 93 | if (voiceIdx == DYNAMIC_SAMPLE_IDX) { 94 | uint8_t t = N_DYNAMIC_VOICES; 95 | while (t != 0) { 96 | t--; 97 | if (!voices[t].isPlaying && !voices[t].delayedTrigTimer) { 98 | voiceIdx = t; 99 | break; 100 | } 101 | } 102 | } 103 | if (voiceIdx != DYNAMIC_SAMPLE_IDX) { 104 | MForest::Voice &voice = voices[voiceIdx]; 105 | if (sample->flags & SAMPLE_FLAG_LEAD) { 106 | voice.sampleInc = 0; 107 | voice.LFOenv = 0; 108 | } 109 | 110 | if (sample->flags & SAMPLE_FLAG_HP) { 111 | voice.hpf.mCoeffs.setFOHP(0.785 * 1.25 + (0.785 * osc_white())); 112 | } 113 | 114 | voice.sampleIdx = sample->offset; 115 | voice.sampleIdxEnd = sample->len + voice.sampleIdx; 116 | 117 | voice.sampleLen = sample->len; 118 | voice.sampleLoopIdx = sample->loopIdx; 119 | voice.sampleCnt = 0; 120 | 121 | if (sample->flags & SAMPLE_FLAG_DELAY) { 122 | voice.delayedTrigTimer = rand; 123 | voice.isPlaying = false; 124 | } else { 125 | voice.isPlaying = true; 126 | } 127 | 128 | voice.loopInf = sample->loopInf; 129 | voice.gain = *voice.gainGroup; 130 | 131 | if (sample->flags & SAMPLE_FLAG_LIM_PITCH) { 132 | voice.sampleStep = ((sample->rate - ((osc_white() * 0.5) + 0.5) * sample->pitchRange)) / k_samplerate ; 133 | } else { 134 | voice.sampleStep = ((sample->rate) * (1.0 - *voice.tuneGroup)) / k_samplerate; 135 | } 136 | 137 | if (sample->flags & SAMPLE_FLAG_RAND_PITCH) { 138 | if (rand > 250) { 139 | voice.sampleStep *= 0.75; 140 | } else if (rand > 240) { 141 | voice.sampleStep *= 0.5; 142 | } else if (rand > 200) { 143 | voice.sampleStep *= 1.5; 144 | } 145 | } 146 | 147 | if (sample->flags & SAMPLE_FLAG_NOTE_PITCH) { 148 | voice.sampleStep *= osc_notehzf((params->pitch)>>8) / 220.0; 149 | } 150 | if (rand & 1) { 151 | voice.sampleStep *= 0.75; 152 | } 153 | 154 | voice.repeat = 0; 155 | if ((!voice.loopInf) && sample->flags & SAMPLE_FLAG_REPEAT) { 156 | voice.repeat = rand & 0x3; 157 | } 158 | 159 | if (voice.sampleLoopIdx == 0) { 160 | voice.decayDur = (1.0 / voice.sampleStep) * voice.sampleLen; 161 | } else { 162 | voice.decayDur = voice.sampleLen; 163 | } 164 | 165 | voice.sampleIdxStart = voice.sampleIdx; 166 | } 167 | } 168 | } 169 | } 170 | } 171 | } 172 | 173 | uint8_t i = MAX_VOICES; 174 | while (i != 0) { 175 | i--; 176 | MForest::Voice &voice = voices[i]; 177 | if (voice.isPlaying) { 178 | if (voice.sampleCnt >= voice.decayDur && !voice.loopInf) { 179 | voice.isPlaying = false; 180 | } else if (voice.sampleIdx >= voice.sampleIdxEnd) { 181 | if (voice.sampleLoopIdx != 0) { 182 | voice.sampleIdx = voice.sampleLoopIdx + (voice.sampleIdx - (float)voice.sampleIdxEnd); 183 | } else { 184 | voice.isPlaying = false; 185 | } 186 | } 187 | } else if (voice.delayedTrigTimer != 0) { 188 | voice.delayedTrigTimer--; 189 | if (voice.delayedTrigTimer == 0) { 190 | voice.isPlaying = true; 191 | } 192 | } 193 | 194 | if (voice.repeat != 0 && voice.sampleCnt >= voice.decayDur) { 195 | voice.sampleIdx = voice.sampleIdxStart; 196 | voice.sampleCnt = 0; 197 | voice.gain *= 0.75; 198 | voice.isPlaying = true; 199 | voice.repeat--; 200 | voice.hpf.mCoeffs.setFOHP(0.785 * 2 + (0.785 / 4.0 * osc_white())); 201 | } 202 | } 203 | 204 | MForest::Voice &voice0 = voices[0]; 205 | MForest::Voice &voice1 = voices[1]; 206 | MForest::Voice &voiceDrum = voices[2]; 207 | MForest::Voice &voiceDrone = voices[3]; 208 | MForest::Voice &voiceLead = voices[4]; 209 | 210 | const bool voice0_isPlaying = voice0.isPlaying; 211 | const bool voice1_isPlaying = voice1.isPlaying; 212 | const bool voiceDrum_isPlaying = voiceDrum.isPlaying; 213 | const bool voiceLead_isPlaying = voiceLead.isPlaying; 214 | 215 | voiceDrone.hpf.mCoeffs.setFOHP(0.785 / 2.0 + (0.785 / 4.0 * osc_sinf(voiceDrone.LFOenv))); 216 | voiceDrone.LFOenv += 0.0001; 217 | if (voiceDrone.LFOenv >= 1) { 218 | voiceDrone.LFOenv = voiceDrone.LFOenv - 1.f; 219 | } 220 | const float droneGain = p.gainGroup_a * 0.25; 221 | 222 | const float leadGain = (osc_sinf(voiceLead.LFOenv) * 0.5 + 0.5) * voiceLead.gain; 223 | if (voiceLead_isPlaying) { 224 | voiceLead.LFOenv += 0.00015 * frames; 225 | } 226 | 227 | uint16_t sampleIdx; 228 | float fr; 229 | float sig; 230 | 231 | q31_t * __restrict y = (q31_t *)yn; 232 | const q31_t * y_e = y + frames; 233 | 234 | for (; y != y_e; ) { 235 | 236 | sampleIdx = (uint16_t)voiceDrone.sampleIdx; 237 | fr = (voiceDrone.sampleIdx - sampleIdx); 238 | const float sample = (((sampleBank[sampleIdx] * (1.0 - fr)) + (sampleBank[sampleIdx + 1] * fr)) / DENOMINATOR_8BIT); 239 | sig = (voiceDrone.hpf.process_fo(sample) + osc_white() * 0.025) * droneGain; 240 | voiceDrone.sampleIdx += voiceDrone.sampleStep; 241 | voiceDrone.sampleCnt++; 242 | 243 | if (voice0_isPlaying) { 244 | sampleIdx = (uint16_t)voice0.sampleIdx; 245 | fr = (voice0.sampleIdx - sampleIdx); 246 | const float sample = (((sampleBank[sampleIdx] * (1.0 - fr)) + (sampleBank[sampleIdx + 1] * fr)) / DENOMINATOR_8BIT); 247 | sig += (voice0.hpf.process_fo(sample) * (1.f - ((float)voice0.sampleCnt / (float)voice0.decayDur))) * voice0.gain; 248 | voice0.sampleIdx += voice0.sampleStep; 249 | voice0.sampleCnt++; 250 | } 251 | 252 | if (voice1_isPlaying) { 253 | sampleIdx = (uint16_t)voice1.sampleIdx; 254 | fr = (voice1.sampleIdx - sampleIdx); 255 | const float sample = (((sampleBank[sampleIdx] * (1.0 - fr)) + (sampleBank[sampleIdx + 1] * fr)) / DENOMINATOR_8BIT); 256 | sig += (voice1.hpf.process_fo(sample) * (1.f - ((float)voice1.sampleCnt / (float)voice1.decayDur))) * voice1.gain; 257 | voice1.sampleIdx += voice1.sampleStep; 258 | voice1.sampleCnt++; 259 | } 260 | 261 | if (voiceDrum_isPlaying) { 262 | sampleIdx = (uint16_t)voiceDrum.sampleIdx; 263 | fr = (voiceDrum.sampleIdx - sampleIdx); 264 | const float sample = (((sampleBank[sampleIdx] * (1.0 - fr)) + (sampleBank[sampleIdx + 1] * fr)) / DENOMINATOR_8BIT); 265 | sig += (sample * (1.f - ((float)voiceDrum.sampleCnt / (float)voiceDrum.decayDur))) * voiceDrum.gain; 266 | voiceDrum.sampleIdx += voiceDrum.sampleStep; 267 | voiceDrum.sampleCnt++; 268 | } 269 | 270 | if (voiceLead_isPlaying) { 271 | sampleIdx = (uint16_t)(voiceLead.sampleIdx); 272 | fr = (voiceLead.sampleIdx - sampleIdx); 273 | float sample = (((sampleBank[sampleIdx] * (1.0 - fr)) + (sampleBank[sampleIdx + 1] * fr)) / DENOMINATOR_8BIT); 274 | sig += (sample * (1.f - ((float)voiceLead.sampleCnt / (float)voiceLead.decayDur))) * leadGain; 275 | voiceLead.sampleIdx += voiceLead.sampleStep; 276 | voiceLead.sampleCnt += voiceLead.sampleInc; 277 | } 278 | *(y++) = f32_to_q31(sig); 279 | } 280 | } 281 | 282 | void OSC_NOTEON(const user_osc_param_t * const params) 283 | { 284 | mforest.state.trigSample = TRIGSAMPLE_NOTEON; 285 | } 286 | 287 | void OSC_NOTEOFF(const user_osc_param_t * const params) 288 | { 289 | mforest.voices[LEAD_VOICE_IDX].sampleInc = 1; 290 | } 291 | 292 | void OSC_PARAM(uint16_t index, uint16_t value) 293 | { 294 | MForest::Params &p = mforest.params; 295 | 296 | switch (index) { 297 | case k_user_osc_param_id1: 298 | p.tuneGroup_b = value / 100.f; 299 | if (p.tuneGroup_b < 0.1) { 300 | p.tuneGroup_b = 0.1; 301 | } 302 | break; 303 | 304 | case k_user_osc_param_id2: 305 | p.tuneGroup_a = value / 100.f; 306 | if (p.tuneGroup_a < 0.1) { 307 | p.tuneGroup_a = 0.1; 308 | } 309 | break; 310 | 311 | case k_user_osc_param_shape: 312 | p.gainGroup_b = param_val_to_f32(value); 313 | break; 314 | 315 | case k_user_osc_param_shiftshape: 316 | p.gainGroup_a = param_val_to_f32(value); 317 | break; 318 | 319 | default: 320 | break; 321 | } 322 | } -------------------------------------------------------------------------------- /samplebank.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | static const int8_t sampleBank[] = 4 | { 5 | 0,0,0,0,0,-2,0,2,3,-2,-5,0,6,5,-2,-8,-3,6,9,1,-5,-7,-4,4,8,2,-4,-8,-3,6,9,1,-6,-7,-3,6,10,2,-7,-10,-3,7,9,0,-8,-11,-5,7,10,0,-10,-13,-2,11,11,0,-9,-9,0,10,10,0,-9,-9,0,12,11,-1,-9,-8,2,13,10,-1,-10,-9,2,13,10,-3,-13,-10,3,13,7,-6,-15,-10,4,14,7,-7,-14,-7,9,16,6,-7,-13,-4,11,17,5,-9,-14,-2,14,16,2,-12,-15,0,15,14,-1,-15,-15,2,16,13,-3,-16,-14,3,17,10,-7,-18,-12,5,17,9,-8,-18,-10,9,19,8,-10,-18,-7,12,19,6,-11,-17,-5,14,19,4,-15,-18,-2,17,18,0,-17,-17,1,19,17,-3,-20,-16,5,23,14,-7,-22,-13,11,24,11,-11,-24,-11,16,26,8,-17,-25,-6,20,24,2,-23,-27,-3,23,22,-3,-27,-25,4,29,22,-7,-30,-21,12,33,19,-12,-31,-16,19,35,15,-18,-33,-11,24,34,9,-23,-33,-5,29,32,2,-30,-32,0,32,28,-4,-33,-28,9,38,26,-11,-36,-22,18,40,20,-18,-38,-16,24,39,12,-27,-39,-9,31,36,3,-34,-38,-1,36,33,-4,-39,-33,9,43,29,-13,-43,-27,19,45,22,-21,-45,-19,29,45,13,-32,-46,-12,34,40,3,-39,-45,-2,40,38,-5,-44,-37,9,45,31,-15,-48,-30,20,48,23,-25,-50,-21,30,47,13,-35,-50,-11,37,45,5,-39,-42,1,45,42,-2,-43,-37,11,48,35,-13,-48,-31,20,50,27,-23,-50,-23,30,50,17,-32,-49,-12,37,46,7,-39,-46,-2,43,42,-2,-45,-41,6,47,37,-13,-51,-37,16,50,29,-21,-51,-27,27,53,22,-29,-49,-16,37,50,10,-39,-50,-7,42,45,0,-47,-46,5,50,40,-11,-51,-37,18,54,32,-22,-55,-28,29,55,22,-33,-55,-17,39,52,10,-43,-52,-4,48,49,-1,-50,-45,8,54,41,-13,-54,-37,21,56,31,-26,-58,-29,31,55,19,-39,-59,-16,43,53,7,-47,-54,0,53,50,-3,-52,-44,15,60,42,-17,-58,-36,26,59,29,-31,-61,-25,36,56,16,-43,-59,-11,48,54,4,-49,-51,5,57,48,-11,-59,-43,20,60,35,-27,-63,-31,34,61,23,-38,-60,-15,47,58,8,-51,-57,0,55,50,-8,-59,-48,16,62,41,-22,-62,-34,34,65,27,-38,-64,-19,45,60,10,-52,-61,-3,56,55,-3,-59,-51,11,61,46,-17,-62,-39,27,63,33,-32,-63,-26,39,61,18,-44,-60,-10,49,55,4,-50,-51,5,55,47,-10,-57,-41,19,58,34,-26,-60,-27,35,58,19,-41,-58,-11,47,54,3,-53,-53,5,57,47,-13,-60,-40,25,63,34,-31,-64,-25,42,64,18,-47,-62,-6,56,58,-1,-60,-53,13,64,47,-21,-70,-41,31,68,30,-42,-72,-22,49,67,11,-59,-67,0,66,61,-10,-73,-54,24,77,47,-32,-79,-36,46,78,29,-52,-78,-15,62,71,4,-70,-69,9,77,62,-18,-82,-54,33,81,43,-44,-88,-33,55,81,21,-64,-81,-8,72,75,0,-78,-69,17,83,62,-25,-86,-50,43,88,42,-48,-87,-26,63,84,18,-69,-80,0,78,73,-9,-87,-68,26,88,54,-41,-96,-44,55,91,29,-67,-94,-13,78,85,2,-86,-79,19,94,69,-29,-99,-55,49,98,43,-60,-101,-26,74,93,14,-83,-90,6,92,80,-17,-101,-68,41,101,56,-50,-107,-40,66,98,25,-81,-99,-7,87,87,-7,-99,-80,26,100,66,-40,-107,-51,61,105,38,-72,-104,-17,87,95,3,-97,-89,20,103,75,-36,-112,-59,57,109,44,-70,-107,-20,88,98,3,-98,-91,20,104,73,-39,-113,-58,61,108,35,-78,-108,-14,92,93,-6,-102,-81,35,109,63,-50,-108,-40,74,103,16,-89,-95,10,99,74,-33,-106,-55,58,102,30,-76,-97,-2,91,79,-20,-98,-60,48,96,35,-65,-91,-8,80,73,-15,-87,-56,41,86,33,-57,-80,-6,72,65,-14,-79,-47,41,76,24,-58,-73,0,70,53,-25,-77,-35,46,69,11,-62,-63,13,71,45,-32,-74,-24,54,65,2,-67,-58,24,72,35,-42,-75,-11,67,61,-11,-73,-47,38,74,20,-57,-72,1,70,49,-29,-78,-34,51,69,4,-67,-60,23,75,36,-44,-70,-6,67,59,-17,-70,-34,46,67,8,-60,-55,22,68,30,-42,-64,-2,61,45,-24,-65,-23,47,54,-6,-59,-38,31,57,9,-50,-47,17,57,23,-39,-53,4,55,35,-29,-58,-10,50,45,-16,-60,-27,42,55,0,-58,-43,28,63,18,-49,-56,10,65,37,-35,-66,-12,58,54,-16,-69,-35,45,67,6,-63,-55,24,72,29,-50,-68,2,68,48,-31,-72,-19,60,63,-9,-70,-40,45,71,8,-65,-57,27,75,27,-58,-72,8,77,46,-44,-81,-11,75,65,-26,-88,-33,68,82,-7,-91,-56,55,93,12,-85,-76,35,98,35,-74,-88,16,96,52,-57,-94,-3,91,64,-43,-97,-18,83,71,-31,-95,-29,76,77,-23,-94,-35,74,83,-17,-97,-43,72,90,-11,-102,-56,66,102,0,-107,-67,60,103,11,-98,-72,53,104,16,-96,-77,46,104,20,-93,-77,44,101,21,-87,-74,38,96,28,-79,-69,40,92,17,-87,-68,47,97,11,-95,-69,53,103,12,-99,-78,47,115,29,-99,-83,45,107,23,-97,-86,38,109,27,-94,-80,41,103,21,-95,-78,48,110,23,-96,-85,42,115,33,-96,-91,37,112,34,-98,-94,39,120,36,-98,-98,35,124,49,-94,-109,22,122,59,-83,-108,10,113,64,-73,-114,0,109,70,-58,-105,-6,102,77,-51,-109,-15,99,85,-43,-114,-31,94,95,-32,-117,-45,85,101,-16,-112,-57,74,106,-2,-109,-72,61,111,12,-99,-79,50,112,29,-87,-93,25,110,49,-72,-103,-1,98,71,-46,-109,-28,83,86,-18,-101,-46,68,93,-3,-99,-64,56,105,16,-96,-80,41,110,36,-86,-94,21,107,54,-72,-104,2,102,69,-53,-110,-24,91,88,-28,-107,-45,67,93,0,-96,-57,56,93,6,-90,-67,45,99,19,-90,-81,36,102,31,-82,-89,18,101,53,-65,-91,12,99,52,-64,-94,8,104,58,-68,-105,0,107,71,-60,-120,-24,104,95,-40,-123,-37,92,91,-32,-112,-39,86,94,-27,-116,-46,89,105,-17,-114,-59,73,111,4,-108,-67,65,98,-5,-101,-56,65,96,-9,-112,-58,77,110,-5,-112,-68,62,119,16,-110,-75,61,105,6,-99,-67,58,105,6,-110,-76,64,121,16,-111,-92,44,127,41,-103,-100,38,112,34,-86,-85,34,108,34,-96,-98,37,124,45,-93,-110,11,122,74,-75,-117,5,110,63,-62,-100,2,104,64,-67,-114,-5,112,80,-59,-121,-28,97,98,-32,-120,-42,86,91,-22,-103,-44,78,96,-11,-107,-61,68,108,3,-106,-75,49,106,27,-86,-88,30,101,37,-72,-92,10,98,58,-56,-98,-13,89,76,-32,-97,-34,70,80,-10,-89,-51,53,84,9,-75,-72,22,88,42,-57,-80,3,84,57,-39,-86,-25,67,70,-16,-78,-40,49,77,9,-71,-62,24,77,29,-52,-62,6,66,43,-32,-69,-17,54,55,-10,-57,-30,36,58,8,-45,-42,13,51,25,-25,-39,-10,30,36,-3,-34,-23,12,31,11,-19,-29,-8,21,25,0,-27,-28,0,25,23,-4,-32,-23,13,35,20,-22,-41,-11,32,38,-1,-43,-32,18,50,19,-37,-48,0,47,34,-19,-53,-21,37,47,0,-50,-36,22,49,15,-34,-36,9,41,22,-22,-38,-3,33,23,-14,-32,-1,33,22,-13,-32,-8,28,23,-11,-27,-2,30,22,-14,-35,-11,27,27,-13,-39,-10,38,38,-14,-49,-24,31,44,-2,-46,-27,31,50,4,-48,-41,17,50,14,-40,-41,15,55,22,-39,-53,0,50,31,-27,-47,-1,50,37,-23,-55,-16,43,41,-15,-48,-14,40,44,-7,-51,-29,30,48,2,-41,-26,25,43,3,-42,-35,15,43,11,-34,-30,15,39,11,-32,-36,5,36,15,-26,-31,6,34,15,-24,-32,3,36,21,-19,-30,3,33,18,-19,-31,-1,30,19,-16,-29,-1,27,17,-16,-29,-4,25,18,-13,-26,-3,24,21,-8,-25,-6,23,23,-5,-24,-8,21,24,-4,-25,-13,15,24,-1,-24,-16,11,23,3,-21,-19,6,21,7,-16,-17,2,18,8,-13,-19,-2,17,11,-9,-17,-3,14,12,-5,-17,-8,9,12,-1,-14,-9,5,10,2,-9,-9,3,10,4,-6,-7,1,9,5,-4,-6,1,7,4,-3,-4,1,5,2,-4,-5,0,4,0,-6,-5,2,7,2,-6,-6,2,9,4,-6,-8,1,9,5,-5,-9,-1,8,5,-5,-10,-2,8,7,-3,-10,-3,7,8,0,-8,-3,6,7,-1,-8,-4,4,6,-1,-9,-5,4,8,0,-8,-5,5,9,1,-8,-6,4,10,2,-7,-6,3,10,3,-6,-7,2,9,3,-8,-9,0,8,4,-7,-11,-2,8,6,-5,-10,-2,8,8,-2,-10,-4,6,8,-1,-9,-5,4,9,2,-7,-7,2,8,4,-4,-6,0,6,5,-1,-5,-2,3,4,0,-3,-2,0,2,0,-1,-1,0,1,1,1,1,0,-1,-1,0,0, 6 | // Tail 7 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 8 | 9 | 0,0,0,0,-1,-2,0,2,0,-6,-2,3,3,-6,-12,-3,7,1,-15,-11,6,12,-1,-17,1,15,13,-13,-16,18,22,4,-26,0,28,18,-12,-15,22,35,3,-30,-4,30,22,-16,-23,23,41,5,-33,-13,37,27,-15,-41,10,50,13,-41,-29,44,53,-8,-49,-1,63,34,-41,-48,25,66,0,-63,-35,50,46,-34,-69,7,71,19,-61,-58,40,55,-23,-84,-21,62,28,-59,-72,22,71,-2,-73,-29,64,53,-42,-74,8,77,15,-72,-53,51,67,-21,-83,-13,77,40,-57,-68,34,79,-2,-78,-34,68,68,-43,-80,11,91,33,-69,-57,46,83,-9,-80,-11,86,56,-44,-62,35,92,12,-71,-29,71,73,-31,-74,14,94,38,-66,-44,60,89,-11,-70,-3,88,66,-54,-65,43,101,12,-72,-34,80,76,-40,-80,11,100,30,-70,-60,58,96,-23,-94,-17,96,57,-72,-88,25,107,9,-93,-52,73,79,-46,-95,-4,98,31,-86,-77,51,96,-20,-105,-36,86,55,-78,-101,18,104,8,-113,-67,70,83,-51,-115,-11,106,43,-91,-84,43,108,-13,-109,-32,96,74,-66,-97,20,114,17,-100,-65,74,101,-34,-103,-6,107,59,-76,-90,43,110,2,-97,-43,89,91,-47,-95,3,101,40,-75,-73,46,94,-6,-92,-42,72,63,-35,-88,-7,76,31,-67,-73,21,76,4,-73,-44,50,65,-22,-71,-16,65,39,-36,-71,3,67,24,-44,-56,16,65,11,-45,-45,26,51,-7,-46,-35,29,34,-5,-39,-31,19,26,-3,-35,-23,31,27,-9,-34,-11,25,30,-6,-27,8,34,23,-12,-16,19,38,0,-18,-5,35,30,-12,-16,14,26,-1,-17,-7,30,22,0,-10,16,27,7,-10,0,15,4,-12,-14,15,5,-6,-13,4,13,-7,-10,0,14,3,-17,-7,16,8,-16,-15,5,19,-3,-22,-2,19,10,-16,-16,6,18,-5,-15,8,19,0,-12,-6,18,7,-23,-22,9,23,-4,-22,-4,24,14,-13,-19,13,25,3,-24,-8,16,5,-12,-20,0,4,-8,-18,-3,10,-5,-11,-4,14,1,-15,-8,12,16,-1,-11,3,24,7,-6,-8,8,17,1,-12,-4,12,10,-8,-15,2,19,2,-2,5,13,11,0,3,-2,2,-5,-4,1,1,-1,0,7,5,-2,-10,0,6,-4,-13,-7,3,11,-10,-19,5,22,6,-20,-13,19,25,-2,-24,3,41,23,-22,-22,20,40,0,-38,-5,45,31,-21,-38,17,52,12,-42,-30,38,49,-5,-50,4,46,24,-34,-41,25,40,0,-52,-9,35,26,-29,-43,16,30,-7,-52,-7,35,14,-41,-47,19,32,-17,-63,-9,42,13,-49,-54,30,50,-16,-75,-16,63,32,-52,-64,28,66,-8,-77,-25,61,42,-52,-69,20,66,-2,-81,-33,56,39,-45,-74,15,64,-6,-83,-35,55,35,-51,-72,17,64,-2,-87,-35,66,54,-50,-71,28,86,10,-83,-28,70,62,-47,-81,18,90,13,-76,-34,72,78,-42,-81,13,96,21,-84,-48,64,82,-36,-81,8,97,23,-79,-49,64,85,-44,-81,8,100,26,-83,-50,68,86,-47,-92,-2,110,33,-94,-59,65,96,-37,-97,-6,111,41,-86,-67,61,101,-36,-102,-19,108,51,-89,-80,47,99,-37,-115,-30,96,50,-91,-90,34,105,-23,-110,-35,94,65,-85,-89,30,106,-10,-109,-48,86,71,-81,-99,14,106,0,-112,-56,86,88,-66,-106,-1,112,17,-112,-80,66,99,-51,-113,-20,109,38,-101,-90,49,110,-39,-122,-38,97,48,-99,-96,38,109,-26,-120,-41,105,65,-94,-102,29,120,-11,-122,-51,98,88,-77,-111,14,122,16,-116,-71,80,95,-60,-116,-7,115,34,-101,-77,62,112,-32,-107,-18,103,67,-79,-84,34,106,8,-92,-40,77,84,-35,-80,-2,94,47,-58,-58,36,99,15,-67,-36,58,85,-9,-68,-15,77,60,-41,-76,0,89,40,-57,-59,42,99,16,-70,-38,73,89,-9,-71,-4,94,60,-35,-57,31,91,31,-39,-30,42,69,8,-30,-7,43,43,-9,-16,10,31,18,-7,-10,13,22,10,-8,-10,9,15,3,-11,-8,15,16,-9,-22,-3,21,16,-8,-17,8,24,4,-21,-11,11,9,-11,-19,-4,19,1,-19,-8,9,10,-9,-9,6,7,-7,-1,11,13,2,-5,6,13,0,-11,2,16,9,-5,-3,19,18,2,-7,8,24,6,-9,0,21,14,-11,-5,19,17,-6,-15,2,24,6,-21,-8,23,18,-14,-19,8,24,-6,-30,-14,23,14,-27,-25,4,25,-9,-29,-12,21,15,-31,-34,4,28,-13,-44,-17,23,15,-28,-30,2,28,4,-31,-18,21,14,-19,-24,3,18,-1,-19,-15,10,10,-13,-22,1,13,1,-14,-7,11,9,-3,-14,2,8,0,-12,-8,10,2,-14,-11,1,15,0,-17,-10,11,8,-15,-28,-5,24,1,-21,-22,12,17,-10,-33,-15,23,8,-28,-41,15,40,0,-45,-18,42,30,-28,-53,4,55,12,-62,-36,44,50,-25,-72,-3,69,29,-54,-58,36,62,-7,-69,-26,56,34,-52,-79,12,52,-7,-75,-30,44,32,-42,-71,13,51,-10,-70,-28,44,30,-50,-58,25,56,-16,-73,-14,64,31,-63,-63,42,78,-15,-83,-11,84,42,-63,-64,43,88,-8,-86,-18,86,61,-58,-75,34,98,2,-88,-35,82,61,-61,-76,28,101,-3,-93,-37,78,62,-63,-78,25,95,1,-84,-30,84,65,-62,-70,29,99,-7,-99,-37,81,66,-73,-85,27,105,-6,-102,-42,82,65,-70,-90,12,99,-8,-97,-45,73,63,-72,-77,27,103,-4,-88,-25,94,68,-67,-63,39,109,-10,-90,-20,94,65,-76,-69,43,110,-11,-93,-20,106,70,-74,-73,33,117,-11,-99,-33,89,70,-70,-79,18,110,-9,-94,-40,77,70,-71,-77,17,102,-11,-91,-37,74,73,-69,-73,22,106,-5,-97,-37,78,71,-71,-81,20,99,-1,-94,-45,78,73,-61,-85,6,109,12,-95,-57,65,93,-52,-97,-9,110,30,-93,-71,54,104,-40,-94,-23,106,52,-82,-78,49,115,-24,-94,-34,105,62,-78,-85,37,119,-16,-104,-45,100,76,-82,-99,25,127,0,-120,-57,91,94,-71,-113,9,121,24,-106,-64,81,109,-41,-105,-3,120,47,-95,-80,51,108,-21,-100,-22,91,71,-60,-76,19,95,26,-70,-44,52,95,3,-64,-20,74,74,-20,-60,-4,85,62,-33,-59,27,100,38,-57,-49,53,91,8,-69,-33,72,66,-32,-73,-2,74,32,-54,-55,20,59,6,-57,-29,33,30,-26,-36,-4,21,8,-17,-12,3,16,1,-7,-7,-1,17,11,-7,-15,1,22,7,-24,-21,12,25,-2,-35,-14,25,15,-26,-40,0,26,0,-39,-30,16,12,-25,-41,-9,15,-6,-33,-29,2,6,-16,-25,-8,12,-7,-22,-10,1,1,-16,-8,5,4,-8,-10,8,7,-4,-13,0,12,5,-8,-5,15,13,-2,-12,6,17,5,-5,0,11,9,-1,-7,4,10,2,-5,0,11,3,-7,-6,7,8,-2,-5,0,6,0,-4,-3,4,2,-3,-5,0,3,-5,-7,-1,3,0,-5,-3,2,2,-3,-7,0,6,1,-5,-4,2,3,-1,-4,0,4,1,-2,-1,1,3,0,-1,0,2,1,-1,-1,0,2,0,-1,0,1,1,0,-1,0,0,0,0,0,0,0,0, 10 | // Tail 11 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 12 | 13 | 0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,1,1,1,0,0,0,0,0,0,1,2,2,1,0,0,0,0,2,1,0,-1,-2,-1,0,0,2,3,5,5,5,3,1,-1,-3,-2,0,0,2,2,3,2,0,-1,-1,-1,1,3,4,5,4,3,1,0,0,0,1,2,4,4,3,0,-1,-2,-1,0,2,2,0,-1,-3,-4,-3,-1,1,4,8,10,9,4,0,-2,-4,-2,0,3,4,4,2,0,-2,-4,-5,-4,-1,1,4,5,4,1,0,-2,-2,-1,0,2,3,3,2,0,-3,-5,-4,-2,0,0,-3,-8,-8,-4,1,7,8,5,0,-4,-5,-5,-3,-1,0,2,4,3,0,-4,-8,-10,-8,-3,0,4,5,4,1,-2,-4,-6,-4,-1,3,7,7,2,-3,-8,-9,-5,0,1,-3,-9,-11,-6,3,9,9,4,-1,-5,-4,-3,-2,-2,-1,1,6,7,3,-4,-11,-12,-7,-1,3,5,5,5,3,0,-3,-6,-5,0,7,11,7,-1,-10,-12,-9,-4,-5,-6,-4,3,15,19,12,-2,-14,-16,-9,0,5,5,4,4,3,0,-8,-15,-15,-7,4,12,12,5,0,-3,-3,-3,-3,-1,4,11,13,5,-8,-17,-15,-6,-3,-5,-5,1,16,24,17,0,-18,-21,-9,3,9,6,3,6,9,6,-4,-18,-23,-11,5,17,13,2,-4,-5,0,3,0,-2,1,8,12,5,-9,-21,-24,-18,-4,10,23,26,20,4,-11,-18,-16,-5,5,10,11,12,11,5,-9,-21,-25,-16,1,17,20,11,1,-5,-5,-2,0,2,6,11,9,-2,-16,-24,-23,-19,-9,6,22,32,27,6,-17,-29,-22,-5,8,13,11,9,9,4,-8,-22,-28,-19,1,20,24,12,-2,-8,-7,0,6,7,5,0,-10,-20,-26,-25,-4,20,35,35,15,-7,-20,-21,-13,-4,5,15,23,25,11,-13,-31,-32,-17,3,17,20,17,15,8,-3,-13,-9,6,18,18,0,-23,-37,-38,-12,20,38,42,24,0,-15,-23,-18,-11,0,13,24,30,20,-7,-31,-38,-29,-8,10,22,26,22,10,-8,-21,-9,13,21,9,-22,-43,-33,0,27,33,21,3,0,0,-7,-15,-20,-10,14,35,38,13,-20,-37,-31,-9,6,7,7,20,26,19,-4,-31,-21,10,30,22,-13,-46,-52,-19,23,43,40,19,2,-4,-13,-20,-25,-16,11,37,46,25,-13,-39,-39,-23,-5,4,15,32,32,13,-14,-36,-19,16,25,8,-27,-49,-24,22,40,31,3,-15,-4,2,0,-17,-28,-11,25,51,41,-6,-47,-49,-21,7,13,3,9,20,17,3,-16,-18,1,10,0,-24,-47,-26,19,41,41,13,-11,-9,-8,-6,-17,-29,-11,22,54,49,-2,-52,-60,-27,11,23,13,8,7,8,5,-6,-5,0,-7,-23,-39,-29,15,45,42,12,-23,-22,-4,7,4,-19,-24,0,36,57,20,-40,-68,-46,11,48,40,4,-29,-33,-7,22,32,18,-19,-45,-52,-17,37,53,40,0,-24,-13,1,8,-7,-26,-17,11,47,58,12,-44,-71,-49,7,50,55,15,-31,-43,-5,34,43,7,-56,-79,-46,38,90,76,8,-58,-54,-12,25,22,-17,-31,-3,40,73,33,-38,-80,-66,1,62,70,13,-46,-65,-7,53,59,12,-66,-97,-41,57,105,87,-7,-78,-64,-9,47,33,-16,-32,-10,42,68,18,-46,-76,-44,31,80,53,-17,-76,-59,25,70,53,-24,-95,-83,13,97,110,47,-64,-88,-48,24,57,12,-27,-31,13,65,44,-21,-76,-71,-4,67,82,14,-55,-81,-11,68,73,12,-79,-110,-40,70,118,94,-21,-99,-84,-13,61,46,-4,-33,-14,44,58,6,-58,-83,-31,44,83,36,-38,-73,-31,53,71,22,-62,-106,-60,48,107,103,14,-82,-88,-46,32,47,12,-13,-11,31,51,8,-48,-82,-43,27,79,53,-25,-72,-57,32,79,48,-31,-100,-87,14,95,113,51,-62,-96,-65,17,61,26,-13,-33,2,52,37,-14,-68,-53,7,62,59,-10,-57,-57,15,66,40,-23,-87,-80,18,91,111,59,-52,-97,-79,2,63,48,13,-21,-8,25,15,-18,-54,-40,12,64,57,-8,-60,-57,18,69,48,-19,-87,-84,9,85,109,61,-44,-89,-70,2,58,40,4,-24,-6,37,28,-11,-52,-43,5,52,39,-16,-49,-37,36,68,27,-39,-95,-74,29,95,106,45,-58,-91,-60,17,66,44,5,-21,-11,18,9,-20,-42,-25,15,52,32,-18,-50,-37,33,65,32,-31,-93,-66,36,94,105,29,-75,-103,-61,36,83,52,-2,-44,-16,28,26,-13,-44,-33,10,47,15,-27,-47,-14,53,54,7,-57,-100,-43,56,103,100,14,-78,-100,-56,30,71,49,8,-26,-14,6,-3,-24,-29,-8,25,40,2,-34,-45,-9,52,45,-4,-63,-96,-17,72,104,86,-16,-95,-100,-43,50,74,48,-1,-33,-4,11,0,-31,-39,-15,29,41,-1,-32,-40,13,56,31,-17,-78,-91,-7,77,108,79,-20,-91,-89,-31,47,60,27,-7,-21,9,20,0,-32,-38,-9,27,37,-7,-38,-41,6,63,41,-8,-64,-87,-6,73,99,73,-27,-93,-88,-26,59,69,34,-12,-34,5,21,4,-27,-38,-12,26,38,0,-25,-32,12,48,16,-23,-68,-73,3,78,98,70,-18,-86,-80,-33,42,61,29,1,-21,2,19,0,-24,-39,-20,12,34,8,-13,-23,2,47,22,-20,-56,-78,-16,67,92,83,2,-78,-86,-52,26,63,39,11,-20,1,22,3,-26,-45,-19,20,46,10,-25,-36,-10,52,36,-4,-50,-67,-34,23,74,65,41,-24,-51,-38,-18,21,18,6,7,8,24,15,-15,-36,-35,-6,18,27,0,-8,-16,10,39,6,-25,-48,-58,-16,49,73,72,14,-54,-66,-48,8,47,36,16,-8,2,8,-5,-31,-39,-4,26,40,2,-33,-31,-8,50,37,-6,-38,-56,-26,-6,42,47,48,24,-19,-31,-45,-21,9,25,34,32,7,-6,-26,-36,-19,-1,14,24,4,-7,-12,-9,36,29,1,-23,-53,-49,-21,42,67,65,20,-45,-54,-42,0,36,24,13,5,1,4,-15,-33,-27,3,26,29,-9,-38,-31,-5,53,53,1,-36,-69,-40,-11,24,51,41,36,-3,-26,-38,-32,6,27,26,23,-6,-14,-16,-16,-9,-1,7,14,9,-4,-13,-15,20,47,14,-20,-58,-49,-3,9,54,27,20,8,-14,-9,-30,-14,5,12,27,19,-1,-11,-22,-15,-9,7,1,6,0,0,5,6,35,12,-29,-45,-50,0,37,14,4,-14,0,40,40,7,-41,-60,-30,15,50,43,4,-19,-22,-15,-15,-17,-13,8,41,30,0,-30,-18,12,10,-4,-31,-26,16,19,1,-8,-19,23,53,35,-15,-68,-66,-8,49,73,35,-24,-44,-34,-3,6,1,-4,16,25,6,-18,-30,2,9,6,-5,-22,2,15,0,-37,-41,-5,49,82,30,-41,-80,-54,22,70,54,-4,-48,-26,20,30,-6,-51,-48,19,63,39,-21,-67,-26,41,63,25,-44,-59,-17,28,12,-25,-42,-9,65,79,27,-53,-89,-41,44,79,47,-24,-47,-11,24,15,-35,-57,-16,53,59,14,-47,-41,21,50,35,-27,-63,-28,15,32,-12,-52,-25,34,89,57,-29,-83,-70,15,80,57,-5,-54,-25,31,35,-16,-71,-59,26,93,70,-15,-86,-56,40,80,37,-52,-89,-22,60,83,-1,-101,-102,0,104,124,29,-83,-112,-38,70,86,22,-52,-47,21,54,9,-63,-79,-5,84,92,7,-84,-92,6,93,84,2,-88,-71,9,68,46,-44,-97,-46,53,113,78,-25,-89,-78,7,73,50,-3,-35,-5,40,34,-27,-77,-66,9,85,76,6,-69,-64,19,72,47,-26,-77,-28,44,73,18,-74,-115,-51,66,121,93,-18,-97,-87,-6,73,70,13,-30,-28,13,25,-7,-46,-44,0,59,64,4,-54,-67,7,76,64,-5,-74,-64,17,64,52,-26,-92,-86,2,86,100,47,-42,-73,-48,11,42,24,1,-1,14,27,-7,-51,-68,-27,31,72,55,-9,-55,-53,12,60,44,-13,-55,-36,23,46,20,-39,-82,-70,13,81,94,51,-34,-69,-49,5,45,27,-5,-13,2,30,9,-36,-57,-37,15,60,58,5,-44,-54,-1,52,48,0,-51,-49,5,44,37,-7,-56,-68,-28,40,69,62,8,-44,-46,-25,19,27,9,2,2,18,13,-21,-43,-38,-2,37,54,25,-29,-56,-38,28,62,44,-9,-50,-35,10,39,24,-24,-64,-69,-16,50,76,63,0,-41,-44,-17,20,21,7,-1,1,14,11,-18,-39,-43,-18,19,44,39,4,-33,-36,4,33,36,3,-29,-21,5,23,6,-33,-63,-54,-7,53,75,57,3,-40,-44,-22,10,20,11,6,9,16,13,-10,-32,-43,-28,3,31,43,22,-10,-23,-6,21,20,0,-27,-22,10,35,29,-11,-51,-66,-40,10,57,66,41,-6,-35,-30,-4,20,16,0,-8,-1,11,14,-4,-23,-31,-14,8,24,24,2,-17,-13,18,37,26,-8,-41,-29,3,30,24,-14,-47,-52,-22,23,53,51,21,-14,-32,-23,0,16,18,8,0,0,0,0,-7,-15,-18,-13,2,18,28,13,-7,-13,0,18,15,-3,-22,-17,7,28,21,-12,-45,-49,-24,9,32,38,27,14,0,-13,-19,-19,-8,9,18,22,16,-1,-11,-23,-25,-19,-9,9,29,35,14,-17,-28,-10,17,26,5,-19,-15,9,28,17,-25,-55,-55,-18,22,41,37,14,0,-6,-8,-6,-9,-2,12,22,23,6,-15,-27,-28,-18,-2,8,17,23,13,-5,-16,-11,8,21,17,1,-12,-5,7,13,-1,-27,-43,-35,-11,8,25,32,29,24,10,-12,-29,-33,-11,18,36,34,9,-15,-27,-26,-17,-6,2,12,19,16,2,-15,-15,3,25,30,4,-23,-28,-8,19,21,-5,-32,-39,-19,6,15,15,13,18,26,13,-7,-26,-27,-5,15,22,12,-5,-11,-12,-12,-10,-8,-7,4,16,19,10,-2,-5,5,14,5,-15,-27,-11,16,32,13,-23,-46,-32,0,13,8,-2,0,25,44,30,-4,-39,-42,-12,15,22,11,-1,2,9,1,-18,-38,-35,-3,35,53,30,-9,-29,-19,8,18,4,-13,-14,4,22,12,-15,-36,-30,-5,12,13,0,0,16,30,24,-3,-31,-35,-11,18,29,18,0,-10,-9,-6,-11,-19,-19,-1,21,32,21,-8,-23,-17,6,20,10,-8,-19,-4,16,18,-1,-27,-32,-11,12,15,-5,-18,-7,23,43,31,-7,-41,-39,-8,24,33,14,-9,-14,-7,0,-4,-13,-16,-3,15,25,15,-7,-19,-11,9,23,12,-8,-19,-11,6,14,3,-11,-17,-10,0,3,-4,-11,-11,4,25,31,21,-6,-25,-23,-7,14,20,11,0,-8,-8,-4,-4,-8,-8,0,13,21,14,-3,-18,-12,5,19,16,0,-14,-10,3,12,5,-9,-17,-12,2,9,2,-9,-14,-2,18,29,21,-3,-22,-21,-4,10,12,3,-2,-2,2,1,-8,-16,-13,1,16,20,9,-7,-17,-9,9,20,17,0,-15,-15,-5,6,6,-1,-6,-6,1,6,4,-1,-8,-10,-4,4,14,16,10,0,-9,-11,-7,0,7,7,5,0,-1,0,-1,-3,-5,-5,0,6,10,7,-1,-7,-6,0,7,7,0,-4,-3,0,4,0,-6,-8,-2,5,7,2,-5,-10,-9,-3,4,11,12,7,0,-7,-8,-4,2,5,3,0,-3,-2,1,1,-1,-4,-6,-1,4,7,5,-1,-5,-4,1,5,4,0,-2,-2,0,3,2,-2,-5,-4,-1,2,1,0,-2,-2,-1,-1,-3,-5,-2,4,10,11,6,-2,-9,-9,-4,2,6,5,2,0,-3,-3,-3,-2,-1,0,2,4,4,3,0,-3,-4,-3,0,4,5,3,0,-4,-4,-2,0,0,0,1,2,2,0,-3,-5,-4,0,1,1,0,-1,-2,0,2,4,3,0,-1,-2,-1,0,0,0,1,1,0,-1,-2,-2,-1,0,1,2,2,1,0,-1,-1,0,1,2,1,0,-1,-1,-1,0,1,1,0,-1,-1,0,1,1,0,-1,-2,-1,0,1,1,0,-1,-2,-1,0,0,1,2,1,0,0,-1,-1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 14 | // Tail 15 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 16 | 17 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,0,3,0,0,2,2,2,3,2,3,3,1,1,3,4,5,3,5,3,4,8,4,2,2,2,0,2,4,0,0,-1,-1,3,1,0,0,1,2,3,3,0,0,1,0,1,1,0,-1,-3,-1,-3,4,2,1,0,0,-1,-4,1,-2,-5,-6,-3,-2,-1,-2,-2,6,10,6,2,1,1,0,4,2,-2,-4,-12,-17,-13,-12,-1,-3,0,-4,-10,-10,-16,-22,-21,-16,-5,1,-7,-12,-14,-11,-4,6,14,16,14,9,-4,-18,-16,-6,4,11,7,11,14,6,5,2,-1,-1,-10,-11,-9,-9,-1,-6,-6,0,4,7,6,2,-7,-24,-33,-27,-11,2,7,4,3,-2,-2,2,7,9,6,-1,-12,-24,-26,-11,2,3,6,18,8,4,0,-13,-16,-13,-8,-9,-9,-9,6,12,12,11,6,-1,-13,-26,-19,-12,-7,-6,-7,-7,-10,-8,2,0,-12,-14,-13,-12,-13,-12,-6,1,-5,-2,0,-1,-2,2,5,-3,-4,-8,-4,6,3,11,19,17,8,-5,1,0,-3,1,7,0,-8,-3,-4,-9,-4,7,2,0,7,-1,-9,-1,-1,-3,1,3,-2,-7,-6,0,2,0,-4,-11,-15,-11,-4,1,-7,-9,-11,-17,-19,-11,-8,-7,-10,-24,-41,-37,-25,-9,0,-2,-13,-28,-31,-24,-6,-2,-8,-8,-7,-17,-34,-25,-6,-8,-11,-7,-8,-9,-14,-15,-3,10,11,4,0,-11,-11,10,28,29,21,12,-5,-13,-8,8,14,2,2,9,-6,-24,-17,7,17,15,10,-4,-9,-19,-13,9,19,19,8,-3,-11,-16,-2,20,26,16,2,-4,-13,-10,18,40,33,34,33,11,-1,8,43,54,46,34,19,7,6,21,47,57,49,28,14,0,2,34,51,50,43,22,-3,-9,14,39,48,36,24,4,-14,0,25,46,51,38,16,-21,-29,6,44,66,57,33,0,-24,-6,23,42,51,39,4,-31,-27,6,30,41,37,11,-28,-34,-7,10,19,27,14,-17,-32,-10,20,33,38,20,-15,-31,-19,2,20,29,15,-12,-33,-25,-6,2,15,10,-20,-41,-33,-13,-11,-8,-13,-42,-53,-29,-14,-16,-8,-11,-37,-46,-30,-19,-6,-4,-28,-56,-62,-33,-15,-16,-14,-28,-63,-67,-34,-14,-14,-11,-34,-62,-55,-17,-11,-15,-23,-48,-69,-52,-21,-11,-16,-23,-49,-60,-36,-14,-12,-18,-28,-50,-43,-1,21,12,2,-11,-34,-17,30,34,17,-1,-26,-45,-12,34,36,6,-19,-39,-34,9,46,39,10,-18,-33,-6,38,50,25,-4,-29,-28,17,58,49,21,-20,-50,-19,43,59,40,7,-39,-42,14,71,61,21,-14,-49,-23,37,68,41,3,-34,-39,11,66,67,25,-22,-48,-18,45,67,50,10,-36,-52,11,79,77,37,-11,-45,-20,49,79,50,1,-47,-46,17,68,55,11,-30,-55,-19,53,69,30,-14,-50,-37,23,75,60,10,-37,-52,0,62,73,33,-24,-56,-23,50,80,48,8,-38,-42,27,75,58,3,-42,-50,-5,61,63,14,-42,-65,-31,43,66,26,-28,-68,-53,19,63,52,-7,-63,-62,-6,56,69,26,-44,-61,-13,53,73,29,-30,-72,-40,27,62,35,-23,-71,-56,16,60,48,-2,-67,-71,-5,55,59,18,-47,-78,-25,52,76,35,-32,-74,-36,40,61,36,-17,-62,-40,36,75,45,-11,-63,-48,23,67,47,-2,-49,-57,13,83,72,15,-42,-63,-7,64,70,12,-43,-68,-24,55,81,34,-37,-68,-34,48,81,37,-32,-86,-59,26,79,35,-26,-66,-60,20,88,61,-14,-76,-78,-4,72,64,-3,-74,-89,-27,60,69,4,-66,-103,-52,49,78,25,-57,-109,-72,34,89,51,-33,-100,-82,18,98,75,-5,-87,-94,-14,79,91,13,-76,-102,-31,76,102,44,-44,-96,-47,62,112,62,-24,-92,-62,43,100,75,0,-81,-80,12,93,75,0,-80,-100,-15,78,79,17,-64,-94,-29,66,82,26,-54,-94,-43,56,91,37,-42,-91,-53,44,93,58,-25,-91,-75,22,82,59,-11,-78,-75,7,87,83,10,-70,-89,-5,82,88,21,-67,-104,-38,60,86,33,-60,-108,-54,48,93,52,-38,-98,-66,35,103,73,-14,-80,-68,25,106,95,11,-70,-79,-2,90,91,19,-59,-85,-21,78,96,34,-51,-93,-47,52,94,41,-45,-92,-61,43,102,60,-21,-97,-78,26,97,68,-22,-102,-94,-6,79,68,-12,-90,-108,-22,71,83,20,-61,-93,-25,76,102,50,-32,-84,-39,61,108,62,-31,-92,-68,37,103,69,-23,-96,-84,17,100,75,0,-75,-79,6,111,111,21,-61,-88,-21,83,102,28,-64,-102,-48,54,95,43,-46,-98,-55,45,102,65,-22,-85,-66,32,106,78,-7,-84,-91,6,102,93,7,-79,-95,-16,88,112,28,-79,-120,-56,66,107,38,-66,-126,-74,47,105,55,-41,-119,-92,22,102,88,-4,-98,-97,5,111,112,27,-77,-107,-31,80,104,38,-68,-124,-76,41,104,57,-45,-123,-92,14,97,80,-13,-105,-105,0,106,106,30,-71,-105,-27,86,121,55,-51,-108,-51,61,127,91,-11,-87,-56,48,125,103,17,-74,-85,10,103,110,34,-60,-104,-47,55,87,36,-42,-98,-73,25,95,60,-22,-86,-81,7,92,89,13,-62,-90,-33,61,88,37,-51,-102,-62,36,86,50,-26,-89,-73,5,76,75,8,-60,-70,4,92,108,51,-24,-63,-20,71,103,55,-18,-67,-53,31,93,76,8,-60,-70,0,88,92,34,-34,-76,-34,61,98,46,-17,-65,-58,23,81,59,-4,-60,-70,-14,61,66,12,-52,-82,-47,35,72,30,-37,-81,-77,1,76,53,-5,-58,-81,-30,55,69,16,-43,-85,-63,28,76,42,-7,-63,-74,-5,61,63,14,-37,-70,-37,47,74,49,-15,-78,-64,9,77,66,11,-51,-86,-34,43,55,28,-35,-91,-67,13,66,57,-2,-76,-81,-12,55,67,24,-49,-92,-57,25,70,42,-24,-83,-70,1,63,60,7,-57,-82,-31,44,69,38,-35,-78,-55,12,71,53,-9,-71,-81,-19,55,77,25,-51,-77,-38,35,79,61,-8,-67,-62,9,78,76,20,-61,-87,-25,46,73,36,-33,-75,-46,27,81,70,2,-56,-64,0,75,80,30,-28,-52,-25,45,83,51,-13,-53,-37,19,70,72,15,-41,-55,-11,43,59,26,-27,-62,-44,20,59,43,0,-40,-42,0,55,66,24,-27,-43,-23,31,57,32,-10,-43,-34,13,48,45,6,-44,-56,-16,29,48,24,-26,-46,-27,18,51,47,9,-31,-34,3,49,51,18,-15,-36,-15,30,54,37,-5,-29,-27,6,53,61,22,-18,-32,-12,37,64,47,0,-29,-23,8,37,45,9,-26,-42,-26,13,36,23,-13,-43,-40,-4,36,33,4,-30,-44,-19,20,44,27,-11,-41,-35,1,40,44,2,-35,-45,-25,16,52,30,-21,-46,-41,-7,32,35,-3,-41,-52,-29,18,42,13,-23,-48,-44,-3,41,34,-8,-49,-63,-37,10,27,5,-45,-66,-42,-6,32,29,-16,-54,-58,-23,23,45,16,-35,-54,-35,4,39,25,-14,-49,-54,-22,19,35,3,-35,-58,-45,-4,31,27,-11,-43,-50,-33,9,34,17,-29,-46,-43,-17,17,36,11,-32,-43,-28,5,37,29,-5,-37,-42,-18,20,39,20,-15,-33,-37,-7,42,44,12,-13,-29,-29,11,49,38,4,-33,-44,-29,12,40,10,-27,-56,-55,-14,24,28,-5,-47,-65,-49,0,30,20,-19,-50,-48,-20,18,44,23,-23,-43,-33,4,45,49,7,-32,-40,-18,19,46,30,-10,-38,-34,-10,26,34,8,-24,-43,-30,-2,23,27,-2,-31,-33,-17,6,25,27,-8,-32,-28,-13,12,24,11,-16,-30,-11,-3,12,21,4,-11,-15,-7,0,10,23,10,-3,-3,-3,3,21,23,6,-1,-3,-7,-4,11,7,0,-1,-6,-14,-2,8,-1,-1,-6,-19,-13,0,5,9,7,-2,-11,-14,-2,13,16,8,-2,-7,-7,-5,2,7,2,-6,-7,-6,0,7,7,-2,-5,-12,-9,-2,-4,-2,-8,-10,-12,-12,-3,4,7,0,-5,-8,-10,-4,4,0,-5,-10,-16,-9,0,0,-7,-15,-9,-6,-8,-4,-3,-11,-15,-13,-4,0,0,-3,-6,-9,-6,-2,-2,-3, 18 | // Tail 19 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 20 | 0,0,0,-1,0,0,-2,-2,0,-4,-6,1,-2,0,0,0,0,-4,7,5,2,-1,-2,0,5,5,-2,0,-3,-7,-7,0,1,-10,-12,-5,-5,4,0,1,3,-2,4,6,9,7,6,-4,-2,-4,0,-2,1,0,-18,-12,-1,6,7,0,1,6,-7,0,10,14,0,0,1,-1,-3,4,7,-11,-8,-8,-11,-8,8,-3,-1,1,-3,19,7,-4,10,0,2,9,-4,5,1,-19,-6,9,-14,-19,-6,7,2,-9,4,2,21,5,2,19,-1,0,-2,4,0,-3,-14,0,-8,-16,-7,-9,10,5,0,-2,14,3,7,19,9,10,-12,-6,1,-8,4,-5,-2,-8,-17,-3,-2,-11,-2,13,4,14,13,5,6,2,0,23,2,-22,5,-7,-22,5,-6,-8,5,-26,-21,16,6,7,29,-3,6,16,0,12,12,-10,-4,1,-22,-6,1,-17,-7,-5,-34,-2,12,-6,21,14,3,17,14,6,16,12,-13,-1,-10,-26,3,2,-25,-9,-11,-34,-4,5,14,28,7,2,17,9,2,27,14,-14,-7,-24,-20,5,-1,-11,-9,-24,-36,-7,7,25,32,10,9,12,3,11,31,11,-9,-18,-33,-20,2,-3,-1,-3,-38,-32,-15,0,37,33,20,16,5,3,16,22,10,2,-26,-34,-16,-7,1,1,-5,-36,-40,-20,8,31,31,34,18,1,2,19,25,12,-5,-33,-34,-13,-7,7,9,-15,-39,-41,-27,11,35,33,42,19,0,1,11,21,14,-4,-33,-34,-21,-4,17,13,-12,-40,-49,-31,5,30,49,50,19,3,5,9,15,14,-5,-37,-37,-26,-2,20,13,-8,-45,-58,-33,1,32,54,57,35,1,0,11,13,13,-8,-33,-29,-25,-5,17,9,-12,-38,-61,-48,-3,28,63,66,39,16,0,-1,9,14,-7,-34,-33,-19,0,17,9,-8,-40,-66,-55,-12,31,70,70,45,26,1,-13,1,10,-10,-30,-27,-16,3,16,8,-10,-48,-66,-54,-17,25,68,84,60,32,-4,-18,-2,3,-15,-28,-19,-11,-3,8,16,-6,-50,-75,-57,-22,22,76,95,70,38,-1,-27,-10,4,-13,-35,-18,-4,1,11,8,-16,-54,-79,-63,-16,27,78,92,73,53,6,-26,-20,-8,-22,-30,-12,2,-2,0,-1,-13,-43,-75,-60,-25,29,82,95,83,59,3,-31,-23,-13,-28,-32,-12,5,1,-7,0,-21,-56,-71,-53,-22,39,90,94,83,58,9,-19,-24,-26,-42,-43,-4,10,2,-7,-13,-33,-61,-58,-39,-18,37,89,96,87,68,21,-18,-34,-39,-52,-39,-1,8,-4,-12,-20,-38,-53,-52,-36,-15,45,95,92,83,70,30,-13,-35,-48,-64,-48,-5,17,2,-9,-28,-50,-56,-51,-24,-3,42,86,97,84,75,39,-13,-39,-58,-69,-45,1,12,-3,-15,-30,-46,-53,-41,-17,-2,35,87,100,86,80,36,-13,-40,-65,-73,-48,0,13,0,-22,-28,-45,-57,-36,-13,0,38,90,96,93,82,33,-10,-47,-68,-75,-54,-1,15,-3,-23,-27,-43,-52,-33,-9,-2,46,94,98,96,82,35,-21,-53,-69,-76,-57,-5,13,-8,-25,-25,-34,-49,-33,-13,2,52,98,101,100,83,24,-24,-55,-71,-80,-53,-3,10,-10,-29,-17,-35,-47,-30,-13,0,54,104,112,101,71,18,-27,-56,-78,-80,-56,-8,3,-11,-18,-6,-29,-42,-24,-21,0,66,114,110,94,58,7,-35,-62,-71,-78,-68,-19,7,-11,-9,2,-25,-41,-28,-10,19,73,103,106,90,56,12,-40,-70,-75,-86,-73,-16,14,-9,-10,0,-23,-29,-26,-3,25,72,103,106,88,49,11,-46,-76,-87,-94,-71,-8,10,-3,7,1,-23,-35,-19,4,24,69,102,102,81,55,5,-52,-78,-87,-95,-66,-6,3,-5,3,3,-14,-29,-17,1,23,70,111,107,78,52,-5,-63,-77,-78,-95,-70,-14,3,4,3,7,-7,-33,-20,8,24,74,115,104,76,46,-15,-59,-78,-90,-101,-67,-13,6,3,7,22,-15,-36,-11,9,26,78,117,101,72,39,-11,-56,-90,-100,-97,-63,-16,6,8,13,18,-15,-27,-4,7,23,83,116,99,63,33,-9,-67,-100,-93,-93,-69,-15,8,12,22,21,-14,-21,-3,14,29,74,113,97,60,36,-15,-76,-100,-100,-98,-62,-11,11,16,19,22,-8,-18,0,12,21,81,113,92,58,31,-19,-80,-104,-101,-85,-62,-9,10,11,27,27,-7,-25,-1,8,24,77,115,98,54,22,-27,-71,-101,-97,-96,-63,-7,10,19,31,32,-13,-28,-6,13,36,82,109,84,48,25,-18,-76,-106,-97,-94,-63,-8,21,30,35,24,-18,-28,-6,17,37,87,105,76,44,20,-22,-74,-98,-99,-99,-60,-4,22,28,38,27,-20,-31,-8,17,41,86,99,76,45,24,-17,-80,-102,-101,-100,-58,0,21,32,38,24,-12,-34,-11,13,37,89,106,78,41,21,-24,-82,-104,-99,-90,-56,-5,15,28,43,30,-19,-36,0,16,39,82,102,87,48,22,-25,-81,-109,-103,-103,-51,6,14,19,40,30,-20,-34,-2,25,41,79,102,92,56,24,-27,-84,-113,-105,-99,-55,0,14,19,35,28,-17,-32,-2,26,47,86,107,92,56,29,-24,-93,-119,-104,-100,-65,-12,19,33,36,19,-25,-24,3,21,43,88,110,85,57,40,-13,-97,-127,-104,-89,-57,-18,16,29,30,14,-17,-21,-4,7,36,93,112,90,61,39,-23,-96,-116,-88,-83,-59,-16,13,28,29,16,-26,-32,-9,7,38,93,115,91,57,35,-16,-90,-105,-85,-84,-60,-17,16,29,33,11,-29,-41,-16,4,36,94,115,92,59,40,-18,-89,-103,-85,-84,-54,-10,14,24,33,12,-35,-47,-15,9,40,94,111,94,60,34,-18,-85,-96,-84,-87,-58,-9,15,23,33,15,-32,-50,-20,8,43,95,116,93,60,37,-20,-84,-98,-81,-82,-53,-14,9,24,28,7,-33,-44,-18,2,38,97,119,96,60,42,-20,-89,-91,-74,-79,-52,-12,11,20,23,8,-35,-52,-23,4,37,96,115,94,64,41,-15,-80,-91,-75,-79,-54,-10,14,19,26,8,-38,-53,-25,1,33,91,113,99,59,41,-15,-78,-85,-74,-77,-51,-5,13,17,22,13,-38,-55,-24,4,33,88,114,94,61,39,-15,-79,-91,-78,-79,-45,0,13,20,28,13,-37,-56,-20,3,28,82,113,94,61,39,-19,-79,-92,-78,-77,-44,1,17,17,24,11,-36,-55,-24,5,33,83,106,96,68,42,-18,-80,-92,-79,-81,-47,0,16,18,22,10,-37,-54,-20,6,30,82,109,99,70,42,-15,-82,-93,-83,-78,-37,1,16,12,23,12,-37,-55,-22,3,18,78,111,98,66,44,-16,-81,-90,-78,-71,-35,6,17,18,20,12,-38,-61,-24,-1,17,72,106,91,67,40,-15,-72,-86,-72,-73,-36,9,31,21,23,12,-45,-62,-31,-3,15,71,96,87,59,45,-7,-73,-80,-72,-66,-34,14,31,29,23,9,-44,-67,-34,-11,11,68,100,82,57,41,-7,-67,-83,-69,-60,-29,15,35,27,28,13,-48,-67,-29,-16,2,68,97,85,57,40,-8,-69,-86,-63,-57,-32,13,33,24,28,16,-42,-59,-39,-17,7,71,101,86,56,40,-14,-81,-80,-58,-62,-37,11,34,31,26,13,-33,-56,-37,-19,10,75,97,81,55,46,-13,-85,-88,-60,-60,-41,8,32,33,27,14,-31,-48,-37,-19,12,75,102,80,56,43,-14,-87,-85,-61,-64,-37,4,29,32,30,18,-31,-52,-35,-15,9,70,102,82,55,44,-13,-82,-87,-66,-65,-37,11,34,34,25,16,-27,-52,-36,-16,8,66,96,81,59,48,-11,-84,-88,-66,-66,-35,16,37,32,26,16,-31,-53,-37,-13,8,57,95,82,52,47,-8,-79,-82,-68,-69,-33,17,36,36,31,16,-30,-59,-40,-11,3,61,97,78,49,44,-11,-76,-77,-69,-67,-31,19,35,36,28,21,-28,-63,-39,-12,2,53,98,79,49,43,-12,-70,-78,-70,-65,-27,15,40,34,29,24,-30,-64,-38,-12,-6,54,92,80,55,40,-9,-71,-82,-70,-61,-30,21,37,30,34,25,-29,-60,-38,-14,-5,49,90,82,55,38,-8,-68,-82,-72,-60,-28,19,36,33,37,23,-33,-59,-31,-17,-8,45,92,83,49,40,-2,-68,-89,-70,-58,-26,15,35,37,36,23,-28,-54,-35,-19,-14,47,96,82,50,36,-5,-68,-83,-68,-58,-32,14,37,37,35,28,-23,-59,-36,-21,-9,46,91,81,49,39,-7,-65,-85,-67,-56,-36,12,38,37,35,32,-24,-55,-38,-24,-9,46,87,78,49,37,0,-64,-84,-67,-59,-39,15,42,38,35,27,-18,-55,-38,-21,-14,39,84,78,51,40,0,-62,-83,-65,-56,-43,13,44,41,32,30,-13,-54,-43,-26,-13,40,83,75,48,40,3,-62,-79,-60,-57,-45,9,46,43,34,34,-15,-55,-44,-25,-14,37,80,75,47,37,8,-55,-84,-62,-52,-43,13,41,42,39,34,-14,-52,-45,-29,-16,28,81,76,46,36,11,-53,-79,-60,-57,-44,10,43,47,40,34,-10,-54,-50,-26,-18,24,78,74,48,37,10,-51,-75,-63,-55,-38,11,45,47,37,33,-7,-54,-49,-28,-25,22,75,71,50,38,11,-49,-76,-62,-50,-40,8,49,48,36,35,-4,-51,-52,-33,-23,19,69,70,50,37,12,-47,-77,-61,-50,-43,13,50,47,38,35,-2,-50,-53,-33,-22,16,66,69,48,36,15,-47,-75,-59,-54,-43,14,51,51,39,37,0,-53,-52,-33,-24,15,65,66,46,37,14,-46,-74,-59,-56,-42,13,53,50,39,43,3,-51,-56,-34,-24,12,63,68,47,34,15,-43,-74,-61,-54,-45,12,51,50,42,43,6,-52,-57,-33,-25,9,63,69,46,36,16,-43,-76,-62,-51,-45,8,52,53,42,42,3,-51,-55,-34,-28,8,61,67,50,39,19,-44,-76,-60,-52,-45,11,56,53,41,40,4,-49,-58,-35,-28,4,57,67,52,40,19,-39,-75,-60,-52,-44,11,54,58,37,42,7,-50,-59,-38,-27,0,53,68,50,39,25,-36,-75,-63,-50,-44,11,57,55,43,41,7,-51,-60,-37,-32,-1,53,67,51,39,25,-35,-73,-62,-50,-42,11,56,55,43,43,6,-53,-59,-39,-33,-5,49,68,52,40,26,-34,-74,-61,-49,-40,11,56,56,41,43,7,-50,-62,-41,-34,-7,48,67,53,40,28,-31,-72,-63,-47,-39,9,56,57,43,41,10,-50,-64,-41,-35,-12,45,67,52,41,31,-26,-71,-63,-47,-41,8,57,60,43,43,11,-53,-65,-43,-38,-13,44,66,53,42,32,-26,-71,-61,-46,-42,10,58,59,45,44,10,-53,-66,-46,-40,-16,44,67,51,42,33,-26,-70,-59,-44,-40,10,59,61,46,43,10,-54,-67,-47,-44,-19,42,64,52,43,34,-23,-68,-58,-44,-39,11,59,61,44,43,10,-53,-66,-49,-43,-19,39,64,53,42,35,-22,-66,-58,-45,-38,9,57,61,45,43,13,-51,-69,-49,-44,-19,37,64,53,44,37,-21,-68,-60,-44,-39,9,58,62,46,44,13,-51,-70,-49,-43,-21,39,64,54,44,37,-21,-69,-59,-44,-39,8,57,63,46,44,12,-52,-68,-49,-44,-21,38,65,54,44,38,-21,-68,-60,-43,-40,8,57,62,48,44,14,-52,-69,-48,-45,-23,39,66,54,45,37,-20,-70,-59,-44,-41,8,58,63,46,46,13,-53,-69,-49,-45,-21,37,65,55,45,38,-21,-67,-62,-43,-40,6,58,62,49,46,14,-51,-71,-51,-43,-23,36,66,56,45,38,-18,-71,-60,-44,-40,5,56,66,47,46,16,-51,-72,-50,-43,-24,36,66,58,44,40,-18,-70,-62,-44,-42,6,59,63,49,45,16,-51,-70,-51,-45,-24,37,67,55,46,39,-19,-70,-61,-46,-41,7,57,65,48,47,15,-52,-70,-51,-45,-23,37,66,56,45,39,-19,-69,-61,-45,-40,7,57,64,47,45,16,-51,-71,-50,-45,-23,36,66,56,44,40,-18,-68,-62,-45,-41,4,58,64,47,46,18,-50,-71,-52,-44,-25,35,67,56,45,41,-17,-70,-63,-45,-41,4,57,66,47,47,17,-50,-72,-53,-43,-25,37,66,57,45,40,-18,-69,-64,-46,-40,5,59,64,50,46,17,-52,-72,-52,-45,-24,37,67,57,47,39,-19,-71,-63,-46,-41,6,59,66,48,47,15,-53,-72,-52,-45,-21,38,68,57,46,39,-21,-70,-64,-46,-41,9,60,65,49,47,13,-54,-71,-52,-46,-21,41,67,57,46,39,-23,-72,-61,-47,-41,10,61,66,48,48,12,-56,-71,-52,-46,-20,41,70,55,47,40,-26,-72,-62,-46,-40,12,62,65,48,48,11,-58,-72,-52,-46,-19,45,68,55,48,38,-27,-73,-62,-45,-39,14,63,65,48,48,8,-61,-71,-50,-46,-17,45,69,55,47,37,-32,-74,-60,-46,-39,17,64,64,48,48,3,-62,-70,-49,-47,-14,48,69,54,48,33,-36,-73,-59,-47,-36,20,65,65,47,47,0,-64,-69,-49,-45,-12,50,70,54,48,31,-38,-74,-59,-46,-36,23,65,65,49,46,-1,-67,-69,-50,-47,-8,52,69,55,48,30,-41,-74,-59,-48,-33,25,67,64,48,46,-5,-66,-70,-50,-45,-7,52,71,53,47,28,-43,-74,-60,-48,-32,26,68,64,48,45,-5,-68,-71,-51,-45,-3,55,71,54,48,25,-45,-76,-61,-48,-30,31,68,65,48,44,-10,-70,-71,-51,-44,-1,58,70,54,48,23,-49,-77,-59,-48,-29,33,71,63,48,43,-14,-72,-70,-50,-44,2,59,73,52,49,20,-53,-76,-58,-47,-26,37,71,65,47,42,-20,-74,-69,-50,-43,5,63,72,54,46,15,-56,-76,-57,-48,-24,41,74,63,48,37,-23,-74,-68,-51,-42,9,64,73,52,46,10,-57,-76,-56,-49,-21,45,75,64,46,36,-29,-73,-68,-50,-42,15,68,72,53,43,6,-61,-74,-57,-49,-16,49,76,62,45,32,-32,-75,-65,-51,-39,19,70,73,49,43,3,-62,-75,-56,-47,-14,52,77,60,44,32,-35,-76,-66,-50,-37,22,72,73,48,44,1,-66,-75,-57,-47,-9,55,76,60,44,31,-39,-78,-66,-51,-33,26,72,71,48,44,-2,-68,-75,-57,-45,-7,57,76,58,45,28,-40,-79,-66,-50,-32,30,73,68,50,43,-4,-71,-76,-55,-47,-2,59,76,58,46,26,-45,-80,-64,-51,-30,34,75,68,50,43,-11,-72,-74,-55,-46,2,61,77,57,47,22,-50,-79,-63,-50,-27,36,75,69,48,42,-16,-73,-74,-54,-44,4,65,75,56,47,17,-52,-79,-62,-49,-25,42,75,68,49,39,-20,-76,-70,-53,-43,9,66,75,56,46,13,-57,-78,-60,-50,-21,45,76,67,49,36,-25,-76,-70,-54,-42,15,68,75,55,45,9,-59,-77,-60,-50,-17,49,76,65,48,34,-29,-76,-69,-54,-40,17,70,73,55,45,4,-60,-76,-59,-49,-14,49,77,64,47,32,-31,-75,-69,-53,-39,19,70,74,54,44,3,-62,-75,-61,-48,-13,52,76,64,48,30,-33,-78,-67,-53,-36,22,72,72,53,44,0,-63,-77,-58,-48,-9,53,78,62,47,30,-39,-77,-67,-51,-36,25,73,72,53,43,-2,-68,-75,-56,-48,-8,57,78,60,48,27,-41,-79,-64,-50,-36,28,74,72,52,42,-6,-68,-74,-55,-47,-6,59,77,63,45,24,-42,-79,-64,-51,-33,31,74,73,50,41,-8,-70,-73,-57,-46,-3,60,79,60,45,23,-45,-78,-65,-52,-32,35,77,69,50,41,-10,-71,-75,-56,-46,0,63,77,58,45,22,-48,-79,-63,-51,-30,36,76,68,49,41,-12,-71,-74,-54,-46,0,64,76,57,47,22,-50,-79,-63,-50,-31,37,76,68,50,40,-13,-74,-73,-53,-46,1,64,76,56,47,20,-51,-81,-62,-50,-28,39,75,68,47,41,-15,-75,-73,-53,-43,3,65,75,55,45,19,-54,-79,-61,-49,-26,38,76,65,46,40,-17,-74,-73,-51,-43,4,65,73,55,42,19,-52,-78,-62,-47,-25,38,74,65,46,38,-16,-74,-70,-53,-40,4,63,74,54,43,17,-51,-77,-62,-47,-24,40,73,65,46,37,-16,-72,-71,-53,-41,5,64,72,54,43,17,-51,-77,-61,-47,-25,38,75,64,47,37,-16,-72,-71,-52,-41,4,62,73,54,44,17,-50,-76,-61,-46,-26,38,73,65,46,38,-16,-71,-69,-52,-41,2,63,72,54,45,18,-50,-76,-59,-47,-26,36,74,63,48,39,-15,-72,-70,-50,-43,2,63,71,54,45,19,-50,-78,-59,-45,-28,36,74,64,46,40,-13,-74,-69,-48,-42,0,61,75,52,45,21,-50,-78,-57,-44,-31,33,75,65,45,41,-12,-72,-71,-47,-43,-2,61,73,54,42,23,-46,-77,-58,-45,-30,31,72,66,45,40,-8,-69,-70,-50,-41,-5,59,73,54,43,24,-43,-75,-60,-46,-31,29,73,64,46,40,-6,-69,-69,-50,-43,-6,57,73,54,44,24,-41,-75,-60,-45,-33,27,71,64,47,39,-3,-66,-71,-49,-43,-9,53,73,55,43,27,-39,-74,-60,-45,-33,23,70,66,47,40,-2,-64,-70,-51,-43,-10,52,70,56,43,27,-35,-74,-60,-45,-34,20,67,66,46,40,1,-61,-70,-50,-42,-14,48,71,56,42,29,-32,-72,-59,-45,-36,17,66,65,47,40,3,-58,-69,-50,-43,-16,46,70,55,43,30,-27,-70,-60,-44,-37,10,62,66,46,39,9,-52,-69,-50,-42,-22,39,69,57,41,33,-19,-67,-62,-43,-39,3,60,66,47,39,15,-48,-68,-51,-42,-27,35,68,58,42,35,-14,-65,-61,-45,-41,0,58,65,49,40,19,-44,-68,-51,-44,-29,30,66,59,44,35,-8,-62,-61,-45,-42,-5,53,66,50,40,22,-36,-66,-54,-43,-32,23,64,59,43,36,0,-58,-62,-47,-42,-11,48,65,52,40,26,-29,-66,-56,-44,-34,17,62,60,45,37,4,-52,-64,-48,-41,-15,43,63,54,40,28,-21,-63,-57,-45,-35,9,56,61,47,36,12, 21 | // Tail 22 | -53,-66,-49,-43,-19,39,64,53,42,35,-22,-66,-58,-45,-38,9,57,61,45,43,13,-51,-69,-49,-44,-19,37,64,53,44,37,-21,-68,-60,-44,-39,9,58,62,46,44,13,-51,-70,-49,-43,-21,39,64,54,44,37,-21,-69,-59,-44,-39,8,57,63,46,44,12,-52, 23 | 24 | 11,12,15,22,13,1,-5,22,37,25,0,-18,-30,-40,-29,-30,-35,-49,-52,-35,-17,11,11,28,18,-4,-16,-38,-26,-32,-32,-12,3,4,20,34,37,36,26,15,0,0,-18,-21,1,10,0,-3,-8,-7,-8,-18,-25,-38,-46,-50,-41,-36,-25,-12,6,22,11,23,13,11,25,16,10,-5,-15,-33,-58,-92,-78,-54,-32,-23,-30,3,10,12,21,32,20,31,22,27,57,71,80,71,74,72,79,69,63,46,30,32,13,-23,-28,-21,2,31,35,30,3,-18,-29,-20,-5,11,11,16,23,28,32,41,54,54,31,29,51,41,14,2,4,-9,-26,-34,-40,-41,-1,6,-6,-5,-17,-16,-32,-29,-19,-12,0,-14,-10,-4,-18,-1,3,-9,-2,-7,-16,-17,-20,-20,-17,-7,-3,5,5,7,8,-1,20,26,8,-4,0,15,5,3,17,4,-2,5,3,-13,-23,-13,-9,-13,-22,-16,-5,-6,6,20,31,26,29,32,32,21,18,35,11,-14,-36,-59,-67,-58,-49,-13,0,-15,-15,-3,6,-13,-16,-15,-14,-10,-32,-32,-14,-25,-23,-41,-72,-69,-44,-25,-9,-7,2,5,-10,-14,-19,-8,-4,-3,-9,-6,-14,-23,-4,2,4,17,35,24,18,7,-5,-32,-57,-61,-64,-51,-21,32,37,38,50,38,23,25,-6,-22,-27,-17,0,2,12,18,45,30,34,21,18,7,1,-5,6,34,23,14,-5,0,12,16,-5,-25,-34,-12,-6,-15,-21,-3,27,47,65,53,34,33,6,-25,-23,-18,-11,-4,-3,4,24,22,25,37,29,20,-21,-45,-52,-57,-55,-61,-50,-29,2,5,11,10,17,14,14,14,21,35,32,36,27,11,-31,-60,-77,-71,-65,-55,-23,-1,-6,-17,-23,-26,-15,-18,-24,-26,-19,1,3,6,21,25,-2,-7,-6,-15,17,19,28,36,18,1,-12,-13,-5,12,33,28,19,2,-20,-23,-33,-43,-25,-10,-9,-6,-8,2,9,34,39,16,20,23,23,22,24,9,-2,15,21,8,30,23,0,9,5,14,7,21,28,20,23,7,2,0,6,0,-13,-31,-30,-22,5,37,31,22,8,-14,-25,-36,-31,-29,1,22,24,36,52,90,90,86,63,44,21,19,34,52,61,51,57,53,49,30,16,18,24,25,38,46,48,31,29,24,3,9,-3,-17,-38,-39,-34,-27,-30,-31,-31,-22,-17,-14,0,5,26,13,17,10,2,-18,-38,-53,-33,2,19,31,24,40,2,-11,-12,-25,-20,-19,-13,-8,-25,-23,-35,-40,-47,-55,-51,-61,-40,-24,9,31,27,-15,-16,-3,-25,-53,-39,-39,-31,-4,-29,-29,-25,-9,-14,-4,7,10,2,-16,-36,-73,-85,-81,-57,-38,-25,-10,8,23,21,21,9,-10,-3,-5,-12,-11,-17,-18,-21,-12,-1,-12,-8,0,8,33,33,15,9,7,-19,-15,-18,-29,-20,-29,-21,-4,17,30,33,31,11,-4,-5,12,22,29,44,54,59,45,40,47,45,35,5,-40,-59,-75,-74,-42,-29,-9,5,22,41,33,29,11,11,31,31,2,-15,-24,-48,-54,-52,-34,-20,0,-2,0,12,15,8,4,7,8,4,-10,0,1,1,-7,-6,-25,-30,-22,-12,-19,-17,3,0,18,38,41,19,28,8,-3,26,39,48,36,32,29,38,37,37,58,55,67,80,81,76,63,25,17,8,-10,10,2,5,2,-6,-24,-22,-12,-5,-16,-51,-56,-65,-61,-49,-16,7,21,28,30,41,53,57,53,50,27,21,25,22,14,36,68,58,45,22,0,-6,-6,-16,-19,-10,-18,-23,-43,-54,-46,-38,-18,3,7,17,2,-12,-12,-29,-22,-16,-15,-17,-21,-31,-8,8,18,7,-7,-2,-18,-35,-40,-32,-35,-45,-42,-36,-32,-11,-12,-10,-3,7,-4,4,-6,-4,12,-2,2,6,3,-4,-19,-45,-26,-36,-41,-38,-30,-28,-31,-44,-36,-20,-15,-13,-21,-14,-25,4,15,17,9,2,-4,-18,-43,-67,-73,-52,-21,-3,6,-13,3,15,0,-2,-12,-17,0,-6,-4,10,14,18,23,35,19,9,17,14,23,38,38,21,3,15,6,-18,-23,-15,-11,-18,-34,-41,-41,-55,-27,-29,-41,-26,-8,14,13,37,24,21,22,8,27,9,6,9,10,28,47,52,46,55,51,45,32,19,11,8,-1,0,-1,-15,16,26,29,35,16,8,15,12,4,-11,-12,-11,-14,5,5,25,39,36,29,38,36,21,4,-7,5,-12,-1,10,-10,-23,-35,-41,-28,-20,-16,-6,-21,-33,-29,-10,-10,-4,21,30,51,47,28,27,15,3,25,32,33,31,11,7,16,18,8,-13,-44,-40,-33,-17,2,11,7,2,11,28,37,12,-1,-3,-8,9,16,30,12,-6,-16,-18,11,17,18,-14,-31,-46,-40,-24,-10,-8,6,30,17,25,28,12,5,-9,-12,-7,-18,-27,-15,24,28,38,22,20,10,-8,-19,-16,-27,-25,4,20,25,-17,-21,-33,-14,-6,-1,-10,-26,-33,-25,-5,5,14,9,13,5,-8,-22,-25,-25,-4,2,3,-4,6,28,55,60,58,65,58,57,58,64,22,-1,-29,-68,-65,-66,-46,-39,-37,-14,-20,-30,-29,-52,-65,-64,-43,-33,-37,-24,-18,-8,-19,-9,-7,-5,1,-2,-6,4,17,14,6,1,5,-4,9,-11,-18,-22,-11,0,-16,-33,-57,-57,-56,-43,-21,-28,-21,16,23,56,82,83,80,73,43,18,-1,-17,-5,-11,-2,-4,-10,-27,-53,-53,-51,-50,-31,-4,-5,1,16,14,30,46,37,23,21,4,10,4,-6,9,3,6,-6,-16,-7,0,8,10,4,-1,-20,-31,-30,-35,-46,-66,-74,-57,-11,13,32,50,56,67,68,41,23,12,-6,2,-9,-4,-10,-1,8,16,25,6,2,-8,-1,-18,-10,-1,12,22,27,18,10,4,-29,-33,-23,-6,-27,-19,-30,-38,-41,-11,19,33,46,33,35,-1,11,27,38,29,14,13,34,51,38,51,39,4,-15,-4,14,41,30,28,32,17,-12,-45,-47,-49,-48,-35,-20,-6,0,15,22,21,31,13,31,60,29,12,-3,-15,-8,-13,-7,-7,1,13,22,2,3,3,12,20,23,41,21,36,33,33,25,35,43,19,22,20,20,9,-7,-6,2,5,6,0,4,-12,-13,-4,-12,7,35,59,56,36,22,10,-17,-14,6,5,9,3,-12,-10,-26,-20,-15,-12,10,-16,-25,-19,-8,-9,-23,-30,-23,-23,-7,32,22,11,15,-1,-7,-17,-22,-24,-31,-27,-29,-27,-25,-20,-14,-16,-20,-20,-12,2,4,-11,-24,0,-8,-11,4,9,2,2,-1,-31,-45,-79,-85,-108,-116,-99,-84,-65,-74,-54,-31,-34,-34,-32,-24,-26,-38,-38,-25,-27,-32,-53,-70,-65,-59,-25,-20,-17,-26,-45,-39,-49,-39,-17,-1,11,-1,6,15,6,9,12,1,1,28,20,35,31,5,-22,-39,-18,7,20,19,19,-1,9,13,14,19,35,33,31,42,41,60,73,75,53,33,40,43,32,22,24,12,-2,9,6,-5,-7,3,8,30,37,37,26,6,-2,-2,20,19,30,24,23,6,12,15,24,42,30,49,51,54,44,23,12,9,0,11,20,26,20,10,15,6,26,38,21,23,30,18,-1,1,13,-5,-27,-21,-15,-38,-25,0,-18,-9,18,40,51,45,39,49,35,6,0,-9,-16,-6,-1,-9,-11,-8,6,31,30,9,5,-7,-18,-2,10,17,23,13,-9,-16,-12,7,29,17,-1,-14,-9,9,17,19,29,23,8,6,19,37,14,-31,-42,-41,-35,-53,-43,-28,-42,-36,-34,-13,2,12,8,10,5,-5,0,-10,-11,-3,0,10,-3,-9,-4,-4,6,0,-14,-20,-9,-26,-43,-43,-27,-13,-29,-29,3,28,35,20,6,-16,-20,-25,-22,14,27,23,22,38,6,-4,-16,-33,-41,-47,-36,-18,3,14,25,14,20,11,11,20,8,-5,-21,-29,-26,-35,-19,-24,-29,-10,2,10,-5,-4,2,20,31,29,30,38,34,34,25,9,-1,-9,-17,-5,-7,-17,-2,4,12,24,24,20,39,20,0,0,13,16,11,12,-6,-12,-16,-34,-50,-54,-46,-33,-25,-19,-16,-19,-16,1,14,17,15,11,7,9,2,2,7,-2,-16,-39,-53,-51,-46,-39,-11,0,-14,-13,-5,6,11,8,21,9,-15,-8,-26,-46,-48,-51,-48,-36,-19,-17,-1,11,24,40,40,47,38,21,-2,-10,-18,-27,-15,-19,-9,-23,-2,-1,-9,11,-4,7,12,7,6,-13,-21,-4,-16,-15,-12,-20,-25,-23,-27,-21,-4,5,-8,-29,-17,-14,7,18,8,10,8,-14,-1,21,41,61,69,56,34,41,29,34,31,20,9,-7,-18,-19,-28,-48,-40,-40,-41,-46,-43,-27,-22,-6,3,12,1,0,-1,-6,-7,-32,-20,-20,-4,0,1,-7,-18,0,-11,1,7,20,37,27,6,6,9,-2,2,9,9,16,39,48,37,41,40,12,-3,4,17,15,15,6,11,27,31,24,0,-2,15,25,45,66,43,32,29,30,46,48,47,33,26,24,10,-22,-31,-19,-29,-48,-38,-47,-65,-52,-23,-3,-8,-26,-42,-28,-29,-8,-8,3,9,10,29,44,60,66,89,70,57,36,12,4,1,2,-11,-29,-32,-8,4,-1,-10,-21,-25,-33,-28,-16,-15,-16,-25,-30,-9,7,11,21,13,12,20,32,26,18,19,11,4,5,9,3,-5,-3,-4,6,5,-19,-4,-20,-37,-46,-49,-61,-76,-73,-61,-14,14,16,4,-5,-5,-2,10,24,10,7,2,12,11,-9,-5,14,48,54,73,64,35,19,-6,-11,-40,-38,-24,-33,-25,-40,-31,-11,-12,-9,1,9,10,2,-9,-18,-20,-23,-17,11,54,66,72,80,66,60,42,29,13,5,25,19,6,14,-1,2,16,15,5,-14,-15,5,17,10,11,13,26,29,26,12,-11,-29,-64,-62,-50,-44,-35,-55,-45,-33,-15,-19,-15,-4,-9,10,15,32,19,-5,-23,-24,-22,-23,-33,-48,-48,-54,-43,-10,6,13,17,14,27,20,18,17,21,16,4,-11,-21,-16,-22,-20,-30,-36,-22,-27,-37,-23,-18,-15,-15,7,17,3,3,-9,-22,-33,-36,-22,-4,-4,-2,2,-3,23,22,9,-4,-17,1,14,35,30,18,-12,-34,-28,-18,-8,8,16,14,22,9,8,7,23,9,-46,-59,-52,-43,-19,-20,-25,-37,-35,-26,-39,-30,-1,14,11,11,1,5,-23,-46,-41,-51,-42,-32,-10,-2,-4,-3,3,32,46,56,60,46,43,34,21,36,60,61,50,45,30,17,4,-12,-26,-32,-41,-45,-33,-38,-19,-6,19,53,79,83,71,66,60,40,21,21,9,14,4,10,4,0,-1,-12,-9,-5,3,18,24,17,20,32,35,21,40,39,18,18,26,21,32,33,19,17,5,-1,-19,-25,-26,-32,-33,-26,-18,-2,13,5,13,17,-7,-6,0,14,8,-14,-10,-29,-35,-37,-25,-25,-32,-18,-30,-37,-23,-3,11,16,7,-14,-27,-33,-39,-51,-51,-46,-46,-22,-10,-3,-9,-18,-17,-25,-18,-14,-12,3,15,12,3,11,16,11,-12,-40,-51,-47,-23,-6,20,31,41,42,32,-5,-26,-27,-23,7,11,11,7,-2,-17,-48,-47,-40,-47,-49,-43,-17,-13,1,1,13,31,53,56,36,22,26,37,31,44,45,72,38,15,6,-7,-5,-21,-15,-13,4,16,32,36,25,31,30,36,15,-10,-17,-40,-36,-20,-18,-19,-23,-9,15,20,25,7,-6,-9,2,0,22,43,26,23,-6,0,-9,-6,-5,-3,1,-5,-1,-2,-13,-30,-20,-25,-8,-12,-22,-20,-19,-16,-23,-3,5,27,52,61,40,18,6,3,25,4,8,19,22,41,55,43,30,20,2,-3,-17,-12,-4,-1,2,15,25,33,21,5,9,-7,-28,-44,-46,-41,-17,0,30,49,33,38,35,43,52,56,40,4,1,12,2,-3,-2,-7,-18,-30,-14,-14,-25,-29,-29,-13,-7,27,47,45,32,23,10,-7,-5,-17,-13,-33,-29,-27,-15,-8,-13,0,7,27,23,21,24,41,45,49,51,22,0,11,5,3,-16,-23,-1,12,32,35,54,14,1,2,-21,-16,-22,-30,-34,1,9,-4,-5,-14,-18,-38,-43,-20,-6,0,-18,-26,-14,-9,-16,-26,-12,2,4,-2,-18,-12,9,22,30,28,0,-27,-21,4,0,-4,13,2,3,-6,-13,-4,-5,-12,-37,-52,-41,-21,-21,-11,-7,-9,4,-3,6,-4,-12,-19,-31,-22,-29,-16,-20,-32,-27,-22,-15,-23,-39,-32,-27,-45,-23,-13,-11,-2,-9,6,6,31,44,43,41,19,8,-14,-19,-22,-31,-30,-24,5,0,-4,0,-5,1,-7,5,14,25,6,-3,-14,-26,-27,-22,-24,-41,-33,-30,-43,-36,-10,-17,-13,-8,15,14,24,27,5,0,-25,-13,14,19,25,12,-2,5,8,19,30,19,1,-4,-22,-30,-28,-17,-5,20,41,9,-5,-2,-22,-40,-39,-24,-21,-13,-16,-20,-13,4,17,8,7,6,-3,-13,-28,-38,-32,-26,0,11,12,2,14,38,54,47,31,45,41,25,8,-2,5,1,-12,-30,-42,-43,-55,-27,-3,11,12,8,7,24,28,13,14,-16,-32,-47,-45,-47,-56,-42,-47,-30,0,14,8,26,15,4,18,37,52,39,41,5,19,37,39,48,57,38,10,1,-19,-23,-11,25,44,48,32,36,12,-18,-44,-49,-27,-18,17,22,16,29,35,18,8,-5,7,20,27,57,34,41,44,30,28,11,-9,-34,-42,-44,-34,-56,-66,-33,14,47,65,87,63,44,10,-10,0,0,12,21,26,37,35,28,28,3,-8,-6,-8,-9,38,56,46,40,39,62,42,14,8,15,13,10,13,20,20,18,-29,-47,-49,-55,-46,-25,-9,-18,-6,9,21,20,27,19,28,25,13,6,-11,-7,3,-12,-20,-18,-23,-4,11,0,-6,11,10,0,-25,-37,-41,-43,-34,-33,-10,1,7,-2,-7,11,31,29,23,23,18,29,17,2,5,9,7,-16,-43,-33,-42,-29,-16,-16,-39,-70,-68,-65,-23,-4,11,12,24,25,20,8,-20,-15,-10,11,16,19,14,-25,-28,-8,2,5,-4,6,14,-2,-10,-19,-28,-20,-26,-19,-30,-33,-23,-25,-3,-5,-13,-2,8,-11,-38,-36,-31,-40,-50,-40,-38,-43,-43,-22,0,27,44,7,-3,-12,-20,-32,-31,-8,-6,-4,-10,-2,-19,-15,0,0,-11,-12,12,12,1,-18,-34,-33,-27,-4,22,45,59,69,76,81,86,71,53,29,21,13,25,34,9,20,15,9,19,19,34,28,26,28,46,32,17,21,1,-7,-15,-1,16,34,22,9,-12,-32,-27,-20,-23,-42,-64,-67,-52,-33,-15,-17,-8,-5,5,16,-3,-31,-43,-38,-42,-51,-31,-5,4,16,22,20,39,46,33,12,-11,-28,-35,-32,-48,-42,-44,-44,-33,-25,-23,-30,-32,-16,-11,-2,16,23,35,25,37,52,58,54,42,33,11,-35,-61,-46,-30,-23,-13,6,3,-3,-13,-12,0,13,-1,-1,-1,-6,16,18,20,22,24,22,6,7,19,17,21,16,7,10,20,12,-11,-19,-7,-14,-28,-16,-10,2,17,20,10,24,27,40,40,36,13,-21,-18,-14,13,23,28,25,15,3,8,4,-2,-19,-31,-32,-25,-17,-20,-33,-34,-28,-23,-13,-21,-4,-10,-26,-33,-39,-47,-25,25,54,41,25,4,-23,-43,-50,-26,-9,20,33,34,44,26,0,-7,-13,-3,-13,-14,-17,-29,-22,-29,-5,24,34,49,64,72,75,72,59,48,19,-3,8,6,1,0,-9,-29,-37,-33,-16,-8,-26,-25,-11,26,29,20,23,19,2,-15,-2,16,33,25,18,7,1,-4,-19,-14,-11,-15,-3,8,-17,-16,-9,-6,5,0,13,17,7,-3,-15,-22,7,19,6,17,6,3,0,0,-12,1,28,28,-1,-2,6,8,40,39,23,-1,-10,-25,-23,-29,-9,11,17,32,34,25,9,13,2,-6,-11,2,10,2,18,27,13,19,4,-10,-18,-22,-3,-3,-12,14,30,49,66,54,44,25,16,-16,-31,-17,-10,1,8,22,26,34,45,18,1,-1,15,-3,-28,-14,0,10,11,4,-17,-6,0,-4,-4,5,-8,-30,-43,-27,-27,-55,-63,-60,-33,-14,-16,-29,-31,-55,-48,-28,-28,-38,-22,-7,2,-1,-13,-4,-29,-29,-27,-35,-39,-33,-32,-38,-48,-42,-26,-24,-4,-1,1,-10,-26,-15,-16,-10,-12,-17,-3,0,-21,-39,-62,-79,-69,-47,-17,2,18,20,32,46,33,32,39,51,70,69,68,59,43,34,24,14,18,16,21,20,19,28,-2,-12,-4,18,28,31,32,21,15,9,-7,-26,-39,-40,-13,-15,-11,-7,-16,-5,20,33,27,8,0,21,26,14,28,48,60,46,43,33,21,25,2,-15,-25,-28,-17,7,17,34,39,58,50,32,25,14,11,7,5,-13,-10,-28,-17,-17,-16,-25,-26,-31,-36,-11,-9,18,30,42,38,29,10,11,19,10,8,11,20,11,9,11,32,23,24,12,-4,12,4,-10,-19,-11,-14,-37,-53,-55,-57,-56,-39,-44,-38,-41,-58,-62,-82,-61,-29,-21,-22,-15,-19,-4,-9,-13,-9,-31,-45,-65,-59,-47,-11,1,15,20,35,24,8,23,17,16,10,3,-8,1,-16,-11,-9,14,41,32,30,13,25,24,10,-9,-27,-21,0,7,-5,-41,-46,-49,-66,-48,-64,-66,-53,-55,-52,-32,7,19,-7,-11,-4,-11,13,28,56,73,55,30,-3,-19,-24,-17,3,9,16,22,2,9,9,10,-6,-45,-69,-78,-63,-66,-67,-43,-22,0,22,21,18,-13,-18,-21,-24,-7,4,8,14,21,15,20,23,33,13,-9,-16,-9,-5,0,22,0,-42,-43,-44,-36,-39,-41,-17,-8,15,12,10,14,11,5,13,19,23,31,24,14,4,3,-15,-26,-38,-19,1,0,3,10,27,37,37,20,3,5,29,58,60,54,38,26,18,1,22,20,34,30,16,33,44,51,71,105,78,49,37,28,14,6,12,0,2,20,26,42,57,73,68,70,56,26,22,22,37,38,47,61,49,47,54,41,42,35,34,21,12,9,10,10,7,13,4,17,35,54,44,21,13,26,16,6,4,-14,-25,-43,-46,-51,-40,-34,-14,0,23,37,29,33,27,38,29,30,29,9,-8,1,-13,-11,-7,5,29,15,-6,-3,18,-10,-32,-40,-31,-43,-53,-65,-75,-88,-86,-74,-50,-45,-61,-35,-20,-11,-8,-1,-17,-22,-1,-10,-4,11,7,36,40,55,48,29,18,6,14,6,11,16,19,5,-2,-4,7,2,-6,-25,-43,-45,-41,-30,-25,-19,-4,17,25,28,28,29,36,49,19,8,2,-12,-17,-27,-19,-20,0,1,-27,-26,-11,-3,-16,-6,0,-22,-15,-10,-26,-42,-29,-10,-1,22,41,40,48,42,8,-18,-37,-51,-57,-63,-42,-34,-31,-8,-15,-9,-3,-13,-12,-16,-19,-31,-32,-34,-48,-31,-27,-39,-56,-60,-49,-44,-60,-38,-26,-29,-14,-6,2,0,4,-6,-24,-43,-56,-76,-56,-52,-45,-48,-50,-41,-51,-18,-33,-8,13,16,21,18,13,-14,-18,-19,-22,-31,-15,-20,-34,-25,-15,-28,-35,-30,-24,-3,12,17,0,4,-8,-31,-28,-23,-28,-21,-2,-10,-5,2,7,22,27,22,11,-26,-30,-15,-7,19,60,84,101,101,70,62,56,44,37,30,16,3,-5,0,-7,0,17,21,23,29,38,24,6,9,16,22,44,43,39,20,20,0,6,16,-19,-26,-41,-32,-29,-18,-14,-31,-43,-30,-1,10,25,40,22,4,0,-14,-37,-41,-24,6,41,54,66,57,51,41,26,25,22,19,0,-6,-4,-19,-8,17,13,8,4,-6,-13,-6,-12,-14,-9,13,34,44,52,38,33,38,26,2,1,10,10,17,28,17,29,31,25,24,17,10,-11,-30,-35,-26,-32,-9,-8,-29,-20,4,7,29,41,37,63,63,61,48,62,66,33,35,38,11,13,15,13,-5,-15,0,-22,-31,-25,-11,-3,-8,-20,-6,38,36,5,2,13,0,-14,8,6,-7,13,3,0,18,18,19,27,41,43,44,39,15,11,10,8,-7,-12,-8,-29,-31,-20,-21,-20,-34,-23,-25,-43,-50,-57,-38,-33,-35,-33,-20,-18,-16,-27,-39,-24,-5,-5,-24,-24,-34,-44,-62,-68,-69,-78,-50,-25,-1,-5,-3,11,4,2,-8,-24,-18,-17,-30,-30,-20,-16,-12,-1,-34,-44,-41,-27,-18,-2,36,59,82,45,32,26,19,11,3,0,-3,8,4,16,21,26,19,5,12,1,9,10,1,-4,-19,-5,-8,-7,7,20,17,8,12,19,1,-14,-8,-14,-5,-8,-20,-3,6,-17,-38,-53,-53,-55,-52,-29,-6,22,59,80,62,54,17,7,18,-2,-15,-20,12,21,9,7,17,13,18,10,4,-1,-5,-12,-41,-29,-24,-25,-11,4,14,21,60,81,65,72,60,42,18,5,16,28,36,37,28,4,-3,-6,-4,14,9,0,9,16,40,35,42,31,13,12,-2,-12,-13,-18,-19,-28,-19,17,36,63,74,60,36,10,-13,-21,-37,-35,-29,-7,-12,-15,2,0,0,5,12,-7,-4,-13,-4,11,16,-12,-33,-28,-19,-25,-25,-18,-21,-9,-29,-28,-45,-46,-23,-13,-11,-5,9,26,26,25,9,-6,-19,-42,-44,-36,-1,9,21,24,29,15,-14,-55,-83,-64,-34,5,26,43,53,42,22,13,3,-8,-6,4,-16,-39,-58,-78,-66,-43,-17,10,10,10,29,30,12,-5,-9,-18,-16,-4,-2,2,-4,-5,-9,-18,-3,6,11,17,11,-14,-27,-38,-59,-69,-64,-45,-35,-26,9,7,-29,-32,-44,-28,-9,-25,-43,-46,-22,-2,13,28,19,12,18,15,6,14,3,7,19,19,14,7,13,-3,4,6,-6,-20,2,23,22,13,6,12,23,54,31,15,19,8,-6,-30,-29,-31,-19,-5,-8,5,-2,-3,-11,-10,-18,-20,9,38,34,13,23,6,-15,-34,-39,-44,-36,-26,-18,7,14,17,14,21,18,14,36,34,26,18,10,-2,2,12,-8,-29,-43,-49,-59,-49,-31,-31,-36,-18,-12,-17,2,32,28,31,48,53,68,57,61,59,53,49,32,13,9,1,-4,-14,-32,-11,-5,4,-3,2,27,24,6,12,3,-31,-23,-17,-18,-3,20,20,17,7,4,-5,-8,-12,-10,-13,-18,-4,2,27,18,12,-10,-22,-18,-20,-32,-37,-22,-14,5,-1,-10,-18,-21,-9,-27,-39,-25,-21,-16,0,4,23,16,-9,15,22,27,24,7,-9,-22,-24,-19,-21,-28,-6,9,0,0,-4,-1,3,-5,-9,6,13,-1,11,-6,-35,-27,-23,-15,-12,-22,-37,-50,-39,-25,-3,14,35,17,21,39,9,16,30,37,38,31,7,1,1,-2,9,11,-2,11,15,18,16,12,11,11,30,22,23,18,2,-20,-22,-15,-5,-7,4,24,39,60,78,65,50,60,42,56,58,45,18,18,25,27,33,31,17,-7,-9,-12,7,20,14,0,-16,-17,-6,-11,-1,15,4,-12,-3,13,12,23,34,11,1,0,-18,-27,-7,-5,-9,-4,-20,-16,-20,-2,-4,4,-1,-7,-34,-46,-4,0,25,24,12,24,34,33,41,23,17,10,-8,-15,1,-4,-16,-7,-15,-20,-8,-11,-6,-12,-30,-3,-3,4,-6,-9,-10,12,25,32,52,52,38,15,0,-26,-36,-24,6,15,27,8,7,13,5,-3,-3,8,3,-1,2,-4,-22,-37,-49,-32,-10,-10,-32,-45,-56,-51,-45,-35,-22,-10,0,-17,-12,2,19,18,13,21,22,22,19,21,10,-1,-35,-49,-49,-30,-12,-4,0,-26,-25,-29,-31,-29,-21,-18,-5,-8,-8,-12,-19,-31,-49,-27,-22,-25,-18,-8,-35,-51,-47,-50,-39,-15,-25,-24,-7,-4,-16,-56,-74,-74,-73,-60,-57,-56,-17,13,0,-4,29,27,14,10,14,25,7,2,-13,-4,1,-12,3,-13,-8,-12,-19,5,20,14,8,-9,-3,4,0,-5,-21,-23,-24,0,-5,10,20,9,24,47,65,61,36,23,20,32,31,28,42,39,49,42,40,7,-18,-35,-36,-5,17,7,-13,-22,-26,-10,14,48,66,82,87,67,34,16,4,-28,-45,-48,-72,-80,-71,-72,-65,-43,-14,-4,25,45,44,50,48,38,8,-16,-34,-19,-1,10,28,52,69,56,57,30,15,20,16,18,8,0,1,-24,-24,-6,-4,20,32,39,23,18,22,22,28,36,30,14,19,22,13,28,21,-1,-3,1,12,22,47,54,62,38,14,-2,-17,-1,2,-5,4,12,2,10,25,28,28,5,-23,-25,-21,-14,-12,-5,5,23,14,15,2,-31,-38,-52,-71,-67,-63,-57,-61,-47,-36,-60,-38,-13,19,37,41,34,15,19,9,-3,-6,10,20,12,19,29,9,-12,-13,-18,-42,-25,-3,-17,-22,-16,-24,-31,-19,-8,15,10,9,16,20,8,0,9,8,4,-8,-9,-28,-32,-16,-15,-15,-42,-28,4,-4,7,-3,5,26,23,-9,-21,-14,-9,-8,-5,-8,-41,-44,-29,-30,-47,-37,-48,-63,-61,-39,-25,-10,-3,2,5,-2,-3,7,-10,-28,-12,-41,-23,-5,-22,-30,1,23,26,39,29,5,3,9,14,4,-25,-26,-13,22,33,16,-12,-18,-7,-6,4,2,-12,-20,-10,-18,-14,17,39,13,19,33,7,5,-3,18,28,27,32,11,-13,-26,-40,-32,-16,7,29,45,62,69,75,70,87,86,61,36,3,-31,-13,-20,-3,8,-4,-10,-16,10,14,7,-2,9,1,-2,10,27,37,22,13,12,24,21,3,18,17,3,-1,0,-10,-23,-20,-18,-16,-9,6,26,41,16,-2,-48,-64,-64,-69,-59,-43,-35,-34,-20,-20,-3,-16,-18,-7,1,19,32,48,56,47,48,25,-4,-8,-19,-24,-40,-44,-52,-56,-56,-59,-63,-42,-17,-6,-9,-14,1,-6,1,1,-12,-54,-63,-78,-78,-51,-48,-20,-14,1,8,5,2,-12,-35,-31,-10,0,22,37,30,40,56,47,36,46,32,21,38,50,37,31,10,3,17,6,18,6,10,16,15,23,45,41,37,41,42,34,20,18,-1,-10,-14,23,33,37,44,45,32,11,3,6,-3,-8,-2,-6,-6,0,11,11,26,14,5,-13,6,57,74,70,78,86,58,45,24,23,30,2,-21,-12,0,13,20,26,11,10,-3,-13,-22,-40,-16,-5,-6,-1,17,41,59,64,70,50,40,20,0,6,0,-1,-3,-9,-30,-46,-48,-33,-24,-7,10,20,35,29,40,36,15,-1,-27,-39,-45,-31,-22,-40,-43,-31,-29,-30,-30,-19,-26,-37,-49,-49,-44,-54,-55,-61,-49,-46,-55,-64,-47,-51,-35,-19,-32,-8,-8,-28,-48,-44,-30,-7,6,8,11,-5,-22,-20,-13,-15,-51,-50,-32,-44,-39,-35,-21,-13,-14,-16,-26,-22,-32,-33,-14,-9,21,39,41,35,19,11,14,26,28,36,35,28,15,0,-15,-37,-56,-60,-35,-32,-30,-14,7,15,15,39,46,10,-13,-6,-5,5,19,25,9,-10,-12,-19,-33,-9,-6,-8,-4,7,14,19,29,14,4,-12,6,-4,-10,-7,14,30,27,36,44,38,-3,13,21,17,16,-10,-17,-11,-32,-32,-41,-41,6,17,27,25,18,31,37,14,-13,-12,-14,-6,14,14,13,21,19,8,-7,-11,-7,-5,-2,5,12,20,31,38,30,17,43,63,74,59,37,46,23,13,1,4,10,7,-4,-11,-12,-12,7,-2,-2,-5,10,17,24,28,25,22,3,20,41,31,27,40,42,33,35,37,31,35,31,21,18,11,11,33,26,23,1,-12,-12,-10,0,-11,-8,-23,-19,-6,2,13,4,12,14,19,21,3,0,-11,-36,-53,-36,-27,-12,8,24,12,6,16,9,9,-1,12,12,13,9,17,13,1,-19,-29,-20,-29,-2,24,34,41,38,18,1,-36,-36,-30,-51,-36,-43,-60,-37,-24,-36,-23,-13,1,8,10,27,21,24,21,-1,-11,-17,-49,-60,-56,-58,-49,-45,-45,-46,-44,-34,-25,-16,13,25,0,1,4,-2,0,-27,-39,-39,-37,-49,-54,-54,-61,-61,-46,-35,-24,-21,-32,-37,-39,-15,-14,-18,-16,-15,-22,-10,-7,-2,-2,-2,-7,-14,-25,-54,-62,-52,-38,-32,-9,-12,7,28,28,24,19,21,36,40,31,5,-11,-23,-38,-31,-48,-36,-23,-35,-24,-14,-10,6,-18,-15,7,13,30,15,12,17,23,46,44,44,30,15,13,-7,0,15,29,18,21,37,30,43,50,34,44,51,57,64,43,22,33,55,57,59,61,55,51,46,62,65,58,41,29,26,15,21,3,-13,-48,-62,-58,-54,-57,-35,7,23,23,42,56,55,53,14,20,18,20,25,26,8,6,24,13,-16,-47,-39,-25,-8,-13,-20,-19,-20,-21,-21,-23,-31,-46,-30,-12,4,14,15,19,2,-5,-19,-13,5,2,1,9,-6,-22,2,8,16,26,28,36,31,34,36,29,10,-11,-22,-10,16,27,23,15,10,-5,3,1,-45,-45,-47,-43,-32,-22,-26,-41,-41,-20,-19,-39,-19,-18,-9,-18,-20,-2,1,1,4,9,9,2,-3,-18,-21,8,1,8,26,20,37,39,28,8,-1,1,-7,-24,-22,-10,-31,-48,-62,-32,-10,-16,-5,8,16,11,15,5,19,28,8,28,19,16,27,22,17,5,15,19,-9,-10,5,1,-1,-28,-18,-33,-30,-9,-7,-3,1,-12,-11,-21,-28,2,13,30,8,27,19,-20,-21,-9,-14,7,52,54,59,45,6,-30,-57,-42,-35,-31,0,4,1,15,26,19,20,19,19,-4,-19,-11,0,7,28,37,21,0,-14,-3,-9,6,12,16,29,13,-22,-17,4,4,4,-11,-18,-20,-20,-9,6,-6,-18,-8,-7,-5,-5,-4,3,-8,-13,-4,3,-5,-6,-29,-52,-43,-45,-26,-13,0,10,3,0,-4,-5,10,23,32,23,13,9,0,19,22,15,20,14,-17,-36,2,32,12,-14,-6,-13,-26,-39,-39,-18,-5,20,13,-1,-14,-13,-14,-15,-19,-34,-37,-51,-38,-28,-10,29,44,50,38,8,1,19,15,28,34,2,-10,-20,-35,-30,-25,-18,6,16,14,8,16,28,29,40,44,31,35,35,13,17,10,-24,-45,-36,-55,-59,-61,-53,-25,-6,22,13,1,-11,-4,-3,-11,-2,16,34,38,21,24,36,9,0,-1,-2,-6,-8,-5,-15,0,7,11,2,-30,-11,-22,-42,-52,-51,-20,-3,-4,1,29,14,16,27,10,-1,-6,-16,-35,-31,13,39,30,19,8,16,26,33,29,4,-14,4,36,37,24,20,16,22,27,34,36,0,-4,-14,-34,-30,-25,-13,-4,11,9,-10,-24,-32,-22,-11,-11,-6,13,5,11,18,12,5,-13,1,1,20,30,19,12,-6,-16,-25,-30,-18,-5,7,8,3,19,20,12,14,-2,-42,-49,-59,-52,-28,10,19,10,25,-2,-16,-20,-21,-9,-9,-3,7,9,27,38,38,41,32,8,0,2,5,13,-1,0,4,6,7,-5,8,19,12,1,18,6,17,36,30,34,31,34,12,15,19,4,-29,-33,-45,-40,-25,-13,-14,-37,-45,-61,-41,-40,-16,-10,-12,8,15,22,15,11,26,40,55,41,21,17,-4,16,19,-9,-25,-39,-47,-50,-30,-5,-6,-3,7,8,4,14,10,6,6,23,23,4,24,38,21,0,18,3,2,-6,-23,-39,-49,-21,-44,-34,-20,-22,-18,-39,-50,-49,-38,-30,-15,13,30,49,54,30,45,64,47,41,24,18,25,11,-2,-34,-42,-36,-15,30,49,42,22,19,8,22,33,39,54,61,37,0,7,2,11,10,-3,-14,7,25,24,4,-20,-9,-3,-18,-19,-38,-67,-73,-70,-44,-23,0,0,7,4,5,-14,-44,-57,-67,-83,-64,-37,-27,-8,-6,27,32,35,28,20,8,-7,-9,3,17,13,4,18,28,31,47,17,15,26,21,16,20,32,43,34,14,10,17,22,22,1,-7,0,-14,-23,-23,-20,-40,-56,-50,-19,-11,-1,-9,-26,-27,-26,-1,0,8,23,0,-10,-1,-6,2,19,0,-44,-50,-42,-41,-42,-22,-7,10,34,38,23,33,30,22,33,19,25,20,18,42,32,12,22,2,-14,-26,-17,-14,-39,-25,-10,-34,-26,-19,-11,5,5,38,59,45,20,40,43,21,7,0,-15,-9,8,22,3,-25,-18,-13,0,4,-6,-31,-40,-30,-36,-34,-30,-1,18,14,23,9,15,-8,-39,-33,-11,-1,17,20,-5,-13,-21,-15,1,45,57,42,22,21,-2,-27,-23,-31,-35,-32,-5,-3,16,26,30,38,17,0,-23,-40,-36,-38,-47,-24,-28,-38,-29,-5,4,-5,2,-10,5,20,0,-2,7,3,16,22,13,19,18,20,7,-21,-20,6,5,-6,0,-8,-14,-17,-7,5,-6,-10,1,6,0,23,18,11,-1,-13,-12,-11,-3,-11,9,13,9,-2,-10,-12,0,14,16,5,14,34,25,4,-5,-14,-42,-52,-50,-33,-21,-27,-29,-24,-7,5,0,-8,-19,-17,2,23,20,18,15,26,28,14,39,53,49,28,1,16,16,-12,-11,-18,-26,-17,-21,-11,-13,6,0,-8,20,24,31,42,68,42,13,7,9,22,22,35,21,17,4,-18,-3,-3,2,11,17,14,27,10,-6,24,30,23,13,18,-10,-21,3,-4,-5,1,-11,-16,7,22,22,36,42,26,17,11,0,0,8,-5,-19,-26,-36,-21,0,8,0,7,15,-2,7,2,2,3,-13,-29,-32,-7,19,11,0,23,24,17,10,-2,-4,5,0,-9,-9,-8,-2,-17,-53,-71,-68,-57,-39,-25,-20,-32,-3,7,6,-12,-4,19,14,24,30,27,21,14,11,0,-39,-30,-20,-16,-20,-21,-19,-31,-5,-3,-11,3,-9,-24,-5,14,18,30,34,29,19,-9,-26,-38,-48,-59,-65,-54,-39,-6,37,66,72,67,43,24,9,-12,-23,-13,0,12,46,50,40,33,30,34,52,49,9,-4,-16,-12,3,9,7,5,24,19,-9,-6,-11,-9,2,0,7,-3,-8,7,8,2,-31,-64,-34,-16,-19,-6,17,10,-7,14,17,16,24,20,10,12,3,22,23,16,7,-8,-3,-20,-29,-66,-69,-60,-39,-37,-36,-21,-1,13,12,7,-25,-20,-11,2,-13,-20,-48,-63,-42,-42,-43,-54,-48,-68,-74,-58,-57,-56,-53,-16,3,0,-13,-19,-12,-30,-21,-27,-24,-4,0,-14,-9,16,18,4,-20,-3,-8,-34,-36,-49,-49,-24,-5,11,4,12,34,34,36,27,27,10,4,-4,-8,1,-13,-25,-24,-10,1,12,17,31,41,48,52,41,46,33,16,13,6,23,12,0,2,14,28,30,49,54,53,50,19,9,-7,-28,-27,-23,-9,18,54,49,62,69,70,73,85,86,67,72,69,79,61,50,46,43,47,28,31,30,9,-18,-25,-31,-41,-13,-2,-13,-28,-41,-38,-48,-31,-10,12,34,45,68,62,62,28,0,-8,-25,-25,-15,-1,0,3,2,-16,-28,-20,-16,-4,-16,-38,-58,-63,-62,-64,-60,-22,-6,-30,-30,-39,-38,-38,-15,17,15,20,21,27,17,-4,-24,-53,-47,-34,-27,-16,-9,-14,1,27,40,57,59,35,5,4,13,4,0,-4,-8,-6,5,18,3,-4,-27,-28,-35,-34,-31,-49,-29,-21,-7,3,10,14,17,25,30,18,2,4,16,17,0,4,0,-20,-25,-12,-22,-24,-19,-4,4,-7,-5,-9,-18,-31,-33,-32,-30,-26,-25,-13,-1,-4,1,15,28,30,38,24,14,16,-15,-8,10,22,30,33,38,14,9,35,55,53,33,23,2,-10,-30,-31,-34,-39,-26,-10,13,3,-3,4,23,31,50,41,32,19,0,-23,-38,-37,-34,-4,-14,-20,-15,10,8,-4,-10,-21,-20,-32,-30,-20,-5,0,2,18,23,13,21,30,34,43,41,36,33,22,1,-4,0,-11,-3,6,-18,-31,-43,-51,-46,-41,-14,-24,-17,-15,-45,-20,0,12,8,15,38,28,6,12,15,2,-7,-3,10,5,12,23,28,24,31,18,-7,-35,-24,-17,-31,-10,-13,0,28,35,18,9,17,30,32,30,36,26,2,-29,-38,-27,-25,-40,-37,-27,-24,-1,-2,-15,-25,-24,-19,-32,-31,-29,-35,-38,-45,-32,-25,-54,-92,-77,-56,-44,-30,-46,-57,-61,-55,-35,-5,9,20,12,0,-9,-8,-9,-5,5,-8,-22,-9,-6,0,9,5,20,23,41,42,57,70,65,50,46,49,35,18,10,8,0,8,17,14,0,-16,-35,-58,-42,-6,-12,6,19,7,15,28,18,0,-9,-11,1,0, 25 | // Tail 26 | 11,12,15,22,13,1,-5,22,37,25,0,-18,-30,-40,-29,-30,-35,-49,-52,-35,-17,11,11,28,18,-4,-16,-38,-26,-32,-32,-12,3,4,20,34,37,36,26,15,0,0,-18,-21,1,10,0,-3,-8,-7,-8,-18,-25,-38,-46,-50,-41,-36,-25,-12,6,22,11,23, 27 | 28 | 0,-26,-34,6,63,56,-36,-103,-74,52,108,61,0,-43,-71,-78,1,102,102,20,-49,-79,-75,-25,68,121,66,-35,-104,-98,-25,63,111,76,-8,-88,-103,-42,42,103,92,14,-78,-108,-60,25,97,96,25,-65,-103,-66,11,87,101,42,-50,-102,-82,-6,81,104,54,-31,-93,-94,-28,61,103,76,-5,-85,-100,-46,38,94,89,17,-66,-95,-61,13,77,89,35,-43,-84,-67,-3,62,82,39,-29,-70,-65,-11,50,73,39,-21,-63,-62,-11,47,70,41,-19,-64,-64,-14,44,71,48,-14,-63,-67,-29,30,77,73,7,-66,-93,-52,27,89,92,24,-58,-98,-74,2,79,102,50,-32,-92,-89,-25,52,96,73,0,-72,-93,-45,29,81,74,15,-51,-79,-48,14,61,64,20,-36,-62,-41,7,44,46,15,-19,-39,-36,-5,34,45,15,-21,-37,-30,-4,25,45,32,-16,-55,-50,-1,46,57,28,-17,-51,-54,-18,30,62,50,-1,-48,-60,-38,5,51,67,37,-19,-67,-70,-21,42,70,50,1,-47,-64,-36,14,54,53,15,-29,-50,-37,-1,36,48,23,-19,-44,-35,0,32,37,15,-13,-32,-32,-7,25,40,23,-12,-39,-36,-5,28,42,27,-9,-41,-43,-12,27,47,34,-3,-39,-50,-24,19,50,45,8,-34,-53,-36,6,47,54,22,-25,-56,-46,-3,42,56,30,-16,-51,-48,-14,29,53,41,-1,-43,-51,-25,18,46,41,6,-29,-43,-27,6,35,37,10,-21,-36,-24,4,29,32,10,-18,-33,-22,5,29,30,8,-22,-36,-22,9,35,35,8,-27,-42,-26,8,36,41,16,-20,-42,-36,-5,29,47,31,-9,-42,-45,-18,21,47,41,5,-34,-48,-30,7,39,46,20,-21,-46,-35,-1,28,40,25,-8,-36,-37,-8,24,35,19,-8,-25,-25,-9,14,27,17,-5,-23,-23,-3,17,26,15,-8,-28,-26,-2,23,32,18,-11,-35,-32,-3,26,38,25,-7,-36,-39,-16,19,42,36,5,-30,-43,-28,4,34,41,20,-14,-36,-34,-9,20,34,24,0,-22,-31,-17,8,25,23,5,-14,-20,-12,4,15,13,2,-8,-12,-6,5,13,9,-3,-14,-12,0,14,16,6,-7,-16,-14,-3,12,21,13,-4,-20,-22,-8,12,23,19,3,-17,-27,-17,7,26,25,6,-15,-25,-19,-1,18,26,15,-6,-23,-22,-7,12,22,16,0,-15,-21,-12,7,21,17,0,-14,-17,-7,7,16,11,-1,-12,-13,-5,7,15,12,-1,-15,-19,-7,11,21,15,-2,-18,-23,-10,10,24,21,3,-16,-25,-18,2,23,27,12,-11,-27,-23,-3,18,26,15,-5,-21,-22,-8,10,22,18,0,-16,-20,-9,6,17,15,3,-11,-17,-10,4,15,13,3,-9,-15,-9,2,13,14,3,-9,-15,-8,3,11,11,3,-7,-12,-8,1,11,12,5,-6,-14,-11,0,12,14,6,-6,-13,-11,-1,10,14,8,-3,-12,-13,-3,8,13,8,-1,-10,-11,-4,4,10,8,1,-7,-10,-4,3,8,7,1,-5,-8,-4,2,7,8,1,-6,-8,-3,2,7,7,2,-5,-9,-6,2,8,7,1,-4,-8,-6,0,7,10,4,-4,-10,-8,0,6,9,7,-1,-9,-9,-2,4,8,6,1,-5,-8,-4,2,7,6,0,-4,-6,-4,0,6,5,0,-3,-4,-1,2,3,2,0,-3,-4,-2,3,5,4,0,-5,-6,-2,3,7,6,0,-6,-9,-4,3,8,8,2,-5,-9,-6,1,8,9,4,-4,-9,-8,0,8,9,4,-2,-7,-8,-2,5,8,5,-1,-6,-7,-2,3,6,4,0,-4,-5,-2,2,5,3,0,-3,-4,-1,1,4,3,0,-3,-3,0,2,3,3,0,-3,-3,-1,2,3,3,0,-3,-4,-2,1,3,3,0,-1,-3,-2,0,3,3,1,-1,-3,-2,0,2,3,1,0,-2,-2,0,1,2,1,0,-1,-1,0,0,1,1,0,0,-1,0,0,1,1,0,0,-1,0,0,1,0,0,0,-1,0,0,1,1,0,0,-1,-1,0,1,1,0,0,-1,-1,0,0,1,1,0,-1,-1,0,0,1,1,0,0,-1,-1,0,1,1,0,0,-1,-1,0,1,1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 29 | // Tail 30 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 31 | 32 | }; 33 | 34 | #define SAMPLE_FLAG_FILTER (1) 35 | 36 | struct Sample { 37 | uint16_t offset; 38 | uint16_t offsetUpper; 39 | uint16_t len; 40 | uint16_t loopIdx; 41 | float rate; 42 | uint8_t voiceIdx; 43 | bool loopInf; 44 | uint16_t flags; 45 | float pitchRange; 46 | }; 47 | 48 | #define DENOMINATOR_8BIT 127.f 49 | 50 | #define TAIL 64 51 | #define TAIL_UPPER 32 52 | 53 | #define N_SAMPLES 7 54 | 55 | #define N_DYNAMIC_VOICES 2 56 | 57 | #define LEAD_VOICE_IDX 4 58 | //#define LEAD_SAMPLE_IDX 4 59 | 60 | #define SAMPLE_IDX_DRONE 5 61 | #define VOICE_IDX_DRONE 3 62 | 63 | #define DYNAMIC_SAMPLE_IDX 0xff 64 | 65 | #define SAMPLE_FLAG_HP (1) 66 | #define SAMPLE_FLAG_LP (1 << 1) 67 | #define SAMPLE_FLAG_LIM_PITCH (1 << 2) 68 | #define SAMPLE_FLAG_RAND_PITCH (1 << 3) 69 | #define SAMPLE_FLAG_RANDOM (1 << 4) 70 | #define SAMPLE_FLAG_REPEAT (1 << 5) 71 | #define SAMPLE_FLAG_DELAY (1 << 6) 72 | #define SAMPLE_FLAG_INFINITE (1 << 7) 73 | #define SAMPLE_FLAG_LEAD (1 << 8) 74 | #define SAMPLE_FLAG_NOTE_PITCH (1 << 9) 75 | 76 | Sample samples[N_SAMPLES] = { 77 | {0, 0xffff, 1855, 0, 22050, DYNAMIC_SAMPLE_IDX, false, SAMPLE_FLAG_DELAY|SAMPLE_FLAG_REPEAT|SAMPLE_FLAG_RANDOM|SAMPLE_FLAG_HP | SAMPLE_FLAG_RAND_PITCH | SAMPLE_FLAG_LIM_PITCH, 8000}, 78 | {0, 0xffff, 1460, 0, 22050, DYNAMIC_SAMPLE_IDX, false, SAMPLE_FLAG_DELAY|SAMPLE_FLAG_REPEAT|SAMPLE_FLAG_RANDOM|SAMPLE_FLAG_HP | SAMPLE_FLAG_LIM_PITCH, 8000}, 79 | {0, 0xffff, 2448, 0, 11025, DYNAMIC_SAMPLE_IDX, false, SAMPLE_FLAG_DELAY|SAMPLE_FLAG_HP|SAMPLE_FLAG_LIM_PITCH, 400}, 80 | {0, 0xffff, 1646, 0, 44100, DYNAMIC_SAMPLE_IDX, false, SAMPLE_FLAG_DELAY|SAMPLE_FLAG_REPEAT|SAMPLE_FLAG_RANDOM|SAMPLE_FLAG_LP|SAMPLE_FLAG_HP|SAMPLE_FLAG_LIM_PITCH, 8000}, 81 | {0, 0xffff, 3572, 2155+1, 11025, 4, false, SAMPLE_FLAG_LEAD|SAMPLE_FLAG_NOTE_PITCH, 0}, 82 | {0, 0xffff, 7177, 1, 11025, VOICE_IDX_DRONE, true, SAMPLE_FLAG_INFINITE, 0}, 83 | {0, 0xffff, 860, 0, 8000, 2, false, SAMPLE_FLAG_HP|SAMPLE_FLAG_LIM_PITCH|SAMPLE_FLAG_NOTE_PITCH, 0} 84 | }; 85 | 86 | void initSamples(void) { 87 | uint16_t offset = 0, offsetUpper = 0; 88 | uint8_t i = 0; 89 | while(i < N_SAMPLES) { 90 | samples[i].offset = offset; 91 | if (samples[i].offsetUpper != 0xffff) { 92 | samples[i].offsetUpper = offsetUpper; 93 | offsetUpper += ((samples[i].len >> 1) + TAIL_UPPER); 94 | } 95 | if (samples[i].loopIdx != 0) { 96 | samples[i].loopIdx += samples[i].offset - 1; 97 | } 98 | offset += (samples[i].len + TAIL); 99 | i++; 100 | } 101 | } --------------------------------------------------------------------------------