pax_global_header00006660000000000000000000000064127730427570014530gustar00rootroot0000000000000052 comment=7c41122f8725a63587ec34bb19b12dd91f12465f fast-levenshtein-2.0.5/000077500000000000000000000000001277304275700150135ustar00rootroot00000000000000fast-levenshtein-2.0.5/.gitignore000066400000000000000000000000511277304275700167770ustar00rootroot00000000000000*.iml .idea/ node_modules/ npm-debug.log fast-levenshtein-2.0.5/.travis.yml000066400000000000000000000002061277304275700171220ustar00rootroot00000000000000language: node_js node_js: - 0.12 - 5.0 - stable script: - "npm run build" notifications: email: - ram@hiddentao.com fast-levenshtein-2.0.5/CONTRIBUTING.md000066400000000000000000000021101277304275700172360ustar00rootroot00000000000000# Contribute to fast-levenshtein This guide guidelines for those wishing to contribute to fast-levenshtein. ## Contributor license agreement By submitting code as an individual or as an entity you agree that your code is [licensed the same as fast-levenshtein](https://github.com/hiddentao/fast-levenshtein/blob/master/LICENSE.md). ## Issues and pull requests Issues and merge requests should be in English and contain appropriate language for audiences of all ages. We will only accept a merge requests which meets the following criteria: * Includes proper tests and all tests pass (unless it contains a test exposing a bug in existing code) * Can be merged without problems (if not please use: `git rebase master`) * Does not break any existing functionality * Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed) * Keeps the code base clean and well structured * Contains functionality we think other users will benefit from too * Doesn't add unnessecary configuration options since they complicate future changes fast-levenshtein-2.0.5/Gruntfile.js000066400000000000000000000033551277304275700173160ustar00rootroot00000000000000module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), mochaTest: { files: ['test/*.js'] }, mochaTestConfig: { options: { reporter: 'spec', ui: 'exports' } }, jshint: { options: { "bitwise": false, "camelcase": false, "curly": false, "eqeqeq": true, "forin": true, "immed": true, "indent": 2, "latedef": false, "newcap": true, "noarg": true, "noempty": false, "nonew": true, "plusplus": false, "quotmark": false, "undef": true, "unused": true, "strict": true, "trailing": false, "boss": true, "laxcomma": true, "multistr": true, "sub": true, "supernew": true, "browser": true, "node": true, "worker": true, "predef": [ 'define', 'require', 'setImmediate', 'Intl' ] }, files: ['levenshtein.js'] }, uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %>. Copyright <%= pkg.author %> */\n' }, build: { src: 'levenshtein.js', dest: 'levenshtein.min.js' } }, benchmarkConfig: { speed: { src: ['benchmark/speed.js'] } }, }); require('load-grunt-tasks')(grunt); grunt.renameTask('benchmark', 'benchmarkConfig'); grunt.registerTask('build', ['jshint', 'uglify', 'mochaTest']); grunt.registerTask('default', ['build']); grunt.registerTask('benchmark', ['npm-install:levenshtein-edit-distance:levenshtein:natural:levenshtein-component:levenshtein-deltas', 'benchmarkConfig']); }; fast-levenshtein-2.0.5/LICENSE.md000066400000000000000000000021141277304275700164150ustar00rootroot00000000000000(MIT License) Copyright (c) 2013 [Ramesh Nair](http://www.hiddentao.com/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. fast-levenshtein-2.0.5/README.md000066400000000000000000000065261277304275700163030ustar00rootroot00000000000000# fast-levenshtein - Levenshtein algorithm in Javascript [![Build Status](https://secure.travis-ci.org/hiddentao/fast-levenshtein.png)](http://travis-ci.org/hiddentao/fast-levenshtein) [![NPM module](https://badge.fury.io/js/fast-levenshtein.png)](https://badge.fury.io/js/fast-levenshtein) [![NPM downloads](https://img.shields.io/npm/dm/fast-levenshtein.svg?maxAge=2592000)](https://www.npmjs.com/package/fast-levenshtein) [![Follow on Twitter](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Follow&maxAge=2592000)](https://twitter.com/hiddentao) An efficient Javascript implementation of the [Levenshtein algorithm](http://en.wikipedia.org/wiki/Levenshtein_distance) with locale-specific collator support. ## Features * Works in node.js and in the browser. * Better performance than other implementations by not needing to store the whole matrix ([more info](http://www.codeproject.com/Articles/13525/Fast-memory-efficient-Levenshtein-algorithm)). * Locale-sensitive string comparisions if needed. * Comprehensive test suite and performance benchmark. * Small: <1 KB minified and gzipped ## Installation ### node.js Install using [npm](http://npmjs.org/): ```bash $ npm install fast-levenshtein ``` ### Browser Using bower: ```bash $ bower install fast-levenshtein ``` If you are not using any module loader system then the API will then be accessible via the `window.Levenshtein` object. ## Examples **Default usage** ```javascript var levenshtein = require('fast-levenshtein'); var distance = levenshtein.get('back', 'book'); // 2 var distance = levenshtein.get('我愛你', '我叫你'); // 1 ``` **Locale-sensitive string comparisons** It supports using [Intl.Collator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator) for locale-sensitive string comparisons: ```javascript var levenshtein = require('fast-levenshtein'); levenshtein.get('mikailovitch', 'Mikhaïlovitch', { useCollator: true}); // 1 ``` ## Building and Testing To build the code and run the tests: ```bash $ npm install -g grunt-cli $ npm install $ npm run build ``` ## Performance _Thanks to [Titus Wormer](https://github.com/wooorm) for [encouraging me](https://github.com/hiddentao/fast-levenshtein/issues/1) to do this._ Benchmarked against other node.js levenshtein distance modules (on Macbook Air 2012, Core i7, 8GB RAM): ```bash Running suite Implementation comparison [benchmark/speed.js]... >> levenshtein-edit-distance x 234 ops/sec ±3.02% (73 runs sampled) >> levenshtein-component x 422 ops/sec ±4.38% (83 runs sampled) >> levenshtein-deltas x 283 ops/sec ±3.83% (78 runs sampled) >> natural x 255 ops/sec ±0.76% (88 runs sampled) >> levenshtein x 180 ops/sec ±3.55% (86 runs sampled) >> fast-levenshtein x 1,792 ops/sec ±2.72% (95 runs sampled) Benchmark done. Fastest test is fast-levenshtein at 4.2x faster than levenshtein-component ``` You can run this benchmark yourself by doing: ```bash $ npm install $ npm run build $ npm run benchmark ``` ## Contributing If you wish to submit a pull request please update and/or create new tests for any changes you make and ensure the grunt build passes. See [CONTRIBUTING.md](https://github.com/hiddentao/fast-levenshtein/blob/master/CONTRIBUTING.md) for details. ## License MIT - see [LICENSE.md](https://github.com/hiddentao/fast-levenshtein/blob/master/LICENSE.md) fast-levenshtein-2.0.5/benchmark/000077500000000000000000000000001277304275700167455ustar00rootroot00000000000000fast-levenshtein-2.0.5/benchmark/speed.js000066400000000000000000000061451277304275700204110ustar00rootroot00000000000000var fastLevenshtein = require('../levenshtein.min').get, levenshtein = require('levenshtein'), levenshteinEditDistance = require('levenshtein-edit-distance'), levenshteinComponent = require('levenshtein-component'), levenshteinDeltas = require('levenshtein-deltas'), natural = require('natural').LevenshteinDistance; /* The first 100 words from Letterpress: https://github.com/atebits/Words */ source = Array(11).join([ 'aa', 'aah', 'aahed', 'aahing', 'aahs', 'aal', 'aalii', 'aaliis', 'aals', 'aardvark', 'aardvarks', 'aardwolf', 'aardwolves', 'aargh', 'aarrgh', 'aarrghh', 'aarti', 'aartis', 'aas', 'aasvogel', 'aasvogels', 'ab', 'aba', 'abac', 'abaca', 'abacas', 'abaci', 'aback', 'abacs', 'abacterial', 'abactinal', 'abactinally', 'abactor', 'abactors', 'abacus', 'abacuses', 'abaft', 'abaka', 'abakas', 'abalone', 'abalones', 'abamp', 'abampere', 'abamperes', 'abamps', 'aband', 'abanded', 'abanding', 'abandon', 'abandoned', 'abandonedly', 'abandonee', 'abandonees', 'abandoner', 'abandoners', 'abandoning', 'abandonment', 'abandonments', 'abandons', 'abandonware', 'abandonwares', 'abands', 'abapical', 'abas', 'abase', 'abased', 'abasedly', 'abasement', 'abasements', 'abaser', 'abasers', 'abases', 'abash', 'abashed', 'abashedly', 'abashes', 'abashing', 'abashless', 'abashment', 'abashments', 'abasia', 'abasias', 'abasing', 'abask', 'abatable', 'abate', 'abated', 'abatement', 'abatements', 'abater', 'abaters', 'abates', 'abating', 'abatis', 'abatises', 'abator', 'abators', 'abattis', 'abattises', 'abattoir', 'abattoirs' ].join('|')).split('|'); /** * The actual test loop. * @param {Function} fn Levenshtein distance function. */ var loop = function(fn) { var iterator = -1, previousValue = '', value, dist; while (value = source[++iterator]) { dist = fn(previousValue, value); previousValue = value; } }; /** @type {Object} Test config */ module.exports = { name: 'Implementation comparison', onComplete: function() { console.log('Benchmark done.'); }, tests: [ { name: 'levenshtein-edit-distance', fn: function() { loop(levenshteinEditDistance); } }, { name: 'levenshtein-component', fn: function() { loop(levenshteinComponent); } }, { name: 'levenshtein-deltas', fn: function() { loop(function(v1,v2) { return new levenshteinDeltas.Lev(v1,v2).distance(); }); } }, { name: 'natural', fn: function() { loop(natural); } }, { name: 'levenshtein', fn: function() { loop(levenshtein); } }, { name: 'fast-levenshtein', fn: function() { loop(fastLevenshtein); } }, ] }; fast-levenshtein-2.0.5/bower.json000066400000000000000000000011231277304275700170210ustar00rootroot00000000000000{ "name": "fast-levenshtein", "version": "1.1.3", "homepage": "https://github.com/hiddentao/fast-levenshtein", "authors": [ "Ramesh Nair " ], "description": "Efficient implementation of Levenshtein algorithm with asynchronous callback support", "main": "levenshtein.js", "moduleType": [ "amd", "globals", "node" ], "keywords": [ "levenshtein", "distance", "string" ], "license": "MIT", "ignore": [ "**/.*", "node_modules", "bower_components", "test", "tests", "benchmark", "Gruntfile.js" ] } fast-levenshtein-2.0.5/levenshtein.js000066400000000000000000000056621277304275700177060ustar00rootroot00000000000000(function() { 'use strict'; var collator; try { collator = (typeof Intl !== "undefined" && typeof Intl.Collator !== "undefined") ? Intl.Collator("generic", { sensitivity: "base" }) : null; } catch (err){ console.log("Collator could not be initialized and wouldn't be used"); } // arrays to re-use var prevRow = [], str2Char = []; /** * Based on the algorithm at http://en.wikipedia.org/wiki/Levenshtein_distance. */ var Levenshtein = { /** * Calculate levenshtein distance of the two strings. * * @param str1 String the first string. * @param str2 String the second string. * @param [options] Additional options. * @param [options.useCollator] Use `Intl.Collator` for locale-sensitive string comparison. * @return Integer the levenshtein distance (0 and above). */ get: function(str1, str2, options) { var useCollator = (options && collator && options.useCollator); var str1Len = str1.length, str2Len = str2.length; // base cases if (str1Len === 0) return str2Len; if (str2Len === 0) return str1Len; // two rows var curCol, nextCol, i, j, tmp; // initialise previous row for (i=0; i tmp) { nextCol = tmp; } // deletion tmp = prevRow[j + 1] + 1; if (nextCol > tmp) { nextCol = tmp; } // copy current col value into previous (in preparation for next iteration) prevRow[j] = curCol; } // copy last col value into previous (in preparation for next iteration) prevRow[j] = nextCol; } return nextCol; } }; // amd if (typeof define !== "undefined" && define !== null && define.amd) { define(function() { return Levenshtein; }); } // commonjs else if (typeof module !== "undefined" && module !== null && typeof exports !== "undefined" && module.exports === exports) { module.exports = Levenshtein; } // web worker else if (typeof self !== "undefined" && typeof self.postMessage === 'function' && typeof self.importScripts === 'function') { self.Levenshtein = Levenshtein; } // browser main thread else if (typeof window !== "undefined" && window !== null) { window.Levenshtein = Levenshtein; } }()); fast-levenshtein-2.0.5/levenshtein.min.js000066400000000000000000000021301277304275700204530ustar00rootroot00000000000000/*! fast-levenshtein 2016-09-27. Copyright Ramesh Nair (http://www.hiddentao.com/) */ !function(){"use strict";var a;try{a="undefined"!=typeof Intl&&"undefined"!=typeof Intl.Collator?Intl.Collator("generic",{sensitivity:"base"}):null}catch(b){console.log("Collator could not be initialized and wouldn't be used")}var c=[],d=[],e={get:function(b,e,f){var g=f&&a&&f.useCollator,h=b.length,i=e.length;if(0===h)return i;if(0===i)return h;var j,k,l,m,n;for(l=0;i>l;++l)c[l]=l,d[l]=e.charCodeAt(l);for(c[i]=i,l=0;h>l;++l){for(k=l+1,m=0;i>m;++m){j=k;var o=g?0===a.compare(b.charAt(l),String.fromCharCode(d[m])):b.charCodeAt(l)===d[m];k=c[m]+(o?0:1),n=j+1,k>n&&(k=n),n=c[m+1]+1,k>n&&(k=n),c[m]=j}c[m]=k}return k}};"undefined"!=typeof define&&null!==define&&define.amd?define(function(){return e}):"undefined"!=typeof module&&null!==module&&"undefined"!=typeof exports&&module.exports===exports?module.exports=e:"undefined"!=typeof self&&"function"==typeof self.postMessage&&"function"==typeof self.importScripts?self.Levenshtein=e:"undefined"!=typeof window&&null!==window&&(window.Levenshtein=e)}();fast-levenshtein-2.0.5/package.json000066400000000000000000000017461277304275700173110ustar00rootroot00000000000000{ "name": "fast-levenshtein", "version": "2.0.5", "description": "Efficient implementation of Levenshtein algorithm with locale-specific collator support.", "main": "levenshtein.js", "files": [ "levenshtein.js" ], "scripts": { "build": "grunt build", "prepublish": "npm run build", "benchmark": "grunt benchmark", "test": "mocha" }, "devDependencies": { "chai": "~1.5.0", "grunt": "~0.4.1", "grunt-benchmark": "~0.2.0", "grunt-cli": "^1.2.0", "grunt-contrib-jshint": "~0.4.3", "grunt-contrib-uglify": "~0.2.0", "grunt-mocha-test": "~0.2.2", "grunt-npm-install": "~0.1.0", "load-grunt-tasks": "~0.6.0", "lodash": "^4.0.1", "mocha": "~1.9.0" }, "repository": { "type": "git", "url": "https://github.com/hiddentao/fast-levenshtein.git" }, "keywords": [ "levenshtein", "distance", "string" ], "author": "Ramesh Nair (http://www.hiddentao.com/)", "license": "MIT" } fast-levenshtein-2.0.5/test/000077500000000000000000000000001277304275700157725ustar00rootroot00000000000000fast-levenshtein-2.0.5/test/mocha.opts000066400000000000000000000000351277304275700177660ustar00rootroot00000000000000--ui exports --reporter spec fast-levenshtein-2.0.5/test/tests.js000066400000000000000000000070041277304275700174730ustar00rootroot00000000000000var _ = require('lodash'), chai = require('chai'), fs = require('fs'), levenshtein = require('../levenshtein.min'); var expect = chai.expect, assert = chai.assert; /** * Create test functions. * @return Object */ var createTests = function(str1, str2, expectedLength, options) { options = _.extend({}, { description: null }, options); if (!options.description) { options.description = (0 === str1.length ? '(empty)' : str1) + ' <-> ' + (0 === str2.length ? '(empty)' : str2); } var ret = {}; ret[options.description + ' (len: ' + expectedLength + ')'] = function() { expect(levenshtein.get(str1, str2, options)).to.eql(expectedLength); }; return ret; }; // ----- Basic tests ----- // (function() { var tests = {}, str = 'hello', str1 = str, str2 = str, i; // equal strings _.extend(tests, createTests('hello', 'hello', 0)); // inserts for (i=0; i<=str.length; ++i) { str1 = str.substr(0,i); str2 = str; _.extend(tests, createTests(str1, str2, str.length - i)); } // deletes for (i=str.length-1; i>=0; --i) { str1 = str; str2 = str.substr(0,i); _.extend(tests, createTests(str1, str2, str.length - i)); } // substitutions _.extend(tests, createTests("a", "b", 1 )); _.extend(tests, createTests("ab", "ac", 1 )); _.extend(tests, createTests("ac", "bc", 1 )); _.extend(tests, createTests("abc", "axc", 1 )); _.extend(tests, createTests("xabxcdxxefxgx", "1ab2cd34ef5g6", 6 )); // many ops _.extend(tests, createTests('xabxcdxxefxgx', 'abcdefg', 6)); _.extend(tests, createTests('javawasneat', 'scalaisgreat', 7)); _.extend(tests, createTests("example", "samples", 3)); _.extend(tests, createTests("forward", "drawrof", 6)); _.extend(tests, createTests("sturgeon", "urgently", 6 )); _.extend(tests, createTests("levenshtein", "frankenstein", 6 )); _.extend(tests, createTests("distance", "difference", 5 )); _.extend(tests, createTests("distance", "eistancd", 2 )); // non-latin _.extend(tests, createTests('你好世界', '你好', 2, { description: 'non-latin' })); _.extend(tests, createTests('因為我是中國人所以我會說中文', '因為我是英國人所以我會說英文', 2, { description: 'non-latin' })); // collation (see https://github.com/hiddentao/fast-levenshtein/issues/7) _.extend(tests, createTests('mikailovitch', 'Mikhaïlovitch', 3, { description: 'collator OFF' })); _.extend(tests, createTests('mikailovitch', 'Mikhaïlovitch', 1, { useCollator: true, description: 'collator ON' })); // long text _.extend(tests, createTests( 'Morbi interdum ultricies neque varius condimentum. Donec volutpat turpis interdum metus ultricies vulputate. Duis ultricies rhoncus sapien, sit amet fermentum risus imperdiet vitae. Ut et lectus', 'Duis erat dolor, cursus in tincidunt a, lobortis in odio. Cras magna sem, pharetra et iaculis quis, faucibus quis tellus. Suspendisse dapibus sapien in justo cursus', 143, { description: 'long text' } )); exports['Basic'] = tests; })(); // ------ Huge tests ----- // var text1 = fs.readFileSync(__dirname + '/text1.txt', 'utf-8'), text2 = fs.readFileSync(__dirname + '/text2.txt', 'utf-8'); exports['Huge'] = { 'default': function() { var startTime = new Date().valueOf(); var distance = levenshtein.get(text1, text2); var timeElapsed = new Date().valueOf() - startTime; console.log(timeElapsed + ' ms'); expect(distance).to.eql(194); }, }; fast-levenshtein-2.0.5/test/text1.txt000066400000000000000000000143111277304275700176000ustar00rootroot00000000000000Duis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperdDuis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperdiet a, faucibus quis turpis. Vivamus purus lorem, vestibulum id rhoncus iaculis, vulputate nec mifast-levenshtein-2.0.5/test/text2.txt000066400000000000000000000143111277304275700176010ustar00rootroot00000000000000Duis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperdiet a, faucibus quis turpis. Vivamus purus lorem, vestibulum id rhoncus iaculis, vulputate nec miDuis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperd