├── README.md ├── package.json ├── .gitignore ├── LICENSE ├── sleeboard.js ├── index.js └── am.js /README.md: -------------------------------------------------------------------------------- 1 | # Amharic-telegram-bot 2 | This is a telegram bot to translate text to amharic 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "amharic_bot", 3 | "version": "0.1.0", 4 | "description": "Amharic writing telegram bot", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "amharic", 11 | "bot" 12 | ], 13 | "author": "Nathan Mulugeta ", 14 | "license": "ISC", 15 | "dependencies": { 16 | "dotenv": "^4.0.0", 17 | "node-telegram-bot-api": "^0.27.0", 18 | "pg": "^6.1.5", 19 | "uuid": "^3.0.1" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | .env 39 | 40 | test.js 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 nathenapse 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /sleeboard.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const am = require('./am.js'); 4 | var sleeboard = function () { 5 | if (!(this instanceof sleeboard)) { 6 | return new sleeboard() 7 | } 8 | 9 | getInputJson(); 10 | 11 | var lang, 12 | scope, 13 | maxInserted = 0, 14 | ignoreKeyCodes = [8, 10, 18, 35, 36, 37, 38, 39, 40, 127]; 15 | 16 | var finalText = ''; 17 | /** 18 | * Write the Symbol to the right position on input 19 | * FIXME: caret gets hidden when overflow 20 | * @param vm 21 | * @param entry 22 | */ 23 | function writeOnField(entry, finalText) { 24 | if (entry) { 25 | maxInserted = scope['_scope'] ? 0 : maxInserted; 26 | var sub = finalText.substring(0, finalText.length - (maxInserted)); 27 | if (scope['_scope']) { 28 | maxInserted = 1; 29 | } else { 30 | maxInserted = maxInserted < entry.length ? entry.length : maxInserted; 31 | } 32 | return sub + entry; 33 | } 34 | return finalText; 35 | } 36 | 37 | 38 | /** 39 | * Shrink Scope for Performance 40 | * @param char 41 | */ 42 | function shrinkScope(char) { 43 | if (scope[char]) { 44 | scope = scope[char]['next'] ? scope[char]['next'] : lang; 45 | } else { 46 | scope = lang; 47 | } 48 | } 49 | 50 | /** 51 | * Get Symbol from Character 52 | * @param char 53 | * @returns {*} 54 | */ 55 | function getSymbolFromScope(char) { 56 | scope = scope ? scope : lang; 57 | if (scope[char]) { 58 | return scope[char]['value']; 59 | } else if (lang[char]) { 60 | scope = lang; 61 | return scope[char]['value']; 62 | } else { 63 | scope = lang; 64 | return char; 65 | } 66 | } 67 | 68 | /** 69 | * handler 70 | * @param text 71 | */ 72 | function handler(text) { 73 | var splitString = text.split(''); 74 | var asterisk = 2; 75 | splitString.forEach(char => { 76 | asterisk = char == '*' ? asterisk + 1 : asterisk; 77 | if (char && asterisk % 2 == 0 && char != '*') { 78 | char = char.toLowerCase(); 79 | var symbol = getSymbolFromScope(char); 80 | finalText = writeOnField(symbol, finalText); 81 | shrinkScope(char); 82 | } else if(char && asterisk % 2 != 0 && char != '*'){ 83 | finalText = finalText+char 84 | scope = lang 85 | } 86 | }) 87 | var keyvalue = []; 88 | if(!scope['_scope']){ 89 | var example = finalText.slice(0, -1); 90 | keyvalue = Object.keys(scope).map((key)=>{ 91 | var chars = key; 92 | var scopeCopy = scope; 93 | var value = scopeCopy[key].value 94 | while(!scopeCopy[key].value){ 95 | scopeCopy = scopeCopy[key].next 96 | key = Object.keys(scopeCopy)[0] 97 | chars = chars + key 98 | value = scopeCopy[key].value 99 | } 100 | var result = example+value 101 | return {chars, result} 102 | }) 103 | keyvalue.unshift({chars: '', result: finalText}) 104 | }else { 105 | keyvalue.unshift({chars: '', result: finalText}) 106 | } 107 | return keyvalue; 108 | } 109 | 110 | /** 111 | * Request server for json 112 | */ 113 | function getInputJson() { 114 | lang = am 115 | lang['_scope'] = 'all'; 116 | } 117 | 118 | /** 119 | * Change Input Type 120 | * @param fileName 121 | */ 122 | this.getAmharic = function(text){ 123 | finalText = "" 124 | scope = lang 125 | maxInserted = 0 126 | return handler(text) 127 | } 128 | 129 | }; 130 | 131 | module.exports = sleeboard() 132 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | const TelegramBot = require('node-telegram-bot-api'); 3 | const uuid = require('uuid/v4'); 4 | const sleeboard = require('./sleeboard.js'); 5 | const pg = require('pg'); 6 | var config = { 7 | user: process.env.PGUSER, 8 | database: process.env.PGDATABASE, 9 | password: process.env.PGPASSWORD, 10 | host: process.env.PGHOST, 11 | port: process.env.PGPORT, 12 | max: process.env.PGPOOL, 13 | idleTimeoutMillis: process.env.PGTIMEOUT, 14 | }; 15 | const Admin = process.env.ADMIN 16 | 17 | var pool = new pg.Pool(config); 18 | 19 | //this initializes a connection pool 20 | //it will keep idle connections open for a 30 seconds 21 | //and set a limit of maximum 10 idle clients 22 | 23 | // to run a query we can acquire a client from the pool, 24 | // run a query on the client, and then return the client to the pool 25 | // replace the value below with the Telegram token you receive from @BotFather 26 | const token = process.env.AMHARIC_BOT_TOKEN; 27 | 28 | // Create a bot that uses 'polling' to fetch new updates 29 | const bot = new TelegramBot(token, {polling: true}); 30 | 31 | bot.getMe().then(function(err, result){ 32 | console.log(err, result) 33 | }) 34 | 35 | // Add a data collection command 36 | bot.onText(/\/collect/, (msg, match) => { 37 | 38 | pool.connect(function(err, client, done) { 39 | if(err) { 40 | return 41 | } 42 | client.query('SELECT id FROM users WHERE id=$1;', [msg.chat.id], (err, result) => { 43 | // user found add it to the data collection 44 | if(result && result.rows.length > 0 && result.rows[0].id){ 45 | client.query('UPDATE users SET collect = $2 WHERE id = $1;', [msg.chat.id, true], function(err, result) { 46 | done(err); 47 | 48 | if(err) { 49 | return; 50 | } 51 | }); 52 | }else{ 53 | client.query('INSERT INTO users (id, collect) VALUES ($1, $2);', [msg.chat.id, true], function(err, result) { 54 | done(err); 55 | 56 | if(err) { 57 | return; 58 | } 59 | }); 60 | } 61 | // add the query the user sent and the answer they got to the data. 62 | }); 63 | }); 64 | bot.sendMessage(msg.chat.id, 'Thank you for allowing @AmharicBot to collect your data. Your Privacy is our Priority.'); 65 | }); 66 | 67 | // Get User count 68 | bot.onText(/\/count/, (msg, match) => { 69 | if(msg.chat.id == Admin){ 70 | pool.connect(function(err, client, done) { 71 | if(err) { 72 | return 73 | } 74 | client.query('SELECT COUNT(id) as count from users;', function(err, result) { 75 | done(err); 76 | if(err) { 77 | return; 78 | } 79 | bot.sendMessage(msg.chat.id, `Number of unique users using @AmharicBot is ${result.rows[0].count}`); 80 | }); 81 | }); 82 | } 83 | }); 84 | 85 | // Get Contributors count 86 | bot.onText(/\/contributors/, (msg, match) => { 87 | if(msg.chat.id == Admin){ 88 | pool.connect(function(err, client, done) { 89 | if(err) { 90 | return 91 | } 92 | client.query('SELECT COUNT(id) as count from users WHERE collect=$1;', [true], function(err, result) { 93 | done(err); 94 | if(err) { 95 | return; 96 | } 97 | bot.sendMessage(msg.chat.id, `Number of unique contributors @AmharicBot is ${result.rows[0].count}`); 98 | }); 99 | }); 100 | } 101 | }); 102 | // Matches "/echo [whatever]" 103 | bot.onText(/\/help/, (msg, match) => { 104 | // 'msg' is the received Message from Telegram 105 | // 'match' is the result of executing the regexp above on the text content 106 | // of the message 107 | 108 | const chatId = msg.chat.id; 109 | 110 | // send back the matched "whatever" to the chat 111 | bot.sendMessage(chatId, 'inside any chat just type @AmharicBot mukera'); 112 | }); 113 | 114 | 115 | bot.on("inline_query", (query) => { 116 | var searchTerm = query.query.trim(); 117 | var chatId = query.from.id; 118 | var answer = sleeboard.getAmharic(searchTerm) 119 | var term = searchTerm; 120 | 121 | // Check Telegram text display limit for description to that the user looks at what they are typeing 122 | // not the starting text 123 | if(searchTerm.length > 90){ 124 | term = ".."+ searchTerm.slice(-90); 125 | } 126 | 127 | var result = answer.map(item => { 128 | var itemResult = item.result; 129 | // Check Telegram text display limit for title to that the user looks at what they are typeing 130 | // not the starting text 131 | if(item.result.length > 48){ 132 | itemResult = ".."+item.result.slice(-52); 133 | } 134 | // Check Telegram inline bot return limit 135 | if(item.result.length > 256) { 136 | itemResult = "!!! CHARACTER LIMIT EXCEEDED !!!" 137 | } 138 | 139 | return { 140 | type: "article", 141 | id: uuid(), 142 | title: itemResult, 143 | description: term + item.chars, 144 | input_message_content: { 145 | message_text: item.result 146 | } 147 | } 148 | }) 149 | 150 | pool.connect(function(err, client, done) { 151 | if(err) { 152 | return; 153 | } 154 | // Add user to the list of users how use our bot 155 | client.query('INSERT INTO users VALUES ($1::int);', [query.from.id], function(err, result) { 156 | // Check if the user is a contributor if so add users userid to the data 157 | client.query('SELECT id FROM users WHERE id=$1 AND collect=$2;', [chatId, true], (err, result) => { 158 | 159 | var user = 0; 160 | // user found add it to the data collection 161 | if(result && result.rows.length > 0 && result.rows[0].id){ 162 | user = result.rows[0].id 163 | } 164 | // add the query the user sent and the answer they got to the data. 165 | client.query('INSERT INTO data ("user", "query", "options") VALUES ($1::int,$2,$3);', [user, searchTerm, answer[0]], (err, result) => { 166 | done(err); 167 | if(err) { 168 | return; 169 | } 170 | }); 171 | }); 172 | }); 173 | }); 174 | 175 | 176 | bot.answerInlineQuery(query.id, result); 177 | }); 178 | 179 | bot.on('polling_error', (error) => { 180 | console.log(error.code); 181 | }); 182 | -------------------------------------------------------------------------------- /am.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | "a": { 4 | "value": "አ", 5 | "next": null 6 | }, 7 | "e": { 8 | "value": "እ", 9 | "next": { 10 | "e": { 11 | "value": "ኤ", 12 | "next": null 13 | } 14 | } 15 | }, 16 | "i": { 17 | "value": "ኢ", 18 | "next": { 19 | "e": { 20 | "value": "ኤ", 21 | "next": null 22 | } 23 | } 24 | }, 25 | "o": { 26 | "value": "ኦ", 27 | "next": null 28 | }, 29 | "u": { 30 | "value": "ኡ", 31 | "next": null 32 | }, 33 | "w": { 34 | "value": "ው", 35 | "next": { 36 | "a": { 37 | "value": "ዋ", 38 | "next": null 39 | }, 40 | "i": { 41 | "value": "ዊ", 42 | "next": { 43 | "e": { 44 | "value": "ዌ", 45 | "next": null 46 | } 47 | } 48 | }, 49 | "e": { 50 | "value": "ወ", 51 | "next": { 52 | "e": { 53 | "value": "ዌ", 54 | "next": null 55 | } 56 | } 57 | }, 58 | "u": { 59 | "value": "ዉ", 60 | "next": null 61 | }, 62 | "o": { 63 | "value": "ዎ", 64 | "next": null 65 | } 66 | } 67 | }, 68 | "s": { 69 | "value": "ስ", 70 | "next": { 71 | "a": { 72 | "value": "ሳ", 73 | "next": null 74 | }, 75 | "e": { 76 | "value": "ሰ", 77 | "next": { 78 | "e": { 79 | "value": "ሴ", 80 | "next": null 81 | } 82 | } 83 | }, 84 | "w": { 85 | "value": null, 86 | "next": { 87 | "a": { 88 | "value": "ሷ", 89 | "next": null 90 | } 91 | } 92 | }, 93 | "i": { 94 | "value": "ሲ", 95 | "next": { 96 | "e": { 97 | "value": "ሴ", 98 | "next": null 99 | } 100 | } 101 | }, 102 | "h": { 103 | "value": "ሽ", 104 | "next": { 105 | "a": { 106 | "value": "ሻ", 107 | "next": null 108 | }, 109 | "e": { 110 | "value": "ሸ", 111 | "next": { 112 | "e": { 113 | "value": "ሼ", 114 | "next": null 115 | } 116 | } 117 | }, 118 | "w": { 119 | "value": null, 120 | "next": { 121 | "a": { 122 | "value": "ሿ", 123 | "next": null 124 | } 125 | } 126 | }, 127 | "i": { 128 | "value": "ሺ", 129 | "next": { 130 | "e": { 131 | "value": "ሼ", 132 | "next": null 133 | } 134 | } 135 | }, 136 | "u": { 137 | "value": "ሹ", 138 | "next": { 139 | "a": { 140 | "value": "ሿ", 141 | "next": null 142 | } 143 | } 144 | }, 145 | "o": { 146 | "value": "ሾ", 147 | "next": null 148 | } 149 | } 150 | }, 151 | "z": { 152 | "value": "ሥ", 153 | "next": { 154 | "a": { 155 | "value": "ሣ", 156 | "next": null 157 | }, 158 | "e": { 159 | "value": "ሠ", 160 | "next": { 161 | "e": { 162 | "value": "ሤ", 163 | "next": null 164 | } 165 | } 166 | }, 167 | "w": { 168 | "value": null, 169 | "next": { 170 | "a": { 171 | "value": "ሧ", 172 | "next": null 173 | } 174 | } 175 | }, 176 | "i": { 177 | "value": "ሢ", 178 | "next": { 179 | "e": { 180 | "value": "ሤ", 181 | "next": null 182 | } 183 | } 184 | }, 185 | "u": { 186 | "value": "ሡ", 187 | "next": { 188 | "a": { 189 | "value": "ሧ", 190 | "next": null 191 | } 192 | } 193 | }, 194 | "o": { 195 | "value": "ሦ", 196 | "next": null 197 | } 198 | } 199 | }, 200 | "u": { 201 | "value": "ሱ", 202 | "next": { 203 | "a": { 204 | "value": "ሷ", 205 | "next": null 206 | } 207 | } 208 | }, 209 | "o": { 210 | "value": "ሶ", 211 | "next": null 212 | } 213 | } 214 | }, 215 | "v": { 216 | "value": "ቭ", 217 | "next": { 218 | "a": { 219 | "value": "ቫ", 220 | "next": null 221 | }, 222 | "e": { 223 | "value": "ቨ", 224 | "next": { 225 | "e": { 226 | "value": "ቬ", 227 | "next": null 228 | } 229 | } 230 | }, 231 | "w": { 232 | "value": null, 233 | "next": { 234 | "a": { 235 | "value": "ቯ", 236 | "next": null 237 | } 238 | } 239 | }, 240 | "i": { 241 | "value": "ቪ", 242 | "next": { 243 | "e": { 244 | "value": "ቬ", 245 | "next": null 246 | } 247 | } 248 | }, 249 | "u": { 250 | "value": "ቩ", 251 | "next": { 252 | "a": { 253 | "value": "ቯ", 254 | "next": null 255 | } 256 | } 257 | }, 258 | "o": { 259 | "value": "ቮ", 260 | "next": null 261 | } 262 | } 263 | }, 264 | "y": { 265 | "value": "ይ", 266 | "next": { 267 | "a": { 268 | "value": "ያ", 269 | "next": null 270 | }, 271 | "e": { 272 | "value": "የ", 273 | "next": { 274 | "e": { 275 | "value": "ዬ", 276 | "next": null 277 | } 278 | } 279 | }, 280 | "i": { 281 | "value": "ዪ", 282 | "next": { 283 | "e": { 284 | "value": "ዬ", 285 | "next": null 286 | } 287 | } 288 | }, 289 | "u": { 290 | "value": "ዩ", 291 | "next": null 292 | }, 293 | "o": { 294 | "value": "ዮ", 295 | "next": { 296 | "a": { 297 | "value": "ዯ", 298 | "next": null 299 | } 300 | } 301 | } 302 | } 303 | }, 304 | "x": { 305 | "value": "ኅ", 306 | "next": { 307 | "a": { 308 | "value": "ኃ", 309 | "next": null 310 | }, 311 | "e": { 312 | "value": "ኀ", 313 | "next": { 314 | "e": { 315 | "value": "ኄ", 316 | "next": null 317 | } 318 | } 319 | }, 320 | "w": { 321 | "value": "ኍ", 322 | "next": { 323 | "a": { 324 | "value": "ኋ", 325 | "next": null 326 | }, 327 | "e": { 328 | "value": "ኈ", 329 | "next": { 330 | "e": { 331 | "value": "ኌ", 332 | "next": null 333 | } 334 | } 335 | }, 336 | "i": { 337 | "value": "ኊ", 338 | "next": { 339 | "e": { 340 | "value": "ኌ", 341 | "next": null 342 | } 343 | } 344 | } 345 | } 346 | }, 347 | "i": { 348 | "value": "ኂ", 349 | "next": { 350 | "e": { 351 | "value": "ኄ", 352 | "next": null 353 | } 354 | } 355 | }, 356 | "u": { 357 | "value": "ኁ", 358 | "next": { 359 | "a": { 360 | "value": "ኋ", 361 | "next": null 362 | }, 363 | "e": { 364 | "value": "ኈ", 365 | "next": { 366 | "e": { 367 | "value": "ኌ", 368 | "next": null 369 | } 370 | } 371 | }, 372 | "i": { 373 | "value": "ኊ", 374 | "next": { 375 | "e": { 376 | "value": "ኌ", 377 | "next": null 378 | } 379 | } 380 | } 381 | } 382 | }, 383 | "o": { 384 | "value": "ኆ", 385 | "next": { 386 | "a": { 387 | "value": "ኇ", 388 | "next": null 389 | } 390 | } 391 | } 392 | } 393 | }, 394 | "r": { 395 | "value": "ር", 396 | "next": { 397 | "a": { 398 | "value": "ራ", 399 | "next": null 400 | }, 401 | "e": { 402 | "value": "ረ", 403 | "next": { 404 | "e": { 405 | "value": "ሬ", 406 | "next": null 407 | } 408 | } 409 | }, 410 | "y": { 411 | "value": null, 412 | "next": { 413 | "a": { 414 | "value": "ፘ", 415 | "next": null 416 | } 417 | } 418 | }, 419 | "w": { 420 | "value": null, 421 | "next": { 422 | "a": { 423 | "value": "ሯ", 424 | "next": null 425 | } 426 | } 427 | }, 428 | "i": { 429 | "value": "ሪ", 430 | "next": { 431 | "e": { 432 | "value": "ሬ", 433 | "next": null 434 | } 435 | } 436 | }, 437 | "u": { 438 | "value": "ሩ", 439 | "next": { 440 | "a": { 441 | "value": "ሯ", 442 | "next": null 443 | } 444 | } 445 | }, 446 | "o": { 447 | "value": "ሮ", 448 | "next": null 449 | } 450 | } 451 | }, 452 | "q": { 453 | "value": "ቅ", 454 | "next": { 455 | "a": { 456 | "value": "ቃ", 457 | "next": null 458 | }, 459 | "e": { 460 | "value": "ቀ", 461 | "next": { 462 | "e": { 463 | "value": "ቄ", 464 | "next": null 465 | } 466 | } 467 | }, 468 | "w": { 469 | "value": "ቍ", 470 | "next": { 471 | "a": { 472 | "value": "ቋ", 473 | "next": null 474 | }, 475 | "e": { 476 | "value": "ቈ", 477 | "next": { 478 | "e": { 479 | "value": "ቌ", 480 | "next": null 481 | } 482 | } 483 | }, 484 | "i": { 485 | "value": "ቊ", 486 | "next": { 487 | "e": { 488 | "value": "ቌ", 489 | "next": null 490 | } 491 | } 492 | } 493 | } 494 | }, 495 | "i": { 496 | "value": "ቂ", 497 | "next": { 498 | "e": { 499 | "value": "ቄ", 500 | "next": null 501 | } 502 | } 503 | }, 504 | "h": { 505 | "value": "ቕ", 506 | "next": { 507 | "a": { 508 | "value": "ቓ", 509 | "next": null 510 | }, 511 | "e": { 512 | "value": "ቐ", 513 | "next": { 514 | "e": { 515 | "value": "ቔ", 516 | "next": null 517 | } 518 | } 519 | }, 520 | "w": { 521 | "value": "ቝ", 522 | "next": { 523 | "a": { 524 | "value": "ቛ", 525 | "next": null 526 | }, 527 | "e": { 528 | "value": "ቘ", 529 | "next": { 530 | "e": { 531 | "value": "ቜ", 532 | "next": null 533 | } 534 | } 535 | }, 536 | "i": { 537 | "value": "ቚ", 538 | "next": { 539 | "e": { 540 | "value": "ቜ", 541 | "next": null 542 | } 543 | } 544 | } 545 | } 546 | }, 547 | "i": { 548 | "value": "ቒ", 549 | "next": { 550 | "e": { 551 | "value": "ቔ", 552 | "next": null 553 | } 554 | } 555 | }, 556 | "u": { 557 | "value": "ቑ", 558 | "next": { 559 | "a": { 560 | "value": "ቛ", 561 | "next": null 562 | }, 563 | "e": { 564 | "value": "ቘ", 565 | "next": { 566 | "e": { 567 | "value": "ቜ", 568 | "next": null 569 | } 570 | } 571 | }, 572 | "i": { 573 | "value": "ቚ", 574 | "next": { 575 | "e": { 576 | "value": "ቜ", 577 | "next": null 578 | } 579 | } 580 | } 581 | } 582 | }, 583 | "o": { 584 | "value": "ቖ", 585 | "next": null 586 | } 587 | } 588 | }, 589 | "u": { 590 | "value": "ቁ", 591 | "next": { 592 | "a": { 593 | "value": "ቋ", 594 | "next": null 595 | }, 596 | "e": { 597 | "value": "ቈ", 598 | "next": { 599 | "e": { 600 | "value": "ቌ", 601 | "next": null 602 | } 603 | } 604 | }, 605 | "i": { 606 | "value": "ቊ", 607 | "next": { 608 | "e": { 609 | "value": "ቌ", 610 | "next": null 611 | } 612 | } 613 | } 614 | } 615 | }, 616 | "o": { 617 | "value": "ቆ", 618 | "next": { 619 | "a": { 620 | "value": "ቇ", 621 | "next": null 622 | } 623 | } 624 | } 625 | } 626 | }, 627 | "c": { 628 | "value": "ች", 629 | "next": { 630 | "a": { 631 | "value": "ቻ", 632 | "next": null 633 | }, 634 | "e": { 635 | "value": "ቸ", 636 | "next": { 637 | "e": { 638 | "value": "ቼ", 639 | "next": null 640 | } 641 | } 642 | }, 643 | "w": { 644 | "value": null, 645 | "next": { 646 | "a": { 647 | "value": "ቿ", 648 | "next": null 649 | } 650 | } 651 | }, 652 | "i": { 653 | "value": "ቺ", 654 | "next": { 655 | "e": { 656 | "value": "ቼ", 657 | "next": null 658 | } 659 | } 660 | }, 661 | "h": { 662 | "value": "ጭ", 663 | "next": { 664 | "a": { 665 | "value": "ጫ", 666 | "next": null 667 | }, 668 | "e": { 669 | "value": "ጨ", 670 | "next": { 671 | "e": { 672 | "value": "ጬ", 673 | "next": null 674 | } 675 | } 676 | }, 677 | "w": { 678 | "value": null, 679 | "next": { 680 | "a": { 681 | "value": "ጯ", 682 | "next": null 683 | } 684 | } 685 | }, 686 | "i": { 687 | "value": "ጪ", 688 | "next": { 689 | "e": { 690 | "value": "ጬ", 691 | "next": null 692 | } 693 | } 694 | }, 695 | "u": { 696 | "value": "ጩ", 697 | "next": { 698 | "a": { 699 | "value": "ጯ", 700 | "next": null 701 | } 702 | } 703 | }, 704 | "o": { 705 | "value": "ጮ", 706 | "next": null 707 | } 708 | } 709 | }, 710 | "u": { 711 | "value": "ቹ", 712 | "next": { 713 | "a": { 714 | "value": "ቿ", 715 | "next": null 716 | } 717 | } 718 | }, 719 | "o": { 720 | "value": "ቾ", 721 | "next": null 722 | } 723 | } 724 | }, 725 | "b": { 726 | "value": "ብ", 727 | "next": { 728 | "a": { 729 | "value": "ባ", 730 | "next": null 731 | }, 732 | "e": { 733 | "value": "በ", 734 | "next": { 735 | "e": { 736 | "value": "ቤ", 737 | "next": null 738 | } 739 | } 740 | }, 741 | "w": { 742 | "value": null, 743 | "next": { 744 | "a": { 745 | "value": "ቧ", 746 | "next": null 747 | } 748 | } 749 | }, 750 | "i": { 751 | "value": "ቢ", 752 | "next": { 753 | "e": { 754 | "value": "ቤ", 755 | "next": null 756 | } 757 | } 758 | }, 759 | "u": { 760 | "value": "ቡ", 761 | "next": { 762 | "a": { 763 | "value": "ቧ", 764 | "next": null 765 | } 766 | } 767 | }, 768 | "o": { 769 | "value": "ቦ", 770 | "next": null 771 | } 772 | } 773 | }, 774 | "d": { 775 | "value": "ድ", 776 | "next": { 777 | "a": { 778 | "value": "ዳ", 779 | "next": null 780 | }, 781 | "e": { 782 | "value": "ደ", 783 | "next": { 784 | "e": { 785 | "value": "ዴ", 786 | "next": null 787 | } 788 | } 789 | }, 790 | "d": { 791 | "value": "ዽ", 792 | "next": { 793 | "a": { 794 | "value": "ዻ", 795 | "next": null 796 | }, 797 | "e": { 798 | "value": "ዸ", 799 | "next": { 800 | "e": { 801 | "value": "ዼ", 802 | "next": null 803 | } 804 | } 805 | }, 806 | "w": { 807 | "value": null, 808 | "next": { 809 | "a": { 810 | "value": "ዿ", 811 | "next": null 812 | } 813 | } 814 | }, 815 | "i": { 816 | "value": "ዺ", 817 | "next": { 818 | "e": { 819 | "value": "ዼ", 820 | "next": null 821 | } 822 | } 823 | }, 824 | "u": { 825 | "value": "ዹ", 826 | "next": { 827 | "a": { 828 | "value": "ዿ", 829 | "next": null 830 | } 831 | } 832 | }, 833 | "o": { 834 | "value": "ዾ", 835 | "next": null 836 | } 837 | } 838 | }, 839 | "w": { 840 | "value": null, 841 | "next": { 842 | "a": { 843 | "value": "ዷ", 844 | "next": null 845 | } 846 | } 847 | }, 848 | "i": { 849 | "value": "ዲ", 850 | "next": { 851 | "e": { 852 | "value": "ዴ", 853 | "next": null 854 | } 855 | } 856 | }, 857 | "u": { 858 | "value": "ዱ", 859 | "next": { 860 | "a": { 861 | "value": "ዷ", 862 | "next": null 863 | } 864 | } 865 | }, 866 | "o": { 867 | "value": "ዶ", 868 | "next": null 869 | } 870 | } 871 | }, 872 | "g": { 873 | "value": "ግ", 874 | "next": { 875 | "a": { 876 | "value": "ጋ", 877 | "next": null 878 | }, 879 | "e": { 880 | "value": "ገ", 881 | "next": { 882 | "e": { 883 | "value": "ጌ", 884 | "next": null 885 | } 886 | } 887 | }, 888 | "w": { 889 | "value": "ጕ", 890 | "next": { 891 | "a": { 892 | "value": "ጓ", 893 | "next": null 894 | }, 895 | "e": { 896 | "value": "ጐ", 897 | "next": { 898 | "e": { 899 | "value": "ጔ", 900 | "next": null 901 | } 902 | } 903 | }, 904 | "i": { 905 | "value": "ጒ", 906 | "next": { 907 | "e": { 908 | "value": "ጔ", 909 | "next": null 910 | } 911 | } 912 | } 913 | } 914 | }, 915 | "g": { 916 | "value": "ጝ", 917 | "next": { 918 | "a": { 919 | "value": "ጛ", 920 | "next": null 921 | }, 922 | "e": { 923 | "value": "ጘ", 924 | "next": { 925 | "e": { 926 | "value": "ጜ", 927 | "next": null 928 | } 929 | } 930 | }, 931 | "w": { 932 | "value": null, 933 | "next": { 934 | "a": { 935 | "value": "ጟ", 936 | "next": null 937 | } 938 | } 939 | }, 940 | "i": { 941 | "value": "ጚ", 942 | "next": { 943 | "e": { 944 | "value": "ጜ", 945 | "next": null 946 | } 947 | } 948 | }, 949 | "u": { 950 | "value": "ጙ", 951 | "next": { 952 | "a": { 953 | "value": "ጟ", 954 | "next": null 955 | } 956 | } 957 | }, 958 | "o": { 959 | "value": "ጞ", 960 | "next": null 961 | } 962 | } 963 | }, 964 | "i": { 965 | "value": "ጊ", 966 | "next": { 967 | "e": { 968 | "value": "ጌ", 969 | "next": null 970 | } 971 | } 972 | }, 973 | "u": { 974 | "value": "ጉ", 975 | "next": { 976 | "a": { 977 | "value": "ጓ", 978 | "next": null 979 | }, 980 | "e": { 981 | "value": "ጐ", 982 | "next": { 983 | "e": { 984 | "value": "ጔ", 985 | "next": null 986 | } 987 | } 988 | }, 989 | "i": { 990 | "value": "ጒ", 991 | "next": { 992 | "e": { 993 | "value": "ጔ", 994 | "next": null 995 | } 996 | } 997 | } 998 | } 999 | }, 1000 | "o": { 1001 | "value": "ጎ", 1002 | "next": { 1003 | "a": { 1004 | "value": "ጏ", 1005 | "next": null 1006 | } 1007 | } 1008 | } 1009 | } 1010 | }, 1011 | "f": { 1012 | "value": "ፍ", 1013 | "next": { 1014 | "a": { 1015 | "value": "ፋ", 1016 | "next": null 1017 | }, 1018 | "e": { 1019 | "value": "ፈ", 1020 | "next": { 1021 | "e": { 1022 | "value": "ፌ", 1023 | "next": null 1024 | } 1025 | } 1026 | }, 1027 | "y": { 1028 | "value": null, 1029 | "next": { 1030 | "a": { 1031 | "value": "ፚ", 1032 | "next": null 1033 | } 1034 | } 1035 | }, 1036 | "w": { 1037 | "value": null, 1038 | "next": { 1039 | "a": { 1040 | "value": "ፏ", 1041 | "next": null 1042 | } 1043 | } 1044 | }, 1045 | "i": { 1046 | "value": "ፊ", 1047 | "next": { 1048 | "e": { 1049 | "value": "ፌ", 1050 | "next": null 1051 | } 1052 | } 1053 | }, 1054 | "u": { 1055 | "value": "ፉ", 1056 | "next": { 1057 | "a": { 1058 | "value": "ፏ", 1059 | "next": null 1060 | } 1061 | } 1062 | }, 1063 | "o": { 1064 | "value": "ፎ", 1065 | "next": null 1066 | } 1067 | } 1068 | }, 1069 | "h": { 1070 | "value": "ህ", 1071 | "next": { 1072 | "a": { 1073 | "value": "ሃ", 1074 | "next": null 1075 | }, 1076 | "e": { 1077 | "value": "ሀ", 1078 | "next": { 1079 | "e": { 1080 | "value": "ሄ", 1081 | "next": null 1082 | } 1083 | } 1084 | }, 1085 | "i": { 1086 | "value": "ሂ", 1087 | "next": { 1088 | "e": { 1089 | "value": "ሄ", 1090 | "next": null 1091 | } 1092 | } 1093 | }, 1094 | "h": { 1095 | "value": "ሕ", 1096 | "next": { 1097 | "a": { 1098 | "value": "ሓ", 1099 | "next": null 1100 | }, 1101 | "e": { 1102 | "value": "ሐ", 1103 | "next": { 1104 | "e": { 1105 | "value": "ሔ", 1106 | "next": null 1107 | } 1108 | } 1109 | }, 1110 | "w": { 1111 | "value": null, 1112 | "next": { 1113 | "a": { 1114 | "value": "ሗ", 1115 | "next": null 1116 | } 1117 | } 1118 | }, 1119 | "i": { 1120 | "value": "ሒ", 1121 | "next": { 1122 | "e": { 1123 | "value": "ሔ", 1124 | "next": null 1125 | } 1126 | } 1127 | }, 1128 | "u": { 1129 | "value": "ሑ", 1130 | "next": { 1131 | "a": { 1132 | "value": "ሗ", 1133 | "next": null 1134 | } 1135 | } 1136 | }, 1137 | "o": { 1138 | "value": "ሖ", 1139 | "next": null 1140 | } 1141 | } 1142 | }, 1143 | "u": { 1144 | "value": "ሁ", 1145 | "next": null 1146 | }, 1147 | "o": { 1148 | "value": "ሆ", 1149 | "next": null 1150 | } 1151 | } 1152 | }, 1153 | "k": { 1154 | "value": "ክ", 1155 | "next": { 1156 | "a": { 1157 | "value": "ካ", 1158 | "next": null 1159 | }, 1160 | "e": { 1161 | "value": "ከ", 1162 | "next": { 1163 | "e": { 1164 | "value": "ኬ", 1165 | "next": null 1166 | } 1167 | } 1168 | }, 1169 | "w": { 1170 | "value": "ኵ", 1171 | "next": { 1172 | "a": { 1173 | "value": "ኳ", 1174 | "next": null 1175 | }, 1176 | "e": { 1177 | "value": "ኰ", 1178 | "next": { 1179 | "e": { 1180 | "value": "ኴ", 1181 | "next": null 1182 | } 1183 | } 1184 | }, 1185 | "i": { 1186 | "value": "ኲ", 1187 | "next": { 1188 | "e": { 1189 | "value": "ኴ", 1190 | "next": null 1191 | } 1192 | } 1193 | } 1194 | } 1195 | }, 1196 | "x": { 1197 | "value": "ኽ", 1198 | "next": { 1199 | "a": { 1200 | "value": "ኻ", 1201 | "next": null 1202 | }, 1203 | "e": { 1204 | "value": "ኸ", 1205 | "next": { 1206 | "e": { 1207 | "value": "ኼ", 1208 | "next": null 1209 | } 1210 | } 1211 | }, 1212 | "w": { 1213 | "value": "ዅ", 1214 | "next": { 1215 | "a": { 1216 | "value": "ዃ", 1217 | "next": null 1218 | }, 1219 | "e": { 1220 | "value": "ዀ", 1221 | "next": { 1222 | "e": { 1223 | "value": "ዄ", 1224 | "next": null 1225 | } 1226 | } 1227 | }, 1228 | "i": { 1229 | "value": "ዂ", 1230 | "next": { 1231 | "e": { 1232 | "value": "ዄ", 1233 | "next": null 1234 | } 1235 | } 1236 | } 1237 | } 1238 | }, 1239 | "i": { 1240 | "value": "ኺ", 1241 | "next": { 1242 | "e": { 1243 | "value": "ኼ", 1244 | "next": null 1245 | } 1246 | } 1247 | }, 1248 | "u": { 1249 | "value": "ኹ", 1250 | "next": null 1251 | }, 1252 | "o": { 1253 | "value": "ኾ", 1254 | "next": null 1255 | } 1256 | } 1257 | }, 1258 | "i": { 1259 | "value": "ኪ", 1260 | "next": { 1261 | "e": { 1262 | "value": "ኬ", 1263 | "next": null 1264 | } 1265 | } 1266 | }, 1267 | "u": { 1268 | "value": "ኩ", 1269 | "next": { 1270 | "a": { 1271 | "value": "ኳ", 1272 | "next": null 1273 | }, 1274 | "e": { 1275 | "value": "ኰ", 1276 | "next": { 1277 | "e": { 1278 | "value": "ኴ", 1279 | "next": null 1280 | } 1281 | } 1282 | }, 1283 | "i": { 1284 | "value": "ኲ", 1285 | "next": { 1286 | "e": { 1287 | "value": "ኴ", 1288 | "next": null 1289 | } 1290 | } 1291 | } 1292 | } 1293 | }, 1294 | "o": { 1295 | "value": "ኮ", 1296 | "next": { 1297 | "a": { 1298 | "value": "ኯ", 1299 | "next": null 1300 | } 1301 | } 1302 | } 1303 | } 1304 | }, 1305 | "j": { 1306 | "value": "ጅ", 1307 | "next": { 1308 | "a": { 1309 | "value": "ጃ", 1310 | "next": null 1311 | }, 1312 | "e": { 1313 | "value": "ጀ", 1314 | "next": { 1315 | "e": { 1316 | "value": "ጄ", 1317 | "next": null 1318 | } 1319 | } 1320 | }, 1321 | "w": { 1322 | "value": null, 1323 | "next": { 1324 | "a": { 1325 | "value": "ጇ", 1326 | "next": null 1327 | } 1328 | } 1329 | }, 1330 | "i": { 1331 | "value": "ጂ", 1332 | "next": { 1333 | "e": { 1334 | "value": "ጄ", 1335 | "next": null 1336 | } 1337 | } 1338 | }, 1339 | "u": { 1340 | "value": "ጁ", 1341 | "next": { 1342 | "a": { 1343 | "value": "ጇ", 1344 | "next": null 1345 | } 1346 | } 1347 | }, 1348 | "o": { 1349 | "value": "ጆ", 1350 | "next": null 1351 | } 1352 | } 1353 | }, 1354 | "m": { 1355 | "value": "ም", 1356 | "next": { 1357 | "a": { 1358 | "value": "ማ", 1359 | "next": null 1360 | }, 1361 | "e": { 1362 | "value": "መ", 1363 | "next": { 1364 | "e": { 1365 | "value": "ሜ", 1366 | "next": null 1367 | } 1368 | } 1369 | }, 1370 | "y": { 1371 | "value": null, 1372 | "next": { 1373 | "a": { 1374 | "value": "ፙ", 1375 | "next": null 1376 | } 1377 | } 1378 | }, 1379 | "w": { 1380 | "value": null, 1381 | "next": { 1382 | "a": { 1383 | "value": "ሟ", 1384 | "next": null 1385 | } 1386 | } 1387 | }, 1388 | "i": { 1389 | "value": "ሚ", 1390 | "next": { 1391 | "e": { 1392 | "value": "ሜ", 1393 | "next": null 1394 | } 1395 | } 1396 | }, 1397 | "u": { 1398 | "value": "ሙ", 1399 | "next": { 1400 | "a": { 1401 | "value": "ሟ", 1402 | "next": null 1403 | } 1404 | } 1405 | }, 1406 | "o": { 1407 | "value": "ሞ", 1408 | "next": null 1409 | } 1410 | } 1411 | }, 1412 | "l": { 1413 | "value": "ል", 1414 | "next": { 1415 | "a": { 1416 | "value": "ላ", 1417 | "next": null 1418 | }, 1419 | "e": { 1420 | "value": "ለ", 1421 | "next": { 1422 | "e": { 1423 | "value": "ሌ", 1424 | "next": null 1425 | } 1426 | } 1427 | }, 1428 | "w": { 1429 | "value": null, 1430 | "next": { 1431 | "a": { 1432 | "value": "ሏ", 1433 | "next": null 1434 | } 1435 | } 1436 | }, 1437 | "i": { 1438 | "value": "ሊ", 1439 | "next": { 1440 | "e": { 1441 | "value": "ሌ", 1442 | "next": null 1443 | } 1444 | } 1445 | }, 1446 | "u": { 1447 | "value": "ሉ", 1448 | "next": { 1449 | "a": { 1450 | "value": "ሏ", 1451 | "next": null 1452 | } 1453 | } 1454 | }, 1455 | "o": { 1456 | "value": "ሎ", 1457 | "next": null 1458 | } 1459 | } 1460 | }, 1461 | "n": { 1462 | "value": "ን", 1463 | "next": { 1464 | "a": { 1465 | "value": "ና", 1466 | "next": null 1467 | }, 1468 | "e": { 1469 | "value": "ነ", 1470 | "next": { 1471 | "e": { 1472 | "value": "ኔ", 1473 | "next": null 1474 | } 1475 | } 1476 | }, 1477 | "y": { 1478 | "value": "ኝ", 1479 | "next": { 1480 | "a": { 1481 | "value": "ኛ", 1482 | "next": null 1483 | }, 1484 | "e": { 1485 | "value": "ኘ", 1486 | "next": { 1487 | "e": { 1488 | "value": "ኜ", 1489 | "next": null 1490 | } 1491 | } 1492 | }, 1493 | "w": { 1494 | "value": null, 1495 | "next": { 1496 | "a": { 1497 | "value": "ኟ", 1498 | "next": null 1499 | } 1500 | } 1501 | }, 1502 | "i": { 1503 | "value": "ኚ", 1504 | "next": { 1505 | "e": { 1506 | "value": "ኜ", 1507 | "next": null 1508 | } 1509 | } 1510 | }, 1511 | "u": { 1512 | "value": "ኙ", 1513 | "next": { 1514 | "a": { 1515 | "value": "ኟ", 1516 | "next": null 1517 | } 1518 | } 1519 | }, 1520 | "o": { 1521 | "value": "ኞ", 1522 | "next": null 1523 | } 1524 | } 1525 | }, 1526 | "w": { 1527 | "value": null, 1528 | "next": { 1529 | "a": { 1530 | "value": "ኗ", 1531 | "next": null 1532 | } 1533 | } 1534 | }, 1535 | "i": { 1536 | "value": "ኒ", 1537 | "next": { 1538 | "e": { 1539 | "value": "ኔ", 1540 | "next": null 1541 | } 1542 | } 1543 | }, 1544 | "u": { 1545 | "value": "ኑ", 1546 | "next": { 1547 | "a": { 1548 | "value": "ኗ", 1549 | "next": null 1550 | } 1551 | } 1552 | }, 1553 | "o": { 1554 | "value": "ኖ", 1555 | "next": null 1556 | } 1557 | } 1558 | }, 1559 | "1": { 1560 | "value": "፩", 1561 | "next": { 1562 | "0": { 1563 | "value": "፲", 1564 | "next": { 1565 | "0": { 1566 | "value": "፻", 1567 | "next": { 1568 | "0": { 1569 | "value": "፲፻", 1570 | "next": { 1571 | "0": { 1572 | "value": "፻፻", 1573 | "next": { 1574 | "0": { 1575 | "value": "፲፻፻", 1576 | "next": null 1577 | } 1578 | } 1579 | } 1580 | } 1581 | } 1582 | } 1583 | } 1584 | } 1585 | } 1586 | } 1587 | }, 1588 | "p": { 1589 | "value": "ፕ", 1590 | "next": { 1591 | "a": { 1592 | "value": "ፓ", 1593 | "next": null 1594 | }, 1595 | "e": { 1596 | "value": "ፐ", 1597 | "next": { 1598 | "e": { 1599 | "value": "ፔ", 1600 | "next": null 1601 | } 1602 | } 1603 | }, 1604 | "w": { 1605 | "value": null, 1606 | "next": { 1607 | "a": { 1608 | "value": "ፗ", 1609 | "next": null 1610 | } 1611 | } 1612 | }, 1613 | "i": { 1614 | "value": "ፒ", 1615 | "next": { 1616 | "e": { 1617 | "value": "ፔ", 1618 | "next": null 1619 | } 1620 | } 1621 | }, 1622 | "h": { 1623 | "value": "ጵ", 1624 | "next": { 1625 | "a": { 1626 | "value": "ጳ", 1627 | "next": null 1628 | }, 1629 | "e": { 1630 | "value": "ጰ", 1631 | "next": { 1632 | "e": { 1633 | "value": "ጴ", 1634 | "next": null 1635 | } 1636 | } 1637 | }, 1638 | "w": { 1639 | "value": null, 1640 | "next": { 1641 | "a": { 1642 | "value": "ጷ", 1643 | "next": null 1644 | } 1645 | } 1646 | }, 1647 | "i": { 1648 | "value": "ጲ", 1649 | "next": { 1650 | "e": { 1651 | "value": "ጴ", 1652 | "next": null 1653 | } 1654 | } 1655 | }, 1656 | "u": { 1657 | "value": "ጱ", 1658 | "next": { 1659 | "a": { 1660 | "value": "ጷ", 1661 | "next": null 1662 | } 1663 | } 1664 | }, 1665 | "o": { 1666 | "value": "ጶ", 1667 | "next": null 1668 | } 1669 | } 1670 | }, 1671 | "u": { 1672 | "value": "ፑ", 1673 | "next": { 1674 | "a": { 1675 | "value": "ፗ", 1676 | "next": null 1677 | } 1678 | } 1679 | }, 1680 | "o": { 1681 | "value": "ፖ", 1682 | "next": null 1683 | } 1684 | } 1685 | }, 1686 | "3": { 1687 | "value": "፫", 1688 | "next": { 1689 | "0": { 1690 | "value": "፴", 1691 | "next": null 1692 | } 1693 | } 1694 | }, 1695 | "2": { 1696 | "value": "፪", 1697 | "next": { 1698 | "0": { 1699 | "value": "፳", 1700 | "next": null 1701 | } 1702 | } 1703 | }, 1704 | "5": { 1705 | "value": "፭", 1706 | "next": { 1707 | "0": { 1708 | "value": "፶", 1709 | "next": null 1710 | } 1711 | } 1712 | }, 1713 | "4": { 1714 | "value": "፬", 1715 | "next": { 1716 | "0": { 1717 | "value": "፵", 1718 | "next": null 1719 | } 1720 | } 1721 | }, 1722 | "7": { 1723 | "value": "፯", 1724 | "next": { 1725 | "0": { 1726 | "value": "፸", 1727 | "next": null 1728 | } 1729 | } 1730 | }, 1731 | "6": { 1732 | "value": "፮", 1733 | "next": { 1734 | "0": { 1735 | "value": "፷", 1736 | "next": null 1737 | } 1738 | } 1739 | }, 1740 | "9": { 1741 | "value": "፱", 1742 | "next": { 1743 | "0": { 1744 | "value": "፺", 1745 | "next": null 1746 | } 1747 | } 1748 | }, 1749 | "8": { 1750 | "value": "፰", 1751 | "next": { 1752 | "0": { 1753 | "value": "፹", 1754 | "next": null 1755 | } 1756 | } 1757 | }, 1758 | "z": { 1759 | "value": "ዝ", 1760 | "next": { 1761 | "a": { 1762 | "value": "ዛ", 1763 | "next": null 1764 | }, 1765 | "e": { 1766 | "value": "ዘ", 1767 | "next": { 1768 | "e": { 1769 | "value": "ዜ", 1770 | "next": null 1771 | } 1772 | } 1773 | }, 1774 | "w": { 1775 | "value": null, 1776 | "next": { 1777 | "a": { 1778 | "value": "ዟ", 1779 | "next": null 1780 | } 1781 | } 1782 | }, 1783 | "i": { 1784 | "value": "ዚ", 1785 | "next": { 1786 | "e": { 1787 | "value": "ዜ", 1788 | "next": null 1789 | } 1790 | } 1791 | }, 1792 | "h": { 1793 | "value": "ዥ", 1794 | "next": { 1795 | "a": { 1796 | "value": "ዣ", 1797 | "next": null 1798 | }, 1799 | "e": { 1800 | "value": "ዠ", 1801 | "next": { 1802 | "e": { 1803 | "value": "ዤ", 1804 | "next": null 1805 | } 1806 | } 1807 | }, 1808 | "w": { 1809 | "value": null, 1810 | "next": { 1811 | "a": { 1812 | "value": "ዧ", 1813 | "next": null 1814 | } 1815 | } 1816 | }, 1817 | "i": { 1818 | "value": "ዢ", 1819 | "next": { 1820 | "e": { 1821 | "value": "ዤ", 1822 | "next": null 1823 | } 1824 | } 1825 | }, 1826 | "u": { 1827 | "value": "ዡ", 1828 | "next": { 1829 | "a": { 1830 | "value": "ዧ", 1831 | "next": null 1832 | } 1833 | } 1834 | }, 1835 | "o": { 1836 | "value": "ዦ", 1837 | "next": null 1838 | } 1839 | } 1840 | }, 1841 | "u": { 1842 | "value": "ዙ", 1843 | "next": { 1844 | "a": { 1845 | "value": "ዟ", 1846 | "next": null 1847 | } 1848 | } 1849 | }, 1850 | "o": { 1851 | "value": "ዞ", 1852 | "next": null 1853 | } 1854 | } 1855 | }, 1856 | "t": { 1857 | "value": "ት", 1858 | "next": { 1859 | "a": { 1860 | "value": "ታ", 1861 | "next": null 1862 | }, 1863 | "e": { 1864 | "value": "ተ", 1865 | "next": { 1866 | "e": { 1867 | "value": "ቴ", 1868 | "next": null 1869 | } 1870 | } 1871 | }, 1872 | "s": { 1873 | "value": "ጽ", 1874 | "next": { 1875 | "a": { 1876 | "value": "ጻ", 1877 | "next": null 1878 | }, 1879 | "e": { 1880 | "value": "ጸ", 1881 | "next": { 1882 | "e": { 1883 | "value": "ጼ", 1884 | "next": null 1885 | } 1886 | } 1887 | }, 1888 | "w": { 1889 | "value": null, 1890 | "next": { 1891 | "a": { 1892 | "value": "ጿ", 1893 | "next": null 1894 | } 1895 | } 1896 | }, 1897 | "i": { 1898 | "value": "ጺ", 1899 | "next": { 1900 | "e": { 1901 | "value": "ጼ", 1902 | "next": null 1903 | } 1904 | } 1905 | }, 1906 | "u": { 1907 | "value": "ጹ", 1908 | "next": { 1909 | "a": { 1910 | "value": "ጿ", 1911 | "next": null 1912 | } 1913 | } 1914 | }, 1915 | "o": { 1916 | "value": "ጾ", 1917 | "next": null 1918 | } 1919 | } 1920 | }, 1921 | "w": { 1922 | "value": null, 1923 | "next": { 1924 | "a": { 1925 | "value": "ቷ", 1926 | "next": null 1927 | } 1928 | } 1929 | }, 1930 | "i": { 1931 | "value": "ቲ", 1932 | "next": { 1933 | "e": { 1934 | "value": "ቴ", 1935 | "next": null 1936 | } 1937 | } 1938 | }, 1939 | "h": { 1940 | "value": "ጥ", 1941 | "next": { 1942 | "a": { 1943 | "value": "ጣ", 1944 | "next": null 1945 | }, 1946 | "e": { 1947 | "value": "ጠ", 1948 | "next": { 1949 | "e": { 1950 | "value": "ጤ", 1951 | "next": null 1952 | } 1953 | } 1954 | }, 1955 | "w": { 1956 | "value": null, 1957 | "next": { 1958 | "a": { 1959 | "value": "ጧ", 1960 | "next": null 1961 | } 1962 | } 1963 | }, 1964 | "i": { 1965 | "value": "ጢ", 1966 | "next": { 1967 | "e": { 1968 | "value": "ጤ", 1969 | "next": null 1970 | } 1971 | } 1972 | }, 1973 | "u": { 1974 | "value": "ጡ", 1975 | "next": { 1976 | "a": { 1977 | "value": "ጧ", 1978 | "next": null 1979 | } 1980 | } 1981 | }, 1982 | "o": { 1983 | "value": "ጦ", 1984 | "next": null 1985 | } 1986 | } 1987 | }, 1988 | "z": { 1989 | "value": "ፅ", 1990 | "next": { 1991 | "a": { 1992 | "value": "ፃ", 1993 | "next": null 1994 | }, 1995 | "e": { 1996 | "value": "ፀ", 1997 | "next": { 1998 | "e": { 1999 | "value": "ፄ", 2000 | "next": null 2001 | } 2002 | } 2003 | }, 2004 | "i": { 2005 | "value": "ፂ", 2006 | "next": { 2007 | "e": { 2008 | "value": "ፄ", 2009 | "next": null 2010 | } 2011 | } 2012 | }, 2013 | "u": { 2014 | "value": "ፁ", 2015 | "next": { 2016 | "a": { 2017 | "value": "ፇ", 2018 | "next": null 2019 | } 2020 | } 2021 | }, 2022 | "w": { 2023 | "value": "ፆ", 2024 | "next": { 2025 | "a": { 2026 | "value": "ፇ", 2027 | "next": null 2028 | } 2029 | } 2030 | } 2031 | } 2032 | }, 2033 | "u": { 2034 | "value": "ቱ", 2035 | "next": { 2036 | "a": { 2037 | "value": "ቷ", 2038 | "next": null 2039 | } 2040 | } 2041 | }, 2042 | "o": { 2043 | "value": "ቶ", 2044 | "next": null 2045 | } 2046 | } 2047 | }, 2048 | ":": { 2049 | "value": "፡", 2050 | "next": { 2051 | ":": { 2052 | "value": "።", 2053 | "next": null 2054 | } 2055 | } 2056 | }, 2057 | ".": { 2058 | "value": "።", 2059 | "next": null 2060 | }, 2061 | ";": { 2062 | "value": "፤", 2063 | "next": null 2064 | }, 2065 | ",": { 2066 | "value": "፣", 2067 | "next": null 2068 | }, 2069 | "/": { 2070 | "value": "/", 2071 | "next": { 2072 | "/":{ 2073 | "value": "፨", 2074 | "next": null 2075 | } 2076 | } 2077 | }, 2078 | "?": { 2079 | "value": "?", 2080 | "next": { 2081 | "?": { 2082 | "value": "፧", 2083 | "next": null 2084 | } 2085 | } 2086 | } 2087 | } 2088 | --------------------------------------------------------------------------------